Partager via


DRIVER_CANCEL fonction de rappel (wdm.h)

La routine Annuler annule une opération d’E/S.

Syntaxe

DRIVER_CANCEL DriverCancel;

void DriverCancel(
  [in, out] _DEVICE_OBJECT *DeviceObject,
  [in, out] _IRP *Irp
)
{...}

Paramètres

[in, out] DeviceObject

Pointeur fourni par l’appelant vers une structure DEVICE_OBJECT . Il s’agit de l’objet d’appareil pour l’appareil cible, précédemment créé par la routine AddDevice du pilote.

[in, out] Irp

Pointeur fourni par l’appelant vers une structure IRP qui décrit l’opération d’E/S à annuler.

Valeur de retour

None

Remarques

Lorsqu’un pilote ou un autre composant système appelle IoCancelIrp, le gestionnaire d’E/S appelle la routine Cancel de l’IRP, si elle a été inscrite pour l’IRP.

Pour inscrire une routine Cancel pour un IRP, un pilote peut utiliser l’une des deux méthodes suivantes :

  1. Un pilote qui fournit une routine StartIo et utilise la file d’attente d’appareils fournie par le gestionnaire d’E/S peut spécifier une routine Annuler lors de l’appel de IoStartPacket.

  2. Un pilote qui crée et gère des files d’attente d’appareils supplémentaires peut inscrire une routine Annuler en appelant IoSetCancelRoutine.

Une seule routine Cancel peut être inscrite pour une IRP à la fois.

Le gestionnaire d’E/S appelle IoAcquireCancelSpinLock avant d’appeler la routine Cancel d’un pilote. La routine Cancel doit donc appeler IoReleaseCancelSpinLock à un moment donné. La routine ne doit pas maintenir le verrou de rotation plus longtemps que nécessaire.

La routine Cancel s’exécute dans un contexte de thread arbitraire à IRQL = DISPATCH_LEVEL jusqu’à ce qu’elle appelle IoReleaseCancelSpinLock, ce qui remplace l’IRQL par une valeur fournie par l’appelant. Le pilote doit spécifier Irp-CancelIrql> pour cette valeur.

La routine Cancel doit définir le membre Status du bloc d’E/S status sur STATUS_CANCELLED et définir son membre Information sur zéro. La routine doit ensuite terminer l’IRP spécifiée en appelant IoCompleteRequest.

Pour plus d’informations sur l’implémentation de la routine Cancel d’un pilote, consultez Annulation des irps.

Exemples

Pour définir une routine annuler le rappel, vous devez d’abord fournir une déclaration de fonction qui identifie le type de routine 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 fonction de rappel permet à l’analyse du code pour les pilotes, au vérificateur de pilotes statiques (SDV) et à d’autres outils de vérification de trouver des erreurs. Il s’agit d’une exigence pour l’écriture de pilotes pour le système d’exploitation Windows.

Par exemple, pour définir une routine de rappel Cancel nommée MyCancel, utilisez le type DRIVER_CANCEL comme indiqué dans cet exemple de code :

DRIVER_CANCEL MyCancel;

Ensuite, implémentez votre routine de rappel comme suit :

_Use_decl_annotations_
VOID
  MyCancel(
    struct _DEVICE_OBJECT  *DeviceObject,
    struct _IRP  *Irp
    )
  {
      // Function body
  }

Le type de fonction DRIVER_CANCEL est défini dans le fichier d’en-tête Wdm.h. Pour identifier plus précisément les erreurs lors de l’exécution des 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 DRIVER_CANCEL 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 Déclaration de fonctions à l’aide de types de rôles de fonction pour les pilotes WDM. Pour plus d’informations sur _Use_decl_annotations_, consultez Annotating Function Behavior.

Configuration requise

Condition requise Valeur
Plateforme cible Desktop (Expérience utilisateur)
En-tête wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
IRQL Appelé à DISPATCH_LEVEL (voir la section Remarques).