ReactOS  0.4.15-dev-5089-g555bec6
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 */
114  _SEH2_TRY
115  {
117  }
119  {
120 
121  }
122  _SEH2_END;
123 
124  /* Now de-activate and release the activation context */
126  RtlReleaseActivationContext(ActivationContext);
127 }
_SEH2_TRY
Definition: create.c:4226
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define RTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_FORMAT_WHISTLER
Definition: rtltypes.h:101
#define EXCEPTION_EXECUTE_HANDLER
Definition: excpt.h:85
PRTL_ACTIVATION_CONTEXT_STACK_FRAME FASTCALL RtlDeactivateActivationContextUnsafeFast(IN PRTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_EXTENDED Frame)
Definition: actctx.c:6011
_In_opt_ HANDLE _In_opt_ PIO_APC_ROUTINE ApcRoutine
Definition: iofuncs.h:719
NTSYSAPI void WINAPI RtlReleaseActivationContext(HANDLE)
Definition: actctx.c:5344
_SEH2_END
Definition: create.c:4400
PRTL_ACTIVATION_CONTEXT_STACK_FRAME FASTCALL RtlActivateActivationContextUnsafeFast(IN PRTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_EXTENDED Frame, IN PVOID Context)
Definition: actctx.c:5934
#define _SEH2_EXCEPT(...)
Definition: pseh2_64.h:40

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 }
BASE_CREATE_THREAD CreateThreadRequest
Definition: basemsg.h:284
NTSTATUS NTAPI CsrClientCallServer(IN OUT PCSR_API_MESSAGE ApiMessage, IN OUT PCSR_CAPTURE_BUFFER CaptureBuffer OPTIONAL, IN CSR_API_NUMBER ApiNumber, IN ULONG DataLength)
Definition: connect.c:365
NTSTATUS Status
Definition: csrmsg.h:110
HANDLE ThreadHandle
Definition: basemsg.h:104
#define CSR_CREATE_API_NUMBER(ServerId, ApiId)
Definition: csrmsg.h:37
_Out_ PCLIENT_ID ClientId
Definition: kefuncs.h:1165
#define BASESRV_SERVERDLL_INDEX
Definition: basemsg.h:15
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
CLIENT_ID ClientId
Definition: basemsg.h:105
HANDLE UniqueThread
Definition: compat.h:685
union _BASE_API_MESSAGE::@3487 Data
#define NULL
Definition: types.h:112
#define DPRINT1
Definition: precomp.h:8
#define STATUS_SUCCESS
Definition: shellext.h:65
#define DPRINT
Definition: sndvol32.h:71

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 */
61  _SEH2_TRY
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  }
87  _SEH2_END;
88 }
VOID WINAPI ExitProcess(IN UINT uExitCode)
Definition: proc.c:1487
_SEH2_TRY
Definition: create.c:4226
LONG WINAPI UnhandledExceptionFilter(IN PEXCEPTION_POINTERS ExceptionInfo)
Definition: except.c:269
#define _SEH2_GetExceptionInformation()
Definition: pseh2_64.h:164
VOID WINAPI ExitThread(IN DWORD uExitCode)
Definition: thread.c:365
BOOLEAN BaseRunningInServerProcess
Definition: dllmain.c:20
NTSTATUS NTAPI CsrNewThread(VOID)
Definition: api.c:27
_SEH2_END
Definition: create.c:4400
FORCEINLINE struct _TEB * NtCurrentTeb(VOID)
Definition: psfuncs.h:420
#define _SEH2_EXCEPT(...)
Definition: pseh2_64.h:40
#define _SEH2_GetExceptionCode()
Definition: pseh2_64.h:165

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;
173  HANDLE hThread;
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 
330 Quit:
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);
342  NtClose(hThread);
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 }
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
Definition: conport.c:35
IN CINT OUT PVOID IN ULONG OUT PULONG ReturnLength
Definition: dumpinfo.c:39
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
#define THREAD_ALL_ACCESS
Definition: nt_native.h:1339
#define TRUE
Definition: types.h:120
LONG NTSTATUS
Definition: precomp.h:26
#define HandleToUlong(h)
Definition: basetsd.h:79
_In_ BOOL _In_ HANDLE hProcess
Definition: mapping.h:70
HANDLE UniqueProcess
Definition: compat.h:684
#define RTL_ACTIVATE_ACTIVATION_CONTEXT_EX_FLAG_RELEASE_ON_STACK_DEALLOCATION
Definition: rtltypes.h:106
NTSYSAPI NTSTATUS WINAPI RtlQueryInformationActivationContext(ULONG, HANDLE, PVOID, ULONG, PVOID, SIZE_T, SIZE_T *)
Definition: actctx.c:5515
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define CREATE_SUSPENDED
Definition: winbase.h:178
PVOID StackBase
Definition: pstypes.h:694
DWORD BaseSetLastNTError(IN NTSTATUS Status)
Definition: reactos.cpp:166
#define NtCurrentProcess()
Definition: nt_native.h:1657
Status
Definition: gdiplustypes.h:24
NTSTATUS NtTerminateThread(IN HANDLE ThreadHandle OPTIONAL, IN NTSTATUS ExitStatus)
Definition: kill.c:1282
NTSTATUS NTAPI NtResumeThread(IN HANDLE ThreadHandle, OUT PULONG SuspendCount OPTIONAL)
Definition: state.c:290
_Out_ PCLIENT_ID ClientId
Definition: kefuncs.h:1165
BOOLEAN BaseRunningInServerProcess
Definition: dllmain.c:20
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define STACK_SIZE_PARAM_IS_A_RESERVATION
Definition: winbase.h:574
_In_opt_ PVOID _Out_ PLARGE_INTEGER Cookie
Definition: cmfuncs.h:13
VOID WINAPI BaseFreeThreadStack(_In_ HANDLE hProcess, _In_ PINITIAL_TEB InitialTeb)
Definition: utils.c:495
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 NtClose(IN HANDLE Handle)
Definition: obhandle.c:3402
HANDLE UniqueThread
Definition: compat.h:685
NTSTATUS NTAPI CsrCreateRemoteThread(IN HANDLE hThread, IN PCLIENT_ID ClientId)
Definition: thredsup.c:569
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleA(LPCSTR lpModuleName)
Definition: loader.c:812
POBJECT_ATTRIBUTES WINAPI BaseFormatObjectAttributes(OUT POBJECT_ATTRIBUTES ObjectAttributes, IN PSECURITY_ATTRIBUTES SecurityAttributes OPTIONAL, IN PUNICODE_STRING ObjectName)
Definition: utils.c:304
ULONG_PTR SIZE_T
Definition: typedefs.h:80
Definition: compat.h:694
NTSTATUS WINAPI BasepNotifyCsrOfThread(IN HANDLE ThreadHandle, IN PCLIENT_ID ClientId)
Definition: thread.c:25
FORCEINLINE struct _TEB * NtCurrentTeb(VOID)
Definition: psfuncs.h:420
NTSTATUS NTAPI NtCreateThread(OUT PHANDLE ThreadHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, IN HANDLE ProcessHandle, OUT PCLIENT_ID ClientId, IN PCONTEXT ThreadContext, IN PINITIAL_TEB InitialTeb, IN BOOLEAN CreateSuspended)
Definition: thread.c:941
#define NULL
Definition: types.h:112
HANDLE hThread
Definition: wizard.c:28
#define RTL_QUERY_ACTIVATION_CONTEXT_FLAG_USE_ACTIVE_ACTIVATION_CONTEXT
Definition: rtltypes.h:116
#define DPRINT1
Definition: precomp.h:8
NTSTATUS(NTAPI * PCSR_CREATE_REMOTE_THREAD)(IN HANDLE ThreadHandle, IN PCLIENT_ID ClientId)
Definition: thread.c:19
NTSTATUS NTAPI RtlActivateActivationContextEx(ULONG flags, PTEB tebAddress, HANDLE handle, PULONG_PTR cookie)
Definition: actctx.c:5368
struct tagContext Context
Definition: acpixf.h:1034
NTSTATUS NTAPI RtlAllocateActivationContextStack(IN PACTIVATION_CONTEXT_STACK *Stack)
Definition: actctx.c:5906
unsigned int ULONG
Definition: retypes.h:1
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
#define GetProcAddress(x, y)
Definition: compat.h:612
PVOID ActivationContextStackPointer
Definition: compat.h:713
#define DPRINT
Definition: sndvol32.h:71
#define __FUNCTION__
Definition: types.h:112
VOID NTAPI RtlFreeActivationContextStack(IN PACTIVATION_CONTEXT_STACK Stack)
Definition: actctx.c:5440

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 }
#define NtCurrentProcess()
Definition: nt_native.h:1657
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_(), 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(), init(), InitDialog(), CDesktopThread::Initialize(), BtrfsPropSheet::Initialize(), COutputPin::InitializeIOThread(), InitializeScreenSaver(), InitiateSoundStreaming(), InstallDrvDlgProc(), installer_proc(), InstallReactOS(), CZipFolder::InvokeCommand(), iocp_async_read_thread(), iocp_async_read_thread_closesocket(), JustDoIt(), KmtRunKernelTest(), LocalScheduleJob(), LS_ThreadProc(), LsapRmInitializeServer(), MailSlotReader(), main(), MainDialogProc(), MCI_SendCommandAsync(), MCIAVI_mciPlay_async(), MCICDA_Play(), MCIQTZ_mciPlay(), midiStreamOpen(), MMDevEnum_RegisterEndpointNotificationCallback(), mmTaskCreate(), StringTest::mt(), MULTIMEDIA_PlaySound(), Netbios(), NotifyTopLevelWindow(), Window::OnCommand(), OnUpdate(), CZipExtract::CExtractSettingsPage::OnWizardNext(), Telnet::Open(), audio_waveout::open(), audio_wavein::open(), OpenDevice(), OSK_Create(), OutputQueue_Construct(), CKsClockForwarder::Pause(), PdhCollectQueryDataEx(), PerformancePageWndProc(), PipeInit(), PlayLogonSound(), 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(), CHardErrorThread::StartThread(), SystemClockPostMessageToAdviseThread(), test(), test_AbortWaitCts(), test_accept(), 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_getservbyname(), 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_inet_ntoa(), 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_send(), 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(), test_write_watch(), test_WSAPoll(), test_WSARecv(), 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 TRUE
Definition: types.h:120
LONG NTSTATUS
Definition: precomp.h:26
#define NtCurrentThread()
VOID WINAPI ExitProcess(IN UINT uExitCode)
Definition: proc.c:1487
#define ERROR_FATAL(...)
Definition: debug.h:238
Status
Definition: gdiplustypes.h:24
NTSTATUS NtTerminateThread(IN HANDLE ThreadHandle OPTIONAL, IN NTSTATUS ExitStatus)
Definition: kill.c:1282
_Out_ PCLIENT_ID ClientId
Definition: kefuncs.h:1165
#define ASSERT(a)
Definition: mode.c:44
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
NTSTATUS NTAPI NtQueryInformationThread(IN HANDLE ThreadHandle, IN THREADINFOCLASS ThreadInformationClass, OUT PVOID ThreadInformation, IN ULONG ThreadInformationLength, OUT PULONG ReturnLength OPTIONAL)
Definition: query.c:2624
HANDLE UniqueThread
Definition: compat.h:685
PETHREAD LastThread
Definition: pinsup.c:109
FORCEINLINE struct _TEB * NtCurrentTeb(VOID)
Definition: psfuncs.h:420
#define NtCurrentPeb()
Definition: FLS.c:22
#define NULL
Definition: types.h:112
unsigned int ULONG
Definition: retypes.h:1
NTSTATUS NTAPI LdrShutdownThread(VOID)
Definition: ldrinit.c:1078

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 }
#define HandleToUlong(h)
Definition: basetsd.h:79
_Out_ PCLIENT_ID ClientId
Definition: kefuncs.h:1165
HANDLE UniqueThread
Definition: compat.h:685
FORCEINLINE struct _TEB * NtCurrentTeb(VOID)
Definition: psfuncs.h:420

