IWDFIoQueue ::RetrieveNextRequest, méthode (wudfddi.h)
[Avertissement : UMDF 2 est la dernière version de UMDF et remplace UMDF 1. Tous les nouveaux pilotes UMDF doivent être écrits à l’aide de UMDF 2. Aucune nouvelle fonctionnalité n’est ajoutée à UMDF 1 et il existe une prise en charge limitée de UMDF 1 sur les versions plus récentes de Windows 10. Les pilotes Windows universels doivent utiliser UMDF 2. Pour plus d’informations, consultez Bien démarrer avec UMDF.]
La méthode RetrieveNextRequest récupère la requête d’E/S suivante à partir d’une file d’attente d’E/S.
Syntaxe
HRESULT RetrieveNextRequest(
[out] IWDFIoRequest **ppRequest
);
Paramètres
[out] ppRequest
Pointeur vers une mémoire tampon qui reçoit un pointeur vers l’interface IWDFIoRequest pour l’objet de requête suivant, ou reçoit null si la file d’attente est vide ou si la requête suivante est introuvable.
Valeur de retour
RetrieveNextRequest retourne l’une des valeurs suivantes :
Retourner le code | Description |
---|---|
|
La requête d’E/S suivante a été récupérée à partir de la file d’attente d’E/S. |
|
La file d’attente ne répartit pas les demandes. Cette situation se produit si l’appareil subit une transition d’état d’alimentation et que toutes les files d’attente sont arrêtées de distribuer des demandes ou si le pilote a explicitement appelé IWDFIoQueue ::Stop pour arrêter la distribution des demandes. Cette situation peut également se produire si le pilote tente de supprimer une demande d’une file d’attente manuelle gérée par l’alimentation et qui est sous tension ou si la file d’attente est suspendue. |
|
Aucune demande n’était dans la file d’attente. |
|
L’appel a été effectué pour récupérer la requête à partir d’une file d’attente parallèle. |
RetrieveNextRequest peut également retourner d’autres valeurs HRESULT.
Remarques
Si un pilote configure une file d’attente d’E/S pour la répartition manuelle des demandes d’E/S, le pilote peut appeler la méthode RetrieveNextRequest pour obtenir la requête suivante à partir de la file d’attente. Pour plus d’informations sur la répartition manuelle des demandes d’E/S, consultez Configuration du mode de distribution pour une file d’attente d’E/S.
Si un pilote configure une file d’attente d’E/S pour la répartition séquentielle des demandes d’E/S, le pilote peut toujours appeler la méthode RetrieveNextRequest pour obtenir la requête suivante de la file d’attente sans recevoir d’erreur. Bien que l’infrastructure autorise le pilote à appeler RetrieveNextRequest pour récupérer une requête à partir d’une file d’attente séquentielle, le pilote doit uniquement appeler RetrieveNextRequest avant que le pilote termine la requête actuelle. Sinon, si le pilote tente d’appeler RetrieveNextRequest une fois la demande actuelle terminée, une condition de concurrence peut se produire. Cette condition de concurrence se produit entre la répartition automatique du framework de la requête suivante à partir de la file d’attente séquentielle et l’appel du pilote à RetrieveNextRequest pour récupérer la requête suivante.
Exemples
L’exemple de code suivant, qui provient de l’exemple de pilote umdf_fx2, interroge la file d’attente pour les demandes tant que les requêtes peuvent être récupérées. Le code vérifie d’abord si les requêtes sont associées à un objet de fichier spécifique.
VOID
CMyDevice::ServiceSwitchChangeQueue(
__in SWITCH_STATE NewState,
__in HRESULT CompletionStatus,
__in_opt IWDFFile *SpecificFile
)
{
IWDFIoRequest *fxRequest;
HRESULT enumHr = S_OK;
do {
HRESULT hr;
//
// Get the next request.
//
if (NULL != SpecificFile) {
enumHr = m_SwitchChangeQueue->RetrieveNextRequestByFileObject(
SpecificFile,
&fxRequest
);
}
else {
enumHr = m_SwitchChangeQueue->RetrieveNextRequest(&fxRequest);
}
//
// If a request was retrieved, complete it.
//
if (S_OK == enumHr) {
if (S_OK == CompletionStatus) {
IWDFMemory *fxMemory;
//
// Copy the result to the request buffer.
//
fxRequest->GetOutputMemory(&fxMemory);
hr = fxMemory->CopyFromBuffer(0,
&NewState,
sizeof(SWITCH_STATE));
fxMemory->Release();
}
else {
hr = CompletionStatus;
}
//
// Complete the request with the copy or
// completion status.
//
if (S_OK == hr) {
fxRequest->CompleteWithInformation(hr,
sizeof(SWITCH_STATE));
}
else {
fxRequest->Complete(hr);
}
fxRequest->Release();
}
}
while (S_OK == enumHr);
}
Exigences
Exigence | Valeur |
---|---|
fin du support | Indisponible dans UMDF 2.0 et versions ultérieures. |
plateforme cible | Bureau |
version minimale de UMDF | 1.5 |
d’en-tête | wudfddi.h (include Wudfddi.h) |
DLL | WUDFx.dll |