Alexandre Julliard : ntdll: Implement RtlSetUnhandledExceptionFilter().

Alexandre Julliard julliard at winehq.org
Tue Oct 9 16:22:47 CDT 2018


Module: wine
Branch: master
Commit: 03e05c1f578a4d4214593c68430082f0c7d6be2e
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=03e05c1f578a4d4214593c68430082f0c7d6be2e

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue Oct  9 14:49:54 2018 +0200

ntdll: Implement RtlSetUnhandledExceptionFilter().

Signed-off-by: Alexandre Julliard <julliard at 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);




More information about the wine-cvs mailing list