ReactOS 0.4.16-dev-1505-g12fa72a
thread.c File Reference
#include <stdarg.h>
#include <string.h>
#include <limits.h>
#include "ntstatus.h"
#include "windef.h"
#include "winbase.h"
#include "winnls.h"
#include "winternl.h"
#include "kernelbase.h"
#include "wine/exception.h"
#include "wine/asm.h"
#include "wine/debug.h"
#include "wine/heap.h"
Include dependency graph for thread.c:

Go to the source code of this file.

Classes

struct  fiber_actctx
 
struct  fiber_data
 

Macros

#define WIN32_NO_STATUS
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (thread)
 
static DWORD rtlmode_to_win32mode (DWORD rtlmode)
 
HANDLE WINAPI DECLSPEC_HOTPATCH CreateRemoteThread (HANDLE process, SECURITY_ATTRIBUTES *sa, SIZE_T stack, LPTHREAD_START_ROUTINE start, LPVOID param, DWORD flags, DWORD *id)
 
HANDLE WINAPI DECLSPEC_HOTPATCH CreateRemoteThreadEx (HANDLE process, SECURITY_ATTRIBUTES *sa, SIZE_T stack, LPTHREAD_START_ROUTINE start, LPVOID param, DWORD flags, LPPROC_THREAD_ATTRIBUTE_LIST attributes, DWORD *id)
 
HANDLE WINAPI DECLSPEC_HOTPATCH CreateThread (SECURITY_ATTRIBUTES *sa, SIZE_T stack, LPTHREAD_START_ROUTINE start, LPVOID param, DWORD flags, LPDWORD id)
 
void WINAPI DECLSPEC_HOTPATCH FreeLibraryAndExitThread (HINSTANCE module, DWORD exit_code)
 
void WINAPI DECLSPEC_HOTPATCH GetCurrentThreadStackLimits (ULONG_PTR *low, ULONG_PTR *high)
 
HANDLE WINAPI kernelbase_GetCurrentThread (void)
 
DWORD WINAPI kernelbase_GetCurrentThreadId (void)
 
BOOL WINAPI DECLSPEC_HOTPATCH GetExitCodeThread (HANDLE thread, LPDWORD exit_code)
 
DWORD WINAPI kernelbase_GetLastError (void)
 
DWORD WINAPI DECLSPEC_HOTPATCH GetProcessIdOfThread (HANDLE thread)
 
BOOL WINAPI DECLSPEC_HOTPATCH GetThreadContext (HANDLE thread, CONTEXT *context)
 
DWORD WINAPI DECLSPEC_HOTPATCH GetThreadErrorMode (void)
 
BOOL WINAPI DECLSPEC_HOTPATCH GetThreadGroupAffinity (HANDLE thread, GROUP_AFFINITY *affinity)
 
BOOL WINAPI DECLSPEC_HOTPATCH GetThreadIOPendingFlag (HANDLE thread, PBOOL pending)
 
DWORD WINAPI DECLSPEC_HOTPATCH GetThreadId (HANDLE thread)
 
BOOL WINAPI DECLSPEC_HOTPATCH GetThreadIdealProcessorEx (HANDLE thread, PROCESSOR_NUMBER *ideal)
 
LCID WINAPI GetThreadLocale (void)
 
INT WINAPI DECLSPEC_HOTPATCH GetThreadPriority (HANDLE thread)
 
BOOL WINAPI DECLSPEC_HOTPATCH GetThreadPriorityBoost (HANDLE thread, BOOL *state)
 
BOOL WINAPI DECLSPEC_HOTPATCH GetThreadTimes (HANDLE thread, LPFILETIME creationtime, LPFILETIME exittime, LPFILETIME kerneltime, LPFILETIME usertime)
 
LANGID WINAPI DECLSPEC_HOTPATCH GetThreadUILanguage (void)
 
HANDLE WINAPI DECLSPEC_HOTPATCH OpenThread (DWORD access, BOOL inherit, DWORD id)
 
static void CALLBACK call_user_apc (ULONG_PTR arg1, ULONG_PTR arg2, ULONG_PTR arg3)
 
DWORD WINAPI DECLSPEC_HOTPATCH QueueUserAPC (PAPCFUNC func, HANDLE thread, ULONG_PTR data)
 
BOOL WINAPI DECLSPEC_HOTPATCH QueryThreadCycleTime (HANDLE thread, ULONG64 *cycle)
 
DWORD WINAPI DECLSPEC_HOTPATCH ResumeThread (HANDLE thread)
 
BOOL WINAPI DECLSPEC_HOTPATCH SetThreadContext (HANDLE thread, const CONTEXT *context)
 
HRESULT WINAPI DECLSPEC_HOTPATCH SetThreadDescription (HANDLE thread, PCWSTR description)
 
HRESULT WINAPI DECLSPEC_HOTPATCH GetThreadDescription (HANDLE thread, WCHAR **description)
 
BOOL WINAPI SetThreadErrorMode (DWORD mode, DWORD *old)
 
BOOL WINAPI DECLSPEC_HOTPATCH SetThreadGroupAffinity (HANDLE thread, const GROUP_AFFINITY *new, GROUP_AFFINITY *old)
 
DWORD WINAPI DECLSPEC_HOTPATCH SetThreadIdealProcessor (HANDLE thread, DWORD proc)
 
BOOL WINAPI DECLSPEC_HOTPATCH SetThreadIdealProcessorEx (HANDLE thread, PROCESSOR_NUMBER *ideal, PROCESSOR_NUMBER *previous)
 
BOOL WINAPI DECLSPEC_HOTPATCH SetThreadLocale (LCID lcid)
 
BOOL WINAPI DECLSPEC_HOTPATCH SetThreadPriority (HANDLE thread, INT priority)
 
BOOL WINAPI DECLSPEC_HOTPATCH SetThreadPriorityBoost (HANDLE thread, BOOL disable)
 
BOOL WINAPI DECLSPEC_HOTPATCH SetThreadStackGuarantee (ULONG *size)
 
LANGID WINAPI DECLSPEC_HOTPATCH SetThreadUILanguage (LANGID langid)
 
BOOL WINAPI DECLSPEC_HOTPATCH SetThreadInformation (HANDLE thread, THREAD_INFORMATION_CLASS info_class, VOID *info, DWORD size)
 
DWORD WINAPI DECLSPEC_HOTPATCH SuspendThread (HANDLE thread)
 
BOOL WINAPI DECLSPEC_HOTPATCH SwitchToThread (void)
 
BOOL WINAPI DECLSPEC_HOTPATCH TerminateThread (HANDLE handle, DWORD exit_code)
 
DWORD WINAPI DECLSPEC_HOTPATCH TlsAlloc (void)
 
BOOL WINAPI DECLSPEC_HOTPATCH TlsFree (DWORD index)
 
LPVOID WINAPI DECLSPEC_HOTPATCH TlsGetValue (DWORD index)
 
BOOL WINAPI DECLSPEC_HOTPATCH TlsSetValue (DWORD index, LPVOID value)
 
BOOL WINAPI Wow64GetThreadContext (HANDLE handle, WOW64_CONTEXT *context)
 
BOOL WINAPI Wow64SetThreadContext (HANDLE handle, const WOW64_CONTEXT *context)
 
static void WINAPI switch_fiber (CONTEXT *old, CONTEXT *new)
 
static void CDECL start_fiber (void)
 
static void init_fiber_context (struct fiber_data *fiber)
 
static void move_list (LIST_ENTRY *dest, LIST_ENTRY *src)
 
static void relocate_thread_actctx_stack (ACTIVATION_CONTEXT_STACK *dest)
 
LPVOID WINAPI DECLSPEC_HOTPATCH CreateFiber (SIZE_T stack, LPFIBER_START_ROUTINE start, LPVOID param)
 
LPVOID WINAPI DECLSPEC_HOTPATCH CreateFiberEx (SIZE_T stack_commit, SIZE_T stack_reserve, DWORD flags, LPFIBER_START_ROUTINE start, LPVOID param)
 
BOOL WINAPI DECLSPEC_HOTPATCH ConvertFiberToThread (void)
 
LPVOID WINAPI ConvertThreadToFiber (LPVOID param)
 
LPVOID WINAPI DECLSPEC_HOTPATCH ConvertThreadToFiberEx (LPVOID param, DWORD flags)
 
void WINAPI DECLSPEC_HOTPATCH DeleteFiber (LPVOID fiber_ptr)
 
BOOL WINAPI DECLSPEC_HOTPATCH IsThreadAFiber (void)
 
void WINAPI DECLSPEC_HOTPATCH SwitchToFiber (LPVOID fiber)
 
