MFC操作注册表获取USB磁盘代码阅读步骤总结

1.获取设备路径接口
•m_lpClassGuid=_GUID GUID_DEVINTERFACE_USB_HOST_CONTROLLER  {3ABF6F2D-71C4-462A-8A92-1E6861E6AF27}
•
•m_hDevInfo = SetupDiGetClassDevs( (LPGUID)
  m_lpClassGuid,NULL,NULL,DIGCF_PRESENT |DIGCF_DEVICEINTERFACE);

      SetupDiEnumDeviceInterfaces( m_hDevInfo,NULL,m_lpClassGuid,             m_Index,&deviceInterfaceData);

    获取到deviceInterfaceData= {3ABF6F2D-71C4-462A-8A92-1E6861E6AF27}

SetupDiGetDeviceInterfaceDetail( m_hDevInfo, &deviceInterfaceData,
         (PSP_DEVICE_INTERFACE_DETAIL_DATA_A)&tmpPath,
  dwBytesReturned,&dwBytesReturned,  0);
        获取到设备路径接口tmpPath=
{"\\\\?\\pci#ven_8086&dev_a12f&subsys_079b1028&rev_31#3&11583659&0&a0#{3abf6f2d-71c4-462a-8a92-1e6861e6af27}" }

2.获取RootHup

m_hDevice = CreateFileA(path.getString(),
                          GENERIC_READ | GENERIC_WRITE,
                           FILE_SHARE_READ | FILE_SHARE_WRITE,
                           &SA,
                           OPEN_EXISTING,
                           FILE_FLAG_NO_BUFFERING,
                           NULL);
DeviceIoControl(m_hDevice,
       	 IOCTL_USB_GET_ROOT_HUB_NAME,
      	  NULL,
       	 0,
       	 rootHubNameW,
       	 nBytes,
        	&nBytes,NULL);
获取到rootHubNameW=
L"IUSB3#ROOT_HUB30#4&23490922&0#{f18a0e88-c30c-11d0-8815-00a0c906bed8}" }
转换成"\\\\.\\IUSB3#ROOT_HUB30#4&23490922&0#{f18a0e88-c30c-11d0-8815-00a0c906bed8}"

3.获取ports

 m_hDevice = CreateFileA(path.getString(),
                           GENERIC_READ | GENERIC_WRITE,
                           FILE_SHARE_READ | FILE_SHARE_WRITE,
                           &SA,
                           OPEN_EXISTING,
                           FILE_FLAG_NO_BUFFERING,
                           NULL);
获取到m_hDevice 

 ConnectInfo.ConnectionIndex=ConnectionIndex;
   DeviceIoControl(m_hDevice,
        IOCTL_USB_GET_NODE_CONNECTION_INFORMATION,
        &ConnectInfo,
        sizeof(USB_NODE_CONNECTION_INFORMATION),
        &ConnectInfo,
        sizeof(USB_NODE_CONNECTION_INFORMATION),
        &nBytes,NULL);
获取到设备状态信息ConnectInfo用来进行判断选择使用

DeviceIoControl(m_hDevice,
	        IOCTL_USB_GET_NODE_CONNECTION_NAME,
       	        &extHubName,
       	        sizeof(extHubName),
        	        &extHubName,
       	       sizeof(extHubName),
        	       &nBytes,
        	       NULL);
获取设备相关数据extHubName --- nBytes = extHubName.ActualLength;

DeviceIoControl(m_hDevice,
        IOCTL_USB_GET_NODE_CONNECTION_NAME,
        extHubNameW,
        nBytes,
        extHubNameW,
        nBytes,
        &nBytes,
        NULL);
获得的具体port 
extHubNameW=
 {L"USB#VID_05E3&PID_0608#5&215f119a&0&1#{f18a0e88-c30c-11d0-8815-00a0c906bed8}" }
4.获取port下的设备信息
path.getString()="\\\\.\\USB#VID_05E3&PID_0608#5&215f119a&0&1#{f18a0e88-c30c-11d0-8815-00a0c906bed8}

m_hDevice = CreateFileA(path.getString(),
                           GENERIC_READ | GENERIC_WRITE,
                           FILE_SHARE_READ | FILE_SHARE_WRITE,
                           &SA,
                           OPEN_EXISTING,
                           FILE_FLAG_NO_BUFFERING,
                           NULL);
