CoNDIS 드라이버에서 NET_BUFFER 구조 수신

다음 그림에서는 프로토콜 드라이버, NDIS 및 미니포트 드라이버를 포함하는 기본 CoNDIS 수신 작업을 보여 줍니다.

diagram illustrating a basic condis receive operation, which involves a protocol driver, ndis, and a miniport driver.

앞의 그림에서 알 수 있듯이 미니포트 드라이버는 NdisMCoIndicateReceiveNetBufferLists 함수를 호출하여 지나치게 많은 드라이버에 대한 NET_BUFFER 구조를 나타냅니다. 대부분의 미니포트 드라이버에서 각 NET_BUFFER 구조체는 별도의 NET_BUFFER_LIST 구조에 연결되므로 프로토콜 드라이버는 원래 NET_BUFFER_LIST 구조 목록의 하위 집합을 만들어 다른 클라이언트에 전달할 수 있습니다. 그러나 NET_BUFFER_LIST 연결된 NET_BUFFER 구조의 수는 드라이버에 따라 달라집니다.

미니포트 드라이버가 모든 NET_BUFFER_LIST 구조를 연결한 후 미니포트 드라이버는 목록의 첫 번째 NET_BUFFER_LIST 구조에 대한 포인터를 NdisMCoIndicateReceiveNetBufferLists 함수에 전달합니다. NDIS는 NET_BUFFER_LIST 구조를 검사하고 지정된 VC(가상 연결)와 연결된 프로토콜 드라이버의 ProtocolCoReceiveNetBufferLists 함수를 호출합니다. NDIS는 각 프로토콜 드라이버에 올바른 바인딩과 연결된 NET_BUFFER_LIST 구조만 포함하는 목록의 하위 집합을 전달합니다.

프로토콜 드라이버의 ProtocolCoReceiveNetBufferLists 함수에 대한 CoReceiveFlags 매개 변수에 NDIS_RECEIVE_FLAGS_STATUS_RESOURCES 플래그가 설정된 경우 NDIS는 ProtocolCoReceiveNetBufferLists가 반환된 직후 NET_BUFFER_LIST 구조체의 소유권을 되찾습니다.

프로토콜 드라이버의 ProtocolCoReceiveNetBufferLists 함수에 대한 CoReceiveFlags 매개 변수에 NDIS_RECEIVE_FLAGS_STATUS_RESOURCES 플래그가 설정되지 않은 경우 프로토콜 드라이버는 NET_BUFFER_LIST 구조체의 소유권을 유지할 수 있습니다. 이 경우 프로토콜 드라이버는 NdisReturnNetBufferLists 함수를 호출하여 NET_BUFFER_LIST 구조를 반환해야 합니다.

미니포트 드라이버가 수신 리소스에서 낮게 실행되는 경우 NdisMCoIndicateReceiveNetBufferLists 함수에 대한 CoReceiveFlags 매개 변수에서 NDIS_RECEIVE_FLAGS_STATUS_RESOURCES 플래그를 설정할 수 있습니다. 이 경우 드라이버는 NdisMCoIndicateReceiveNetBufferLists가 반환되는 즉시 표시된 모든 NET_BUFFER_LIST 구조체 및 포함된 NET_BUFFER 구조체의 소유권을 회수할 수 있습니다. 미니포트 드라이버가 NDIS_RECEIVE_FLAGS_RESOURCES 플래그가 설정된 NET_BUFFER 구조를 나타내는 경우 프로토콜 드라이버는 데이터를 복사해야 하므로 이러한 방식으로 NDIS_RECEIVE_FLAGS_RESOURCES 사용하지 않아야 합니다. 미니포트 드라이버는 수신 리소스가 부족한 경우를 감지해야 하며 이러한 상황을 방지하는 데 필요한 단계를 완료해야 합니다.

NDIS는 프로토콜 드라이버가 NdisReturnNetBufferLists 를 호출한 후 미니포트 드라이버의 MiniportReturnNetBufferLists 함수를 호출합니다.

참고 미니포트 드라이버가 지정된 상태의 NET_BUFFER_LIST 구조를 나타내는 경우 NDIS는 NET_BUFFER_LIST 구조를 동일한 상태의 오버리싱 드라이버에 나타낼 필요가 없습니다. 예를 들어 NDIS는 NDIS_RECEIVE_FLAGS_RESOURCES 플래그가 설정된 NET_BUFFER_LIST 구조를 복사하고 이 플래그가 지워진 오버리딩 드라이버에 복사본을 나타낼 수 있습니다.

NDIS는 임의 순서와 조합으로 미니포트 드라이버에 NET_BUFFER_LIST 구조를 반환할 수 있습니다. 즉, MiniportReturnNetBufferLists 를 호출하여 NDIS가 미니포트 드라이버로 반환하는 NET_BUFFER_LIST 구조체의 연결된 목록에는 NdisMCoIndicateReceiveNetBufferLists에 대한 다른 이전 호출의 NET_BUFFER_LIST 구조가 있을 수 있습니다.

미니포트 드라이버는 NET_BUFFER_LIST 구조체의 SourceHandle 멤버를 NdisMCoIndicateReceiveNetBufferListsNdisVcHandle 매개 변수와 동일한 값으로 설정해야 합니다. NDIS에서 NET_BUFFER_LIST 구조를 올바른 미니포트 드라이버로 반환할 수 있도록 합니다.

또한 중간 드라이버는 NET_BUFFER_LIST 구조체의 SourceHandle 멤버를 NdisVcHandle 값으로 설정합니다. 중간 드라이버가 수신 표시를 전달하는 경우 드라이버는 원본 핸들 멤버에 쓰기 전에 기본 드라이버가 제공한 SourceHandle 값을 저장해야 합니다. NDIS가 전달된 NET_BUFFER_LIST 구조를 중간 드라이버에 반환하는 경우 중간 드라이버는 저장한 SourceHandle 을 복원해야 합니다.