Hallo,
some installer (extracted from slvc009j.zip from Texas instruments (www.ti.com)) loaded the native msi.dll, also I gave WINEDLLOVERRIDES=msi=b on the command line. The program copies some msi.dll to some directory, and prepends that directory to the loadpath. Then it calls: 000d:Call kernel32.LoadLibraryA(010013f8 "msi.dll") ret=01004283
load_dll now does a find_dll_file and sees "L:\temp\IXP000.TMP\msi.dll" . sets filename to "L:\temp\IXP000.TMP\msi.dll" and compares "L:\temp\IXP000.TMP\msi.dll" for the loadorder.
000d:Call ntdll.LdrLoadDll(403dc0e8 L"L:\temp\IXP000.TMP;.;c:\nt4sp5g\system32;c:\nt4sp5g;d:\wine95;d:\ wine95\system;c:\cae\pasic\spde;f:;",00000000,4070f424,4070f404) ret=4052392b trace:module:load_dll looking for L"msi.dll" in L"L:\temp\IXP000.TMP;.;c:\nt4sp5g\system32;c:\nt4sp5g;d:\ \wine95;d:\wine95\system;c:\cae\pasic\spde;f:;" trace:module:MODULE_GetLoadOrderW looking for L"L:\temp\IXP000.TMP\msi.dll" trace:module:open_app_key searching L"L:\temp\IXP000.TMP\msi" in L"Machine\Software\Wine\Wine\Config\A ppDefaults\msiinst.exe\DllOverrides" trace:module:MODULE_GetLoadOrderW got hardcoded path default "n,b" for L"L:\temp\IXP000.TMP\msi.dll" trace:module:load_dll Trying native dll L"L:\temp\IXP000.TMP\msi.dll" trace:module:load_native_dll loading L"L:\temp\IXP000.TMP\msi.dll"
This leads to the native dll getting loaded. Is this the right thing? Shouldn't MODULE_GetLoadOrderW compare for libname and not filename? Only if libname has an explicit path, we should compare for that path.
Bye Index: wine/dlls/ntdll/loader.c =================================================================== RCS file: /home/wine/wine/dlls/ntdll/loader.c,v retrieving revision 1.77 diff -u -w -r1.77 loader.c --- wine/dlls/ntdll/loader.c 15 Sep 2004 18:02:49 -0000 1.77 +++ wine/dlls/ntdll/loader.c 22 Sep 2004 10:08:48 -0000 @@ -1507,7 +1507,7 @@ }
main_exe = get_modref( NtCurrentTeb()->Peb->ImageBaseAddress ); - MODULE_GetLoadOrderW( loadorder, main_exe ? main_exe->ldr.BaseDllName.Buffer : NULL, filename ); + MODULE_GetLoadOrderW( loadorder, main_exe ? main_exe->ldr.BaseDllName.Buffer : NULL, libname );
nts = STATUS_DLL_NOT_FOUND; for (i = 0; i < LOADORDER_NTYPES; i++)
load_dll now does a find_dll_file and sees "L:\temp\IXP000.TMP\msi.dll" . sets filename to "L:\temp\IXP000.TMP\msi.dll" and compares "L:\temp\IXP000.TMP\msi.dll" for the loadorder.
Try using *msi=b in the dll overrides. That makes it apply to any path.
Yes this is very unintuitive, badly documented etc, and I'd prefer the meaning to be inverted. But, that'd break old configs.
"Mike" == Mike Hearn m.hearn@signal.QinetiQ.com writes:
>> load_dll now does a find_dll_file and sees >> "L:\temp\IXP000.TMP\msi.dll" . sets filename to >> "L:\temp\IXP000.TMP\msi.dll" and compares >> "L:\temp\IXP000.TMP\msi.dll" for the loadorder.
Mike> Try using *msi=b in the dll overrides. That makes it apply to any Mike> path.
Mike> Yes this is very unintuitive, badly documented etc, and I'd prefer Mike> the meaning to be inverted. But, that'd break old configs.
That doesn't work for WINEDLLOVERRIDES! get_env_load_order only checks for an exact match.