gpt4 book ai didi

c++ - 如何以编程方式区分插入的 dvd 或迷你 dvd 磁盘?

转载 作者:行者123 更新时间:2023-12-01 14:07:33 26 4
gpt4 key购买 nike

我需要获得插入 DVD 磁盘的容量。
带有 IOCTL_DISK_GET_DRIVE_GEOMETRY_EX 参数的 DeviceIoControl 函数调用将 4128768 字节写入 DVD 的大小,这显然是错误的结果。代码取自 https://docs.microsoft.com/en-us/windows/win32/devio/calling-deviceiocontrol .
另一种解决方案是通过 ckMMC lib 的设备接口(interface)确定磁盘读取或写入速度,并根据其类型返回大小。但这不是可靠的解决方案,因为不同的 CD/DVD 驱动器的速度可能会有所不同。
也许,我在使用 DeviceIoControl 时遗漏了一些东西,它可以返回正确的结果,或者存在更好的方法来计算 DVD 磁盘的容量。

最佳答案

有字段DiskSizeDVD_LAYER_DESCRIPTOR ,我一直在寻找。
首先,我们应该以正确的权限打开驱动器。

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com