Module: wine Branch: master Commit: 03e05c1f578a4d4214593c68430082f0c7d6be2e URL: https://source.winehq.org/git/wine.git/?a=commit;h=03e05c1f578a4d4214593c684...
Author: Alexandre Julliard julliard@winehq.org Date: Tue Oct 9 14:49:54 2018 +0200
ntdll: Implement RtlSetUnhandledExceptionFilter().
Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/kernel32/process.c | 1 + dlls/ntdll/exception.c | 11 +++++++++++ dlls/ntdll/loader.c | 3 --- dlls/ntdll/ntdll.spec | 1 + dlls/ntdll/ntdll_misc.h | 2 -- dlls/ntdll/thread.c | 1 - include/winternl.h | 3 +++ 7 files changed, 16 insertions(+), 6 deletions(-)
diff --git a/dlls/kernel32/process.c b/dlls/kernel32/process.c index 5951501..fc065f1 100644 --- a/dlls/kernel32/process.c +++ b/dlls/kernel32/process.c @@ -1364,6 +1364,7 @@ void CDECL __wine_kernel_init(void) setbuf(stderr,NULL); kernel32_handle = GetModuleHandleW(kernel32W); IsWow64Process( GetCurrentProcess(), &is_wow64 ); + RtlSetUnhandledExceptionFilter( UnhandledExceptionFilter );
LOCALE_Init();
diff --git a/dlls/ntdll/exception.c b/dlls/ntdll/exception.c index c1ab96a..59177b7 100644 --- a/dlls/ntdll/exception.c +++ b/dlls/ntdll/exception.c @@ -59,6 +59,8 @@ static RTL_CRITICAL_SECTION_DEBUG critsect_debug = }; static RTL_CRITICAL_SECTION vectored_handlers_section = { &critsect_debug, -1, 0, 0, 0, 0 };
+static PRTL_EXCEPTION_FILTER unhandled_exception_filter; +
static VECTORED_HANDLER *add_vectored_handler( struct list *handler_list, ULONG first, PVECTORED_EXCEPTION_HANDLER func ) @@ -307,6 +309,15 @@ ULONG WINAPI RtlRemoveVectoredExceptionHandler( PVOID handler )
/******************************************************************* + * RtlSetUnhandledExceptionFilter (NTDLL.@) + */ +void WINAPI RtlSetUnhandledExceptionFilter( PRTL_EXCEPTION_FILTER filter ) +{ + unhandled_exception_filter = filter; +} + + +/******************************************************************* * call_unhandled_exception_filter */ LONG WINAPI call_unhandled_exception_filter( PEXCEPTION_POINTERS eptr ) diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c index a66a708..31168c0 100644 --- a/dlls/ntdll/loader.c +++ b/dlls/ntdll/loader.c @@ -3520,9 +3520,6 @@ 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.spec b/dlls/ntdll/ntdll.spec index d1797b3..247f05f 100644 --- a/dlls/ntdll/ntdll.spec +++ b/dlls/ntdll/ntdll.spec @@ -904,6 +904,7 @@ # @ stub RtlSetThreadPoolStartFunc @ stdcall RtlSetTimeZoneInformation(ptr) # @ stub RtlSetTimer +@ stdcall RtlSetUnhandledExceptionFilter(ptr) @ stub RtlSetUnicodeCallouts @ stub RtlSetUserFlagsHeap @ stub RtlSetUserValueHeap diff --git a/dlls/ntdll/ntdll_misc.h b/dlls/ntdll/ntdll_misc.h index 96d9467..f4de3cf 100644 --- a/dlls/ntdll/ntdll_misc.h +++ b/dlls/ntdll/ntdll_misc.h @@ -116,8 +116,6 @@ extern void RELAY_SetupDLL( HMODULE hmod ) DECLSPEC_HIDDEN; extern void SNOOP_SetupDLL( HMODULE hmod ) DECLSPEC_HIDDEN; extern const WCHAR system_dir[] DECLSPEC_HIDDEN;
-typedef LONG (WINAPI *PUNHANDLED_EXCEPTION_FILTER)(PEXCEPTION_POINTERS); -extern PUNHANDLED_EXCEPTION_FILTER unhandled_exception_filter DECLSPEC_HIDDEN; extern void (WINAPI *kernel32_start_process)(LPTHREAD_START_ROUTINE,void*) DECLSPEC_HIDDEN;
/* redefine these to make sure we don't reference kernel symbols */ diff --git a/dlls/ntdll/thread.c b/dlls/ntdll/thread.c index 3019a74..9b23fbf 100644 --- a/dlls/ntdll/thread.c +++ b/dlls/ntdll/thread.c @@ -55,7 +55,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(thread); struct _KUSER_SHARED_DATA *user_shared_data = NULL; static const WCHAR default_windirW[] = {'C',':','\','w','i','n','d','o','w','s',0};
-PUNHANDLED_EXCEPTION_FILTER unhandled_exception_filter = NULL; void (WINAPI *kernel32_start_process)(LPTHREAD_START_ROUTINE,void*) = NULL;
/* info passed to a starting thread */ diff --git a/include/winternl.h b/include/winternl.h index 77c95ec..1cec3cf 100644 --- a/include/winternl.h +++ b/include/winternl.h @@ -2279,6 +2279,8 @@ typedef struct _SYSTEM_MODULE_INFORMATION #define THREAD_CREATE_FLAGS_ACCESS_CHECK_IN_TARGET 0x00000020 #define THREAD_CREATE_FLAGS_INITIAL_THREAD 0x00000080
+typedef LONG (CALLBACK *PRTL_EXCEPTION_FILTER)(PEXCEPTION_POINTERS); + /*********************************************************************** * Function declarations */ @@ -2813,6 +2815,7 @@ NTSYSAPI void WINAPI RtlSetLastWin32ErrorAndNtStatusFromNtStatus(NTSTATUS); NTSYSAPI NTSTATUS WINAPI RtlSetSaclSecurityDescriptor(PSECURITY_DESCRIPTOR,BOOLEAN,PACL,BOOLEAN); NTSYSAPI NTSTATUS WINAPI RtlSetThreadErrorMode(DWORD,LPDWORD); NTSYSAPI NTSTATUS WINAPI RtlSetTimeZoneInformation(const RTL_TIME_ZONE_INFORMATION*); +NTSYSAPI void WINAPI RtlSetUnhandledExceptionFilter(PRTL_EXCEPTION_FILTER); NTSYSAPI SIZE_T WINAPI RtlSizeHeap(HANDLE,ULONG,const void*); NTSYSAPI NTSTATUS WINAPI RtlSleepConditionVariableCS(RTL_CONDITION_VARIABLE*,RTL_CRITICAL_SECTION*,const LARGE_INTEGER*); NTSYSAPI NTSTATUS WINAPI RtlSleepConditionVariableSRW(RTL_CONDITION_VARIABLE*,RTL_SRWLOCK*,const LARGE_INTEGER*,ULONG);