windows USB 设备驱动程序开发-总线接口查询
  TEZNKK3IfmPf 10天前 22 0
总线接口的查询

USB 客户端驱动程序可以获取对USB总线驱动程序接口的引用,并使用它来访问总线驱动程序例程,而不是使用 I/O 请求数据包 (IRP) 机制。

使用总线驱动程序接口为客户端驱动程序提供了几个优势:

  • 它可以使用接口的服务,而无需分配 IRP;
  • 它可以在引发 IRQL 时调用接口的例程;

在 Windows Vista USB 中,客户端驱动程序本身可以公开接口,以帮助 USB 通用类通用父驱动程序 为其管理的设备定义接口集合。

若要获取总线驱动程序接口,客户端驱动程序必须向总线驱动程序发送 IRP_MN_QUERY_INTERFACE 请求。 在客户端驱动程序中:

  1. 在下一个堆栈位置创建IRP_MN_QUERY_INTERFACE类型的 IRP。
    irpstack = IoGetNextIrpStackLocation(irp);
    irpstack->MajorFunction= IRP_MJ_PNP;
    irpstack->MinorFunction= IRP_MN_QUERY_INTERFACE;
  2. 为接口分配内存,并使堆栈指向新内存。 例如,为 USB_BUS_INTERFACE_USBDI_V0 接口分配内存:
    irpstack->Parameters.QueryInterface.Interface = (USB_BUS_INTERFACE_USBDI_V0) newly allocated interface buffer;
  3. 将 InterfaceSpecificData 设置为 NULL。
    irpstack->Parameters.QueryInterface.InterfaceSpecificData = NULL;
  4. 使用适当的接口 GUID、接口的大小和接口的版本初始化 IRP 堆栈。
    irpstack->Parameters.QueryInterface.InterfaceType = &USB_BUS_INTERFACE_USBDI_GUID;
    irpstack->Parameters.QueryInterface.Size = sizeof(USB_BUS_INTERFACE_USBDI_V0);
    irpstack->Parameters.QueryInterface.Version = USB_BUSIF_USBDI_VERSION_0;
    ntStatus = IoCallDriver(PDO that the client passes URBs to, irp);

     5.用 IoCallDriver 以在堆栈中向下传递查询接口 IRP。

ntStatus = IoCallDriver(PDO that the client passes URBs to, irp);
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 10天前 0

暂无评论

推荐阅读
TEZNKK3IfmPf