ReactOS 0.4.17-dev-1133-gc25e4fd
thread.c File Reference
#include <k32.h>
#include <debug.h>
Include dependency graph for thread.c:

Go to the source code of this file.

Macros

#define NDEBUG
 
#define SXS_SUPPORT_FIXME
 
#define THREAD_ALL_ACCESS_NT6   (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0xFFFF)
 
#define THEONLYGROUP   0
 

Typedefs

typedef NTSTATUS(NTAPI * PCSR_CREATE_REMOTE_THREAD) (IN HANDLE ThreadHandle, IN PCLIENT_ID ClientId)
 

Functions

NTSTATUS WINAPI BasepNotifyCsrOfThread (IN HANDLE ThreadHandle, IN PCLIENT_ID ClientId)
 
DECLSPEC_NORETURN VOID WINAPI BaseThreadStartup (_In_ LPTHREAD_START_ROUTINE lpStartAddress, _In_ LPVOID lpParameter)
 
VOID NTAPI BaseDispatchApc (IN PAPCFUNC ApcRoutine, IN PVOID Data, IN PACTIVATION_CONTEXT ActivationContext)
 
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)
 
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)
 
VOID WINAPI ExitThread (IN DWORD uExitCode)
 
HANDLE WINAPI OpenThread (IN DWORD dwDesiredAccess, IN BOOL bInheritHandle, IN DWORD dwThreadId)
 
PTEB GetTeb (VOID)
 
BOOL WINAPI SwitchToThread (VOID)
 
DWORD WINAPI GetCurrentThreadId (VOID)
 
BOOL NTAPI GetThreadTimes (IN HANDLE hThread, OUT LPFILETIME lpCreationTime, OUT LPFILETIME lpExitTime, OUT LPFILETIME lpKernelTime, OUT LPFILETIME lpUserTime)
 
BOOL WINAPI GetThreadContext (IN HANDLE hThread, OUT LPCONTEXT lpContext)
 
BOOL WINAPI SetThreadContext (IN HANDLE hThread, IN CONST CONTEXT *lpContext)
 
BOOL WINAPI GetExitCodeThread (IN HANDLE hThread, OUT LPDWORD lpExitCode)
 
DWORD WINAPI ResumeThread (IN HANDLE hThread)
 
BOOL WINAPI TerminateThread (IN HANDLE hThread, IN DWORD dwExitCode)
 
DWORD WINAPI SuspendThread (IN HANDLE hThread)
 
DWORD_PTR WINAPI SetThreadAffinityMask (IN HANDLE hThread, IN DWORD_PTR dwThreadAffinityMask)
 
BOOL WINAPI GetThreadGroupAffinity (IN HANDLE hThread, OUT PGROUP_AFFINITY GroupAffinity)
 
BOOL WINAPI SetThreadGroupAffinity (IN HANDLE hThread, IN const GROUP_AFFINITY *GroupAffinity, OUT OPTIONAL PGROUP_AFFINITY PreviousGroupAffinity)
 
BOOL WINAPI SetThreadPriority (IN HANDLE hThread, IN int nPriority)
 
int WINAPI GetThreadPriority (IN HANDLE hThread)
 
BOOL WINAPI GetThreadPriorityBoost (IN HANDLE hThread, OUT PBOOL pDisablePriorityBoost)
 
BOOL NTAPI SetThreadPriorityBoost (IN HANDLE hThread, IN BOOL bDisablePriorityBoost)
 
BOOL WINAPI GetThreadSelectorEntry (IN HANDLE hThread, IN DWORD dwSelector, OUT LPLDT_ENTRY lpSelectorEntry)
 
DWORD WINAPI SetThreadIdealProcessor (IN HANDLE hThread, IN DWORD dwIdealProcessor)
 
DWORD WINAPI GetProcessIdOfThread (IN HANDLE Thread)
 
DWORD WINAPI GetThreadId (IN HANDLE Thread)
 
LANGID WINAPI SetThreadUILanguage (IN LANGID LangId)
 
DWORD WINAPI QueueUserAPC (IN PAPCFUNC pfnAPC, IN HANDLE hThread, IN ULONG_PTR dwData)
 
BOOL WINAPI SetThreadStackGuarantee (IN OUT PULONG StackSizeInBytes)
 
BOOL WINAPI GetThreadIOPendingFlag (IN HANDLE hThread, OUT PBOOL lpIOIsPending)
 
BOOL WINAPI QueueUserWorkItem (IN LPTHREAD_START_ROUTINE Function, IN PVOID Context, IN ULONG Flags)
 
DWORD WINAPI TlsAlloc (VOID)
 
BOOL WINAPI TlsFree (IN DWORD Index)
 
LPVOID WINAPI TlsGetValue (IN DWORD Index)
 
BOOL WINAPI TlsSetValue (IN DWORD Index, IN LPVOID Value)
 

Macro Definition Documentation

◆ NDEBUG

#define NDEBUG

Definition at line 14 of file thread.c.

◆ SXS_SUPPORT_FIXME

#define SXS_SUPPORT_FIXME

Definition at line 17 of file thread.c.

◆ THEONLYGROUP

#define THEONLYGROUP   0

Definition at line 698 of file thread.c.

◆ THREAD_ALL_ACCESS_NT6

#define THREAD_ALL_ACCESS_NT6   (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0xFFFF)

Definition at line 21 of file thread.c.

Typedef Documentation

◆ PCSR_CREATE_REMOTE_THREAD

typedef NTSTATUS(NTAPI * PCSR_CREATE_REMOTE_THREAD) (IN HANDLE ThreadHandle, IN PCLIENT_ID ClientId)

Definition at line 19 of file thread.c.

Function Documentation

◆ BaseDispatchApc()

VOID NTAPI BaseDispatchApc ( IN PAPCFUNC  ApcRoutine,
IN PVOID  Data,
IN PACTIVATION_CONTEXT  ActivationContext 
)

Definition at line 94 of file thread.c.

97{
98 RTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME ActivationFrame;
99
100 /* Setup the activation context */
101 ActivationFrame.Size = sizeof(ActivationFrame);
103
104 /* Check if caller wanted one */
105 if (ActivationContext == INVALID_ACTIVATION_CONTEXT)
106 {
107 /* Do the APC directly */
109 return;
110 }
111
112 /* Then activate it */
113 RtlActivateActivationContextUnsafeFast(&ActivationFrame, ActivationContext);
114
115 /* Call the routine under SEH */
117 {
119 }
121 {
122
123 }
124 _SEH2_END;
125
126 /* Now de-activate and release the activation context */
127 RtlDeactivateActivationContextUnsafeFast(&ActivationFrame);
128 RtlReleaseActivationContext(ActivationContext);
129}
#define EXCEPTION_EXECUTE_HANDLER
Definition: excpt.h:90
_In_opt_ HANDLE _In_opt_ PIO_APC_ROUTINE ApcRoutine
Definition: iofuncs.h:726
#define RTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_FORMAT_WHISTLER
Definition: rtltypes.h:109
#define _SEH2_EXCEPT(...)
Definition: pseh2_64.h:104
#define _SEH2_END
Definition: pseh2_64.h:194
#define _SEH2_TRY
Definition: pseh2_64.h:93
uint32_t ULONG_PTR
Definition: typedefs.h:65
NTSYSAPI void WINAPI RtlReleaseActivationContext(HANDLE)
Definition: actctx.c:5664

Referenced by QueueUserAPC().

◆ BasepNotifyCsrOfThread()

NTSTATUS WINAPI BasepNotifyCsrOfThread ( IN HANDLE  ThreadHandle,
IN PCLIENT_ID  ClientId 
)

Definition at line 27 of file thread.c.

29{
30 BASE_API_MESSAGE ApiMessage;
31 PBASE_CREATE_THREAD CreateThreadRequest = &ApiMessage.Data.CreateThreadRequest;
32
33 DPRINT("BasepNotifyCsrOfThread: Thread: %p, Handle %p\n",
34 ClientId->UniqueThread, ThreadHandle);
35
36 /* Fill out the request */
37 CreateThreadRequest->ClientId = *ClientId;
38 CreateThreadRequest->ThreadHandle = ThreadHandle;
39
40 /* Call CSR */
42 NULL,
44 sizeof(*CreateThreadRequest));
45 if (!NT_SUCCESS(ApiMessage.Status))
46 {
47 DPRINT1("Failed to tell CSRSS about new thread: %lx\n", ApiMessage.Status);
48 return ApiMessage.Status;
49 }
50
51 /* Return Success */
52 return STATUS_SUCCESS;
53}
#define DPRINT1
Definition: precomp.h:8
@ BasepCreateThread
Definition: basemsg.h:22
#define BASESRV_SERVERDLL_INDEX
Definition: basemsg.h:15
#define CSR_CREATE_API_NUMBER(ServerId, ApiId)
Definition: csrmsg.h:37
#define NULL
Definition: types.h:112
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
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:368
#define STATUS_SUCCESS
Definition: shellext.h:65
#define DPRINT
Definition: sndvol32.h:73
union _BASE_API_MESSAGE::@4358 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
NTSTATUS Status
Definition: csrmsg.h:110
_Out_ PCLIENT_ID ClientId
Definition: kefuncs.h:1151

Referenced by CreateRemoteThread().

◆ BaseThreadStartup()

DECLSPEC_NORETURN VOID WINAPI BaseThreadStartup ( _In_ LPTHREAD_START_ROUTINE  lpStartAddress,
_In_ LPVOID  lpParameter 
)

Definition at line 58 of file thread.c.

