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


Регистрация типов контекста

Драйвер минифильтра должен сначала зарегистрировать каждый тип контекста, который он использует. После того как минифильтр зарегистрировал типы контекста, которые он использует, он может создать контекст.

Действия по регистрации типа контекста

Минифильтр вызывает FltRegisterFilter из своей подпрограммы DriverEntry для регистрации каждого типа контекста, который он использует. Перед вызовом FltRegisterFilter драйвер минифильтра выполняет следующие действия:

  • Создает массив переменной длины FLT_CONTEXT_REGISTRATION структур. Порядок элементов в этом массиве не имеет значения; Однако последним элементом в массиве должен быть {FLT_CONTEXT_END}.
  • Сохраняет указатель на созданный массив в элементе ContextRegistrationструктуры FLT_REGISTRATION . Минифильтр передает эту структуру в параметре Registrationобъекта FltRegisterFilter.

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

Когда драйвер минифильтра вызывает FltAllocateContext для создания нового контекста, диспетчер фильтров использует параметр Size , а также элементы Size и Flags структуры FLT_CONTEXT_REGISTRATION, чтобы выбрать используемое определение контекста:

  • Для контекстов фиксированного размера элемент Size структуры FLT_CONTEXT_REGISTRATION указывает размер (в байтах) части структуры контекста, определенной драйвером минифильтра. Максимальный размер контекста — MAXUSHORT (64 КБ). Ноль является допустимым значением размера. Диспетчер фильтров реализует контексты фиксированного размера с помощью списков lookaside. Диспетчер фильтров создает два списка внешних элементов для каждого значения размера: один страничный и один без пачки.

  • Для контекстов переменной размера элементу Размер необходимо задать значение FLT_VARIABLE_SIZED_CONTEXTS. Диспетчер фильтров выделяет контексты переменной величины непосредственно из выгружаемого или невыгружаемого пула.

В элементе Flags структуры FLT_CONTEXT_REGISTRATION можно указать флаг FLTFL_CONTEXT_REGISTRATION_NO_EXACT_SIZE_MATCH. Если драйвер минифильтра использует контексты фиксированного размера и указан этот флаг, диспетчер фильтров выделяет контекст из списка lookaside, если размер контекста больше или равен запрошенного размера. В противном случае размер контекста должен быть равен запрошенному размеру.

Для заданного типа контекста драйвер минифильтра может предоставить до трех определений контекста фиксированного размера, каждое из которых имеет свой размер и одно определение переменной величины. Дополнительные сведения см. в разделе FLT_CONTEXT_REGISTRATION.

Подпрограммы обратного вызова минифильтра для управления контекстом

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

Подпрограмма обратного вызова Описание
PFLT_CONTEXT_ALLOCATE_CALLBACK В очень редких случаях минифильтру может потребоваться определить собственную процедуру обратного вызова для выделения контекстов, а не полагаться на диспетчер фильтров.
PFLT_CONTEXT_CLEANUP_CALLBACK Подпрограмма очистки минифильтра, вызываемая до освобождения контекста.
PFLT_CONTEXT_FREE_CALLBACK В очень редких случаях минифильтру может потребоваться определить собственную процедуру обратного вызова для освобождения контекстов, а не полагаться на диспетчер фильтров.

Пример кода контекстной регистрации

В следующем примере кода, взятом из драйвера мини-фильтра CTX, показан массив FLT_CONTEXT_REGISTRATION структур, которые используются для регистрации контекстов экземпляра, файла, потока и объекта файла (дескриптора потока).

const FLT_CONTEXT_REGISTRATION contextRegistration[] =
{
    { FLT_INSTANCE_CONTEXT,              //ContextType
      0,                                 //Flags
      CtxContextCleanup,                 //ContextCleanupCallback
      CTX_INSTANCE_CONTEXT_SIZE,         //Size
      CTX_INSTANCE_CONTEXT_TAG           //PoolTag
    },
    { FLT_FILE_CONTEXT,                  //ContextType
      0,                                 //Flags
      CtxContextCleanup,                 //ContextCleanupCallback
      CTX_FILE_CONTEXT_SIZE,             //Size
      CTX_FILE_CONTEXT_TAG               //PoolTag
    },
    { FLT_STREAM_CONTEXT,                //ContextType
      0,                                 //Flags
      CtxContextCleanup,                 //ContextCleanupCallback
      CTX_STREAM_CONTEXT_SIZE,           //Size
      CTX_STREAM_CONTEXT_TAG             //PoolTag
    },
    { FLT_STREAMHANDLE_CONTEXT,          //ContextType
      0,                                 //Flags
      CtxContextCleanup,                 //ContextCleanupCallback
      CTX_STREAMHANDLE_CONTEXT_SIZE,     //Size
      CTX_STREAMHANDLE_CONTEXT_TAG       //PoolTag
    },
    { FLT_CONTEXT_END }
};