Fonction WdfDeviceEnqueueRequest (wdfdevice.h)
[S’applique uniquement à KMDF]
La méthode WdfDeviceEnqueueRequest remet une demande d’E/S spécifiée à l’infrastructure, afin que l’infrastructure puisse ensuite ajouter la demande à l’une des files d’attente d’E/S que le pilote a créées pour l’appareil spécifié.
Syntaxe
NTSTATUS WdfDeviceEnqueueRequest(
[in] WDFDEVICE Device,
[in] WDFREQUEST Request
);
Paramètres
[in] Device
Handle d’un objet d’appareil framework.
[in] Request
Handle d’un objet de requête d’infrastructure.
Valeur retournée
Si l’opération réussit, la méthode retourne STATUS_SUCCESS. Les valeurs de retour supplémentaires sont les suivantes :
Code de retour | Description |
---|---|
|
La quantité de mémoire disponible est faible. |
|
Le pilote n’a pas créé de files d’attente d’E/S pour l’appareil, et le pilote n’est pas un pilote de filtre. |
|
La file d’attente d’E/S de l’appareil n’accepte pas les demandes. |
La méthode peut retourner d’autres valeurs NTSTATUS.
Un bogue case activée se produit si le pilote fournit un handle d’objet non valide.
Remarques
Votre pilote peut appeler WdfDeviceEnqueueRequest uniquement à partir d’une fonction de rappel EvtIoInCallerContext .
La méthode WdfDeviceEnqueueRequest ajoute la demande à la file d’attente d’E/S spécifique au type de requête du pilote pour l’appareil, si le pilote en a créé une. Sinon, la méthode ajoute la demande à la file d’attente par défaut de l’appareil, si le pilote en a créé une.
Si le pilote n’a pas créé de files d’attente d’E/S pour l’appareil, WdfDeviceEnqueueRequest effectue les opérations suivantes :
- Si le pilote est un pilote de filtre, WdfDeviceEnqueueRequest envoie la demande à la cible d’E/S du pilote.
- Si le pilote n’est pas un pilote de filtre, WdfDeviceEnqueueRequest retourne STATUS_INVALID_DEVICE_REQUEST.
Par conséquent, si le pilote doit utiliser la demande ou son contexte après avoir appelé WdfDeviceEnqueueRequest, il doit prendre une référence sur la demande avant d’appeler WdfDeviceEnqueueRequest.
Pour ce faire, le pilote peut appeler WdfObjectReference avant, puis WdfObjectDereference après l’appel à WdfDeviceEnqueueRequest. Le pilote doit déréférencer la demande avant de quitter EvtIoInCallerContext.
Pour plus d’informations sur la méthode WdfDeviceEnqueueRequest , consultez Gestion des files d’attente d’E/S.
Pour les versions 1.0 et 1.5 de KMDF, WdfDeviceEnqueueRequest doit être appelé à PASSIVE_LEVEL. Pour les versions 1.7 et ultérieures, WdfDeviceEnqueueRequest peut être appelé à l’adresse IRQL <= DISPATCH_LEVEL.
Exemples
L’exemple de code suivant est une fonction de rappel EvtIoInCallerContext qui recherche les requêtes qui contiennent le code de contrôle d’E/S personnalisé, IOCTL_NONPNP_METHOD_NEITHER. Si le code de contrôle E/S est introuvable, la fonction de rappel retourne simplement la demande à l’infrastructure. Si la fonction de rappel trouve le code de contrôle d’E/S, elle prétraite la demande, puis la retourne à l’infrastructure. Si une erreur est rencontrée, la fonction de rappel termine la demande.
VOID
MyEvtDeviceIoInCallerContext(
IN WDFDEVICE Device,
IN WDFREQUEST Request
)
{
NTSTATUS status = STATUS_SUCCESS;
WDF_REQUEST_PARAMETERS params;
WDF_REQUEST_PARAMETERS_INIT(¶ms);
WdfRequestGetParameters(
Request,
¶ms
);
if(!(params.Type == WdfRequestTypeDeviceControl &&
params.Parameters.DeviceIoControl.IoControlCode == IOCTL_NONPNP_METHOD_NEITHER)) {
status = WdfDeviceEnqueueRequest(
Device,
Request
);
if(!NT_SUCCESS(status)) {
goto End;
}
return;
}
//
// Found a match for the control code. Preprocess the request, and then
// return the request to the framework.
//
//...(Preprocess the request here.)
status = WdfDeviceEnqueueRequest(
Device,
Request
);
if(!NT_SUCCESS(status)) {
goto End;
}
return;
End:
WdfRequestComplete(
Request,
status
);
return;
}
Configuration requise
Condition requise | Valeur |
---|---|
Plateforme cible | Universal |
Version KMDF minimale | 1.0 |
En-tête | wdfdevice.h (include Wdf.h) |
Bibliothèque | Wdf01000.sys (consultez Gestion de version de la bibliothèque d’infrastructure.) |
IRQL | <= DISPATCH_LEVEL (section Voir les remarques) |
Règles de conformité DDI | DeferredRequestCompleted(kmdf),DriverCreate(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf), RequestCompleted(kmdf), RequestCompletedLocal(kmdf) |