네트워크 데이터 보내기
다음 그림에서는 프로토콜 드라이버, NDIS 및 미니포트 드라이버가 포함된 기본 보내기 작업을 보여 줍니다.
프로토콜 드라이버는 NdisSendNetBufferLists 함수를 호출하여 바인딩에 NET_BUFFER_LIST 구조를 보냅니다. NDIS는 미니포트 드라이버의 MiniportSendNetBufferLists 함수를 호출하여 NET_BUFFER_LIST 구조를 기본 미니포트 드라이버로 전달합니다.
모든 NET_BUFFER 기반 보내기 작업은 비동기입니다. 미니포트 드라이버는 완료되면 적절한 상태 코드를 사용하여 NdisMSendNetBufferListsComplete 함수를 호출합니다. 각 NET_BUFFER_LIST 구조의 전송은 개별적으로 완료할 수 있습니다. NDIS는 미니포트 드라이버가 NdisMSendNetBufferListsComplete 를 호출할 때마다 프로토콜 드라이버의 ProtocolSendNetBufferListsComplete 함수를 호출합니다.
프로토콜 드라이버는 NDIS가 프로토콜 드라이버의 ProtocolSendNetBufferListsComplete 함수를 호출하는 즉시 NET_BUFFER_LIST 구조 및 모든 연결된 구조 및 데이터의 소유권을 회수할 수 있습니다.
미니포트 드라이버 또는 NDIS는 NET_BUFFER_LIST 구조를 순서대로 반환할 수 있습니다. 프로토콜 드라이버는 각 NET_BUFFER_LIST 구조체에 연결된 NET_BUFFER 구조의 목록이 수정되지 않았음을 보장합니다.
모든 NDIS 드라이버는 NET_BUFFER_LIST 구조체에서 NET_BUFFER 구조를 분리할 수 있습니다. 모든 NDIS 드라이버는 NET_BUFFER 구조에서 MDL을 분리할 수도 있습니다. 그러나 드라이버는 항상 원래 형식의 NET_BUFFER 구조체와 MDL을 사용하여 NET_BUFFER_LIST 구조를 반환해야 합니다. 예를 들어 중간 드라이버는 NET_BUFFER_LIST 두 개의 새 NET_BUFFER_LIST 구조로 분리하고 원래 데이터의 일부를 다음 드라이버에 전달할 수 있습니다. 그러나 중간 드라이버가 원래 NET_BUFFER_LIST 처리를 완료하면 원래 NET_BUFFER 구조 및 MDL을 사용하여 전체 NET_BUFFER_LIST 반환해야 합니다.
프로토콜 드라이버는 NET_BUFFER_LIST 구조의 SourceHandle 멤버를 NdisOpenAdapterEx 함수 호출에서 NDIS가 제공한 NdisBindingHandle로 설정합니다. NDIS는 SourceHandle 멤버를 사용하여 NET_BUFFER_LIST 구조를 보낸 프로토콜 드라이버에 NET_BUFFER_LIST 구조를 반환합니다.
또한 중간 드라이버는 NET_BUFFER_LIST 구조의 SourceHandle 멤버를 NdisOpenAdapterEx 호출에서 NDIS가 제공한 NdisBindingHandle 값으로 설정합니다. 중간 드라이버가 보내기 요청을 전달하는 경우 드라이버는 SourceHandle 멤버에 쓰기 전에 오버레이 드라이버가 제공한 SourceHandle 값을 저장해야 합니다. NDIS가 전달된 NET_BUFFER_LIST 구조를 중간 드라이버에 반환하는 경우 중간 드라이버는 저장한 SourceHandle 을 복원해야 합니다.