使用 ECP 处理文件系统筛选器驱动程序中的IRP_MJ_CREATE操作
可以在文件系统筛选器驱动程序中使用额外的创建参数 (ECP) 来处理 IRP_MJ_CREATE 操作。 文件系统筛选器驱动程序可以调用以下部分中的例程来检索、设置 (为 IRP_MJ_CREATE操作添加) 、确认和删除 ECP。 还可以确定 ECP 源自的操作系统空间。
检索 ECP
检索 IRP_MJ_CREATE 操作的 ECP:
调用 FltGetEcpListFromCallbackData (或 FsRtlGetEcpListFromIrp) 检索指向与创建操作关联的 ECP_LIST 的指针。
执行以下操作之一:
- 调用 FltGetNextExtraCreateParameter (或 FsRtlGetNextExtraCreateParameter) 检索指向 ECP 列表中的下一个 (或第一个) ECP 上下文结构的指针。
- 调用 FltFindExtraCreateParameter (或 FsRtlFindExtraCreateParameter) 在 ECP 列表中搜索给定类型的 ECP 上下文结构。 如果找到该结构,则任一例程都返回指向 ECP 上下文结构的指针。
设置 ECP
若要为 IRP_MJ_CREATE 操作设置 ECP,文件系统筛选器驱动程序将执行以下操作之一:
在现有 ECP_LIST中设置 ECP。
在新创建的 ECP_LIST中设置 ECP。
在现有ECP_LIST中设置 ECP
若要在与创建操作关联的 现有ECP_LIST 中设置 ECP,请执行以下命令:
调用 FltGetEcpListFromCallbackData (或 FsRtlGetEcpListFromIrp) 检索指向与创建操作关联的 ECP_LIST 的指针。
调用 FltAllocateExtraCreateParameter (或 FsRtlAllocateExtraCreateParameter) 为 ECP 上下文结构分配分页内存池并生成指向该结构的指针。
调用 FltInsertExtraCreateParameter (或 FsRtlInsertExtraCreateParameter) 将 ECP 上下文结构插入 到 ECP_LIST 结构中。
在新创建的ECP_LIST中设置 ECP
如果 ECP_LIST 当前未与创建操作关联,则需要创建一个,然后在其中设置 ECP:
调用 FltAllocateExtraCreateParameterList (或 FsRtlAllocateExtraCreateParameterList) 为 ECP_LIST 结构分配内存。
调用 FltAllocateExtraCreateParameter (或 FsRtlAllocateExtraCreateParameter) 为 ECP 上下文结构分配分页内存池并生成指向该结构的指针。
调用 FltInsertExtraCreateParameter (或 FsRtlInsertExtraCreateParameter) 将 ECP 上下文结构插入 ECP_LIST。
调用 FltSetEcpListIntoCallbackData (或 FsRtlSetEcpListIntoIrp) 将 ECP 列表附加到创建操作。
删除 ECP
若要删除 IRP_MJ_CREATE 操作的 ECP,请执行以下命令:
调用 FltRemoveExtraCreateParameter (或 FsRtlRemoveExtraCreateParameter) 以在 ECP 列表中搜索 ECP 上下文结构。 如果找到 ECP 上下文结构,则例程将从 ECP 列表中分离 ECP 上下文结构。
若要释放分离 ECP 上下文结构的内存,请调用 FltFreeExtraCreateParameter (或 FsRtlFreeExtraCreateParameter) 。 如果通过以下方式之一分配了内存,则可以调用这些例程来释放 ECP 上下文结构的内存:
- 调用 FltAllocateExtraCreateParameter (或 FsRtlAllocateExtraCreateParameter) 来分配分页内存池
- 你调用了 FltAllocateExtraCreateParameterFromLookasideList (或 FsRtlAllocateExtraCreateParameterFromLookasideList) 从 lookaside 列表中分配内存池
将 ECP 标记为已确认,或确定确认状态
调用以下例程以将 ECP 标记为已确认,或确定是否将 ECP 标记为已确认:
调用 FltAcknowledgeEcp (或 FsRtlAcknowledgeEcp) 将 ECP 上下文结构标记为已确认。 可以将 ECP 标记为已查看、已使用、已处理或 ECP 的任何其他条件。
调用 FltIsEcpAcknowledged (或 FsRtlIsEcpAcknowledged) 以确定 ECP 上下文结构是否标记为已确认。
确定发起模式
调用 FltIsEcpFromUserMode (或 FsRtlIsEcpFromUserMode) 以确定 ECP 上下文结构是否源自用户模式。 文件系统筛选器驱动程序可以拒绝接受源自用户模式的 ECP 上下文结构。
使用旁视列表分配 ECP
调用以下例程以从 旁观列表 分配 ECP 并管理旁视列表和 ECP:
调用 FltInitExtraCreateParameterLookasideList (或 FsRtlInitExtraCreateParameterLookasideList) 以初始化用于分配一个或多个固定大小的 ECP 上下文结构的分页或非分页池旁视列表。
调用 FltDeleteExtraCreateParameterLookasideList (或 FsRtlDeleteExtraCreateParameterLookasideList) 以释放 lookaside 列表。
调用 FltAllocateExtraCreateParameterFromLookasideList (或 FsRtlAllocateExtraCreateParameterFromLookasideList) ,以便为 ECP 上下文结构从 lookaside 列表中分配内存池,并生成指向该结构的指针。
调用 FltFreeExtraCreateParameter (或 FsRtlFreeExtraCreateParameter) 以释放 ECP 上下文结构的内存。
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