Referenced by __security_init_cookie(), __threadid(), alloc_msi_remote_handle(), alloc_msihandle(), ANIMATE_DoStop(), apartment_construct(), AtlModuleAddCreateWndData(), AtlModuleExtractCreateWndData(), ATL::AtlWinModuleAddCreateWndData(), ATL::AtlWinModuleExtractCreateWndData(), 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(), create_child_window(), Window::create_mdi_child(), create_test_windows(), CreateD3D9(), 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(), 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_LoadMciDriver(), 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(), CAutoComplete::OnShowWindow(), oob_client(), oob_server(), PersistMoniker_Load(), print_sr_status_flags(), Protocol_Continue(), Rs232Thread(), rtl_wait_cb(), ScriptThread(), select_server(), semaphore_thread_proc(), server_stop(), set_cursor_thread(), SetupWindowsHook(), show_cursor_thread(), simple_client(), simple_mixed_client(), simple_server(), SPY_EnterMessage(), START_TEST(), statusclb_GetBindInfo(), statusclb_OnDataAvailable(), statusclb_OnProgress(), statusclb_OnStartBinding(), statusclb_OnStopBinding(), statusclb_QueryInterface(), Stream_Read(), sw_SetContext(), swapchain_create_context(), swapchain_get_context(), 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(), 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()

