您的位置:首页 > 编程语言

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

2018-03-07 09:18 1996 查看
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获取步骤如图呈现的树状形式来操作

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: