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