NdisAllocateNetBufferAndNetBufferList 함수(ndis/nblapi.h)

NdisAllocateNetBufferAndNetBufferList 함수를 호출하여 사전 할당된 NET_BUFFER 구조체로 초기화된 NET_BUFFER_LIST 구조를 할당하고 초기화합니다.

구문

NDIS_EXPORTED_ROUTINE NET_BUFFER_LIST * NdisAllocateNetBufferAndNetBufferList(
  [in]           NDIS_HANDLE          PoolHandle,
  [in]           USHORT               ContextSize,
  [in]           USHORT               ContextBackFill,
  [in, optional] __drv_aliasesMem MDL *MdlChain,
  [in]           ULONG                DataOffset,
  [in]           SIZE_T               DataLength
);

매개 변수

[in] PoolHandle

이전에 에서 반환된 NET_BUFFER_LIST 구조체 풀 핸들 NdisAllocateNetBufferListPool 함수. 호출자가 NdisAllocateNetBufferListPool에 전달한 NET_BUFFER_LIST_POOL_PARAMETERS 구조체의 fAllocateNetBuffer 멤버를 TRUE로 설정하고 DataSize 멤버를 0으로 설정해야 합니다.

[in] ContextSize

호출자에 대해 예약할 NET_BUFFER_LIST_CONTEXT 구조에서 사용된 데이터 공간의 양입니다. ContextSize는 MEMORY_ALLOCATION_ALIGNMENT 정의한 값의 배수여야 합니다.

[in] ContextBackFill

호출자에게 필요한 사용되지 않는 데이터 공간 (백필 공간)의 양입니다. NDIS는 이 값을 ContextSize 에 추가하고 추가 공간을 할당합니다. ContextBackFill은 MEMORY_ALLOCATION_ALIGNMENT 정의한 값의 배수여야 합니다.

[in, optional] MdlChain

NDIS가 미리 할당된 NET_BUFFER 구조를 초기화하는 데 사용하는 MDL 체인에 대한 포인터입니다. MdlChainNULL일 수 있습니다.

[in] DataOffset

버퍼의 시작부터 MDL 체인에서 사용된 데이터 공간 의 시작까지의 초기 오프셋(바이트)입니다. 이 오프셋 앞의 데이터 공간은 사용되지 않는 데이터 공간입니다. 따라서 이 값은 MDL 체인에서 사용 가능한 백필 공간의 초기 크기도 나타냅니다. MdlChainNULL인 경우 DataOffset은 0이어야 합니다.

[in] DataLength

MDL 체인에서 사용된 데이터 공간 의 길이(바이트)입니다. MdlChainNULL인 경우 DataLength는 0이어야 합니다.

반환 값

NdisAllocateNetBufferAndNetBufferList 는 할당된 NET_BUFFER_LIST 구조체에 대한 포인터를 반환합니다. NET_BUFFER_LIST 구조에는 NET_BUFFER 구조체가 포함됩니다. 할당에 실패한 경우 이 포인터는 NULL입니다.

설명

NdisAllocateNetBufferAndNetBufferList 함수가 할당하는 구조체는 미리 할당된 NET_BUFFER 구조와 쌍을 이루는 NET_BUFFER_LIST 구조를 포함하는 풀에서 제공되어야 합니다. 이러한 풀을 만들려면 다음을 호출해야 합니다.NET_BUFFER_LIST_POOL_PARAMETERS 구조체fAllocateNetBuffer 멤버가 TRUE로 설정되고 DataSize 멤버가 0으로 설정된 NdisAllocateNetBufferListPool 함수입니다.

참고NET_BUFFERNET_BUFFER_LIST 구조체는 NDIS 버퍼 풀에서 할당되어야 합니다. 드라이버는 프라이빗 메모리 풀 또는 스택에서 NET_BUFFER_LIST 또는 NET_BUFFER 구조를 할당하고 초기화해서는 안됩니다.
 
NdisFreeNetBufferList 함수를 호출하여 NET_BUFFER_LIST 구조를 해제합니다.

미리 할당된 NET_BUFFER NET_BUFFER 소유할 때 다른 MDL 체인으로 다시 초기화하여 다시 사용할 수 있지만 NET_BUFFERDataOffset, DataLength, CurrentMdl 및 CurrentMdlOffset 필드는 새 MDL 체인과 일치해야 합니다.

예를 들어 원래 MDL 체인에 XDataLengthYDataOffset이 포함되어 있고 CurrentMdl이 원래 MDL 체인의 두 번째 MDL(M)로 시작하는 경우 CurrentMdlOffsetZ입니다. 그런 다음 NET_BUFFER_DATAMdlChain 필드는 X'DataLength 및 Y'DataOffset을 포함하는 새 MDL 체인을 가리킵니다. 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(ndis.h 포함)
라이브러리 Ndis.lib
IRQL <= DISPATCH_LEVEL
DDI 규정 준수 규칙 Irql_NetBuffer_Function(ndis), NdisAllocateNetBufferList(ndis), NdisAllocateNetBufferList_InitFail(ndis)

추가 정보

NET_BUFFER

NET_BUFFER_LIST

NET_BUFFER_LIST_CONTEXT

NET_BUFFER_LIST_POOL_PARAMETERS

NdisAllocateNetBufferListPool

NdisFreeNetBufferList