Поделиться через


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

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

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

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

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

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

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

Подпрограммы 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.