Partager via


WdfRequestStopAcknowledge, fonction (wdfrequest.h)

[S’applique à KMDF et UMDF]

La méthode WdfRequestStopAcknowledge informe l’infrastructure que le pilote a cessé de traiter une demande d’E/S spécifiée.

Syntaxe

void WdfRequestStopAcknowledge(
  [in] WDFREQUEST Request,
  [in] BOOLEAN    Requeue
);

Paramètres

[in] Request

Handle d’un objet de requête d’infrastructure.

[in] Requeue

Valeur booléenne qui, si TRUE, entraîne la mise en file d’attente de la requête dans la file d’attente pour que l’infrastructure la remette à nouveau au pilote. Si la valeur est FALSE, l’infrastructure ne met pas la demande en file d’attente. Pour plus d'informations, consultez la section Notes qui suit.

Valeur de retour

None

Remarques

Un bogue case activée se produit si le pilote fournit un handle d’objet non valide.

Si un pilote inscrit une fonction de rappel EvtIoStop pour une file d’E/S, l’infrastructure l’appelle lorsque l’appareil sous-jacent de la file d’attente quitte son état de fonctionnement (D0). L’infrastructure appelle la fonction de rappel EvtIoStop pour chaque demande d’E/S que le pilote n’a pas effectuée, y compris les demandes que le pilote possède et celles qu’il a transférées à une cible d’E/S. Le pilote doit terminer, annuler ou reporter le traitement de chaque requête en effectuant l’une des opérations suivantes :

  • Si le pilote est propriétaire de la demande, il peut appeler WdfRequestComplete pour terminer ou annuler la demande.
  • Si le pilote a transféré la demande à une cible d’E/S, il peut appeler WdfRequestCancelSentRequest pour tenter d’annuler la demande.
  • Si le pilote reporte le traitement de la demande, il doit appeler WdfRequestStopAcknowledge.
Si votre pilote appelle WdfRequestStopAcknowledge, il doit appeler cette méthode à partir de sa fonction de rappel EvtIoStop .

L’infrastructure ne permet pas à l’appareil de quitter son état de fonctionnement (D0) tant que le pilote n’a pas terminé, annulé ou reporté chaque requête qu’une fonction de rappel EvtIoStop reçoit. Potentiellement, cette inaction peut empêcher un système d’entrer dans son état de mise en veille prolongée ou d’un autre état de faible alimentation du système.

Quand la fonction de rappel EvtIoStop d’un pilote appelle WdfRequestStopAcknowledge, elle peut définir le paramètre Requeue sur TRUE ou FALSE :

  • Si vous définissez Requeue sur TRUE , l’infrastructure place la requête dans sa file d’attente d’E/S.

    Lorsque l’appareil sous-jacent revient à son état de fonctionnement (D0), l’infrastructure réélivera la demande au pilote.

  • Si vous définissez Requeue sur FALSE , l’infrastructure ne met pas la requête en file d’attente. Si le pilote est propriétaire de la demande, la propriété reste avec le pilote. Si le pilote a transféré la demande, il est responsable de la gestion de la demande lorsqu’elle est terminée. Le pilote doit cesser d’effectuer tout traitement d’E/S qui nécessite un accès matériel.

    Lorsque l’appareil sous-jacent revient à son état de fonctionnement (D0), l’infrastructure appelle la fonction de rappel EvtIoResume du pilote, afin que le pilote puisse continuer à traiter la demande.

Si le pilote avait précédemment appelé WdfRequestMarkCancelable ou WdfRequestMarkCancelableEx, il doit appeler WdfRequestUnmarkCancelable avant d’appeler WdfRequestStopAcknowledge avec Requeue défini sur TRUE.

Avant d’appeler WdfRequestStopAcknowledge, la fonction de rappel EvtIoStop du pilote doit arrêter tout traitement de la demande d’E/S qui nécessite l’accès à l’appareil sous-jacent, car l’appareil est sur le point d’entrer dans un état de faible consommation.

Pour plus d’informations sur la méthode WdfRequestStopAcknowledge , consultez Utilisation de Power-Managed files d’attente d’E/S.

Exemples

Si un pilote appelle WdfRequestStopAcknowledge avec Requeue défini sur TRUE, il doit précédemment appeler WdfRequestUnmarkCancelable.

L’exemple de code suivant est une fonction de rappel EvtIoStop qui vérifie si une demande reçue est annulable et, le cas échéant, appelle WdfRequestUnmarkCancelable. Si WdfRequestUnmarkCancelable retourne STATUS_CANCELLED, l’exemple est simplement retourné, car la fonction de rappel EvtRequestCancel du pilote gère la demande. Sinon, l’exemple appelle WdfRequestStopAcknowledge et spécifie TRUE afin que l’infrastructure requeue la requête lorsque l’appareil sous-jacent revient à son état de travail (D0).

VOID
MyEvtIoStop(
    IN WDFQUEUE  Queue,
    IN WDFREQUEST  Request,
    IN ULONG  ActionFlags
    )
{
    NTSTATUS status;

    // TODO: Take steps here to suspend and, if necessary, roll back any processing that has already occurred on this request

    if (ActionFlags & WdfRequestStopRequestCancelable) {
        status = WdfRequestUnmarkCancelable(Request);
        if (status == STATUS_CANCELLED) {
            return;
        }
    }

    // Inform framework that driver is postponing processing, cause framework to redeliver request when device returns to D0

    WdfRequestStopAcknowledge(Request, TRUE);
}

En règle générale, si un pilote appelle WdfRequestStopAcknowledge avec Requeue défini sur FALSE, la requête est annulée.

L’exemple de code suivant est une fonction de rappel EvtIoStop qui appelle WdfRequestStopAcknowledge et spécifie FALSE afin que l’infrastructure appelle la fonction de rappel EvtIoResume du pilote, où le pilote reprend le traitement de la demande.

Vous pouvez utiliser du code comme celui-ci s’il est acceptable d’arrêter le traitement d’une requête spécifique et de la poursuivre ultérieurement, plutôt que d’avoir la requête redélivée et de redémarrer le traitement depuis le début.

VOID
MyEvtIoStop(
    IN WDFQUEUE  Queue,
    IN WDFREQUEST  Request,
    IN ULONG  ActionFlags
    )
{

    //TODO: Take steps here to suspend processing of the request so it can be resumed when power returns
	 
    // Acknowledge the stop, but leave the request under driver's ownership.
    // Provide a corresponding EvtIoResume handler to resume processing when power returns

    WdfRequestStopAcknowledge(Request, FALSE);
}

Configuration requise

Condition requise Valeur
Plateforme cible Universal
Version KMDF minimale 1.0
Version UMDF minimale 2.0
En-tête wdfrequest.h (include Wdf.h)
Bibliothèque Wdf01000.sys (KMDF) ; WUDFx02000.dll (UMDF)
IRQL <=DISPATCH_LEVEL
Règles de conformité DDI DeferredRequestCompleted(kmdf), DriverCreate(kmdf), EvtIoStopCancel(kmdf), EvtIoStopCompleteOrStopAck(kmdf),EvtIoStopResume(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf), RequestCompleted(kmdf), RequestCompletedLocal(kmdf), StopAckWithinEvtIoStop(kmdf)

Voir aussi

EvtIoStop

EvtRequestCancel

WdfRequestComplete