实际上我是要获取 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 里 获取/反查 新接入设备的 控制器信息呢?
我想,这样的话,就可以接下来发送那个请求了。那位大侠告诉一下,谢谢了。
已经成功获取到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 里 获取/反查 新接入设备的 控制器信息呢?
我想,这样的话,就可以接下来发送那个请求了。那位大侠告诉一下,谢谢了。
http://www.codeproject.com/KB/system/DevMgr.aspx
看看这两个里面有没有你需要的东西
两个代码都看过了,的确都有WM_DEVICECHANGE消息的处理。更能获取到设备路径1. 不过怎么处理WM_DEVICECHANGE消息,已经有足够资料了,这不是问题了2. 我在楼顶帖子提到的“已经成功获取到USB设备的 厂商、产品、序列号信息 ”,这也不是问题,问题是: 我不是在上面第一条的情况下得到的。问题就是:在第一条的情况下怎么通过USB设备路径或者别的信息,来获取控制器设备路径?
(这就类似于:GetParentXXX 似的。)
顶顶顶顶顶~~顺便问一下,每次设备插入时,不管是同一设备插在不同的usb口,还是不同的设备插在同一usb口(两者都包括具有N级USB hub),他们的 driver key name 都是不同的吧?
这是什么意思?什么第一条
通过,
USB设备路径:
PDEV_BROADCAST_DEVICEINTERFACE pDevInfo;
pDevInfo->dbcc_name 不就是 USB设备的路径吗?可以用CreateFile打开的那种
在WM_DEVICECHANGE里,以我的水平,能直接获得的只有这个值
我现在想通过这个值,经过N个函数的调用,最后 获取到这个设备插入的USB端口所属的 控制器设备路径,或者什么都可以 只要能CreateFile打开,用DeviceIoControl 发送 IOCTL_XXX请求即可
因为直接对设备发送请求,有很多都不支持。但是usb hub控制器支持。 或者别的信息:
我目前的能力,不知道还有什么信息可以达到我的目的,如果有方法,请告之。谢谢!
host controller driver我要用它的PDO name,然后 CreateFile, 然后DeviceIoControl来发送IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION请求。可能是我说错了术语,sorry.
I'm not kidding you!
难怪你说CreateFile有问题
{
CString sDrive (cLetter);
sDrive += _T(":\\");
if(GetDriveType(sDrive)==DRIVE_REMOVABLE)
{
m_UDisk=sDrive;
//MessageBox(m_UDisk,"udisk:",0);
break;
}
} 有了盘符就能CreateFile了
不然那个请求是不支持的
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);
CreateFile("HCD0", .....);
HCD0,HCD1,HCD2之类的我通过它可以获得 ROOT HUB NAME,进而可以获得 更详细的信息来CreateFile
另外,12楼的代码只是针对U盘,我要是USBKEY,或者摄像头……呢?
14楼的代码,看似是 HID 类的, 这类的我不关心,况且,我想写我关注的,还要一个一个的分类写?那我还得在WM_DEVICECHANGE中,判断插入设备的功能性分类是哪一类的,how ?
这个是获得具体设备的设备路径,这个我知道,不过我想继续问一下,在得到usb设备的DevicePath后,我想得到 A的设备路径,该怎么做?A的解释: USB设备插在机器上的一个插口,这个插口是usb hub的一个端口,而usb hub归 host controller管,windows有 host controller driver ,就是这个A
A有多个,HCD0, HCD1, HCD2 .....我想在USB设备插入的时候,就判断出插在哪个端口上,如果得不到,能得到该设备归哪个controller driver管也可以(这个时候,问题就是,如何求A)谢谢。