Le mer 23/10/2002 à 15:23, Stefan Leichter a écrit : > Hello, > > i am currently tracking down a problem with a program (Nokia PC Suite 4; > NclConf.exe) that is unable to start its control panel application. The control > panel application should be started by the rundll32.exe. It does not get > started because of the path in the filename. The applet is searched in the > correct directory but it does not get found because the path was not stripped > from the filename. So a filename with path is compared to the filename without > path read from the directoy. This will never match. I have attached a logfile > with the relevant line (i hope). Will please someone be so kind and look at it > and tell me what ithe reason for the problem is. > > Thanks Stefan > > >-------------------------------------------------------------------------------------------------------------------------- > 0831f930:Call shell32.Control_RunDLL(00020025,00400000,40370bb5,0000000a) >ret=00401380 > 0831f930:Call kernel32.LoadLibraryA(403d0028 "\"C:\\Programme\\Gemeinsame >Dateien\\Nokia\\NCLTools\\NclConf.cpl\"") ret=409bb0f4 > trace:dosfs:DOSFS_GetFullName L"\"C:\\Programme\\Gemeinsame >Dateien\\Nokia\\NCLTools\\NclConf.cpl\"" (last=1) > trace:string:lstrcpynA (0x406d1c50, "/wine_app/wine_app", 1024) > trace:string:lstrcpynA (0x406d1c63, "Programme/Gemeinsame Dateien/Nokia/NCLTools", >1005) > trace:string:lstrcpynW (0x406d2056, L"PROG~1F2\\GEME~SR3\\NOKIA\\NCLTOOLS", 1021) > trace:dosfs:DOSFS_FindUnixName /wine_app/wine_app/Programme/Gemeinsame >Dateien/Nokia/NCLTools,L"\"C:\\Programme\\Gemeinsame >Dateien\\Nokia\\NCLTools\\NclConf.cpl\"" > trace:dosfs:DOSFS_ToDosFCBFormat (L"\"C:\\Programme\\Gemeinsame >Dateien\\Nokia\\NCLTools\\NclConf.cpl\"", 0x406d1b78) > trace:dosfs:DOSFS_OpenDir "/wine_app/wine_app/Programme/Gemeinsame >Dateien/Nokia/NCLTools" > trace:dosfs:DOSFS_ReadDir Read: long_name: L".", short_name: (null) > trace:dosfs:DOSFS_FindUnixName L"\"C:\\Programme\\Gemeinsame >Dateien\\Nokia\\NCLTools\\NclConf.cpl\"" -- L"." > trace:dosfs:DOSFS_ReadDir Read: long_name: L"..", short_name: (null) > trace:dosfs:DOSFS_FindUnixName L"\"C:\\Programme\\Gemeinsame >Dateien\\Nokia\\NCLTools\\NclConf.cpl\"" -- L".." > trace:dosfs:DOSFS_ReadDir Read: long_name: L"NCLCONF_I.HLP", short_name: (null) > trace:dosfs:DOSFS_FindUnixName L"\"C:\\Programme\\Gemeinsame >Dateien\\Nokia\\NCLTools\\NclConf.cpl\"" -- L"NCLCONF_I.HLP" > trace:dosfs:DOSFS_ReadDir Read: long_name: L"NCLCONF_D.HLP", short_name: (null) > trace:dosfs:DOSFS_FindUnixName L"\"C:\\Programme\\Gemeinsame >Dateien\\Nokia\\NCLTools\\NclConf.cpl\"" -- L"NCLCONF_D.HLP" > trace:dosfs:DOSFS_ReadDir Read: long_name: L"NCLCONF_E.HLP", short_name: (null) > trace:dosfs:DOSFS_FindUnixName L"\"C:\\Programme\\Gemeinsame >Dateien\\Nokia\\NCLTools\\NclConf.cpl\"" -- L"NCLCONF_E.HLP" > trace:dosfs:DOSFS_ReadDir Read: long_name: L"NCLCONF_F.HLP", short_name: (null) > trace:dosfs:DOSFS_FindUnixName L"\"C:\\Programme\\Gemeinsame >Dateien\\Nokia\\NCLTools\\NclConf.cpl\"" -- L"NCLCONF_F.HLP" > trace:dosfs:DOSFS_ReadDir Read: long_name: L"NCLCONF_G.HLP", short_name: (null) > trace:dosfs:DOSFS_FindUnixName L"\"C:\\Programme\\Gemeinsame >Dateien\\Nokia\\NCLTools\\NclConf.cpl\"" -- L"NCLCONF_G.HLP" > trace:dosfs:DOSFS_ReadDir Read: long_name: L"NCLCONF.HLP", short_name: (null) > trace:dosfs:DOSFS_FindUnixName L"\"C:\\Programme\\Gemeinsame >Dateien\\Nokia\\NCLTools\\NclConf.cpl\"" -- L"NCLCONF.HLP" > trace:dosfs:DOSFS_ReadDir Read: long_name: L"NCLCONF_N.HLP", short_name: (null) > trace:dosfs:DOSFS_FindUnixName L"\"C:\\Programme\\Gemeinsame >Dateien\\Nokia\\NCLTools\\NclConf.cpl\"" -- L"NCLCONF_N.HLP" > trace:dosfs:DOSFS_ReadDir Read: long_name: L"NCLCONF_S.HLP", short_name: (null) > trace:dosfs:DOSFS_FindUnixName L"\"C:\\Programme\\Gemeinsame >Dateien\\Nokia\\NCLTools\\NclConf.cpl\"" -- L"NCLCONF_S.HLP" > trace:dosfs:DOSFS_ReadDir Read: long_name: L"NCLCONF_SV.HLP", short_name: (null) > trace:dosfs:DOSFS_FindUnixName L"\"C:\\Programme\\Gemeinsame >Dateien\\Nokia\\NCLTools\\NclConf.cpl\"" -- L"NCLCONF_SV.HLP" > trace:dosfs:DOSFS_ReadDir Read: long_name: L"NclConf.exe", short_name: (null) > trace:dosfs:DOSFS_FindUnixName L"\"C:\\Programme\\Gemeinsame >Dateien\\Nokia\\NCLTools\\NclConf.cpl\"" -- L"NclConf.exe" > trace:dosfs:DOSFS_ReadDir Read: long_name: L"NclConf.cpl", short_name: (null) > trace:dosfs:DOSFS_FindUnixName L"\"C:\\Programme\\Gemeinsame >Dateien\\Nokia\\NCLTools\\NclConf.cpl\"" -- L"NclConf.cpl" > warn:dosfs:DOSFS_FindUnixName L"\"C:\\Programme\\Gemeinsame >Dateien\\Nokia\\NCLTools\\NclConf.cpl\"" not found in >'/wine_app/wine_app/Programme/Gemeinsame Dateien/Nokia/NCLTools' > warn:module:MODULE_LoadLibraryExA Failed to load module 'C:\WINDOWS\SYSTEM32'; >error=2 > 0831f930:Ret kernel32.LoadLibraryA() retval=00000000 ret=409bb0f4 > 0831f930:Call kernel32.FreeLibrary(00000000) ret=409bb088 > 0831f930:Ret kernel32.FreeLibrary() retval=00000000 ret=409bb088 > 0831f930:Ret shell32.Control_RunDLL() retval=00000001 ret=00401380 >
I don't see where the traces for DOSFS_FindUnixName come from (except the first one). Did you added them yourself? Else, I don't think it's the \" which cause problem. DOSFS_ReadDir (and others before it) are able to locate the proper directory (and DOSFS_ReadDir enumerates it's content correctly). The problem seems to come from this: In DOSFS_FindUnixName: name is "C:\Programme\Gemeinsame Dateien\Nokia\NCLTools\NclConf.cpl", with the quotes; DOSFS_ToDosFCBFormat returns FALSE (and then dos_name[0]=0) because the first character of its argument is a " (and thus an INVALID_DOS_CHARS), but it doesn't matter; The DOSFS_OpenDir works correctly, with the proper Unix path; The DOSFS_ReadDir loop cycles through the files in that dir, returning (in long_name) the different files it finds (*without* any path component); long_name is then tested if it's the same length as the (minimum between the position of the first backslash in name and the length of name), which is 3 in this example, so of course it never matches and you get the final warning in DOSFS_FindUnixName. Relevant code of DOSFS_FindUnixName: LPCWSTR p = strchrW( name, '/' ); int len = p ? (int)(p - name) : strlenW(name); if ((p = strchrW( name, '\\' ))) len = min( (int)(p - name), len ); and while ((ret = DOSFS_ReadDir( dir, &long_name, &short_name ))) { /* Check against Unix name */ if (len == strlenW(long_name)) { if (!ignore_case) { if (!strncmpW( long_name, name, len )) break; } else { if (!strncmpiW( long_name, name, len )) break; } } Could somebody with more knowledge about the DOSFS_* functions can tell if that's how DOSFS_FindUnixName is supposed to react (fail if name contains a path)? If it is indeed the case, then it's upper the call chain that there's a problem. Call chain: LoadLibraryA->MODULE_LoadLibraryExA MODULE_LoadLibraryExA->SearchPathA SearchPathA->SearchPathW SearchPathW->DIR_SearchPath DIR_SearchPath->DOSFS_GetFullName DOSFS_GetFullName->DOSFS_FindUnixName I'll try to go further with Nokia PC Suite 4.06. Oh, and could you create a bug in bugzilla for this? Vincent