61{
62 /* Attempt to call the Thread Start Address */
64 {
65 /* Legacy check which is still used today for Win32 threads */
66 if (NtCurrentTeb()->NtTib.Version == (30 << 8)) // OS/2 V3.0 ("Cruiser")
67 {
68 /* This registers the termination port with CSRSS */
70 }
71
72 /* Get the exit code from the Thread Start */
73 ExitThread(lpStartAddress(lpParameter));
74 }
76 {
77 /* Get the Exit code from the SEH Handler */
79 {
80 /* Kill the whole process, usually */
82 }
83 else
84 {
85 /* If running inside CSRSS, kill just this thread */
87 }
88 }
90}
BOOLEAN BaseRunningInServerProcess
Definition: dllmain.c:20
LONG WINAPI UnhandledExceptionFilter(IN PEXCEPTION_POINTERS ExceptionInfo)
Definition: except.c:269
VOID WINAPI ExitProcess(IN UINT uExitCode)
Definition: proc.c:1382
VOID WINAPI ExitThread(IN DWORD uExitCode)
Definition: thread.c:367
#define NtCurrentTeb
#define _SEH2_GetExceptionCode()
Definition: pseh2_64.h:204
#define _SEH2_GetExceptionInformation()
Definition: pseh2_64.h:203
NTSTATUS NTAPI CsrNewThread(VOID)
Definition: api.c:26

Referenced by BaseInitializeContext().

◆ CreateRemoteThread()

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 at line 161 of file thread.c.

168{
170 INITIAL_TEB InitialTeb;
173 OBJECT_ATTRIBUTES LocalObjectAttributes;
176 ULONG Dummy;
177 PTEB Teb;
178 THREAD_BASIC_INFORMATION ThreadBasicInfo;
179 PACTIVATION_CONTEXT_STACK ActivationContextStack = NULL;
180 ACTIVATION_CONTEXT_BASIC_INFORMATION ActCtxInfo;
183 SIZE_T ReturnSize;
184
185 DPRINT("CreateRemoteThread: hProcess: %p dwStackSize: %lu lpStartAddress"
186 ": %p lpParameter: %p, dwCreationFlags: %lx\n", hProcess,
187 dwStackSize, lpStartAddress, lpParameter, dwCreationFlags);
188
189 /* Clear the Context */
190 RtlZeroMemory(&Context, sizeof(Context));
191
192 /* Write PID */
194
195 /* Create the Stack */
197 (dwCreationFlags & STACK_SIZE_PARAM_IS_A_RESERVATION) ?
198 0 : dwStackSize,
199 (dwCreationFlags & STACK_SIZE_PARAM_IS_A_RESERVATION) ?
200 dwStackSize : 0,
201 &InitialTeb);
202 if (!NT_SUCCESS(Status))
203 {
205 return NULL;
206 }
207
208 /* Create the Initial Context */
210 lpParameter,
211 lpStartAddress,
212 InitialTeb.StackBase,
213 1);
214
215 /* Initialize the attributes for the thread object */
216 ObjectAttributes = BaseFormatObjectAttributes(&LocalObjectAttributes,
217 lpThreadAttributes,
218 NULL);
219
220 /* Create the Kernel Thread Object */
224 hProcess,
225 &ClientId,
226 &Context,
227 &InitialTeb,
228 TRUE);
229 if (!NT_SUCCESS(Status))
230 {
231 /* Fail the kernel create */
232 BaseFreeThreadStack(hProcess, &InitialTeb);
234 return NULL;
235 }
236
237 /* Are we in the same process? */
238 if (hProcess == NtCurrentProcess())
239 {
240 /* Get the TEB */
243 &ThreadBasicInfo,
244 sizeof(ThreadBasicInfo),
245 &ReturnLength);
246 if (!NT_SUCCESS(Status))
247 {
248 /* Fail */
249 DPRINT1("SXS: %s - Failing thread create because "
250 "NtQueryInformationThread() failed with status %08lx\n",
252 goto Quit;
253 }
254
255 /* Allocate the Activation Context Stack */
256 Status = RtlAllocateActivationContextStack(&ActivationContextStack);
257 if (!NT_SUCCESS(Status))
258 {
259 /* Fail */
260 DPRINT1("SXS: %s - Failing thread create because "
261 "RtlAllocateActivationContextStack() failed with status %08lx\n",
263 goto Quit;
264 }
265
266 /* Save it */
267 Teb = ThreadBasicInfo.TebBaseAddress;
268 Teb->ActivationContextStackPointer = ActivationContextStack;
269
270 /* Query the Context */
272 NULL,
273 0,
274 ActivationContextBasicInformation,
275 &ActCtxInfo,
276 sizeof(ActCtxInfo),
277 &ReturnSize);
278 if (!NT_SUCCESS(Status))
279 {
280 /* Fail */
281 DPRINT1("SXS: %s - Failing thread create because "
282 "RtlQueryInformationActivationContext() failed with status %08lx\n",
284 goto Quit;
285 }
286
287 /* Does it need to be activated? */
288 if ((ActCtxInfo.hActCtx) && !(ActCtxInfo.dwFlags & 1))
289 {
290 /* Activate it */
292 Teb,
293 ActCtxInfo.hActCtx,
294 &Cookie);
295 if (!NT_SUCCESS(Status))
296 {
297 /* Fail */
298 DPRINT1("SXS: %s - Failing thread create because "
299 "RtlActivateActivationContextEx() failed with status %08lx\n",
301 goto Quit;
302 }
303 }
304
305 /* Sync the service tag with the parent thread's one */
306 Teb->SubProcessTag = NtCurrentTeb()->SubProcessTag;
307 }
308
309 /* Notify CSR */
311 {
313 }
314 else
315 {
316 if (hProcess != NtCurrentProcess())
317 {
319
320 /* Get the direct CSRSRV export */
323 "CsrCreateRemoteThread");
325 {
326 /* Call it instead of going through LPC */
328 }
329 }
330 }
331
332Quit:
333 if (!NT_SUCCESS(Status))
334 {
335 /* Failed to create the thread */
336
337 /* Free the activation context stack */
338 if (ActivationContextStack)
339 RtlFreeActivationContextStack(ActivationContextStack);
340
342 // FIXME: Wait for the thread to terminate?
343 BaseFreeThreadStack(hProcess, &InitialTeb);
345
347 return NULL;
348 }
349
350 /* Success */
351 if (lpThreadId)
352 *lpThreadId = HandleToUlong(ClientId.UniqueThread);
353
354 /* Resume the thread if asked */
355 if (!(dwCreationFlags & CREATE_SUSPENDED))
356 NtResumeThread(hThread, &Dummy);
357
358 /* Return handle to thread */
359 return hThread;
360}
_In_ PVOID _In_ ULONG _Out_ PVOID _In_ ULONG _Inout_ PULONG ReturnLength
LONG NTSTATUS
Definition: precomp.h:26
#define HandleToUlong(h)
Definition: basetsd.h:73
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
Definition: conport.c:36
NTSTATUS NTAPI CsrCreateRemoteThread(IN HANDLE hThread, IN PCLIENT_ID ClientId)
Definition: thredsup.c:569
#define TRUE
Definition: types.h:120
#define GetProcAddress(x, y)
Definition: compat.h:753
@ ThreadBasicInformation
Definition: compat.h:935
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleA(LPCSTR lpModuleName)
Definition: loader.c:812
NTSTATUS(NTAPI * PCSR_CREATE_REMOTE_THREAD)(IN HANDLE ThreadHandle, IN PCLIENT_ID ClientId)
Definition: thread.c:19
NTSTATUS WINAPI BasepNotifyCsrOfThread(IN HANDLE ThreadHandle, IN PCLIENT_ID ClientId)
Definition: thread.c:27
#define THREAD_ALL_ACCESS_NT6
Definition: thread.c:21
NTSTATUS WINAPI BaseCreateStack(_In_ HANDLE hProcess, _In_opt_ SIZE_T StackCommit, _In_opt_ SIZE_T StackReserve, _Out_ PINITIAL_TEB InitialTeb)
Definition: utils.c:381
VOID WINAPI BaseInitializeContext(IN PCONTEXT Context, IN PVOID Parameter, IN PVOID StartAddress, IN PVOID StackAddress, IN ULONG ContextType)
Definition: utils.c:540
POBJECT_ATTRIBUTES WINAPI BaseFormatObjectAttributes(OUT POBJECT_ATTRIBUTES ObjectAttributes, IN PSECURITY_ATTRIBUTES SecurityAttributes OPTIONAL, IN PUNICODE_STRING ObjectName)
Definition: utils.c:331
VOID WINAPI BaseFreeThreadStack(_In_ HANDLE hProcess, _In_ PINITIAL_TEB InitialTeb)
Definition: utils.c:522
#define __FUNCTION__
Definition: types.h:116
Status
Definition: gdiplustypes.h:24
_In_ BOOL _In_ HANDLE hProcess
Definition: mapping.h:71
#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
HANDLE hThread
Definition: wizard.c:28
NTSTATUS NtTerminateThread(IN HANDLE ThreadHandle OPTIONAL, IN NTSTATUS ExitStatus)
Definition: kill.c:1315
#define NtCurrentProcess()
Definition: nt_native.h:1660
NTSTATUS NTAPI NtClose(IN HANDLE Handle)
Definition: obhandle.c:3434
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)
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 NtResumeThread(IN HANDLE ThreadHandle, OUT PULONG SuspendCount OPTIONAL)
Definition: state.c:290
DWORD BaseSetLastNTError(IN NTSTATUS Status)
Definition: reactos.cpp:167
_In_ PVOID Context
Definition: storport.h:2325
HANDLE UniqueProcess
Definition: compat.h:825
PVOID StackBase
Definition: pstypes.h:757
Definition: compat.h:836
PVOID ActivationContextStackPointer
Definition: compat.h:854
PVOID SubProcessTag
Definition: winternl.h:662
ULONG_PTR SIZE_T
Definition: typedefs.h:80
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
uint32_t ULONG
Definition: typedefs.h:59
#define STACK_SIZE_PARAM_IS_A_RESERVATION
Definition: winbase.h:225
#define CREATE_SUSPENDED
Definition: winbase.h:183
NTSYSAPI NTSTATUS WINAPI RtlActivateActivationContextEx(ULONG, TEB *, HANDLE, ULONG_PTR *)
Definition: actctx.c:5697
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
_In_opt_ PVOID _Out_ PLARGE_INTEGER Cookie
Definition: cmfuncs.h:14