DWORD WINAPI DECLSPEC_HOTPATCH FlsAlloc (PFLS_CALLBACK_FUNCTION callback)
 
BOOL WINAPI DECLSPEC_HOTPATCH FlsFree (DWORD index)
 
PVOID WINAPI DECLSPEC_HOTPATCH FlsGetValue (DWORD index)
 
BOOL WINAPI DECLSPEC_HOTPATCH FlsSetValue (DWORD index, PVOID data)
 
BOOL WINAPI DECLSPEC_HOTPATCH CallbackMayRunLong (TP_CALLBACK_INSTANCE *instance)
 
PTP_POOL WINAPI DECLSPEC_HOTPATCH CreateThreadpool (void *reserved)
 
PTP_CLEANUP_GROUP WINAPI DECLSPEC_HOTPATCH CreateThreadpoolCleanupGroup (void)
 
static void WINAPI tp_io_callback (TP_CALLBACK_INSTANCE *instance, void *userdata, void *cvalue, IO_STATUS_BLOCK *iosb, TP_IO *io)
 
PTP_IO WINAPI DECLSPEC_HOTPATCH CreateThreadpoolIo (HANDLE handle, PTP_WIN32_IO_CALLBACK callback, PVOID userdata, TP_CALLBACK_ENVIRON *environment)
 
PTP_TIMER WINAPI DECLSPEC_HOTPATCH CreateThreadpoolTimer (PTP_TIMER_CALLBACK callback, PVOID userdata, TP_CALLBACK_ENVIRON *environment)
 
PTP_WAIT WINAPI DECLSPEC_HOTPATCH CreateThreadpoolWait (PTP_WAIT_CALLBACK callback, PVOID userdata, TP_CALLBACK_ENVIRON *environment)
 
PTP_WORK WINAPI DECLSPEC_HOTPATCH CreateThreadpoolWork (PTP_WORK_CALLBACK callback, PVOID userdata, TP_CALLBACK_ENVIRON *environment)
 
BOOL WINAPI DECLSPEC_HOTPATCH TrySubmitThreadpoolCallback (PTP_SIMPLE_CALLBACK callback, PVOID userdata, TP_CALLBACK_ENVIRON *environment)
 
BOOL WINAPI DECLSPEC_HOTPATCH QueueUserWorkItem (LPTHREAD_START_ROUTINE func, PVOID context, ULONG flags)
 
BOOL WINAPI DECLSPEC_HOTPATCH SetThreadpoolStackInformation (PTP_POOL pool, PTP_POOL_STACK_INFORMATION stack_info)
 
BOOL WINAPI DECLSPEC_HOTPATCH QueryThreadpoolStackInformation (PTP_POOL pool, PTP_POOL_STACK_INFORMATION stack_info)
 

Macro Definition Documentation

◆ WIN32_NO_STATUS

#define WIN32_NO_STATUS

Definition at line 26 of file thread.c.

Function Documentation

◆ call_user_apc()

static void CALLBACK call_user_apc ( ULONG_PTR  arg1,
ULONG_PTR  arg2,
ULONG_PTR  arg3 
)
static

Definition at line 363 of file thread.c.

364{
366 func( arg2 );
367}
GLenum func
Definition: glext.h:6028
GLuint GLuint GLuint GLuint arg1
Definition: glext.h:9513
GLuint GLuint GLuint GLuint GLuint GLuint GLuint arg2
Definition: glext.h:9514
void * PAPCFUNC
Definition: mmstream.idl:42

Referenced by QueueUserAPC().

◆ CallbackMayRunLong()

BOOL WINAPI DECLSPEC_HOTPATCH CallbackMayRunLong ( TP_CALLBACK_INSTANCE instance)

Definition at line 1246 of file thread.c.

1247{
1249}
static HINSTANCE instance
Definition: main.c:40
static __inline BOOL set_ntstatus(NTSTATUS status)
Definition: security.c:227
NTSYSAPI NTSTATUS WINAPI TpCallbackMayRunLong(TP_CALLBACK_INSTANCE *)
Definition: threadpool.c:2758

◆ ConvertFiberToThread()

BOOL WINAPI DECLSPEC_HOTPATCH ConvertFiberToThread ( void  )

Definition at line 1084 of file thread.c.

1085{
1086 struct fiber_data *fiber = NtCurrentTeb()->Tib.FiberData;
1087
1088 if (fiber)
1089 {
1090 relocate_thread_actctx_stack( &NtCurrentTeb()->ActivationContextStack );
1091 NtCurrentTeb()->Tib.FiberData = NULL;
1092 HeapFree( GetProcessHeap(), 0, fiber );
1093 }
1094 return TRUE;
1095}
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define GetProcessHeap()
Definition: compat.h:736
#define HeapFree(x, y, z)
Definition: compat.h:735
static void relocate_thread_actctx_stack(ACTIVATION_CONTEXT_STACK *dest)
Definition: thread.c:1019
#define NtCurrentTeb

Referenced by init_funcs().

◆ ConvertThreadToFiber()

LPVOID WINAPI ConvertThreadToFiber ( LPVOID  param)

Definition at line 1101 of file thread.c.

1102{
1103 return ConvertThreadToFiberEx( param, 0 );
1104}
LPVOID WINAPI DECLSPEC_HOTPATCH ConvertThreadToFiberEx(LPVOID param, DWORD flags)
Definition: thread.c:1110
GLfloat param
Definition: glext.h:5796

◆ ConvertThreadToFiberEx()

LPVOID WINAPI DECLSPEC_HOTPATCH ConvertThreadToFiberEx ( LPVOID  param,
DWORD  flags 
)

Definition at line 1110 of file thread.c.

1111{
1112 struct fiber_data *fiber;
1113
1114 if (NtCurrentTeb()->Tib.FiberData)
1115 {
1117 return NULL;
1118 }
1119
1120 if (!(fiber = HeapAlloc( GetProcessHeap(), 0, sizeof(*fiber) )))
1121 {
1123 return NULL;
1124 }
1125 fiber->param = param;
1126 fiber->except = NtCurrentTeb()->Tib.ExceptionList;
1127 fiber->stack_base = NtCurrentTeb()->Tib.StackBase;
1128 fiber->stack_limit = NtCurrentTeb()->Tib.StackLimit;
1129 fiber->stack_allocation = NtCurrentTeb()->DeallocationStack;
1130 fiber->start = NULL;
1131 fiber->flags = flags;
1132 fiber->fls_slots = NtCurrentTeb()->FlsSlots;
1133 relocate_thread_actctx_stack( &fiber->actctx.stack_space );
1134 NtCurrentTeb()->Tib.FiberData = fiber;
1135 return fiber;
1136}
#define ERROR_NOT_ENOUGH_MEMORY
Definition: dderror.h:7
#define SetLastError(x)
Definition: compat.h:752
#define HeapAlloc
Definition: compat.h:733
GLbitfield flags
Definition: glext.h:7161
LPVOID param
Definition: thread.c:808
void * stack_limit
Definition: thread.c:811
DWORD flags
Definition: thread.c:814
void * except
Definition: thread.c:809
LPFIBER_START_ROUTINE start
Definition: thread.c:815
struct fiber_actctx actctx
Definition: thread.c:817
void * fls_slots
Definition: thread.c:816
void * stack_allocation
Definition: thread.c:812
void * stack_base
Definition: thread.c:810
#define ERROR_ALREADY_FIBER
Definition: winerror.h:777

Referenced by ConvertThreadToFiber().

◆ CreateFiber()

LPVOID WINAPI DECLSPEC_HOTPATCH CreateFiber ( SIZE_T  stack,
LPFIBER_START_ROUTINE  start,
LPVOID  param 
)

Definition at line 1040 of file thread.c.

1041{
1042 return CreateFiberEx( stack, 0, 0, start, param );
1043}
LPVOID WINAPI DECLSPEC_HOTPATCH CreateFiberEx(SIZE_T stack_commit, SIZE_T stack_reserve, DWORD flags, LPFIBER_START_ROUTINE start, LPVOID param)
Definition: thread.c:1049
GLuint start
Definition: gl.h:1545
Definition: format.c:80

◆ CreateFiberEx()

LPVOID WINAPI DECLSPEC_HOTPATCH CreateFiberEx ( SIZE_T  stack_commit,
SIZE_T  stack_reserve,
DWORD  flags,
LPFIBER_START_ROUTINE  start,
LPVOID  param 
)

Definition at line 1049 of file thread.c.

