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

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

Получение ECP

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

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

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

Настройка 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

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

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

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

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

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

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

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

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

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

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

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