Module: wine Branch: master Commit: 78fba54ab791f8ed6d68305869b18403d08011e0 URL: http://source.winehq.org/git/wine.git/?a=commit;h=78fba54ab791f8ed6d68305869...
Author: Alexandre Julliard julliard@winehq.org Date: Tue Feb 12 22:39:19 2008 +0100
ntdll: Store the unhandled exception filter at startup to avoid race conditions.
---
dlls/ntdll/loader.c | 3 +++ dlls/ntdll/ntdll_misc.h | 3 +++ dlls/ntdll/thread.c | 27 ++++----------------------- 3 files changed, 10 insertions(+), 23 deletions(-)
diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c index 05538a0..0fbf604 100644 --- a/dlls/ntdll/loader.c +++ b/dlls/ntdll/loader.c @@ -2533,6 +2533,9 @@ void __wine_process_init(void) MESSAGE( "wine: could not load kernel32.dll, status %x\n", status ); exit(1); } + RtlInitAnsiString( &func_name, "UnhandledExceptionFilter" ); + LdrGetProcedureAddress( wm->ldr.BaseAddress, &func_name, 0, (void **)&unhandled_exception_filter ); + RtlInitAnsiString( &func_name, "__wine_kernel_init" ); if ((status = LdrGetProcedureAddress( wm->ldr.BaseAddress, &func_name, 0, (void **)&init_func )) != STATUS_SUCCESS) diff --git a/dlls/ntdll/ntdll_misc.h b/dlls/ntdll/ntdll_misc.h index c283e1e..8c04557 100644 --- a/dlls/ntdll/ntdll_misc.h +++ b/dlls/ntdll/ntdll_misc.h @@ -94,6 +94,9 @@ extern void SNOOP_SetupDLL( HMODULE hmod ); extern UNICODE_STRING windows_dir; extern UNICODE_STRING system_dir;
+typedef LONG (WINAPI *PUNHANDLED_EXCEPTION_FILTER)(PEXCEPTION_POINTERS); +extern PUNHANDLED_EXCEPTION_FILTER unhandled_exception_filter; + /* redefine these to make sure we don't reference kernel symbols */ #define GetProcessHeap() (NtCurrentTeb()->Peb->ProcessHeap) #define GetCurrentProcessId() (HandleToULong(NtCurrentTeb()->ClientId.UniqueProcess)) diff --git a/dlls/ntdll/thread.c b/dlls/ntdll/thread.c index 8944b6a..55cedc7 100644 --- a/dlls/ntdll/thread.c +++ b/dlls/ntdll/thread.c @@ -48,6 +48,8 @@ WINE_DECLARE_DEBUG_CHANNEL(relay);
struct _KUSER_SHARED_DATA *user_shared_data = NULL;
+PUNHANDLED_EXCEPTION_FILTER unhandled_exception_filter = NULL; + /* info passed to a starting thread */ struct startup_info { @@ -339,27 +341,6 @@ HANDLE thread_init(void) return exe_file; }
-typedef LONG (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; -} - #ifdef __i386__ /* wrapper for apps that don't declare the thread function correctly */ extern DWORD call_thread_entry_point( PRTL_THREAD_START_ROUTINE entry, void *arg ); @@ -465,13 +446,13 @@ static void start_thread( struct wine_pthread_thread_info *info )
/* 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()) + if (unhandled_exception_filter) { __TRY { call_thread_func( func, arg ); } - __EXCEPT(get_unhandled_exception_filter()) + __EXCEPT(unhandled_exception_filter) { NtTerminateThread( GetCurrentThread(), GetExceptionCode() ); }