Module: wine Branch: master Commit: 9fce6a37ecb2a09e14bd3d384132fe3b09c3dcc1 URL: http://source.winehq.org/git/wine.git/?a=commit;h=9fce6a37ecb2a09e14bd3d3841...
Author: Alexandre Goujon ale.goujon@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");