square690410
驱动牛犊
驱动牛犊
  • 注册日期2007-01-31
  • 最后登录2007-07-09
  • 粉丝0
  • 关注0
  • 积分190分
  • 威望20点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
阅读:2582回复:0

如何抓取USB Device Class Code

楼主#
更多 发布于:2007-05-02 16:46
  我用filter driver使用
UsbBuildGetDescriptorRequest(&urb2, sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST), USB_INTERFACE_DESCRIPTOR_TYPE,
            0, 0, &data2, NULL, sizeof(data2), NULL);

status = SendAwaitUrb(fido,&urb2);

NTSTATUS SendAwaitUrb(PDEVICE_OBJECT fdo, PURB urb)
    {                            // SendAwaitUrb
    KEVENT ioevent;
    IO_STATUS_BLOCK iostatus;
    PIRP Irp;
    PIO_STACK_LOCATION stack;
    NTSTATUS status = STATUS_SUCCESS;
    PDEVICE_EXTENSION pdx;

    PAGED_CODE();
    ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);

    pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;

    KeInitializeEvent(&ioevent, NotificationEvent, FALSE);
    
    Irp = IoBuildDeviceIoControlRequest(IOCTL_INTERNAL_USB_SUBMIT_URB,
        pdx->LowerDeviceObject, NULL, 0, NULL, 0, TRUE, &ioevent, &iostatus);

    if (!Irp)
    {
        KdPrint((DRIVERNAME " - Unable to allocate IRP for sending URB\n"));
        return STATUS_INSUFFICIENT_RESOURCES;
    }

    stack = IoGetNextIrpStackLocation(Irp);
    stack->Parameters.Others.Argument1 = (PVOID) urb;
    
    status = IoCallDriver(pdx->LowerDeviceObject, Irp);
        
    if (status == STATUS_PENDING)
    {
        KeWaitForSingleObject(&ioevent, Executive, KernelMode, FALSE, NULL);
        status = iostatus.Status;
    }    
    return status;
}

不管是Lower或Upper的filter型式(class filter),傳回的class code頂多是9(usb hub),
不然就是NTSTATUS出現 c000009d,c0000001或USBD Status出現錯誤.....完全沒辦法抓到
Device的class code,救救我啊.......
游客

返回顶部