總線接口的查詢
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);