Partager via


Gestion des files d’attente dans un pilote WBDI

Les pilotes WBDI doivent créer au moins une file d’attente pour gérer plusieurs requêtes simultanées du service. Si vous utilisez UMDF, vous pouvez tirer parti de sa prise en charge de la gestion des files d’attente.

Dans WudfBioUsbSample, la classe CBiometricIoQueue implémente l’interface de file d’attente d’E/S.

Dans la méthode CBiometricIoQueue::Initialize, plus précisément, le pilote interroge l’objet CBiometricIoQueue propriétaire pour un pointeur vers l’interface IQueueCallbackDeviceIoControl que l’infrastructure utilise pour déterminer les fonctions de rappel d’événements auxquelles le pilote s’abonne sur la file d’attente :

if (SUCCEEDED(hr)) 
{
hr = this->QueryInterface(__uuidof(IUnknown), (void **)&unknown);
}

Ensuite, le pilote appelle IWDFDevice ::CreateIoQueue pour configurer la file d’attente d’E/S par défaut :

hr = FxDevice->CreateIoQueue(unknown,
FALSE,
WdfIoQueueDispatchParallel,
FALSE,
FALSE,
&fxQueue);
BiometricSafeRelease(unknown);

L’appel spécifie WdfIoQueueDispatchParallel afin que l’infrastructure présente les requêtes aux fonctions de rappel de file d’E/S du pilote dès que les requêtes sont disponibles.

Ensuite, le pilote appelle IWDFDevice ::ConfigureRequestDispatching pour configurer la file d’attente pour filtrer toutes les demandes d’E/S d’appareil :

hr = FxDevice->ConfigureRequestDispatching(fxQueue,
WdfRequestDeviceIoControl,
TRUE);

Étant donné que le pilote spécifie WdfRequestDeviceIoControl dans cet appel, il fournit un gestionnaire OnDeviceIoControl pour traiter les notifications d’E/S à partir de l’infrastructure. Il le fait dans la méthode IQueueCallbackDeviceIoControl ::OnDeviceIoControl qui fait partie du paramètre « inconnu » dans l’appel à CreateIoQueue précédemment.

Il ne peut y avoir qu’une seule demande de IOCTL_BIOMETRIC_CAPTURE_DATA en attente à la fois. Le pilote doit suivre IOCTL_BIOMETRIC_CAPTURE_DATA demandes, soit en conservant en interne un pointeur vers les demandes en attente, soit en utilisant une autre file d’attente d’infrastructure pour gérer ces demandes.

Dans l’exemple, s’il existe une demande d’E/S en attente, l’exemple conserve un pointeur vers la requête dans un membre de la classe CBiometricDevice, comme défini dans Device.h :

IWDFIoRequest *m_PendingRequest;

Bien qu’un seul E/S de collecte de données de capteur soit en attente, les appels suivants à la collecte de données IOCTLs doivent échouer :

FxRequest->Complete(WINBIO_E_DATA_COLLECTION_IN_PROGRESS);

Lorsqu’une demande de capture est terminée ou annulée, cette valeur est définie sur NULL :

IWDFIoRequest *FxRequest = (IWDFIoRequest *)InterlockedExchangePointer((PVOID *)&m_PendingRequest, NULL);