Condividi tramite


Uso di WinUSB in un driver WBDI

Microsoft consiglia ai driver WBDI di usare la destinazione di I/O USB integrata in User-Mode Driver Framework (UMDF).

Impostazione di UmdfDispatcher

Un file INF che installa un driver UMDF deve contenere una sezione DDInstall specifica di WDF. Se si usa la destinazione di I/O USB in UMDF, è necessario impostare la direttiva del Registro di sistema UmdfDispatcher all'interno di questa sezione DDInstall .

La sezione seguente di WudfBioUsbSample.inx nell'esempio WudfBioUsbSample illustra come impostare questa direttiva:

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

Per informazioni specifiche su UmdfDispatcher, vedere Specifica della direttiva INF UmdfDispatcher. Per informazioni generali sulle direttive del Registro di sistema WDF, vedere Specifica delle direttive WDF.

Richieste di lettura asincrone in sospeso

WinUsb può gestire più richieste di lettura in sospeso. I dispositivi che richiedono una latenza minima tra le operazioni di lettura durante un'analisi devono mantenere in sospeso alcune richieste di lettura asincrone in sospeso. Se il driver effettua richieste asincrone, WinUsb invia queste richieste prima del trasferimento in modalità utente per le routine di completamento delle richieste di lettura precedenti.

È possibile fare riferimento al CBiometricDevice::InitiatePendingRead metodo in Device.cpp in WudfBioUsbSample per visualizzare un esempio di codice su come creare una richiesta di lettura.

Il codice per creare una richiesta di lettura deve essere un ciclo dei passaggi seguenti:

  1. Creare un oggetto memoria framework preallocato chiamando IWDFDriver::CreatePreallocatedWdfMemory.

  2. Specificare il codice di callback in una routine OnCompletion. Vedere CBiometricDevice::OnCompletion nell'esempio.

  3. Acquisire un puntatore all'interfaccia IRequestCallbackRequestCompletion dell'oggetto proprietario.

  4. Registrare la funzione di callback chiamando IWDFIoRequest::SetCompletionCallback e passando il puntatore a IRequestCallbackRequestCompletion ottenuto nel passaggio precedente. Il framework chiamerà ora il callback al termine di una richiesta di I/O.

  5. Chiama IWDFIoRequest::Send per inviare la richiesta di lettura al dispositivo.

  6. Elaborare la richiesta di lettura quando si verifica il completamento del callback. Prima che la routine OnCompletion avvii una nuova richiesta di lettura in sospeso, deve controllare lo stato della destinazione di I/O. A tale scopo, eseguire una query IWDFUsbTargetPipe per un puntatore all'interfaccia IWDFIoTargetStateManagement . Chiamare quindi 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();
    

Al termine dell'analisi, annullare eventuali richieste di lettura in sospeso.

Se si usa la destinazione UMDF-USB, è possibile consentire alle richieste di lettura di rimanere in sospeso attraverso il risparmio di energia e l'accensione.

Se non si usa la destinazione UMDF-USB, il driver deve interrompere l'invio di richieste di lettura in sospeso in D0Exit e riavviare D0Entry.

Sospensione selettiva

Un driver WBDI deve supportare la sospensione selettiva USB.

Un dispositivo che supporta la riattivazione del sistema e l'inattività del dispositivo devono abilitare le impostazioni del Registro di sistema per la sospensione selettiva in WinUsb, come illustrato in questo esempio di codice da WudfBioUsbSample.inx:

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

Lo stack USB del sistema operativo non può garantire la tempistica tra la riattivazione del sistema e quando il driver può iniziare a leggere dal dispositivo.

Idealmente, il dispositivo deve essere lasciato in uno stato pronto per acquisire un'analisi quando il sistema viene sospeso. Se si verifica un'analisi mentre il sistema è sospeso, il dispositivo deve memorizzare nella cache i dati di input per un'intera analisi delle impronte digitali. Quando il sistema si riattiva, il driver legge quindi i dati dal dispositivo. Supportando questo scenario, è possibile abilitare scenari di riattivazione e sblocco/accesso del sistema.