FltAllocateExtraCreateParameter 函数 (fltkernel.h)

FltAllocateExtraCreateParameter 例程为用户定义的额外创建参数分配分页内存池, (ECP) 上下文结构,并生成指向该结构的指针。

语法

NTSTATUS FLTAPI FltAllocateExtraCreateParameter(
  [in]           PFLT_FILTER                                    Filter,
  [in]           LPCGUID                                        EcpType,
  [in]           ULONG                                          SizeOfContext,
  [in]           FSRTL_ALLOCATE_ECP_FLAGS                       Flags,
  [in, optional] PFSRTL_EXTRA_CREATE_PARAMETER_CLEANUP_CALLBACK CleanupCallback,
  [in]           ULONG                                          PoolTag,
  [out]          PVOID                                          *EcpContext
);

参数

[in] Filter

微筛选器驱动程序的不透明筛选器指针。 此指针唯一标识微筛选器驱动程序,只要加载微筛选器驱动程序,它就保持不变。

[in] EcpType

指向用户定义的 GUID 的指针,该 GUID 指示 ECP 上下文结构的类型。 有关详细信息 ,请参阅在驱动程序中使用 GUID

[in] SizeOfContext

用户定义的上下文结构的大小(以字节为单位)。

[in] Flags

定义池分配选项。 下面介绍了在使用按位 OR 操作将一个或多个列出的标志值与 Flags 参数组合时如何分配池:

  • FSRTL_ALLOCATE_ECP_FLAG_NONPAGED_POOL - 将分配非分页池。 如果未使用此标志值,则将分配分页池。

  • FSRTL_ALLOCATE_ECPLIST_FLAG_CHARGE_QUOTA - 此例程分配的所有池都将根据当前进程的内存配额收费。

如果使用多个标志,将发生与已利用标志值关联的所有效果。

[in, optional] CleanupCallback

指向 PFSRTL_EXTRA_CREATE_PARAMETER_CLEANUP_CALLBACK类型的微筛选器定义的清理回调例程的可选指针。 删除 FltAllocateExtraCreateParameter 例程) 创建的 ECP 结构 (时,将调用清理回调例程。 如果清理回调例程不适用,请将此参数设置为 NULL

[in] PoolTag

指定已分配内存的池标记。 有关详细信息,请参阅 ExAllocatePoolWithTagTag 参数。

[out] EcpContext

接收指向分配的 ECP 上下文结构的指针。 如果例程未能分配足够的池, 则 *EcpContext 将为 NULL ,并且例程将返回状态代码STATUS_INSUFFICIENT_RESOURCES。

返回值

FltAllocateExtraCreateParameter 可以返回以下值之一:

返回代码 说明
STATUS_INSUFFICIENT_RESOURCES FltAllocateExtraCreateParameter 无法为 ECP 结构分配足够的内存。 在这种情况下, EcpContext 将为 NULL
STATUS_SUCCESS 已成功分配 ECP 结构。 在这种情况下,将在 EcpContext 参数中返回指向已分配结构的指针。

注解

默认情况下, FltAllocateExtraCreateParameter 例程为用户定义的 ECP 上下文结构分配分页内存池。 如果如上所述使用FSRTL_ALLOCATE_ECP_FLAG_NONPAGED_POOL位掩码,则会分配非分页内存池。 分配此池并初始化 ECP 上下文结构后, FltInsertExtraCreateParameter 例程用于将 ECP 上下文结构 (ECP 列表元素) 插入 ECP 列表结构 (ECP 列表) 。

FltAllocateExtraCreateParameter 例程分配的内存池不会由操作系统自动释放。 最终必须使用以下方法之一释放此内存池:

  • 调用 FltRemoveExtraCreateParameter 例程以从 ECP 列表中删除 ECP 上下文结构,然后调用 FltFreeExtraCreateParameter 例程以释放 ECP 上下文结构本身。 ECP 列表仍然存在。

  • 调用 FltFreeExtraCreateParameterList 例程 - 这将释放 ECP 列表,包括任何列表元素 (ECP 上下文结构) 。 ECP 列表已销毁。

    但是,如果文件系统或文件系统筛选器驱动程序在处理IRP_MJ_CREATE请求时将 ECP 附加到现有或新创建的ECP_LIST,则在 IRP 完成时会自动清理此 ECP。 因此,筛选器驱动程序不必清理动态添加的 ECP。 这允许筛选器驱动程序的 ECP 在重新分析点之间正确传播,此过程可能需要生成多个IRP_MJ_CREATE请求。

要求

要求
目标平台 通用
标头 fltkernel.h (包括 Fltkernel.h)
Library FltMgr.lib
IRQL <= APC_LEVEL

另请参阅

ECP_LIST

FltAllocateExtraCreateParameterFromLookasideList

FltAllocateExtraCreateParameterList

FltCreateFileEx2

FltFreeExtraCreateParameter

FltFreeExtraCreateParameterList

FltGetEcpListFromCallbackData

FltInsertExtraCreateParameter

FltRemoveExtraCreateParameter

FltSetEcpListIntoCallbackData

IoCreateFileEx

PFSRTL_EXTRA_CREATE_PARAMETER_CLEANUP_CALLBACK