NET_BUFFER_LIST 구조체(ndis/nbl.h)

NET_BUFFER_LIST 구조체는 NET_BUFFER 구조체의 연결된 목록을 지정합니다.

구문

typedef struct _NET_BUFFER_LIST {
  union {
    struct {
      NET_BUFFER_LIST *Next;
      NET_BUFFER      *FirstNetBuffer;
    };
    SLIST_HEADER           Link;
    NET_BUFFER_LIST_HEADER NetBufferListHeader;
  };
  NET_BUFFER_LIST_CONTEXT *Context;
  NET_BUFFER_LIST         *ParentNetBufferList;
  NDIS_HANDLE             NdisPoolHandle;
  PVOID                   NdisReserved[2];
  PVOID                   ProtocolReserved[4];
  PVOID                   MiniportReserved[2];
  PVOID                   Scratch;
  NDIS_HANDLE             SourceHandle;
  ULONG                   NblFlags;
  LONG                    ChildRefCount;
  ULONG                   Flags;
  union {
    NDIS_STATUS Status;
    ULONG       NdisReserved2;
  };
  PVOID                   NetBufferListInfo[MaxNetBufferListInfo];
} NET_BUFFER_LIST, *PNET_BUFFER_LIST;

멤버

Next

체인의 다음 NET_BUFFER_LIST 구조체입니다.

드라이버는 이 멤버에 직접 액세스해서는 안 됩니다. 대신 NET_BUFFER_LIST_NEXT_NBL 매크로를 호출해야 합니다.

FirstNetBuffer

NET_BUFFER_LIST 첫 번째 NET_BUFFER.

드라이버는 이 멤버에 직접 액세스해서는 안 됩니다. 대신 NET_BUFFER_LIST_FIRST_NB 매크로를 호출해야 합니다.

Link

NDIS용으로 예약되었습니다.

NetBufferListHeader

NET_BUFFER_LIST_HEADER 구조체입니다.

Context

NET_BUFFER_LIST_CONTEXT 구조체에 대한 포인터입니다. 프로토콜 및 미니포트 드라이버는 이 구조를 사용하여 NET_BUFFER_LIST 구조에 대한 정보를 저장합니다. NET_BUFFER_LIST_CONTEXT 구조에 저장된 정보는 스택의 NDIS 및 기타 드라이버에 불투명합니다.

다음 함수 및 매크로를 사용하여 NET_BUFFER_LIST_CONTEXT 구조의 데이터에 액세스합니다.

NdisAllocateNetBufferListContext NdisFreeNetBufferListContext NET_BUFFER_LIST_CONTEXT_DATA_START NET_BUFFER_LIST_CONTEXT_DATA_SIZE

ParentNetBufferList

이 NET_BUFFER_LIST 구조체가 다른 NET_BUFFER_LIST 구조체의 복제본인 경우 이 멤버는 부모 NET_BUFFER_LIST 구조체에 대한 포인터를 지정합니다. 그렇지 않으면 이 매개 변수는 NULL입니다. 드라이버는 다음을 사용합니다. 복제를 만드는 NdisAllocateCloneNetBufferList 함수입니다.

NdisPoolHandle

NET_BUFFER_LIST 구조가 할당된 NET_BUFFER_LIST 풀을 식별하는 풀 핸들입니다.

NdisReserved[2]

NDIS에서 사용하도록 예약되었습니다.

ProtocolReserved[4]

프로토콜 드라이버에서 사용하도록 예약되어 있습니다.

MiniportReserved[2]

미니포트 드라이버에서 사용하도록 예약되어 있습니다.

Scratch

NET_BUFFER_LIST 구조체의 현재 소유자가 정의한 데이터입니다. 현재 소유자(NDIS 또는 NDIS 드라이버)는 이 멤버를 자신의 용도로 사용할 수 있습니다. NET_BUFFER_LIST 구조체가 처음 할당되면 이 멤버는 NULL입니다. 현재 소유자가 소유권을 포기하면 NDIS 또는 다른 드라이버가 이 멤버를 덮어쓸 수 있습니다.

SourceHandle

다음 드라이버 제공 루틴 중 하나를 사용하여 바인딩 또는 연결 작업에서 NDIS가 드라이버에 제공한 핸들입니다.

미니포트 드라이버

MiniportInitializeEx

프로토콜 드라이버

ProtocolBindAdapterEx

필터 드라이버

FilterAttach

NDIS는 SourceHandle 을 사용하여 NET_BUFFER_LIST 구조를 보낸 드라이버에 NET_BUFFER_LIST 구조를 반환합니다.

