Partager via


EVT_WDF_OBJECT_CONTEXT_CLEANUP fonction de rappel (wdfobject.h)

[S’applique à KMDF et UMDF]

La fonction de rappel d’événement EvtCleanupCallback d’un pilote supprime les références du pilote sur un objet afin que l’objet puisse être supprimé.

Syntaxe

EVT_WDF_OBJECT_CONTEXT_CLEANUP EvtWdfObjectContextCleanup;

void EvtWdfObjectContextCleanup(
  [in] WDFOBJECT Object
)
{...}

Paramètres

[in] Object

Handle pour un objet framework.

Valeur de retour

None

Remarques

Le pilote peut spécifier une fonction de rappel EvtCleanupCallback dans une structure WDF_OBJECT_ATTRIBUTES . Cette structure est utilisée comme entrée pour toutes les méthodes d’infrastructure qui créent des objets d’infrastructure, tels que WdfDeviceCreate.

L’infrastructure appelle la fonction de rappel lorsque l’infrastructure ou un pilote tente de supprimer l’objet.

Si le pilote a appelé WdfObjectReference pour augmenter le nombre de références d’un objet, il doit fournir une fonction de rappel EvtCleanupCallback qui appelle WdfObjectDereference. Cet appel garantit que le nombre de références de l’objet est décrémenté à zéro et, par conséquent, l’infrastructure peut appeler la fonction de rappel EvtDestroyCallback du pilote, puis supprimer l’objet.

Si un pilote fournit à la fois une fonction de rappel EvtCleanupCallback et une fonction de rappel EvtDestroyCallback pour un objet, l’infrastructure appelle d’abord la fonction de rappel EvtCleanupCallback .

Une fois que l’infrastructure a appelé la fonction de rappel EvtCleanupCallback d’un objet, le pilote peut accéder à l’objet uniquement à partir de sa fonction de rappel EvtDestroyCallback . Toutefois, un pilote ne doit pas tenter d’appeler des méthodes sur un objet à partir de son EvtDestroyCallback.

Lorsqu’un pilote crée un objet, il alloue parfois des mémoires tampons spécifiques à l’objet et stocke les pointeurs de mémoire tampon dans l’espace contextuel de l’objet. La fonction de rappel EvtCleanupCallback ou EvtDestroyCallback du pilote peut libérer ces mémoires tampons.

En règle générale, si votre pilote n’appelle pas WdfObjectReference pour un objet, la fonction de rappel EvtCleanupCallback de l’objet peut libérer les allocations de contexte d’objet. Dans ce cas, le pilote n’a pas besoin d’une fonction de rappel EvtDestroyCallback pour l’objet .

Lorsqu’un objet est supprimé, l’infrastructure supprime également les enfants de l’objet. À une exception près, l’infrastructure appelle les routines EvtCleanupCallback des objets enfants avant d’appeler celles de leurs objets parents. Les pilotes sont donc assurés que l’objet parent existe toujours quand la routine EvtCleanupCallback d’un enfant s’exécute.

L’exception à ce classement garanti s’applique aux demandes d’E/S effectuées par le pilote à DISPATCH_LEVEL. Si un tel objet de requête d’E/S a un ou plusieurs enfants dont les routines EvtCleanupCallback doivent être appelées à PASSIVE_LEVEL, la requête parente peut être supprimée avant un ou plusieurs de ses enfants. Un objet nécessite un nettoyage à PASSIVE_LEVEL s’il doit attendre que quelque chose se termine ou s’il accède à la mémoire paginée.

Si le pilote tente de supprimer un tel objet (ou le parent d’un tel objet) pendant qu’il s’exécute à DISPATCH_LEVEL, le framework met en file d’attente l’EvtCleanupCallback vers un élément de travail pour un traitement ultérieur à PASSIVE_LEVEL, puis appelle le rappel de nettoyage pour l’objet parent sans déterminer si les rappels pour les enfants ont été exécutés.

