关于获取USB设备描述符

A33228371 2011-02-13 08:31:54
我仿照usbview的代码来读取USB设备的信息时出现了如下问题,请大家指教:

在读取U盘的信息时,这个函数GetConfigDescriptor(
返回NULL,经跟踪是success = DeviceIoControl(hHubDevice,
IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION,
configDescReq,
nBytes,
configDescReq,
nBytes,
&nBytesReturned,
NULL);

不成功,得到错误号码是31.

导致我不能获取接口描述符,但是设备描述符仍可以读出

不是所有U盘有这种情况,只是其中一部分读取失败,但USBVIEW软件可以正确读出。

不知哪里仿照的不对,请指教,谢谢!
...全文
686 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
A33228371 2011-02-15
  • 打赏
  • 举报
回复
设备描述符号读取是成功的,两个过程是分开的。

先读设备描述符,后读配置描述符号。

如你所说,我再仔细review下usbview的代码。

谢谢!
曹大夯 2011-02-14
  • 打赏
  • 举报
回复
[Quote=引用楼主 a33228371 的回复:]
不是所有U盘有这种情况,只是其中一部分读取失败,但USBVIEW软件可以正确读出。
[/Quote]

你的意思是有些U盘设备,通过你的代码是可以得到Configuration Descriptor的,而有些U盘则会返回31错误号?
如果是,那么问题确实很奇怪。
曹大夯 2011-02-14
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 a33228371 的回复:]

试图获取一个hub所接设备的usb设备描述符,但返回的USBDeviceDescriptor.bDeviceClass域总是为0。

[/Quote]

你确定你读取到的设备描述符是你自己的U盘么?如果你的设备USBDeviceDescriptor.bDeviceClass是有值的,那么读取成功的情况下,USBDeviceDescriptor.bDeviceClass不可能为0.
曹大夯 2011-02-14
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 a33228371 的回复:]

感觉他的情况跟我一样 就是读取不成功。

读到0,我认为是代码里变量的初始值,读取失败,因为逻辑关系,可能没有对接收的变量赋值,故仍为0.

我显示出来的值就是0,因为根本就没赋值。
[/Quote]

那么,USBDeviceDescriptor其他域的值是多少呢?全0?
这么说,事实上你读取USB 设备描述符(Device Descriptor)和Configuration Descriptor都是不成功的。

再仔细研究一下usbview的代码,看看你写的代码有什么问题没有。
A33228371 2011-02-14
  • 打赏
  • 举报
回复
ddk中的usbview示例用:
DeviceIoControl(hHubDevice,
IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION,
...)
试图获取一个hub所接设备的usb设备描述符,但返回的USBDeviceDescriptor.bDeviceClass域总是为0。

这是为什么呢?还有其它方法吗?

曾经发过一次,一直无人回答;查了不少资料,也没有头绪。还望高手不佞赐教。
A33228371 2011-02-14
  • 打赏
  • 举报
回复
不能得到我想要的bInterfaceClass值。
A33228371 2011-02-14
  • 打赏
  • 举报
