ReactOS 0.4.15-dev-7788-g1ad9096
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
 

Typedefs

typedef NTSTATUS(NTAPIPCSR_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 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.

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 92 of file thread.c.

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 */
126 RtlReleaseActivationContext(ActivationContext);
127}
#define _SEH2_END
Definition: filesup.c:22
#define _SEH2_TRY
Definition: filesup.c:19
#define EXCEPTION_EXECUTE_HANDLER
Definition: excpt.h:85
NTSYSAPI void WINAPI RtlReleaseActivationContext(HANDLE)
Definition: actctx.c:5344
_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:101
#define _SEH2_EXCEPT(...)
Definition: pseh2_64.h:34
PRTL_ACTIVATION_CONTEXT_STACK_FRAME FASTCALL RtlActivateActivationContextUnsafeFast(IN PRTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_EXTENDED Frame, IN PVOID Context)
Definition: actctx.c:5934
PRTL_ACTIVATION_CONTEXT_STACK_FRAME FASTCALL RtlDeactivateActivationContextUnsafeFast(IN PRTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_EXTENDED Frame)
Definition: actctx.c:6011
uint32_t ULONG_PTR
Definition: typedefs.h:65

Referenced by QueueUserAPC().

◆ BasepNotifyCsrOfThread()

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

Definition at line 25 of file thread.c.

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}
#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:32
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:71
BASE_CREATE_THREAD CreateThreadRequest
Definition: basemsg.h:284
union _BASE_API_MESSAGE::@3533 Data
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 56 of file thread.c.

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}
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:1487
VOID WINAPI ExitThread(IN DWORD uExitCode)
Definition: thread.c:365
#define NtCurrentTeb
#define _SEH2_GetExceptionCode()
Definition: pseh2_64.h:159
#define _SEH2_GetExceptionInformation()
Definition: pseh2_64.h:158
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 159 of file thread.c.

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}
LONG NTSTATUS
Definition: precomp.h:26
#define HandleToUlong(h)
Definition: basetsd.h:79
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:25
NTSTATUS WINAPI BaseCreateStack(_In_ HANDLE hProcess, _In_opt_ SIZE_T StackCommit, _In_opt_ SIZE_T StackReserve, _Out_ PINITIAL_TEB InitialTeb)
Definition: utils.c:354
VOID WINAPI BaseInitializeContext(IN PCONTEXT Context, IN PVOID Parameter, IN PVOID StartAddress, IN PVOID StackAddress, IN ULONG ContextType)
Definition: utils.c:513
POBJECT_ATTRIBUTES WINAPI BaseFormatObjectAttributes(OUT POBJECT_ATTRIBUTES ObjectAttributes, IN PSECURITY_ATTRIBUTES SecurityAttributes OPTIONAL, IN PUNICODE_STRING ObjectName)
Definition: utils.c:304
VOID WINAPI BaseFreeThreadStack(_In_ HANDLE hProcess, _In_ PINITIAL_TEB InitialTeb)
Definition: utils.c:495
#define __FUNCTION__
Definition: types.h:116
IN CINT OUT PVOID IN ULONG OUT PULONG ReturnLength
Definition: dumpinfo.c:43
Status
Definition: gdiplustypes.h:25
NTSYSAPI NTSTATUS WINAPI RtlQueryInformationActivationContext(ULONG, HANDLE, PVOID, ULONG, PVOID, SIZE_T, SIZE_T *)
Definition: actctx.c:5515
_In_ BOOL _In_ HANDLE hProcess
Definition: mapping.h:71
#define RTL_ACTIVATE_ACTIVATION_CONTEXT_EX_FLAG_RELEASE_ON_STACK_DEALLOCATION
Definition: rtltypes.h:106
#define RTL_QUERY_ACTIVATION_CONTEXT_FLAG_USE_ACTIVE_ACTIVATION_CONTEXT
Definition: rtltypes.h:116
HANDLE hThread
Definition: wizard.c:28
#define THREAD_ALL_ACCESS
Definition: nt_native.h:1339
NTSTATUS NtTerminateThread(IN HANDLE ThreadHandle OPTIONAL, IN NTSTATUS ExitStatus)
Definition: kill.c:1279
#define NtCurrentProcess()
Definition: nt_native.h:1657
NTSTATUS NTAPI NtClose(IN HANDLE Handle)
Definition: obhandle.c:3402
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 PVOID ThreadInformation, IN ULONG ThreadInformationLength, OUT PULONG ReturnLength OPTIONAL)
Definition: query.c:2624
NTSTATUS NTAPI NtResumeThread(IN HANDLE ThreadHandle, OUT PULONG SuspendCount OPTIONAL)
Definition: state.c:290
DWORD BaseSetLastNTError(IN NTSTATUS Status)
Definition: reactos.cpp:166
NTSTATUS NTAPI RtlActivateActivationContextEx(ULONG flags, PTEB tebAddress, HANDLE handle, PULONG_PTR cookie)
Definition: actctx.c:5368
NTSTATUS NTAPI RtlAllocateActivationContextStack(IN PACTIVATION_CONTEXT_STACK *Stack)
Definition: actctx.c:5906
VOID NTAPI RtlFreeActivationContextStack(IN PACTIVATION_CONTEXT_STACK Stack)
Definition: actctx.c:5440
HANDLE UniqueProcess
Definition: compat.h:825
PVOID StackBase
Definition: pstypes.h:694
Definition: compat.h:836
PVOID ActivationContextStackPointer
Definition: compat.h:854
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:577
#define CREATE_SUSPENDED
Definition: winbase.h:178
_In_opt_ PVOID _Out_ PLARGE_INTEGER Cookie
Definition: cmfuncs.h:14

