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_SIZEParentNetBufferList
이 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가 드라이버에 제공한 핸들입니다.
미니포트 드라이버
프로토콜 드라이버
필터 드라이버
NDIS는 SourceHandle 을 사용하여 NET_BUFFER_LIST 구조를 보낸 드라이버에 NET_BUFFER_LIST 구조를 반환합니다.
NblFlags
이 멤버에는 비트 OR 작업과 결합할 수 있는 플래그가 포함되어 있습니다.
NdisTestNblFlag, NdisTestNblFlags, NdisSetNblFlag 및 NdisClearNblFlag 매크로를 사용하여 플래그에 액세스합니다.
중간 드라이버 및 필터 드라이버는 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
이 집합은 프로토콜 드라이버용으로 예약되어 있습니다.
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 구조를 할당하고 초기화할 수 있습니다.
NdisAllocateNetBufferAndNetBufferList NdisAllocateCloneNetBufferList NdisAllocateFragmentNetBufferList NdisAllocateReassembledNetBufferListNET_BUFFER_LIST 구조와 연결된 모든 NET_BUFFER 구조체에는 NetBufferListInfo 및 Context 멤버에 의해 지정된 특성이 있습니다.
드라이버가 NdisSendNetBufferLists 또는 NdisFSendNetBufferLists 함수를 호출하면 다음의 소유권이 손실됩니다.
- 지정된 NET_BUFFER_LIST 구조체입니다.
- 연결된 NET_BUFFER 구조체 및 MDL입니다.
- 연결된 모든 NDIS_REQUEST_CONTROLs.
- NET_BUFFER_LIST 구조와 연결된 모든 NetBufferListInfo 데이터입니다.
NET_BUFFER_LIST 구조 목록은 단순하게 연결되고 NULL로 종료된 목록입니다. NET_BUFFER_LIST 구조를 다른 목록으로 이동하려면 원본 및 대상 목록 모두에서 Next 멤버를 적절하게 업데이트합니다.
NET_BUFFER_LIST 구조체의 멤버에 액세스하려면 다음 매크로 및 함수를 사용합니다.
NET_BUFFER_LIST_MINIPORT_RESERVED NET_BUFFER_LIST_CONTEXT_DATA_START NET_BUFFER_LIST_CONTEXT_DATA_SIZE NET_BUFFER_LIST_PROTOCOL_RESERVED NdisGetPoolFromNetBufferList순 버퍼를 사용하는 방법에 대한 자세한 내용은 NET_BUFFER 아키텍처를 참조하세요.
요구 사항
요구 사항 | 값 |
---|---|
지원되는 최소 클라이언트 | NDIS 6.0 이상에서 지원됩니다. |
머리글 | ndis/nbl.h(ndis.h 포함) |