Referenced by _DoDLLInjection(), BaseCreateThreadPoolThread(), ConSrvConsoleCtrlEventTimeout(), CreateThread(), dll_entry_point(), GuiConsoleShowConsoleProperties(), test_CreateRemoteThread(), test_debugger(), test_ExitProcess(), test_TerminateProcess(), and test_thread_actctx().

◆ CreateThread()

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 at line 139 of file thread.c.

145{
146 /* Act as if we're going to create a remote thread in ourselves */
148 lpThreadAttributes,
149 dwStackSize,
150 lpStartAddress,
151 lpParameter,
152 dwCreationFlags,
153 lpThreadId);
154}
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:161

Referenced by _beginthread(), _beginthreadex(), _ServiceMain(), _test_flush_async(), _tWinMain(), AcceptConnections(), add_sink(), ammediastream_async_receive_time(), ANIMATE_Play(), apartment_hostobject_in_hostapt(), ApplicationPageWndProc(), async_reader_create(), async_wait_pipe(), audio_record_init_stream(), check_hook_thread(), check_interface_marshal_proxy_creation_(), check_thread_apartment_(), check_thread_instance(), child_process(), clipboard_wnd_proc(), CommonInstall(), create_child_thread(), CreateClientProcess(), CreateLobbyMessageReceptionThread(), createPlayerAsync(), CreateServers(), CreateServiceThread(), CreateSidCacheMgr(), CreateSoundThread(), CSysTray::CreateSysTrayThread(), CreateTestThread(), CtfImmSetLangBand(), CThread::CThread(), custom_action_server(), d3d12_swapchain_init(), D3DX10CreateThreadPump(), DbgkCreateThread(), DbgkpPostFakeThreadMessages(), DbgUiConvertStateChangeStructure(), DECLARE_INTERFACE_(), DIALOG_Printing_DialogProc(), CTrayWindow::DisplayProperties(), CTrayWindow::DisplayRunFileDlg(), dll_entry_point(), do_msidbCustomActionTypeDll(), do_msidbCustomActionTypeScript(), do_wait_idle_child(), DosStartProcess32(), DP_IF_EnumSessions(), DPWS_Start(), dsound_render_init_stream(), dsound_render_sink_end_flush(), EmulatorInitialize(), ensurePlayerThread(), enumSessionsAsync(), ExitWindowsWorker(), fiber_actctx_func(), filter_graph_common_create(), fls_exit_deadlock_child(), get_id_thread(), get_thread_fpu_cw(), GUIDisplayStatusMessage(), HandleLogoff(), http_release_netconn(), IDirectSoundCaptureBufferImpl_Start(), SEALED_::IMsTscAx::Connect(), init(), InitDialog(), CDesktopThread::Initialize(), BtrfsPropSheet::Initialize(), COutputPin::InitializeIOThread(), InitializeScreenSaver(), InitiateSoundStreaming(), InitRpc(), InstallDrvDlgProc(), installer_proc(), InstallReactOS(), CZipFolder::InvokeCommand(), JustDoIt(), KmtRunKernelTest(), LocalScheduleJob(), LS_ThreadProc(), LsapRmInitializeServer(), MailSlotReader(), main(), MainDialogProc(), MainWndProc(), MCI_SendCommandAsync(), MCIAVI_mciPlay_async(), MCICDA_Play(), MCIQTZ_mciPlay(), midiStreamOpen(), MMDevEnum_RegisterEndpointNotificationCallback(), mmTaskCreate(), StringTest::mt(), Netbios(), NetworkInitPageDlgProc(), NotifyTopLevelWindow(), Window::OnCommand(), OnCreate(), OnInitDialog(), OnUpdate(), CZipExtract::CExtractSettingsPage::OnWizardNext(), Telnet::Open(), audio_wavein::open(), audio_waveout::open(), openAsync(), OpenDevice(), OSK_Create(), OutputQueue_Construct(), CKsClockForwarder::Pause(), PdhCollectQueryDataEx(), performance_Init(), PerformancePageWndProc(), PlayLogonSound(), PowerMeterDlgProc(), proc_PlaySoundAsync(), ProcessDlgProc(), ProcessPageWndProc(), Protocol_Start(), protocol_start(), rawinput_test_thread(), BtrfsRecv::RecvProgressDlgProc(), RegisterGPNotification(), report(), RpcReadFile(), rpcrt4_ncacn_http_open(), RPCRT4_new_client(), RPCRT4_start_listen_protseq(), RSetServiceStatus(), run_background_thread(), run_in_temp_desktop_(), run_LS_tests(), run_queued_tests(), run_thread(), RunItemCompletionThread(), RunLogoffShutdownThread(), RunSelectedTest(), RunSetup(), RunShell(), RunTest(), s_test_I_RpcBindingInqLocalClientPID(), schedule_timeout(), ScStartService(), SearchDrvDlgProc(), send_frame(), send_frame_time(), ServiceInit(), ServiceMain(), BtrfsPropSheet::set_cmdline(), set_window_state(), SHCreateThread(), SHOpenFolderWindow(), SockCreateOrReferenceAsyncThread(), start_host_object2(), start_installation(), START_TEST(), StartAdapterDiscovery(), StartAuthenticationPort(), StartClients(), StartNotificationThread(), StartPortThread(), CProgressDialog::StartProgressDialog(), BtrfsSend::StartSend(), StartServer(), StartServiceThread(), StartStopEnumEventsThread(), StartSystemShutdown(), CAsyncLoadIcon::StartTasks(), StartTestCORE10188(), StartTestCORE17376(), CUTBLangBarDlg::StartThread(), CHardErrorThread::StartThread(), subtest_fiber_actctx_preservation(), suspend_process_proc(), test(), test_AbortWaitCts(), Test_Acquire(), test_activateapp(), test_ActivateKeyboardLayout(), test_alertable(), test_alertable_wait(), test_apc_deadlock(), test_attach_input(), test_audiostreamsample_update(), Test_AVX(), Test_AVX512(), test_BCryptEncrypt(), test_blocking(), test_bsc_marshaling(), test_CancelSynchronousIo(), test_cancelsynchronousio(), test_ClipCursor_process(), Test_CloseWhileSelectDuplicatedSocket(), Test_CloseWhileSelectSameSocket(), test_CoFreeUnusedLibraries(), test_CoGetCurrentProcess(), test_completion_port_scheduling(), test_condvars_base(), test_condvars_consumer_producer(), test_CoRegisterPSClsid(), test_CoWaitForMultipleHandles(), test_CoWaitForMultipleHandles_thread(), test_crash_couninitialize(), test_CreateThread_basic(), test_CreateThread_stack(), test_CreateThread_suspended(), test_CUIAutomation_event_handlers(), test_dde_default_app(), test_ddrawstream_begin_flush_end_flush(), test_ddrawstream_receive(), test_ddrawstreamsample_completion_status(), test_ddrawstreamsample_update(), test_default_client_accessible_object(), test_default_ime_window_creation(), test_defwinproc(), test_deletecontext(), test_destroy_quit(), test_DragQueryFile(), test_duplicate_handle_access(), test_edit_messages(), test_EnableWindow(), test_enum_thread_windows(), test_events(), test_ffcn_directory_overlap(), test_ffcnMultipleThreads(), test_FiberLocalStorage(), test_flush(), test_foregroundwindow(), test_get_next_thread(), test_GetKeyState(), test_GetPointerInfo(), test_gettext(), test_GetThreadExitCode(), test_GetThreadTimes(), test_globalinterfacetable(), test_handles(), test_HeapCreate(), test_HideFromDebugger(), test_hook_cleanup(), test_http_connection(), test_icons(), test_IInitializeSpy(), test_ImmDefaultHwnd(), test_ImmThreads(), test_ImpersonateNamedPipeClient(), test_implicit_mta(), test_import_resolution(), test_InSendMessage(), test_interthread_messages(), test_iosb(), test_IUIAutomationEventHandler(), test_kernel32_tp_io(), test_keyed_events(), test_kill_on_exit(), test_layered_window(), test_main_thread(), test_mediastreamfilter_wait_until(), test_menu_input(), test_messages(), test_mt_factory(), test_mta_creation_thread_change_apartment(), test_MultiThreadApartment(), test_multithreaded_clipboard(), test_mutant(), test_NamedPipe_2(), test_no_couninitialize_client(), test_no_couninitialize_server(), test_nonalertable(), test_NtAtom(), test_oletlsdata(), test_overlapped(), test_PeekMessage(), test_proxy_used_in_wrong_thread(), test_pseudo_console(), test_QueueUserAPC(), test_rawinput(), test_reader_info(), test_reconnect(), test_registered_object_thread_affinity(), test_RegNotifyChangeKeyValue(), test_render_with_multithread(), test_request(), test_resource(), test_RoGetAgileReference(), test_RtlCreateUserStack(), test_RtlIsCriticalSectionLocked(), test_runner(), test_select(), test_SendInput_mouse_messages(), test_SendMessage_other_thread(), test_SendMessageTimeout(), test_set_clipboard_DRAWCLIPBOARD(), test_set_state(), test_SetCursor(), test_SetFocus(), test_SetForegroundWindow(), test_setparent_status(), test_shell_window(), test_ShowCursor(), test_smresult(), test_srwlock_base(), test_srwlock_example(), Test_SSE(), test_stop_wait_for_call(), test_suspend_thread(), test_SuspendThread(), test_tableweak_and_normal_marshal_and_releasedata(), test_tableweak_and_normal_marshal_and_unmarshal(), test_TerminateThread(), test_thread_actctx(), test_thread_exit_destroy(), test_thread_objects(), test_thread_security(), test_thread_start_address(), test_ThreadIsTerminated(), test_threads(), test_tid_alert(), test_timeouts(), test_timers(), test_tls_links(), test_tp_io(), TEST_Tracking(), test_two_tableweak_marshal_and_releasedata(), test_uia_event_ProxyProviderWinEventHandler(), test_uia_node_from_prov_com_threading(), test_uia_reserved_value_ifaces(), test_UiaAddEvent(), test_UiaNodeFromHandle(), test_video_window_messages(), test_WaitBreak(), test_WaitCts(), test_WaitDcd(), test_WaitDsr(), test_WaitForInputIdle(), test_WaitRing(), test_winevents(), test_write_watch(), Test_WS_FORCEMINIMIZE_Sub(), TestMessages(), TestMultipleUserAPCs(), TestRecursiveInterThreadMessages(), testsink_Receive(), thread(), TIME_MMTimeStart(), uia_start_client_thread(), uia_start_event_thread(), uia_start_provider_thread(), UserLogin(), vfw_capture_init_stream(), vkd3d_create_thread(), WahOpenHandleHelper(), wave_out_test_deviceOut(), WdmAudSetMixerDeviceFormatByLegacy(), wined3d_adapter_register_budget_change_notification(), wined3d_cs_create(), WinMain(), wmain(), WriterThread::WriterThread(), WsAsyncCheckAndInitThread(), WshShell3_Popup(), and wWinMain().

◆ ExitThread()

VOID WINAPI ExitThread ( IN DWORD  uExitCode)

Definition at line 367 of file thread.c.

368{
371 PRTL_CRITICAL_SECTION LoaderLock;
372
373 /* Make sure loader lock isn't held */
374 LoaderLock = NtCurrentPeb()->LoaderLock;
375 if (LoaderLock) ASSERT(NtCurrentTeb()->ClientId.UniqueThread != LoaderLock->OwningThread);
376
377 /*
378 * Terminate process if this is the last thread
379 * of the current process
380 */
383 &LastThread,
384 sizeof(LastThread),
385 NULL);
386 if ((NT_SUCCESS(Status)) && (LastThread)) ExitProcess(uExitCode);
387
388 /* Notify DLLs and TLS Callbacks of termination */
390#if (NTDDI_VERSION < NTDDI_LONGHORN)
391 /* Tell the Kernel to free the Stack */
392 NtCurrentTeb()->FreeStackOnTermination = TRUE;
393#endif
394 NtTerminateThread(NULL, uExitCode);
395
396 /* We should never reach this place */
397 ERROR_FATAL("It should not happen\n");
398 while (TRUE); /* 'noreturn' function */
399}
#define NtCurrentPeb()
Definition: FLS.c:22
@ ThreadAmILastThread
Definition: compat.h:947
#define ASSERT(a)
Definition: mode.c:44
PETHREAD LastThread
Definition: pinsup.c:109
#define ERROR_FATAL(...)
Definition: debug.h:238
#define NtCurrentThread()
Definition: winternl.h:5372
NTSYSAPI void WINAPI LdrShutdownThread(void)
Definition: ldrinit.c:1095

Referenced by _endthreadex(), BaseExitThreadPoolThread(), BaseProcessStartup(), BaseThreadStartup(), ChargenHandler(), client_stop(), collect_query_thread(), common_end_thread(), ConsoleControlDispatcher(), create_debug_port(), CreateSystemThreads(), DaytimeHandler(), DbgkExitThread(), ddeThread(), debug_and_exit(), debug_and_wait(), DECLARE_INTERFACE_(), DeleteFiber(), DiscardHandler(), EchoHandler(), exit_thread_fiber_func(), ExitWindowsThread(), FreeLibraryAndExitThread(), MMSYSTEM_MidiStream_Player(), NotificationThread(), QotdHandler(), server_stop(), StartServer(), test_stack_growth_thread(), test_thread_func(), thread_proc(), thread_start(), WaveActivateSoundStreaming(), wmain(), and wWinMain().

◆ GetCurrentThreadId()

DWORD WINAPI GetCurrentThreadId ( VOID  )

Definition at line 462 of file thread.c.

463{
465}

Referenced by __security_init_cookie(), __threadid(), CTipbarThread::_UninitItemList(), alloc_msi_remote_handle(), alloc_msihandle(), ANIMATE_DoStop(), AnotherThreadFunc(), apartment_construct(), AtlModuleAddCreateWndData(), AtlModuleExtractCreateWndData(), ATL::AtlWinModuleAddCreateWndData(), ATL::AtlWinModuleExtractCreateWndData(), CTipbarWnd::AttachFocusThread(), callback(), callback_func(), cbt_global_hook_proc(), cbt_hook_proc(), check_active_state_(), check_dinput_hooks(), check_notification(), check_window_style(), check_wnd_state_(), clipboard_thread(), clnt_cb_thread(), clnt_vc_create(), clnt_vc_destroy(), CMenuFocusManager::CMenuFocusManager(), ConIme_InitInstance(), ConIme_OnEnd(), CoRegisterInitializeSpy(), CoRevokeInitializeSpy(), create_binding_protocol(), create_test_windows(), CreateD3D9(), CreatePseudoConsole(), CtfImmGenerateMessage(), CtfImmTIMCreateInputContext(), DECLARE_INTERFACE_(), dialog_proc(), dialog_register_class(), dialog_run_message_loop(), DlgMainProc(), DllMain(), do_InitialDesktop_child(), do_wait_idle_child(), dprintf(), DumpNotificationState(), enum_thread(), EnumThreadWindows(), eprintf(), event_client(), fetch_thread_info(), FileOpenDlgProc95(), format_exception_msg(), frame_thread(), get_ime_window(), get_or_create_threaddata(), get_thread_data(), GetActiveWindow(), GetCapture(), GetFocus(), GetMessageRedrawWindowTest(), GetSystemUserInfo(), GetThreadFromCurrentProcess(), group_cancel_cleanup_increment_cb(), group_cancel_cleanup_release2_cb(), group_cancel_cleanup_release_cb(), HttpNegotiate_BeginningTransaction(), HttpNegotiate_GetRootSecurityId(), HttpNegotiate_OnResponse(), IDirectSoundBufferImpl_GetStatus(), IDirectSoundCaptureBufferImpl_GetStatus(), Imm32InternalLockIMC(), Imm32IsCrossThreadAccess(), ImmSetCompositionStringAW(), init_tests(), InitChildWindow(), InitD3D9BaseDevice(), InitThreads(), InitUniqueString(), is_apartment_thread(), JScript_AddNamedItem(), JScript_Close(), JScript_GetScriptDispatch(), JScript_GetScriptState(), JScript_SetScriptState(), JScriptParse_ParseScriptText(), JScriptParseProcedure_ParseProcedureText(), load_gecko(), log_debug(), log_hexdump(), MainDialogProc(), MainWndProc(), MCI_Close(), MCI_LoadMciDriver(), MCI_SendCommandFrom32(), mmGetCurrentTask(), msg_spy_init(), msi_dialog_check_messages(), msi_dialog_destroy(), MsiCloseAllHandles(), msvcrt_get_thread_data(), mutex_thread_proc(), new_stub_manager(), nfs41_open(), noop_thread_proc(), notification_callback(), OLEMenu_CallWndProc(), OLEMenu_GetMsgProc(), OLEMenu_InstallHooks(), OleSetMenuDescriptor(), OnInitDialog(), CAutoComplete::OnShowWindow(), oob_client(), oob_server(), PersistMoniker_Load(), print_sr_status_flags(), Protocol_Continue(), ProviderAdviseEvents_AdviseEventAdded(), ProviderAdviseEvents_AdviseEventRemoved(), ProviderFragment_get_BoundingRectangle(), ProviderFragment_get_FragmentRoot(), ProviderFragment_GetEmbeddedFragmentRoots(), ProviderFragment_GetRuntimeId(), ProviderFragment_Navigate(), ProviderFragmentRoot_GetFocus(), ProviderSimple_get_HostRawElementProvider(), ProviderSimple_get_ProviderOptions(), ProviderSimple_GetPatternProvider(), ProviderSimple_GetPropertyValue(), ProviderWinEventHandler_RespondToWinEvent(), CAsyncLoadIcon::Queue(), RegisterConsoleIME(), Rs232Thread(), rtl_wait_cb(), run_in_temp_desktop_thread_func(), ScriptThread(), select_server(), semaphore_thread_proc(), server_stop(), set_cursor_thread(), set_window_state(), CTipbarWnd::SetFocusThread(), setup_test(), CThreadMgr::SetupWindowsHook(), show_cursor_thread(), simple_client(), simple_mixed_client(), simple_server(), SPY_EnterMessage(), start_debugger(), START_TEST(), CTipbarWnd::StartModalInput(), statusclb_GetBindInfo(), statusclb_OnDataAvailable(), statusclb_OnProgress(), statusclb_OnStartBinding(), statusclb_OnStopBinding(), statusclb_QueryInterface(), CTipbarWnd::StopModalInput(), Stream_Read(), sw_SetContext(), Test_Acquire(), test_alertable(), test_async(), test_async_HttpSendRequestEx(), test_attach_input(), test_capture_4_proc(), test_CoGetCurrentProcess(), test_com_event_data_(), test_CoWaitForMultipleHandles_thread(), test_CreateThread_basic(), test_crypt_ui_wiz_import(), test_dbcs_wm_char(), test_dde_default_app(), test_default_ime_disabled_cb(), Test_DesktopAccess(), test_destroy_quit(), test_EnumDisplayMonitors(), test_foregroundwindow(), test_fragmentsize(), test_get_next_thread(), test_get_security(), test_handles(), test_hook_changing_window_proc(), test_hook_cleanup(), test_hook_cleanup_hook_proc(), test_hook_cleanup_thread_proc(), test_IInitializeSpy(), Test_InfoClass_Access(), test_inputdesktop(), test_inputdesktop2(), test_invisible_winstation_child(), test_IsDialogMessage(), test_keyboard_input(), test_MCIWndCreate(), test_message_conversion(), test_MessageBox(), test_notification_cb(), test_notify_message(), test_ole_initialization(), Test_OpenInputDesktop(), test_peb_teb(), test_PeekMessage(), test_process(), test_process_security_child(), test_query_object(), test_query_process(), test_quit_message(), test_recursion(), test_recursion_callback(), test_recursive_hook(), Test_References(), test_RtlLeaveCriticalSection(), test_RtlQueryProcessDebugInformation(), test_RtlRegisterWait(), test_SendInput_mouse_messages(), test_set_hook(), test_SetCursor(), Test_SetCursorPos(), test_SetFocus(), test_ShowCursor(), test_thread_description(), test_thread_info(), test_thread_lookup(), test_thread_priority(), test_tid_alert(), test_tp_group_cancel(), test_uia_node_from_prov_com_threading(), test_UiaAddEvent(), test_UiaNodeFromHandle(), test_video_window(), test_window_security(), test_window_threading(), test_winmodule(), test_wiznavigation(), test_zero_access(), TestGetUserObjectInfoA(), TestGetUserObjectInfoW(), testsink_eos(), testsink_new_segment(), testsink_Receive(), thread(), thread_proc(), threadFunc1(), ThreadShutdownNotify(), throw(), TIME_TriggerCallBack(), tp_object_execute(), TpCallbackMayRunLong(), TpDisassociateCallback(), MxLockNoDynam::TryToAcquire(), uia_add_event_test_thread(), uia_com_event_handler_test_thread(), uia_get_provider_from_hwnd(), uia_node_from_handle_test_thread(), uia_node_from_provider_test_com_thread(), UnregisterConsoleIME(), VBScript_AddNamedItem(), VBScript_Close(), VBScript_GetScriptDispatch(), VBScript_GetScriptState(), VBScript_SetScriptSite(), VBScript_SetScriptState(), VBScriptParse_ParseScriptText(), VBScriptParseProcedure_ParseProcedureText(), vkd3d_dbg_printf(), wave_out_test_deviceOut(), WDML_GetConv(), WDML_GetInstance(), WDML_Initialize(), WDML_NotifyThreadDetach(), WDML_ServerNameProc(), WDML_SetAllLastError(), wglDeleteContext(), wglMakeCurrent(), win_event_global_hook_proc(), WindowThreadProc(), wined3d_context_gl_destroy(), wined3d_context_gl_init(), wined3d_context_gl_reacquire(), wined3d_cs_mt_finish(), wined3d_cs_mt_require_space(), wined3d_cs_mt_submit(), wined3d_cs_run(), wined3d_from_cs(), wined3d_not_from_cs(), wined3d_resource_wait_idle(), wined3d_swapchain_gl_create_context(), wined3d_swapchain_gl_get_context(), wined3d_texture_decref(), WndProc(), wWinMain(), xmlGetThreadId(), xmlInitGlobalsInternal(), and xmlIsMainThreadInternal().

