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

Alexandre Julliard julliard at winehq.org
Tue Jul 17 11:05:32 CDT 2012


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

Author: Alexandre Goujon <ale.goujon at gmail.com>
Date:   Mon Jul 16 20:06:25 2012 +0200

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

---

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

diff --git a/dlls/kernel32/tests/volume.c b/dlls/kernel32/tests/volume.c
index 45bac31..8152ae1 100644
--- a/dlls/kernel32/tests/volume.c
+++ b/dlls/kernel32/tests/volume.c
@@ -34,6 +34,16 @@ struct COMPLETE_DVD_LAYER_DESCRIPTOR
 #include <poppack.h>
 C_ASSERT(sizeof(struct COMPLETE_DVD_LAYER_DESCRIPTOR) == 22);
 
+#include <pshpack1.h>
+struct COMPLETE_DVD_MANUFACTURER_DESCRIPTOR
+{
+    DVD_DESCRIPTOR_HEADER Header;
+    DVD_MANUFACTURER_DESCRIPTOR Descriptor;
+    UCHAR Padding;
+};
+#include <poppack.h>
+C_ASSERT(sizeof(struct COMPLETE_DVD_MANUFACTURER_DESCRIPTOR) == 2053);
+
 static HINSTANCE hdll;
 static BOOL (WINAPI * pGetVolumeNameForVolumeMountPointA)(LPCSTR, LPSTR, DWORD);
 static BOOL (WINAPI * pGetVolumeNameForVolumeMountPointW)(LPCWSTR, LPWSTR, DWORD);
@@ -750,6 +760,7 @@ static void test_dvd_read_structure(HANDLE handle)
     DVD_LAYER_DESCRIPTOR dvdLayerDescriptor;
     struct COMPLETE_DVD_LAYER_DESCRIPTOR completeDvdLayerDescriptor;
     DVD_COPYRIGHT_DESCRIPTOR dvdCopyrightDescriptor;
+    struct COMPLETE_DVD_MANUFACTURER_DESCRIPTOR completeDvdManufacturerDescriptor;
 
     dvdReadStructure.BlockByteOffset.QuadPart = 0;
     dvdReadStructure.SessionId = 0;
@@ -839,6 +850,31 @@ static void test_dvd_read_structure(HANDLE handle)
             &dvdCopyrightDescriptor, i, &nbBytes, NULL);
         ok(!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER, "IOCTL_DVD_READ_STRUCTURE should have failed %d %u\n", ret, GetLastError());
     }
+
+
+    /* DvdManufacturerDescriptor */
+    dvdReadStructure.Format = 4;
+
+    SetLastError(0xdeadbeef);
+
+    ret = DeviceIoControl(handle, IOCTL_DVD_READ_STRUCTURE, &dvdReadStructure, sizeof(DVD_READ_STRUCTURE),
+        &completeDvdManufacturerDescriptor, sizeof(DVD_MANUFACTURER_DESCRIPTOR), &nbBytes, NULL);
+    ok(ret || broken(GetLastError() == ERROR_NOT_READY),
+        "IOCTL_DVD_READ_STRUCTURE (DvdManufacturerDescriptor) failed, last error = %u\n", GetLastError());
+    if(!ret)
+        return;
+
+    /* Confirm there is always a header before the actual data */
+    ok( completeDvdManufacturerDescriptor.Header.Length == 0x0802, "Length is 0x%04x instead of 0x0802\n", completeDvdManufacturerDescriptor.Header.Length);
+    ok( completeDvdManufacturerDescriptor.Header.Reserved[0] == 0, "Reserved[0] is %x instead of 0\n", completeDvdManufacturerDescriptor.Header.Reserved[0]);
+    ok( completeDvdManufacturerDescriptor.Header.Reserved[1] == 0, "Reserved[1] is %x instead of 0\n", completeDvdManufacturerDescriptor.Header.Reserved[1]);
+
+    SetLastError(0xdeadbeef);
+
+    /* Basic parameter check */
+    ret = DeviceIoControl(handle, IOCTL_DVD_READ_STRUCTURE, &dvdReadStructure, sizeof(DVD_READ_STRUCTURE),
+        NULL, sizeof(DVD_MANUFACTURER_DESCRIPTOR), &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 8374761..87e0695 100644
--- a/dlls/ntdll/cdrom.c
+++ b/dlls/ntdll/cdrom.c
@@ -231,6 +231,13 @@ typedef struct
 } internal_dvd_layer_descriptor;
 C_ASSERT(sizeof(internal_dvd_layer_descriptor) == 22);
 
+typedef struct
+{
+    DVD_DESCRIPTOR_HEADER Header;
+    DVD_MANUFACTURER_DESCRIPTOR Descriptor;
+    UCHAR Padding;
+} internal_dvd_manufacturer_descriptor;
+C_ASSERT(sizeof(internal_dvd_manufacturer_descriptor) == 2053);
 
 static NTSTATUS CDROM_ReadTOC(int, int, CDROM_TOC*);
 static NTSTATUS CDROM_GetStatusCode(int);
@@ -2595,9 +2602,12 @@ static NTSTATUS DVD_ReadStructure(int dev, const DVD_READ_STRUCTURE *structure,
 
     case DvdManufacturerDescriptor:
         {
-            PDVD_MANUFACTURER_DESCRIPTOR p = (PDVD_MANUFACTURER_DESCRIPTOR) layer;
+            internal_dvd_manufacturer_descriptor *p = (internal_dvd_manufacturer_descriptor*) layer;
 
-            memcpy(p->ManufacturingInformation, s.manufact.value, 2048);
+            p->Header.Length = 0x0802;
+            p->Header.Reserved[0] = 0;
+            p->Header.Reserved[1] = 0;
+            memcpy(p->Descriptor.ManufacturingInformation, s.manufact.value, 2048);
         }
         break;
 
@@ -2620,7 +2630,7 @@ static NTSTATUS DVD_ReadStructure(int dev, const DVD_READ_STRUCTURE *structure,
         internal_dvd_layer_descriptor *xlayer;
         PDVD_COPYRIGHT_DESCRIPTOR copy;
         PDVD_DISK_KEY_DESCRIPTOR disk_key;
-        PDVD_MANUFACTURER_DESCRIPTOR manf;
+        internal_dvd_manufacturer_descriptor *manf;
     } nt_desc;
 
     nt_desc.layer = layer;
@@ -2705,8 +2715,11 @@ static NTSTATUS DVD_ReadStructure(int dev, const DVD_READ_STRUCTURE *structure,
             break;
 
         case DvdManufacturerDescriptor:
+            nt_desc.manf->Header.Length = 0x0802;
+            nt_desc.manf->Header.Reserved[0] = 0;
+            nt_desc.manf->Header.Reserved[1] = 0;
             memcpy(
-                nt_desc.manf->ManufacturingInformation,
+                nt_desc.manf->Descriptor.ManufacturingInformation,
                 desc.manf.discManufacturingInfo,
                 2048);
             break;




More information about the wine-cvs mailing list