代码如下:
打开USB Hub设备之后,返回句柄hHubDevice,然后使用EnumerateHubPorts来枚举Hub的端
口。疑问在代码的中文注释中。
 bool CUsbEnumHub::EnumerateHubPorts(HANDLE hHubDevice, ULONG NumPorts, UsbItem* pRootItem)
{
ULONG index;
BOOL bSuccess;
PUSB_NODE_CONNECTION_INFORMATION_EX connectionInfo;
CString strDriverKeyName; // Loop over all ports of the hub.
// Port indices are 1 based, not 0 based.
for (index=; index <= NumPorts; index++)
{
ULONG nBytes;
bAwUsb = FALSE;
// Allocate space to hold the connection info for this port.
// For now, allocate it big enough to hold info for 30 pipes.
//
// Endpoint numbers are 0-15. Endpoint number 0 is the standard
// control endpoint which is not explicitly listed in the Configuration
// Descriptor. There can be an IN endpoint and an OUT endpoint at
// endpoint numbers 1-15 so there can be a maximum of 30 endpoints
// per device configuration.
// Should probably size this dynamically at some point.
nBytes = sizeof(USB_NODE_CONNECTION_INFORMATION_EX) +
sizeof(USB_PIPE_INFO) * ; connectionInfo = (PUSB_NODE_CONNECTION_INFORMATION_EX)ALLOC(nBytes); if (connectionInfo == NULL)
{
OOPS();
break;
} //
// Now query USBHUB for the USB_NODE_CONNECTION_INFORMATION_EX structure
// for this port. This will tell us if a device is attached to this
// port, among other things.
//
connectionInfo->ConnectionIndex = index; bSuccess = DeviceIoControl(hHubDevice,
IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX,
connectionInfo,
nBytes,
connectionInfo,
nBytes,
&nBytes,
NULL); if (!bSuccess)
{
FREE(connectionInfo);
continue;
}
UsbItem *pItemChild = new UsbItem;
pItemChild->parent = pRootItem;
pItemChild->strDisplayName.Format(_T("[Port%d]"), index); // Update the count of connected devices
if (connectionInfo->ConnectionStatus == DeviceConnected)
{
//获取Dirver Key Name
GetDriverKeyName(hHubDevice, index, pItemChild->strName);
//在这里,判断到端口有设备连接,请教怎么获取该设备的路径,就是可以使用CreateFile打开的那种路径。
//这里获取的Driver Key Name并不是路径,无法使用CreateFile来打开。
} // If the device connected to the port is an external hub, get the
// name of the external hub and recursively enumerate it.
if (connectionInfo->DeviceIsHub)
{
CString strExtHubName;
bSuccess = GetExternalHubName(hHubDevice, index, strExtHubName);
if (bSuccess)
{
pItemChild->strName = strExtHubName;
pItemChild->usbType = USB_TYPE_HUB;
pRootItem->childArray.Add(pItemChild);
EnumerateHub(strExtHubName, pItemChild);
// On to the next port
FREE(connectionInfo);
continue;
}
else
{
delete pItemChild;
}
}
else
{
pItemChild->usbType = USB_TYPE_PORT;
pRootItem->childArray.Add(pItemChild);
}
FREE(connectionInfo);
} return bSuccess ? true : false;
}
另一端代码,这段代码直接枚举USB设备,忽略USB Hub的枚举。这里的枚举可以获取到每
个连接到USB端口的设备的路径,可以使用CreateFile打开操作。
有没有办法把这里枚举到的USB设备和上面枚举到的USB设备建立联系呢?,代码如下:
 void CTurboDemoDlg::OnBnClickedSusb()
{
HANDLE hHCDev;
HDEVINFO hDevInfo;
SP_DEVICE_INTERFACE_DATA hDevInfoData;
PSP_DEVICE_INTERFACE_DETAIL_DATA deviceDetailData;
ULONG index;
ULONG requiredLength; hDevInfo = SetupDiGetClassDevs((LPGUID)&GUID_CLASS_USB_DEVICE,
NULL,
NULL,
(DIGCF_PRESENT | DIGCF_DEVICEINTERFACE));
if (hDevInfo == INVALID_HANDLE_VALUE)
{
return ;
}
hDevInfoData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
for (index=; SetupDiEnumDeviceInterfaces(hDevInfo,
,
(LPGUID)&GUID_CLASS_USB_DEVICE,
index,
&hDevInfoData); index++)
{
SetupDiGetDeviceInterfaceDetail(hDevInfo,
&hDevInfoData,
NULL,
,
&requiredLength,
NULL); deviceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)GlobalAlloc(GPTR, requi
redLength); deviceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); SetupDiGetDeviceInterfaceDetail(hDevInfo,
&hDevInfoData,
deviceDetailData,
requiredLength,
&requiredLength,
NULL); //deviceDetailData->DevicePath就是USB设备的路径
//但是使用该方法却又无法知道该设备在哪个Hub端口,苦恼。
hHCDev = CreateFile(deviceDetailData->DevicePath,
GENERIC_WRITE,
FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
,
NULL); // If the handle is valid, then we've successfully opened a Host
// Controller. Display some info about the Host Controller itself,
// then enumerate the Root Hub attached to the Host Controller.
if (hHCDev != INVALID_HANDLE_VALUE)
{
CString strMsg;
strMsg.Format(_T("Found: %s\n"), deviceDetailData->DevicePath);
OutputDebugString(strMsg); CloseHandle(hHCDev);
} GlobalFree(deviceDetailData);
} SetupDiDestroyDeviceInfoList(hDevInfo);
}

