Re: PR 16592: dlls/kernel32/volume.c
On Tue, Jan 6, 2009 at 12:25 PM, G. Paul Ziemba <p-wine-bugs(a)ziemba.us> wrote:
Fix for PR 16592, GetVolumeInformationW() handling of unusual "root" parameter.
--- dlls/kernel32/volume.c.orig 2008-12-05 08:57:45.000000000 -0800 +++ dlls/kernel32/volume.c 2008-12-22 00:15:51.000000000 -0800 @@ -518,7 +518,7 @@ HANDLE handle; enum fs_type type = FS_UNKNOWN;
- if (!root) + if (!root || (root && root[0] == '\\' && root[1] == ':')) { WCHAR path[MAX_PATH]; GetCurrentDirectoryW( MAX_PATH, path );
--- dlls/kernel32/tests/volume.c.orig 2008-12-05 08:57:45.000000000 -0800 +++ dlls/kernel32/tests/volume.c 2009-01-06 09:52:19.000000000 -0800 @@ -29,6 +29,9 @@ static BOOL (WINAPI *pFindVolumeClose)(HANDLE); static UINT (WINAPI *pGetLogicalDriveStringsA)(UINT,LPSTR); static UINT (WINAPI *pGetLogicalDriveStringsW)(UINT,LPWSTR); +static BOOL (WINAPI *pGetVolumeInformationW)(LPCWSTR,LPWSTR,DWORD, + DWORD*,DWORD*,DWORD*,LPWSTR,DWORD); +static BOOL (WINAPI *pSetCurrentDirectoryA)(LPCSTR);
/* ############################### */
@@ -216,6 +219,48 @@ HeapFree(GetProcessHeap(), 0, buf); }
+static void test_GetVolumeInformationW(void) +{ + // + // Check handling of root == "\\:" + // http://bugs.winehq.org/show_bug.cgi?id=16592 + // + + BOOL rc; + WCHAR root[] = {'\\',':',0}; + + if (!pGetVolumeInformationW) { + win_skip("GetVolumeInformationW not available\n"); + return; + } + + if (!pSetCurrentDirectoryA) { + win_skip("SetCurrentDirectoryA not available\n"); + return; + } + + // + // set current directory because GetVolumeInformationW refers + // to it in this test case + // + rc = pSetCurrentDirectoryA("C:\\"); + + ok(rc, "SetCurrentDirectoryA(\"C:\\\\\") failed\n"); + + rc = pGetVolumeInformationW( + root, // Root + NULL, // pLabel + 0, // LabelLen + NULL, // pSerial + NULL, // pFilenameLen + NULL, // pFlags + NULL, // pFsname + 0 // FsnameLen + ); + + ok(rc, "GetVolumeInformationW doesn't handle root == \"\\\\:\" case\n"); +} + START_TEST(volume) { hdll = GetModuleHandleA("kernel32.dll"); @@ -226,6 +271,8 @@ pFindVolumeClose = (void *) GetProcAddress(hdll, "FindVolumeClose"); pGetLogicalDriveStringsA = (void *) GetProcAddress(hdll, "GetLogicalDriveStringsA"); pGetLogicalDriveStringsW = (void *) GetProcAddress(hdll, "GetLogicalDriveStringsW"); + pGetVolumeInformationW = (void *) GetProcAddress(hdll, "GetVolumeInformationW"); + pSetCurrentDirectoryA = (void *) GetProcAddress(hdll, "SetCurrentDirectoryA");
test_query_dos_deviceA(); test_FindFirstVolume(); @@ -233,4 +280,5 @@ test_GetVolumeNameForVolumeMountPointW(); test_GetLogicalDriveStringsA(); test_GetLogicalDriveStringsW(); + test_GetVolumeInformationW(); }
-- G. Paul Ziemba FreeBSD unix: 10:11AM up 12 days, 20:50, 10 users, load averages: 0.16, 0.18, 0.19
Please, no C++ comments in wine, use standard C /* comments */ instead. -- -Austin
participants (1)
-
Austin English