다음을 통해 공유


프로토콜 드라이버에서 데이터 보내기

다음 그림에서는 프로토콜 드라이버, NDIS 및 드라이버 스택의 기본 드라이버를 포함하는 프로토콜 드라이버 전송 작업을 보여 줍니다.

프로토콜 드라이버, NDIS 및 드라이버 스택의 기본 드라이버를 사용하여 프로토콜 드라이버 보내기 작업을 보여 주는 다이어그램

프로토콜 드라이버는 NdisSendNetBufferLists 함수를 호출하여 NET_BUFFER_LIST 구조 목록에 정의된 네트워크 데이터를 보냅니다.

프로토콜 드라이버는 각 NET_BUFFER_LIST 구조체의 SourceHandle 멤버를 NdisBindingHandle 매개 변수에 전달하는 것과 동일한 값으로 설정해야 합니다. 바인딩 핸들은 기본 미니포트 드라이버가 NdisMSendNetBufferListsComplete를 호출한 후 NDIS가 프로토콜 드라이버에 NET_BUFFER_LIST 구조를 반환하는 데 필요한 정보를 제공합니다.

NdisSendNetBufferLists를 호출하기 전에 프로토콜 드라이버는 NET_BUFFER_LIST_INFO 매크로와 함께 보내기 요청과 함께 정보를 설정할 수 있습니다. 기본 드라이버는 NET_BUFFER_LIST_INFO 매크로를 사용하여 이 정보를 검색할 수 있습니다.

프로토콜 드라이버가 NdisSendNetBufferLists를 호출하는 즉시 NET_BUFFER_LIST 구조 및 모든 관련 리소스의 소유권을 포기합니다. NDIS는 ProtocolSendNetBufferListsComplete 함수를 호출하여 구조와 데이터를 프로토콜 드라이버에 반환합니다. NDIS는 목록을 ProtocolSendNetBufferListsComplete에 전달하기 전에 여러 송신 요청의 구조와 데이터를 NET_BUFFER_LIST 구조의 연결된 단일 목록으로 수집할 수 있습니다.

NDIS가 ProtocolSendNetBufferListsComplete를 호출할 때까지 프로토콜 드라이버 시작 전송의 현재 상태 알 수 없습니다. 프로토콜 드라이버는 NdisSendNetBufferLists를 호출할 때 보내기 요청에 할당된 모든 리소스의 소유권을 일시적으로 해제합니다. 프로토콜 드라이버는 NDIS가 ProtocolSendNetBufferListsComplete에 구조를 반환하기 전에 NET_BUFFER_LIST 구조체 또는 연결된 데이터를 검사하려고 시도해서는 안 됩니다.

ProtocolSendNetBufferListsComplete 는 송신 작업을 완료하는 데 필요한 후처리를 수행합니다. 예를 들어 프로토콜 드라이버는 클라이언트에 네트워크 데이터를 보내도록 요청한 클라이언트에 송신 작업이 완료되었음을 알릴 수 있습니다.

NDIS가 ProtocolSendNetBufferListsComplete를 호출하면 프로토콜 드라이버는 NetBufferLists 매개 변수로 지정된 NET_BUFFER_LIST 구조와 연결된 모든 리소스의 소유권을 되찾습니다. ProtocolSendNetBufferListsComplete 는 이러한 리소스를 해제하거나(예: NdisFreeNetBufferNdisFreeNetBufferList를 호출하여) NdisSendNetBufferLists에 대한 후속 호출에서 다시 사용할 수 있도록 준비할 수 있습니다.

NDIS는 항상 프로토콜 제공 네트워크 데이터를 NdisSendNetBufferLists에 전달된 프로토콜 결정 순서대로 기본 미니포트 드라이버에 제출하지만 기본 드라이버는 임의 순서로 보내기 요청을 완료할 수 있습니다. 즉, 모든 바인딩된 프로토콜 드라이버는 NDIS를 사용하여 프로토콜 드라이버가 FIFO의 NdisSendNetBufferLists 에 전달하는 네트워크 데이터를 기본 드라이버에 제출할 수 있습니다. 그러나 어떤 프로토콜 드라이버도 기본 드라이버를 사용하여 동일한 순서로 NdisMSendNetBufferListsComplete 를 호출할 수 없습니다.