管理 WBDI 驅動程式中的佇列
WBDI 驅動程式應該建立至少一個佇列,以處理來自服務的多個並行要求。 如果您使用 UMDF,則可以利用其佇列管理支援。
在 WudfBioUsbSample 中,CBiometricIoQueue 類別會實作 I/O 佇列介面。
具體而言,在 方法CBiometricIoQueue::Initialize
中,驅動程式會查詢擁有 CBiometricIoQueue 物件,以取得架構用來判斷驅動程式在佇列上訂閱的事件回呼函式之 IQueueCallbackDeviceIoControl 介面的指標:
if (SUCCEEDED(hr))
{
hr = this->QueryInterface(__uuidof(IUnknown), (void **)&unknown);
}
然後驅動程式會呼叫 IWDFDevice::CreateIoQueue 來設定預設 I/O 佇列:
hr = FxDevice->CreateIoQueue(unknown,
FALSE,
WdfIoQueueDispatchParallel,
FALSE,
FALSE,
&fxQueue);
BiometricSafeRelease(unknown);
呼叫會指定 WdfIoQueueDispatchParallel,讓架構在要求可供使用時,立即向驅動程式的 I/O 佇列回呼函式提出要求。
接下來,驅動程式會呼叫 IWDFDevice::ConfigureRequestDispatching 來設定佇列以篩選所有裝置 I/O 要求:
hr = FxDevice->ConfigureRequestDispatching(fxQueue,
WdfRequestDeviceIoControl,
TRUE);
因為驅動程式在此呼叫中指定 WdfRequestDeviceIoControl,所以它會提供 OnDeviceIoControl 處理程式來處理架構中的 I/O 通知。 它會在 先前呼叫 CreateIoQueue 時屬於 “unknown” 參數的 IQueueCallbackDeviceIoControl::OnDeviceIoControl 方法中執行這項作業。
一次只能有一個未完成 IOCTL_BIOMETRIC_CAPTURE_DATA 要求。 驅動程式應該追蹤IOCTL_BIOMETRIC_CAPTURE_DATA要求,方法是在內部保留暫止要求的指標,或使用另一個架構佇列來處理這些要求。
在範例中,如果有擱置的 I/O 要求,此範例會維護 CBiometricDevice 類別成員中要求的指標,如 Device.h 中所定義:
IWDFIoRequest *m_PendingRequest;
當一個感測器數據收集 I/O 擱置時,後續對數據收集 IOCTL 的呼叫應該會失敗:
FxRequest->Complete(WINBIO_E_DATA_COLLECTION_IN_PROGRESS);
擷取要求完成或取消時,此值會設定為 NULL:
IWDFIoRequest *FxRequest = (IWDFIoRequest *)InterlockedExchangePointer((PVOID *)&m_PendingRequest, NULL);