在 UMDF 1.x 驅動程式中使用 USB 管道
警告
UMDF 2 是最新版的 UMDF,並取代 UMDF 1。 所有新的 UMDF 驅動程式都應該使用 UMDF 2 來撰寫。 未將新功能新增至 UMDF 1,而且較新版本的 Windows 10 上不支援 UMDF 1。 通用 Windows 驅動程式必須使用 UMDF 2。
封存的 UMDF 1 範例可在Windows 11 22H2 版 - 2022 年 5 月驅動程式範例更新中找到。
如需詳細資訊,請參閱使用 UMDF 消費者入門。
架構代表 USB 介面中的每個管道,做為架構 USB 管道物件。 當驅動程式設定 USB 裝置時,架構會為每個選取介面中的每個管道建立架構 USB 管道物件。 管道物件方法可讓驅動程式:
取得 UMDF-USB 管道資訊
在 UMDF 驅動程式呼叫 IWDFUsbInterface::RetrieveUsbPipeObject 方法以取得 USB 管道物件的 IWDFUsbTargetPipe 介面指標之後,驅動程式可以呼叫 USB 管道物件定義的下列方法,以取得 USB 管道的相關資訊:
IWDFUsbTargetPipe::GetInformation
擷取 USB 管道及其端點的相關資訊。
IWDFUsbTargetPipe::GetType
傳回 USB 管道的類型。
IWDFUsbTargetPipe::IsInEndPoint
判斷 USB 管道是否連接到輸入端點。
IWDFUsbTargetPipe::IsOutEndPoint
判斷 USB 管道是否連接到輸出端點。
IWDFUsbTargetPipe::RetrievePipePolicy
擷取 WinUsb 管道原則。
從 UMDF-USB 管道讀取
若要從 USB 輸入管道讀取資料,您的驅動程式可以使用下列技術 (或兩者) :
同步讀取資料。
若要從 USB 輸入管道同步讀取資料,UMDF 驅動程式會先呼叫 IWDFIoTarget::FormatRequestForRead 方法來建置讀取要求。 然後驅動程式會呼叫 IWDFIoRequest::Send 方法,並指定WDF_REQUEST_SEND_OPTION_SYNCHRONOUS旗標,以同步傳送要求。
以非同步方式讀取資料。
若要以非同步方式從 USB 輸入管道讀取資料,UMDF 驅動程式會先呼叫 IWDFIoTarget::FormatRequestForRead 方法來建置讀取要求。 然後驅動程式會呼叫 IWDFIoRequest::Send 方法,而不指定WDF_REQUEST_SEND_OPTION_SYNCHRONOUS旗標。
以同步且持續的方式讀取資料。
連續讀取器是架構提供的機制,可確保讀取要求一律可供 USB 管道使用。 此機制可確保驅動程式一律準備好接收來自提供非同步、未經要求輸入資料流程之裝置的資料。 例如,網路介面卡的驅動程式 (NIC) 可能會使用連續讀取器來接收輸入資料。
若要為輸入管道設定連續讀取器,驅動程式的 IPnpCallbackHardware::OnPrepareHardware 回呼函式必須呼叫 IWDFUsbTargetPipe2::ConfigureContinuousReader 方法。 這個方法會將一組讀取要求排入裝置的 I/O 目標。
此外,驅動程式的 IPnpCallback::OnD0Entry 回 呼函式必須呼叫 IWDFIoTargetStateManagement::Start 來啟動連續讀取器,而驅動程式的 IPnpCallback::OnD0Exit 回呼函式必須呼叫 IWDFIoTargetStateManagement::Stop 來停止連續讀取器。
每次從裝置取得資料時, I/O 目標會完成讀取要求,而且架構會呼叫兩個回呼函式的其中一個: IUsbTargetPipeContinuousReaderCallbackReadComplete::OnReaderCompletion 如果 I/O 目標成功讀取資料, 或 IUsbTargetPipeContinuousReaderCallbackReadersFailed::OnReaderFailure 如果 I/O 目標回報錯誤。
驅動程式呼叫 IWDFUsbTargetPipe2::ConfigureContinuousReader之後,除非呼叫驅動程式的 IUsbTargetPipeContinuousReaderCallbackReadersFailed::OnReaderFailure 回呼函式,否則無法使用 IWDFIoRequest::Send 將 I /O 要求傳送至管道,除非驅動程式的 IUsbTargetPipeContinuousReaderCallbackReadersFailed::OnReaderFailure 回呼函式會呼叫並傳回 FALSE。
UMDF 1.9 版和更新版本支援連續讀取器。
寫入 UMDF-USB 管道
若要將資料寫入 USB 輸出管道,UMDF 驅動程式可以先呼叫 IWDFIoTarget::FormatRequestForWrite 方法來建置寫入要求。 然後,驅動程式可以呼叫 IWDFIoRequest::Send 方法,以非同步方式傳送要求。
停止、排清和重設 UMDF-USB 管道
UMDF 驅動程式可以呼叫下列方法來停止、排清或重設 USB 管道:
IWDFUsbTargetPipe::Abort
同步傳送要求,以停止 USB 管道上所有擱置中的傳輸。
IWDFUsbTargetPipe::Flush
同步傳送要求,以捨棄 WinUsb 在裝置傳回比用戶端要求更多的資料時所儲存的任何資料。
IWDFUsbTargetPipe::Reset
同步傳送要求以重設 USB 管道。
設定 UMDF-USB 管道的原則
UMDF 驅動程式可以呼叫 IWDFUsbTargetPipe::SetPipePolicy 方法來控制 WinUsb 用於 USB 管道的行為 (,例如逾時、處理簡短封包,以及其他行為) 。
處理管道錯誤
如果驅動程式的 USB 目標 完成 I/O 要求並出現錯誤狀態值,您的驅動程式應該執行下列動作:
使用WdfIoTargetCancelSentIo旗標集呼叫IWDFIoTargetStateManagement::Stop。 如果目標尚未完成要求,此呼叫會停止管道,並取消驅動程式已傳送至 USB 目標的任何其他 I/O 要求。
呼叫 IWDFUsbTargetPipe::Abort 以將中止要求傳送至管道。
呼叫 IWDFUsbTargetPipe::Reset 將重設要求傳送至管道。
呼叫 IWDFIoTargetStateManagement::Start 以重新開機管道。
重新傳送失敗的 I/O 要求,以及遵循失敗要求的所有 I/O 要求。