Store the list of loaded dlls in the server, and generate debug events
internally.
diff --git a/loader/module.c b/loader/module.c
index dd12615..ea528f4 100644
--- a/loader/module.c
+++ b/loader/module.c
@@ -34,9 +34,10 @@
#include "callback.h"
#include "loadorder.h"
#include "elfdll.h"
+#include "server.h"
-DEFAULT_DEBUG_CHANNEL(module)
-DECLARE_DEBUG_CHANNEL(win32)
+DEFAULT_DEBUG_CHANNEL(module);
+DECLARE_DEBUG_CHANNEL(win32);
/*************************************************************************
* MODULE_WalkModref
@@ -328,29 +329,6 @@
return retval;
}
-/*************************************************************************
- * MODULE_SendLoadDLLEvents
- *
- * Sends DEBUG_DLL_LOAD events for all outstanding modules.
- *
- * NOTE: Assumes that the process critical section is held!
- *
- */
-void MODULE_SendLoadDLLEvents( void )
-{
- WINE_MODREF *wm;
-
- for ( wm = PROCESS_Current()->modref_list; wm; wm = wm->next )
- {
- if ( wm->type != MODULE32_PE ) continue;
- if ( wm == PROCESS_Current()->exe_modref ) continue;
- if ( wm->flags & WINE_MODREF_DEBUG_EVENT_SENT ) continue;
-
- DEBUG_SendLoadDLLEvent( -1 /*FIXME*/, wm->module, &wm->modname );
- wm->flags |= WINE_MODREF_DEBUG_EVENT_SENT;
- }
-}
-
/***********************************************************************
* MODULE_CreateDummyModule
@@ -1352,8 +1330,6 @@
wm = MODULE_LoadLibraryExA( libname, hfile, flags );
if ( wm )
{
- MODULE_SendLoadDLLEvents();
-
if ( !MODULE_DllProcessAttach( wm, NULL ) )
{
WARN_(module)("Attach failed for module '%s', \n", libname);
@@ -1381,7 +1357,7 @@
*/
WINE_MODREF *MODULE_LoadLibraryExA( LPCSTR libname, HFILE hfile, DWORD flags )
{
- DWORD err;
+ DWORD err = GetLastError();
WINE_MODREF *pwm;
int i;
module_loadorder_t *plo;
@@ -1402,26 +1378,27 @@
for(i = 0; i < MODULE_LOADORDER_NTYPES; i++)
{
+ SetLastError( ERROR_FILE_NOT_FOUND );
switch(plo->loadorder[i])
{
case MODULE_LOADORDER_DLL:
TRACE("Trying native dll '%s'\n", libname);
- pwm = PE_LoadLibraryExA(libname, flags, &err);
+ pwm = PE_LoadLibraryExA(libname, flags);
break;
case MODULE_LOADORDER_ELFDLL:
TRACE("Trying elfdll '%s'\n", libname);
- pwm = ELFDLL_LoadLibraryExA(libname, flags, &err);
+ pwm = ELFDLL_LoadLibraryExA(libname, flags);
break;
case MODULE_LOADORDER_SO:
TRACE("Trying so-library '%s'\n", libname);
- pwm = ELF_LoadLibraryExA(libname, flags, &err);
+ pwm = ELF_LoadLibraryExA(libname, flags);
break;
case MODULE_LOADORDER_BI:
TRACE("Trying built-in '%s'\n", libname);
- pwm = BUILTIN32_LoadLibraryExA(libname, flags, &err);
+ pwm = BUILTIN32_LoadLibraryExA(libname, flags);
break;
default:
@@ -1443,16 +1420,15 @@
pwm->refCount++;
LeaveCriticalSection(&PROCESS_Current()->crit_section);
-
+ SetLastError( err ); /* restore last error */
return pwm;
}
- if(err != ERROR_FILE_NOT_FOUND)
+ if(GetLastError() != ERROR_FILE_NOT_FOUND)
break;
}
- WARN("Failed to load module '%s'; error=0x%08lx, \n", libname, err);
- SetLastError(err);
+ WARN("Failed to load module '%s'; error=0x%08lx, \n", libname, GetLastError());
LeaveCriticalSection(&PROCESS_Current()->crit_section);
return NULL;
}
@@ -1610,8 +1586,11 @@
/* Call process detach notifications */
if ( PROCESS_Current()->free_lib_count <= 1 )
{
+ struct unload_dll_request *req = get_req_buffer();
+
MODULE_DllProcessDetach( FALSE, NULL );
- DEBUG_SendUnloadDLLEvent( wm->module );
+ req->base = (void *)wm->module;
+ server_call_noerr( REQ_UNLOAD_DLL );
}
TRACE("END\n");