总线接口的查询
USB 客户端驱动程序可以获取对USB总线驱动程序接口的引用,并使用它来访问总线驱动程序例程,而不是使用 I/O 请求数据包 (IRP) 机制。
使用总线驱动程序接口为客户端驱动程序提供了几个优势:
- 它可以使用接口的服务,而无需分配 IRP;
- 它可以在引发 IRQL 时调用接口的例程;
在 Windows Vista USB 中,客户端驱动程序本身可以公开接口,以帮助 USB 通用类通用父驱动程序 为其管理的设备定义接口集合。
若要获取总线驱动程序接口,客户端驱动程序必须向总线驱动程序发送 IRP_MN_QUERY_INTERFACE 请求。 在客户端驱动程序中:
- 在下一个堆栈位置创建IRP_MN_QUERY_INTERFACE类型的 IRP。
irpstack = IoGetNextIrpStackLocation(irp); irpstack->MajorFunction= IRP_MJ_PNP; irpstack->MinorFunction= IRP_MN_QUERY_INTERFACE;
- 为接口分配内存,并使堆栈指向新内存。 例如,为 USB_BUS_INTERFACE_USBDI_V0 接口分配内存:
irpstack->Parameters.QueryInterface.Interface = (USB_BUS_INTERFACE_USBDI_V0) newly allocated interface buffer;
- 将 InterfaceSpecificData 设置为 NULL。
irpstack->Parameters.QueryInterface.InterfaceSpecificData = NULL;
- 使用适当的接口 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);