Referenced by _DoDLLInjection(), BaseCreateThreadPoolThread(), ConSrvConsoleCtrlEventTimeout(), CreateThread(), dll_entry_point(), GuiConsoleShowConsoleProperties(), test_CreateRemoteThread(), 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 137 of file thread.c.

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}
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

Referenced by _beginthread(), _beginthreadex(), _ServiceMain(), _test_flush_async(), _tWinMain(), AcceptConnections(), ANIMATE_Play(), apartment_hostobject_in_hostapt(), ApplicationPageWndProc(), AVISplitter_first_request(), cache_connection(), check_hook_thread(), check_thread_instance(), child_process(), clipboard_wnd_proc(), CommonInstall(), create_child_thread(), CreateClientProcess(), CreateLobbyMessageReceptionThread(), CreateRenderingSubsystem(), CreateRenderingWindow(), CreateServers(), CreateServiceThread(), CreateSidCacheMgr(), CreateSoundThread(), CSysTray::CreateSysTrayThread(), CreateTestThread(), CtfImmSetLangBand(), CThread::CThread(), custom_action_server(), DbgkCreateThread(), DbgkpPostFakeThreadMessages(), DbgUiConvertStateChangeStructure(), DECLARE_INTERFACE_(), DIALOG_Printing_DialogProc(), CTrayWindow::DisplayProperties(), CTrayWindow::DisplayRunFileDlg(), dll_entry_point(), do_msidbCustomActionTypeDll(), do_msidbCustomActionTypeScript(), do_wait_idle_child(), DosStartProcess32(), EmulatorInitialize(), ensurePlayerThread(), ExitWindowsWorker(), GUIDisplayStatusMessage(), HandleLogoff(), HandleShutdown(), http_release_netconn(), IDirectPlay4Impl_EnumSessions(), IDirectSoundCaptureBufferImpl_Start(), SEALED_::IMsTscAx::Connect(), init(), InitDialog(), CDesktopThread::Initialize(), BtrfsPropSheet::Initialize(), COutputPin::InitializeIOThread(), InitializeScreenSaver(), InitiateSoundStreaming(), InstallDrvDlgProc(), installer_proc(), InstallReactOS(), CZipFolder::InvokeCommand(), JustDoIt(), KmtRunKernelTest(), LocalScheduleJob(), LS_ThreadProc(), LsapRmInitializeServer(), MailSlotReader(), main(), MainDialogProc(), MCI_SendCommandAsync(), MCIAVI_mciPlay_async(), MCICDA_Play(), MCIQTZ_mciPlay(), midiStreamOpen(), MMDevEnum_RegisterEndpointNotificationCallback(), mmTaskCreate(), StringTest::mt(), Netbios(), NotifyTopLevelWindow(), Window::OnCommand(), OnInitDialog(), OnUpdate(), CZipExtract::CExtractSettingsPage::OnWizardNext(), Telnet::Open(), audio_wavein::open(), audio_waveout::open(), OpenDevice(), OSK_Create(), OutputQueue_Construct(), CKsClockForwarder::Pause(), PdhCollectQueryDataEx(), PerformancePageWndProc(), PipeInit(), PlayLogonSound(), proc_PlaySoundAsync(), ProcessDlgProc(), ProcessPageWndProc(), Protocol_Start(), protocol_start(), PullPin_InitProcessing(), queue_task(), BtrfsRecv::RecvProgressDlgProc(), ReferenceClock_AdvisePeriodic(), ReferenceClock_AdviseTime(), RegisterGPNotification(), report(), RPC_StartLocalServer(), RpcReadFile(), rpcrt4_ncacn_http_open(), RPCRT4_new_client(), RPCRT4_start_listen_protseq(), run_LS_tests(), run_thread(), RunItemCompletionThread(), RunSelectedTest(), RunSetup(), RunShell(), ScStartService(), SearchDrvDlgProc(), ServiceInit(), ServiceMain(), BtrfsPropSheet::set_cmdline(), SHCreateThread(), SHOpenFolderWindow(), SockCreateOrReferenceAsyncThread(), start_dummy_thread(), start_host_object2(), start_installation(), START_TEST(), StartAdapterDiscovery(), StartAuthenticationPort(), StartClients(), StartNotificationThread(), StartPortThread(), CProgressDialog::StartProgressDialog(), BtrfsSend::StartSend(), StartServer(), StartServiceThread(), StartStopEnumEventsThread(), StartSystemShutdown(), StartTestCORE10188(), CUTBLangBarDlg::StartThread(), CHardErrorThread::StartThread(), SystemClockPostMessageToAdviseThread(), test(), test_AbortWaitCts(), Test_Acquire(), test_activateapp(), test_alertable(), test_alertable_wait(), test_apc_deadlock(), test_attach_input(), test_bsc_marshaling(), Test_CloseWhileSelectDuplicatedSocket(), Test_CloseWhileSelectSameSocket(), test_CoFreeUnusedLibraries(), 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_dde_default_app(), test_default_ime_window_creation(), test_defwinproc(), test_deletecontext(), test_DragQueryFile(), test_enum_thread_windows(), test_events(), test_ffcn_directory_overlap(), test_ffcnMultipleThreads(), test_foregroundwindow(), test_GetKeyState(), test_gettext(), test_GetThreadExitCode(), test_GetThreadTimes(), test_globalinterfacetable(), test_handles(), test_http_connection(), test_IInitializeSpy(), test_ImmDefaultHwnd(), test_ImmThreads(), test_ImpersonateNamedPipeClient(), test_implicit_mta(), test_Input_mouse(), test_InSendMessage(), test_interthread_messages(), test_keyed_events(), test_layered_window(), test_menu_input(), test_MessageBox(), test_MessageBox_WM_COPY_Test(), test_messages(), test_MultiThreadApartment(), test_multithreaded_clipboard(), test_mutant(), test_NamedPipe_2(), test_no_couninitialize_client(), test_no_couninitialize_server(), test_nonalertable(), test_NtAtom(), test_overlapped(), test_PeekMessage(), test_proxy_used_in_wrong_thread(), test_reader_info(), test_reconnect(), test_registered_object_thread_affinity(), test_render_with_multithread(), test_RtlIsCriticalSectionLocked(), test_runner(), test_select(), test_SendMessage_other_thread(), test_SendMessageTimeout(), test_set_clipboard_DRAWCLIPBOARD(), test_SetCursor(), test_SetFocus(), test_SetForegroundWindow(), test_ShowCursor(), test_smresult(), test_srwlock_base(), test_srwlock_example(), test_stop_wait_for_call(), test_SuspendThread(), test_tableweak_and_normal_marshal_and_releasedata(), test_tableweak_and_normal_marshal_and_unmarshal(), test_TerminateThread(), test_thread_actctx(), test_thread_objects(), test_thread_security(), test_thread_start_address(), test_threads(), test_timers(), test_two_tableweak_marshal_and_releasedata(), test_WaitBreak(), test_WaitCts(), test_WaitDcd(), test_WaitDsr(), test_WaitForInputIdle(), test_WaitRing(), test_winevents(), TestMessages(), TestRecursiveInterThreadMessages(), thread(), TIME_MMTimeStart(), UserLogin(), WahOpenHandleHelper(), wave_out_test_deviceOut(), WdmAudSetMixerDeviceFormatByLegacy(), wined3d_cs_create(), winhttp_request_Send(), WinMain(), wmain(), WriterThread::WriterThread(), WsAsyncCheckAndInitThread(), WshShell3_Popup(), and wWinMain().

