VC中如何用usbioctl.h提供的usb设备信息用createfile获取指定usb设备句柄

yaffy_koyo 2012-05-10 11:18:31
在遍历root hub的时候可以使用usbioctl.h中提供的PUSB_ROOT_HUB_NAME转换后所得的名字获取对应的正确句柄,而到下一层usb设备的时候,由PUSB_NODE_CONNECTION_DRIVERKEY_NAME转换来的相同格式的名字就不再正确了。得到句柄都是0xfffff....或者还有其他什么获取设备句柄的方式,不要只是hid或者u盘之类的,可以通用的~我现在是做到了用usbioctl.h所提供的东西遍历到所有的usb设备,但是无法对单个usb设备获取设备名和句柄。。。
...全文
809 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
宝蓝情调 2012-11-26
  • 打赏
  • 举报
回复
c# 怎么获取usb设备的兼容id?
yaffy_koyo 2012-05-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

如果该端口没有连接设备, 当然无法获取信息
另外, 端口上可能又连接到一个集线器, 真实的设备可能通过好几层的集线器连接到控制器

部分片段
C/C++ code

BOOL NUsb::GetHubPortInfo(CHAR *pHubPath, int nIndex, _PortInfo &PortInfo)
{
CAutoHandle ……
[/Quote]


额,端口检测到设备我才去获取句柄的,全部失败,设备在注册表里的类似于这种{36FC9E60-C465-11CF-8056-444553540000}\0018信息倒是可以获得,就是拿不到句柄,如果端口连得是hub,hub其实也算是设备嘛,我没有再去找第二层hub下的设备,但hub也算是设备,它本身也有句柄的吧。
Yofoo 2012-05-11
  • 打赏
  • 举报
回复
如果该端口没有连接设备, 当然无法获取信息
另外, 端口上可能又连接到一个集线器, 真实的设备可能通过好几层的集线器连接到控制器

部分片段

BOOL NUsb::GetHubPortInfo(CHAR *pHubPath, int nIndex, _PortInfo &PortInfo)
{
CAutoHandle hHubDevice;
CHAR szText[1024];
BOOL bRetVal;
CHAR szFullPath[MAXPATH];

USB_NODE_CONNECTION_INFORMATION * pConInfo;

strcpy(szFullPath, "\\\\.\\");
strcat(szFullPath, pHubPath);

strcpy(PortInfo.szHubPath, pHubPath);
PortInfo.nHubPortIndex = nIndex;
PortInfo.bConnected = FALSE;
memset(PortInfo.bzConInfo, 0, sizeof(PortInfo.bzConInfo));
PortInfo.pConInfo = NULL;

hHubDevice = CreateFileA(szFullPath, GENERIC_WRITE, FILE_SHARE_WRITE, NULL,
OPEN_EXISTING, 0, NULL);
if(hHubDevice == NULL || hHubDevice == INVALID_HANDLE_VALUE)
return FALSE;

bRetVal = GetConnectInfo(hHubDevice, nIndex, PortInfo.bzConInfo, &pConInfo);
if(bRetVal == FALSE || pConInfo == NULL)
return FALSE;

PortInfo.pConInfo = pConInfo;
if(pConInfo->ConnectionStatus == NoDeviceConnected)
{
PortInfo.bConnected = FALSE;
return TRUE;
}
PortInfo.bConnected = TRUE;
GetConDrvKeyName(hHubDevice, nIndex, PortInfo.szConDrvKey);

if(PortInfo.pConInfo->DeviceIsHub)
{
GetHubNodeConName(hHubDevice, nIndex, PortInfo.szHubNodeConName);
}

bRetVal = NDev::GetDeviceDescripByKey((GUID)GUID_CLASS_USB_DEVICE, PortInfo.szConDrvKey, PortInfo.szDescrip);
if(bRetVal == FALSE)
assert(0);

GetDescripConfig(hHubDevice, nIndex, &PortInfo);

int i;
int nCount;
std::vector<int> vLangId;

GetDescripLangId(hHubDevice, nIndex, vLangId);
// if(vLangId.size() <= 0)
// vLangId.push_back(0);
nCount = (int)vLangId.size();
for(i=0; i<nCount; i++)
{
if(pConInfo->DeviceDescriptor.iManufacturer)
{
szText[0] = 0;
GetDescripString(hHubDevice, nIndex, pConInfo->DeviceDescriptor.iManufacturer, vLangId[i], szText);
if(PortInfo.szManufacturer[0])
strcat(PortInfo.szManufacturer, ";");
strcat(PortInfo.szManufacturer, szText);
}

if(pConInfo->DeviceDescriptor.iProduct)
{
szText[0] = 0;
GetDescripString(hHubDevice, nIndex, pConInfo->DeviceDescriptor.iProduct, vLangId[i], szText);
if(PortInfo.szProduct[0])
strcat(PortInfo.szProduct, ";");
strcat(PortInfo.szProduct, szText);
}

if(pConInfo->DeviceDescriptor.iSerialNumber)
{
szText[0] = 0;
GetDescripString(hHubDevice, nIndex, pConInfo->DeviceDescriptor.iSerialNumber, vLangId[i], szText);
if(PortInfo.szSerialNumber[0])
strcat(PortInfo.szSerialNumber, ";");
strcat(PortInfo.szSerialNumber, szText);
}
}

return TRUE;
}

2,643

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