Hi,
The loader seems to have a problem with extra backslashes in module pathnames.
If "c:\\windows\\system\\ole32.dll" is loaded and unloaded, then "c:\\windows\\system\\\\ole32.dll" is loaded, there will be trouble, as the loader does not recognise these two as the same module, yet dlopen does.
This patch works around the problem. Can anybody think of a better fix?
Mike
ChangeLog: * don't differenciate between module pathes names with extra slashes
Index: dlls/ntdll/loader.c =================================================================== RCS file: /home/wine/wine/dlls/ntdll/loader.c,v retrieving revision 1.29 diff -u -r1.29 loader.c --- dlls/ntdll/loader.c 27 Jun 2003 04:06:23 -0000 1.29 +++ dlls/ntdll/loader.c 28 Jun 2003 15:22:35 -0000 @@ -951,7 +951,7 @@ * init function into load_library). * allocated_libdir is TRUE in the stack frame that allocated libdir */ -static NTSTATUS load_dll( LPCSTR libname, DWORD flags, WINE_MODREF** pwm ) +static NTSTATUS do_load_dll( LPCSTR libname, DWORD flags, WINE_MODREF** pwm ) { int i; enum loadorder_type loadorder[LOADORDER_NTYPES]; @@ -1101,6 +1101,33 @@ WARN("Failed to load module '%s'; status=%ld\n", filename, nts); RtlFreeHeap( ntdll_get_process_heap(), 0, filename ); return nts; +} + +/* clean the path before loading the dll */ +static NTSTATUS load_dll( LPCSTR libname, DWORD flags, WINE_MODREF** pwm ) +{ + LPCSTR szLibName; + NTSTATUS r; + UINT i,j; + + szLibName = RtlAllocateHeap( ntdll_get_process_heap(), + 0, strlen( libname) + 1 ); + if ( !szLibName ) return STATUS_NO_MEMORY; + + /* remove duplicate backslashes from the path */ + for( i=0,j=0; libname[i]; i++) + { + if ( ( libname[i] == '\\' ) && j && ( szLibName[j-1] == '\\' ) ) + continue; + szLibName[j++] = libname[i]; + } + szLibName[j] = 0; + + r = do_load_dll( szLibName, flags, pwm ); + + RtlFreeHeap( ntdll_get_process_heap(), 0, szLibName ); + + return r; } /******************************************************************