◆ ExitThread()

VOID WINAPI ExitThread ( IN DWORD  uExitCode)

Definition at line 365 of file thread.c.

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}
#define NtCurrentPeb()
Definition: FLS.c:22
@ ThreadAmILastThread
Definition: compat.h:947
NTSYSAPI void WINAPI LdrShutdownThread(void)
Definition: ldrinit.c:1082
#define ASSERT(a)
Definition: mode.c:44
PETHREAD LastThread
Definition: pinsup.c:109
#define ERROR_FATAL(...)
Definition: debug.h:238
#define NtCurrentThread()

Referenced by _endthread(), _endthreadex(), BaseExitThreadPoolThread(), BaseProcessStartup(), BaseThreadStartup(), ChargenHandler(), client_stop(), collect_query_thread(), ConsoleControlDispatcher(), CreateSystemThreads(), DaytimeHandler(), DbgkExitThread(), ddeThread(), DECLARE_INTERFACE_(), DeleteFiber(), DiscardHandler(), EchoHandler(), ExitWindowsThread(), FreeLibraryAndExitThread(), MMSYSTEM_MidiStream_Player(), NotificationThread(), PullPin_Thread_Stop(), QotdHandler(), server_stop(), StartServer(), test_thread_func(), WaveActivateSoundStreaming(), wmain(), and wWinMain().

◆ GetCurrentThreadId()

DWORD WINAPI GetCurrentThreadId ( VOID  )

Definition at line 459 of file thread.c.

