Partager via


Suppression de contextes

Chaque contexte défini par un appel réussi à FltSetXxxContext doit finalement être supprimé.

Le gestionnaire de filtres supprime automatiquement les contextes lorsque les situations suivantes se produisent :

  • Les objets auxquels les contextes sont attachés sont supprimés
  • Un minifiltre instance est détaché d’un volume
  • Le pilote minifilter est déchargé

Ainsi, il est rarement nécessaire qu’un minifiltre supprime explicitement un contexte.

Un minifiltre peut supprimer un contexte en appelant l’une des routines de suppression de contexte suivantes :

Un contexte ne peut être supprimé que s’il est actuellement défini pour un objet . Un contexte ne peut pas être supprimé s’il n’a pas encore été défini ou s’il a déjà été remplacé par un appel réussi à FltSetXxxContext.

Les routines FltDeleteXxxContext retournent un pointeur vers l’ancien contexte dans le paramètre OldContext , si OldContext n’a pas la valeur NULL et ne pointe pas vers NULL_CONTEXT. Si OldContext a la valeur NULL, le gestionnaire de filtres décrémente le nombre de références sur le contexte, qui est ensuite libéré, sauf si le minifiltre contient une référence exceptionnelle.

L’exemple de code suivant montre comment supprimer un contexte de flux :

status = FltDeleteStreamContext(
 FltObjects->Instance,      //Instance
 FltObjects->FileObject,    //FileObject
           &oldContext);              //OldContext
//
// Perform any needed processing
// ...
//
if (oldContext != NULL) {
 FltReleaseContext(oldContext);
}

Dans cet exemple, FltDeleteStreamContext :

  • Supprime le contexte de flux du flux.
  • Ne décrémente pas le nombre de références du contexte, car le paramètre OldContext n’est pas NULL.
  • Retourne l’adresse du contexte supprimé (le contexte supprimé du flux) dans le paramètre OldContext .

En raison du paramètre OldContext non NULL, après avoir effectué tout traitement nécessaire, le filtre doit libérer le contexte supprimé en appelant FltReleaseContext.