1051{
1052 struct fiber_data *fiber;
1054
1055 if (!(fiber = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*fiber) )))
1056 {
1058 return NULL;
1059 }
1060
1061 if (!set_ntstatus( RtlCreateUserStack( stack_commit, stack_reserve, 0, 1, 1, &stack )))
1062 {
1063 HeapFree( GetProcessHeap(), 0, fiber );
1064 return NULL;
1065 }
1066
1067 fiber->stack_allocation = stack.DeallocationStack;
1068 fiber->stack_base = stack.StackBase;
1069 fiber->stack_limit = stack.StackLimit;
1070 fiber->param = param;
1071 fiber->except = (void *)-1;
1072 fiber->start = start;
1073 fiber->flags = flags;
1074 InitializeListHead( &fiber->actctx.stack_space.FrameListCache );
1075 fiber->actctx.stack_ptr = &fiber->actctx.stack_space;
1076 init_fiber_context( fiber );
1077 return fiber;
1078}
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
static void init_fiber_context(struct fiber_data *fiber)
Definition: thread.c:984
#define InitializeListHead(ListHead)
Definition: env_spec_w32.h:944
NTSYSAPI NTSTATUS WINAPI RtlCreateUserStack(SIZE_T, SIZE_T, ULONG, SIZE_T, SIZE_T, INITIAL_TEB *)

Referenced by CreateFiber().

◆ CreateRemoteThread()

HANDLE WINAPI DECLSPEC_HOTPATCH CreateRemoteThread ( HANDLE  process,
SECURITY_ATTRIBUTES sa,
SIZE_T  stack,
LPTHREAD_START_ROUTINE  start,
LPVOID  param,
DWORD  flags,
DWORD id 
)

Definition at line 60 of file thread.c.

63{
65}
static struct sockaddr_in sa
Definition: adnsresfilter.c:69
HANDLE WINAPI DECLSPEC_HOTPATCH CreateRemoteThreadEx(HANDLE process, SECURITY_ATTRIBUTES *sa, SIZE_T stack, LPTHREAD_START_ROUTINE start, LPVOID param, DWORD flags, LPPROC_THREAD_ATTRIBUTE_LIST attributes, DWORD *id)
Definition: thread.c:71

◆ CreateRemoteThreadEx()

HANDLE WINAPI DECLSPEC_HOTPATCH CreateRemoteThreadEx ( HANDLE  process,
SECURITY_ATTRIBUTES sa,
SIZE_T  stack,
LPTHREAD_START_ROUTINE  start,
LPVOID  param,
DWORD  flags,
LPPROC_THREAD_ATTRIBUTE_LIST  attributes,
DWORD id 
)

Definition at line 71 of file thread.c.

