在 WBDI 驅動程式中使用 WinUSB
Microsoft建議 WBDI 驅動程式使用 內建於使用者模式驅動程式架構 (UMDF) 的 USB I/O 目標 。
設定 UmdfDispatcher
安裝 UMDF 驅動程式的 INF 檔案必須包含 WDF 特定的 DDInstall 區段。 如果您在 UMDF 中使用 USB I/O 目標,則必須在此 DDInstall 區段中設定 UmdfDispatcher 登錄指示詞。
WudfBioUsbSample.inx 範例中的下一節示範如何設定此指示詞:
[Biometric_Install.NT.Wdf]
KmdfService=WINUSB, WinUsb_Install
UmdfDispatcher=WinUsb
UmdfService=WudfBioUsbSample, WudfBioUsbSample_Install
UmdfServiceOrder=WudfBioUsbSample
如需UmdfDispatcher的特定資訊,請參閱 指定UmdfDispatcher INF指示詞。 如需 WDF 登錄指示詞的一般資訊,請參閱 指定 WDF 指示詞。
暫止的異步讀取要求
WinUsb 可以處理多個未處理的讀取要求。 在掃描期間,在讀取作業之間需要最少延遲的裝置,應該讓一些未處理的異步讀取要求擱置中。 如果驅動程式提出異步要求,WinUsb 會在傳送回使用者模式之前發出這些要求,以取得先前讀取要求的完成例程。
您可以參考 CBiometricDevice::InitiatePendingRead
WudfBioUsbSample Device.cpp 中的 方法,以查看如何撰寫讀取要求的程式碼範例。
撰寫讀取要求的程式代碼應該是下列步驟的循環:
呼叫 IWDFDriver::CreatePreallocatedWdfMemory 來建立預先配置的架構記憶體物件。
在 OnCompletion 例程中提供回呼程式代碼。 請參閱
CBiometricDevice::OnCompletion
範例中的 。取得擁有物件的 IRequestCallbackRequestCompletion 介面指標。
呼叫 IWDFIoRequest::SetCompletionCallback 並傳入上一個步驟中取得之 IRequestCallbackRequestCompletion 的指標,以註冊回呼函式。 架構現在會在 I/O 要求完成時呼叫回呼。
呼叫 IWDFIoRequest::Send 將讀取要求傳送至裝置。
回呼完成時處理讀取要求。 在 OnCompletion 例程起始新的暫止讀取要求之前,它應該檢查 I/O 目標的狀態。 若要這樣做,請查詢 IWDFUsbTargetPipe 以取得其 IWDFIoTargetStateManagement 介面的指標。 然後呼叫 IWDFIoTargetStateManagement::GetState:
IWDFIoTarget * pTarget IWDFIoTargetStateManagement * pStateMgmt = NULL; WDF_IO_TARGET_STATE state; HRESULT hrQI = pTarget->QueryInterface(IID_PPV_ARGS(&pStateMgmt)); WUDF_TEST_DRIVER_ASSERT((SUCCEEDED(hrQI) && pStateMgmt)); state = pStateMgmt->GetState();
掃描完成時,取消任何擱置的讀取要求。
如果您使用 UMDF-USB 目標,則可以允許讀取要求在關閉電源和電源之間保持擱置。
如果您未使用 UMDF-USB 目標,驅動程式應該停止在 D0Exit 傳送擱置的讀取要求,並在 D0Entry 重新啟動。
選擇性暫停
WBDI 驅動程式應該支援 USB選擇性暫停。
支援系統喚醒和裝置閒置的裝置應該啟用 WinUsb 中選擇性暫停的登錄設定,如來自 WudfBioUsbSample.inx 的程式代碼範例所示:
HKR,,"SystemWakeEnabled",0x00010001,1
HKR,,"DeviceIdleEnabled",0x00010001,1
操作系統 USB 堆疊無法保證系統喚醒和驅動程式何時可以開始從裝置讀取。
在理想情況下,當系統暫停時,裝置應該處於準備好擷取掃描的狀態。 如果系統暫停時發生掃描,裝置應該快取整個指紋掃描的輸入數據。 當系統喚醒時,驅動程序接著會從裝置讀取數據。 藉由支援此案例,您可以啟用系統喚醒和解除鎖定/登入案例。