[C-style comments] PR 16592: dlls/kernel32/volume.c

G. Paul Ziemba p-wine-bugs at ziemba.us
Tue Jan 6 13:38:55 CST 2009


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:
11:36AM  up 12 days, 22:15, 12 users, load averages: 0.30, 0.57, 0.45



More information about the wine-patches mailing list