75{
78 SIZE_T stack_reserve = 0, stack_commit = 0;
79
80 if (attributes) FIXME("thread attributes ignored\n");
81
82 if (flags & STACK_SIZE_PARAM_IS_A_RESERVATION) stack_reserve = stack;
83 else stack_commit = stack;
84
85 if (!set_ntstatus( RtlCreateUserThread( process, sa ? sa->lpSecurityDescriptor : NULL, TRUE,
86 0, stack_reserve, stack_commit,
88 return 0;
89
90 if (id) *id = HandleToULong( client_id.UniqueThread );
91 if (sa && sa->nLength >= sizeof(*sa) && sa->bInheritHandle)
93 if (!(flags & CREATE_SUSPENDED))
94 {
95 ULONG ret;
96 if (NtResumeThread( handle, &ret ))
97 {
98 NtClose( handle );
100 handle = 0;
101 }
102 }
103 return handle;
104}
#define FIXME(fmt,...)
Definition: precomp.h:53
#define HandleToULong(h)
Definition: basetsd.h:95
BOOL WINAPI SetHandleInformation(IN HANDLE hObject, IN DWORD dwMask, IN DWORD dwFlags)
Definition: handle.c:78
return ret
Definition: mutex.c:146
void(CALLBACK * PRTL_THREAD_START_ROUTINE)(LPVOID)
Definition: winternl.h:3492
NTSYSAPI NTSTATUS NTAPI RtlCreateUserThread(_In_ PVOID ThreadContext, _Out_ HANDLE *OutThreadHandle, _Reserved_ PVOID Reserved1, _Reserved_ PVOID Reserved2, _Reserved_ PVOID Reserved3, _Reserved_ PVOID Reserved4, _Reserved_ PVOID Reserved5, _Reserved_ PVOID Reserved6, _Reserved_ PVOID Reserved7, _Reserved_ PVOID Reserved8)
NTSTATUS NTAPI NtClose(IN HANDLE Handle)
Definition: obhandle.c:3402
NTSTATUS NTAPI NtResumeThread(IN HANDLE ThreadHandle, OUT PULONG SuspendCount OPTIONAL)
Definition: state.c:290
static int client_id
Definition: sock.c:234
ULONG_PTR SIZE_T
Definition: typedefs.h:80
uint32_t ULONG
Definition: typedefs.h:59
#define HANDLE_FLAG_INHERIT
Definition: winbase.h:297
#define STACK_SIZE_PARAM_IS_A_RESERVATION
Definition: winbase.h:230
#define CREATE_SUSPENDED
Definition: winbase.h:188

Referenced by CreateRemoteThread().

◆ CreateThread()

HANDLE WINAPI DECLSPEC_HOTPATCH CreateThread ( SECURITY_ATTRIBUTES sa,
SIZE_T  stack,
LPTHREAD_START_ROUTINE  start,
LPVOID  param,
DWORD  flags,
LPDWORD  id 
)

Definition at line 110 of file thread.c.

113{
115}
#define GetCurrentProcess()
Definition: compat.h:759
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

◆ CreateThreadpool()

PTP_POOL WINAPI DECLSPEC_HOTPATCH CreateThreadpool ( void reserved)

Definition at line 1255 of file thread.c.

1256{
1257 TP_POOL *pool;
1258
1260 return pool;
1261}
r reserved
Definition: btrfs.c:3006
NTSYSAPI NTSTATUS WINAPI TpAllocPool(TP_POOL **, PVOID)
Definition: threadpool.c:2593
struct _TP_POOL TP_POOL
Definition: winnt_old.h:4646

Referenced by init_funcs(), and FxInterruptThreadpool::Initialize().

◆ CreateThreadpoolCleanupGroup()

PTP_CLEANUP_GROUP WINAPI DECLSPEC_HOTPATCH CreateThreadpoolCleanupGroup ( void  )

Definition at line 1267 of file thread.c.

1268{
1270
1271 if (!set_ntstatus( TpAllocCleanupGroup( &group ))) return NULL;
1272 return group;
1273}
GLboolean GLuint group
Definition: glext.h:11120
NTSYSAPI NTSTATUS WINAPI TpAllocCleanupGroup(TP_CLEANUP_GROUP **)
Definition: threadpool.c:2539
struct _TP_CLEANUP_GROUP TP_CLEANUP_GROUP
Definition: winnt_old.h:4676

◆ CreateThreadpoolIo()

PTP_IO WINAPI DECLSPEC_HOTPATCH CreateThreadpoolIo ( HANDLE  handle,
PTP_WIN32_IO_CALLBACK  callback,
PVOID  userdata,
TP_CALLBACK_ENVIRON environment 
)

Definition at line 1286 of file thread.c.

1288{
1289 TP_IO *io;
1290 if (!set_ntstatus( TpAllocIoCompletion( &io, handle, tp_io_callback, userdata, environment ))) return NULL;
1291 *(void **)io = callback; /* ntdll leaves us space to store our callback at the beginning of TP_IO struct */
1292 return io;
1293}
static void WINAPI tp_io_callback(TP_CALLBACK_INSTANCE *instance, void *userdata, void *cvalue, IO_STATUS_BLOCK *iosb, TP_IO *io)
Definition: thread.c:1276
NTSYSAPI NTSTATUS WINAPI TpAllocIoCompletion(TP_IO **, HANDLE, PTP_IO_CALLBACK, void *, TP_CALLBACK_ENVIRON *)
Definition: threadpool.c:2549
static IPrintDialogCallback callback
Definition: printdlg.c:326
static HANDLE PIO_APC_ROUTINE PVOID PIO_STATUS_BLOCK io
Definition: file.c:100
struct _TP_IO TP_IO
Definition: winnt_old.h:4651

Referenced by init_threadpool().

◆ CreateThreadpoolTimer()

PTP_TIMER WINAPI DECLSPEC_HOTPATCH CreateThreadpoolTimer ( PTP_TIMER_CALLBACK  callback,
PVOID  userdata,
TP_CALLBACK_ENVIRON environment 
)

Definition at line 1299 of file thread.c.

1301{
1302 TP_TIMER *timer;
1303
1304 if (!set_ntstatus( TpAllocTimer( &timer, callback, userdata, environment ))) return NULL;
1305 return timer;
1306}
NTSYSAPI NTSTATUS WINAPI TpAllocTimer(TP_TIMER **, PTP_TIMER_CALLBACK, PVOID, TP_CALLBACK_ENVIRON *)
Definition: threadpool.c:2606
struct _TP_TIMER TP_TIMER
Definition: winnt_old.h:4649

Referenced by _MdTimer::Initialize().

◆ CreateThreadpoolWait()

PTP_WAIT WINAPI DECLSPEC_HOTPATCH CreateThreadpoolWait ( PTP_WAIT_CALLBACK  callback,
PVOID  userdata,
TP_CALLBACK_ENVIRON environment 
)

Definition at line 1312 of file thread.c.

1314{
1315 TP_WAIT *wait;
1316
1317 if (!set_ntstatus( TpAllocWait( &wait, callback, userdata, environment ))) return NULL;
1318 return wait;
1319}
NTSYSAPI NTSTATUS WINAPI TpAllocWait(TP_WAIT **, PTP_WAIT_CALLBACK, PVOID, TP_CALLBACK_ENVIRON *)
Definition: threadpool.c:2682
struct _TP_WAIT TP_WAIT
Definition: winnt_old.h:4650

◆ CreateThreadpoolWork()

PTP_WORK WINAPI DECLSPEC_HOTPATCH CreateThreadpoolWork ( PTP_WORK_CALLBACK  callback,
PVOID  userdata,
TP_CALLBACK_ENVIRON environment 
)

Definition at line 1325 of file thread.c.

1327{
1328 TP_WORK *work;
1329
1330 if (!set_ntstatus( TpAllocWork( &work, callback, userdata, environment ))) return NULL;
1331 return work;
1332}
NTSYSAPI NTSTATUS WINAPI TpAllocWork(TP_WORK **, PTP_WORK_CALLBACK, PVOID, TP_CALLBACK_ENVIRON *)
Definition: threadpool.c:2692
struct _TP_WORK TP_WORK
Definition: winnt_old.h:4647

Referenced by init_funcs(), and _MdTimer::Initialize().

◆ DeleteFiber()

void WINAPI DECLSPEC_HOTPATCH DeleteFiber ( LPVOID  fiber_ptr)

Definition at line 1142 of file thread.c.

1143{
1144 struct fiber_data *fiber = fiber_ptr;
1145
1146 if (!fiber) return;
1147 if (fiber == NtCurrentTeb()->Tib.FiberData)
1148 {
1149 relocate_thread_actctx_stack( &NtCurrentTeb()->ActivationContextStack );
1150 HeapFree( GetProcessHeap(), 0, fiber );
1151 RtlExitUserThread( 1 );
1152 }
1154 RtlProcessFlsData( fiber->fls_slots, 3 );
1155 RtlFreeActivationContextStack( &fiber->actctx.stack_space );
1156 HeapFree( GetProcessHeap(), 0, fiber );
1157}
NTSYSAPI void WINAPI RtlFreeUserStack(void *)
NTSYSAPI void WINAPI RtlProcessFlsData(void *, ULONG)
NTSYSAPI void WINAPI RtlFreeActivationContextStack(ACTIVATION_CONTEXT_STACK *)
NTSYSAPI VOID NTAPI RtlExitUserThread(_In_ NTSTATUS Status)

◆ FlsAlloc()

Definition at line 1198 of file thread.c.

1199{
1200 DWORD index;
1201
1203 return index;
1204}
#define index(s, c)
Definition: various.h:29
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint index
Definition: glext.h:6031
NTSYSAPI NTSTATUS WINAPI RtlFlsAlloc(PFLS_CALLBACK_FUNCTION, ULONG *)
#define FLS_OUT_OF_INDEXES
Definition: winbase.h:612

Referenced by init_funcs().

◆ FlsFree()

BOOL WINAPI DECLSPEC_HOTPATCH FlsFree ( DWORD  index)

Definition at line 1210 of file thread.c.

1211{
1212 return set_ntstatus( RtlFlsFree( index ));
1213}
NTSYSAPI NTSTATUS WINAPI RtlFlsFree(ULONG)

Referenced by init_funcs().

◆ FlsGetValue()

PVOID WINAPI DECLSPEC_HOTPATCH FlsGetValue ( DWORD  index)

Definition at line 1219 of file thread.c.

1220{
1221 void *data;
1222
1223 if (!set_ntstatus( RtlFlsGetValue( index, &data ))) return NULL;
1225 return data;
1226}
#define ERROR_SUCCESS
Definition: deptool.c:10
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
NTSYSAPI NTSTATUS WINAPI RtlFlsGetValue(ULONG, void **)

Referenced by init_funcs().

◆ FlsSetValue()

BOOL WINAPI DECLSPEC_HOTPATCH FlsSetValue ( DWORD  index,
PVOID  data 
)

Definition at line 1232 of file thread.c.

1233{
1235}
NTSYSAPI NTSTATUS WINAPI RtlFlsSetValue(ULONG, void *)

Referenced by init_funcs().

◆ FreeLibraryAndExitThread()

void WINAPI DECLSPEC_HOTPATCH FreeLibraryAndExitThread ( HINSTANCE  module,
DWORD  exit_code 
)

Definition at line 121 of file thread.c.

122{
125}
#define FreeLibrary(x)
Definition: compat.h:748
static UINT exit_code
Definition: process.c:78

◆ GetCurrentThreadStackLimits()

void WINAPI DECLSPEC_HOTPATCH GetCurrentThreadStackLimits ( ULONG_PTR low,
ULONG_PTR high 
)

Definition at line 131 of file thread.c.

132{
133 *low = (ULONG_PTR)NtCurrentTeb()->DeallocationStack;
134 *high = (ULONG_PTR)NtCurrentTeb()->Tib.StackBase;
135}
#define ULONG_PTR
Definition: config.h:101

◆ GetExitCodeThread()

BOOL WINAPI DECLSPEC_HOTPATCH GetExitCodeThread ( HANDLE  thread,
LPDWORD  exit_code 
)

Definition at line 159 of file thread.c.

160{
163 &info, sizeof(info), NULL );
164 if (!status && exit_code) *exit_code = info.ExitStatus;
165 return set_ntstatus( status );
166}
LONG NTSTATUS
Definition: precomp.h:26
static HANDLE thread
Definition: service.c:33
@ ThreadBasicInformation
Definition: compat.h:935
NTSTATUS NTAPI NtQueryInformationThread(IN HANDLE ThreadHandle, IN THREADINFOCLASS ThreadInformationClass, OUT PVOID ThreadInformation, IN ULONG ThreadInformationLength, OUT PULONG ReturnLength OPTIONAL)
Definition: query.c:2680
Definition: ps.c:97

◆ GetProcessIdOfThread()

DWORD WINAPI DECLSPEC_HOTPATCH GetProcessIdOfThread ( HANDLE  thread)

Definition at line 181 of file thread.c.

182{
184
186 return 0;
188}
HANDLE UniqueProcess
Definition: compat.h:825

◆ GetThreadContext()

BOOL WINAPI DECLSPEC_HOTPATCH GetThreadContext ( HANDLE  thread,
CONTEXT context 
)

Definition at line 194 of file thread.c.

195{
197}
NTSTATUS NTAPI NtGetContextThread(IN HANDLE ThreadHandle, IN OUT PCONTEXT ThreadContext)
Definition: debug.c:350
Definition: http.c:7252

◆ GetThreadDescription()

HRESULT WINAPI DECLSPEC_HOTPATCH GetThreadDescription ( HANDLE  thread,
WCHAR **  description 
)

Definition at line 435 of file thread.c.

436{
440
441 TRACE( "(%p, %p)\n", thread, description );
442
443 *description = NULL;
444
445 length = 0;
448 return HRESULT_FROM_NT(status);
449
450 if (!(info = heap_alloc( length )))
452
454 if (!status)
455 {
456 if (!(*description = LocalAlloc( 0, info->ThreadName.Length + sizeof(WCHAR))))
458 else
459 {
460 if (info->ThreadName.Length)
461 memcpy(*description, info->ThreadName.Buffer, info->ThreadName.Length);
462 (*description)[info->ThreadName.Length / sizeof(WCHAR)] = 0;
463 }
464 }
465
467
468 return HRESULT_FROM_NT(status);
469}
static void * heap_alloc(size_t len)
Definition: appwiz.h:66
static BOOL heap_free(void *mem)
Definition: appwiz.h:76
#define STATUS_NO_MEMORY
Definition: d3dkmdt.h:51
GLuint GLsizei GLsizei * length
Definition: glext.h:6040
HLOCAL NTAPI LocalAlloc(UINT uFlags, SIZE_T dwBytes)
Definition: heapmem.c:1390
@ ThreadNameInformation
Definition: winternl.h:2319
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define STATUS_BUFFER_TOO_SMALL
Definition: shellext.h:69
#define TRACE(s)
Definition: solgame.cpp:4
const char * description
Definition: directx.c:2497
#define HRESULT_FROM_NT(x)
Definition: winerror.h:94
__wchar_t WCHAR
Definition: xmlstorage.h:180

◆ GetThreadErrorMode()

DWORD WINAPI DECLSPEC_HOTPATCH GetThreadErrorMode ( void  )

Definition at line 203 of file thread.c.

204{
206}
static DWORD rtlmode_to_win32mode(DWORD rtlmode)
Definition: thread.c:46
NTSYSAPI DWORD WINAPI RtlGetThreadErrorMode(void)
Definition: error.c:217

Referenced by init_funcs().

◆ GetThreadGroupAffinity()

BOOL WINAPI DECLSPEC_HOTPATCH GetThreadGroupAffinity ( HANDLE  thread,
GROUP_AFFINITY affinity 
)

Definition at line 212 of file thread.c.

213{
214 if (!affinity)
215 {
217 return FALSE;
218 }
220 affinity, sizeof(*affinity), NULL ));
221}
#define FALSE
Definition: types.h:117
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
@ ThreadGroupInformation
Definition: compat.h:965
KAFFINITY affinity
Definition: wave.h:2

