From: Alex Henrie alexhenrie24@gmail.com
A standard CD-ROM has up to 360,000 sectors that hold 2 KiB of data each, making the total capcity 703.125 MiB. Anything larger than that is almost certainly a DVD or a Blu-ray, and Windows does not distinguish between those two.
There is probably some tiny DVD somewhere in the world that will still be misdetected, but I'm not sure that issuing SCSI commands to the drive to try to determine the disc type would be any more reliable.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=57790 --- dlls/ntdll/unix/cdrom.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-)
diff --git a/dlls/ntdll/unix/cdrom.c b/dlls/ntdll/unix/cdrom.c index 6b5789e538d..c7dae711f3b 100644 --- a/dlls/ntdll/unix/cdrom.c +++ b/dlls/ntdll/unix/cdrom.c @@ -758,10 +758,19 @@ static NTSTATUS CDROM_GetDriveGeometry(int dev, int fd, DISK_GEOMETRY* dg) * CDROM_GetMediaType * */ -static NTSTATUS CDROM_GetMediaType(int dev, GET_MEDIA_TYPES* medtype) +static NTSTATUS CDROM_GetMediaType(int dev, int fd, GET_MEDIA_TYPES* medtype) { - FIXME(": faking success\n"); + CDROM_TOC toc; + int sectors; + medtype->DeviceType = FILE_DEVICE_CD_ROM; + if (CDROM_ReadTOC(dev, fd, &toc)) + { + sectors = FRAME_OF_TOC(toc, toc.LastTrack + 1) - FRAME_OF_TOC(toc, 1); + if (sectors > 360000) medtype->DeviceType = FILE_DEVICE_DVD; + } + FIXME("guessing %s based on data size\n", medtype->DeviceType == FILE_DEVICE_CD_ROM ? "CD" : "DVD"); + medtype->MediaInfoCount = 0; return STATUS_SUCCESS; } @@ -2908,7 +2917,7 @@ NTSTATUS cdrom_DeviceIoControl( HANDLE device, HANDLE event, PIO_APC_ROUTINE apc sz = sizeof(GET_MEDIA_TYPES); if (in_buffer != NULL || in_size != 0) status = STATUS_INVALID_PARAMETER; else if (out_size < sz) status = STATUS_BUFFER_TOO_SMALL; - else status = CDROM_GetMediaType(dev, out_buffer); + else status = CDROM_GetMediaType(dev, fd, out_buffer); break;
case IOCTL_STORAGE_GET_DEVICE_NUMBER: