Freigeben über


Verwenden von WinUSB in einem WBDI-Treiber

Microsoft empfiehlt, WBDI-Treiber das USB-E/A-Ziel zu verwenden, das in user-Mode Driver Framework (UMDF) integriert ist.

Festlegen von UmdfDispatcher

Eine INF-Datei, die einen UMDF-Treiber installiert, muss einen WDF-spezifischen DDInstall-Abschnitt enthalten. Wenn Sie das USB-E/A-Ziel in UMDF verwenden, müssen Sie die UmdfDispatcher-Registrierungsdirektive in diesem DDInstall-Abschnitt festlegen.

Im folgenden Abschnitt von WudfBioUsbSample.inx im Beispiel WudfBioUsbSample wird gezeigt, wie diese Direktive festgelegt wird:

[Biometric_Install.NT.Wdf]
KmdfService=WINUSB, WinUsb_Install
UmdfDispatcher=WinUsb
UmdfService=WudfBioUsbSample, WudfBioUsbSample_Install
UmdfServiceOrder=WudfBioUsbSample

Spezifische Informationen zu UmdfDispatcher finden Sie unter Angeben der UmdfDispatcher INF-Direktive. Allgemeine Informationen zu WDF-Registrierungsdirektiven finden Sie unter Angeben von WDF-Direktiven.

Ausstehende asynchrone Leseanforderungen

WinUsb kann mehrere ausstehende Leseanforderungen verarbeiten. Geräte, die eine minimale Latenz zwischen Lesevorgängen während einer Überprüfung erfordern, sollten einige ausstehende asynchrone Leseanforderungen ausstehen lassen. Wenn der Treiber asynchrone Anforderungen sendet, gibt WinUsb diese Anforderungen aus, bevor die Übertragung in den Benutzermodus für die Abschlussroutinen früherer Leseanforderungen erfolgt.

Sie können auf die CBiometricDevice::InitiatePendingRead Methode in Device.cpp in WudfBioUsbSample verweisen, um ein Codebeispiel für das Schreiben einer Leseanforderung anzuzeigen.

Der Code zum Schreiben einer Leseanforderung sollte eine Schleife der folgenden Schritte sein:

  1. Erstellen Sie ein vordefiniertes Framework-Speicherobjekt, indem Sie IWDFDriver::CreatePreallocatedWdfMemory aufrufen.

  2. Bereitstellen von Rückrufcode in einer OnCompletion-Routine. Siehe CBiometricDevice::OnCompletion im Beispiel.

  3. Rufen Sie einen Zeiger auf die IRequestCallbackRequestCompletion-Schnittstelle des besitzenden Objekts ab.

  4. Registrieren Sie die Rückruffunktion, indem Sie IWDFIoRequest::SetCompletionCallback aufrufen und den Zeiger an IRequestCallbackRequestCompletion übergeben, das im vorherigen Schritt abgerufen wurde. Das Framework ruft nun den Rückruf auf, wenn eine E/A-Anforderung abgeschlossen ist.

  5. Rufen Sie IWDFIoRequest::Send auf, um die Leseanforderung an das Gerät zu senden.

  6. Verarbeiten der Leseanforderung, wenn der Rückruf abgeschlossen wird. Bevor die OnCompletion-Routine eine neue ausstehende Leseanforderung initiiert, sollte der Status des E/A-Ziels überprüft werden. Dazu fragen Sie IWDFUsbTargetPipe für einen Zeiger auf die IWDFIoTargetStateManagement-Schnittstelle ab. Rufen Sie dann IWDFIoTargetStateManagement::GetState auf:

    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();
    

Wenn der Scan abgeschlossen ist, brechen Sie alle ausstehenden Leseanforderungen ab.

Wenn Sie das UMDF-USB-Ziel verwenden, können Sie zulassen, dass Leseanforderungen über die Stromversorgung und die Stromversorgung ausstehen.

Wenn Sie das UMDF-USB-Ziel nicht verwenden, sollte der Treiber das Senden ausstehender Leseanforderungen bei D0Exit beenden und bei D0Entry neu starten.

Selektives Anhalten

Ein WBDI-Treiber sollte das selektive Anhalten von USB unterstützen.

Ein Gerät, das Systemaktivierung und Geräte-Leerlauf unterstützt, sollte die Registrierungseinstellungen für das selektive Anhalten in WinUsb aktivieren, wie in diesem Codebeispiel von WudfBioUsbSample.inx gezeigt:

HKR,,"SystemWakeEnabled",0x00010001,1
HKR,,"DeviceIdleEnabled",0x00010001,1

Der USB-Stapel des Betriebssystems kann die Anzeigedauer zwischen systemaktivierung und dem Start des Treibers vom Gerät nicht garantieren.

Im Idealfall sollte das Gerät in einem Zustand verbleiben, der bereit ist, einen Scan zu erfassen, wenn das System angehalten wird. Wenn ein Scan auftritt, während das System angehalten wird, sollte das Gerät die Eingabedaten für einen gesamten Fingerabdruckscan zwischenspeichern. Wenn das System aktiviert wird, liest der Treiber die Daten vom Gerät aus. Durch die Unterstützung dieses Szenarios können Sie Systemaktivierungs- und Entsperrungs-/Anmeldeszenarien aktivieren.