Windows不会挂载磁盘,它会挂载卷。然而,USBSTOR类设备的卷在设备树中不被列为子节点。因此,您需要枚举所有卷,并进行一系列字符串操作和比较,以将STORAGE\VOLUME节点与USBSTOR节点匹配。
所有卷的GUID值都是使用
FindFirstVolume函数集枚举的。可以去掉前导的"\.\"和尾随的"\"字符,然后将结果字符串传递给
QueryDosDevice。这将提供一个设备名称。
接下来,您需要使用
SetupDiGetClassDevs和相关工具使用GUID_DEVINTERFACE_VOLUME列举所有卷。使用
IOCTL_STORAGE_GET_DEVICE_NUMBER比较每个卷的设备类型和数量与您要查找的USBSTOR设备。一旦匹配成功,您可以从卷中获取设备名称,并将其与其他设备名称列表进行比较,以查找卷GUID。
最后,可以使用
SetVolumeMountPoint成功使用卷GUID。
感谢
Gabe在我的问题评论中提供了非常有帮助的帮助。
代码片段
从设备路径获取设备类型和编号:
STORAGE_DEVICE_NUMBER sdn;
HANDLE handle = CreateFile(devInterfaceDetail->DevicePath, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, NULL);
DWORD len = 0;
DeviceIoControl(h, IOCTL_STORAGE_GET_DEVICE_NUMBER, NULL, 0, &sdn, sizeof (sdn), &len, NULL);
通过迭代所有卷接口并比较上面片段中的磁盘编号,找到相应USBSTOR实例的设备名称。
std::string deviceName;
HDEVINFO devInfoSet = SetupDiGetClassDevs(&GUID_DEVINTERFACE_VOLUME, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
SP_DEVICE_INTERFACE_DATA devInterface = { 0 };
devInterface.cbSize = sizeof (SP_DEVICE_INTERFACE_DATA);
for (int i = 0; SetupDiEnumDeviceInterfaces(devInfoSet, NULL, &GUID_DEVINTERFACE_VOLUME, i, &devInterface); ++i) {
SP_DEVINFO_DATA devInfoData = { 0 };
devInfoData.cbSize = sizeof (SP_DEVINFO_DATA);
DWORD len;
SetupDiGetDeviceInterfaceDetail(devInfoSet, &devInterface, NULL, 0, &len, &devInfoData);
std::vector<char> buf(len);
SP_DEVICE_INTERFACE_DETAIL_DATA *devInterfaceDetail = (SP_DEVICE_INTERFACE_DETAIL_DATA *) &buf[0];
devInterfaceDetail->cbSize = sizeof (SP_DEVICE_INTERFACE_DETAIL_DATA);
if (SetupDiGetDeviceInterfaceDetail(devInfoSet, &devInterface, devInterfaceDetail, len, NULL, &devInfoData)) {
if (DEVICE_NUMBER == this->getDeviceNumber(devInterfaceDetail->DevicePath)) {
std::vector<BYTE> buf(MAX_PATH + 1);
DWORD type, len;
if (SetupDiGetDeviceRegistryProperty(devInfoSet, &devInfoData, SPDRP_PHYSICAL_DEVICE_OBJECT_NAME, &type, &buf[0], buf.size(), &len)) {
deviceName.assign(buf.begin(), buf.begin() + len);
break;
}
}
}
}
\Device\HarddiskVolume21
的字符串。我不确定如何构建可比较的字符串以匹配该字符串,因为我不知道那个21是如何生成的。那个对应于\\.\PhysicalDrive1
... - Judge Maygarden