NblFlags

이 멤버에는 비트 OR 작업과 결합할 수 있는 플래그가 포함되어 있습니다.

NdisTestNblFlag, NdisTestNblFlags, NdisSetNblFlagNdisClearNblFlag 매크로를 사용하여 플래그에 액세스합니다.

중간 드라이버 및 필터 드라이버는 NET_BUFFER_LIST 연결된 데이터를 수정하지 않으면 다음 플래그를 설정할 수 있습니다. 예를 들어 데이터가 변경되지 않은 경우 NDIS는 NET_BUFFER_LIST 만든 원래 정보를 다시 사용할 수 있습니다.

NDIS_NBL_FLAGS_SEND_READ_ONLY

설정된 경우 NET_BUFFER_LIST 구조와 해당 데이터는 보내기 작업에 읽기 전용입니다.

NDIS_NBL_FLAGS_RECV_READ_ONLY

설정된 경우 NET_BUFFER_LIST 구조와 해당 데이터는 수신 작업에 대해 읽기 전용입니다.

드라이버는 연결된 이더넷 프레임을 분할하지 않더라도 다음 플래그를 설정할 수 있습니다.

NDIS_NBL_FLAGS_IS_IPV4

이 NET_BUFFER_LIST 구조의 모든 이더넷 프레임은 IPv4 프레임입니다. 이 플래그가 설정되면 헤더 데이터 분할 공급자가 NDIS_NBL_FLAGS_IS_IPV6 플래그를 설정해서는 안됩니다.

NDIS_NBL_FLAGS_IS_IPV6

이 NET_BUFFER_LIST 구조의 모든 이더넷 프레임은 IPv6 프레임입니다. 이 플래그가 설정되면 헤더 데이터 분할 공급자가 NDIS_NBL_FLAGS_IS_IPV4 플래그를 설정해서는 안됩니다.

NDIS_NBL_FLAGS_IS_TCP

이 NET_BUFFER_LIST 구조체의 모든 이더넷 프레임은 TCP 프레임입니다. 이 플래그가 설정된 경우 헤더 데이터 분할 공급자는 NDIS_NBL_FLAGS_IS_UDP 플래그를 설정하지 않아야 하며 공급자는 NDIS_NBL_FLAGS_IS_IPV4 플래그 또는 NDIS_NBL_FLAGS_IS_IPV6 플래그를 설정해야 합니다.

NDIS_NBL_FLAGS_IS_UDP

이 NET_BUFFER_LIST 구조체의 모든 이더넷 프레임은 UDP 프레임입니다. 이 플래그가 설정된 경우 헤더 데이터 분할 공급자는 NDIS_NBL_FLAGS_IS_TCP 플래그를 설정하지 않아야 하며 공급자는 NDIS_NBL_FLAGS_IS_IPV4 플래그 또는 NDIS_NBL_FLAGS_IS_IPV6 플래그를 설정해야 합니다.

NDIS_NBL_FLAGS_IS_LOOPBACK_PACKET

이 NET_BUFFER_LIST 구조와 연결된 모든 패킷은 루프백 패킷입니다.

헤더 데이터 분할 공급자가 연결된 이더넷 프레임을 분할하지 않으면 미니포트 드라이버는 다음 플래그가 지워진 NET_BUFFER_LIST 구조를 나타내야 합니다.

NDIS_NBL_FLAGS_HD_SPLIT

헤더와 데이터는 이 NET_BUFFER_LIST 구조와 연결된 모든 이더넷 프레임으로 분할됩니다.

NDIS_NBL_FLAGS_SPLIT_AT_UPPER_LAYER_PROTOCOL_HEADER

이 NET_BUFFER_LIST 모든 이더넷 프레임은 상층 프로토콜 헤더의 시작 부분에서 분할됩니다. 이 플래그가 설정된 경우 헤더 데이터 분할 공급자는 NDIS_NBL_FLAGS_IS_IPV4 플래그 또는 NDIS_NBL_FLAGS_IS_IPV6 플래그를 설정해야 합니다. 또한 공급자는 NDIS_NBL_FLAGS_IS_TCP 플래그 또는 NDIS_NBL_FLAGS_IS_UDP 플래그를 설정할 수 있지만 공급자는 NDIS_NBL_FLAGS_SPLIT_AT_UPPER_LAYER_PROTOCOL_PAYLOAD 플래그를 설정해서는 안됩니다.

