Удаление контекстов
Каждый контекст, заданный при успешном вызове Контекста FltSetXxx, в конечном итоге должен быть удален.
Диспетчер фильтров автоматически удаляет контексты при возникновении следующих ситуаций:
- Объекты, к которым прикреплены контексты, удаляются.
- Экземпляр минифильтра отсоединен от тома
- Драйвер минифильтра выгружается
Таким образом, для минифильтра редко требуется явное удаление контекста.
Мини-фильтр может удалить контекст, вызвав одну из следующих процедур удаления контекста:
- FltDeleteContext
- FltDeleteFileContext
- FltDeleteInstanceContext
- FltDeleteStreamContext
- FltDeleteStreamHandleContext
- FltDeleteTransactionContext
- FltDeleteVolumeContext
Контекст можно удалить только в том случае, если он задан для объекта . Невозможно удалить контекст, если он еще не задан или он уже заменен успешным вызовом контекста 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.