Module: wine Branch: master Commit: 0d9e09d8bf48c3297d1e8d460651deb3bf0e5bdb URL: http://source.winehq.org/git/wine.git/?a=commit;h=0d9e09d8bf48c3297d1e8d4606...
Author: Rob Shearman rob@codeweavers.com Date: Wed Feb 13 12:36:13 2008 +0000
ntdll: Add an exception handler around calls to module entry points.
Change the return value from BOOL to NTSTATUS so that we can return the exception code to the caller.
---
dlls/ntdll/loader.c | 34 +++++++++++++++++++++++----------- 1 files changed, 23 insertions(+), 11 deletions(-)
diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c index 0fbf604..a9b8a5e 100644 --- a/dlls/ntdll/loader.c +++ b/dlls/ntdll/loader.c @@ -876,18 +876,19 @@ static void call_tls_callbacks( HMODULE module, UINT reason ) /************************************************************************* * MODULE_InitDLL */ -static BOOL MODULE_InitDLL( WINE_MODREF *wm, UINT reason, LPVOID lpReserved ) +static NTSTATUS MODULE_InitDLL( WINE_MODREF *wm, UINT reason, LPVOID lpReserved ) { WCHAR mod_name[32]; - BOOL retv = TRUE; + NTSTATUS status = STATUS_SUCCESS; DLLENTRYPROC entry = wm->ldr.EntryPoint; void *module = wm->ldr.BaseAddress; + BOOL retv = TRUE;
/* Skip calls for modules loaded with special load flags */
- if (wm->ldr.Flags & LDR_DONT_RESOLVE_REFS) return TRUE; + if (wm->ldr.Flags & LDR_DONT_RESOLVE_REFS) return STATUS_SUCCESS; if (wm->ldr.TlsIndex != -1) call_tls_callbacks( wm->ldr.BaseAddress, reason ); - if (!entry) return TRUE; + if (!entry) return STATUS_SUCCESS;
if (TRACE_ON(relay)) { @@ -901,7 +902,20 @@ static BOOL MODULE_InitDLL( WINE_MODREF *wm, UINT reason, LPVOID lpReserved ) else TRACE("(%p %s,%s,%p) - CALL\n", module, debugstr_w(wm->ldr.BaseDllName.Buffer), reason_names[reason], lpReserved );
- retv = call_dll_entry_point( entry, module, reason, lpReserved ); + __TRY + { + retv = call_dll_entry_point( entry, module, reason, lpReserved ); + if (!retv) + status = STATUS_DLL_INIT_FAILED; + } + __EXCEPT(NULL) + { + if (TRACE_ON(relay)) + DPRINTF("%04x:exception in PE entry point (proc=%p,module=%p,reason=%s,res=%p)\n", + GetCurrentThreadId(), entry, module, reason_names[reason], lpReserved ); + status = GetExceptionCode(); + } + __ENDTRY
/* The state of the module list may have changed due to the call to the dll. We cannot assume that this module has not been @@ -912,7 +926,7 @@ static BOOL MODULE_InitDLL( WINE_MODREF *wm, UINT reason, LPVOID lpReserved ) reason_names[reason], lpReserved, retv ); else TRACE("(%p,%s,%p) - RETURN %d\n", module, reason_names[reason], lpReserved, retv );
- return retv; + return status; }
@@ -979,16 +993,14 @@ static NTSTATUS process_attach( WINE_MODREF *wm, LPVOID lpReserved ) { WINE_MODREF *prev = current_modref; current_modref = wm; - if (MODULE_InitDLL( wm, DLL_PROCESS_ATTACH, lpReserved )) - { + status = MODULE_InitDLL( wm, DLL_PROCESS_ATTACH, lpReserved ); + if (status == STATUS_SUCCESS) wm->ldr.Flags |= LDR_PROCESS_ATTACHED; - } else { /* point to the name so LdrInitializeThunk can print it */ last_failed_modref = wm; WARN("Initialization of %s failed\n", debugstr_w(wm->ldr.BaseDllName.Buffer)); - status = STATUS_DLL_INIT_FAILED; } current_modref = prev; } @@ -1888,7 +1900,7 @@ static NTSTATUS load_dll( LPCWSTR load_path, LPCWSTR libname, DWORD flags, WINE_ if (nts != STATUS_SUCCESS) nts = load_builtin_dll( load_path, filename, 0, flags, pwm ); if (nts == STATUS_SUCCESS && loadorder == LO_DEFAULT && - !MODULE_InitDLL( *pwm, DLL_WINE_PREATTACH, NULL )) + (MODULE_InitDLL( *pwm, DLL_WINE_PREATTACH, NULL ) != STATUS_SUCCESS)) { /* stub-only dll, try native */ TRACE( "%s pre-attach returned FALSE, preferring native\n", debugstr_w(filename) );