BOOL WINAPI GetExitCodeThread ( IN HANDLE  hThread,
OUT LPDWORD  lpExitCode 
)

Definition at line 541 of file thread.c.

543 {
544  THREAD_BASIC_INFORMATION ThreadBasic;
546 
549  &ThreadBasic,
550  sizeof(THREAD_BASIC_INFORMATION),
551  NULL);
552  if (!NT_SUCCESS(Status))
553  {
555  return FALSE;
556  }
557 
558  *lpExitCode = ThreadBasic.ExitStatus;
559  return TRUE;
560 }
#define TRUE
Definition: types.h:120
LONG NTSTATUS
Definition: precomp.h:26
#define FALSE
Definition: types.h:117
DWORD BaseSetLastNTError(IN NTSTATUS Status)
Definition: reactos.cpp:166
Status
Definition: gdiplustypes.h:24
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
NTSTATUS NTAPI NtQueryInformationThread(IN HANDLE ThreadHandle, IN THREADINFOCLASS ThreadInformationClass, OUT PVOID ThreadInformation, IN ULONG ThreadInformationLength, OUT PULONG ReturnLength OPTIONAL)
Definition: query.c:2624
#define NULL
Definition: types.h:112
HANDLE hThread
Definition: wizard.c:28

Referenced by child_process(), custom_client_thread(), custom_get_thread_return(), dll_entry_point(), DosStartProcess32(), EndLocalThread(), ExitWindowsWorker(), FinishNotificationThread(), HandleLogoff(), HandleShutdown(), init(), MIDI_mciPlay(), NotifyTopLevelWindow(), pattern_fork(), test_CreateRemoteThread(), test_CreateThread_basic(), test_ExitProcess(), test_ffcnMultipleThreads(), test_GetThreadExitCode(), test_MultiThreadApartment(), test_registered_object_thread_affinity(), test_SetCursor(), test_ShowCursor(), test_SuspendFlag(), test_SuspendThread(), test_TerminateThread(), test_thread_priority(), and TestRecursiveInterThreadMessages().

◆ GetProcessIdOfThread()

DWORD WINAPI GetProcessIdOfThread ( IN HANDLE  Thread)

Definition at line 889 of file thread.c.