460{
462}

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_wnd_state_(), clipboard_thread(), clnt_cb_thread(), clnt_vc_create(), clnt_vc_destroy(), CMenuFocusManager::CMenuFocusManager(), context_create(), context_destroy(), context_reacquire(), CoRegisterInitializeSpy(), CoRevokeInitializeSpy(), create_binding_protocol(), Window::create_mdi_child(), create_test_windows(), CreateD3D9(), CtfImmGenerateMessage(), CtfImmTIMCreateInputContext(), DECLARE_INTERFACE_(), dialog_proc(), dialog_register_class(), dialog_run_message_loop(), DlgMainProc(), do_InitialDesktop_child(), do_wait_idle_child(), dprintf(), enum_thread(), EnumThreadWindows(), eprintf(), event_client(), fetch_thread_info(), FileOpenDlgProc95(), get_ime_window(), get_or_create_threaddata(), 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(), image_lock(), Imm32InternalLockIMC(), Imm32IsCrossThreadAccess(), ImmSetCompositionStringAW(), init_tests(), InitChildWindow(), InitD3D9BaseDevice(), InitThreads(), InitUniqueString(), is_apartment_thread(), JScript_AddNamedItem(), JScript_Close(), JScript_GetScriptDispatch(), JScript_GetScriptState(), JScript_SetScriptSite(), 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(), OLEMenu_CallWndProc(), OLEMenu_GetMsgProc(), OLEMenu_InstallHooks(), OleSetMenuDescriptor(), OnInitDialog(), CAutoComplete::OnShowWindow(), oob_client(), oob_server(), PersistMoniker_Load(), print_sr_status_flags(), Protocol_Continue(), RegisterConsoleIME(), Rs232Thread(), rtl_wait_cb(), ScriptThread(), select_server(), semaphore_thread_proc(), server_stop(), set_cursor_thread(), CTipbarWnd::SetFocusThread(), SetupWindowsHook(), show_cursor_thread(), simple_client(), simple_mixed_client(), simple_server(), SPY_EnterMessage(), START_TEST(), CTipbarWnd::StartModalInput(), statusclb_GetBindInfo(), statusclb_OnDataAvailable(), statusclb_OnProgress(), statusclb_OnStartBinding(), statusclb_OnStopBinding(), statusclb_QueryInterface(), CTipbarWnd::StopModalInput(), Stream_Read(), sw_SetContext(), swapchain_create_context(), swapchain_get_context(), Test_Acquire(), test_alertable(), test_async_HttpSendRequestEx(), test_attach_input(), test_capture_4_proc(), 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_foregroundwindow(), test_fragmentsize(), test_handles(), test_IInitializeSpy(), test_Input_mouse(), test_inputdesktop(), test_inputdesktop2(), test_IsDialogMessage(), test_keyboard_input(), test_message_conversion(), test_MessageBox(), test_notify_message(), test_ole_initialization(), Test_OpenInputDesktop(), test_PeekMessage(), test_process_security_child(), test_quit_message(), test_recursive_hook(), Test_References(), test_RtlLeaveCriticalSection(), test_set_hook(), test_SetCursor(), Test_SetCursorPos(), test_SetFocus(), test_ShowCursor(), test_thread_info(), test_thread_priority(), test_tp_group_cancel(), test_winmodule(), test_wiznavigation(), TestGetUserObjectInfoA(), TestGetUserObjectInfoW(), thread(), thread_proc(), threadFunc1(), ThreadShutdownNotify(), TIME_TriggerCallBack(), MxLockNoDynam::TryToAcquire(), UnregisterConsoleIME(), VBScript_AddNamedItem(), VBScript_Close(), VBScript_GetScriptDispatch(), VBScript_GetScriptState(), VBScript_SetScriptSite(), VBScript_SetScriptState(), VBScriptParse_ParseScriptText(), VBScriptParseProcedure_ParseProcedureText(), wave_out_test_deviceOut(), WDML_GetConv(), WDML_GetInstance(), WDML_Initialize(), WDML_NotifyThreadDetach(), WDML_ServerNameProc(), WDML_SetAllLastError(), wglDeleteContext(), wglMakeCurrent(), win_event_global_hook_proc(), win_event_proc(), WindowThreadProc(), 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(), WndProc(), xmlGetThreadId(), and xmlIsMainThread().

◆ GetExitCodeThread()

◆ GetProcessIdOfThread()

DWORD WINAPI GetProcessIdOfThread ( IN HANDLE  Thread)

Definition at line 889 of file thread.c.

890{
891 THREAD_BASIC_INFORMATION ThreadBasic;
893
896 &ThreadBasic,
898 NULL);
899 if (!NT_SUCCESS(Status))
900 {
902 return 0;
903 }
904
905 return HandleToUlong(ThreadBasic.ClientId.UniqueProcess);
906}
_In_opt_ PFILE_OBJECT _In_opt_ PETHREAD Thread
Definition: fltkernel.h:2653

◆ GetTeb()

PTEB GetTeb ( VOID  )

Definition at line 438 of file thread.c.

439{
440 return NtCurrentTeb();
441}

◆ GetThreadContext()

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

Definition at line 501 of file thread.c.

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

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

◆ GetThreadId()

DWORD WINAPI GetThreadId ( IN HANDLE  Thread)

Definition at line 913 of file thread.c.

914{
915 THREAD_BASIC_INFORMATION ThreadBasic;
917
920 &ThreadBasic,
922 NULL);
923 if (!NT_SUCCESS(Status))
924 {
926 return 0;
927 }
928
929 return HandleToUlong(ThreadBasic.ClientId.UniqueThread);
930}

Referenced by _tWinMain(), CommonInstall(), InstallReactOS(), RpcCancelThreadEx(), and RpcMgmtWaitServerListen().

◆ GetThreadIOPendingFlag()

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

Definition at line 1047 of file thread.c.

1049{
1050 ULONG IoPending;
1052
1053 /* Query the flag */
1056 &IoPending,
1057 sizeof(IoPending),
1058 NULL);
1059 if (NT_SUCCESS(Status))
1060 {
1061 /* Return the flag */
1062 *lpIOIsPending = IoPending ? TRUE : FALSE;
1063 return TRUE;
1064 }
1065
1066 /* Fail */
1068 return FALSE;
1069}
@ ThreadIsIoPending
Definition: compat.h:951

