재조립된 NET_BUFFER_LIST 구조체
NDIS 드라이버는 기존 NET_BUFFER_LIST 구조체에서 재조립된 NET_BUFFER_LIST 구조를 만들 수 있습니다. 다시 조립된 구조체는 여러 원본 NET_BUFFER 구조체의 원래 데이터를 참조합니다. 드라이버는 이러한 유형의 구조를 사용하여 많은 작은 버퍼를 단일 대형 버퍼로 효율적으로 결합할 수 있습니다.
다음 그림에서는 부모 NET_BUFFER_LIST 구조체와 다시 조립된 자식 구조체 간의 관계를 보여 줍니다.
앞의 그림에는 부모 NET_BUFFER_LIST 구조체와 해당 부모에서 파생된 자식 구조체가 포함되어 있습니다. 부모 구조에는 MDL 이 연결된 1개의 NET_BUFFER_LIST_CONTEXT 구조와 3개의 NET_BUFFER 구조가 있습니다. 부모 구조체의 부모 포인터는 파생 구조체가 아님을 나타내는 NULL 입니다.
자식 NET_BUFFER_LIST 구조체에는 MDL이 연결된 하나의 NET_BUFFER 구조가 있습니다. 자식 NET_BUFFER_LIST 구조체에는 부모 구조체에 대한 포인터가 있습니다. NET_BUFFER_LIST_CONTEXT 구조체 포인터가 있는 NULL 은 자식에 NET_BUFFER_LIST_CONTEXT 구조체가 없음을 나타냅니다.
NDIS 드라이버는 NdisAllocateReassembledNetBufferList 함수를 호출하여 조각화된 NET_BUFFER_LIST 구조를 다시 조립합니다. NDIS는 재조립된 NET_BUFFER_LIST 구조체를 사용하여 새 NET_BUFFER 구조체 및 MDL을 할당합니다. NDIS는 재조립된 구조체에 대한 NET_BUFFER_LIST_CONTEXT 구조를 할당하지 않습니다. 재조립된 NET_BUFFER 구조체 및 MDL은 부모 구조와 동일한 데이터를 설명합니다. 데이터가 복사되지 않습니다.
다시 어셈블된 NET_BUFFER_LIST 구조를 만들기 위해 NdisAllocateReassembledNetBufferList 는 각 부모 NET_BUFFER 구조체의 StartOffset 매개 변수에 지정된 바이트 수를 건너뜁니다. NdisAllocateReassembledNetBufferList 는 각 부모 NET_BUFFER 구조체의 나머지 데이터를 다시 어셈블리된 NET_BUFFER 구조체의 MDL 체인에 연결합니다. NdisAllocateReassembledNetBufferList 는 DataOffsetDelta 에 지정된 양만큼 재어셈블된 NET_BUFFER 구조체를 후퇴(사용된 데이터 공간을 증가)합니다.
NDIS 드라이버는 NdisFreeReassembledNetBufferList 함수를 호출하여 재조립된 NET_BUFFER_LIST 구조체와 연결된 NET_BUFFER 구조체 및 MDL 체인을 해제합니다.