Fix swapped FreeLibary return values. Handle FreeLibrary( 0 ) better.
Fix DLL_PROCESS_DETACH call sequence bugs resulting from nested
FreeLibrary calls.
diff --git a/loader/module.c b/loader/module.c
index 4ea51e0..618ec5e 100644
--- a/loader/module.c
+++ b/loader/module.c
@@ -1529,17 +1529,19 @@
*/
BOOL WINAPI FreeLibrary(HINSTANCE hLibModule)
{
- BOOL retv = TRUE;
+ BOOL retv = FALSE;
WINE_MODREF *wm;
EnterCriticalSection( &PROCESS_Current()->crit_section );
+ PROCESS_Current()->free_lib_count++;
wm = MODULE32_LookupHMODULE( hLibModule );
- if ( !wm )
+ if ( !wm || !hLibModule )
SetLastError( ERROR_INVALID_HANDLE );
else
retv = MODULE_FreeLibrary( wm );
+ PROCESS_Current()->free_lib_count--;
LeaveCriticalSection( &PROCESS_Current()->crit_section );
return retv;
@@ -1588,13 +1590,14 @@
MODULE_DecRefCount( wm );
/* Call process detach notifications */
- MODULE_DllProcessDetach( FALSE, NULL );
+ if ( PROCESS_Current()->free_lib_count <= 1 )
+ MODULE_DllProcessDetach( FALSE, NULL );
MODULE_FlushModrefs();
TRACE_(module)("(%s) - END\n", wm->modname );
- return FALSE;
+ return TRUE;
}