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获取步骤如图呈现的树状形式来操作
相关文章推荐
- 题 阅读 评论 评论权限 操作 以前实习期间写的一段mfc编程,对数据库和xml格式文档的相关操作 主要相关代码 之五 导入xml格式文档数据到数据库
- MFC操作--数据输出、注册表、文件统计和获取上级目录
- MFC获取错误代码
- MFC--获取磁盘信息
- Js 获取Gridview选中行的内容操作步骤
- MFC操作注册表常用函数
- 一种通过注册表获取USB虚拟串口端口号的方法
- MFC 或 DuiVision获取DC的方法总结
- windows的磁盘操作之三——获取和删除磁盘分区信息
- SqlServer中获取操作日期函数总结
- MSMQ的VB操作代码/步骤(简化版)
- 【vc】 获取磁盘信息代码
- usb由于其配置信息(注册表中的)不完整或已损坏,Windows 无法启动这个硬件设备(代码 19
- 【代码总结】Android开发:获取系统的缓存地址
- 【代码备忘录】VC设置您的计算机环境变量、注册表操作
- 将代码提交到CocoaPods超详细的操作步骤和图解
- MFC总结(一):MFC中文件操作、查找与选择总结(3)
- Java中JDBC连接数据库代码和步骤详解总结
- 使用xenocode代码混淆加密的操作步骤
- 注册表比较工具1 :RegShot尝试运用到安全测试中 --02 操作步骤