我需要插入DVD光盘的容量。
带有IOCTL_DISK_GET_DRIVE_GEOMETRY_EX参数的DeviceIoControl函数调用以DVD大小写入4128768字节,这显然是错误的结果。代码来自https://docs.microsoft.com/en-us/windows/win32/devio/calling-deviceiocontrol。
另一个解决方案是通过ckMMC lib的Device接口(interface)确定磁盘的读取或写入速度,并根据其类型确定返回大小。但这不是可靠的解决方案,因为不同的CD/DVD驱动器上的速度可能会有所不同。
也许,我缺少使用DeviceIoControl的功能,它可以返回正确的结果,或者存在更好的方法来计算DVD磁盘的容量。
最佳答案
我正在寻找的DVD_LAYER_DESCRIPTOR中有一个字段DiskSize
。
首先,我们应该以正确的权限打开驱动器。
HANDLE drive = CreateFileW(devicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, nullptr, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, nullptr);
注意devicePath
,它应该在Win32 Device Namespace中。获取驱动器句柄后,借助DeviceIoControl获得DVD_LAYER_DESCRIPTOR
结构。DWORD unused;
std::array<char, 22> buffer;
DVD_READ_STRUCTURE dvdReadStruct;
dvdReadStruct.Format = DvdPhysicalDescriptor;
DeviceIoControl(drive, IOCTL_DVD_READ_STRUCTURE, &dvdReadStruct, sizeof(dvdReadStruct),
buffer.data(), buffer.size(), &unused, nullptr))
DVD_LAYER_DESCRIPTOR layerDescription = *reinterpret_cast<DVD_LAYER_DESCRIPTOR *>(
reinterpret_cast<DVD_DESCRIPTOR_HEADER *>(buffer.data())->Data);
CloseHandle(drive);
dvdReadStruct.Format
确定将哪种结构写入buffer
。例如,如果您将设置DvdManufacturerDescriptor
,函数会将DVD_MANUFACTURER_DESCRIPTOR写入缓冲区。关于c++ - 如何以编程方式区分插入的DVD或迷你DVD盘?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/63707608/