◆ GetExitCodeThread()

◆ GetProcessIdOfThread()

DWORD WINAPI GetProcessIdOfThread ( IN HANDLE  Thread)

Definition at line 950 of file thread.c.

951{
952 THREAD_BASIC_INFORMATION ThreadBasic;
954
957 &ThreadBasic,
959 NULL);
960 if (!NT_SUCCESS(Status))
961 {
963 return 0;
964 }
965
966 return HandleToUlong(ThreadBasic.ClientId.UniqueProcess);
967}
_In_opt_ PFILE_OBJECT _In_opt_ PETHREAD Thread
Definition: fltkernel.h:2653

◆ GetTeb()

PTEB GetTeb ( VOID  )

Definition at line 441 of file thread.c.

442{
443 return NtCurrentTeb();
444}

◆ GetThreadContext()

BOOL WINAPI GetThreadContext ( IN HANDLE  hThread,
OUT LPCONTEXT  lpContext 
)

Definition at line 504 of file thread.c.

506{
508
509 Status = NtGetContextThread(hThread, lpContext);
510 if (!NT_SUCCESS(Status))
511 {
513 return FALSE;
514 }
515
516 return TRUE;
517}
NTSTATUS NTAPI NtGetContextThread(IN HANDLE ThreadHandle, IN OUT PCONTEXT ThreadContext)
Definition: debug.c:350

Referenced by DECLARE_INTERFACE_(), fetch_thread_context_(), fetch_thread_info(), main(), START_TEST(), test_ExitProcess(), test_selectors(), test_thread_info(), TestThreadProc(), and ThreadData::Update().

◆ GetThreadGroupAffinity()

BOOL WINAPI GetThreadGroupAffinity ( IN HANDLE  hThread,
OUT PGROUP_AFFINITY  GroupAffinity 
)

Definition at line 705 of file thread.c.

707{
709 THREAD_BASIC_INFORMATION ThreadBasic;
710
711 STUB; // FIXME: Real group support
714 &ThreadBasic,
715 sizeof(ThreadBasic),
716 NULL);
717 if (!NT_SUCCESS(Status))
718 {
720 return FALSE;
721 }
722 ZeroMemory(GroupAffinity, sizeof(*GroupAffinity)); // For Reserved
723 GroupAffinity->Mask = ThreadBasic.AffinityMask;
725 return TRUE;
726}
#define THEONLYGROUP
Definition: thread.c:698
#define STUB
Definition: kernel32.h:27
#define ZeroMemory
Definition: minwinbase.h:31
$USHORT Group
Definition: ntbasedef.h:673
KAFFINITY Mask
Definition: ntbasedef.h:672
KAFFINITY AffinityMask
Definition: compat.h:930
_Out_ PGROUP_AFFINITY GroupAffinity
Definition: iofuncs.h:2506

Referenced by init_funcs(), and SetThreadGroupAffinity().

◆ GetThreadId()

DWORD WINAPI GetThreadId ( IN HANDLE  Thread)

Definition at line 974 of file thread.c.

975{
976 THREAD_BASIC_INFORMATION ThreadBasic;
978
981 &ThreadBasic,
983 NULL);
984 if (!NT_SUCCESS(Status))
985 {
987 return 0;
988 }
989
990 return HandleToUlong(ThreadBasic.ClientId.UniqueThread);
991}

Referenced by RpcCancelThreadEx(), RpcMgmtWaitServerListen(), and test_get_next_thread().

◆ GetThreadIOPendingFlag()

BOOL WINAPI GetThreadIOPendingFlag ( IN HANDLE  hThread,
OUT PBOOL  lpIOIsPending 
)

Definition at line 1108 of file thread.c.

1110{
1111 ULONG IoPending;
1113
1114 /* Query the flag */
1117 &IoPending,
1118 sizeof(IoPending),
1119 NULL);
1120 if (NT_SUCCESS(Status))
1121 {
1122 /* Return the flag */
1123 *lpIOIsPending = IoPending ? TRUE : FALSE;
1124 return TRUE;
1125 }
1126
1127 /* Fail */
1129 return FALSE;
1130}
@ ThreadIsIoPending
Definition: compat.h:951

◆ GetThreadPriority()

int WINAPI GetThreadPriority ( IN HANDLE  hThread)

Definition at line 800 of file thread.c.

801{
802 THREAD_BASIC_INFORMATION ThreadBasic;
804
805 /* Query the Base Priority Increment */
808 &ThreadBasic,
810 NULL);
811 if (!NT_SUCCESS(Status))
812 {
813 /* Failure */
816 }
817
818 /* Do some conversions for saturation values */
819 if (ThreadBasic.BasePriority == ((HIGH_PRIORITY + 1) / 2))
820 {
821 /* Win32 calls this "time critical" */
823 }
824 else if (ThreadBasic.BasePriority == -((HIGH_PRIORITY + 1) / 2))
825 {
826 /* Win32 calls this "idle" */
828 }
829
830 /* Return the final result */
831 return ThreadBasic.BasePriority;
832}
#define HIGH_PRIORITY
KPRIORITY BasePriority
Definition: compat.h:932
#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

Referenced by priorityTimeProc(), SlideWindow(), and test_thread_priority().

◆ GetThreadPriorityBoost()

BOOL WINAPI GetThreadPriorityBoost ( IN HANDLE  hThread,
OUT PBOOL  pDisablePriorityBoost 
)

Definition at line 839 of file thread.c.

841{
844
848 sizeof(ULONG),
849 NULL);
850 if (!NT_SUCCESS(Status))
851 {
853 return FALSE;
854 }
855
856 *pDisablePriorityBoost = PriorityBoost;
857 return TRUE;
858}
@ ThreadPriorityBoost
Definition: compat.h:949
_In_ WDFREQUEST _In_ NTSTATUS _In_ CCHAR PriorityBoost
Definition: wdfrequest.h:1016