890 {
891  THREAD_BASIC_INFORMATION ThreadBasic;
893 
896  &ThreadBasic,
897  sizeof(THREAD_BASIC_INFORMATION),
898  NULL);
899  if (!NT_SUCCESS(Status))
900  {
902  return 0;
903  }
904 
905  return HandleToUlong(ThreadBasic.ClientId.UniqueProcess);
906 }
LONG NTSTATUS
Definition: precomp.h:26
#define HandleToUlong(h)
Definition: basetsd.h:79
HANDLE UniqueProcess
Definition: compat.h:684
DWORD BaseSetLastNTError(IN NTSTATUS Status)
Definition: reactos.cpp:166
Status
Definition: gdiplustypes.h:24
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
_In_opt_ PFILE_OBJECT _In_opt_ PETHREAD Thread
Definition: fltkernel.h:2652
NTSTATUS NTAPI NtQueryInformationThread(IN HANDLE ThreadHandle, IN THREADINFOCLASS ThreadInformationClass, OUT PVOID ThreadInformation, IN ULONG ThreadInformationLength, OUT PULONG ReturnLength OPTIONAL)
Definition: query.c:2624
#define NULL
Definition: types.h:112

◆ GetTeb()

PTEB GetTeb ( VOID  )

Definition at line 438 of file thread.c.

439 {
440  return NtCurrentTeb();
441 }
FORCEINLINE struct _TEB * NtCurrentTeb(VOID)
Definition: psfuncs.h:420

◆ 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 }
#define TRUE
Definition: types.h:120
LONG NTSTATUS
Definition: precomp.h:26
#define FALSE
Definition: types.h:117
DWORD BaseSetLastNTError(IN NTSTATUS Status)
Definition: reactos.cpp:166
Status
Definition: gdiplustypes.h:24
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
HANDLE hThread
Definition: wizard.c:28
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,
921  sizeof(THREAD_BASIC_INFORMATION),
922  NULL);
923  if (!NT_SUCCESS(Status))
924  {
926  return 0;
927  }
928 
929  return HandleToUlong(ThreadBasic.ClientId.UniqueThread);
930 }
LONG NTSTATUS
Definition: precomp.h:26
#define HandleToUlong(h)
Definition: basetsd.h:79
DWORD BaseSetLastNTError(IN NTSTATUS Status)
Definition: reactos.cpp:166
Status
Definition: gdiplustypes.h:24
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
_In_opt_ PFILE_OBJECT _In_opt_ PETHREAD Thread
Definition: fltkernel.h:2652
NTSTATUS NTAPI NtQueryInformationThread(IN HANDLE ThreadHandle, IN THREADINFOCLASS ThreadInformationClass, OUT PVOID ThreadInformation, IN ULONG ThreadInformationLength, OUT PULONG ReturnLength OPTIONAL)
Definition: query.c:2624
HANDLE UniqueThread
Definition: compat.h:685
#define NULL
Definition: types.h:112

Referenced by _tWinMain(), CommonInstall(), CDesktopThread::Destroy(), 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;
1051  NTSTATUS Status;
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 }
#define TRUE
Definition: types.h:120
LONG NTSTATUS
Definition: precomp.h:26
#define FALSE
Definition: types.h:117
DWORD BaseSetLastNTError(IN NTSTATUS Status)
Definition: reactos.cpp:166
Status
Definition: gdiplustypes.h:24
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
NTSTATUS NTAPI NtQueryInformationThread(IN HANDLE ThreadHandle, IN THREADINFOCLASS ThreadInformationClass, OUT PVOID ThreadInformation, IN ULONG ThreadInformationLength, OUT PULONG ReturnLength OPTIONAL)
Definition: query.c:2624
#define NULL
Definition: types.h:112
HANDLE hThread
Definition: wizard.c:28
unsigned int ULONG
Definition: retypes.h:1

