On Tue, Jan 6, 2009 at 12:25 PM, G. Paul Ziemba <p-wine-b...@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