41#pragma warning(disable: 4702)
42#pragma warning(disable: 4984)
56 if (parameter->_thread_handle)
61 if (parameter->_module_handle)
75template <
typename ThreadProcedure,
bool Ex>
94 ThreadProcedure
const procedure =
reinterpret_cast<ThreadProcedure
>(
context->_procedure);
120 void*
const procedure,
130 parameter.get()->_procedure =
reinterpret_cast<void*
>(procedure);
131 parameter.get()->_context =
context;
138 GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,
139 reinterpret_cast<LPCWSTR>(procedure),
140 ¶meter.get()->_module_handle);
142 return parameter.detach();
146 _beginthread_proc_type
const procedure,
147 unsigned int const stack_size,
166 thread_start<_beginthread_proc_type, false>,
177 parameter.get()->_thread_handle = thread_handle;
189 return reinterpret_cast<uintptr_t>(thread_handle);
193 void*
const security_descriptor,
194 unsigned int const stack_size,
197 unsigned int const creation_flags,
198 unsigned int*
const thread_id_result
213 thread_start<_beginthreadex_proc_type, true>,
224 if (thread_id_result)
232 return reinterpret_cast<uintptr_t>(thread_handle);
__acrt_ptd *__cdecl __acrt_getptd(void)
void WINAPI __acrt_RoUninitialize(void)
begin_thread_init_policy __cdecl __acrt_get_begin_thread_init_policy(void)
void __cdecl __acrt_errno_map_os_error(unsigned long)
__acrt_ptd *__cdecl __acrt_getptd_noexit(void)
@ begin_thread_init_policy_ro_initialize
#define _VALIDATE_RETURN(expr, errorcode, retexpr)
_ACRTIMP int __cdecl _seh_filter_exe(_In_ unsigned long _ExceptionNum, _In_ struct _EXCEPTION_POINTERS *_ExceptionPtr)
_In_ size_t const _In_ int _In_ bool const _In_ unsigned const _In_ __acrt_rounding_mode const _Inout_ __crt_cached_ptd_host & ptd
#define INVALID_HANDLE_VALUE
BOOL WINAPI GetModuleHandleExW(IN DWORD dwFlags, IN LPCWSTR lpwModuleName OPTIONAL, OUT HMODULE *phModule)
VOID WINAPI FreeLibraryAndExitThread(HMODULE hLibModule, DWORD dwExitCode)
DWORD WINAPI ResumeThread(IN HANDLE hThread)
VOID WINAPI ExitThread(IN DWORD uExitCode)
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)
__crt_unique_heap_ptr< __acrt_thread_parameter, thread_parameter_free_policy > unique_thread_parameter
#define GetExceptionInformation()
#define GetExceptionCode()
unsigned(__stdcall * _beginthreadex_proc_type)(void *)
uintptr_t __cdecl _beginthread(_beginthread_proc_type const procedure, unsigned int const stack_size, void *const context)
static __acrt_thread_parameter *__cdecl create_thread_parameter(void *const procedure, void *const context)
void __cdecl _endthreadex(unsigned int const return_code)
uintptr_t __cdecl _beginthreadex(void *const security_descriptor, unsigned int const stack_size, _beginthreadex_proc_type const procedure, void *const context, unsigned int const creation_flags, unsigned int *const thread_id_result)
void __cdecl _endthread()
static void __cdecl common_end_thread(unsigned int const return_code)
static unsigned long WINAPI thread_start(void *const parameter)
__acrt_thread_parameter * _beginthread_context
bool _initialized_apartment
void operator()(__acrt_thread_parameter *const parameter)
HRESULT WINAPI __acrt_RoInitialize(RO_INIT_TYPE const init_type)
DWORD WINAPI GetLastError(void)