1、判断磁盘的类型
if (GetDriveType(szRootPathName) != DRIVE_REMOVABLE)
{
m_csErrorMsg.Format(_T("该磁盘不是可移动磁盘"));
}
csLogicDisk.Format(_T("\\\\.\\%c:"), csDiskSymbol[0]);
HANDLE hVolume = CreateFile(csLogicDisk, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, NULL);
if (hVolume == INVALID_HANDLE_VALUE)
{
return false;
}
2、通过DeviceIoControl获取设备根据盘符得到第一个STORAGE_DEVICE_NUMBER -> sdnDiskDeviceNum
if (!DeviceIoControl(hVolume, IOCTL_STORAGE_GET_DEVICE_NUMBER, NULL, 0, &sdnDiskDeviceNum, sizeof(sdnDiskDeviceNum), &dwBytesReturned, NULL))
{
return false;
}
3、枚举磁盘设备,GUID_DEVINTERFACE_DISK
依次用到
SetupDiGetClassDevs, SetupDiEnumDeviceInterfaces, SetupDiGetDeviceInterfaceDetail
---HDEVINFO hDevInfo = SetupDiGetClassDevs(pGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
---SetupDiEnumDeviceInterfaces(hDevInfo, NULL, pGuid, index, &DevInterfaceData)
---SetupDiGetDeviceInterfaceDetail(hDevInfo, &DevInterfaceData, pDevInterfaceDetailData, dwRequiredSize, &dwRequiredSize, &DevInfoData)
4、再次调用CreateFile,这次的文件名是来自于SetupDiGetDeviceInterfaceDetail返回的buffer的path
HANDLE hDrive = CreateFile(pDevInterfaceDetailData->DevicePath, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
5、通过DeviceIoControl获取设备根据盘符得到第二个STORAGE_DEVICE_NUMBER --> sdnDeviceInfoByEnumDevice
DeviceIoControl(hDrive,
IOCTL_STORAGE_GET_DEVICE_NUMBER,
NULL,
0,
&sdnDeviceInfoByEnumDevice,
sizeof(sdnDeviceInfoByEnumDevice),
&dwBytesReturned2,
NULL
)
6.比较两个STORAGE_DEVICE_NUMBER是否相同
typedef struct _STORAGE_DEVICE_NUMBER {
DEVICE_TYPE DeviceType;
ULONG DeviceNumber;
ULONG

本文介绍了如何通过磁盘盘符找到对应的USB设备。首先判断磁盘类型,然后利用DeviceIoControl获取设备信息。接着,枚举磁盘设备并使用SetupDiGetClassDevs等API获取详细信息。通过CreateFile打开设备,并再次调用DeviceIoControl获取STORAGE_DEVICE_NUMBER。最后,对比设备号并获取设备ID,得到设备实例路径。


被折叠的 条评论
为什么被折叠?



