社区
驱动开发/核心开发
帖子详情
U盘过滤驱动如何获取设备描述符?[
A33228371
2011-02-22 04:28:41
我想做一个U盘过滤驱动,驱动挂载在{4D36E967-E325-11CE-BFC1-08002BE10318}下,想在过滤驱动的例程里构造USB请求包获取设备描述符号,结果一直调不通,出现问题如下:
1、起初想在SCSI的读写里获取,通过LOG显示得知,系统会发若干读写请求,不知为什么?
2、在PNP的 start device过程里读取,也不可以。
3、与虚拟机环境是否有关系
谢谢!
...全文
184
3
打赏
收藏
U盘过滤驱动如何获取设备描述符?[
我想做一个U盘过滤驱动,驱动挂载在{4D36E967-E325-11CE-BFC1-08002BE10318}下,想在过滤驱动的例程里构造USB请求包获取设备描述符号,结果一直调不通,出现问题如下: 1、起初想在SCSI的读写里获取,通过LOG显示得知,系统会发若干读写请求,不知为什么? 2、在PNP的 start device过程里读取,也不可以。 3、与虚拟机环境是否有关系 谢谢!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
3 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
A33228371
2011-02-22
打赏
举报
回复
此外加上这个KeInitializeEvent(&event, NotificationEvent, FALSE);
驱动不能正常加载!
A33228371
2011-02-22
打赏
举报
回复
我参考U盘驱动的代码,想构造一个URB,但是没有获取到设备描述符。
代码如下,大家给看看是什么错误
typedef struct tagDEVICE_EXTENSION {
PDEVICE_OBJECT DeviceObject; // device object this extension belongs to
PDEVICE_OBJECT LowerDeviceObject; // next lower driver in same stack
PDEVICE_OBJECT Pdo; // the PDO
IO_REMOVE_LOCK RemoveLock;
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
NTSTATUS
ReadandSelectDescriptors( IN PDEVICE_OBJECT DeviceObject )
{
KdPrint(("ReadandSelectDescriptors begin\n"));
PURB urb;
ULONG siz;
NTSTATUS ntStatus;
PUSB_DEVICE_DESCRIPTOR deviceDescriptor;
urb = NULL;
deviceDescriptor = NULL;
//Read the device descriptor
urb = (PURB)ExAllocatePool(NonPagedPool, sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST));
if(urb)
{
siz = sizeof(USB_DEVICE_DESCRIPTOR);
deviceDescriptor = (PUSB_DEVICE_DESCRIPTOR)ExAllocatePool(NonPagedPool, siz);
if(deviceDescriptor) //注意看一下
{
UsbBuildGetDescriptorRequest(
urb,
(USHORT) sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST),
USB_DEVICE_DESCRIPTOR_TYPE,
0,
0,
deviceDescriptor,
NULL,
siz,
NULL);
ntStatus = CallUSBD(DeviceObject, urb);
if(NT_SUCCESS(ntStatus))
{
ASSERT(deviceDescriptor->bNumConfigurations);
//ntStatus = ConfigureDevice(DeviceObject);
KdPrint(("get deviceDescriptor success!"));
}
ExFreePool(urb);
ExFreePool(deviceDescriptor);
}
else
{
ExFreePool(urb);
ntStatus = STATUS_INSUFFICIENT_RESOURCES;
}
}
else
{
ntStatus = STATUS_INSUFFICIENT_RESOURCES;
}
return ntStatus;
}
NTSTATUS
CallUSBD(
IN PDEVICE_OBJECT DeviceObject,
IN PURB Urb
)
{
PIRP irp;
KEVENT event;
NTSTATUS ntStatus;
IO_STATUS_BLOCK ioStatus;
PIO_STACK_LOCATION nextStack;
PDEVICE_EXTENSION pdx;
irp = NULL;
pdx = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension;
//KeInitializeEvent(&event, NotificationEvent, FALSE);
irp = IoBuildDeviceIoControlRequest(IOCTL_INTERNAL_USB_SUBMIT_URB,
pdx->LowerDeviceObject,
NULL,
0,
NULL,
0,
TRUE,
&event,
&ioStatus);
if(!irp)
{
KdPrint(("IoBuildDeviceIoControlRequest failed\n"));
return STATUS_INSUFFICIENT_RESOURCES;
}
nextStack = IoGetNextIrpStackLocation(irp);
ASSERT(nextStack != NULL);
nextStack->Parameters.Others.Argument1 = Urb;
// IoSetCompletionRoutine(irp, (PIO_COMPLETION_ROUTINE) GetDescriptorCompletionRoutine,
// (PVOID) pdx, TRUE, TRUE, TRUE);
ntStatus = IoCallDriver(pdx->LowerDeviceObject, irp);
if(ntStatus == STATUS_PENDING)
{
//KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL);
ntStatus = ioStatus.Status;
}
return ntStatus;
}
圈圈教你玩USB(全书)
3.6
设备
描述符
的实现 17 3.7
设备
描述符
的返回 20 3.8 设置地址请求的处理 30 3.9 配置
描述符
集合的结构 32 3.9.1 配置
描述符
的结构 32 3.9.2 接口
描述符
的结构 33 3.9.3 端点
描述符
的结构 33 3.9.4 HID描述...
圈圈教你玩USB
/* 也是从其他地方搞过来的,花了不少积分,我就1分奉献了吧,绝对是好书~ */ 第1章USB概述及协议基础 1.1USB是什么 1.2USB的特点 ...第10章USB
过滤
驱动
开发 附录第3章实例的完整调试信息 参考文献 后记 ……
windows
驱动
开发技术详解-part2
这两个
驱动
程序没有操作具体的硬件
设备
,只是在系统里创建了虚拟
设备
。在随后的章节中,它们会作 为基本
驱动
程序框架,被本书其他章节的
驱动
程序开发所复用。笔者将带领读者编写代码、编译、安装 和调试程序。 ...
Windows
驱动
开发技术详解的光盘-part1
这两个
驱动
程序没有操作具体的硬件
设备
,只是在系统里创建了虚拟
设备
。在随后的章节中,它们会作为基本
驱动
程序框架,被本书其他章节的
驱动
程序开发所复用。笔者将带领读者编写代码、编译、安装和调试程序。 1.1 ...
基于串流云桌面的远程外设
驱动
——HID(人机接口
设备
)的
描述符
介绍
HID(Human Interface Device,人机接口
设备
)是USB
设备
中常用的
设备
类型,是直接与人交互的USB
设备
(例如键盘、鼠标与...例如我们可以在
设备
管理器中看到如下:那么Windows是怎么知道插入的
设备
是
U盘
还是键盘鼠标呢?
驱动开发/核心开发
21,597
社区成员
21,709
社区内容
发帖
与我相关
我的任务
驱动开发/核心开发
硬件/嵌入开发 驱动开发/核心开发
复制链接
扫一扫
分享
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章