Использование ECP для обработки IRP_MJ_CREATE операций в драйвере фильтра файловой системы
Дополнительные параметры создания (ECPs) можно использовать в драйвере фильтра файловой системы для обработки IRP_MJ_CREATE операций. Драйвер фильтра файловой системы может вызывать подпрограммы в следующих разделах, чтобы получить, задать (добавить), подтвердить и удалить ECP для операции IRP_MJ_CREATE . Вы также можете определить пространство операционной системы, из которого были созданы ECPs.
Получение ECP
Чтобы получить ECPs для операции IRP_MJ_CREATE , выполните следующие действия.
Вызовите FltGetEcpListFromCallbackData (или FsRtlGetEcpListFromIrp), чтобы получить указатель на ECP_LIST, связанный с операцией создания.
Выполните одно из следующих операций:
- Вызовите FltGetNextExtraCreateParameter (или FsRtlGetNextExtraCreateParameter), чтобы получить указатель на следующую (или первую) структуру контекста ECP в списке ECP.
- Вызовите FltFindExtraCreateParameter (или FsRtlFindExtraCreateParameter), чтобы найти список ECP для структуры контекста ECP заданного типа. Любая подпрограмма возвращает указатель на структуру контекста ECP, если найдена структура.
Настройка ECP
Чтобы задать ecPs для операции IRP_MJ_CREATE , драйвер фильтра файловой системы будет либо:
Задайте ЕЦП в существующем ECP_LIST.
Задайте ЕЦП в только что созданном ECP_LIST.
Настройка ECP в существующем ECP_LIST
Чтобы задать ECPs в существующей ECP_LIST, связанной с операцией создания:
Вызовите FltGetEcpListFromCallbackData (или FsRtlGetEcpListFromIrp), чтобы получить указатель на ECP_LIST, связанный с операцией создания.
Вызовите FltAllocateExtraCreateParameter (или FsRtlAllocateExtraCreateParameter), чтобы выделить пул памяти страниц для структуры контекста ECP и создать указатель на ту структуру.
Вызовите FltInsertExtraCreateParameter (или FsRtlInsertExtraCreateParameter), чтобы вставить структуры контекста ECP в структуру ECP_LIST.
Настройка ECP в только что созданном ECP_LIST
Если ECP_LIST в настоящее время не связана с операцией создания, необходимо создать ее, а затем задать в ней ecPs:
Вызовите FltAllocateExtraCreateParameterList (или FsRtlAllocateExtraCreateParameterList), чтобы выделить память для структуры ECP_LIST.
Вызовите FltAllocateExtraCreateParameter (или FsRtlAllocateExtraCreateParameter), чтобы выделить пул памяти страниц для структуры контекста ECP и создать указатель на ту структуру.
Вызовите FltInsertExtraCreateParameter (или FsRtlInsertExtraCreateParameter), чтобы вставить структуры контекста ECP в ECP_LIST.
Вызовите FltSetEcpListIntoCallbackData (или FsRtlSetEcpListIntoIrp), чтобы присоединить список ECP к операции создания.
Удаление ECP
Чтобы удалить ECP для операции IRP_MJ_CREATE , выполните следующие действия.
Вызовите FltRemoveExtraCreateParameter (или FsRtlRemoveExtraCreateParameter), чтобы найти список ECP для структуры контекста ECP. Если найдена структура контекста ECP, подпрограмма отсоединяет структуру контекста ECP от списка ECP.
Чтобы освободить память для отсоединяемой структуры контекста ECP, вызовите FltFreeExtraCreateParameter (или FsRtlFreeExtraCreateParameter). Эти подпрограммы можно вызвать для освобождения памяти для структуры контекста ECP, если вы выделили память одним из следующих способов:
- Вы называетесь FltAllocateExtraCreateParameter (или FsRtlAllocateExtraCreateParameter) для выделения пула памяти страниц
- Вы назвали FltAllocateExtraCreateParameterFromLookasideList (или FsRtlAllocateExtraCreateParameterFromLoocsideList) для выделения пула памяти из списка lookaside
Маркировка ЕЦП как подтвержденная или определение состояния подтверждения
Вызовите следующие подпрограммы, чтобы пометить ЕЦП как подтвержденные или определить, помечены ли ECP как подтвержденные:
Вызовите FltAcknowledgeEcp (или FsRtlAcknowledgeEcp), чтобы пометить структуру контекста ECP как подтвержденную. ECP можно пометить как просмотр, использование, обработку или любое другое условие ECP.
Вызовите FltIsEcpAcknowled (или FsRtlIsEcpAcknowlededed), чтобы определить, помечена ли структура контекста ECP как подтвержденная.
Определение режима происхождения
Вызовите FltIsEcpFromUserMode (или FsRtlIsEcpFromUserMode), чтобы определить, возникла ли структура контекста ECP из пользовательского режима. Драйвер фильтра файловой системы может отказаться от принятия структуры контекста ECP, созданной в пользовательском режиме.
Использование списков lookaside для выделения ECP
Вызовите следующие подпрограммы, чтобы выделить ECP из списков lookaside и управлять списками lookaside и ECPs:
Вызовите FltInitExtraCreateParameterLookasideList (или FsRtlInitExtraCreateParameterLookasideList), чтобы инициализировать список подстановок пула, который используется для выделения одной или нескольких структур контекста ECP фиксированного размера.
Вызовите FltDeleteExtraCreateParameterLookasideList (или FsRtlDeleteExtraCreateParameterLookasideList), чтобы освободить список lookaside.
Вызовите FltAllocateExtraCreateParameterFromLookasideList (или FsRtlAllocateExtraCreateParameterFromLookasideList) для выделения пула памяти из списка lookaside для структуры контекста ECP и создания указателя на нее.
Вызовите FltFreeExtraCreateParameter (или FsRtlFreeExtraCreateParameter), чтобы освободить память для структур контекста ECP.