Использование ECP для обработки операций IRP_MJ_CREATE в драйвере фильтра файловой системы

Дополнительные параметры создания (ECPs) можно использовать в драйвере фильтра файловой системы для обработки IRP_MJ_CREATE операций. Драйвер фильтра файловой системы может вызывать подпрограммы в следующих разделах, чтобы получить, задать (добавить), подтвердить и удалить ECP для операции IRP_MJ_CREATE. Вы также можете определить пространство операционной системы, из которого были созданы ECPs.

Получение ECP

Чтобы получить ECPs для операции IRP_MJ_CREATE, выполните следующие действия.

  1. Вызовите FltGetEcpListFromCallbackData (или FsRtlGetEcpListFromIrp), чтобы получить указатель на ECP_LIST, связанный с операцией создания.

  2. Выполните одно из следующих операций:

    • Вызовите FltGetNextExtraCreateParameter (или FsRtlGetNextExtraCreateParameter), чтобы получить указатель на следующую (или первую) структуру контекста ECP в списке ECP.
    • Вызовите FltFindExtraCreateParameter (или FsRtlFindExtraCreateParameter) для поиска структуры контекста ECP заданного типа в списке ECP. Любая подпрограмма возвращает указатель на структуру контекста ECP, если найдена структура.

Настройка ECP

Чтобы задать ECPs для операции IRP_MJ_CREATE, драйвер фильтра файловой системы будет либо:

  • Задайте ЕЦП в существующем ECP_LIST.

  • Задайте ЕЦП в только что созданном ECP_LIST.

Настройка ECP в существующем списке ECP_LIST

Чтобы задать ECPs в существующейECP_LIST, связанной с операцией создания:

  1. Вызовите FltGetEcpListFromCallbackData (или FsRtlGetEcpListFromIrp), чтобы получить указатель на ECP_LIST, связанный с операцией создания.

  2. Вызовите FltAllocateExtraCreateParameter (или FsRtlAllocateExtraCreateParameter) для выделения пула памяти страниц для структуры контекста ECP и создания указателя на нее.

  3. Вызовите FltInsertExtraCreateParameter (или FsRtlInsertExtraCreateParameter) для вставки структур контекста ECP в структуру ECP_LIST.

Настройка ECP в только что созданном ECP_LIST

Если в настоящее время ECP_LIST не связана с операцией создания, необходимо создать ее, а затем задать в ней ecPs:

  1. Вызовите FltAllocateExtraCreateParameterList (или FsRtlAllocateExtraCreateParameterList) для выделения памяти для структуры ECP_LIST.

  2. Вызовите FltAllocateExtraCreateParameter (или FsRtlAllocateExtraCreateParameter) для выделения пула памяти страниц для структуры контекста ECP и создания указателя на нее.

  3. Вызовите FltInsertExtraCreateParameter (или FsRtlInsertExtraCreateParameter), чтобы добавить структуры контекста ECP в ECP_LIST.

  4. Вызовите FltSetEcpListIntoCallbackData (или FsRtlSetEcpListIntoIrp), чтобы присоединить список ECP к операции создания.

Удаление ECP

Чтобы удалить ECPs для операции IRP_MJ_CREATE, выполните следующие действия.

  1. Вызовите FltRemoveExtraCreateParameter (или FsRtlRemoveExtraCreateParameter), чтобы найти структуру контекста ECP в списке ECP. Если найдена структура контекста ECP, подпрограмма отсоединяет структуру контекста ECP от списка ECP.

  2. Чтобы освободить память для отсоединяемой структуры контекста ECP, вызовите FltFreeExtraCreateParameter (или FsRtlFreeExtraCreateParameter). Эти подпрограммы можно вызвать для освобождения памяти для структуры контекста ECP, если вы выделили память одним из следующих способов:

Маркировка ЕЦП как подтвержденная или определение состояния подтверждения

Вызовите следующие подпрограммы, чтобы пометить ЕЦП как подтвержденные или определить, помечены ли ECP как подтвержденные:

  • Вызовите FltAcknowledgeEcp (или FsRtlAcknowledgeEcp), чтобы пометить структуру контекста ECP как подтвержденную. ECP можно пометить как просмотр, использование, обработку или любое другое условие ECP.

  • Вызов FltIsEcpAcknowledged (или FsRtlIsEcpAcknowledged) для определения, помечена ли структура контекста ECP как подтверждённая.

Определение режима происхождения

Вызовите FltIsEcpFromUserMode (или FsRtlIsEcpFromUserMode), чтобы определить, исходит ли структура контекста ECP из пользовательского режима. Драйвер фильтра файловой системы может отказаться от принятия структуры контекста ECP, созданной в пользовательском режиме.

Использование списков lookaside для выделения ECP

Вызовите следующие подпрограммы, чтобы выделить ECPs из списков ожидания и и управлять списками ожидания и ECPs.