PR 16592: dlls/kernel32/volume.c
Austin English
austinenglish at gmail.com
Tue Jan 6 12:33:45 CST 2009
On Tue, Jan 6, 2009 at 12:25 PM, G. Paul Ziemba <p-wine-bugs at 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
More information about the wine-patches
mailing list