Удаление контекстов

Каждый контекст, заданный успешным вызовом FltSetXxxContext , должен быть удален в конечном итоге.

Диспетчер фильтров автоматически удаляет контексты при возникновении следующих ситуаций:

  • Объекты, к которым присоединены контексты, удаляются
  • Экземпляр мини-фильтра отсоединяется от тома
  • Драйвер мини-фильтра выгружен

Таким образом, для явного удаления контекста редко требуется минифильтр.

Минифильтр может удалить контекст, вызвав одну из следующих процедур удаления контекста:

Контекст можно удалить только в том случае, если он в настоящее время задан для объекта. Контекст нельзя удалить, если он еще не задан или он уже заменен успешным вызовом FltSetXxxContext.

Подпрограммы FltDeleteXxxContext возвращают указатель на старый контекст в параметре OldContext, если OldContext не является NULL и не указывает на NULL_CONTEXT. Если OldContext имеет значение NULL, диспетчер фильтров уменьшает количество ссылок в контексте, который затем освобождается, если минифильтр не имеет на него выдающуюся ссылку.

В следующем примере кода показано, как удалить контекст потока:

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

В этом примере FltDeleteStreamContext:

  • Удаляет контекст потока из потока.
  • Не уменьшает количество ссылок контекста, так как параметр OldContext не равен NULL.
  • Возвращает адрес удаленного контекста (контекст, удаленный из потока) в параметре OldContext .

Из-за параметра OldContext , отличного от NULL, после выполнения любой необходимой обработки фильтр должен освободить удаленный контекст, вызвав FltReleaseContext.