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获取步骤如图呈现的树状形式来操作