Настройка контекстов
После создания нового контекста драйвер мини-фильтра может присоединить его к объекту, вызвав одну из следующих процедур набора:
- FltSetFileContext
- FltSetInstanceContext
- FltSetStreamContext
- FltSetStreamHandleContext
- FltSetTransactionContext
- FltSetVolumeContext
Подпрограмма set выполняет следующие действия в зависимости от значения параметра Operation :
Если операция == FLT_SET_CONTEXT_KEEP_IF_EXISTS:
- Если мини-фильтр еще не задал контекст того же типа для объекта, подпрограмма set:
- Присоединяет к объекту только что выделенный контекст.
- Увеличивает число ссылок.
- В противном случае, если мини-фильтр уже задал контекст, подпрограмма set:
- Возвращает STATUS_FLT_CONTEXT_ALREADY_DEFINED (код ошибки NTSTATUS).
- Не заменяет существующий контекст.
- Не увеличивает число ссылок.
- Сохраняет указатель на существующий контекст в параметре OldContext , если он не равен NULL. Если этот указатель больше не нужен, драйвер мини-фильтра должен освободить его, вызвав FltReleaseContext.
- Если мини-фильтр еще не задал контекст того же типа для объекта, подпрограмма set:
Если операция == FLT_SET_CONTEXT_REPLACE_IF_EXISTS:
- Подпрограмма set всегда присоединяет новый контекст к объекту .
- Если драйвер минифильтра уже задал контекст, процедура задания:
- Удаляет существующий контекст, задает новый контекст и увеличивает количество ссылок для нового контекста.
- Если параметр 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). Это объясняется в разделе Освобождение контекстов.
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по