◆ GetThreadPriority()

int WINAPI GetThreadPriority ( IN HANDLE  hThread)

Definition at line 739 of file thread.c.

740{
741 THREAD_BASIC_INFORMATION ThreadBasic;
743
744 /* Query the Base Priority Increment */
747 &ThreadBasic,
749 NULL);
750 if (!NT_SUCCESS(Status))
751 {
752 /* Failure */
755 }
756
757 /* Do some conversions for saturation values */
758 if (ThreadBasic.BasePriority == ((HIGH_PRIORITY + 1) / 2))
759 {
760 /* Win32 calls this "time critical" */
762 }
763 else if (ThreadBasic.BasePriority == -((HIGH_PRIORITY + 1) / 2))
764 {
765 /* Win32 calls this "idle" */
767 }
768
769 /* Return the final result */
770 return ThreadBasic.BasePriority;
771}
#define HIGH_PRIORITY
KPRIORITY BasePriority
Definition: compat.h:932
#define THREAD_PRIORITY_TIME_CRITICAL
Definition: winbase.h:281
#define THREAD_PRIORITY_ERROR_RETURN
Definition: winbase.h:282
#define THREAD_PRIORITY_IDLE
Definition: winbase.h:278

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

◆ GetThreadPriorityBoost()

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

Definition at line 778 of file thread.c.

780{
783
787 sizeof(ULONG),
788 NULL);
789 if (!NT_SUCCESS(Status))
790 {
792 return FALSE;
793 }
794
795 *pDisablePriorityBoost = PriorityBoost;
796 return TRUE;
797}
@ 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 830 of file thread.c.

833{
834#ifdef _M_IX86
835 DESCRIPTOR_TABLE_ENTRY DescriptionTableEntry;
837
838 /* Set the selector and do the query */
839 DescriptionTableEntry.Selector = dwSelector;
842 &DescriptionTableEntry,
843 sizeof(DESCRIPTOR_TABLE_ENTRY),
844 NULL);
845 if (!NT_SUCCESS(Status))
846 {
847 /* Fail */
849 return FALSE;
850 }
851
852 /* Success, return the selector */
853 *lpSelectorEntry = DescriptionTableEntry.Descriptor;
854 return TRUE;
855#else
856 DPRINT1("Calling GetThreadSelectorEntry!\n");
857 return FALSE;
858#endif
859}
@ 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 469 of file thread.c.

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}
@ ThreadTimes
Definition: compat.h:936
struct _FILETIME * LPFILETIME
Definition: time.c:29
LARGE_INTEGER UserTime
Definition: winternl.h:1063
LARGE_INTEGER CreateTime
Definition: winternl.h:1060
LARGE_INTEGER KernelTime
Definition: winternl.h:1062
LARGE_INTEGER ExitTime
Definition: winternl.h:1061

Referenced by test_GetThreadTimes().

◆ OpenThread()

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

Definition at line 403 of file thread.c.

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}
#define ULongToHandle(h)
Definition: basetsd.h:81
DWORD dwThreadId
Definition: fdebug.c:31
#define OBJ_INHERIT
Definition: winternl.h:225
static BOOL bInheritHandle
Definition: pipe.c:82
#define InitializeObjectAttributes(p, n, a, r, s)
Definition: reg.c:106
NTSTATUS NTAPI NtOpenThread(OUT PHANDLE ThreadHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, IN PCLIENT_ID ClientId OPTIONAL)
Definition: thread.c:1013

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

◆ QueueUserAPC()

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

Definition at line 959 of file thread.c.

962{
964 ACTIVATION_CONTEXT_BASIC_INFORMATION ActCtxInfo;
965
966 /* Zero the activation context and query information on it */
967 RtlZeroMemory(&ActCtxInfo, sizeof(ActCtxInfo));
969 NULL,
970 0,
971 ActivationContextBasicInformation,
972 &ActCtxInfo,
973 sizeof(ActCtxInfo),
974 NULL);
975 if (!NT_SUCCESS(Status))
976 {
977 /* Fail due to SxS */
978 DbgPrint("SXS: %s failing because RtlQueryInformationActivationContext()"
979 "returned status %08lx\n", __FUNCTION__, Status);
981 return FALSE;
982 }
983
984 /* Queue the APC */
987 pfnAPC,
988 (PVOID)dwData,
989 (ActCtxInfo.dwFlags & 1) ?
990 INVALID_ACTIVATION_CONTEXT : ActCtxInfo.hActCtx);
991 if (!NT_SUCCESS(Status))
992 {
994 return FALSE;
995 }
996
997 /* All good */
998 return TRUE;
999}
VOID NTAPI BaseDispatchApc(IN PAPCFUNC ApcRoutine, IN PVOID Data, IN PACTIVATION_CONTEXT ActivationContext)
Definition: thread.c:92
#define DbgPrint
Definition: hal.h:12
static HANDLE ULONG_PTR dwData
Definition: file.c:35
VOID(NTAPI * PKNORMAL_ROUTINE)(IN PVOID NormalContext OPTIONAL, IN PVOID SystemArgument1 OPTIONAL, IN PVOID SystemArgument2 OPTIONAL)
Definition: ketypes.h:744
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(), CDirectoryWatcher::RequestAddWatcher(), CDirectoryWatcher::RequestAllWatchersTermination(), CDirectoryWatcher::RequestTermination(), SEALED_::TerminateProtocolThread(), test_alertable_wait(), test_CoWaitForMultipleHandles(), test_MsgWaitForMultipleObjects(), test_RtlRegisterWait(), WahCloseHandleHelper(), and WahQueueUserApc().

