windows USB 设备驱动程序开发-总线接口查询

总线接口的查询

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);
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值