Referenced by init_funcs(), and SetThreadGroupAffinity().

◆ GetThreadId()

DWORD WINAPI DECLSPEC_HOTPATCH GetThreadId ( HANDLE  thread)

Definition at line 237 of file thread.c.

238{
240
242 return 0;
243 return HandleToULong( tbi.ClientId.UniqueThread );
244}
HANDLE UniqueThread
Definition: compat.h:826

◆ GetThreadIdealProcessorEx()

BOOL WINAPI DECLSPEC_HOTPATCH GetThreadIdealProcessorEx ( HANDLE  thread,
PROCESSOR_NUMBER ideal 
)

Definition at line 250 of file thread.c.

251{
252 return set_ntstatus( NtQueryInformationThread( thread, ThreadIdealProcessorEx, ideal, sizeof(*ideal), NULL));
253}
@ ThreadIdealProcessorEx
Definition: compat.h:968

◆ GetThreadIOPendingFlag()

BOOL WINAPI DECLSPEC_HOTPATCH GetThreadIOPendingFlag ( HANDLE  thread,
PBOOL  pending 
)

Definition at line 227 of file thread.c.

228{
230 pending, sizeof(*pending), NULL ));
231}
@ ThreadIsIoPending
Definition: compat.h:951

◆ GetThreadLocale()

LCID WINAPI GetThreadLocale ( void  )

Definition at line 259 of file thread.c.

260{
261 LCID ret = NtCurrentTeb()->CurrentLocale;
262 if (!ret) NtCurrentTeb()->CurrentLocale = ret = GetUserDefaultLCID();
263 return ret;
264}
LCID WINAPI GetUserDefaultLCID(void)
Definition: locale.c:1216
DWORD LCID
Definition: nls.h:13

Referenced by SetThreadLocale().

◆ GetThreadPriority()

INT WINAPI DECLSPEC_HOTPATCH GetThreadPriority ( HANDLE  thread)

Definition at line 270 of file thread.c.

271{
273
275 &info, sizeof(info), NULL )))
277 return info.Priority;
278}
#define THREAD_PRIORITY_ERROR_RETURN
Definition: winbase.h:315

◆ GetThreadPriorityBoost()

BOOL WINAPI DECLSPEC_HOTPATCH GetThreadPriorityBoost ( HANDLE  thread,
BOOL state 
)

Definition at line 284 of file thread.c.

285{
287}
static int state
Definition: maze.c:121
@ ThreadPriorityBoost
Definition: compat.h:949

◆ GetThreadTimes()

BOOL WINAPI DECLSPEC_HOTPATCH GetThreadTimes ( HANDLE  thread,
LPFILETIME  creationtime,
LPFILETIME  exittime,
LPFILETIME  kerneltime,
LPFILETIME  usertime 
)

Definition at line 293 of file thread.c.

295{
297
299 return FALSE;
300
301 if (creationtime)
302 {
303 creationtime->dwLowDateTime = times.CreateTime.u.LowPart;
304 creationtime->dwHighDateTime = times.CreateTime.u.HighPart;
305 }
306 if (exittime)
307 {
308 exittime->dwLowDateTime = times.ExitTime.u.LowPart;
309 exittime->dwHighDateTime = times.ExitTime.u.HighPart;
310 }
311 if (kerneltime)
312 {
313 kerneltime->dwLowDateTime = times.KernelTime.u.LowPart;
314 kerneltime->dwHighDateTime = times.KernelTime.u.HighPart;
315 }
316 if (usertime)
317 {
318 usertime->dwLowDateTime = times.UserTime.u.LowPart;
319 usertime->dwHighDateTime = times.UserTime.u.HighPart;
320 }
321 return TRUE;
322}
@ ThreadTimes
Definition: compat.h:936
static const struct encodedFiletime times[]
Definition: encode.c:556
DWORD dwHighDateTime
Definition: mapidefs.h:66
DWORD dwLowDateTime
Definition: mapidefs.h:65

◆ GetThreadUILanguage()

LANGID WINAPI DECLSPEC_HOTPATCH GetThreadUILanguage ( void  )

Definition at line 328 of file thread.c.

329{
330 LANGID lang;
331
332 FIXME(": stub, returning default language.\n");
334 return lang;
335}
USHORT LANGID
Definition: mui.h:9
NTSTATUS NTAPI NtQueryDefaultUILanguage(OUT LANGID *LanguageId)
Definition: locale.c:645
static const WCHAR lang[]
Definition: wbemdisp.c:287

Referenced by SetThreadUILanguage().

◆ init_fiber_context()

static void init_fiber_context ( struct fiber_data fiber)
static

Definition at line 984 of file thread.c.

985{
986#ifdef __i386__
987 fiber->context.Esp = (ULONG_PTR)fiber->stack_base - 4;
989#elif defined(__arm64ec__)
990 fiber->context.Rsp = (ULONG_PTR)fiber->stack_base;
991 fiber->context.Rip = (ULONG_PTR)start_fiber;
992#elif defined(__x86_64__)
993 fiber->context.Rsp = (ULONG_PTR)fiber->stack_base - 0x28;
994 fiber->context.Rip = (ULONG_PTR)start_fiber;
995#elif defined(__arm__)
996 fiber->context.Sp = (ULONG_PTR)fiber->stack_base;
998#elif defined(__aarch64__)
999 fiber->context.Sp = (ULONG_PTR)fiber->stack_base;
1000 fiber->context.Pc = (ULONG_PTR)start_fiber;
1001#endif
1002}
static void CDECL start_fiber(void)
Definition: thread.c:967
ULONG Esp
Definition: nt_native.h:1479
ULONG Eip
Definition: nt_native.h:1476
ULONG Sp
Definition: ke.h:269
ULONG Pc
Definition: ke.h:271
CONTEXT context
Definition: thread.c:813
uint32_t ULONG_PTR
Definition: typedefs.h:65

Referenced by CreateFiberEx().

◆ IsThreadAFiber()

BOOL WINAPI DECLSPEC_HOTPATCH IsThreadAFiber ( void  )

Definition at line 1163 of file thread.c.

1164{
1165 return NtCurrentTeb()->Tib.FiberData != NULL;
1166}

Referenced by init_funcs().

◆ kernelbase_GetCurrentThread()

HANDLE WINAPI kernelbase_GetCurrentThread ( void  )

Definition at line 141 of file thread.c.

142{
143 return (HANDLE)~(ULONG_PTR)1;
144}

◆ kernelbase_GetCurrentThreadId()

DWORD WINAPI kernelbase_GetCurrentThreadId ( void  )

Definition at line 150 of file thread.c.

151{
153}
_Out_ PCLIENT_ID ClientId
Definition: kefuncs.h:1151

◆ kernelbase_GetLastError()

DWORD WINAPI kernelbase_GetLastError ( void  )

Definition at line 172 of file thread.c.

173{
174 return NtCurrentTeb()->LastErrorValue;
175}

◆ move_list()

static void move_list ( LIST_ENTRY dest,
LIST_ENTRY src 
)
static

