Recently I've been using WINE to run a Win32 exe which needs to load certain DLLs which are located in the same directory as the exe. I was most perplexed when I found that this worked initially, but when I moved the exe and DLLs to a different directory it stopped working ie WINE would refuse to start the exe, claiming that it was unable to load the required DLLs. After some debugging, I discovered that the critical factor was the length of the pathname to the exe, when it passed a certain length it stopped working. However this length was way short of the MAX_PATH value of 260. More investigation showed that in DIR_TryModulePath the path name that was being built for the DLL was being limited to OFS_MAXPATHNAME, which clearly was too short for the pathname of the module in question, and judging by the comment was a holdover from pre-Win32 WINE code. So switched to using MAX_PATH instead of OFS_MAXPATHNAME to size the name buffers in DIR_TryModulePath, and the problem I was seeing went away. I can't state with 100% certainty that there isn't some problem with this change that I have overlooked (this is my first bit of spelunking in the WINE source after all), but to the best of my knowledge it is ok. Regards M.Beach
? DIR_TryModulePath-patch.diff Index: files/directory.c =================================================================== RCS file: /home/wine/wine/files/directory.c,v retrieving revision 1.51 diff -u -r1.51 directory.c --- files/directory.c 27 Aug 2002 01:13:59 -0000 1.51 +++ files/directory.c 12 Sep 2002 10:16:55 -0000 @@ -716,9 +716,7 @@ */ static BOOL DIR_TryModulePath( LPCWSTR name, DOS_FULL_NAME *full_name, BOOL win32 ) { - /* FIXME: for now, GetModuleFileNameW can't return more */ - /* than OFS_MAXPATHNAME. This may change with Win32. */ - WCHAR bufferW[OFS_MAXPATHNAME]; + WCHAR bufferW[MAX_PATH]; LPWSTR p; if (!win32) @@ -727,13 +725,13 @@ if (!GetCurrentTask()) return FALSE; if (!GetModuleFileName16( GetCurrentTask(), buffer, sizeof(buffer) )) return FALSE; - MultiByteToWideChar(CP_ACP, 0, buffer, -1, bufferW, OFS_MAXPATHNAME); + MultiByteToWideChar(CP_ACP, 0, buffer, -1, bufferW, MAX_PATH); } else { - if (!GetModuleFileNameW( 0, bufferW, OFS_MAXPATHNAME ) ) + if (!GetModuleFileNameW( 0, bufferW, MAX_PATH ) ) return FALSE; } if (!(p = strrchrW( bufferW, '\\' ))) return FALSE; - if (OFS_MAXPATHNAME - (++p - bufferW) <= strlenW(name)) return FALSE; + if (MAX_PATH - (++p - bufferW) <= strlenW(name)) return FALSE; strcpyW( p, name ); return DOSFS_GetFullName( bufferW, TRUE, full_name ); }