From: Alexandre Goujon Subject: [PATCH 2/2] kernel32: Return correct drive type for empty drives (try2) Message-Id: <1346422638-18486-2-git-send-email-ale.goujon@gmail.com> Date: Fri, 31 Aug 2012 16:17:18 +0200 Should fix bug #17037 and skip the ioctl test when there is no disc in the drive. --- dlls/kernel32/tests/volume.c | 2 +- dlls/kernel32/volume.c | 10 +++++++++- dlls/ntdll/cdrom.c | 3 ++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/dlls/kernel32/tests/volume.c b/dlls/kernel32/tests/volume.c index 8152ae1..d64965f 100644 --- a/dlls/kernel32/tests/volume.c +++ b/dlls/kernel32/tests/volume.c @@ -778,7 +778,7 @@ static void test_dvd_read_structure(HANDLE handle) if ((!ret && GetLastError() == ERROR_INVALID_FUNCTION) || (!ret && GetLastError() == ERROR_NOT_SUPPORTED)) { - skip("IOCTL_DVD_READ_STRUCTURE not supported\n"); + skip("IOCTL_DVD_READ_STRUCTURE not supported or no disc in the drive\n"); return; } diff --git a/dlls/kernel32/volume.c b/dlls/kernel32/volume.c index 238dd9c..7dc975c 100644 --- a/dlls/kernel32/volume.c +++ b/dlls/kernel32/volume.c @@ -1546,7 +1546,15 @@ UINT WINAPI GetDriveTypeW(LPCWSTR root) /* [in] String describing drive */ HANDLE handle; UINT ret; - if (!open_device_root( root, &handle )) return DRIVE_NO_ROOT_DIR; + if (!open_device_root( root, &handle )) + { + /* Getting empty drive handle fails because there's not mount point + So in this case, get the drive type from the mountmgr */ + if (GetLastError() == ERROR_PATH_NOT_FOUND + && ((ret = get_mountmgr_drive_type(root)) != DRIVE_UNKNOWN)) + return ret; + return DRIVE_NO_ROOT_DIR; + } status = NtQueryVolumeInformationFile( handle, &io, &info, sizeof(info), FileFsDeviceInformation ); NtClose( handle ); diff --git a/dlls/ntdll/cdrom.c b/dlls/ntdll/cdrom.c index 54b9ab6..9bc0baf 100644 --- a/dlls/ntdll/cdrom.c +++ b/dlls/ntdll/cdrom.c @@ -2544,7 +2544,8 @@ static NTSTATUS DVD_ReadStructure(int dev, const DVD_READ_STRUCTURE *structure, } if (ioctl(dev, DVD_READ_STRUCT, &s) < 0) - return STATUS_INVALID_PARAMETER; + /* Will be converted into ERROR_INVALID_FUNCTION */ + return (errno == ENOMEDIUM) ? STATUS_INVALID_DEVICE_REQUEST : STATUS_INVALID_PARAMETER; switch (structure->Format) { -- 1.7.9.5