实际上我是要获取 USB_DEVICE_DESCRIPTOR 信息 用以得到其iManufacturer等数据我得到一个代码,枚举 HCDX 来获得每个控制器的每个端口的设备信息,原理已经明白。
已经成功获取到USB设备的 厂商、产品、序列号信息
用的是  IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION ,不过这个DeviceIoControl是对usb hub,是控制器发送的,而不是具体设备。我在WM_DEVICECHANGE中已经获取到 设备的 path,并且可以用CreateFile打开,
不过 用 DeviceIoControl + IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION  后 GetLastError提示 不支持该请求。那我如何在 WM_DEVICECHANGE 里 获取/反查 新接入设备的 控制器信息呢?
我想,这样的话,就可以接下来发送那个请求了。那位大侠告诉一下,谢谢了。

解决方案 »

  1.   

    http://www.codeproject.com/KB/system/HwDetect.aspx
    http://www.codeproject.com/KB/system/DevMgr.aspx
    看看这两个里面有没有你需要的东西
      

  2.   

    谢谢楼上关注,
    两个代码都看过了,的确都有WM_DEVICECHANGE消息的处理。更能获取到设备路径1. 不过怎么处理WM_DEVICECHANGE消息,已经有足够资料了,这不是问题了2. 我在楼顶帖子提到的“已经成功获取到USB设备的 厂商、产品、序列号信息 ”,这也不是问题,问题是: 我不是在上面第一条的情况下得到的。问题就是:在第一条的情况下怎么通过USB设备路径或者别的信息,来获取控制器设备路径?
    (这就类似于:GetParentXXX 似的。)
      

  3.   

    难道只能自己建立一个 USB 结点树,然后在 WM_DEVICECHANGE 的 DBT_DEVICEARRIVAL 里遍历 ?
      

  4.   

    30多度高温下
    顶顶顶顶顶~~顺便问一下,每次设备插入时,不管是同一设备插在不同的usb口,还是不同的设备插在同一usb口(两者都包括具有N级USB hub),他们的 driver key name 都是不同的吧?
      

  5.   

    问题就是:在第一条的情况下怎么通过USB设备路径或者别的信息,来获取控制器设备路径?
    这是什么意思?什么第一条
      

  6.   

    “第一条”就是“前两段标号为1的那行文字”,说白了就是:在处理 WM_DEVICECHANGE 消息的代码段里,
    通过,
       USB设备路径:
          PDEV_BROADCAST_DEVICEINTERFACE pDevInfo;
          pDevInfo->dbcc_name 不就是 USB设备的路径吗?可以用CreateFile打开的那种
           在WM_DEVICECHANGE里,以我的水平,能直接获得的只有这个值
           我现在想通过这个值,经过N个函数的调用,最后 获取到这个设备插入的USB端口所属的 控制器设备路径,或者什么都可以 只要能CreateFile打开,用DeviceIoControl 发送 IOCTL_XXX请求即可
           因为直接对设备发送请求,有很多都不支持。但是usb hub控制器支持。   或者别的信息:
           我目前的能力,不知道还有什么信息可以达到我的目的,如果有方法,请告之。谢谢!
      

  7.   

    你想获得 “控制器设备路径”?什么叫控制器设备路径?  PNP?Are you kidding me?
      

  8.   


    host controller driver我要用它的PDO name,然后 CreateFile, 然后DeviceIoControl来发送IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION请求。可能是我说错了术语,sorry.
    I'm not kidding you!
      

  9.   

    哦。你就是想得到PDO啊?设备名就是了么....?
    难怪你说CreateFile有问题  
      

  10.   

    得到盘符就是了咯for( TCHAR cLetter = _T('C'); cLetter <= _T('Z'); cLetter++ ) 

    CString sDrive (cLetter); 
    sDrive += _T(":\\"); 
    if(GetDriveType(sDrive)==DRIVE_REMOVABLE) 

    m_UDisk=sDrive; 
    //MessageBox(m_UDisk,"udisk:",0); 
    break; 

    } 有了盘符就能CreateFile了 
      

  11.   

    怎么获得设备名啊? 我要的不是USB的设备名,而是USB控制器的设备名
    不然那个请求是不支持的
      

  12.   

    还有种办法,通过GUID不过比较复杂,Ring3下还需要DDK的支持
    HidD_GetHidGuid (&hidGUID); DeviceInfoSet = SetupDiGetClassDevs (&hidGUID, NULL, NULL, (DIGCF_PRESENT | DIGCF_DEVICEINTERFACE));     deviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); if(DeviceInfoSet == INVALID_HANDLE_VALUE)
            printf("DeviceInfoSet is INVALID_HANDLE_VALUE\n"); result = SetupDiEnumDeviceInterfaces (DeviceInfoSet, NULL, &hidGUID, Index, &deviceInterfaceData);
    if (result == FALSE)
            SetupDiDestroyDeviceInfoList (DeviceInfoSet);
    SetupDiGetDeviceInterfaceDetail (DeviceInfoSet, &deviceInterfaceData, NULL, 0, &requiredSize, 0); 
    deviceDetail = (PSP_INTERFACE_DEVICE_DETAIL_DATA)malloc(requiredSize);
    deviceDetail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);    
    if(deviceDetail == NULL)
            printf("There is no enough memory space available for deviceDetail\n"); if (!SetupDiGetDeviceInterfaceDetail (DeviceInfoSet, &deviceInterfaceData, deviceDetail, requiredSize, &requiredSize, NULL)) 
    {
            printf("SetupDiGetDeviceInterfaceDetail failed\n");
            SetupDiDestroyDeviceInfoList (DeviceInfoSet);
            free (deviceDetail);
            return INVALID_HANDLE_VALUE;
    } printf("path: %s\n", deviceDetail->DevicePath);
    deviceHandle = CreateFile (deviceDetail->DevicePath, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);  if(deviceHandle == INVALID_HANDLE_VALUE);
            printf("CreateFile open failed (%d)\n", GetLastError()); SetupDiDestroyDeviceInfoList (DeviceInfoSet);
    free (deviceDetail);
      

  13.   

    我也不晓得,懂得少,反正就是
    CreateFile("HCD0", .....);
    HCD0,HCD1,HCD2之类的我通过它可以获得 ROOT HUB NAME,进而可以获得 更详细的信息来CreateFile
    另外,12楼的代码只是针对U盘,我要是USBKEY,或者摄像头……呢?
    14楼的代码,看似是 HID 类的, 这类的我不关心,况且,我想写我关注的,还要一个一个的分类写?那我还得在WM_DEVICECHANGE中,判断插入设备的功能性分类是哪一类的,how ? 
      

  14.   

    14楼的代码太强了,你不是故意把它弄混乱的吧?整理后编译运行,得出结论: 
    这个是获得具体设备的设备路径,这个我知道,不过我想继续问一下,在得到usb设备的DevicePath后,我想得到 A的设备路径,该怎么做?A的解释: USB设备插在机器上的一个插口,这个插口是usb hub的一个端口,而usb hub归 host controller管,windows有 host controller driver  ,就是这个A
    A有多个,HCD0, HCD1, HCD2 .....我想在USB设备插入的时候,就判断出插在哪个端口上,如果得不到,能得到该设备归哪个controller driver管也可以(这个时候,问题就是,如何求A)谢谢。