MFC枚举USB设备碰到的一个疑难,还没解决的更多相关文章

  1. 一个疑难bug的解决过程

    一个crontab脚本,下载一个文件并把内容入mysql数据库.具体流程如下: 1, wget一个文件. 2,处理文件生成一个中间文件. 3,将中间文件load入库. 05 10 * * * /hom ...

  2. C#:USB设备枚举 --转自CSDN作者:Splash

    (一)DeviceIoControl的PInvoke /* ---------------------------------------------------------- 文件名称:Device ...

  3. 你的USB设备还安全吗?USB的安全性已从根本上被打破!

    前言: USB设备使用方便,但也可能被用来携带恶意软件.病毒,感染计算机系统.通过禁用自动播放功能.杀毒软件查杀.不定期的对设备进行格式化等操作可以确保它是干净的.但它存在的安全问题要比我们想象的更深 ...

  4. USB设备的基本概念

    在终端用户看来,USB设备为主机提供了多种多样的附加功能,如文件传输,声音播放等,但对USB主机来说,它与所有USB设备的接口都是一致的.一个USB设备由3个功能模块组成:USB总线接口.USB逻辑设 ...

  5. USB设备驱动概述

    USB设备驱动 ·  )USB Hub:每个USBHost控制器都会自带一个USB Hub,被称为根(Root)Hub.这个根Hub可以接子(Sub)Hub,每个Hub上挂载USB设备.一般PC有8个 ...

  6. Linux自动共享USB设备:udev+Samba

    一.概述 公司最近要我实现USB设备插入Ubuntu后,自动共享到网络上,能像Windows共享一样(如\\192.168.1.10)访问里面的内容,不需要写入权限.当时听完这需求,我这新人表示惊呆了 ...

  7. USB设备架构

    USB设备,分为3层:1.底层为传送和接受数据的总线接口:2.中间层处理总线和不同端点的数据传输:3.最高层由串行总线设备提供.主要研究中间层. USB设备状态,主要研究外部可见状态. 1,连接态-- ...

  8. USB协议-USB设备的枚举过程

    USB主机在检测到USB设备插入后,就要对设备进行枚举了.为什么要枚举?枚举就是从设备读取各种描述符信息,这样主机就可以根据这些信息来加载合适的驱动程序,从而知道设备是什么样的设备,如何进行通信等. ...

  9. usb设备枚举过程

    USB主机在检测到USB设备插入后,就要对设备进行枚举了.为什么要枚举呢?枚举就是从设备读取一些信息,知道设备是什么样的设备,如何进行通信,这样主机就可以根据这些信息来加载合适的驱动程序.调试USB设 ...

随机推荐

  1. 【Cocos2d-X开发学习笔记】第26期:游戏背景之滚动地图背景(CCParallaxNode)的使用

    本系列学习教程使用的是cocos2d-x-2.1.4(最新版为3.0alpha0-pre) ,PC开发环境Windows7,C++开发环境VS2010 在现实生活中,当我们身处一辆快速行驶的车上,用眼 ...

  2. 三星 note3销售地查询、销售地代码

    查看销售地代码 用KIES验销售地:记下设定-关于-状态里的序号. 手机不要连接电脑,注意是不要连接,打开KIES3,点工具——固件恢复和初始化,输入大写的型号SM-N900或者SM-N9005,确认 ...

  3. android图片缓存框架Android-Universal-Image-Loader(二)

    http://blog.csdn.net/king_is_everyone/article/details/35595515 这篇打算直接告诉大家怎么用吧,其实这个也不是很难的框架,大致使用过程如下: ...

  4. htaccess 正则规则整理(转)

    为了方便 htaccess 编写正则,这里整理了一下 htaccess 的正则规则. # —— 位于行首时表示注释. [F] —— Forbidden(禁止): 命令服务器返回 403 Forbidd ...

  5. Linux 套接字编程中要注意的细节

    隐患 1.忽略返回状态 第一个隐患很明显,但它是开发新手最容易犯的一个错误.如果您忽略函数的返回状态,当它们失败或部分成功的时候,您也许会迷失.反过来,这可能传播错误,使定位问题的源头变得困难. 捕获 ...

  6. tomcat 8.0 安装

    tomcat 安装算是非常简单的, 因自己使用ubuntu,所以以下环境均为 ubuntu 操作系统下 tomcat 官方简介 tomcat 各版本下载 这里我使用二进制版本(binary distr ...

  7. 正则表达式中/i,/g,/ig,/gi,/m的区别和含义

    正则表达式中/i,/g,/ig,/gi,/m的区别和含义 /i (忽略大小写)/g (全文查找出现的所有匹配字符)/m (多行查找)/gi(全文查找.忽略大小写)/ig(全文查找.忽略大小写)

  8. ZOJ 3822 Domination(概率dp)

    一个n行m列的棋盘,每天可以放一个棋子,问要使得棋盘的每行每列都至少有一个棋子 需要的放棋子天数的期望. dp[i][j][k]表示用了k天棋子共能占领棋盘的i行j列的概率. 他的放置策略是,每放一次 ...

  9. .net验证控件

    一.客户端验证(用户体验,减少服务器端压力) 二.服务器端验证(防止恶意攻击,客户端js很容易被绕过) 验证控件:RequiredFieldValidator:字段必填:RangeValidator: ...

  10. codevs 1281 Xn数列 (矩阵乘法)

    /* 再来个题练练手 scanf longlong 有bug....... */ #include<cstdio> #include<iostream> #include< ...