Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
После создания нового контекстадрайвер минифильтра может подключить его к объекту, вызвав одну из следующих подпрограмм набора:
- FltSetFileContext
- FltSetInstanceContext
- FltSetStreamContext
- FltSetStreamHandleContext
- FltSetTransactionContext
- FltSetVolumeContext
Подпрограмма выполнения выполняет следующие действия в зависимости от значения параметра Operation:
Если операция == FLT_SET_CONTEXT_KEEP_IF_EXISTS:
- Если мини-фильтр еще не задал контекст такого же типа для объекта, процедура установки:
- Присоединяет только что выделенный контекст к объекту.
- Увеличивает счетчик ссылок.
- Иначе, если минифильтр уже задал контекст, процедура set:
- Возвращает STATUS_FLT_CONTEXT_ALREADY_DEFINED (код ошибки NTSTATUS).
- Не заменяет существующий контекст.
- Не увеличивает число ссылок.
- Сохраняет указатель на существующий контекст в параметре OldContext, если он неNULL. Если этот указатель больше не нужен, драйвер минифильтра должен освободить его, вызвав FltReleaseContext.
- Если мини-фильтр еще не задал контекст такого же типа для объекта, процедура установки:
Если Операция == FLT_SET_CONTEXT_REPLACE_IF_EXISTS:
- Набор рутинных операций всегда присоединяет новый контекст к объекту.
- Если драйвер минифильтра уже задал контекст, процедура установки:
- Удаляет существующий контекст, задает новый контекст и увеличивает число ссылок в новом контексте.
- Если параметр OldContext неNULL, он получает указатель на удаленный контекст. Если этот указатель больше не нужен, драйвер минифильтра должен освободить его, вызвав FltReleaseContext.
После установки типа контекста мини-фильтр может получить контекст во время последующих операций ввода-вывода, чтобы определить, нужно ли выполнять какие-либо действия.
Каждый успешный набор контекстов в конечном итоге должен быть удалён .
В следующем примере кода, взятом из примера минифильтра CTX , программа CtxInstanceSetup создает и задает контекст экземпляра:
status = FltAllocateContext(
FltObjects->Filter, //in: Filter
FLT_INSTANCE_CONTEXT, //in: ContextType
CTX_INSTANCE_CONTEXT_SIZE, //in: ContextSize
NonPagedPool, //in: PoolType
&instanceContext); //out: ReturnedContext
...
status = FltSetInstanceContext(
FltObjects->Instance, //in: Instance
FLT_SET_CONTEXT_KEEP_IF_EXISTS, //in: Operation
instanceContext, //in: NewContext
NULL); //out: OldContext
if (instanceContext != NULL) {
FltReleaseContext(instanceContext);
}
return status;
Обратите внимание, что после вызова FltSetInstanceContextследует вызов FltReleaseContext, чтобы освободить счетчик ссылок, который был задан с помощью FltAllocateContext (неFltSetInstanceContext). Это объясняется в освобождении контекстов.