如何解决如何以编程方式区分插入的DVD或迷你DVD盘?
我需要插入一张DVD光盘。
使用IOCTL_disK_GET_DRIVE_GEOMETRY_EX参数的DeviceIoControl函数调用将4128768字节写入DVD大小,这显然是错误的结果。代码来自https://docs.microsoft.com/en-us/windows/win32/devio/calling-deviceiocontrol。
另一种解决方案是通过ckMMC lib的Device接口确定磁盘的读取或写入速度,并根据其类型确定返回大小。但这不是可靠的解决方案,因为不同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写入缓冲区。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。