回复
是的,但是仍可以读取设备描述符号。
代码如下:
if (connectionInfo->ConnectionStatus == DeviceConnected)
{
configDesc = GetConfigDescriptor(hHubDevice,index,0);
}
结果configDesc=NULL;PUSB_DESCRIPTOR_REQUEST
GetConfigDescriptor(HANDLE hHubDevice,ULONG ConnectionIndex,UCHAR DescriptorIndex)
{
BOOL success;
ULONG nBytes;
ULONG nBytesReturned;

UCHAR configDescReqBuf[sizeof(USB_DESCRIPTOR_REQUEST) +
sizeof(USB_CONFIGURATION_DESCRIPTOR)];

PUSB_DESCRIPTOR_REQUEST configDescReq;
PUSB_CONFIGURATION_DESCRIPTOR configDesc;


// Request the Configuration Descriptor the first time using our
// local buffer, which is just big enough for the Cofiguration
// Descriptor itself.
//
nBytes = sizeof(configDescReqBuf);

configDescReq = (PUSB_DESCRIPTOR_REQUEST)configDescReqBuf;
configDesc = (PUSB_CONFIGURATION_DESCRIPTOR)(configDescReq+1);

// Zero fill the entire request structure
//
memset(configDescReq, 0, nBytes);

// Indicate the port from which the descriptor will be requested
//
configDescReq->ConnectionIndex = ConnectionIndex;

//
// USBHUB uses URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE to process this
// IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION request.
//
// USBD will automatically initialize these fields:
// bmRequest = 0x80
// bRequest = 0x06
//
// We must inititialize these fields:
// wValue = Descriptor Type (high) and Descriptor Index (low byte)
// wIndex = Zero (or Language ID for String Descriptors)
// wLength = Length of descriptor buffer
//
configDescReq->SetupPacket.wValue = (USB_CONFIGURATION_DESCRIPTOR_TYPE << 8)
| DescriptorIndex;

configDescReq->SetupPacket.wLength = (USHORT)(nBytes - sizeof(USB_DESCRIPTOR_REQUEST));

// Now issue the get descriptor request.
//
success = DeviceIoControl(hHubDevice,
IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION,
configDescReq,
nBytes,
configDescReq,
nBytes,
&nBytesReturned,
NULL);

if (!success)
{
//OOPS();
return NULL;
}

if (nBytes != nBytesReturned)
{
//OOPS();
return NULL;
}

if (configDesc->wTotalLength < sizeof(USB_CONFIGURATION_DESCRIPTOR))
{
//OOPS();
return NULL;
}

// Now request the entire Configuration Descriptor using a dynamically
// allocated buffer which is sized big enough to hold the entire descriptor
//
nBytes = sizeof(USB_DESCRIPTOR_REQUEST) + configDesc->wTotalLength;

configDescReq = (PUSB_DESCRIPTOR_REQUEST)malloc(nBytes);

if (configDescReq == NULL)
{
//OOPS();
return NULL;
}

configDesc = (PUSB_CONFIGURATION_DESCRIPTOR)(configDescReq+1);

// Indicate the port from which the descriptor will be requested
//
configDescReq->ConnectionIndex = ConnectionIndex;

//
// USBHUB uses URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE to process this
// IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION request.
//
// USBD will automatically initialize these fields:
// bmRequest = 0x80
// bRequest = 0x06
//
// We must inititialize these fields:
// wValue = Descriptor Type (high) and Descriptor Index (low byte)
// wIndex = Zero (or Language ID for String Descriptors)
// wLength = Length of descriptor buffer
//
configDescReq->SetupPacket.wValue = (USB_CONFIGURATION_DESCRIPTOR_TYPE << 8)
| DescriptorIndex;

configDescReq->SetupPacket.wLength = (USHORT)(nBytes - sizeof(USB_DESCRIPTOR_REQUEST));

// Now issue the get descriptor request.
//
success = DeviceIoControl(hHubDevice,
IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION,
configDescReq,
nBytes,
configDescReq,
nBytes,
&nBytesReturned,
NULL);
if(success)
{
//USB_INTERFACE_DESCRIPTOR* intf2 = (USB_INTERFACE_DESCRIPTOR*)configDesc;
//MyPrintf("bInterfaceClass: d%", intf2->bInterfaceClass);
GetPortConfDescString(configDesc);

}


if (!success)//这里返回了NULL
{
//OOPS();
free(configDescReq);
MyPrintf("bInterfaceClass: %d\n" ,GetLastError());
return NULL;
}
if (nBytes != nBytesReturned)
{
//OOPS();
free(configDescReq);
return NULL;
}

if (configDesc->wTotalLength != (nBytes - sizeof(USB_DESCRIPTOR_REQUEST)))
{
//OOPS();
free(configDescReq);
return NULL;
}

return configDescReq;
}
请指教,谢谢!
A33228371 2011-02-14
  • 打赏
  • 举报
回复
谢谢Huntercao.

4楼的那个那个帖子 是网上别人提出来的 我把它粘贴过来了

感觉他的情况跟我一样 就是读取不成功。

读到0,我认为是代码里变量的初始值,读取失败,因为逻辑关系,可能没有对接收的变量赋值,故仍为0.

我显示出来的值就是0,因为根本就没赋值。

21,595

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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