Index: reactos/dll/win32/shell32/wine/shellpath.c =================================================================== --- reactos/dll/win32/shell32/wine/shellpath.c (revision 75066) +++ reactos/dll/win32/shell32/wine/shellpath.c (working copy) @@ -472,16 +472,80 @@ return PathQualifyA(pszPath); } -static BOOL PathResolveA(LPSTR path, LPCSTR *paths, DWORD flags) +static BOOL PathResolveW(LPWSTR path, LPCWSTR *paths, DWORD flags) { - FIXME("(%s,%p,0x%08x),stub!\n", debugstr_a(path), paths, flags); + FIXME("(%s,%p,0x%08x),stub!\n", debugstr_w(path), paths, flags); return FALSE; } -static BOOL PathResolveW(LPWSTR path, LPCWSTR *paths, DWORD flags) +static BOOL PathResolveA(LPSTR path, LPCSTR *paths, DWORD flags) { - FIXME("(%s,%p,0x%08x),stub!\n", debugstr_w(path), paths, flags); - return FALSE; + BOOL Ret; + WCHAR pathW[MAX_PATH]; + LPCSTR *pdirsA; + DWORD i, Size, Count; + LPWSTR *pathsW = NULL; + + if (paths) + { + /* count dirs */ + Count = 0; + for (pdirsA = paths; *pdirsA; ++pdirsA) + { + ++Count; + } + pdirsA = paths; + + /* allocate and convert to Unicode */ + Size = (Count + 1) * sizeof(LPWSTR); + pathsW = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, Size); + if (pathsW == NULL) + { + return FALSE; /* failure */ + } + for (i = 0; i < Count; ++i) + { + Size = MAX_PATH * sizeof(WCHAR); + pathsW[i] = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, Size); + if (pathsW[i] == NULL) + { + break; /* failure */ + } + MultiByteToWideChar(CP_ACP, 0, pdirsA[i], -1, pathsW[i], MAX_PATH); + } + + /* free and return if failed */ + if (i != Count) + { + while (i > 0) + { + --i; + HeapFree(GetProcessHeap(), 0, pathsW[i]); + } + HeapFree(GetProcessHeap(), 0, pathsW); + + return FALSE; /* failure */ + } + } + + /* main work */ + MultiByteToWideChar(CP_ACP, 0, path, -1, pathW, MAX_PATH); + Ret = PathResolveW(pathW, (LPCWSTR *)pathsW, flags); + WideCharToMultiByte(CP_ACP, 0, pathW, -1, path, MAX_PATH, NULL, NULL); + + if (pathsW) + { + /* free 'em now */ + i = Count; + while (i > 0) + { + --i; + HeapFree(GetProcessHeap(), 0, pathsW[i]); + } + HeapFree(GetProcessHeap(), 0, pathsW); + } + + return Ret; } /*************************************************************************