處理USB主機控制器驅動程式中的I/O要求
主機控制器驅動程式的最佳做法,用於處理UCX所傳送的I/O要求。
UCX 會針對 USB 總線上的裝置,追蹤主機控制器驅動程式所建立的所有端點。 第一次由 UCX 處理由中樞驅動程式傳送的任何數據傳輸要求,或由 USB 裝置堆疊中較高的另一個驅動程式所傳送。 UCX 負責將架構要求物件轉送至正確的端點佇列。 要求中包含的 USB 要求區塊 (URB) 可以指定端點句柄。 如果指定端點句柄,UCX 會檢查裝置存在端點之間的對應端點。 如果指定的端點句柄存在,要求會轉送至端點的佇列。 如果找不到指定的端點句柄,要求就會失敗。 如果未指定任何句柄,則要求會用於預設端點,而 UCX 會將要求轉送至該裝置的主機控制器驅動程式預設端點佇列。
為了確保與現有的 USB 驅動程式相容,主機控制器必須符合下列需求,才能完成 URB 要求:
- WdfRequestComplete 必須在DISPATCH_LEVEL呼叫。
- 如果 URB 已傳遞至其架構佇列,且驅動程式開始在呼叫驅動程式的線程或 DPC 上同步處理它,則不應該同時同步完成要求。 要求必須在個別的 DPC 上完成,以 呼叫 WdfDpcEnqueue 進行排程。
- 與上述需求類似,在接收 EVT_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE 或 EVT_WDF_REQUEST_CANCEL時,主機控制器驅動程序必須在與呼叫線程或 DPC 不同的 DPC 上完成 URB 要求。 根據預設,WDF 會同步完成佇列上已取消的要求。 該行為可能會導致 URB 要求發生問題。 基於這個理由,驅動程式必須為其 URB 佇列提供 EvtIoCanceledOnQueue 回呼。
IOCTL_INTERNAL_USB_SUBMIT_URB的架構要求物件包含位於要求Parameters.Others.Arg1的URB。 要求完成時,URB 狀態必須設定為 USBD_STATUS_SUCCESS,或設定為指出失敗本質的失敗狀態。 失敗狀態值定義於usb.h頭檔中。