◆ 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,
748  sizeof(THREAD_BASIC_INFORMATION),
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" */
766  ThreadBasic.BasePriority = THREAD_PRIORITY_IDLE;
767  }
768 
769  /* Return the final result */
770  return ThreadBasic.BasePriority;
771 }
#define THREAD_PRIORITY_ERROR_RETURN
Definition: winbase.h:279
LONG NTSTATUS
Definition: precomp.h:26
KPRIORITY BasePriority
Definition: compat.h:791
DWORD BaseSetLastNTError(IN NTSTATUS Status)
Definition: reactos.cpp:166
#define HIGH_PRIORITY
Status
Definition: gdiplustypes.h:24
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
NTSTATUS NTAPI NtQueryInformationThread(IN HANDLE ThreadHandle, IN THREADINFOCLASS ThreadInformationClass, OUT PVOID ThreadInformation, IN ULONG ThreadInformationLength, OUT PULONG ReturnLength OPTIONAL)
Definition: query.c:2624
#define THREAD_PRIORITY_TIME_CRITICAL
Definition: winbase.h:278
#define THREAD_PRIORITY_IDLE
Definition: winbase.h:275
#define NULL
Definition: types.h:112
HANDLE hThread
Definition: wizard.c:28

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 
786  &PriorityBoost,
787  sizeof(ULONG),
788  NULL);
789  if (!NT_SUCCESS(Status))
790  {
792  return FALSE;
793  }
794 
795  *pDisablePriorityBoost = PriorityBoost;
796  return TRUE;
797 }
#define TRUE
Definition: types.h:120
LONG NTSTATUS
Definition: precomp.h:26
#define FALSE
Definition: types.h:117
_In_ WDFREQUEST _In_ NTSTATUS _In_ CCHAR PriorityBoost
Definition: wdfrequest.h:1011
DWORD BaseSetLastNTError(IN NTSTATUS Status)
Definition: reactos.cpp:166
Status
Definition: gdiplustypes.h:24
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
NTSTATUS NTAPI NtQueryInformationThread(IN HANDLE ThreadHandle, IN THREADINFOCLASS ThreadInformationClass, OUT PVOID ThreadInformation, IN ULONG ThreadInformationLength, OUT PULONG ReturnLength OPTIONAL)
Definition: query.c:2624
#define NULL
Definition: types.h:112
HANDLE hThread
Definition: wizard.c:28
unsigned int ULONG
Definition: retypes.h:1

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 }
#define TRUE
Definition: types.h:120
LONG NTSTATUS
Definition: precomp.h:26
#define FALSE
Definition: types.h:117
DWORD BaseSetLastNTError(IN NTSTATUS Status)
Definition: reactos.cpp:166
Status
Definition: gdiplustypes.h:24
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
NTSTATUS NTAPI NtQueryInformationThread(IN HANDLE ThreadHandle, IN THREADINFOCLASS ThreadInformationClass, OUT PVOID ThreadInformation, IN ULONG ThreadInformationLength, OUT PULONG ReturnLength OPTIONAL)
Definition: query.c:2624
#define NULL
Definition: types.h:112
HANDLE hThread
Definition: wizard.c:28
#define DPRINT1
Definition: precomp.h:8

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 
479  ThreadTimes,
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 }
struct _FILETIME * LPFILETIME
Definition: time.c:29
#define TRUE
Definition: types.h:120
LONG NTSTATUS
Definition: precomp.h:26
LARGE_INTEGER UserTime
Definition: winternl.h:1063
LARGE_INTEGER ExitTime
Definition: winternl.h:1061
#define FALSE
Definition: types.h:117
DWORD BaseSetLastNTError(IN NTSTATUS Status)
Definition: reactos.cpp:166
Status
Definition: gdiplustypes.h:24
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
LARGE_INTEGER CreateTime
Definition: winternl.h:1060
NTSTATUS NTAPI NtQueryInformationThread(IN HANDLE ThreadHandle, IN THREADINFOCLASS ThreadInformationClass, OUT PVOID ThreadInformation, IN ULONG ThreadInformationLength, OUT PULONG ReturnLength OPTIONAL)
Definition: query.c:2624
#define NULL
Definition: types.h:112
HANDLE hThread
Definition: wizard.c:28
LARGE_INTEGER KernelTime
Definition: winternl.h:1062

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,
417  (bInheritHandle ? OBJ_INHERIT : 0),
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 }
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
Definition: conport.c:35
#define ULongToHandle(h)
Definition: basetsd.h:81
NTSTATUS NTAPI NtOpenThread(OUT PHANDLE ThreadHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, IN PCLIENT_ID ClientId OPTIONAL)
Definition: thread.c:1013
LONG NTSTATUS
Definition: precomp.h:26
HANDLE UniqueProcess
Definition: compat.h:684
static BOOL bInheritHandle
Definition: pipe.c:82
DWORD BaseSetLastNTError(IN NTSTATUS Status)
Definition: reactos.cpp:166
Status
Definition: gdiplustypes.h:24
_Out_ PCLIENT_ID ClientId
Definition: kefuncs.h:1165
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define OBJ_INHERIT
Definition: winternl.h:225
HANDLE UniqueThread
Definition: compat.h:685
DWORD dwThreadId
Definition: fdebug.c:31
#define NULL
Definition: types.h:112
#define InitializeObjectAttributes(p, n, a, r, s)
Definition: reg.c:106

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 }
#define DbgPrint
Definition: hal.h:12
#define TRUE
Definition: types.h:120
LONG NTSTATUS
Definition: precomp.h:26
static HANDLE ULONG_PTR dwData
Definition: file.c:35
NTSTATUS NTAPI NtQueueApcThread(IN HANDLE ThreadHandle, IN PKNORMAL_ROUTINE ApcRoutine, IN PVOID NormalContext, IN PVOID SystemArgument1, IN PVOID SystemArgument2)
Definition: state.c:600
NTSYSAPI NTSTATUS WINAPI RtlQueryInformationActivationContext(ULONG, HANDLE, PVOID, ULONG, PVOID, SIZE_T, SIZE_T *)
Definition: actctx.c:5515
#define FALSE
Definition: types.h:117
DWORD BaseSetLastNTError(IN NTSTATUS Status)
Definition: reactos.cpp:166
Status
Definition: gdiplustypes.h:24
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
VOID NTAPI BaseDispatchApc(IN PAPCFUNC ApcRoutine, IN PVOID Data, IN PACTIVATION_CONTEXT ActivationContext)
Definition: thread.c:92
#define NULL
Definition: types.h:112
HANDLE hThread
Definition: wizard.c:28
#define RTL_QUERY_ACTIVATION_CONTEXT_FLAG_USE_ACTIVE_ACTIVATION_CONTEXT
Definition: rtltypes.h:116
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
VOID(NTAPI * PKNORMAL_ROUTINE)(IN PVOID NormalContext OPTIONAL, IN PVOID SystemArgument1 OPTIONAL, IN PVOID SystemArgument2 OPTIONAL)
Definition: ketypes.h:684
#define __FUNCTION__
Definition: types.h:112

