다음을 통해 공유


조각화된 NET_BUFFER_LIST 구조체

NDIS 드라이버는 기존 NET_BUFFER_LIST 구조체에서 조각화된 NET_BUFFER_LIST 구조를 만들 수 있습니다. 조각화된 구조체는 원래 데이터를 참조하는 NET_BUFFER 구조체 집합을 참조합니다. 그러나 데이터는 최대 크기를 초과하지 않는 단위로 나뉩니다. 드라이버는 이러한 유형의 구조를 사용하여 큰 버퍼를 더 작은 버퍼로 효율적으로 분할할 수 있습니다.

다음 그림에서는 부모 NET_BUFFER_LIST 구조체와 조각난 자식 간의 관계를 보여 줍니다.

부모 NET_BUFFER_LIST 구조체와 조각화된 자식 구조 간의 관계를 보여 주는 다이어그램

위의 그림에는 부모 NET_BUFFER_LIST 구조체와 해당 부모에서 파생된 자식 구조체가 포함되어 있습니다. 부모 구조에는 하나의 NET_BUFFER_LIST_CONTEXT 구조체와 MDL이 연결된 NET_BUFFER 구조가 있습니다. 부모 구조체의 부모 포인터는 파생 구조체가 아님을 나타내는 NULL 입니다.

자식 NET_BUFFER_LIST 구조체에는 MDL이 연결된 3개의 NET_BUFFER 구조체가 있습니다. 자식 NET_BUFFER_LIST 구조체에는 부모 구조체에 대한 포인터가 있습니다. NET_BUFFER_LIST_CONTEXT 구조체 포인터가 될 NULL 은 자식에 NET_BUFFER_LIST_CONTEXT 구조체가 없음을 나타냅니다.

NDIS 드라이버는 NdisAllocateFragmentNetBufferList 함수를 호출하여 기존 NET_BUFFER_LIST 구조체의 데이터를 기반으로 하는 새 조각화된 NET_BUFFER_LIST 구조를 만듭니다. NDIS는 조각화된 NET_BUFFER_LIST 구조체에 대한 새 NET_BUFFER 구조체 및 MDL을 할당합니다. NDIS는 조각화된 구조체에 대한 NET_BUFFER_LIST_CONTEXT 구조를 할당하지 않습니다. 조각 NET_BUFFER 구조체 및 MDL은 부모 구조와 동일한 데이터를 설명합니다. 데이터가 복사되지 않습니다.

NdisAllocateFragmentNetBufferList 는 각 부모 NET_BUFFER 구조에서 사용된 데이터 공간 의 시작부터 시작하여 StartOffset 매개 변수에 지정된 값으로 오프셋된 조각을 만듭니다.

NdisAllocateFragmentNetBufferList 는 각 원본 NET_BUFFER 구조에서 사용된 데이터 공간을 조각으로 나눕니다. 각 조각의 사용된 데이터 공간 길이가 MaximumLength 매개 변수에 지정된 값보다 작거나 같습니다. 마지막 조각의 사용된 데이터 공간MaximumLength 보다 작을 수 있습니다. 새 NET_BUFFER 구조체의 데이터 오프셋은 DataOffsetDelta 매개 변수에 지정된 바이트 수만큼 후퇴합니다.

부모 NET_BUFFER_LIST 구조체에 여러 NET_BUFFER 구조체가 있는 경우(그림에 표시되지 않음) 각 NET_BUFFER 구조체에 대한 조각화 프로세스는 단일 구조체와 동일합니다. 예를 들어 부모 NET_BUFFER 구조의 마지막 데이터가 최대 크기보다 작은 경우 NDIS는 다음 NET_BUFFER 구조의 시작 부분에 있는 데이터와 이러한 데이터를 결합하지 않습니다.

NDIS 드라이버는 NdisFreeFragmentNetBufferList 함수를 호출하여 NET_BUFFER_LIST 구조체와 NdisAllocateFragmentNetBufferList를 호출하여 이전에 할당된 모든 연결된 NET_BUFFER 구조체 및 MDL 체인을 해제합니다.

파생 NET_BUFFER_LIST 구조체