Definition at line 1004 of file thread.c.

1005{
1006 LIST_ENTRY *head = src->Flink;
1007 LIST_ENTRY *tail = src->Blink;
1008
1009 if (src != head)
1010 {
1011 dest->Flink = head;
1012 dest->Blink = tail;
1013 head->Blink = dest;
1014 tail->Flink = dest;
1015 }
1016 else InitializeListHead( dest );
1017}
struct outqueuenode * tail
Definition: adnsresfilter.c:66
struct outqueuenode * head
Definition: adnsresfilter.c:66
GLenum src
Definition: glext.h:6340
static char * dest
Definition: rtl.c:135
Definition: typedefs.h:120

◆ OpenThread()

HANDLE WINAPI DECLSPEC_HOTPATCH OpenThread ( DWORD  access,
BOOL  inherit,
DWORD  id 
)

Definition at line 341 of file thread.c.

342{
346
347 attr.Length = sizeof(attr);
348 attr.RootDirectory = 0;
349 attr.Attributes = inherit ? OBJ_INHERIT : 0;
350 attr.ObjectName = NULL;
351 attr.SecurityDescriptor = NULL;
352 attr.SecurityQualityOfService = NULL;
353
354 cid.UniqueProcess = 0;
355 cid.UniqueThread = ULongToHandle( id );
356
357 if (!set_ntstatus( NtOpenThread( &handle, access, &attr, &cid ))) handle = 0;
358 return handle;
359}
#define ULongToHandle(h)
Definition: basetsd.h:81
GLuint GLint GLboolean GLint GLenum access
Definition: glext.h:7866
#define OBJ_INHERIT
Definition: winternl.h:225
static TfClientId cid
NTSTATUS NTAPI NtOpenThread(OUT PHANDLE ThreadHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, IN PCLIENT_ID ClientId OPTIONAL)
Definition: thread.c:1013
Definition: cookie.c:202

◆ QueryThreadCycleTime()

BOOL WINAPI DECLSPEC_HOTPATCH QueryThreadCycleTime ( HANDLE  thread,
ULONG64 cycle 
)

Definition at line 381 of file thread.c.

382{
383 static int once;
384 if (!once++) FIXME( "(%p,%p): stub!\n", thread, cycle );
386 return FALSE;
387}
#define ERROR_CALL_NOT_IMPLEMENTED
Definition: compat.h:102

◆ QueryThreadpoolStackInformation()

BOOL WINAPI DECLSPEC_HOTPATCH QueryThreadpoolStackInformation ( PTP_POOL  pool,
PTP_POOL_STACK_INFORMATION  stack_info 
)

Definition at line 1364 of file thread.c.

1365{
1366 return set_ntstatus( TpQueryPoolStackInformation( pool, stack_info ));
1367}
NTSYSAPI NTSTATUS WINAPI TpQueryPoolStackInformation(TP_POOL *, TP_POOL_STACK_INFORMATION *stack_info)
Definition: threadpool.c:3369

◆ QueueUserAPC()

DWORD WINAPI DECLSPEC_HOTPATCH QueueUserAPC ( PAPCFUNC  func,
HANDLE  thread,
ULONG_PTR  data 
)

Definition at line 372 of file thread.c.

373{
375}
static void CALLBACK call_user_apc(ULONG_PTR arg1, ULONG_PTR arg2, ULONG_PTR arg3)
Definition: thread.c:363
NTSTATUS NTAPI NtQueueApcThread(IN HANDLE ThreadHandle, IN PKNORMAL_ROUTINE ApcRoutine, IN PVOID NormalContext, IN PVOID SystemArgument1, IN PVOID SystemArgument2)
Definition: state.c:600

◆ QueueUserWorkItem()

BOOL WINAPI DECLSPEC_HOTPATCH QueueUserWorkItem ( LPTHREAD_START_ROUTINE  func,
PVOID  context,
ULONG  flags 
)

Definition at line 1348 of file thread.c.

1349{
1351}
NTSYSAPI NTSTATUS NTAPI RtlQueueWorkItem(_In_ WORKERCALLBACKFUNC Function, _In_opt_ PVOID Context, _In_ ULONG Flags)

Referenced by TestProc().

◆ relocate_thread_actctx_stack()

static void relocate_thread_actctx_stack ( ACTIVATION_CONTEXT_STACK dest)
static

Definition at line 1019 of file thread.c.

1020{
1021 ACTIVATION_CONTEXT_STACK *src = NtCurrentTeb()->ActivationContextStackPointer;
1022
1023 C_ASSERT(sizeof(*dest) == sizeof(dest->ActiveFrame) + sizeof(dest->FrameListCache) +
1024 sizeof(dest->Flags) + sizeof(dest->NextCookieSequenceNumber) +
1025 sizeof(dest->StackId));
1026
1027 dest->ActiveFrame = src->ActiveFrame;
1028 move_list( &dest->FrameListCache, &src->FrameListCache );
1029 dest->Flags = src->Flags;
1030 dest->NextCookieSequenceNumber = src->NextCookieSequenceNumber;
1031 dest->StackId = src->StackId;
1032
1033 NtCurrentTeb()->ActivationContextStackPointer = dest;
1034}
static struct @1687 move_list[MOVE_LIST_SIZE]
#define C_ASSERT(e)
Definition: intsafe.h:73

Referenced by ConvertFiberToThread(), ConvertThreadToFiberEx(), and DeleteFiber().

◆ ResumeThread()

DWORD WINAPI DECLSPEC_HOTPATCH ResumeThread ( HANDLE  thread)

Definition at line 393 of file thread.c.

394{
395 DWORD ret;
396
397 if (!set_ntstatus( NtResumeThread( thread, &ret ))) ret = ~0U;
398 return ret;
399}
#define U(x)
Definition: wordpad.c:45

◆ rtlmode_to_win32mode()

static DWORD rtlmode_to_win32mode ( DWORD  rtlmode)
static

Definition at line 46 of file thread.c.

47{
48 DWORD win32mode = 0;
49
50 if (rtlmode & 0x10) win32mode |= SEM_FAILCRITICALERRORS;
51 if (rtlmode & 0x20) win32mode |= SEM_NOGPFAULTERRORBOX;
52 if (rtlmode & 0x40) win32mode |= SEM_NOOPENFILEERRORBOX;
53 return win32mode;
54}
#define SEM_FAILCRITICALERRORS
Definition: rtltypes.h:69
#define SEM_NOGPFAULTERRORBOX
Definition: rtltypes.h:70
#define SEM_NOOPENFILEERRORBOX
Definition: rtltypes.h:72

Referenced by GetThreadErrorMode(), and SetThreadErrorMode().

◆ SetThreadContext()

BOOL WINAPI DECLSPEC_HOTPATCH SetThreadContext ( HANDLE  thread,
const CONTEXT context 
)

Definition at line 405 of file thread.c.

406{
408}
NTSTATUS NTAPI NtSetContextThread(IN HANDLE ThreadHandle, IN PCONTEXT ThreadContext)
Definition: debug.c:387

◆ SetThreadDescription()

HRESULT WINAPI DECLSPEC_HOTPATCH SetThreadDescription ( HANDLE  thread,
PCWSTR  description 
)

Definition at line 414 of file thread.c.

415{
417 int length;
418
419 TRACE( "(%p, %s)\n", thread, debugstr_w( description ));
420
421 length = description ? lstrlenW( description ) * sizeof(WCHAR) : 0;
422
423 if (length > USHRT_MAX)
425
426 info.ThreadName.Length = info.ThreadName.MaximumLength = length;
427 info.ThreadName.Buffer = (WCHAR *)description;
428
430}
#define lstrlenW
Definition: compat.h:750
#define USHRT_MAX
Definition: limits.h:38
#define debugstr_w
Definition: kernel32.h:32
NTSTATUS NTAPI NtSetInformationThread(IN HANDLE ThreadHandle, IN THREADINFOCLASS ThreadInformationClass, IN PVOID ThreadInformation, IN ULONG ThreadInformationLength)
Definition: query.c:2074
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135

◆ SetThreadErrorMode()

BOOL WINAPI SetThreadErrorMode ( DWORD  mode,
DWORD old 
)

Definition at line 474 of file thread.c.

475{
477 DWORD new = 0;
478
480 {
482 return FALSE;
483 }
484
485 if (mode & SEM_FAILCRITICALERRORS) new |= 0x10;
486 if (mode & SEM_NOGPFAULTERRORBOX) new |= 0x20;
487 if (mode & SEM_NOOPENFILEERRORBOX) new |= 0x40;
488
489 status = RtlSetThreadErrorMode( new, old );
490 if (!status && old) *old = rtlmode_to_win32mode( *old );
491 return set_ntstatus( status );
492}
GLenum mode
Definition: glext.h:6217
NTSYSAPI NTSTATUS WINAPI RtlSetThreadErrorMode(DWORD, LPDWORD)

