Alexandre Goujon : kernel32/tests: Add a IOCTL_DVD_READ_STRUCTURE ( DvdCopyrightDescriptor) test.

Alexandre Julliard julliard at winehq.org
Thu Jul 12 18:00:34 CDT 2012


Module: wine
Branch: master
Commit: 9fce6a37ecb2a09e14bd3d384132fe3b09c3dcc1
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=9fce6a37ecb2a09e14bd3d384132fe3b09c3dcc1

Author: Alexandre Goujon <ale.goujon at gmail.com>
Date:   Wed Jul 11 22:26:51 2012 +0200

kernel32/tests: Add a IOCTL_DVD_READ_STRUCTURE (DvdCopyrightDescriptor) test.

---

 dlls/kernel32/tests/volume.c |   21 +++++++++++++++++++++
 dlls/ntdll/cdrom.c           |    2 +-
 2 files changed, 22 insertions(+), 1 deletions(-)

diff --git a/dlls/kernel32/tests/volume.c b/dlls/kernel32/tests/volume.c
index cf402ad..45bac31 100644
--- a/dlls/kernel32/tests/volume.c
+++ b/dlls/kernel32/tests/volume.c
@@ -749,6 +749,7 @@ static void test_dvd_read_structure(HANDLE handle)
     DVD_READ_STRUCTURE dvdReadStructure;
     DVD_LAYER_DESCRIPTOR dvdLayerDescriptor;
     struct COMPLETE_DVD_LAYER_DESCRIPTOR completeDvdLayerDescriptor;
+    DVD_COPYRIGHT_DESCRIPTOR dvdCopyrightDescriptor;
 
     dvdReadStructure.BlockByteOffset.QuadPart = 0;
     dvdReadStructure.SessionId = 0;
@@ -818,6 +819,26 @@ static void test_dvd_read_structure(HANDLE handle)
         ok( (!ret && GetLastError() == ERROR_INVALID_PARAMETER),
             "IOCTL_DVD_READ_STRUCTURE should have failed\n");
     }
+
+
+    /* DvdCopyrightDescriptor */
+    dvdReadStructure.Format = 1;
+
+    SetLastError(0xdeadbeef);
+
+    /* Strangely, with NULL lpOutBuffer, last error is insufficient buffer, not invalid parameter as we could expect */
+    ret = DeviceIoControl(handle, IOCTL_DVD_READ_STRUCTURE, &dvdReadStructure, sizeof(DVD_READ_STRUCTURE),
+        NULL, sizeof(DVD_COPYRIGHT_DESCRIPTOR), &nbBytes, NULL);
+    ok(!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER, "IOCTL_DVD_READ_STRUCTURE should have failed %d %u\n", ret, GetLastError());
+
+    for(i=0; i<sizeof(DVD_COPYRIGHT_DESCRIPTOR); i++)
+    {
+        SetLastError(0xdeadbeef);
+
+        ret = DeviceIoControl(handle, IOCTL_DVD_READ_STRUCTURE, &dvdReadStructure, sizeof(DVD_READ_STRUCTURE),
+            &dvdCopyrightDescriptor, i, &nbBytes, NULL);
+        ok(!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER, "IOCTL_DVD_READ_STRUCTURE should have failed %d %u\n", ret, GetLastError());
+    }
 }
 
 static void test_cdrom_ioctl(void)
diff --git a/dlls/ntdll/cdrom.c b/dlls/ntdll/cdrom.c
index a58701e..8374761 100644
--- a/dlls/ntdll/cdrom.c
+++ b/dlls/ntdll/cdrom.c
@@ -3083,7 +3083,7 @@ NTSTATUS CDROM_DeviceIoControl(HANDLE hDevice,
     case IOCTL_DVD_READ_STRUCTURE:
         sz = sizeof(DVD_LAYER_DESCRIPTOR);
         if (lpInBuffer == NULL || nInBufferSize != sizeof(DVD_READ_STRUCTURE)) status = STATUS_INVALID_PARAMETER;
-        else if (nOutBufferSize < sz) status = STATUS_BUFFER_TOO_SMALL;
+        else if (nOutBufferSize < sz || !lpOutBuffer) status = STATUS_BUFFER_TOO_SMALL;
         else
         {
             TRACE("doing DVD_READ_STRUCTURE\n");




More information about the wine-cvs mailing list