Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/ntdll/loader.c | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-)
diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c index abff126832..5c877c2e47 100644 --- a/dlls/ntdll/loader.c +++ b/dlls/ntdll/loader.c @@ -1275,6 +1275,21 @@ static NTSTATUS attach_native_subsystem_dll( WINE_MODREF *wm ) return ret; }
+static void detach_native_subsystem_dll( WINE_MODREF *wm ) +{ + NTSTATUS (WINAPI *unloadfunc)(void); + ANSI_STRING procname; + NTSTATUS ret; + + RtlInitAnsiString( &procname, "DllUnload" ); + if (!LdrGetProcedureAddress( wm->ldr.BaseAddress, &procname, 0, (void **)&unloadfunc)) + { + TRACE_(relay)( "\1Call DllUnload %p\n", unloadfunc ); + ret = unloadfunc(); + TRACE_(relay)( "\1Ret DllUnload %p retval=%08x\n", unloadfunc, ret ); + } +} + /************************************************************************* * process_attach * @@ -1411,6 +1426,7 @@ static void process_detach(void) { PLIST_ENTRY mark, entry; PLDR_MODULE mod; + WINE_MODREF *wm;
mark = &NtCurrentTeb()->Peb->LdrData->InInitializationOrderModuleList; do @@ -1419,6 +1435,8 @@ static void process_detach(void) { mod = CONTAINING_RECORD(entry, LDR_MODULE, InInitializationOrderModuleList); + wm = CONTAINING_RECORD( mod, WINE_MODREF, ldr ); + /* Check whether to detach this DLL */ if ( !(mod->Flags & LDR_PROCESS_ATTACHED) ) continue; @@ -1427,8 +1445,10 @@ static void process_detach(void)
/* Call detach notification */ mod->Flags &= ~LDR_PROCESS_ATTACHED; - MODULE_InitDLL( CONTAINING_RECORD(mod, WINE_MODREF, ldr), - DLL_PROCESS_DETACH, ULongToPtr(process_detaching) ); + if (is_dll_native_subsystem( wm )) + detach_native_subsystem_dll( wm ); + else + MODULE_InitDLL( wm, DLL_PROCESS_DETACH, ULongToPtr(process_detaching) ); call_ldr_notifications( LDR_DLL_NOTIFICATION_REASON_UNLOADED, mod );
/* Restart at head of WINE_MODREF list, as entries might have