Module: wine Branch: refs/heads/master Commit: ea6f3a4cc0ba4a8e0a30df259052c8bb3e25ba5b URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=ea6f3a4cc0ba4a8e0a30df25...
Author: Robert Shearman rob@codeweavers.com Date: Tue Mar 14 14:35:21 2006 +0000
ntdll: Move the call to MODULE_DllThreadAttach from the kernel32 thread creation function to the NTDLL one.
---
dlls/kernel/thread.c | 2 -- dlls/ntdll/ntdll.spec | 5 ----- dlls/ntdll/ntdll_misc.h | 1 + dlls/ntdll/thread.c | 38 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 39 insertions(+), 7 deletions(-)
diff --git a/dlls/kernel/thread.c b/dlls/kernel/thread.c index 41a8ccf..2d83707 100644 --- a/dlls/kernel/thread.c +++ b/dlls/kernel/thread.c @@ -54,7 +54,6 @@ struct new_thread_info void *arg; };
-extern NTSTATUS MODULE_DllThreadAttach( LPVOID lpReserved ); /* FIXME */
/*********************************************************************** * THREAD_Start @@ -74,7 +73,6 @@ static void CALLBACK THREAD_Start( void
__TRY { - MODULE_DllThreadAttach( NULL ); ExitThread( func( arg ) ); } __EXCEPT(UnhandledExceptionFilter) diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec index 7ccbbfd..b2001ae 100644 --- a/dlls/ntdll/ntdll.spec +++ b/dlls/ntdll/ntdll.spec @@ -1390,8 +1390,3 @@ @ cdecl wine_nt_to_unix_file_name(ptr ptr long long) @ cdecl wine_unix_to_nt_file_name(ptr ptr) @ cdecl __wine_init_windows_dir(wstr wstr) - -################################################################ -# Wine dll separation hacks, these will go away, don't use them -# -@ cdecl MODULE_DllThreadAttach(ptr) diff --git a/dlls/ntdll/ntdll_misc.h b/dlls/ntdll/ntdll_misc.h index c32a246..35cbd5b 100644 --- a/dlls/ntdll/ntdll_misc.h +++ b/dlls/ntdll/ntdll_misc.h @@ -60,6 +60,7 @@ extern void DECLSPEC_NORETURN server_exi extern void DECLSPEC_NORETURN server_abort_thread( int status );
/* module handling */ +extern NTSTATUS MODULE_DllThreadAttach( LPVOID lpReserved ); extern FARPROC RELAY_GetProcAddress( HMODULE module, const IMAGE_EXPORT_DIRECTORY *exports, DWORD exp_size, FARPROC proc, DWORD ordinal, const WCHAR *user ); extern FARPROC SNOOP_GetProcAddress( HMODULE hmod, const IMAGE_EXPORT_DIRECTORY *exports, DWORD exp_size, diff --git a/dlls/ntdll/thread.c b/dlls/ntdll/thread.c index 5bfdcee..6e3d019 100644 --- a/dlls/ntdll/thread.c +++ b/dlls/ntdll/thread.c @@ -39,6 +39,7 @@ #include "wine/pthread.h" #include "wine/debug.h" #include "ntdll_misc.h" +#include "wine/exception.h"
WINE_DEFAULT_DEBUG_CHANNEL(thread);
@@ -273,6 +274,26 @@ HANDLE thread_init(void) return exe_file; }
+typedef ULONG (WINAPI *PUNHANDLED_EXCEPTION_FILTER)(PEXCEPTION_POINTERS); +static PUNHANDLED_EXCEPTION_FILTER get_unhandled_exception_filter(void) +{ + static PUNHANDLED_EXCEPTION_FILTER unhandled_exception_filter; + static const WCHAR kernel32W[] = {'k','e','r','n','e','l','3','2','.','d','l','l',0}; + UNICODE_STRING module_name; + ANSI_STRING func_name; + HMODULE kernel32_handle; + + if (unhandled_exception_filter) return unhandled_exception_filter; + + RtlInitUnicodeString(&module_name, kernel32W); + RtlInitAnsiString( &func_name, "UnhandledExceptionFilter" ); + + if (LdrGetDllHandle( 0, 0, &module_name, &kernel32_handle ) == STATUS_SUCCESS) + LdrGetProcedureAddress( kernel32_handle, &func_name, 0, + (void **)&unhandled_exception_filter ); + + return unhandled_exception_filter; +}
/*********************************************************************** * start_thread @@ -316,6 +337,23 @@ static void start_thread( struct wine_pt InsertHeadList( &tls_links, &teb->TlsLinks ); RtlReleasePebLock();
+ /* NOTE: Windows does not have an exception handler around the call to + * the thread attach. We do for ease of debugging */ + if (get_unhandled_exception_filter()) + { + __TRY + { + MODULE_DllThreadAttach( NULL ); + } + __EXCEPT(get_unhandled_exception_filter()) + { + NtTerminateThread( GetCurrentThread(), GetExceptionCode() ); + } + __ENDTRY + } + else + MODULE_DllThreadAttach( NULL ); + func( arg ); }