◆ QueueUserWorkItem()

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

Definition at line 1076 of file thread.c.

1079{
1081
1082 /* NOTE: Rtl needs to safely call the function using a trampoline */
1084 if (!NT_SUCCESS(Status))
1085 {
1086 /* Failed */
1088 return FALSE;
1089 }
1090
1091 /* All good */
1092 return TRUE;
1093}
_In_ CDROM_SCAN_FOR_SPECIAL_INFO _In_ PCDROM_SCAN_FOR_SPECIAL_HANDLER Function
Definition: cdrom.h:1156
NTSYSAPI NTSTATUS NTAPI RtlQueueWorkItem(_In_ WORKERCALLBACKFUNC Function, _In_opt_ PVOID Context, _In_ ULONG Flags)
VOID(NTAPI * WORKERCALLBACKFUNC)(_In_ PVOID Context)
Definition: rtltypes.h:513
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170

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 662 of file thread.c.

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}
ULONG_PTR KAFFINITY
Definition: compat.h:85
@ ThreadAffinityMask
Definition: compat.h:939
NTSTATUS NTAPI NtSetInformationThread(IN HANDLE ThreadHandle, IN THREADINFOCLASS ThreadInformationClass, IN PVOID ThreadInformation, IN ULONG ThreadInformationLength)
Definition: query.c:2018
KAFFINITY AffinityMask
Definition: compat.h:930

Referenced by test_thread_processor(), and wmain().

◆ SetThreadContext()

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

Definition at line 521 of file thread.c.

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

Referenced by DECLARE_INTERFACE_(), and test_ExitProcess().

◆ SetThreadIdealProcessor()

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

Definition at line 866 of file thread.c.

868{
870
873 &dwIdealProcessor,
874 sizeof(ULONG));
875 if (!NT_SUCCESS(Status))
876 {
878 return -1;
879 }
880
881 return (DWORD)Status;
882}
@ ThreadIdealProcessor
Definition: compat.h:948
unsigned long DWORD
Definition: ntddk_ex.h:95

Referenced by init_funcs().

◆ SetThreadPriority()

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

Definition at line 700 of file thread.c.

702{
703 LONG Prio = nPriority;
705
706 /* Check if values forcing saturation should be used */
708 {
709 /* This is 16 */
710 Prio = (HIGH_PRIORITY + 1) / 2;
711 }
712 else if (Prio == THREAD_PRIORITY_IDLE)
713 {
714 /* This is -16 */
715 Prio = -((HIGH_PRIORITY + 1) / 2);
716 }
717
718 /* Set the Base Priority */
721 &Prio,
722 sizeof(LONG));
723 if (!NT_SUCCESS(Status))
724 {
725 /* Failure */
727 return FALSE;
728 }
729
730 /* Return */
731 return TRUE;
732}
@ ThreadBasePriority
Definition: compat.h:938
long LONG
Definition: pedump.c:60

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

◆ SetThreadPriorityBoost()

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

Definition at line 804 of file thread.c.

806{
809
810 PriorityBoost = bDisablePriorityBoost != FALSE;
811
815 sizeof(ULONG));
816 if (!NT_SUCCESS(Status))
817 {
819 return FALSE;
820 }
821
822 return TRUE;
823}

Referenced by init_funcs().

◆ SetThreadStackGuarantee()

BOOL WINAPI SetThreadStackGuarantee ( IN OUT PULONG  StackSizeInBytes)

Definition at line 1006 of file thread.c.

1007{
1008 PTEB Teb = NtCurrentTeb();
1009 ULONG GuaranteedStackBytes;
1011
1012 if (!StackSizeInBytes)
1013 {
1015 return FALSE;
1016 }
1017
1018 AllocationSize = *StackSizeInBytes;
1019
1020 /* Retrieve the current stack size */
1021 GuaranteedStackBytes = Teb->GuaranteedStackBytes;
1022
1023 /* Return the size of the previous stack */
1024 *StackSizeInBytes = GuaranteedStackBytes;
1025
1026 /*
1027 * If the new stack size is either zero or is less than the current size,
1028 * the previous stack size is returned and we return success.
1029 */
1030 if ((AllocationSize == 0) || (AllocationSize < GuaranteedStackBytes))
1031 {
1032 return TRUE;
1033 }
1034
1035 // FIXME: Unimplemented!
1037
1038 // Temporary HACK for supporting applications!
1039 return TRUE; // FALSE;
1040}
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
#define SetLastError(x)
Definition: compat.h:752
IN PFCB IN PFILE_OBJECT FileObject IN ULONG AllocationSize
Definition: fatprocs.h:322
ULONG GuaranteedStackBytes
Definition: winternl.h:279
#define UNIMPLEMENTED_ONCE
Definition: typedefs.h:30

◆ SetThreadUILanguage()