Referenced by init_funcs().

◆ SetThreadGroupAffinity()

BOOL WINAPI DECLSPEC_HOTPATCH SetThreadGroupAffinity ( HANDLE  thread,
const GROUP_AFFINITY new,
GROUP_AFFINITY old 
)

Definition at line 498 of file thread.c.

500{
501 if (old && !GetThreadGroupAffinity( thread, old )) return FALSE;
503}
BOOL WINAPI DECLSPEC_HOTPATCH GetThreadGroupAffinity(HANDLE thread, GROUP_AFFINITY *affinity)
Definition: thread.c:212

Referenced by init_funcs().

◆ SetThreadIdealProcessor()

DWORD WINAPI DECLSPEC_HOTPATCH SetThreadIdealProcessor ( HANDLE  thread,
DWORD  proc 
)

Definition at line 509 of file thread.c.

510{
512
514 if (NT_SUCCESS(status)) return status;
515
517 return ~0u;
518}
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
@ ThreadIdealProcessor
Definition: compat.h:948
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble * u
Definition: glfuncs.h:240
NTSYSAPI ULONG WINAPI RtlNtStatusToDosError(NTSTATUS)
static HANDLE proc()
Definition: pdb.c:34

◆ SetThreadIdealProcessorEx()

BOOL WINAPI DECLSPEC_HOTPATCH SetThreadIdealProcessorEx ( HANDLE  thread,
PROCESSOR_NUMBER ideal,
PROCESSOR_NUMBER previous 
)

Definition at line 524 of file thread.c.

526{
527 FIXME( "(%p %p %p): stub\n", thread, ideal, previous );
529 return FALSE;
530}

◆ SetThreadInformation()

BOOL WINAPI DECLSPEC_HOTPATCH SetThreadInformation ( HANDLE  thread,
THREAD_INFORMATION_CLASS  info_class,
VOID info,
DWORD  size 
)

Definition at line 608 of file thread.c.

610{
611 switch (info_class)
612 {
613 case ThreadMemoryPriority:
615 case ThreadPowerThrottling:
617 default:
618 FIXME("Unsupported class %u.\n", info_class);
619 return FALSE;
620 }
621}
@ ThreadPagePriority
Definition: compat.h:959
GLsizeiptr size
Definition: glext.h:5919
@ ThreadPowerThrottlingState
Definition: winternl.h:2330
static PIO_STATUS_BLOCK void ULONG FS_INFORMATION_CLASS info_class
Definition: pipe.c:76

◆ SetThreadLocale()

BOOL WINAPI DECLSPEC_HOTPATCH SetThreadLocale ( LCID  lcid)

Definition at line 536 of file thread.c.

537{
539 if (lcid != GetThreadLocale())
540 {
542 {
544 return FALSE;
545 }
546 NtCurrentTeb()->CurrentLocale = lcid;
547 }
548 return TRUE;
549}
BOOL WINAPI IsValidLocale(LCID lcid, DWORD flags)
Definition: locale.c:2925
LCID WINAPI ConvertDefaultLocale(LCID lcid)
Definition: locale.c:2879
LCID lcid
Definition: locale.c:5656
LCID WINAPI GetThreadLocale(void)
Definition: thread.c:259
#define LCID_SUPPORTED
Definition: winnls.h:215

◆ SetThreadpoolStackInformation()

BOOL WINAPI DECLSPEC_HOTPATCH SetThreadpoolStackInformation ( PTP_POOL  pool,
PTP_POOL_STACK_INFORMATION  stack_info 
)

Definition at line 1356 of file thread.c.

1357{
1358 return set_ntstatus( TpSetPoolStackInformation( pool, stack_info ));
1359}
NTSYSAPI NTSTATUS WINAPI TpSetPoolStackInformation(TP_POOL *, TP_POOL_STACK_INFORMATION *stack_info)
Definition: threadpool.c:3350

◆ SetThreadPriority()

BOOL WINAPI DECLSPEC_HOTPATCH SetThreadPriority ( HANDLE  thread,
INT  priority 
)

Definition at line 555 of file thread.c.

556{
557 DWORD prio = priority;
558 return set_ntstatus( NtSetInformationThread( thread, ThreadBasePriority, &prio, sizeof(prio) ));
559}
@ ThreadBasePriority
Definition: compat.h:938
static int priority
Definition: timer.c:163

◆ SetThreadPriorityBoost()

BOOL WINAPI DECLSPEC_HOTPATCH SetThreadPriorityBoost ( HANDLE  thread,
BOOL  disable 
)

Definition at line 565 of file thread.c.

566{
568}
int disable
Definition: msacm.c:1365

◆ SetThreadStackGuarantee()

BOOL WINAPI DECLSPEC_HOTPATCH SetThreadStackGuarantee ( ULONG size)

Definition at line 574 of file thread.c.

575{
576 ULONG prev_size = NtCurrentTeb()->GuaranteedStackBytes;
577 ULONG new_size = (*size + 4095) & ~4095;
578
579 /* at least 2 pages on 64-bit */
580 if (sizeof(void *) > sizeof(int) && new_size) new_size = max( new_size, 8192 );
581
582 *size = prev_size;
583 if (new_size >= (char *)NtCurrentTeb()->Tib.StackBase - (char *)NtCurrentTeb()->DeallocationStack)
584 {
586 return FALSE;
587 }
588 if (new_size > prev_size) NtCurrentTeb()->GuaranteedStackBytes = (new_size + 4095) & ~4095;
589 return TRUE;
590}
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
Definition: typeof.h:31
size_t const new_size
Definition: expand.cpp:66
#define max(a, b)
Definition: svc.c:63

◆ SetThreadUILanguage()

LANGID WINAPI DECLSPEC_HOTPATCH SetThreadUILanguage ( LANGID  langid)

Definition at line 596 of file thread.c.

597{
598 TRACE( "(0x%04x) stub - returning success\n", langid );
599
601 return langid;
602}
LANGID WINAPI DECLSPEC_HOTPATCH GetThreadUILanguage(void)
Definition: thread.c:328
LANGID langid
Definition: msctf.idl:626

◆ start_fiber()

static void CDECL start_fiber ( void  )
static

Definition at line 967 of file thread.c.

968{
969 struct fiber_data *fiber = NtCurrentTeb()->Tib.FiberData;
971
972 __TRY
973 {
974 start( fiber->param );
976 }
978 {
980 }
982}
#define __TRY
Definition: compat.h:80
#define __ENDTRY
Definition: compat.h:82
LONG WINAPI UnhandledExceptionFilter(IN PEXCEPTION_POINTERS ExceptionInfo)
Definition: except.c:269
BOOL WINAPI DECLSPEC_HOTPATCH TerminateThread(HANDLE handle, DWORD exit_code)
Definition: thread.c:648
#define __EXCEPT(func)
Definition: exception.h:59
#define GetExceptionCode()
Definition: exception.h:68
HANDLE WINAPI GetCurrentThread(void)
Definition: proc.c:1148
PFIBER_START_ROUTINE LPFIBER_START_ROUTINE
Definition: winbase.h:1483

Referenced by init_fiber_context().

◆ SuspendThread()

DWORD WINAPI DECLSPEC_HOTPATCH SuspendThread ( HANDLE  thread)

Definition at line 627 of file thread.c.

628{
629 DWORD ret;
630
631 if (!set_ntstatus( NtSuspendThread( thread, &ret ))) ret = ~0U;
632 return ret;
633}
NTSTATUS NTAPI NtSuspendThread(IN HANDLE ThreadHandle, OUT PULONG PreviousSuspendCount OPTIONAL)
Definition: state.c:352

◆ switch_fiber()

static void WINAPI switch_fiber ( CONTEXT old,
CONTEXT new 
)
static

Definition at line 959 of file thread.c.

960{
961 FIXME( "not implemented\n" );
963}
NTSYSAPI void WINAPI DbgBreakPoint(void)

Referenced by SwitchToFiber().

◆ SwitchToFiber()

void WINAPI DECLSPEC_HOTPATCH SwitchToFiber ( LPVOID  fiber)

Definition at line 1172 of file thread.c.

