Verwalten von Warteschlangen in einem WBDI-Treiber
WBDI-Treiber sollten mindestens eine Warteschlange erstellen, um mehrere gleichzeitige Anforderungen vom Dienst zu verarbeiten. Wenn Sie UMDF verwenden, können Sie die Unterstützung für die Warteschlangenverwaltung nutzen.
In WudfBioUsbSample implementiert die CBiometricIoQueue-Klasse die I/O-Warteschlangenschnittstelle.
In der Methode CBiometricIoQueue::Initialize
fragt der Treiber insbesondere das eigene CBiometricIoQueue-Objekt für einen Zeiger auf die IQueueCallbackDeviceIoControl-Schnittstelle ab, die das Framework verwendet, um die Ereignisrückruffunktionen zu bestimmen, die der Treiber in der Warteschlange abonniert:
if (SUCCEEDED(hr))
{
hr = this->QueryInterface(__uuidof(IUnknown), (void **)&unknown);
}
Anschließend ruft der Treiber IWDFDevice::CreateIoQueue auf, um die Standard-E/A-Warteschlange zu konfigurieren:
hr = FxDevice->CreateIoQueue(unknown,
FALSE,
WdfIoQueueDispatchParallel,
FALSE,
FALSE,
&fxQueue);
BiometricSafeRelease(unknown);
Der Aufruf gibt WdfIoQueueDispatchParallel an, sodass das Framework Anforderungen an die E/A-Warteschlangenrückruffunktionen des Treibers anzeigt, sobald die Anforderungen verfügbar sind.
Als Nächstes ruft der Treiber IWDFDevice::ConfigureRequestDispatching auf, um die Warteschlange so zu konfigurieren, dass alle Geräte-E/A-Anforderungen gefiltert werden:
hr = FxDevice->ConfigureRequestDispatching(fxQueue,
WdfRequestDeviceIoControl,
TRUE);
Da der Treiber WdfRequestDeviceIoControl in diesem Aufruf angibt, stellt er einen OnDeviceIoControl-Handler zum Verarbeiten von E/A-Benachrichtigungen aus dem Framework bereit. Dies geschieht in der IQueueCallbackDeviceIoControl::OnDeviceIoControl-Methode , die Teil des "unknown"-Parameters im Aufruf von CreateIoQueue ist.
Es kann jeweils nur eine einzige IOCTL_BIOMETRIC_CAPTURE_DATA Anforderung vorhanden sein. Der Treiber sollte IOCTL_BIOMETRIC_CAPTURE_DATA Anforderungen nachverfolgen, indem er intern einen Zeiger auf die ausstehenden Anforderungen hält oder eine andere Framework-Warteschlange zum Verarbeiten dieser Anforderungen verwendet.
Wenn im Beispiel eine ausstehende E/A-Anforderung vorhanden ist, verwaltet das Beispiel einen Zeiger auf die Anforderung in einem Mitglied der CBiometricDevice-Klasse, wie in Device.h definiert:
IWDFIoRequest *m_PendingRequest;
Während eine E/A der Sensordatensammlung aussteht, sollten nachfolgende Aufrufe der IOCTLs der Datensammlung fehlschlagen:
FxRequest->Complete(WINBIO_E_DATA_COLLECTION_IN_PROGRESS);
Wenn eine Aufnahmeanforderung abgeschlossen oder abgebrochen wird, wird dieser Wert auf NULL festgelegt:
IWDFIoRequest *FxRequest = (IWDFIoRequest *)InterlockedExchangePointer((PVOID *)&m_PendingRequest, NULL);