NdisAllocateNetBuffer 函数 (ndis/nblapi.h)

调用 NdisAllocateNetBuffer 函数,从 NET_BUFFER 结构池中分配和初始化 NET_BUFFER 结构。

语法

NDIS_EXPORTED_ROUTINE NET_BUFFER * NdisAllocateNetBuffer(
  [in]           NDIS_HANDLE PoolHandle,
  [in, optional] MDL         *MdlChain,
  [in]           ULONG       DataOffset,
  [in]           SIZE_T      DataLength
);

参数

[in] PoolHandle

以前从调用返回的 NET_BUFFER 结构池句柄 NdisAllocateNetBufferPool

[in, optional] MdlChain

指向 NDIS 用来初始化新 NET_BUFFER 结构的 MDL 链的指针。 MdlChain 可以 NULL

[in] DataOffset

从缓冲区的开头到 在 MDL 链中 使用的数据空间的开头的初始偏移量(以字节为单位)。 此偏移量之前的数据空间 未使用的数据空间。 因此,此值还表示 MDL 链中可用回填空间的初始量。 如果 MdlChainNULL,则 DataOffset 必须为 0。

[in] DataLength

在 MDL 链中使用的数据空间的长度(以字节为单位)。 如果 MdlChain为 NULL,则 DataLength 必须为 0。

返回值

NdisAllocateNetBuffer 返回指向 NDIS 分配的 NET_BUFFER 结构的指针。 如果分配失败,则此指针 NULL

言论

调用 NdisFreeNetBuffer 以释放从 NET_BUFFER 结构池分配的 NET_BUFFER 结构。

注意,必须从 NDIS 缓冲池分配NET_BUFFERNET_BUFFER_LIST 结构。 驱动程序不得从其专用内存池或堆栈分配和初始化 NET_BUFFERNET_BUFFER_LIST 结构。
 
预分配 NET_BUFFER 可以通过在拥有 NET_BUFFER时使用另一个 MDL 链重新初始化它来重复使用,但 DataOffsetDataLengthCurrentMdl,以及 NET_BUFFER 中的 CurrentMdlOffset 字段必须与新的 MDL 链保持一致。

例如,如果原始 MDL 链包含 XDataLengthYDataOffset,并且 CurrentMdl 以原始 MDL 链中的第二个 MDL(M)开头,则 CurrentMdlOffsetZ。然后,NET_BUFFER_DATA 中的 MdlChain 字段需要指向一个新的 MDL 链,其中包含 X 的DataLengthY'DataOffset。 如果 CurrentMdl 从新 MDL 链中的第三个 MDL(M')开始,CurrentMdlOffsetZ',并且以下宏需要用于设置 NET_BUFFER中的字段:

NET_BUFFER_FIRST_MDL(_NB) = New MDL chain;
NET_BUFFER_DATA_LENGTH(_NB) = X';
NET_BUFFER_DATA_OFFSET(_NB) = Y';
NET_BUFFER_CURRENT_MDL(_NB) = M';
NET_BUFFER_CURRENT_MDL_OFFSET(_NB) = Z';

要求

要求 价值
最低支持的客户端 NDIS 6.0 及更高版本中受支持。
目标平台 普遍
标头 ndis/nblapi.h (include ndis.h)
Ndis.lib
IRQL <= DISPATCH_LEVEL
DDI 符合性规则 Irql_NetBuffer_Function(ndis)NdisAllocateNetBuffer(ndis)

另请参阅

NET_BUFFER

NET_BUFFER_LIST

NdisAllocateNetBufferPool

NdisFreeNetBuffer