Referenced by init_funcs().

◆ GetThreadSelectorEntry()

BOOL WINAPI GetThreadSelectorEntry ( IN HANDLE  hThread,
IN DWORD  dwSelector,
OUT LPLDT_ENTRY  lpSelectorEntry 
)

Definition at line 891 of file thread.c.

894{
895#ifdef _M_IX86
896 DESCRIPTOR_TABLE_ENTRY DescriptionTableEntry;
898
899 /* Set the selector and do the query */
900 DescriptionTableEntry.Selector = dwSelector;
903 &DescriptionTableEntry,
904 sizeof(DESCRIPTOR_TABLE_ENTRY),
905 NULL);
906 if (!NT_SUCCESS(Status))
907 {
908 /* Fail */
910 return FALSE;
911 }
912
913 /* Success, return the selector */
914 *lpSelectorEntry = DescriptionTableEntry.Descriptor;
915 return TRUE;
916#else
917 DPRINT1("Calling GetThreadSelectorEntry!\n");
918 return FALSE;
919#endif
920}
@ ThreadDescriptorTableEntry
Definition: compat.h:941

Referenced by addr_to_linear(), and i386_stack_walk().

◆ GetThreadTimes()

BOOL NTAPI GetThreadTimes ( IN HANDLE  hThread,
OUT LPFILETIME  lpCreationTime,
OUT LPFILETIME  lpExitTime,
OUT LPFILETIME  lpKernelTime,
OUT LPFILETIME  lpUserTime 
)

Definition at line 472 of file thread.c.

477{
478 KERNEL_USER_TIMES KernelUserTimes;
480
483 &KernelUserTimes,
484 sizeof(KERNEL_USER_TIMES),
485 NULL);
486 if (!NT_SUCCESS(Status))
487 {
489 return FALSE;
490 }
491
492 *lpCreationTime = *(LPFILETIME)&KernelUserTimes.CreateTime;
493 *lpExitTime = *(LPFILETIME)&KernelUserTimes.ExitTime;
494 *lpKernelTime = *(LPFILETIME)&KernelUserTimes.KernelTime;
495 *lpUserTime = *(LPFILETIME)&KernelUserTimes.UserTime;
496 return TRUE;
497}
@ ThreadTimes
Definition: compat.h:936
struct _FILETIME * LPFILETIME
Definition: time.c:29
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

Referenced by test_GetThreadTimes().

◆ OpenThread()

HANDLE WINAPI OpenThread ( IN DWORD  dwDesiredAccess,
IN BOOL  bInheritHandle,
IN DWORD  dwThreadId 
)

Definition at line 406 of file thread.c.

409{
411 HANDLE ThreadHandle;
414
417
419 NULL,
421 NULL,
422 NULL);
423
424 Status = NtOpenThread(&ThreadHandle,
425 dwDesiredAccess,
427 &ClientId);
428 if (!NT_SUCCESS(Status))
429 {
431 return NULL;
432 }
433
434 return ThreadHandle;
435}
#define ULongToHandle(h)
Definition: basetsd.h:75
DWORD dwThreadId
Definition: fdebug.c:31
#define InitializeObjectAttributes(p, n, a, r, s)
Definition: reg.c:115
static BOOL bInheritHandle
Definition: pipe.c:110
NTSTATUS NTAPI NtOpenThread(OUT PHANDLE ThreadHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, IN PCLIENT_ID ClientId OPTIONAL)
Definition: thread.c:1037
#define OBJ_INHERIT
Definition: winternl.h:225

Referenced by fetch_thread_context_(), fetch_thread_info(), GetThreadFromCurrentProcess(), init_funcs(), test_debugger(), test_process_security_child(), test_RtlRegisterWait(), test_thread_description(), and test_Toolhelp().

◆ QueueUserAPC()

DWORD WINAPI QueueUserAPC ( IN PAPCFUNC  pfnAPC,
IN HANDLE  hThread,
IN ULONG_PTR  dwData 
)

Definition at line 1020 of file thread.c.

1023{
1025 ACTIVATION_CONTEXT_BASIC_INFORMATION ActCtxInfo;
1026
1027 /* Zero the activation context and query information on it */
1028 RtlZeroMemory(&ActCtxInfo, sizeof(ActCtxInfo));
1030 NULL,
1031 0,
1032 ActivationContextBasicInformation,
1033 &ActCtxInfo,
1034 sizeof(ActCtxInfo),
1035 NULL);
1036 if (!NT_SUCCESS(Status))
1037 {
1038 /* Fail due to SxS */
1039 DbgPrint("SXS: %s failing because RtlQueryInformationActivationContext()"
1040 "returned status %08lx\n", __FUNCTION__, Status);
1042 return FALSE;
1043 }
1044
1045 /* Queue the APC */
1048 pfnAPC,
1049 (PVOID)dwData,
1050 (ActCtxInfo.dwFlags & 1) ?
1051 INVALID_ACTIVATION_CONTEXT : ActCtxInfo.hActCtx);
1052 if (!NT_SUCCESS(Status))
1053 {
1055 return FALSE;
1056 }
1057
1058 /* All good */
1059 return TRUE;
1060}
VOID NTAPI BaseDispatchApc(IN PAPCFUNC ApcRoutine, IN PVOID Data, IN PACTIVATION_CONTEXT ActivationContext)
Definition: thread.c:94
#define DbgPrint
Definition: hal.h:12
VOID(NTAPI * PKNORMAL_ROUTINE)(IN PVOID NormalContext OPTIONAL, IN PVOID SystemArgument1 OPTIONAL, IN PVOID SystemArgument2 OPTIONAL)
Definition: ketypes.h:888
static HANDLE ULONG_PTR dwData
Definition: pipe.c:111
NTSTATUS NTAPI NtQueueApcThread(IN HANDLE ThreadHandle, IN PKNORMAL_ROUTINE ApcRoutine, IN PVOID NormalContext, IN PVOID SystemArgument1, IN PVOID SystemArgument2)
Definition: state.c:600

Referenced by async_notifier_proc(), JustDoIt(), process_work_items(), CDirectoryWatcher::RequestAddWatcher(), CDirectoryWatcher::RequestAllWatchersTermination(), CDirectoryWatcher::RequestTermination(), serverThreadMain2(), SEALED_::TerminateProtocolThread(), test_alertable_wait(), test_CoWaitForMultipleHandles(), test_CreatePipe(), test_GetOverlappedResultEx(), test_MsgWaitForMultipleObjects(), test_post_completion(), test_QueueUserAPC(), test_read_write(), test_RtlRegisterWait(), test_set_io_completion(), TestMultipleUserAPCs(), WahCloseHandleHelper(), and WahQueueUserApc().

◆ QueueUserWorkItem()

BOOL WINAPI QueueUserWorkItem ( IN LPTHREAD_START_ROUTINE  Function,
IN PVOID  Context,
IN ULONG  Flags 
)

Definition at line 1137 of file thread.c.

1140{
1142
1143 /* NOTE: Rtl needs to safely call the function using a trampoline */
1145 if (!NT_SUCCESS(Status))
1146 {
1147 /* Failed */
1149 return FALSE;
1150 }
1151
1152 /* All good */
1153 return TRUE;
1154}
_In_ CDROM_SCAN_FOR_SPECIAL_INFO _In_ PCDROM_SCAN_FOR_SPECIAL_HANDLER Function
Definition: cdrom.h:1156
_In_ D3DDDI_VIDEO_PRESENT_TARGET_ID _In_ ULONG _In_ ULONG Flags
Definition: dispmprt.h:245
NTSYSAPI NTSTATUS NTAPI RtlQueueWorkItem(_In_ WORKERCALLBACKFUNC Function, _In_opt_ PVOID Context, _In_ ULONG Flags)
VOID(NTAPI * WORKERCALLBACKFUNC)(_In_ PVOID Context)
Definition: rtltypes.h:518

Referenced by ClientRpcChannelBuffer_SendReceive(), handle_full_cache(), I_RpcSend(), init_funcs(), INTERNET_AsyncCall(), queue_async(), RPCRT4_io_thread(), and SHQueueUserWorkItem().

◆ ResumeThread()

◆ SetThreadAffinityMask()

DWORD_PTR WINAPI SetThreadAffinityMask ( IN HANDLE  hThread,
IN DWORD_PTR  dwThreadAffinityMask 
)

Definition at line 665 of file thread.c.

667{
668 THREAD_BASIC_INFORMATION ThreadBasic;
669 KAFFINITY AffinityMask;
671
672 AffinityMask = (KAFFINITY)dwThreadAffinityMask;
673
676 &ThreadBasic,
678 NULL);
679 if (!NT_SUCCESS(Status))
680 {
682 return 0;
683 }
684
687 &AffinityMask,
688 sizeof(KAFFINITY));
689 if (!NT_SUCCESS(Status))
690 {
692 ThreadBasic.AffinityMask = 0;
693 }
694
695 return ThreadBasic.AffinityMask;
696}
ULONG_PTR KAFFINITY
Definition: compat.h:85
@ ThreadAffinityMask
Definition: compat.h:939
NTSTATUS NTAPI NtSetInformationThread(_In_ HANDLE ThreadHandle, _In_ THREADINFOCLASS ThreadInformationClass, _In_reads_bytes_(ThreadInformationLength) PVOID ThreadInformation, _In_ ULONG ThreadInformationLength)
Definition: query.c:2301

Referenced by AdjustAffinity(), SetThreadGroupAffinity(), Test_SyscallPerformance(), test_thread_processor(), and wmain().

◆ SetThreadContext()

BOOL WINAPI SetThreadContext ( IN HANDLE  hThread,
IN CONST CONTEXT *  lpContext 
)