Pour éviter tout problème pouvant résulter de ce comportement, les pilotes ne doivent pas définir l’objet de requête comme parent pour tout objet qui nécessite un nettoyage à PASSIVE_LEVEL. Par défaut, le parent de la plupart des objets est WDFDEVICE. Les pilotes doivent donc simplement accepter la valeur par défaut. En règle générale, si l’objet WDFDEVICE est passé en tant que paramètre (directement ou dans le cadre d’une structure) à la méthode qui crée l’objet, WDFDEVICE est le parent par défaut. Pour obtenir la liste complète des parents par défaut, consultez Résumé des objets framework.

Si l’exception ci-dessus ne s’applique pas, le framework appelle les fonctions de rappel EvtCleanupCallback de l’objet enfant avant d’appeler la fonction de rappel EvtCleanupCallback de l’objet parent. Ensuite, si le nombre de références de l’enfant est égal à zéro, le framework appelle la fonction de rappel EvtDestroyCallback de l’objet enfant. Enfin, si le nombre de références du parent est égal à zéro, le framework appelle la fonction de rappel EvtDestroyCallback de l’objet parent.

Pour plus d’informations sur la suppression d’objets framework, consultez Framework Object Life Cycle.

En règle générale, le framework appelle la fonction de rappel EvtCleanupCallback à IRQL <= DISPATCH_LEVEL. Toutefois, l’infrastructure appelle la fonction de rappel à l’adresse IRQL = PASSIVE_LEVEL dans les situations suivantes :

  • Le type de handle de l’objet est WDFDEVICE, WDFDRIVER, WDFDPC, WDFINTERRUPT, WDFIOTARGET, WDFQUEUE, WDFSTRING, WDFTIMER ou WDFWORKITEM.
  • Le type de handle de l’objet est WDFMEMORY ou WDFLOOKASIDE, et le pilote a spécifié PagedPool pour le paramètre PoolType sur WdfMemoryCreate ou WdfLookasideListCreate.
Lorsqu’un objet élément de travail est supprimé, explicitement ou parce que l’objet parent de l’élément de travail est en cours de suppression, avant d’appeler la fonction de rappel EvtCleanupCallback de l’élément de travail, l’infrastructure attend que toutes les instances de la fonction de rappel EvtWorkItem de l’élément de travail aient été retournées. Pour plus d’informations, consultez WdfWorkItemEnqueue.

De même, lorsqu’un objet de minuteur est supprimé, explicitement ou parce que l’objet parent du minuteur est en cours de suppression, avant d’appeler la fonction de rappel EvtCleanupCallback du minuteur, le framework attend que toutes les instances de la fonction de rappel d’événement EvtTimerFunc du minuteur soient retournées.

À compter de la version 1.9 de l’infrastructure, le fichier d’en-tête wdfroletypes.h contient d’autres types de fonctions spécifiques au type d’objet pour la fonction de rappel EvtCleanupCallback . Ces autres types aident les outils de vérification à déterminer si le pilote utilise correctement la fonction de rappel. Utilisez le tableau suivant pour déterminer le type de fonction à utiliser.

Type d'objet Type de fonction
Objet d’appareil EVT_WDF_DEVICE_CONTEXT_CLEANUP
Objet file d’attente d’E/S EVT_WDF_IO_QUEUE_CONTEXT_CLEANUP_CALLBACK
File (objet) EVT_WDF_FILE_CONTEXT_CLEANUP_CALLBACK
Tous les autres objets EVT_WDF_OBJECT_CONTEXT_CLEANUP

Configuration requise

Condition requise Valeur
Plateforme cible Universal
Version KMDF minimale 1.0
Version UMDF minimale 2.0
En-tête wdfobject.h (inclure Wdf.h)
IRQL Consultez la section Notes.

Voir aussi

EvtDestroyCallback

WDF_OBJECT_ATTRIBUTES

WdfObjectDereference

WdfObjectReference

WdfWorkItemFlush