使用 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
调用以下例程,从 lookaside 列表 分配 ECP 并管理 lookaside 列表和 ECP:
调用 FltInitExtraCreateParameterLookasideList(或 FsRtlInitExtraCreateParameterLookasideList),以初始化用于分配固定大小的一个或多个 ECP 上下文结构的分页或非分页池外观列表。
调用 FltDeleteExtraCreateParameterLookasideList(或 FsRtlDeleteExtraCreateParameterLookasideList)以释放 lookaside 列表。
调用 FltAllocateExtraCreateParameterFromLookasideList (或 FsRtlAllocateExtraCreateParameterFromLookasideList)从 ECP 上下文结构的 lookaside 列表中分配内存池,并生成指向该结构的指针。
调用 FltFreeExtraCreateParameter (或 FsRtlFreeExtraCreateParameter)释放 ECP 上下文结构的内存。