Referenced by async_notifier_proc(), JustDoIt(), CDirectoryWatcher::RequestAddWatcher(), CDirectoryWatcher::RequestAllWatchersTermination(), CDirectoryWatcher::RequestTermination(), 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 {
1080  NTSTATUS Status;
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:1154
#define TRUE
Definition: types.h:120
LONG NTSTATUS
Definition: precomp.h:26
NTSYSAPI NTSTATUS NTAPI RtlQueueWorkItem(_In_ WORKERCALLBACKFUNC Function, _In_opt_ PVOID Context, _In_ ULONG Flags)
#define FALSE
Definition: types.h:117
DWORD BaseSetLastNTError(IN NTSTATUS Status)
Definition: reactos.cpp:166
Status
Definition: gdiplustypes.h:24
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
VOID(NTAPI * WORKERCALLBACKFUNC)(_In_ PVOID Context)
Definition: rtltypes.h:513

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

◆ ResumeThread()

DWORD WINAPI ResumeThread ( IN HANDLE  hThread)

Definition at line 567 of file thread.c.

568 {
569  ULONG PreviousResumeCount;
571 
572  Status = NtResumeThread(hThread, &PreviousResumeCount);
573  if (!NT_SUCCESS(Status))
574  {
576  return -1;
577  }
578 
579  return PreviousResumeCount;
580 }
LONG NTSTATUS
Definition: precomp.h:26
DWORD BaseSetLastNTError(IN NTSTATUS Status)
Definition: reactos.cpp:166
Status
Definition: gdiplustypes.h:24
NTSTATUS NTAPI NtResumeThread(IN HANDLE ThreadHandle, OUT PULONG SuspendCount OPTIONAL)
Definition: state.c:290
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
HANDLE hThread
Definition: wizard.c:28
unsigned int ULONG
Definition: retypes.h:1

Referenced by _beginthread(), cmd_start(), CommandThreadProc(), cordebugprocess_Continue(), CreateProcessAsUserCommon(), CreateSoundThread(), fetch_thread_info(), IDirectPlayLobby3AImpl_RunApplication(), main(), midiStreamRestart(), Netbios(), ProcessDlgProc(), ScmStartUserModeService(), StartStopEnumEventsThread(), test_apc_deadlock(), test_CreateRemoteThread(), test_CreateThread_suspended(), test_end_to_end_server(), test_GetThreadTimes(), test_msg_server(), test_query_process_debug_flags(), test_SuspendFlag(), test_SuspendThread(), test_Toolhelp(), TestRecursiveInterThreadMessages(), Thread1(), and WahOpenHandleHelper().

◆ 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,
674  sizeof(THREAD_BASIC_INFORMATION),
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 }
KAFFINITY AffinityMask
Definition: compat.h:789
LONG NTSTATUS
Definition: precomp.h:26
DWORD BaseSetLastNTError(IN NTSTATUS Status)
Definition: reactos.cpp:166
NTSTATUS NTAPI NtSetInformationThread(IN HANDLE ThreadHandle, IN THREADINFOCLASS ThreadInformationClass, IN PVOID ThreadInformation, IN ULONG ThreadInformationLength)
Definition: query.c:2018
Status
Definition: gdiplustypes.h:24
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
NTSTATUS NTAPI NtQueryInformationThread(IN HANDLE ThreadHandle, IN THREADINFOCLASS ThreadInformationClass, OUT PVOID ThreadInformation, IN ULONG ThreadInformationLength, OUT PULONG ReturnLength OPTIONAL)
Definition: query.c:2624
ULONG_PTR KAFFINITY
Definition: compat.h:85
#define NULL
Definition: types.h:112
HANDLE hThread
Definition: wizard.c:28

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 
526  Status = NtSetContextThread(hThread, (PCONTEXT)lpContext);
527  if (!NT_SUCCESS(Status))
528  {
530  return FALSE;
531  }
532 
533  return TRUE;
534 }
#define TRUE
Definition: types.h:120
LONG NTSTATUS
Definition: precomp.h:26
#define FALSE
Definition: types.h:117
DWORD BaseSetLastNTError(IN NTSTATUS Status)
Definition: reactos.cpp:166
Status
Definition: gdiplustypes.h:24
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
NTSTATUS NTAPI NtSetContextThread(IN HANDLE ThreadHandle, IN PCONTEXT ThreadContext)
Definition: debug.c:387
HANDLE hThread
Definition: wizard.c:28

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 }
LONG NTSTATUS
Definition: precomp.h:26
DWORD BaseSetLastNTError(IN NTSTATUS Status)
Definition: reactos.cpp:166
NTSTATUS NTAPI NtSetInformationThread(IN HANDLE ThreadHandle, IN THREADINFOCLASS ThreadInformationClass, IN PVOID ThreadInformation, IN ULONG ThreadInformationLength)
Definition: query.c:2018
Status
Definition: gdiplustypes.h:24
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
unsigned long DWORD
Definition: ntddk_ex.h:95
HANDLE hThread
Definition: wizard.c:28
unsigned int ULONG
Definition: retypes.h:1

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 */
707  if (Prio == THREAD_PRIORITY_TIME_CRITICAL)
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 }
#define TRUE
Definition: types.h:120
LONG NTSTATUS
Definition: precomp.h:26
#define FALSE
Definition: types.h:117
long LONG
Definition: pedump.c:60
DWORD BaseSetLastNTError(IN NTSTATUS Status)
Definition: reactos.cpp:166
NTSTATUS NTAPI NtSetInformationThread(IN HANDLE ThreadHandle, IN THREADINFOCLASS ThreadInformationClass, IN PVOID ThreadInformation, IN ULONG ThreadInformationLength)
Definition: query.c:2018
#define HIGH_PRIORITY
Status
Definition: gdiplustypes.h:24
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define THREAD_PRIORITY_TIME_CRITICAL
Definition: winbase.h:278
#define THREAD_PRIORITY_IDLE
Definition: winbase.h:275
HANDLE hThread
Definition: wizard.c:28