LANGID WINAPI SetThreadUILanguage ( IN LANGID  LangId)

Definition at line 937 of file thread.c.

938{
939#if (NTDDI_VERSION < NTDDI_LONGHORN)
940 /* We only support LangId == 0, for selecting a language
941 * identifier that best supports the NT Console. */
942 if (LangId != 0)
943 {
945 return 0;
946 }
947#endif
948
950
951 return LANGIDFROMLCID(NtCurrentTeb()->CurrentLocale);
952}
#define UNIMPLEMENTED
Definition: debug.h:115
#define STATUS_NOT_SUPPORTED
Definition: ntstatus.h:423
#define LANGIDFROMLCID(l)
Definition: nls.h:18

◆ SuspendThread()

DWORD WINAPI SuspendThread ( IN HANDLE  hThread)

Definition at line 642 of file thread.c.

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}
NTSTATUS NTAPI NtSuspendThread(IN HANDLE ThreadHandle, OUT PULONG PreviousSuspendCount OPTIONAL)
Definition: state.c:352

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

◆ SwitchToThread()

BOOL WINAPI SwitchToThread ( VOID  )

Definition at line 448 of file thread.c.

449{
451}
NTSYSAPI NTSTATUS WINAPI NtYieldExecution(void)
Definition: thrdschd.c:744
#define STATUS_NO_YIELD_PERFORMED
Definition: ntstatus.h:150

Referenced by _Init_thread_header(), and DoWaitForReaders().

◆ TerminateThread()

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

Definition at line 587 of file thread.c.

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}
#define ERROR_INVALID_HANDLE
Definition: compat.h:98
struct _ThreadInfo ThreadInfo

Referenced by do_test(), DoAbortThread(), DP_DestroyDirectPlay2(), main(), nfs41_session_free(), NotifyTopLevelWindow(), NotifyUserProcessForShutdown(), BtrfsSend::SendDlgProc(), test_bsc_marshaling(), test_CreateThread_basic(), test_CreateThread_suspended(), test_ExitProcess(), 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 1100 of file thread.c.

1101{
1102 ULONG Index;
1103 PTEB Teb;
1104 PPEB Peb;
1105
1106 /* Get the PEB and TEB, lock the PEB */
1107 Teb = NtCurrentTeb();
1110
1111 /* Try to get regular TEB slot */
1113 if (Index != 0xFFFFFFFF)
1114 {
1115 /* Clear the value. */
1116 Teb->TlsSlots[Index] = 0;
1118 return Index;
1119 }
1120
1121 /* If it fails, try to find expansion TEB slot. */
1123 if (Index != 0xFFFFFFFF)
1124 {
1125 /* Is there no expansion slot yet? */
1126 if (!Teb->TlsExpansionSlots)
1127 {
1128 /* Allocate an array */
1129 Teb->TlsExpansionSlots = RtlAllocateHeap(RtlGetProcessHeap(),
1132 sizeof(PVOID));
1133 }
1134
1135 /* Did we get an array? */
1136 if (!Teb->TlsExpansionSlots)
1137 {
1138 /* Fail */
1140 Index = 0xFFFFFFFF;
1142 }
1143 else
1144 {
1145 /* Clear the value. */
1146 Teb->TlsExpansionSlots[Index] = 0;
1148 }
1149 }
1150 else
1151 {
1152 /* Fail */
1154 }
1155
1156 /* Release the lock and return */
1158 return Index;
1159}
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
Definition: heap.c:590
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
PPEB Peb
Definition: dllmain.c:27
#define TLS_EXPANSION_SLOTS
Definition: pstypes.h:310
NTSYSAPI void WINAPI RtlReleasePebLock(void)
Definition: libsupp.c:82
NTSYSAPI void WINAPI RtlAcquirePebLock(void)
Definition: libsupp.c:72
NTSYSAPI ULONG WINAPI RtlFindClearBitsAndSet(PRTL_BITMAP, ULONG, ULONG)
NTSYSAPI void WINAPI RtlClearBits(PRTL_BITMAP, ULONG, ULONG)
#define STATUS_NO_MEMORY
Definition: ntstatus.h:260
#define TLS_MINIMUM_AVAILABLE
Definition: ntddk_ex.h:236
PVOID TlsBitmap
Definition: ntddk_ex.h:259
PRTL_BITMAP TlsExpansionBitmap
Definition: winternl.h:346
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

Referenced by __nc_error(), __rpc_createerr(), __rpc_getconfip(), CMenuFocusManager::AcquireManager(), ClientThreadSetupHelper(), COMDLG32_SetCommDlgExtendedError(), DllMain(), get_thread_data(), get_tls_data(), I_CryptAllocTls(), Imm32InitTLS(), Init(), TLS::Initialize(), msvcrt_init_tls(), ProcessAttach(), spy_init(), test_CreateThread_basic(), test_reserved_tls(), test_TLS(), and wined3d_dll_init().

◆ TlsFree()

BOOL WINAPI TlsFree ( IN DWORD  Index)

Definition at line 1166 of file thread.c.

