From: Billy Laws blaws05@gmail.com
The native arch kernel32.dll isn't loaded in WOW64 mode, but threads can still be created if the SKIP_LOADER_INIT flag is set, provide a default implementation to support this. --- dlls/ntdll/loader.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c index c20d6a5d87b..5859d1e5a74 100644 --- a/dlls/ntdll/loader.c +++ b/dlls/ntdll/loader.c @@ -69,7 +69,8 @@ static const WCHAR pe_dir[] = L""; typedef DWORD (CALLBACK *DLLENTRYPROC)(HMODULE,DWORD,LPVOID); typedef void (CALLBACK *LDRENUMPROC)(LDR_DATA_TABLE_ENTRY *, void *, BOOLEAN *);
-void (FASTCALL *pBaseThreadInitThunk)(DWORD,LPTHREAD_START_ROUTINE,void *) = NULL; +static void __fastcall default_thread_init_func( DWORD unknown, LPTHREAD_START_ROUTINE entry, void *arg ); +void (FASTCALL *pBaseThreadInitThunk)(DWORD,LPTHREAD_START_ROUTINE,void *) = default_thread_init_func; NTSTATUS (WINAPI *__wine_unix_call_dispatcher)( unixlib_handle_t, unsigned int, void * ) = NULL;
static DWORD (WINAPI *pCtrlRoutine)(void *); @@ -220,6 +221,11 @@ static RTL_UNLOAD_EVENT_TRACE unload_traces[RTL_UNLOAD_EVENT_TRACE_NUMBER]; static RTL_UNLOAD_EVENT_TRACE *unload_trace_ptr; static unsigned int unload_trace_seq;
+static void __fastcall default_thread_init_func( DWORD unknown, LPTHREAD_START_ROUTINE entry, void *arg ) +{ + RtlExitUserThread( entry( arg ) ); +} + static void module_push_unload_trace( const WINE_MODREF *wm ) { RTL_UNLOAD_EVENT_TRACE *ptr = &unload_traces[unload_trace_seq];