Partager via


Utilisation de WinUSB dans un pilote WBDI

Microsoft recommande que les pilotes WBDI utilisent la cible d’E/S USB intégrée à l’infrastructure de pilote en mode utilisateur (UMDF).

Définition de UmdfDispatcher

Un fichier INF qui installe un pilote UMDF doit contenir une section DDInstall spécifique à WDF. Si vous utilisez la cible d’E/S USB dans UMDF, vous devez définir la directive de Registre UmdfDispatcher dans cette section DDInstall .

La section suivante de WudfBioUsbSample.inx dans l’exemple WudfBioUsbSample montre comment définir cette directive :

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

Pour plus d’informations sur UmdfDispatcher, consultez Spécification de la directive INF UmdfDispatcher. Pour obtenir des informations générales sur les directives de Registre WDF, consultez Spécification des directives WDF.

Demandes de lecture asynchrones en attente

WinUsb peut gérer plusieurs demandes de lecture en attente. Les appareils qui nécessitent une latence minimale entre les opérations de lecture pendant une analyse doivent conserver un certain nombre de demandes de lecture asynchrones en attente. Si le pilote effectue des requêtes asynchrones, WinUsb émet ces requêtes avant le transfert vers le mode utilisateur pour les routines d’achèvement des demandes de lecture antérieures.

Vous pouvez faire référence à la CBiometricDevice::InitiatePendingRead méthode dans Device.cpp dans WudfBioUsbSample pour voir un exemple de code illustrant comment pender une demande de lecture.

Le code permettant d’pender une demande de lecture doit être une boucle des étapes suivantes :

  1. Créez un objet mémoire de framework pré-alloué en appelant IWDFDriver ::CreatePreallocatedWdfMemory.

  2. Fournissez du code de rappel dans une routine OnCompletion. Consultez CBiometricDevice::OnCompletion l’exemple.

  3. Acquérir un pointeur vers l’interface IRequestCallbackRequestCompletion de l’objet propriétaire.

  4. Inscrivez la fonction de rappel en appelant IWDFIoRequest ::SetCompletionCallback et en passant le pointeur vers IRequestCallbackRequestCompletion obtenu à l’étape précédente. L’infrastructure appelle désormais le rappel lorsqu’une demande d’E/S est terminée.

  5. Appelez IWDFIoRequest ::Send pour envoyer la demande de lecture à l’appareil.

  6. Traiter la demande de lecture lorsque la fin du rappel se produit. Avant que la routine OnCompletion lance une nouvelle demande de lecture en attente, elle doit vérifier l’état de la cible d’E/S. Pour ce faire, interrogez IWDFUsbTargetPipe pour un pointeur vers son interface IWDFIoTargetStateManagement . Appelez ensuite 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();
    

Une fois l’analyse terminée, annulez toutes les demandes de lecture en attente.

Si vous utilisez la cible UMDF-USB, vous pouvez autoriser les demandes de lecture à rester en attente dans l’alimentation et la mise sous tension.

Si vous n’utilisez pas la cible UMDF-USB, le pilote doit arrêter d’envoyer des demandes de lecture en attente à D0Exit et redémarrer à D0Entry.

Interruption sélective

Un pilote WBDI doit prendre en charge la suspension sélective USB.

Un appareil prenant en charge le réveil système et l’inactivité de l’appareil doivent activer les paramètres de Registre pour la suspension sélective dans WinUsb, comme illustré dans cet exemple de code à partir de WudfBioUsbSample.inx :

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

La pile USB du système d’exploitation ne peut pas garantir le minutage entre le réveil système et lorsque le pilote peut commencer à lire à partir de l’appareil.

Dans l’idéal, l’appareil doit être laissé dans un état prêt à capturer une analyse lorsque le système est suspendu. Si une analyse se produit pendant que le système est suspendu, l’appareil doit mettre en cache les données d’entrée pour une analyse d’empreinte digitale entière. Lorsque le système se réveille, le pilote lit ensuite dans les données de l’appareil. En prenant en charge ce scénario, vous pouvez activer les scénarios de mise en éveil et de déverrouillage/connexion du système.