ReactOS 0.4.17-dev-812-ged4f258
thread.c
Go to the documentation of this file.
1/*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS system libraries
4 * FILE: dll/win32/kernel32/client/thread.c
5 * PURPOSE: Thread functions
6 * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org)
7 * Ariadne (ariadne@xs4all.nl)
8 */
9
10/* INCLUDES *******************************************************************/
11
12#include <k32.h>
13
14#define NDEBUG
15#include <debug.h>
16
17#define SXS_SUPPORT_FIXME
18
20
21/* FUNCTIONS ******************************************************************/
22
27{
28 BASE_API_MESSAGE ApiMessage;
29 PBASE_CREATE_THREAD CreateThreadRequest = &ApiMessage.Data.CreateThreadRequest;
30
31 DPRINT("BasepNotifyCsrOfThread: Thread: %p, Handle %p\n",
32 ClientId->UniqueThread, ThreadHandle);
33
34 /* Fill out the request */
35 CreateThreadRequest->ClientId = *ClientId;
36 CreateThreadRequest->ThreadHandle = ThreadHandle;
37
38 /* Call CSR */
40 NULL,
42 sizeof(*CreateThreadRequest));
43 if (!NT_SUCCESS(ApiMessage.Status))
44 {
45 DPRINT1("Failed to tell CSRSS about new thread: %lx\n", ApiMessage.Status);
46 return ApiMessage.Status;
47 }
48
49 /* Return Success */
50 return STATUS_SUCCESS;
51}
52
54VOID
57 _In_ LPTHREAD_START_ROUTINE lpStartAddress,
58 _In_ LPVOID lpParameter)
59{
60 /* Attempt to call the Thread Start Address */
62 {
63 /* Legacy check which is still used today for Win32 threads */
64 if (NtCurrentTeb()->NtTib.Version == (30 << 8)) // OS/2 V3.0 ("Cruiser")
65 {
66 /* This registers the termination port with CSRSS */
68 }
69
70 /* Get the exit code from the Thread Start */
71 ExitThread(lpStartAddress(lpParameter));
72 }
74 {
75 /* Get the Exit code from the SEH Handler */
77 {
78 /* Kill the whole process, usually */
80 }
81 else
82 {
83 /* If running inside CSRSS, kill just this thread */
85 }
86 }
88}
89
90VOID
94 IN PACTIVATION_CONTEXT ActivationContext)
95{
96 RTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME ActivationFrame;
97
98 /* Setup the activation context */
99 ActivationFrame.Size = sizeof(ActivationFrame);
101
102 /* Check if caller wanted one */
103 if (ActivationContext == INVALID_ACTIVATION_CONTEXT)
104 {
105 /* Do the APC directly */
107 return;
108 }
109
110 /* Then activate it */
111 RtlActivateActivationContextUnsafeFast(&ActivationFrame, ActivationContext);
112
113 /* Call the routine under SEH */
115 {
117 }
119 {
120
121 }
122 _SEH2_END;
123
124 /* Now de-activate and release the activation context */
125 RtlDeactivateActivationContextUnsafeFast(&ActivationFrame);
126 RtlReleaseActivationContext(ActivationContext);
127}
128
129/* PUBLIC FUNCTIONS ***********************************************************/
130
131/*
132 * @implemented
133 */
134HANDLE
135WINAPI
138 IN DWORD dwStackSize,
139 IN LPTHREAD_START_ROUTINE lpStartAddress,
140 IN LPVOID lpParameter,
141 IN DWORD dwCreationFlags,
142 OUT LPDWORD lpThreadId)
143{
144 /* Act as if we're going to create a remote thread in ourselves */
146 lpThreadAttributes,
147 dwStackSize,
148 lpStartAddress,
149 lpParameter,
150 dwCreationFlags,
151 lpThreadId);
152}
153
154/*
155 * @implemented
156 */
157HANDLE
158WINAPI
160 IN LPSECURITY_ATTRIBUTES lpThreadAttributes,
161 IN DWORD dwStackSize,
162 IN LPTHREAD_START_ROUTINE lpStartAddress,
163 IN LPVOID lpParameter,
164 IN DWORD dwCreationFlags,
165 OUT LPDWORD lpThreadId)
166{
168 INITIAL_TEB InitialTeb;
171 OBJECT_ATTRIBUTES LocalObjectAttributes;
174 ULONG Dummy;
175 PTEB Teb;
176 THREAD_BASIC_INFORMATION ThreadBasicInfo;
177 PACTIVATION_CONTEXT_STACK ActivationContextStack = NULL;
178 ACTIVATION_CONTEXT_BASIC_INFORMATION ActCtxInfo;
181 SIZE_T ReturnSize;
182
183 DPRINT("CreateRemoteThread: hProcess: %p dwStackSize: %lu lpStartAddress"
184 ": %p lpParameter: %p, dwCreationFlags: %lx\n", hProcess,
185 dwStackSize, lpStartAddress, lpParameter, dwCreationFlags);
186
187 /* Clear the Context */
188 RtlZeroMemory(&Context, sizeof(Context));
189
190 /* Write PID */
192
193 /* Create the Stack */
195 (dwCreationFlags & STACK_SIZE_PARAM_IS_A_RESERVATION) ?
196 0 : dwStackSize,
197 (dwCreationFlags & STACK_SIZE_PARAM_IS_A_RESERVATION) ?
198 dwStackSize : 0,
199 &InitialTeb);
200 if (!NT_SUCCESS(Status))
201 {
203 return NULL;
204 }
205
206 /* Create the Initial Context */
208 lpParameter,
209 lpStartAddress,
210 InitialTeb.StackBase,
211 1);
212
213 /* Initialize the attributes for the thread object */
214 ObjectAttributes = BaseFormatObjectAttributes(&LocalObjectAttributes,
215 lpThreadAttributes,
216 NULL);
217
218 /* Create the Kernel Thread Object */
222 hProcess,
223 &ClientId,
224 &Context,
225 &InitialTeb,
226 TRUE);
227 if (!NT_SUCCESS(Status))
228 {
229 /* Fail the kernel create */
230 BaseFreeThreadStack(hProcess, &InitialTeb);
232 return NULL;
233 }
234
235 /* Are we in the same process? */
236 if (hProcess == NtCurrentProcess())
237 {
238 /* Get the TEB */
241 &ThreadBasicInfo,
242 sizeof(ThreadBasicInfo),
243 &ReturnLength);
244 if (!NT_SUCCESS(Status))
245 {
246 /* Fail */
247 DPRINT1("SXS: %s - Failing thread create because "
248 "NtQueryInformationThread() failed with status %08lx\n",
250 goto Quit;
251 }
252
253 /* Allocate the Activation Context Stack */
254 Status = RtlAllocateActivationContextStack(&ActivationContextStack);
255 if (!NT_SUCCESS(Status))
256 {
257 /* Fail */
258 DPRINT1("SXS: %s - Failing thread create because "
259 "RtlAllocateActivationContextStack() failed with status %08lx\n",
261 goto Quit;
262 }
263
264 /* Save it */
265 Teb = ThreadBasicInfo.TebBaseAddress;
266 Teb->ActivationContextStackPointer = ActivationContextStack;
267
268 /* Query the Context */
270 NULL,
271 0,
272 ActivationContextBasicInformation,
273 &ActCtxInfo,
274 sizeof(ActCtxInfo),
275 &ReturnSize);
276 if (!NT_SUCCESS(Status))
277 {
278 /* Fail */
279 DPRINT1("SXS: %s - Failing thread create because "
280 "RtlQueryInformationActivationContext() failed with status %08lx\n",
282 goto Quit;
283 }
284
285 /* Does it need to be activated? */
286 if ((ActCtxInfo.hActCtx) && !(ActCtxInfo.dwFlags & 1))
287 {
288 /* Activate it */
290 Teb,
291 ActCtxInfo.hActCtx,
292 &Cookie);
293 if (!NT_SUCCESS(Status))
294 {
295 /* Fail */
296 DPRINT1("SXS: %s - Failing thread create because "
297 "RtlActivateActivationContextEx() failed with status %08lx\n",
299 goto Quit;
300 }
301 }
302
303 /* Sync the service tag with the parent thread's one */
304 Teb->SubProcessTag = NtCurrentTeb()->SubProcessTag;
305 }
306
307 /* Notify CSR */
309 {
311 }
312 else
313 {
314 if (hProcess != NtCurrentProcess())
315 {
317
318 /* Get the direct CSRSRV export */
321 "CsrCreateRemoteThread");
323 {
324 /* Call it instead of going through LPC */
326 }
327 }
328 }
329
330Quit:
331 if (!NT_SUCCESS(Status))
332 {
333 /* Failed to create the thread */
334
335 /* Free the activation context stack */
336 if (ActivationContextStack)
337 RtlFreeActivationContextStack(ActivationContextStack);
338
340 // FIXME: Wait for the thread to terminate?
341 BaseFreeThreadStack(hProcess, &InitialTeb);
343
345 return NULL;
346 }
347
348 /* Success */
349 if (lpThreadId)
350 *lpThreadId = HandleToUlong(ClientId.UniqueThread);
351
352 /* Resume the thread if asked */
353 if (!(dwCreationFlags & CREATE_SUSPENDED))
354 NtResumeThread(hThread, &Dummy);
355
356 /* Return handle to thread */
357 return hThread;
358}
359
360/*
361 * @implemented
362 */
363VOID
364WINAPI
366{
369 PRTL_CRITICAL_SECTION LoaderLock;
370
371 /* Make sure loader lock isn't held */
372 LoaderLock = NtCurrentPeb()->LoaderLock;
373 if (LoaderLock) ASSERT(NtCurrentTeb()->ClientId.UniqueThread != LoaderLock->OwningThread);
374
375 /*
376 * Terminate process if this is the last thread
377 * of the current process
378 */
381 &LastThread,
382 sizeof(LastThread),
383 NULL);
384 if ((NT_SUCCESS(Status)) && (LastThread)) ExitProcess(uExitCode);
385
386 /* Notify DLLs and TLS Callbacks of termination */
388
389 /* Tell the Kernel to free the Stack */
390 NtCurrentTeb()->FreeStackOnTermination = TRUE;
391 NtTerminateThread(NULL, uExitCode);
392
393 /* We should never reach this place */
394 ERROR_FATAL("It should not happen\n");
395 while (TRUE); /* 'noreturn' function */
396}
397
398/*
399 * @implemented
400 */
401HANDLE
402WINAPI
403OpenThread(IN DWORD dwDesiredAccess,
406{
408 HANDLE ThreadHandle;
411
414
416 NULL,
418 NULL,
419 NULL);
420
421 Status = NtOpenThread(&ThreadHandle,
422 dwDesiredAccess,
424 &ClientId);
425 if (!NT_SUCCESS(Status))
426 {
428 return NULL;
429 }
430
431 return ThreadHandle;
432}
433
434/*
435 * @implemented
436 */
437PTEB
439{
440 return NtCurrentTeb();
441}
442
443/*
444 * @implemented
445 */
446BOOL
447WINAPI
449{
451}
452
453
454/*
455 * @implemented
456 */
457DWORD
458WINAPI
460{
462}
463
464/*
465 * @implemented
466 */
467BOOL
468NTAPI
470 OUT LPFILETIME lpCreationTime,
471 OUT LPFILETIME lpExitTime,
472 OUT LPFILETIME lpKernelTime,
473 OUT LPFILETIME lpUserTime)
474{
475 KERNEL_USER_TIMES KernelUserTimes;
477
480 &KernelUserTimes,
481 sizeof(KERNEL_USER_TIMES),
482 NULL);
483 if (!NT_SUCCESS(Status))
484 {
486 return FALSE;
487 }
488
489 *lpCreationTime = *(LPFILETIME)&KernelUserTimes.CreateTime;
490 *lpExitTime = *(LPFILETIME)&KernelUserTimes.ExitTime;
491 *lpKernelTime = *(LPFILETIME)&KernelUserTimes.KernelTime;
492 *lpUserTime = *(LPFILETIME)&KernelUserTimes.UserTime;
493 return TRUE;
494}
495
496/*
497 * @implemented
498 */
499BOOL
500WINAPI
502 OUT LPCONTEXT lpContext)
503{
505
506 Status = NtGetContextThread(hThread, lpContext);
507 if (!NT_SUCCESS(Status))
508 {
510 return FALSE;
511 }
512
513 return TRUE;
514}
515
516/*
517 * @implemented
518 */
519BOOL
520WINAPI
522 IN CONST CONTEXT *lpContext)
523{
525
527 if (!NT_SUCCESS(Status))
528 {
530 return FALSE;
531 }
532
533 return TRUE;
534}
535
536/*
537 * @implemented
538 */
539BOOL
540WINAPI
542 OUT LPDWORD lpExitCode)
543{
544 THREAD_BASIC_INFORMATION ThreadBasic;
546
549 &ThreadBasic,
551 NULL);
552 if (!NT_SUCCESS(Status))
553 {
555 return FALSE;
556 }
557
558 *lpExitCode = ThreadBasic.ExitStatus;
559 return TRUE;
560}
561
562/*
563 * @implemented
564 */
565DWORD
566WINAPI
568{
569 ULONG PreviousResumeCount;
571
572 Status = NtResumeThread(hThread, &PreviousResumeCount);
573 if (!NT_SUCCESS(Status))
574 {
576 return -1;
577 }
578
579 return PreviousResumeCount;
580}
581
582/*
583 * @implemented
584 */
585BOOL
586WINAPI
588 IN DWORD dwExitCode)
589{
591#if DBG
592 PRTL_CRITICAL_SECTION LoaderLock;
594#endif /* DBG */
595
596 /* Check for invalid thread handle */
597 if (!hThread)
598 {
599 /* Fail if one was passed */
601 return FALSE;
602 }
603
604#if DBG
605 /* Get the loader lock */
606 LoaderLock = NtCurrentPeb()->LoaderLock;
607 if (LoaderLock)
608 {
609 /* Get our TID */
612 &ThreadInfo,
613 sizeof(ThreadInfo),
614 NULL);
615 if (NT_SUCCESS(Status))
616 {
617 /* If terminating the current thread, we must not hold the loader lock */
618 if (NtCurrentTeb()->ClientId.UniqueThread == ThreadInfo.ClientId.UniqueThread)
620 }
621 }
622#endif /* DBG */
623
624 /* Now terminate the thread */
625 Status = NtTerminateThread(hThread, dwExitCode);
626 if (!NT_SUCCESS(Status))
627 {
628 /* Fail */
630 return FALSE;
631 }
632
633 /* All done */
634 return TRUE;
635}
636
637/*
638 * @implemented
639 */
640DWORD
641WINAPI
643{
644 ULONG PreviousSuspendCount;
646
647 Status = NtSuspendThread(hThread, &PreviousSuspendCount);
648 if (!NT_SUCCESS(Status))
649 {
651 return -1;
652 }
653
654 return PreviousSuspendCount;
655}
656
657/*
658 * @implemented
659 */
661WINAPI
663 IN DWORD_PTR dwThreadAffinityMask)
664{
665 THREAD_BASIC_INFORMATION ThreadBasic;
666 KAFFINITY AffinityMask;
668
669 AffinityMask = (KAFFINITY)dwThreadAffinityMask;
670
673 &ThreadBasic,
675 NULL);
676 if (!NT_SUCCESS(Status))
677 {
679 return 0;
680 }
681
684 &AffinityMask,
685 sizeof(KAFFINITY));
686 if (!NT_SUCCESS(Status))
687 {
689 ThreadBasic.AffinityMask = 0;
690 }
691
692 return ThreadBasic.AffinityMask;
693}
694
695#define THEONLYGROUP 0 // Fake support for a single group
696
697/*
698 * @implemented
699 */
700BOOL
701WINAPI
704{
706 THREAD_BASIC_INFORMATION ThreadBasic;
707
708 STUB; // FIXME: Real group support
711 &ThreadBasic,
712 sizeof(ThreadBasic),
713 NULL);
714 if (!NT_SUCCESS(Status))
715 {
717 return FALSE;
718 }
719 ZeroMemory(GroupAffinity, sizeof(*GroupAffinity)); // For Reserved
720 GroupAffinity->Mask = ThreadBasic.AffinityMask;
722 return TRUE;
723}
724
725/*
726 * @implemented
727 */
728BOOL
729WINAPI
732 OUT OPTIONAL PGROUP_AFFINITY PreviousGroupAffinity)
733{
734 DWORD_PTR OldMask;
735
736 STUB; // FIXME: Real group support
738 {
740 return FALSE;
741 }
742
744 if (OldMask && PreviousGroupAffinity)
745 {
746 ZeroMemory(PreviousGroupAffinity, sizeof(*PreviousGroupAffinity)); // For Reserved
747 PreviousGroupAffinity->Mask = OldMask;
748 PreviousGroupAffinity->Group = THEONLYGROUP;
749 }
750 return OldMask != 0;
751}
752
753/*
754 * @implemented
755 */
756BOOL
757WINAPI
759 IN int nPriority)
760{
761 LONG Prio = nPriority;
763
764 /* Check if values forcing saturation should be used */
766 {
767 /* This is 16 */
768 Prio = (HIGH_PRIORITY + 1) / 2;
769 }
770 else if (Prio == THREAD_PRIORITY_IDLE)
771 {
772 /* This is -16 */
773 Prio = -((HIGH_PRIORITY + 1) / 2);
774 }
775
776 /* Set the Base Priority */
779 &Prio,
780 sizeof(LONG));
781 if (!NT_SUCCESS(Status))
782 {
783 /* Failure */
785 return FALSE;
786 }
787
788 /* Return */
789 return TRUE;
790}
791
792/*
793 * @implemented
794 */
795int
796WINAPI
798{
799 THREAD_BASIC_INFORMATION ThreadBasic;
801
802 /* Query the Base Priority Increment */
805 &ThreadBasic,
807 NULL);
808 if (!NT_SUCCESS(Status))
809 {
810 /* Failure */
813 }
814
815 /* Do some conversions for saturation values */
816 if (ThreadBasic.BasePriority == ((HIGH_PRIORITY + 1) / 2))
817 {
818 /* Win32 calls this "time critical" */
820 }
821 else if (ThreadBasic.BasePriority == -((HIGH_PRIORITY + 1) / 2))
822 {
823 /* Win32 calls this "idle" */
825 }
826
827 /* Return the final result */
828 return ThreadBasic.BasePriority;
829}
830
831/*
832 * @implemented
833 */
834BOOL
835WINAPI
837 OUT PBOOL pDisablePriorityBoost)
838{
841
845 sizeof(ULONG),
846 NULL);
847 if (!NT_SUCCESS(Status))
848 {
850 return FALSE;
851 }
852
853 *pDisablePriorityBoost = PriorityBoost;
854 return TRUE;
855}
856
857/*
858 * @implemented
859 */
860BOOL
861NTAPI
863 IN BOOL bDisablePriorityBoost)
864{
867
868 PriorityBoost = bDisablePriorityBoost != FALSE;
869
873 sizeof(ULONG));
874 if (!NT_SUCCESS(Status))
875 {
877 return FALSE;
878 }
879
880 return TRUE;
881}
882
883/*
884 * @implemented
885 */
886BOOL
887WINAPI
889 IN DWORD dwSelector,
890 OUT LPLDT_ENTRY lpSelectorEntry)
891{
892#ifdef _M_IX86
893 DESCRIPTOR_TABLE_ENTRY DescriptionTableEntry;
895
896 /* Set the selector and do the query */
897 DescriptionTableEntry.Selector = dwSelector;
900 &DescriptionTableEntry,
901 sizeof(DESCRIPTOR_TABLE_ENTRY),
902 NULL);
903 if (!NT_SUCCESS(Status))
904 {
905 /* Fail */
907 return FALSE;
908 }
909
910 /* Success, return the selector */
911 *lpSelectorEntry = DescriptionTableEntry.Descriptor;
912 return TRUE;
913#else
914 DPRINT1("Calling GetThreadSelectorEntry!\n");
915 return FALSE;
916#endif
917}
918
919/*
920 * @implemented
921 */
922DWORD
923WINAPI
925 IN DWORD dwIdealProcessor)
926{
928
931 &dwIdealProcessor,
932 sizeof(ULONG));
933 if (!NT_SUCCESS(Status))
934 {
936 return -1;
937 }
938
939 return (DWORD)Status;
940}
941
942/*
943 * @implemented
944 */
945DWORD
946WINAPI
948{
949 THREAD_BASIC_INFORMATION ThreadBasic;
951
954 &ThreadBasic,
956 NULL);
957 if (!NT_SUCCESS(Status))
958 {
960 return 0;
961 }
962
963 return HandleToUlong(ThreadBasic.ClientId.UniqueProcess);
964}
965
966/*
967 * @implemented
968 */
969DWORD
970WINAPI
972{
973 THREAD_BASIC_INFORMATION ThreadBasic;
975
978 &ThreadBasic,
980 NULL);
981 if (!NT_SUCCESS(Status))
982 {
984 return 0;
985 }
986
987 return HandleToUlong(ThreadBasic.ClientId.UniqueThread);
988}
989
990/*
991 * @unimplemented
992 */
993LANGID
994WINAPI
996{
997#if (NTDDI_VERSION < NTDDI_LONGHORN)
998 /* We only support LangId == 0, for selecting a language
999 * identifier that best supports the NT Console. */
1000 if (LangId != 0)
1001 {
1003 return 0;
1004 }
1005#endif
1006
1008
1009 return LANGIDFROMLCID(NtCurrentTeb()->CurrentLocale);
1010}
1011
1012/*
1013 * @implemented
1014 */
1015DWORD
1016WINAPI
1020{
1022 ACTIVATION_CONTEXT_BASIC_INFORMATION ActCtxInfo;
1023
1024 /* Zero the activation context and query information on it */
1025 RtlZeroMemory(&ActCtxInfo, sizeof(ActCtxInfo));
1027 NULL,
1028 0,
1029 ActivationContextBasicInformation,
1030 &ActCtxInfo,
1031 sizeof(ActCtxInfo),
1032 NULL);
1033 if (!NT_SUCCESS(Status))
1034 {
1035 /* Fail due to SxS */
1036 DbgPrint("SXS: %s failing because RtlQueryInformationActivationContext()"
1037 "returned status %08lx\n", __FUNCTION__, Status);
1039 return FALSE;
1040 }
1041
1042 /* Queue the APC */
1045 pfnAPC,
1046 (PVOID)dwData,
1047 (ActCtxInfo.dwFlags & 1) ?
1048 INVALID_ACTIVATION_CONTEXT : ActCtxInfo.hActCtx);
1049 if (!NT_SUCCESS(Status))
1050 {
1052 return FALSE;
1053 }
1054
1055 /* All good */
1056 return TRUE;
1057}
1058
1059/*
1060 * @unimplemented
1061 */
1062BOOL
1063WINAPI
1065{
1066 PTEB Teb = NtCurrentTeb();
1067 ULONG GuaranteedStackBytes;
1069
1070 if (!StackSizeInBytes)
1071 {
1073 return FALSE;
1074 }
1075
1076 AllocationSize = *StackSizeInBytes;
1077
1078 /* Retrieve the current stack size */
1079 GuaranteedStackBytes = Teb->GuaranteedStackBytes;
1080
1081 /* Return the size of the previous stack */
1082 *StackSizeInBytes = GuaranteedStackBytes;
1083
1084 /*
1085 * If the new stack size is either zero or is less than the current size,
1086 * the previous stack size is returned and we return success.
1087 */
1088 if ((AllocationSize == 0) || (AllocationSize < GuaranteedStackBytes))
1089 {
1090 return TRUE;
1091 }
1092
1093 // FIXME: Unimplemented!
1095
1096 // Temporary HACK for supporting applications!
1097 return TRUE; // FALSE;
1098}
1099
1100/*
1101 * @implemented
1102 */
1103BOOL
1104WINAPI
1106 OUT PBOOL lpIOIsPending)
1107{
1108 ULONG IoPending;
1110
1111 /* Query the flag */
1114 &IoPending,
1115 sizeof(IoPending),
1116 NULL);
1117 if (NT_SUCCESS(Status))
1118 {
1119 /* Return the flag */
1120 *lpIOIsPending = IoPending ? TRUE : FALSE;
1121 return TRUE;
1122 }
1123
1124 /* Fail */
1126 return FALSE;
1127}
1128
1129/*
1130 * @implemented
1131 */
1132BOOL
1133WINAPI
1136 IN ULONG Flags)
1137{
1139
1140 /* NOTE: Rtl needs to safely call the function using a trampoline */
1142 if (!NT_SUCCESS(Status))
1143 {
1144 /* Failed */
1146 return FALSE;
1147 }
1148
1149 /* All good */
1150 return TRUE;
1151}
1152
1153/*
1154 * @implemented
1155 */
1156DWORD
1157WINAPI
1159{
1160 ULONG Index;
1161 PTEB Teb;
1162 PPEB Peb;
1163
1164 /* Get the PEB and TEB, lock the PEB */
1165 Teb = NtCurrentTeb();
1168
1169 /* Try to get regular TEB slot */
1171 if (Index != 0xFFFFFFFF)
1172 {
1173 /* Clear the value. */
1174 Teb->TlsSlots[Index] = 0;
1176 return Index;
1177 }
1178
1179 /* If it fails, try to find expansion TEB slot. */
1181 if (Index != 0xFFFFFFFF)
1182 {
1183 /* Is there no expansion slot yet? */
1184 if (!Teb->TlsExpansionSlots)
1185 {
1186 /* Allocate an array */
1187 Teb->TlsExpansionSlots = RtlAllocateHeap(RtlGetProcessHeap(),
1190 sizeof(PVOID));
1191 }
1192
1193 /* Did we get an array? */
1194 if (!Teb->TlsExpansionSlots)
1195 {
1196 /* Fail */
1198 Index = 0xFFFFFFFF;
1200 }
1201 else
1202 {
1203 /* Clear the value. */
1204 Teb->TlsExpansionSlots[Index] = 0;
1206 }
1207 }
1208 else
1209 {
1210 /* Fail */
1212 }
1213
1214 /* Release the lock and return */
1216 return Index;
1217}
1218
1219/*
1220 * @implemented
1221 */
1222BOOL
1223WINAPI
1225{
1226 BOOL BitSet;
1227 PPEB Peb;
1229 PVOID TlsBitmap;
1231
1232 /* Acquire the PEB lock and grab the PEB */
1233 Peb = NtCurrentPeb();
1235
1236 /* Check if the index is too high */
1238 {
1239 /* Check if it can fit in the expansion slots */
1242 {
1243 /* It's invalid */
1246 return FALSE;
1247 }
1248 else
1249 {
1250 /* Use the expansion bitmap */
1251 TlsBitmap = Peb->TlsExpansionBitmap;
1252 Index = TlsIndex;
1253 }
1254 }
1255 else
1256 {
1257 /* Use the normal bitmap */
1258 TlsBitmap = Peb->TlsBitmap;
1259 }
1260
1261 /* Check if the index was set */
1262 BitSet = RtlAreBitsSet(TlsBitmap, Index, 1);
1263 if (BitSet)
1264 {
1265 /* Tell the kernel to free the TLS cells */
1268 &Index,
1269 sizeof(DWORD));
1270 if (!NT_SUCCESS(Status))
1271 {
1274 return FALSE;
1275 }
1276
1277 /* Clear the bit */
1278 RtlClearBits(TlsBitmap, Index, 1);
1279 }
1280 else
1281 {
1282 /* Fail */
1285 return FALSE;
1286 }
1287
1288 /* Done! */
1290 return TRUE;
1291}
1292
1293/*
1294 * @implemented
1295 */
1296LPVOID
1297WINAPI
1299{
1300 PTEB Teb;
1301
1302 /* Get the TEB and clear the last error */
1303 Teb = NtCurrentTeb();
1304 Teb->LastErrorValue = 0;
1305
1306 /* Check for simple TLS index */
1308 {
1309 /* Return it */
1310 return Teb->TlsSlots[Index];
1311 }
1312
1313 /* Check for valid index */
1315 {
1316 /* Fail */
1318 return NULL;
1319 }
1320
1321 /* The expansion slots are allocated on demand, so check for it. */
1322 Teb->LastErrorValue = 0;
1323 if (!Teb->TlsExpansionSlots) return NULL;
1324
1325 /* Return the value from the expansion slots */
1327}
1328
1329/*
1330 * @implemented
1331 */
1332BOOL
1333WINAPI
1335 IN LPVOID Value)
1336{
1338 PTEB Teb = NtCurrentTeb();
1339
1340 /* Check for simple TLS index */
1342 {
1343 /* Return it */
1344 Teb->TlsSlots[Index] = Value;
1345 return TRUE;
1346 }
1347
1348 /* Check if this is an expansion slot */
1351 {
1352 /* Fail */
1354 return FALSE;
1355 }
1356
1357 /* Do we not have expansion slots? */
1358 if (!Teb->TlsExpansionSlots)
1359 {
1360 /* Get the PEB lock to see if we still need them */
1362 if (!Teb->TlsExpansionSlots)
1363 {
1364 /* Allocate them */
1365 Teb->TlsExpansionSlots = RtlAllocateHeap(RtlGetProcessHeap(),
1368 sizeof(PVOID));
1369 if (!Teb->TlsExpansionSlots)
1370 {
1371 /* Fail */
1374 return FALSE;
1375 }
1376 }
1377
1378 /* Release the lock */
1380 }
1381
1382 /* Write the value */
1384
1385 /* Success */
1386 return TRUE;
1387}
1388
1389/* EOF */
#define NtCurrentPeb()
Definition: FLS.c:22
_In_ PVOID _In_ ULONG _Out_ PVOID _In_ ULONG _Inout_ PULONG ReturnLength
#define DECLSPEC_HOTPATCH
Definition: _mingw.h:240
LONG NTSTATUS
Definition: precomp.h:26
#define DPRINT1
Definition: precomp.h:8
@ BasepCreateThread
Definition: basemsg.h:22
#define BASESRV_SERVERDLL_INDEX
Definition: basemsg.h:15
#define HandleToUlong(h)
Definition: basetsd.h:73
#define ULongToHandle(h)
Definition: basetsd.h:75
#define UNIMPLEMENTED
Definition: ntoskrnl.c:15
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
Definition: heap.c:616
_In_ CDROM_SCAN_FOR_SPECIAL_INFO _In_ PCDROM_SCAN_FOR_SPECIAL_HANDLER Function
Definition: cdrom.h:1156
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
Definition: conport.c:36
#define CSR_CREATE_API_NUMBER(ServerId, ApiId)
Definition: csrmsg.h:37
NTSTATUS NTAPI CsrCreateRemoteThread(IN HANDLE hThread, IN PCLIENT_ID ClientId)
Definition: thredsup.c:569
#define STATUS_NO_MEMORY
Definition: d3dkmdt.h:51
#define STATUS_NOT_SUPPORTED
Definition: d3dkmdt.h:48
#define RtlAreBitsSet
Definition: dbgbitmap.h:328
#define RtlClearBits
Definition: dbgbitmap.h:331
#define RtlFindClearBitsAndSet
Definition: dbgbitmap.h:333
_In_ ULONG AllocationSize
Definition: dispmprt.h:712
_In_ D3DDDI_VIDEO_PRESENT_TARGET_ID _In_ ULONG _In_ ULONG Flags
Definition: dispmprt.h:245
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define NTSTATUS
Definition: precomp.h:19
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
ULONG_PTR KAFFINITY
Definition: compat.h:85
#define SetLastError(x)
Definition: compat.h:752
#define GetProcAddress(x, y)
Definition: compat.h:753
@ ThreadDescriptorTableEntry
Definition: compat.h:941
@ ThreadAmILastThread
Definition: compat.h:947
@ ThreadTimes
Definition: compat.h:936
@ ThreadIdealProcessor
Definition: compat.h:948
@ ThreadAffinityMask
Definition: compat.h:939
@ ThreadBasePriority
Definition: compat.h:938
@ ThreadBasicInformation
Definition: compat.h:935
@ ThreadPriorityBoost
Definition: compat.h:949
@ ThreadIsIoPending
Definition: compat.h:951
@ ThreadZeroTlsCell
Definition: compat.h:945
#define ERROR_INVALID_HANDLE
Definition: compat.h:98
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
PPEB Peb
Definition: dllmain.c:27
BOOLEAN BaseRunningInServerProcess
Definition: dllmain.c:20
LONG WINAPI UnhandledExceptionFilter(IN PEXCEPTION_POINTERS ExceptionInfo)
Definition: except.c:269
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleA(LPCSTR lpModuleName)
Definition: loader.c:812
VOID WINAPI ExitProcess(IN UINT uExitCode)
Definition: proc.c:1380
DWORD WINAPI QueueUserAPC(IN PAPCFUNC pfnAPC, IN HANDLE hThread, IN ULONG_PTR dwData)
Definition: thread.c:1017
LPVOID WINAPI TlsGetValue(IN DWORD Index)
Definition: thread.c:1298
DWORD WINAPI ResumeThread(IN HANDLE hThread)
Definition: thread.c:567
BOOL WINAPI SetThreadPriority(IN HANDLE hThread, IN int nPriority)
Definition: thread.c:758
HANDLE WINAPI CreateRemoteThread(IN HANDLE hProcess, IN LPSECURITY_ATTRIBUTES lpThreadAttributes, IN DWORD dwStackSize, IN LPTHREAD_START_ROUTINE lpStartAddress, IN LPVOID lpParameter, IN DWORD dwCreationFlags, OUT LPDWORD lpThreadId)
Definition: thread.c:159
VOID NTAPI BaseDispatchApc(IN PAPCFUNC ApcRoutine, IN PVOID Data, IN PACTIVATION_CONTEXT ActivationContext)
Definition: thread.c:92
BOOL WINAPI SetThreadGroupAffinity(IN HANDLE hThread, IN const GROUP_AFFINITY *GroupAffinity, OUT OPTIONAL PGROUP_AFFINITY PreviousGroupAffinity)
Definition: thread.c:730
DWORD_PTR WINAPI SetThreadAffinityMask(IN HANDLE hThread, IN DWORD_PTR dwThreadAffinityMask)
Definition: thread.c:662
DECLSPEC_NORETURN VOID WINAPI BaseThreadStartup(_In_ LPTHREAD_START_ROUTINE lpStartAddress, _In_ LPVOID lpParameter)
Definition: thread.c:56
BOOL WINAPI SetThreadContext(IN HANDLE hThread, IN CONST CONTEXT *lpContext)
Definition: thread.c:521
DWORD WINAPI SuspendThread(IN HANDLE hThread)
Definition: thread.c:642
BOOL NTAPI GetThreadTimes(IN HANDLE hThread, OUT LPFILETIME lpCreationTime, OUT LPFILETIME lpExitTime, OUT LPFILETIME lpKernelTime, OUT LPFILETIME lpUserTime)
Definition: thread.c:469
LANGID WINAPI SetThreadUILanguage(IN LANGID LangId)
Definition: thread.c:995
VOID WINAPI ExitThread(IN DWORD uExitCode)
Definition: thread.c:365
HANDLE WINAPI OpenThread(IN DWORD dwDesiredAccess, IN BOOL bInheritHandle, IN DWORD dwThreadId)
Definition: thread.c:403
BOOL WINAPI QueueUserWorkItem(IN LPTHREAD_START_ROUTINE Function, IN PVOID Context, IN ULONG Flags)
Definition: thread.c:1134
DWORD WINAPI GetProcessIdOfThread(IN HANDLE Thread)
Definition: thread.c:947
BOOL WINAPI TlsSetValue(IN DWORD Index, IN LPVOID Value)
Definition: thread.c:1334
BOOL WINAPI GetThreadSelectorEntry(IN HANDLE hThread, IN DWORD dwSelector, OUT LPLDT_ENTRY lpSelectorEntry)
Definition: thread.c:888
DWORD WINAPI SetThreadIdealProcessor(IN HANDLE hThread, IN DWORD dwIdealProcessor)
Definition: thread.c:924
PTEB GetTeb(VOID)
Definition: thread.c:438
NTSTATUS(NTAPI * PCSR_CREATE_REMOTE_THREAD)(IN HANDLE ThreadHandle, IN PCLIENT_ID ClientId)
Definition: thread.c:19
HANDLE WINAPI DECLSPEC_HOTPATCH CreateThread(IN LPSECURITY_ATTRIBUTES lpThreadAttributes, IN DWORD dwStackSize, IN LPTHREAD_START_ROUTINE lpStartAddress, IN LPVOID lpParameter, IN DWORD dwCreationFlags, OUT LPDWORD lpThreadId)
Definition: thread.c:137
BOOL WINAPI TerminateThread(IN HANDLE hThread, IN DWORD dwExitCode)
Definition: thread.c:587
NTSTATUS WINAPI BasepNotifyCsrOfThread(IN HANDLE ThreadHandle, IN PCLIENT_ID ClientId)
Definition: thread.c:25
BOOL WINAPI TlsFree(IN DWORD Index)
Definition: thread.c:1224
BOOL WINAPI SetThreadStackGuarantee(IN OUT PULONG StackSizeInBytes)
Definition: thread.c:1064
DWORD WINAPI GetThreadId(IN HANDLE Thread)
Definition: thread.c:971
BOOL WINAPI GetThreadPriorityBoost(IN HANDLE hThread, OUT PBOOL pDisablePriorityBoost)
Definition: thread.c:836
BOOL NTAPI SetThreadPriorityBoost(IN HANDLE hThread, IN BOOL bDisablePriorityBoost)
Definition: thread.c:862
int WINAPI GetThreadPriority(IN HANDLE hThread)
Definition: thread.c:797
BOOL WINAPI GetThreadGroupAffinity(IN HANDLE hThread, OUT PGROUP_AFFINITY GroupAffinity)
Definition: thread.c:702
BOOL WINAPI GetThreadIOPendingFlag(IN HANDLE hThread, OUT PBOOL lpIOIsPending)
Definition: thread.c:1105
BOOL WINAPI GetExitCodeThread(IN HANDLE hThread, OUT LPDWORD lpExitCode)
Definition: thread.c:541
#define THEONLYGROUP
Definition: thread.c:695
BOOL WINAPI GetThreadContext(IN HANDLE hThread, OUT LPCONTEXT lpContext)
Definition: thread.c:501
NTSTATUS WINAPI BaseCreateStack(_In_ HANDLE hProcess, _In_opt_ SIZE_T StackCommit, _In_opt_ SIZE_T StackReserve, _Out_ PINITIAL_TEB InitialTeb)
Definition: utils.c:355
VOID WINAPI BaseInitializeContext(IN PCONTEXT Context, IN PVOID Parameter, IN PVOID StartAddress, IN PVOID StackAddress, IN ULONG ContextType)
Definition: utils.c:514
POBJECT_ATTRIBUTES WINAPI BaseFormatObjectAttributes(OUT POBJECT_ATTRIBUTES ObjectAttributes, IN PSECURITY_ATTRIBUTES SecurityAttributes OPTIONAL, IN PUNICODE_STRING ObjectName)
Definition: utils.c:305
VOID WINAPI BaseFreeThreadStack(_In_ HANDLE hProcess, _In_ PINITIAL_TEB InitialTeb)
Definition: utils.c:496
DWORD WINAPI DECLSPEC_HOTPATCH TlsAlloc(void)
Definition: thread.c:657
BOOL WINAPI DECLSPEC_HOTPATCH SwitchToThread(void)
Definition: thread.c:639
#define DECLSPEC_NORETURN
Definition: corecrt.h:131
#define __FUNCTION__
Definition: types.h:116
DWORD dwThreadId
Definition: fdebug.c:31
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
_In_opt_ PFILE_OBJECT _In_opt_ PETHREAD Thread
Definition: fltkernel.h:2653
Status
Definition: gdiplustypes.h:24
#define DbgPrint
Definition: hal.h:12
#define TLS_EXPANSION_SLOTS
Definition: pstypes.h:336
#define EXCEPTION_EXECUTE_HANDLER
Definition: excpt.h:90
#define HIGH_PRIORITY
#define NtCurrentTeb
#define STUB
Definition: kernel32.h:27
USHORT LANGID
Definition: mui.h:9
struct _FILETIME * LPFILETIME
Definition: time.c:29
_In_ BOOL _In_ HANDLE hProcess
Definition: mapping.h:71
#define ZeroMemory
Definition: minwinbase.h:31
PTHREAD_START_ROUTINE LPTHREAD_START_ROUTINE
Definition: minwinbase.h:124
BOOL * PBOOL
Definition: minwindef.h:137
struct _ThreadInfo ThreadInfo
#define ASSERT(a)
Definition: mode.c:44
#define InitializeObjectAttributes(p, n, a, r, s)
Definition: reg.c:115
_In_opt_ HANDLE _In_opt_ PIO_APC_ROUTINE ApcRoutine
Definition: iofuncs.h:726
VOID(NTAPI * PKNORMAL_ROUTINE)(IN PVOID NormalContext OPTIONAL, IN PVOID SystemArgument1 OPTIONAL, IN PVOID SystemArgument2 OPTIONAL)
Definition: ketypes.h:888
NTSYSAPI NTSTATUS NTAPI RtlQueueWorkItem(_In_ WORKERCALLBACKFUNC Function, _In_opt_ PVOID Context, _In_ ULONG Flags)
#define RTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_FORMAT_WHISTLER
Definition: rtltypes.h:109
#define RTL_ACTIVATE_ACTIVATION_CONTEXT_EX_FLAG_RELEASE_ON_STACK_DEALLOCATION
Definition: rtltypes.h:114
#define RTL_QUERY_ACTIVATION_CONTEXT_FLAG_USE_ACTIVE_ACTIVATION_CONTEXT
Definition: rtltypes.h:124
VOID(NTAPI * WORKERCALLBACKFUNC)(_In_ PVOID Context)
Definition: rtltypes.h:515
HANDLE hThread
Definition: wizard.c:28
#define _In_
Definition: no_sal2.h:158
#define THREAD_ALL_ACCESS
Definition: nt_native.h:1342
NTSTATUS NtTerminateThread(IN HANDLE ThreadHandle OPTIONAL, IN NTSTATUS ExitStatus)
Definition: kill.c:1310
#define NtCurrentProcess()
Definition: nt_native.h:1660
NTSTATUS NTAPI NtClose(IN HANDLE Handle)
Definition: obhandle.c:3429
NTSYSAPI NTSTATUS NTAPI NtCreateThread(OUT PHANDLE phThread, IN ACCESS_MASK AccessMask, IN POBJECT_ATTRIBUTES ObjectAttributes, IN HANDLE hProcess, OUT PCLIENT_ID pClientId, IN PCONTEXT pContext, OUT PSTACKINFO pStackInfo, IN BOOLEAN bSuspended)
static HANDLE ULONG_PTR dwData
Definition: pipe.c:111
static BOOL bInheritHandle
Definition: pipe.c:110
NTSTATUS NTAPI NtSetContextThread(IN HANDLE ThreadHandle, IN PCONTEXT ThreadContext)
Definition: debug.c:387
NTSTATUS NTAPI NtGetContextThread(IN HANDLE ThreadHandle, IN OUT PCONTEXT ThreadContext)
Definition: debug.c:350
NTSTATUS NTAPI NtQueryInformationThread(_In_ HANDLE ThreadHandle, _In_ THREADINFOCLASS ThreadInformationClass, _Out_writes_bytes_to_opt_(ThreadInformationLength, *ReturnLength) PVOID ThreadInformation, _In_ ULONG ThreadInformationLength, _Out_opt_ PULONG ReturnLength)
Definition: query.c:3017
NTSTATUS NTAPI NtSetInformationThread(_In_ HANDLE ThreadHandle, _In_ THREADINFOCLASS ThreadInformationClass, _In_reads_bytes_(ThreadInformationLength) PVOID ThreadInformation, _In_ ULONG ThreadInformationLength)
Definition: query.c:2301
NTSTATUS NTAPI NtQueueApcThread(IN HANDLE ThreadHandle, IN PKNORMAL_ROUTINE ApcRoutine, IN PVOID NormalContext, IN PVOID SystemArgument1, IN PVOID SystemArgument2)
Definition: state.c:600
NTSTATUS NTAPI NtResumeThread(IN HANDLE ThreadHandle, OUT PULONG SuspendCount OPTIONAL)
Definition: state.c:290
NTSTATUS NTAPI NtSuspendThread(IN HANDLE ThreadHandle, OUT PULONG PreviousSuspendCount OPTIONAL)
Definition: state.c:352
NTSTATUS NTAPI NtOpenThread(OUT PHANDLE ThreadHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, IN PCLIENT_ID ClientId OPTIONAL)
Definition: thread.c:1013
#define STATUS_NO_YIELD_PERFORMED
Definition: ntstatus.h:225
#define CONST
Definition: pedump.c:81
long LONG
Definition: pedump.c:60
PETHREAD LastThread
Definition: pinsup.c:109
#define OBJ_INHERIT
Definition: winternl.h:225
#define _SEH2_GetExceptionCode()
Definition: pseh2_64.h:204
#define _SEH2_EXCEPT(...)
Definition: pseh2_64.h:104
#define _SEH2_GetExceptionInformation()
Definition: pseh2_64.h:203
#define _SEH2_END
Definition: pseh2_64.h:194
#define _SEH2_TRY
Definition: pseh2_64.h:93
DWORD BaseSetLastNTError(IN NTSTATUS Status)
Definition: reactos.cpp:167
#define LANGIDFROMLCID(l)
Definition: nls.h:18
#define ERROR_FATAL(...)
Definition: debug.h:238
NTSTATUS NTAPI CsrNewThread(VOID)
Definition: api.c:26
NTSTATUS NTAPI CsrClientCallServer(_Inout_ PCSR_API_MESSAGE ApiMessage, _Inout_opt_ PCSR_CAPTURE_BUFFER CaptureBuffer, _In_ CSR_API_NUMBER ApiNumber, _In_ ULONG DataLength)
Definition: connect.c:366
#define STATUS_SUCCESS
Definition: shellext.h:65
#define DPRINT
Definition: sndvol32.h:73
PULONG MinorVersion OPTIONAL
Definition: CrossNt.h:68
#define TLS_MINIMUM_AVAILABLE
Definition: ntddk_ex.h:236
_In_ PVOID Context
Definition: storport.h:2269
NTSTATUS Status
Definition: basemsg.h:279
union _BASE_API_MESSAGE::@3970 Data
BASE_CREATE_THREAD CreateThreadRequest
Definition: basemsg.h:284
HANDLE ThreadHandle
Definition: basemsg.h:104
CLIENT_ID ClientId
Definition: basemsg.h:105
HANDLE UniqueThread
Definition: compat.h:826
HANDLE UniqueProcess
Definition: compat.h:825
$USHORT Group
Definition: ntbasedef.h:673
KAFFINITY Mask
Definition: ntbasedef.h:672
PVOID StackBase
Definition: pstypes.h:757
LARGE_INTEGER UserTime
Definition: winternl.h:2377
LARGE_INTEGER CreateTime
Definition: winternl.h:2374
LARGE_INTEGER KernelTime
Definition: winternl.h:2376
LARGE_INTEGER ExitTime
Definition: winternl.h:2375
Definition: compat.h:777
PVOID TlsBitmap
Definition: ntddk_ex.h:259
PRTL_BITMAP TlsExpansionBitmap
Definition: winternl.h:538
Definition: compat.h:836
PVOID ActivationContextStackPointer
Definition: compat.h:854
PVOID SubProcessTag
Definition: winternl.h:662
PVOID * TlsExpansionSlots
Definition: compat.h:894
ULONG GuaranteedStackBytes
Definition: winternl.h:668
PVOID TlsSlots[64]
Definition: compat.h:879
PPEB ProcessEnvironmentBlock
Definition: ntddk_ex.h:337
ULONG LastErrorValue
Definition: compat.h:843
KPRIORITY BasePriority
Definition: compat.h:932
KAFFINITY AffinityMask
Definition: compat.h:930
uint32_t * PULONG
Definition: typedefs.h:59
uint32_t DWORD_PTR
Definition: typedefs.h:65
#define UNIMPLEMENTED_ONCE
Definition: typedefs.h:30
#define NTAPI
Definition: typedefs.h:36
ULONG_PTR SIZE_T
Definition: typedefs.h:80
uint32_t * LPDWORD
Definition: typedefs.h:59
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define IN
Definition: typedefs.h:39
uint32_t ULONG
Definition: typedefs.h:59
#define OUT
Definition: typedefs.h:40
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
_In_ WDFCOLLECTION _In_ ULONG Index
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
Definition: wdfregistry.h:413
_In_ WDFREQUEST _In_ NTSTATUS _In_ CCHAR PriorityBoost
Definition: wdfrequest.h:1016
DWORD WINAPI GetCurrentThreadId(void)
Definition: thread.c:459
#define STACK_SIZE_PARAM_IS_A_RESERVATION
Definition: winbase.h:225
#define CREATE_SUSPENDED
Definition: winbase.h:183
#define THREAD_PRIORITY_TIME_CRITICAL
Definition: winbase.h:306
#define THREAD_PRIORITY_ERROR_RETURN
Definition: winbase.h:307
#define THREAD_PRIORITY_IDLE
Definition: winbase.h:303
#define WINAPI
Definition: msvc.h:6
NTSYSAPI void WINAPI RtlReleasePebLock(void)
Definition: libsupp.c:84
NTSYSAPI void WINAPI RtlAcquirePebLock(void)
Definition: libsupp.c:74
NTSYSAPI NTSTATUS WINAPI NtYieldExecution(void)
Definition: thrdschd.c:887
NTSYSAPI NTSTATUS WINAPI RtlActivateActivationContextEx(ULONG, TEB *, HANDLE, ULONG_PTR *)
Definition: actctx.c:5697
NTSYSAPI void WINAPI RtlReleaseActivationContext(HANDLE)
Definition: actctx.c:5664
#define NtCurrentThread()
Definition: winternl.h:5372
NTSYSAPI void WINAPI LdrShutdownThread(void)
Definition: ldrinit.c:1093
NTSYSAPI NTSTATUS WINAPI RtlQueryInformationActivationContext(ULONG, HANDLE, PVOID, ULONG, PVOID, SIZE_T, SIZE_T *)
Definition: actctx.c:5833
NTSYSAPI void WINAPI RtlFreeActivationContextStack(ACTIVATION_CONTEXT_STACK *)
Definition: actctx.c:5774
#define TlsIndex
Definition: ws2_32p.h:277
_In_opt_ PVOID _Out_ PLARGE_INTEGER Cookie
Definition: cmfuncs.h:14
_Out_ PGROUP_AFFINITY GroupAffinity
Definition: iofuncs.h:2535
_Out_ PCLIENT_ID ClientId
Definition: kefuncs.h:1151