LoadLibrary during PROCESS_ATTACH

Uwe Bonnes bon at elektron.ikp.physik.tu-darmstadt.de
Wed Oct 9 03:26:20 CDT 2002


>>>>> "Alexandre" == Alexandre Julliard <julliard at winehq.com> writes:

    Alexandre> Uwe Bonnes <bon at elektron.ikp.physik.tu-darmstadt.de> writes:
    >> This seems to happen, because during MODULE_InitDLL of the dll it
    >> calls a Loadlibrary on itself. As MODULE_InitDLL sets
    >> WINE_MODREF_MARKER, and the flow of execution in LoadLibrary checks
    >> for WINE_MODREF_MARKER before incrementing the RefCount, the refcount
    >> gets wrong and the application unloaded. Forcing the increment of
    >> RefCount in MODULE_LoadLibraryExA unconditional of WINE_MODREF_MARKER
    >> makes the application continue.
    >> 
    >> Do we need the check for WINE_MODREF_MARKER in MODULE_LoadLibraryEx?

    Alexandre> Yes, this is needed for circular dependencies. But maybe we
    Alexandre> need to differentiate an explicit LoadLibrary from the
    Alexandre> implicit loading of dependencies.

Is appended patch appropriate? 

If it finds WINE_MODREF_MARKER set in LoadLibraryEx, it corrects the
Refcount and it allows decrementing the Refcounter to 1 (but not to 0) in
MODULE_DecRefCount. At least xilinx webpack ise.exe now comes over thw first
hurdle.

Changelog:
	wine/loader/module.c: LoadLibraryExA, MODULE_DecRefCount 
	Handle Refcounting for LoadLibrary/FreeLibrary Calls 
	during MODULE_DllProcessAttach
-- 
Uwe Bonnes                bon at elektron.ikp.physik.tu-darmstadt.de

Institut fuer Kernphysik  Schlossgartenstrasse 9  64289 Darmstadt
--------- Tel. 06151 162516 -------- Fax. 06151 164321 ----------
Index: wine/loader/module.c
===================================================================
RCS file: /home/wine/wine/loader/module.c,v
retrieving revision 1.165
diff -u -w -r1.165 module.c
--- wine/loader/module.c	24 Sep 2002 18:29:39 -0000	1.165
+++ wine/loader/module.c	9 Oct 2002 08:18:19 -0000
@@ -1134,6 +1134,10 @@
 			SetLastError(ERROR_DLL_INIT_FAILED);
 			wm = NULL;
 		}
+		if(wm->flags & WINE_MODREF_MARKER)
+		  /* Loadlibrary was called during MODULE_DllProcessAttach
+		     We need to correct the refcount */
+		  wm->refCount++;
 	}
 
         RtlLeaveCriticalSection( &loader_section );
@@ -1470,7 +1474,9 @@
 {
     int i;
 
-    if ( wm->flags & WINE_MODREF_MARKER )
+    if (( wm->flags & WINE_MODREF_MARKER ) && (wm->refCount <2))
+      /* Inhibit unloading during MODULE_DllProcessAttach but expect a FreeLibrary call
+	 during MODULE_DllProcessAttach */
         return;
 
     if ( wm->refCount <= 0 )



More information about the wine-devel mailing list