Освобождение контекстов
Мини-фильтр освобождает контекст, вызывая FltReleaseContext. Каждый успешный вызов одной из следующих подпрограмм в конечном итоге должен соответствовать вызову FltReleaseContext:
Процедура создания контекста:
Подпрограммы получения контекста:
Подпрограммы набора контекста:
Подпрограмма приращения ссылок на контекст:
Обратите внимание, что указатель OldContext , возвращаемый FltSetXxxContext , и указатель контекста , возвращенный FltDeleteContext , также должны быть освобождены, если они больше не нужны.
В следующем примере кода, взятом из примера мини-фильтра CTX, подпрограмма CtxInstanceSetup создает и задает контекст экземпляра, а затем вызывает FltReleaseContext:
status = FltAllocateContext(
FltObjects->Filter, //Filter
FLT_INSTANCE_CONTEXT, //ContextType
CTX_INSTANCE_CONTEXT_SIZE, //ContextSize
NonPagedPool, //PoolType
&instanceContext); //ReturnedContext
...
status = FltSetInstanceContext(
FltObjects->Instance, //Instance
FLT_SET_CONTEXT_KEEP_IF_EXISTS, //Operation
instanceContext, //NewContext
NULL); //OldContext
if (instanceContext != NULL) {
FltReleaseContext(instanceContext);
}
return status;
Обратите внимание, что метод FltReleaseContext вызывается независимо от того, выполняется ли вызов FltSetInstanceContext :
Если fltSetInstanceContext завершается успешно, он добавляет собственную ссылку на контекст экземпляра (то есть увеличивает число ссылок в контексте экземпляра). Таким образом, набор ссылок fltAllocateContext больше не требуется, и вызов FltReleaseContext удаляет его.
Если FltSetInstanceContext завершается сбоем, контекст экземпляра имеет только одну ссылку, а именно ту, которая задана fltAllocateContext. Когда функция FltReleaseContext возвращает , контекст экземпляра имеет нулевое число ссылок и освобождается диспетчером фильтров.