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 打赏 收藏 转发到动态 举报
写回复
用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;
}

21,597

社区成员

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

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