Definition at line 524 of file thread.c.

526{
528
530 if (!NT_SUCCESS(Status))
531 {
533 return FALSE;
534 }
535
536 return TRUE;
537}
NTSTATUS NTAPI NtSetContextThread(IN HANDLE ThreadHandle, IN PCONTEXT ThreadContext)
Definition: debug.c:387

Referenced by DECLARE_INTERFACE_(), set_thread_context_(), and test_ExitProcess().

◆ SetThreadGroupAffinity()

BOOL WINAPI SetThreadGroupAffinity ( IN HANDLE  hThread,
IN const GROUP_AFFINITY *  GroupAffinity,
OUT OPTIONAL PGROUP_AFFINITY  PreviousGroupAffinity 
)

Definition at line 733 of file thread.c.

736{
737 DWORD_PTR OldMask;
738
739 STUB; // FIXME: Real group support
741 {
743 return FALSE;
744 }
745
747 if (OldMask && PreviousGroupAffinity)
748 {
749 ZeroMemory(PreviousGroupAffinity, sizeof(*PreviousGroupAffinity)); // For Reserved
750 PreviousGroupAffinity->Mask = OldMask;
751 PreviousGroupAffinity->Group = THEONLYGROUP;
752 }
753 return OldMask != 0;
754}
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
#define SetLastError(x)
Definition: compat.h:752
DWORD_PTR WINAPI SetThreadAffinityMask(IN HANDLE hThread, IN DWORD_PTR dwThreadAffinityMask)
Definition: thread.c:665
uint32_t DWORD_PTR
Definition: typedefs.h:65

Referenced by init_funcs().

◆ SetThreadIdealProcessor()

DWORD WINAPI SetThreadIdealProcessor ( IN HANDLE  hThread,
IN DWORD  dwIdealProcessor 
)

Definition at line 927 of file thread.c.

929{
931
934 &dwIdealProcessor,
935 sizeof(ULONG));
936 if (!NT_SUCCESS(Status))
937 {
939 return -1;
940 }
941
942 return (DWORD)Status;
943}
@ ThreadIdealProcessor
Definition: compat.h:948
unsigned long DWORD
Definition: ntddk_ex.h:95

Referenced by test_thread_processor().

◆ SetThreadPriority()

BOOL WINAPI SetThreadPriority ( IN HANDLE  hThread,
IN int  nPriority 
)

Definition at line 761 of file thread.c.

763{
764 LONG Prio = nPriority;
766
767 /* Check if values forcing saturation should be used */
769 {
770 /* This is 16 */
771 Prio = (HIGH_PRIORITY + 1) / 2;
772 }
773 else if (Prio == THREAD_PRIORITY_IDLE)
774 {
775 /* This is -16 */
776 Prio = -((HIGH_PRIORITY + 1) / 2);
777 }
778
779 /* Set the Base Priority */
782 &Prio,
783 sizeof(LONG));
784 if (!NT_SUCCESS(Status))
785 {
786 /* Failure */
788 return FALSE;
789 }
790
791 /* Return */
792 return TRUE;
793}
@ ThreadBasePriority
Definition: compat.h:938
long LONG
Definition: pedump.c:60

Referenced by ConsoleControlDispatcher(), ensurePlayerThread(), ImageView_Main(), main(), MCI_SendCommandAsync(), MCIAVI_mciPlay_async(), midiStreamOpen(), mmTaskCreate(), Telnet::Open(), OutputQueue_Construct(), proc_PlaySoundAsync(), CFindFolder::SearchThreadProc(), SlideWindow(), SockAsyncThread(), test_ExitProcess(), test_thread_priority(), TIME_MMTimeStart(), WaveThread(), WriterThread::WriterThread(), and wWinMain().

◆ SetThreadPriorityBoost()

BOOL NTAPI SetThreadPriorityBoost ( IN HANDLE  hThread,
IN BOOL  bDisablePriorityBoost 
)

Definition at line 865 of file thread.c.

867{
870
871 PriorityBoost = bDisablePriorityBoost != FALSE;
872
876 sizeof(ULONG));
877 if (!NT_SUCCESS(Status))
878 {
880 return FALSE;
881 }
882
883 return TRUE;
884}

Referenced by init_funcs().

◆ SetThreadStackGuarantee()

BOOL WINAPI SetThreadStackGuarantee ( IN OUT PULONG  StackSizeInBytes)

Definition at line 1067 of file thread.c.

1068{
1069 PTEB Teb = NtCurrentTeb();
1070 ULONG GuaranteedStackBytes;
1072
1073 if (!StackSizeInBytes)
1074 {
1076 return FALSE;
1077 }
1078
1079 AllocationSize = *StackSizeInBytes;
1080
1081 /* Retrieve the current stack size */
1082 GuaranteedStackBytes = Teb->GuaranteedStackBytes;
1083
1084 /* Return the size of the previous stack */
1085 *StackSizeInBytes = GuaranteedStackBytes;
1086
1087 /*
1088 * If the new stack size is either zero or is less than the current size,
1089 * the previous stack size is returned and we return success.
1090 */
1091 if ((AllocationSize == 0) || (AllocationSize < GuaranteedStackBytes))
1092 {
1093 return TRUE;
1094 }
1095
1096 // FIXME: Unimplemented!
1098
1099 // Temporary HACK for supporting applications!
1100 return TRUE; // FALSE;
1101}
_In_ ULONG AllocationSize
Definition: dispmprt.h:712
ULONG GuaranteedStackBytes
Definition: winternl.h:668
#define UNIMPLEMENTED_ONCE
Definition: typedefs.h:30

Referenced by init_funcs().

◆ SetThreadUILanguage()

LANGID WINAPI SetThreadUILanguage ( IN LANGID  LangId)

Definition at line 998 of file thread.c.

999{
1000#if (NTDDI_VERSION < NTDDI_LONGHORN)
1001 /* We only support LangId == 0, for selecting a language
1002 * identifier that best supports the NT Console. */
1003 if (LangId != 0)
1004 {
1006 return 0;
1007 }
1008#endif
1009
1011
1012 return LANGIDFROMLCID(NtCurrentTeb()->CurrentLocale);
1013}
#define UNIMPLEMENTED
Definition: ntoskrnl.c:15
#define STATUS_NOT_SUPPORTED
Definition: d3dkmdt.h:48
#define LANGIDFROMLCID(l)
Definition: nls.h:18

Referenced by SetLocale().

◆ SuspendThread()

DWORD WINAPI SuspendThread ( IN HANDLE  hThread)

Definition at line 645 of file thread.c.

646{
647 ULONG PreviousSuspendCount;
649
650 Status = NtSuspendThread(hThread, &PreviousSuspendCount);
651 if (!NT_SUCCESS(Status))
652 {
654 return -1;
655 }
656
657 return PreviousSuspendCount;
658}
NTSTATUS NTAPI NtSuspendThread(IN HANDLE ThreadHandle, OUT PULONG PreviousSuspendCount OPTIONAL)
Definition: state.c:352

Referenced by _check_thread_suspend_count(), fetch_thread_info(), main(), midiStreamPause(), MMSYSTEM_MidiStream_Player(), test_apc_deadlock(), test_CreateRemoteThread(), test_CreateThread_suspended(), test_debugger(), test_query_process_debug_flags(), test_SuspendThread(), and threadFunc3().

◆ SwitchToThread()

BOOL WINAPI SwitchToThread ( VOID  )

Definition at line 451 of file thread.c.

452{
454}
#define STATUS_NO_YIELD_PERFORMED
Definition: ntstatus.h:225
NTSYSAPI NTSTATUS WINAPI NtYieldExecution(void)
Definition: thrdschd.c:887

◆ TerminateThread()

BOOL WINAPI TerminateThread ( IN HANDLE  hThread,
IN DWORD  dwExitCode 
)

Definition at line 590 of file thread.c.

592{
594#if DBG
595 PRTL_CRITICAL_SECTION LoaderLock;
597#endif /* DBG */
598
599 /* Check for invalid thread handle */
600 if (!hThread)
601 {
602 /* Fail if one was passed */
604 return FALSE;
605 }
606
607#if DBG
608 /* Get the loader lock */
609 LoaderLock = NtCurrentPeb()->LoaderLock;
610 if (LoaderLock)
611 {
612 /* Get our TID */
615 &ThreadInfo,
616 sizeof(ThreadInfo),
617 NULL);
618 if (NT_SUCCESS(Status))
619 {
620 /* If terminating the current thread, we must not hold the loader lock */
621 if (NtCurrentTeb()->ClientId.UniqueThread == ThreadInfo.ClientId.UniqueThread)
623 }
624 }
625#endif /* DBG */
626
627 /* Now terminate the thread */
628 Status = NtTerminateThread(hThread, dwExitCode);
629 if (!NT_SUCCESS(Status))
630 {
631 /* Fail */
633 return FALSE;
634 }
635
636 /* All done */
637 return TRUE;
638}
#define ERROR_INVALID_HANDLE
Definition: compat.h:98
struct _ThreadInfo ThreadInfo

Referenced by do_test(), DP_DestroyDirectPlay2(), main(), nfs41_session_free(), NotifyTopLevelWindow(), NotifyUserProcessForShutdown(), RunTest(), BtrfsSend::SendDlgProc(), start_fiber(), test_bsc_marshaling(), test_CreateThread_basic(), test_CreateThread_suspended(), test_ExitProcess(), test_kill_on_exit(), test_QueueUserAPC(), test_runner(), Test_SimpleParameters(), test_SuspendThread(), test_TerminateProcess(), test_TerminateThread(), test_thread_security(), ThreadShutdownNotify(), WndProc(), and CHardErrorThread::~CHardErrorThread().