1167{
1168 BOOL BitSet;
1169 PPEB Peb;
1171 PVOID TlsBitmap;
1173
1174 /* Acquire the PEB lock and grab the PEB */
1175 Peb = NtCurrentPeb();
1177
1178 /* Check if the index is too high */
1180 {
1181 /* Check if it can fit in the expansion slots */
1184 {
1185 /* It's invalid */
1188 return FALSE;
1189 }
1190 else
1191 {
1192 /* Use the expansion bitmap */
1193 TlsBitmap = Peb->TlsExpansionBitmap;
1194 Index = TlsIndex;
1195 }
1196 }
1197 else
1198 {
1199 /* Use the normal bitmap */
1200 TlsBitmap = Peb->TlsBitmap;
1201 }
1202
1203 /* Check if the index was set */
1204 BitSet = RtlAreBitsSet(TlsBitmap, Index, 1);
1205 if (BitSet)
1206 {
1207 /* Tell the kernel to free the TLS cells */
1210 &Index,
1211 sizeof(DWORD));
1212 if (!NT_SUCCESS(Status))
1213 {
1216 return FALSE;
1217 }
1218
1219 /* Clear the bit */
1220 RtlClearBits(TlsBitmap, Index, 1);
1221 }
1222 else
1223 {
1224 /* Fail */
1227 return FALSE;
1228 }
1229
1230 /* Done! */
1232 return TRUE;
1233}
@ ThreadZeroTlsCell
Definition: compat.h:945
unsigned int BOOL
Definition: ntddk_ex.h:94
NTSYSAPI BOOLEAN WINAPI RtlAreBitsSet(PCRTL_BITMAP, ULONG, ULONG)
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
#define TlsIndex
Definition: ws2_32p.h:277

Referenced by 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(), wined3d_dll_destroy(), wined3d_dll_init(), and xmlCleanupThreads().

◆ TlsGetValue()

LPVOID WINAPI TlsGetValue ( IN DWORD  Index)

Definition at line 1240 of file thread.c.

1241{
1242 PTEB Teb;
1243
1244 /* Get the TEB and clear the last error */
1245 Teb = NtCurrentTeb();
1246 Teb->LastErrorValue = 0;
1247
1248 /* Check for simple TLS index */
1250 {
1251 /* Return it */
1252 return Teb->TlsSlots[Index];
1253 }
1254
1255 /* Check for valid index */
1257 {
1258 /* Fail */
1260 return NULL;
1261 }
1262
1263 /* The expansion slots are allocated on demand, so check for it. */
1264 Teb->LastErrorValue = 0;
1265 if (!Teb->TlsExpansionSlots) return NULL;
1266
1267 /* Return the value from the expansion slots */
1269}
ULONG LastErrorValue
Definition: compat.h:843

Referenced by __mingwthr_run_key_dtors(), add_active_textservice(), client_stop(), CommDlgExtendedError(), context_get_current(), detach_thread(), DllMain(), enum_locales_proc(), 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(), 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_reserved_tls(), test_TLS(), TF_GetThreadMgr(), ThreadFocusHookProc(), threadFunc1(), ThreadMgr_Constructor(), VirtualChannelInit(), WsSockInitialize(), WsThreadBlockingCallback(), WsThreadDestroyCurrentThread(), WsThreadGetCurrentThread(), WsThreadGetThreadId(), and xmlGetGlobalState().

◆ TlsSetValue()

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

Definition at line 1276 of file thread.c.

1278{
1280 PTEB Teb = NtCurrentTeb();
1281
1282 /* Check for simple TLS index */
1284 {
1285 /* Return it */
1286 Teb->TlsSlots[Index] = Value;
1287 return TRUE;
1288 }
1289
1290 /* Check if this is an expansion slot */
1293 {
1294 /* Fail */
1296 return FALSE;
1297 }
1298
1299 /* Do we not have expansion slots? */
1300 if (!Teb->TlsExpansionSlots)
1301 {
1302 /* Get the PEB lock to see if we still need them */
1304 if (!Teb->TlsExpansionSlots)
1305 {
1306 /* Allocate them */
1307 Teb->TlsExpansionSlots = RtlAllocateHeap(RtlGetProcessHeap(),
1310 sizeof(PVOID));
1311 if (!Teb->TlsExpansionSlots)
1312 {
1313 /* Fail */
1316 return FALSE;
1317 }
1318 }
1319
1320 /* Release the lock */
1322 }
1323
1324 /* Write the value */
1326
1327 /* Success */
1328 return TRUE;
1329}
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
Definition: wdfregistry.h:413

Referenced by CMenuFocusManager::AcquireManager(), client_start(), COMDLG32_SetCommDlgExtendedError(), context_destroy(), context_set_current(), DllMain(), EnumRfc1766_create(), get_thread_data(), get_tls_data(), I_CryptDetachTls(), I_CryptSetTls(), Imm32AllocateTLS(), TLS::InternalAllocateTLS(), TLS::InternalDestroyTLS(), INTERNET_AllocThreadError(), INTERNET_WorkerThreadFunc(), msvcrt_get_thread_data(), CMenuFocusManager::ReleaseManager(), server_start(), set_indent_level(), SHSetThreadRef(), test_reserved_tls(), test_TLS(), threadFunc1(), ThreadMgr_Constructor(), ThreadMgr_Destructor(), WsThreadCreate(), WsThreadDelete(), WsThreadDestroyCurrentThread(), and xmlGetGlobalState().