DeviceIoControl(m_hDevice,
        IOCTL_USB_GET_NODE_INFORMATION,
        &HubInfo,
        sizeof(USB_NODE_INFORMATION),
        &HubInfo,
        sizeof(USB_NODE_INFORMATION),
        &nBytes,
        NULL);
获得设备相关信息 pNodeInfo = HubInfo;
可以获得当前集线器的port数量(4)

 DeviceIoControl(m_hDevice,
        IOCTL_USB_GET_NODE_CONNECTION_DRIVERKEY_NAME,
        &driverKeyName,
        sizeof(driverKeyName),
        &driverKeyName,
        sizeof(driverKeyName),
        &nBytes,NULL);
nBytes= driverKeyName.ActualLength;

bSuccess = DeviceIoControl(m_hDevice,
        IOCTL_USB_GET_NODE_CONNECTION_DRIVERKEY_NAME,
        driverKeyNameW,
        nBytes,
        driverKeyNameW,
        nBytes,
        &nBytes,NULL);
获取得4个port下连接的设备的路径:
driverKeyNameW->DriverKeyName:
"{36fc9e60-c465-11cf-8056-444553540000}\\0032"

CM_Locate_DevNode(&devInst,NULL,0);

CM_Get_DevNode_Registry_Property(devInst,
                                              CM_DRP_DRIVER,NULL,buf,&len,0);

CM_Get_DevNode_Registry_Property(devInst,
          		             CM_DRP_DEVICEDESC,NULL,buf,&len,0);

通过遍历最终得到设备句柄: *pdInst = devInst=3912;
CM_Get_Child( pOut, pdInst, 0 );
得到pOut=3992
•m_lpClassGuid=DiskClassGuid{53f56307-b6bf-11d0-94f2-00a0c91efb8b}
m_hDevInfo= SetupDiGetClassDevs((LPGUID)m_lpClassGuid,

NULL,NULL,DIGCF_PRESENT|DIGCF_DEVICEINTERFACE);

通过 SetupDiEnumDeviceInfo(m_hDevInfo, m_Index,&DevInfoData);

遍历得到DevInfoData.DevInst,判断是否与pOut相等来获取disk路径tmpPath:

 

•SetupDiGetDeviceInterfaceDetail( m_hDevInfo,
        &deviceInterfaceData,

       (PSP_DEVICE_INTERFACE_DETAIL_DATA_A)&tmpPath,

        dwBytesReturned,&dwBytesReturned,0);

tmpPath:

"\\\\?\\usbstor#disk&ven_is817&prod_innostor&rev_1.00#7&2d26cad4&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}"

 

5.根据获得的信息获取设置DISK盘符名称

 

 

path.getString() = \\\\?\\usbstor#disk&ven_is817&prod_innostor&rev_1.00#7&2d26cad4&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}"

m_hDevice = CreateFileA(path.getString(),
                           GENERIC_READ | GENERIC_WRITE,
                           FILE_SHARE_READ | FILE_SHARE_WRITE,
                           &SA,
                           OPEN_EXISTING,
                           FILE_FLAG_NO_BUFFERING,
                           NULL);
DeviceIoControl(m_hDevice,
		IOCTL_STORAGE_GET_DEVICE_NUMBER,
		NULL, 0 , &sdn1 , sizeof(sdn1),&dwBytesReturned,
		NULL);
str.getString()=D到Z的盘符;
 hDrive = CreateFile(str.getString(),
                             GENERIC_READ | GENERIC_WRITE,
                             FILE_SHARE_READ | FILE_SHARE_WRITE,
                             &SA, OPEN_EXISTING,
                             FILE_FLAG_NO_BUFFERING,NULL
                         );
 DeviceIoControl(hDrive,
                                  IOCTL_STORAGE_GET_DEVICE_NUMBER,
                                  NULL, 0, &sdn2, sizeof(sdn2), &dwBytesReturned,
                                  NULL);
 

通过找到与sdn1相等的sdn2的盘符即为所需的盘符

 

整体usb获取步骤如图呈现的树状形式来操作

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值