◆ TlsAlloc()

DWORD WINAPI TlsAlloc ( VOID  )

Definition at line 1161 of file thread.c.

1162{
1163 ULONG Index;
1164 PTEB Teb;
1165 PPEB Peb;
1166
1167 /* Get the PEB and TEB, lock the PEB */
1168 Teb = NtCurrentTeb();
1171
1172 /* Try to get regular TEB slot */
1174 if (Index != 0xFFFFFFFF)
1175 {
1176 /* Clear the value. */
1177 Teb->TlsSlots[Index] = 0;
1179 return Index;
1180 }
1181
1182 /* If it fails, try to find expansion TEB slot. */
1184 if (Index != 0xFFFFFFFF)
1185 {
1186 /* Is there no expansion slot yet? */
1187 if (!Teb->TlsExpansionSlots)
1188 {
1189 /* Allocate an array */
1190 Teb->TlsExpansionSlots = RtlAllocateHeap(RtlGetProcessHeap(),
1193 sizeof(PVOID));
1194 }
1195
1196 /* Did we get an array? */
1197 if (!Teb->TlsExpansionSlots)
1198 {
1199 /* Fail */
1201 Index = 0xFFFFFFFF;
1203 }
1204 else
1205 {
1206 /* Clear the value. */
1207 Teb->TlsExpansionSlots[Index] = 0;
1209 }
1210 }
1211 else
1212 {
1213 /* Fail */
1215 }
1216
1217 /* Release the lock and return */
1219 return Index;
1220}
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
Definition: heap.c:616
#define STATUS_NO_MEMORY
Definition: d3dkmdt.h:51
#define RtlClearBits
Definition: dbgbitmap.h:331
#define RtlFindClearBitsAndSet
Definition: dbgbitmap.h:333
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
PPEB Peb
Definition: dllmain.c:27
#define TLS_EXPANSION_SLOTS
Definition: pstypes.h:336
#define TLS_MINIMUM_AVAILABLE
Definition: ntddk_ex.h:236
PVOID TlsBitmap
Definition: ntddk_ex.h:259
PRTL_BITMAP TlsExpansionBitmap
Definition: winternl.h:538
PVOID * TlsExpansionSlots
Definition: compat.h:894
PVOID TlsSlots[64]
Definition: compat.h:879
PPEB ProcessEnvironmentBlock
Definition: ntddk_ex.h:337
_In_ WDFCOLLECTION _In_ ULONG Index
NTSYSAPI void WINAPI RtlReleasePebLock(void)
Definition: libsupp.c:95
NTSYSAPI void WINAPI RtlAcquirePebLock(void)
Definition: libsupp.c:85

◆ TlsFree()

BOOL WINAPI TlsFree ( IN DWORD  Index)

Definition at line 1227 of file thread.c.

1228{
1229 BOOL BitSet;
1230 PPEB Peb;
1232 PVOID TlsBitmap;
1234
1235 /* Acquire the PEB lock and grab the PEB */
1236 Peb = NtCurrentPeb();
1238
1239 /* Check if the index is too high */
1241 {
1242 /* Check if it can fit in the expansion slots */
1245 {
1246 /* It's invalid */
1249 return FALSE;
1250 }
1251 else
1252 {
1253 /* Use the expansion bitmap */
1254 TlsBitmap = Peb->TlsExpansionBitmap;
1255 Index = TlsIndex;
1256 }
1257 }
1258 else
1259 {
1260 /* Use the normal bitmap */
1261 TlsBitmap = Peb->TlsBitmap;
1262 }
1263
1264 /* Check if the index was set */
1265 BitSet = RtlAreBitsSet(TlsBitmap, Index, 1);
1266 if (BitSet)
1267 {
1268 /* Tell the kernel to free the TLS cells */
1271 &Index,
1272 sizeof(DWORD));
1273 if (!NT_SUCCESS(Status))
1274 {
1277 return FALSE;
1278 }
1279
1280 /* Clear the bit */
1281 RtlClearBits(TlsBitmap, Index, 1);
1282 }
1283 else
1284 {
1285 /* Fail */
1288 return FALSE;
1289 }
1290
1291 /* Done! */
1293 return TRUE;
1294}
#define RtlAreBitsSet
Definition: dbgbitmap.h:328
@ ThreadZeroTlsCell
Definition: compat.h:945
unsigned int BOOL
Definition: ntddk_ex.h:94
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
#define TlsIndex
Definition: ws2_32p.h:277

Referenced by __acrt_FlsFree(), Cleanup(), ClientThreadSetupHelper(), DllMain(), Exit(), free_tls_list(), get_thread_data(), get_tls_data(), I_CryptFreeTls(), msvcrt_free_tls(), process_detach(), ProcessDetach(), spy_init(), test_CreateThread_basic(), test_reserved_tls(), test_TLS(), TLS::Uninitialize(), UXTHEME_UnInitSystem(), wined3d_dll_destroy(), wined3d_dll_init(), and xmlCleanupGlobalsInternal().

◆ TlsGetValue()

LPVOID WINAPI TlsGetValue ( IN DWORD  Index)

Definition at line 1301 of file thread.c.

1302{
1303 PTEB Teb;
1304
1305 /* Get the TEB and clear the last error */
1306 Teb = NtCurrentTeb();
1307 Teb->LastErrorValue = 0;
1308
1309 /* Check for simple TLS index */
1311 {
1312 /* Return it */
1313 return Teb->TlsSlots[Index];
1314 }
1315
1316 /* Check for valid index */
1318 {
1319 /* Fail */
1321 return NULL;
1322 }
1323
1324 /* The expansion slots are allocated on demand, so check for it. */
1325 Teb->LastErrorValue = 0;
1326 if (!Teb->TlsExpansionSlots) return NULL;
1327
1328 /* Return the value from the expansion slots */
1330}
ULONG LastErrorValue
Definition: compat.h:843

Referenced by __acrt_FlsGetValue(), __mingwthr_run_key_dtors(), _endthread(), _endthreadex(), add_active_textservice(), client_stop(), CommDlgExtendedError(), CThreadMgr::CreateInstance(), detach_thread(), DllMain(), event_client(), get_indent_level(), get_thread_data(), get_tls_data(), CMenuFocusManager::GetManager(), I_CryptDetachTls(), I_CryptGetTls(), Imm32AllocateTLS(), Imm32GetTLS(), INTERNET_GetLastError(), INTERNET_GetResponseBuffer(), INTERNET_SetLastError(), INTERNET_WorkerThreadFunc(), InternetGetLastResponseInfoA(), InternetGetLastResponseInfoW(), mono_print_handler_fn(), msvcrt_free_tls_mem(), msvcrt_get_thread_data(), oob_client(), oob_server(), TLS::PeekTLS(), select_server(), server_stop(), SHGetThreadRef(), simple_client(), simple_mixed_client(), simple_server(), test_errno(), test_reserved_tls(), test_TLS(), TF_GetThreadMgr(), CThreadMgr::ThreadFocusHookProc(), threadFunc1(), UXTHEME_GetParseErrorInfo(), VirtualChannelInit(), wined3d_context_gl_get_current(), WsSockInitialize(), WsThreadBlockingCallback(), WsThreadDestroyCurrentThread(), WsThreadGetCurrentThread(), and WsThreadGetThreadId().

◆ TlsSetValue()

BOOL WINAPI TlsSetValue ( IN DWORD  Index,
IN LPVOID  Value 
)

Definition at line 1337 of file thread.c.

1339{
1341 PTEB Teb = NtCurrentTeb();
1342
1343 /* Check for simple TLS index */
1345 {
1346 /* Return it */
1347 Teb->TlsSlots[Index] = Value;
1348 return TRUE;
1349 }
1350
1351 /* Check if this is an expansion slot */
1354 {
1355 /* Fail */
1357 return FALSE;
1358 }
1359
1360 /* Do we not have expansion slots? */
1361 if (!Teb->TlsExpansionSlots)
1362 {
1363 /* Get the PEB lock to see if we still need them */
1365 if (!Teb->TlsExpansionSlots)
1366 {
1367 /* Allocate them */
1368 Teb->TlsExpansionSlots = RtlAllocateHeap(RtlGetProcessHeap(),
1371 sizeof(PVOID));
1372 if (!Teb->TlsExpansionSlots)
1373 {
1374 /* Fail */
1377 return FALSE;
1378 }
1379 }
1380
1381 /* Release the lock */
1383 }
1384
1385 /* Write the value */
1387
1388 /* Success */
1389 return TRUE;
1390}
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
Definition: wdfregistry.h:413

Referenced by __acrt_FlsSetValue(), CMenuFocusManager::AcquireManager(), client_start(), COMDLG32_SetCommDlgExtendedError(), CThreadMgr::CreateInstance(), DllMain(), get_thread_data(), get_tls_data(), I_CryptDetachTls(), I_CryptSetTls(), Imm32AllocateTLS(), TLS::InternalAllocateTLS(), TLS::InternalDestroyTLS(), INTERNET_AllocThreadError(), INTERNET_WorkerThreadFunc(), mono_print_handler_fn(), msvcrt_get_thread_data(), release_thread_data(), CMenuFocusManager::ReleaseManager(), server_start(), set_indent_level(), SHSetThreadRef(), test_reserved_tls(), test_TLS(), threadFunc1(), UXTHEME_DeleteParseErrorInfo(), UXTHEME_GetParseErrorInfo(), wined3d_context_gl_destroy(), wined3d_context_gl_set_current(), WsThreadCreate(), WsThreadDelete(), WsThreadDestroyCurrentThread(), and CThreadMgr::~CThreadMgr().