打印

查找所有连接的usb设备

[复制链接]
655|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xxmmi|  楼主 | 2018-11-8 15:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
网上有个testUSB程序,可以查找所有连接的usb设备。我现在编的界面,是读插入的IC卡的数据库及改写其中数据,密码等。首先刷新设备,查找到所有连接的USB设备,选择设备后又要选择设备的一个端点。
  我不会的就是如何读出USB设备的端点来,usb100.h中的typedef struct _USB_INTERFACE_DESCRIPTOR有UCHAR bNumEndpoints,但是我直接调用程序有问题,自动关闭了界面。
沙发
chuxh| | 2018-11-8 15:44 | 只看该作者
打开了usb控制器,HUB?读出了port的数目了吗?

使用特权

评论回复
板凳
xxmmi|  楼主 | 2018-11-8 15:47 | 只看该作者

是的,不知道下面该怎么编了。

使用特权

评论回复
地板
xxmmi|  楼主 | 2018-11-8 15:53 | 只看该作者
不知道是不是要读设备描述符,配置描述符,界面描述符和端点描述符之类的。

使用特权

评论回复
5
dingy| | 2018-11-8 16:00 | 只看该作者
把代码贴上来吧

使用特权

评论回复
6
xxmmi|  楼主 | 2018-11-8 16:10 | 只看该作者

#include "usb100.h";
#include "usbioctl.h";
#include "usbdi.h";

void CICcard::OnUpdateMachine()
{
PUSB_NODE_CONNECTION_INFORMATION connectionInfo;
HANDLE hHubDevice;
for (HCNum = 0; HCNum < NUM_HCS_TO_CHECK; HCNum++)
{
  wsprintf(HCName, "\\\\.\\HCD%d", HCNum);
  hHCDev = CreateFile(HCName, //打开USB控制器
  GENERIC_WRITE,
  FILE_SHARE_WRITE,
  NULL,
  OPEN_EXISTING,
  0,
  NULL);
  if(hHCDev=INVALID_HANDLE_VALUE) break;
  PCHAR driverKeyName, deviceDesc;
  driverKeyName = GetHCDDriverKeyName(hHCDev);

  rootHubName =(char*) GetRootHubName(hHCDev);
  if(rootHubName==NULL)
  goto end;

  PUSB_NODE_INFORMATION HubInfo;
  HubInfo = (PUSB_NODE_INFORMATION)malloc(sizeof(USB_NODE_INFORMATION));
  PCHAR deviceName;
  deviceName = (PCHAR)malloc(strlen(rootHubName) + sizeof("\\\\.\\"));
  if (rootHubName != NULL)
  {
  strcpy(deviceName, "\\\\.\\");
  strcpy(deviceName + sizeof("\\\\.\\") - 1, rootHubName);
  hHubDevice = CreateFile(deviceName, //打开Hub
  GENERIC_WRITE,
  FILE_SHARE_WRITE,
  NULL,
  OPEN_EXISTING,
  0,
  NULL);
  free(deviceName);
  if(hHubDevice == INVALID_HANDLE_VALUE)
  goto end;   
  success = DeviceIoControl(hHubDevice,
  IOCTL_USB_GET_NODE_INFORMATION,
  HubInfo,
  sizeof(USB_NODE_INFORMATION),
  HubInfo,
  sizeof(USB_NODE_INFORMATION),
  &nBytes,
  NULL);
  if (!success)
  goto end;
  }

  int port;
  port=HubInfo->u.HubInformation.HubDescriptor.bNumberOfPorts; //读端口数
  for(index=1; index <= port; index++)
  {
  ULONG nBytes;
  nBytes = sizeof(USB_NODE_CONNECTION_INFORMATION) +
  sizeof(USB_PIPE_INFO)*30;
  connectionInfo = (PUSB_NODE_CONNECTION_INFORMATION)malloc(nBytes);
  if(connectionInfo == NULL)
  goto end;
  connectionInfo->ConnectionIndex = index;
  success = DeviceIoControl(hHubDevice,
  IOCTL_USB_GET_NODE_CONNECTION_INFORMATION,
  connectionInfo,
  nBytes,
  connectionInfo,
  nBytes,
  &nBytes,
  NULL);
  if (!success)
  {
  free(connectionInfo);
  goto end;
  }
  deviceDesc = NULL;
  if(connectionInfo->ConnectionStatus != NoDeviceConnected)
  {
  driverKeyName = GetDriverKeyName(hHubDevice,
  index);
  if(driverKeyName)
//估计在这里开始加程序吧?
  }
  }
  end:;  
  }
  CloseHandle(hHubDevice);
  CloseHandle(hHCDev);
}

使用特权

评论回复
7
supernan| | 2018-11-8 16:16 | 只看该作者
个人感觉,应该一路读下去,得到设备和端点的句柄,分清端点可读还是可写,通过句柄操作设备。

使用特权

评论回复
8
xxrs| | 2018-11-8 16:20 | 只看该作者
CYPRESS的USB芯片已经有了更高级的驱动程序,设备、端点已经封装为相应的类,不需要读的这么辛苦。

使用特权

评论回复
9
liuzaiy| | 2018-11-8 16:24 | 只看该作者
读端点好像用的是控制传说模式吧,好久不做了,都有点生疏了。

使用特权

评论回复
10
pangb| | 2018-11-8 16:28 | 只看该作者
lz最好用cyapi.sys这个驱动,代码相对容易看点,我个人觉得

使用特权

评论回复
11
ousj| | 2018-11-8 16:34 | 只看该作者
WDM/WDK的代码?看样子,没有得到EPS.NUM前,楼主尚需轮回下去吧,for(){:D:Q:'(:lol:shutup:}

使用特权

评论回复
12
xxmmi|  楼主 | 2018-11-8 16:37 | 只看该作者
其实还是不大明白,我再琢磨琢磨吧,多谢了哈,结贴了先

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

369

主题

4278

帖子

2

粉丝