通过U盘的盘符找到USB设备

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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(sdnDeviceInfoByEnumDevic

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值