FwpsAllocateDeepCloneNetBufferList0 函数 (fwpsk.h)
FwpsAllocateDeepCloneNetBufferList0 函数分配NET_BUFFER_LIST结构,该结构是现有 NET_BUFFER_LIST 结构的深层克隆。
语法
NTSTATUS FwpsAllocateDeepCloneNetBufferList0(
[in, out] NET_BUFFER_LIST *originalNetBufferList,
[in, optional] NDIS_HANDLE netBufferListPoolHandle,
[in, optional] NDIS_HANDLE netBufferPoolHandle,
[out] NET_BUFFER_LIST **netBufferList
);
参数
[in, out] originalNetBufferList
指向要克隆的原始 NET_BUFFER_LIST 结构的指针。
[in, optional] netBufferListPoolHandle
从上一次调用 NdisAllocateNetBufferListPool 函数获取的NET_BUFFER_LIST池句柄。 此参数是可选的,可以为 NULL。
[in, optional] netBufferPoolHandle
NET_BUFFER_LIST池句柄,该句柄是从上一次调用 NdisAllocateNetBufferPool 函数获取的。 此参数是可选的,可以为 NULL。
[out] netBufferList
指向变量的指针,该变量接收指向深层克隆 NET_BUFFER_LIST 结构的指针。
返回值
FwpsAllocateDeepCloneNetBufferList0 函数返回以下 NTSTATUS 代码之一。
返回代码 | 说明 |
---|---|
STATUS_SUCCESS | 已成功分配深层克隆 NET_BUFFER_LIST 结构。 |
其他状态代码 | 出现了错误。 |
注解
标注驱动程序调用 FwpsAllocateDeepCloneNetBufferList0 函数,以分配现有 NET_BUFFER_LIST 结构的深层克隆 NET_BUFFER_LIST 结构。
此函数是 NdisAllocateCloneNetBufferList 函数的包装器,但它专用于 WFP 数据包注入函数。
如果深层克隆 NET_BUFFER_LIST 结构应具有与特定池关联的属性,则标注驱动程序必须在 NetBufferListPoolHandle 或 NetBufferPoolHandle 参数中指定池句柄。 如果这些参数为 NULL,则使用 NDIS 预分配的默认池。
深层克隆 NET_BUFFER_LIST 结构描述原始 NET_BUFFER_LIST 结构所描述的相同数据。 FwpsAllocateDeepCloneNetBufferList0 函数将原始 MDL 描述的数据复制到新的数据缓冲区。 克隆 NET_BUFFER_LIST 结构包括初始 NET_BUFFER_LIST_CONTEXT 结构。
此函数将新创建的克隆NET_BUFFER_LIST结构的 ParentNetBufferList 成员设置为指向父NET_BUFFER_LIST结构。 父结构的 ChildRefCount 成员按 1 递增。
标注驱动程序可以修改克隆NET_BUFFER_LIST结构,并通过调用数据包注入函数将其注入到网络堆栈中,以取代原始NET_BUFFER_LIST结构。 克隆NET_BUFFER_LIST结构描述的数据成功注入网络堆栈后,标注驱动程序通过调用 FwpsFreeCloneNetBufferList0 函数释放克隆NET_BUFFER_LIST结构。
标注驱动程序可以在深层克隆NET_BUFFER_LIST (NET_BUFFER) 或 MDL 中插入或替换单个网络缓冲区。 驱动程序必须在调用 FwpsFreeCloneNetBufferList0 函数之前撤消这些修改。
管理克隆数据包的准则
标注驱动程序不得无限期保存克隆的数据包。 克隆的数据包可能会干扰空闲计算机上的电源管理操作。
WFP 中深度克隆数据包的预期用途是从用户模式应用程序或其他需要独立于原始数据包的相对快速操作中获取说明。 标注驱动程序不得在等待用户输入、Web 服务清除或任何其他可能需要任意时间的操作时保存克隆的数据包。
标注驱动程序应始终尽快返回保留的数据包。
要求
要求 | 值 |
---|---|
最低受支持的客户端 | WIP 内部版本 25324 |
目标平台 | 通用 |
标头 | fwpsk.h (包括 Fwpsk.h) |
Library | Fwpkclnt.lib |
IRQL | <= DISPATCH_LEVEL |