EVT_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE fonction de rappel (wdfio.h)

[S’applique à KMDF et à UMDF]

La fonction de rappel d’événement EvtIoCanceledOnQueue d’un pilote informe le pilote qu’il doit effectuer une demande d’E/S que l’infrastructure a été supprimée d’une file d’attente d’E/S.

Syntaxe

EVT_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE EvtWdfIoQueueIoCanceledOnQueue;

void EvtWdfIoQueueIoCanceledOnQueue(
  [in] WDFQUEUE Queue,
  [in] WDFREQUEST Request
)
{...}

Paramètres

[in] Queue

Handle vers un objet file d’attente d’E/S.

[in] Request

Handle d’un objet de requête.

Valeur de retour

None

Remarques

Un pilote inscrit une fonction de rappel EvtIoCanceledOnQueue lorsqu’il appelle la méthode WdfIoQueueCreate . Pour plus d’informations sur l’appel de WdfIoQueueCreate, consultez Création de files d’attente d’E/S.

Si un pilote inscrit une fonction de rappel EvtIoCanceledOnQueue pour une file d’attente d’E/S, l’infrastructure appelle la fonction de rappel dans les situations suivantes :

Une fois que l’infrastructure a appelé la fonction de rappel EvtIoCanceledOnQueue , le pilote possède l’objet de requête et doit terminer la requête avec un code d’état approprié, dans EvtIoCanceledOnQueue ou version ultérieure. Lorsque l’infrastructure appelle EvtIoCanceledOnQueue, la requête est toujours associée à la file d’attente d’E/S, mais le pilote ne peut pas requeiler la requête. La propriété de la demande reste avec le pilote même si le pilote ne termine pas la demande dans EvtIoCanceledOnQueue. Si le pilote termine la requête après la retour d’EvtIoCanceledOnQueue , il ne peut pas appeler WdfIoQueueFindRequest et WdfIoQueueRetrieveFoundRequest pour réacquire la propriété de la demande, car le pilote a déjà la propriété de la demande.

En règle générale, dans EvtIoCanceledOnQueue, le pilote termine la demande d’E/S avec l’état d’achèvement de STATUS_CANCELLED.

Dans certains cas, le pilote peut avoir précédemment requeué une demande d’E/S dans une file d’attente manuelle, peut-être pour attendre des informations. Par exemple, dans l’un de ses gestionnaires de requêtes, un pilote peut placer une requête d’E/S associée à une transaction DMA en attente dans une file d’attente manuelle. Dans ce cas, le pilote tente d’annuler la transaction DMA dans son rappel EvtIoCanceledOnQueue . Selon les résultats de l’opération d’annulation, le pilote termine la requête avec un état approprié, soit dans EvtIoCanceledOnQueue , soit ultérieurement.

L’infrastructure n’appelle pas la fonction de rappel EvtIoCanceledOnQueue du pilote pour les demandes d’E/S que l’infrastructure n’a jamais remises au pilote.

L’infrastructure appelle une fonction de rappel EvtIoCanceledOnQueue dès qu’elle détermine qu’une requête d’E/S a été annulée, quelle que soit la méthode de distribution définie par le pilote pour la file d’attente d’E/S. Par conséquent, l’infrastructure peut appeler une fonction de rappel EvtIoCanceledOnQueue pour :

  • Requête dans une file d’attente qui utilise la distribution séquentielle, même si le pilote possède actuellement une autre requête de la file d’attente.
  • Requête dans une file d’attente pour laquelle le pilote a défini NumberOfPresentedRequests, même si le pilote possède actuellement le nombre maximal de requêtes.
Pour plus d’informations sur la fonction de rappel EvtIoCanceledOnQueue , consultez Annulation des demandes d’E/S.

La fonction de rappel EvtIoCanceledOnQueue peut être appelée à IRQL <= DISPATCH_LEVEL, sauf si le membre ExecutionLevel de la structure WDF_OBJECT_ATTRIBUTES du périphérique ou du pilote est défini sur WdfExecutionLevelPassive.

Si l’IRQL est PASSIVE_LEVEL, l’infrastructure appelle la fonction de rappel dans une région critique.

Exemples

Pour définir une fonction de rappel EvtIoCanceledOnQueue , vous devez d’abord fournir une déclaration de fonction qui identifie le type de fonction de rappel que vous définissez. Windows fournit un ensemble de types de fonctions de rappel pour les pilotes. La déclaration d’une fonction à l’aide des types de fonctions de rappel aide l’analyse du code pour les pilotes, le vérificateur de pilote statique (SDV) et d’autres outils de vérification recherchent des erreurs, et il est nécessaire d’écrire des pilotes pour le système d’exploitation Windows.

Pour définir une fonction de rappel EvtIoCanceledOnQueue , vous devez d’abord fournir une déclaration de fonction requise par SDV et d’autres outils de vérification. L’exemple suivant est extrait de l’exemple de pilote de carte à puce PCMCIA .

EVT_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE PscrEvtIoCanceledOnQueue;

Dans l’exemple de pilote de carte à puce PCMCIA , le pilote utilise une file d’attente manuelle pour stocker les demandes de notification de carte à puce en attente. Le pilote fournit une fonction de rappel EvtIoCanceledOnQueue dans laquelle le pilote efface le champ de notification et termine la requête.

_Use_decl_annotations_
VOID
PscrEvtIoCanceledOnQueue(
    WDFQUEUE  Queue,
    WDFREQUEST  Request
    )

{
    PDEVICE_EXTENSION DeviceExtension;
    PSMARTCARD_EXTENSION smartcardExtension;

    DeviceExtension = GetDeviceExtension(WdfIoQueueGetDevice(Queue));
    smartcardExtension = (PSMARTCARD_EXTENSION) &DeviceExtension->SmartcardExtension;

    //KdPrint(("Cancelled on queue 0x%x\n", WdfRequestWdmGetIrp(Request)));

    InterlockedExchangePointer(
                             &(smartcardExtension->OsData->NotificationIrp),
                             NULL
                             );

    WdfRequestComplete(Request, STATUS_CANCELLED);
}

Le type de fonction EVT_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE est défini dans le fichier d’en-tête Wdfio.h. Pour identifier plus précisément les erreurs lorsque vous exécutez les outils d’analyse du code, veillez à ajouter l’annotation Use_decl_annotations à votre définition de fonction. L’annotation Use_decl_annotations garantit que les annotations appliquées au type de fonction EVT_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE dans le fichier d’en-tête sont utilisées. Pour plus d’informations sur la configuration requise pour les déclarations de fonction, consultez La déclaration de fonctions à l’aide de types de rôles de fonction pour les pilotes KMDF. Pour plus d’informations sur Use_decl_annotations, consultez Annotating Function Behavior.

Configuration requise

   
Plateforme cible Universal
Version KMDF minimale 1.0
Version UMDF minimale 2,0
En-tête wdfio.h (include Wdf.h)
IRQL <= DISPATCH_LEVEL (voir section Notes)

Voir aussi

WdfIoQueueCreate

WdfRequestForwardToIoQueue