NdisAllocateNetBuffer function

Call the NdisAllocateNetBuffer function to allocate and initialize a NET_BUFFER structure from a NET_BUFFER structure pool.

Syntax


PNET_BUFFER NdisAllocateNetBuffer(
  _In_      NDIS_HANDLE PoolHandle,
  _In_opt_  PMDL MdlChain,
  _In_      ULONG DataOffset,
  _In_      SIZE_T DataLength
);

Parameters

PoolHandle [in]

A NET_BUFFER structure pool handle that was previously returned from a call to NdisAllocateNetBufferPool.

MdlChain [in, optional]

A pointer to an MDL chain that NDIS uses to initialize the new NET_BUFFER structure. MdlChain can be NULL.

DataOffset [in]

The initial offset, in bytes, from the start of the buffer to the start of the used data space in the MDL chain. Data space ahead of this offset is unused data space. Therefore, this value also represents the initial amount of available backfill space in the MDL chain. If MdlChain is NULL, DataOffset must be 0.

DataLength [in]

The length of the used data space, in bytes, in the MDL chain. If MdlChain is NULL, DataLength must be 0.

Return value

NdisAllocateNetBuffer returns a pointer to the NET_BUFFER structure that NDIS allocated. If the allocation was unsuccessful, this pointer is NULL.

Remarks

Call NdisFreeNetBuffer to free a NET_BUFFER structure that was allocated from a NET_BUFFER structure pool.

Note  NET_BUFFER and NET_BUFFER_LIST structures must be allocated from an NDIS buffer pool. A driver must not allocate and initialize a NET_BUFFER or NET_BUFFER_LIST structure from its private memory pool or the stack.

The preallocated NET_BUFFER can be reused by reinitializing it with another MDL chain when it owns NET_BUFFER, but the DataOffset, DataLength, CurrentMdl, and CurrentMdlOffset fields in NET_BUFFER must be consistent with the new MDL chain.

For example, if the original MDL chain contains X DataLength and Y DataOffset, and CurrentMdl starts with the second MDL (M) in the original MDL chain, CurrentMdlOffset is Z. The MdlChain field in NET_BUFFER_DATA then needs to point to a new MDL chain that contains X' DataLength and Y' DataOffset. If CurrentMdl starts with the third MDL (M') in the new MDL chain, CurrentMdlOffset is Z', and the following macros need to be used to set fields in 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';

Requirements

Version

Supported in NDIS 6.0 and later.

Header

Ndis.h (include Ndis.h)

IRQL

<= DISPATCH_LEVEL

DDI compliance rules

Irql_NetBuffer_Function, NdisAllocateNetBuffer

See also

NET_BUFFER
NET_BUFFER_LIST
NdisAllocateNetBufferPool
NdisFreeNetBuffer

 

 

Send comments about this topic to Microsoft

Show:
© 2015 Microsoft