NDIS_NBL_FLAGS_SPLIT_AT_UPPER_LAYER_PROTOCOL_PAYLOAD

이 NET_BUFFER_LIST 구조체의 모든 이더넷 프레임은 TCP 또는 UDP 페이로드의 시작 부분에서 분할됩니다. 이 플래그가 설정된 경우 헤더 데이터 분할 공급자는 NDIS_NBL_FLAGS_IS_IPV4 플래그 또는 NDIS_NBL_FLAGS_IS_IPV6 플래그를 설정해야 합니다. 또한 공급자는 NDIS_NBL_FLAGS_IS_TCP 플래그 또는 NDIS_NBL_FLAGS_IS_UDP 플래그를 설정해야 하지만 공급자는 NDIS_NBL_FLAGS_SPLIT_AT_UPPER_LAYER_PROTOCOL_HEADER 플래그를 설정해서는 안됩니다.

ChildRefCount

이 NET_BUFFER_LIST 구조에 클론(부모)이 있는 경우 이 멤버는 미해결 클론 수를 지정합니다. 그렇지 않으면 이 멤버는 0입니다.

Flags

NET_BUFFER_LIST 구조체의 특성입니다. 다음 정의는 플래그 집합에 대한 비트 마스크를 지정합니다.

NBL_FLAGS_PROTOCOL_RESERVED

이 집합은 프로토콜 드라이버용으로 예약되어 있습니다.

참고 NDIS 6.30부터 프로토콜 사용에 두 개의 추가 비트인 0x00000003 사용할 수 있습니다. NDIS 6.30 프로토콜은 NdisGetVersionNDIS_RUNTIME_VERSION_630 보다 크거나 같은 값을 반환하는 경우에만 이러한 비트를 사용할 수 있습니다. 6.30 이전 버전에서는 NDIS가 내부적으로 사용하므로 프로토콜은 이전 버전의 NDIS에서 이러한 비트를 사용하면 안 됩니다.
 

NBL_FLAGS_MINIPORT_RESERVED

이 집합은 미니포트 드라이버를 위해 예약되어 있습니다.

NBL_FLAGS_SCRATCH

NET_BUFFER_LIST 구조체의 현재 소유자(NDIS 또는 NDIS 드라이버)는 이 집합을 사용할 수 있습니다. 현재 소유자가 소유권을 포기하면 NDIS 또는 다른 드라이버가 이러한 플래그를 덮어쓸 수 있습니다.

NBL_FLAGS_NDIS_RESERVED

이 집합은 NDIS용으로 예약되어 있습니다.

Status

이 NET_BUFFER_LIST 구조에 대한 네트워크 데이터 작업의 최종 완료 상태. 미니포트 드라이버는 를 호출하기 전에 이 값을 씁니다. NdisMSendNetBufferListsComplete 함수. 미니포트 드라이버는 다음 값 중 하나를 지정합니다.

NDIS_STATUS_SUCCESS

이 NET_BUFFER_LIST 구조와 연결된 NET_BUFFER 구조에서 설명하는 모든 네트워크 데이터가 네트워크를 통해 성공적으로 전송되었습니다.

NDIS_STATUS_INVALID_LENGTH

이 NET_BUFFER_LIST 구조와 연결된 일부 NET_BUFFER 구조의 데이터 크기가 기본 NIC에 비해 너무 큽니다.

NDIS_STATUS_RESOURCES

리소스가 부족하여 이 NET_BUFFER_LIST 구조에 대한 보내기 요청이 실패했습니다.

NDIS_STATUS_FAILURE

이 NET_BUFFER_LIST 구조체에 대한 이 보내기 요청은 이전 세 값에 설명된 것과 다른 이유로 인해 실패했습니다.

NDIS_STATUS_SEND_ABORTED

NDIS는 MiniportCancelSend 함수를 호출하여 이 NET_BUFFER_LIST 구조체에 대한 보내기 작업을 취소합니다.

NDIS_STATUS_RESET_IN_PROGRESS

미니포트 드라이버는 다시 설정으로 인해 보내기 요청을 중단했습니다.

NDIS_STATUS_PAUSED

드라이버가 일시 중지되어 보내기 요청을 거부해야 하는 경우 영향을 받는 각 NET_BUFFER_LIST 전체 상태 NDIS_STATUS_PAUSED 설정합니다.

NdisReserved2

NDIS용으로 예약되었습니다.

NetBufferListInfo[MaxNetBufferListInfo]