Referenced by ConsoleControlDispatcher(), ensurePlayerThread(), main(), MCI_SendCommandAsync(), MCIAVI_mciPlay_async(), midiStreamOpen(), mmTaskCreate(), MULTIMEDIA_PlaySound(), Telnet::Open(), OutputQueue_Construct(), 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 
814  &PriorityBoost,
815  sizeof(ULONG));
816  if (!NT_SUCCESS(Status))
817  {
819  return FALSE;
820  }
821 
822  return TRUE;
823 }
#define TRUE
Definition: types.h:120
LONG NTSTATUS
Definition: precomp.h:26
#define FALSE
Definition: types.h:117
_In_ WDFREQUEST _In_ NTSTATUS _In_ CCHAR PriorityBoost
Definition: wdfrequest.h:1011
DWORD BaseSetLastNTError(IN NTSTATUS Status)
Definition: reactos.cpp:166
NTSTATUS NTAPI NtSetInformationThread(IN HANDLE ThreadHandle, IN THREADINFOCLASS ThreadInformationClass, IN PVOID ThreadInformation, IN ULONG ThreadInformationLength)
Definition: query.c:2018
Status
Definition: gdiplustypes.h:24
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
HANDLE hThread
Definition: wizard.c:28
unsigned int ULONG
Definition: retypes.h:1

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 TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
ULONG GuaranteedStackBytes
Definition: winternl.h:279
#define SetLastError(x)
Definition: compat.h:611
IN PFCB IN PFILE_OBJECT FileObject IN ULONG AllocationSize
Definition: fatprocs.h:319
Definition: compat.h:694
FORCEINLINE struct _TEB * NtCurrentTeb(VOID)
Definition: psfuncs.h:420
unsigned int ULONG
Definition: retypes.h:1
#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 }
return STATUS_NOT_SUPPORTED
DWORD BaseSetLastNTError(IN NTSTATUS Status)
Definition: reactos.cpp:166
#define LANGIDFROMLCID(l)
Definition: nls.h:18
FORCEINLINE struct _TEB * NtCurrentTeb(VOID)
Definition: psfuncs.h:420
#define UNIMPLEMENTED
Definition: debug.h:115

◆ 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 }
LONG NTSTATUS
Definition: precomp.h:26
NTSTATUS NTAPI NtSuspendThread(IN HANDLE ThreadHandle, OUT PULONG PreviousSuspendCount OPTIONAL)
Definition: state.c:352
DWORD BaseSetLastNTError(IN NTSTATUS Status)
Definition: reactos.cpp:166
Status
Definition: gdiplustypes.h:24
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
HANDLE hThread
Definition: wizard.c:28
unsigned int ULONG
Definition: retypes.h:1

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 }
#define STATUS_NO_YIELD_PERFORMED
Definition: ntstatus.h:150
NTSTATUS NTAPI NtYieldExecution(VOID)
Definition: thrdschd.c:744

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 TRUE
Definition: types.h:120
#define ERROR_INVALID_HANDLE
Definition: compat.h:98
LONG NTSTATUS
Definition: precomp.h:26
struct _ThreadInfo ThreadInfo
#define FALSE
Definition: types.h:117
DWORD BaseSetLastNTError(IN NTSTATUS Status)
Definition: reactos.cpp:166
Status
Definition: gdiplustypes.h:24
NTSTATUS NtTerminateThread(IN HANDLE ThreadHandle OPTIONAL, IN NTSTATUS ExitStatus)
Definition: kill.c:1282
_Out_ PCLIENT_ID ClientId
Definition: kefuncs.h:1165
#define ASSERT(a)
Definition: mode.c:44
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define SetLastError(x)
Definition: compat.h:611
NTSTATUS NTAPI NtQueryInformationThread(IN HANDLE ThreadHandle, IN THREADINFOCLASS ThreadInformationClass, OUT PVOID ThreadInformation, IN ULONG ThreadInformationLength, OUT PULONG ReturnLength OPTIONAL)
Definition: query.c:2624
HANDLE UniqueThread
Definition: compat.h:685
FORCEINLINE struct _TEB * NtCurrentTeb(VOID)
Definition: psfuncs.h:420
#define NtCurrentPeb()
Definition: FLS.c:22
#define NULL
Definition: types.h:112
HANDLE hThread
Definition: wizard.c:28

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 }
PRTL_BITMAP TlsExpansionBitmap
Definition: winternl.h:346
PPEB Peb
Definition: dllmain.c:27
PPEB ProcessEnvironmentBlock
Definition: ntddk_ex.h:337
#define TLS_EXPANSION_SLOTS
Definition: pstypes.h:310
VOID NTAPI RtlReleasePebLock(VOID)
Definition: libsupp.c:82
NTSYSAPI ULONG WINAPI RtlFindClearBitsAndSet(PRTL_BITMAP, ULONG, ULONG)
DWORD BaseSetLastNTError(IN NTSTATUS Status)
Definition: reactos.cpp:166
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
Definition: heap.c:588
_In_ WDFCOLLECTION _In_ ULONG Index
PVOID TlsBitmap
Definition: ntddk_ex.h:259
NTSYSAPI void WINAPI RtlClearBits(PRTL_BITMAP, ULONG, ULONG)
Definition: compat.h:694
FORCEINLINE struct _TEB * NtCurrentTeb(VOID)
Definition: psfuncs.h:420
#define STATUS_NO_MEMORY
Definition: ntstatus.h:260
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
VOID NTAPI RtlAcquirePebLock(VOID)
Definition: libsupp.c:72
unsigned int ULONG
Definition: retypes.h:1
PVOID TlsSlots[64]
Definition: compat.h:738
PVOID * TlsExpansionSlots
Definition: compat.h:753
#define TLS_MINIMUM_AVAILABLE
Definition: ntddk_ex.h:236