1173{
1174 struct fiber_data *new_fiber = fiber;
1175 struct fiber_data *current_fiber = NtCurrentTeb()->Tib.FiberData;
1176
1177 current_fiber->except = NtCurrentTeb()->Tib.ExceptionList;
1178 current_fiber->stack_limit = NtCurrentTeb()->Tib.StackLimit;
1179 current_fiber->fls_slots = NtCurrentTeb()->FlsSlots;
1180 current_fiber->actctx.stack_ptr = NtCurrentTeb()->ActivationContextStackPointer;
1181 /* stack_allocation and stack_base never change */
1182
1183 /* FIXME: should save floating point context if requested in fiber->flags */
1184 NtCurrentTeb()->Tib.FiberData = new_fiber;
1185 NtCurrentTeb()->Tib.ExceptionList = new_fiber->except;
1186 NtCurrentTeb()->Tib.StackBase = new_fiber->stack_base;
1187 NtCurrentTeb()->Tib.StackLimit = new_fiber->stack_limit;
1188 NtCurrentTeb()->DeallocationStack = new_fiber->stack_allocation;
1189 NtCurrentTeb()->FlsSlots = new_fiber->fls_slots;
1190 NtCurrentTeb()->ActivationContextStackPointer = new_fiber->actctx.stack_ptr;
1191 switch_fiber( &current_fiber->context, &new_fiber->context );
1192}
static void WINAPI switch_fiber(CONTEXT *old, CONTEXT *new)
Definition: thread.c:959

Referenced by Fbt_Dispatch(), and init_funcs().

◆ SwitchToThread()

BOOL WINAPI DECLSPEC_HOTPATCH SwitchToThread ( void  )

Definition at line 639 of file thread.c.

640{
642}
NTSYSAPI NTSTATUS WINAPI NtYieldExecution(void)
Definition: thrdschd.c:887
#define STATUS_NO_YIELD_PERFORMED
Definition: ntstatus.h:150

Referenced by _Init_thread_header(), and DoWaitForReaders().

◆ TerminateThread()

BOOL WINAPI DECLSPEC_HOTPATCH TerminateThread ( HANDLE  handle,
DWORD  exit_code 
)

Definition at line 648 of file thread.c.

649{
651}
NTSTATUS NtTerminateThread(IN HANDLE ThreadHandle OPTIONAL, IN NTSTATUS ExitStatus)
Definition: kill.c:1279

◆ TlsAlloc()

Definition at line 657 of file thread.c.

658{
659 DWORD index;
660 PEB * const peb = NtCurrentTeb()->Peb;
661
663 index = RtlFindClearBitsAndSet( peb->TlsBitmap, 1, 1 );
664 if (index != ~0U) NtCurrentTeb()->TlsSlots[index] = 0; /* clear the value */
665 else
666 {
668 if (index != ~0U)
669 {
670 if (!NtCurrentTeb()->TlsExpansionSlots &&
671 !(NtCurrentTeb()->TlsExpansionSlots = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY,
672 8 * sizeof(peb->TlsExpansionBitmapBits) * sizeof(void*) )))
673 {
675 index = ~0U;
677 }
678 else
679 {
680 NtCurrentTeb()->TlsExpansionSlots[index] = 0; /* clear the value */
682 }
683 }
685 }
687 return index;
688}
#define RtlClearBits
Definition: dbgbitmap.h:331
#define RtlFindClearBitsAndSet
Definition: dbgbitmap.h:333
#define ERROR_NO_MORE_ITEMS
Definition: compat.h:105
NTSYSAPI void WINAPI RtlReleasePebLock(void)
Definition: libsupp.c:84
NTSYSAPI void WINAPI RtlAcquirePebLock(void)
Definition: libsupp.c:74
#define TLS_MINIMUM_AVAILABLE
Definition: ntddk_ex.h:236
ULONG TlsExpansionBitmapBits[32]
Definition: winternl.h:539
PVOID TlsBitmap
Definition: ntddk_ex.h:259
PRTL_BITMAP TlsExpansionBitmap
Definition: winternl.h:538

Referenced by __acrt_FlsAlloc(), __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(), UXTHEME_InitSystem(), and wined3d_dll_init().

◆ TlsFree()

BOOL WINAPI DECLSPEC_HOTPATCH TlsFree ( DWORD  index)

Definition at line 694 of file thread.c.

695{
696 BOOL ret;
697
700 {
703 }
704 else
705 {
708 }
712 return ret;
713}
#define RtlAreBitsSet
Definition: dbgbitmap.h:328
@ ThreadZeroTlsCell
Definition: compat.h:945
PPEB Peb
Definition: dllmain.c:27
unsigned int BOOL
Definition: ntddk_ex.h:94

◆ TlsGetValue()

LPVOID WINAPI DECLSPEC_HOTPATCH TlsGetValue ( DWORD  index)

Definition at line 719 of file thread.c.

720{
722 if (index < TLS_MINIMUM_AVAILABLE) return NtCurrentTeb()->TlsSlots[index];
723
725 if (index >= 8 * sizeof(NtCurrentTeb()->Peb->TlsExpansionBitmapBits))
726 {
728 return NULL;
729 }
730 if (!NtCurrentTeb()->TlsExpansionSlots) return NULL;
731 return NtCurrentTeb()->TlsExpansionSlots[index];
732}

◆ TlsSetValue()

BOOL WINAPI DECLSPEC_HOTPATCH TlsSetValue ( DWORD  index,
LPVOID  value 
)

Definition at line 738 of file thread.c.

739{
741 {
742 NtCurrentTeb()->TlsSlots[index] = value;
743 }
744 else
745 {
747 if (index >= 8 * sizeof(NtCurrentTeb()->Peb->TlsExpansionBitmapBits))
748 {
750 return FALSE;
751 }
752 if (!NtCurrentTeb()->TlsExpansionSlots &&
753 !(NtCurrentTeb()->TlsExpansionSlots = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY,
754 8 * sizeof(NtCurrentTeb()->Peb->TlsExpansionBitmapBits) * sizeof(void*) )))
755 {
757 return FALSE;
758 }
759 NtCurrentTeb()->TlsExpansionSlots[index] = value;
760 }
761 return TRUE;
762}
Definition: pdh_main.c:96

◆ tp_io_callback()

static void WINAPI tp_io_callback ( TP_CALLBACK_INSTANCE instance,
void userdata,
void cvalue,
IO_STATUS_BLOCK iosb,
TP_IO io 
)
static

Definition at line 1276 of file thread.c.

1277{
1278 PTP_WIN32_IO_CALLBACK callback = *(void **)io;
1279 callback( instance, userdata, cvalue, RtlNtStatusToDosError( iosb->Status ), iosb->Information, io );
1280}
static PIO_STATUS_BLOCK iosb
Definition: file.c:98
VOID(WINAPI * PTP_WIN32_IO_CALLBACK)(_Inout_ PTP_CALLBACK_INSTANCE Instance, _Inout_opt_ PVOID Context, _Inout_opt_ PVOID Overlapped, _In_ ULONG IoResult, _In_ ULONG_PTR NumberOfBytesTransferred, _Inout_ PTP_IO Io)

Referenced by CreateThreadpoolIo().

◆ TrySubmitThreadpoolCallback()

BOOL WINAPI DECLSPEC_HOTPATCH TrySubmitThreadpoolCallback ( PTP_SIMPLE_CALLBACK  callback,
PVOID  userdata,
TP_CALLBACK_ENVIRON environment 
)

Definition at line 1338 of file thread.c.

1340{
1341 return set_ntstatus( TpSimpleTryPost( callback, userdata, environment ));
1342}
NTSYSAPI NTSTATUS WINAPI TpSimpleTryPost(PTP_SIMPLE_CALLBACK, PVOID, TP_CALLBACK_ENVIRON *)
Definition: threadpool.c:3248

Referenced by cache_connection(), netconn_resolve(), queue_task(), and winhttp_request_Send().

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( thread  )

◆ Wow64GetThreadContext()

BOOL WINAPI Wow64GetThreadContext ( HANDLE  handle,
WOW64_CONTEXT context 
)

Definition at line 768 of file thread.c.

769{
770#ifdef __i386__
772#elif defined(__x86_64__)
773 return set_ntstatus( RtlWow64GetThreadContext( handle, context ));
774#else
776#endif
777}
#define STATUS_NOT_IMPLEMENTED
Definition: d3dkmdt.h:42

◆ Wow64SetThreadContext()

BOOL WINAPI Wow64SetThreadContext ( HANDLE  handle,
const WOW64_CONTEXT context 
)

Definition at line 783 of file thread.c.

784{
785#ifdef __i386__
787#elif defined(__x86_64__)
788 return set_ntstatus( RtlWow64SetThreadContext( handle, context ));
789#else
791#endif
792}