목록의 모든 NET_BUFFER 구조에 공통적인 정보를 포함하는 값의 배열입니다. 이 정보를 "대역 외(OOB) 데이터"라고도 합니다.

화면 오른쪽에 있는 NET_BUFFER_LIST_INFO 매크로를 사용하여 열거형 값을 NDIS_NET_BUFFER_LIST_INFONetBufferListInfo 배열의 값을 설정하고 가져옵니다.

설명

NDIS 드라이버는 다음 함수를 호출하여 NET_BUFFER_LIST 구조를 할당하고 초기화할 수 있습니다.

NdisAllocateNetBufferList

NdisAllocateNetBufferAndNetBufferList NdisAllocateCloneNetBufferList NdisAllocateFragmentNetBufferList NdisAllocateReassembledNetBufferList

NET_BUFFER_LIST 구조와 연결된 모든 NET_BUFFER 구조체에는 NetBufferListInfoContext 멤버에 의해 지정된 특성이 있습니다.

드라이버가 NdisSendNetBufferLists 또는 NdisFSendNetBufferLists 함수를 호출하면 다음의 소유권이 손실됩니다.

  • 지정된 NET_BUFFER_LIST 구조체입니다.
  • 연결된 NET_BUFFER 구조체 및 MDL입니다.
  • 연결된 모든 NDIS_REQUEST_CONTROLs.
  • NET_BUFFER_LIST 구조와 연결된 모든 NetBufferListInfo 데이터입니다.
NET_BUFFER_LIST 구조 목록의 현재 소유자는 NET_BUFFER_LIST 구조를 다른 목록으로 이동할 수 있습니다. 그러나 NET_BUFFER_LIST 구조와 연결된 모든 NET_BUFFER 구조체는 동일한 NET_BUFFER_LIST 구조체로 유지되어야 합니다. NET_BUFFER 구조를 만든 드라이버만 다른 NET_BUFFER_LIST 구조체로 이동할 수 있습니다. 현재 소유자는 NET_BUFFER 구조체의 Next 멤버를 수정할 수 없습니다.

NET_BUFFER_LIST 구조 목록은 단순하게 연결되고 NULL로 종료된 목록입니다. NET_BUFFER_LIST 구조를 다른 목록으로 이동하려면 원본 및 대상 목록 모두에서 Next 멤버를 적절하게 업데이트합니다.

NET_BUFFER_LIST 구조체의 멤버에 액세스하려면 다음 매크로 및 함수를 사용합니다.

NET_BUFFER_LIST_NEXT_NBL

NET_BUFFER_LIST_FIRST_NB

NET_BUFFER_LIST_FLAGS

NET_BUFFER_LIST_MINIPORT_RESERVED NET_BUFFER_LIST_CONTEXT_DATA_START NET_BUFFER_LIST_CONTEXT_DATA_SIZE

NET_BUFFER_LIST_INFO

NET_BUFFER_LIST_STATUS

NET_BUFFER_LIST_PROTOCOL_RESERVED NdisGetPoolFromNetBufferList

순 버퍼를 사용하는 방법에 대한 자세한 내용은 NET_BUFFER 아키텍처를 참조하세요.

요구 사항

요구 사항
지원되는 최소 클라이언트 NDIS 6.0 이상에서 지원됩니다.
머리글 ndis/nbl.h(ndis.h 포함)

추가 정보

NDIS_NET_BUFFER_LIST_INFO

NET_BUFFER

NET_BUFFER_LIST_CONTEXT

NET_BUFFER_LIST_CONTEXT_DATA_SIZE NET_BUFFER_LIST_CONTEXT_DATA_START

NET_BUFFER_LIST_FIRST_NB

NET_BUFFER_LIST_FLAGS

NET_BUFFER_LIST_HEADER

NET_BUFFER_LIST_INFO

NET_BUFFER_LIST_MINIPORT_RESERVED

NET_BUFFER_LIST_NEXT_NBL

NET_BUFFER_LIST_PROTOCOL_RESERVED

NET_BUFFER_LIST_STATUS

NdisAllocateCloneNetBufferList NdisAllocateFragmentNetBufferList NdisAllocateNetBufferAndNetBufferList

NdisAllocateNetBufferList

NdisAllocateNetBufferListContext NdisAllocateReassembledNetBufferList

NdisCancelSendNetBufferLists

NdisClearNblFlag

NdisFreeNetBufferListContext

NdisGeneratePartialCancelId

NdisGetPoolFromNetBufferList

NdisSendNetBufferLists

NdisSetNblFlag

NdisTestNblFlag

NdisTestNblFlags