Referenced by __nc_error(), __rpc_createerr(), __rpc_getconfip(), CMenuFocusManager::AcquireManager(), ClientThreadSetupHelper(), COMDLG32_SetCommDlgExtendedError(), DllMain(), get_thread_data(), get_tls_data(), I_CryptAllocTls(), Init(), msvcrt_init_tls(), 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;
1170  ULONG TlsIndex;
1171  PVOID TlsBitmap;
1172  NTSTATUS Status;
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 }
PRTL_BITMAP TlsExpansionBitmap
Definition: winternl.h:346
PPEB Peb
Definition: dllmain.c:27
#define TRUE
Definition: types.h:120
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
#define TLS_EXPANSION_SLOTS
Definition: pstypes.h:310
LONG NTSTATUS
Definition: precomp.h:26
#define NtCurrentThread()
VOID NTAPI RtlReleasePebLock(VOID)
Definition: libsupp.c:82
#define FALSE
Definition: types.h:117
unsigned int BOOL
Definition: ntddk_ex.h:94
DWORD BaseSetLastNTError(IN NTSTATUS Status)
Definition: reactos.cpp:166
NTSTATUS NTAPI NtSetInformationThread(IN HANDLE ThreadHandle, IN THREADINFOCLASS ThreadInformationClass, IN PVOID ThreadInformation, IN ULONG ThreadInformationLength)
Definition: query.c:2018
Status
Definition: gdiplustypes.h:24
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
_In_ WDFCOLLECTION _In_ ULONG Index
unsigned long DWORD
Definition: ntddk_ex.h:95
PVOID TlsBitmap
Definition: ntddk_ex.h:259
#define TlsIndex
Definition: ws2_32p.h:277
NTSYSAPI void WINAPI RtlClearBits(PRTL_BITMAP, ULONG, ULONG)
#define NtCurrentPeb()
Definition: FLS.c:22
VOID NTAPI RtlAcquirePebLock(VOID)
Definition: libsupp.c:72
unsigned int ULONG
Definition: retypes.h:1
#define TLS_MINIMUM_AVAILABLE
Definition: ntddk_ex.h:236
NTSYSAPI BOOLEAN WINAPI RtlAreBitsSet(PCRTL_BITMAP, ULONG, ULONG)

Referenced by Cleanup(), ClientThreadSetupHelper(), DllMain(), Exit(), free_tls_list(), get_thread_data(), get_tls_data(), I_CryptFreeTls(), msvcrt_free_tls(), process_detach(), spy_init(), test_CreateThread_basic(), test_reserved_tls(), test_TLS(), 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 }
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
#define TLS_EXPANSION_SLOTS
Definition: pstypes.h:310
DWORD BaseSetLastNTError(IN NTSTATUS Status)
Definition: reactos.cpp:166
_In_ WDFCOLLECTION _In_ ULONG Index
Definition: compat.h:694
FORCEINLINE struct _TEB * NtCurrentTeb(VOID)
Definition: psfuncs.h:420
#define NULL
Definition: types.h:112
ULONG LastErrorValue
Definition: compat.h:702
PVOID TlsSlots[64]
Definition: compat.h:738
PVOID * TlsExpansionSlots
Definition: compat.h:753
#define TLS_MINIMUM_AVAILABLE
Definition: ntddk_ex.h:236

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(), INTERNET_GetLastError(), INTERNET_GetResponseBuffer(), INTERNET_SetLastError(), INTERNET_WorkerThreadFunc(), InternetGetLastResponseInfoA(), InternetGetLastResponseInfoW(), msvcrt_free_tls_mem(), msvcrt_get_thread_data(), oob_client(), oob_server(), 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 {
1279  DWORD TlsIndex;
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 }
#define TRUE
Definition: types.h:120
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
#define TLS_EXPANSION_SLOTS
Definition: pstypes.h:310
VOID NTAPI RtlReleasePebLock(VOID)
Definition: libsupp.c:82
#define FALSE
Definition: types.h:117
DWORD BaseSetLastNTError(IN NTSTATUS Status)
Definition: reactos.cpp:166
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
Definition: heap.c:588
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
Definition: wdfregistry.h:406
_In_ WDFCOLLECTION _In_ ULONG Index
unsigned long DWORD
Definition: ntddk_ex.h:95
#define TlsIndex
Definition: ws2_32p.h:277
Definition: compat.h:694
FORCEINLINE struct _TEB * NtCurrentTeb(VOID)
Definition: psfuncs.h:420
#define STATUS_NO_MEMORY
Definition: ntstatus.h:260
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
VOID NTAPI RtlAcquirePebLock(VOID)
Definition: libsupp.c:72
PVOID TlsSlots[64]
Definition: compat.h:738
PVOID * TlsExpansionSlots
Definition: compat.h:753
#define TLS_MINIMUM_AVAILABLE
Definition: ntddk_ex.h:236

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(), 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().