다음을 통해 공유


네트워크 데이터 수신

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

기본 네트워크 수신 작업을 보여 주는 다이어그램

미니포트 드라이버는 NdisMIndicateReceiveNetBufferLists 함수를 호출하여 상위 수준 드라이버에 대한 NET_BUFFER 구조를 나타냅니다. 모든 NET_BUFFER 구조체는 일반적으로 별도의 NET_BUFFER_LIST 구조체에 연결되어야 합니다. 이렇게 하면 프로토콜 드라이버가 원래 NET_BUFFER_LIST 구조 목록의 하위 집합을 만들고 다른 클라이언트에 전달할 수 있습니다. 일부 드라이버(예: 네이티브 IEEE 802.11 미니포트 드라이버)는 NET_BUFFER_LIST 구조에 둘 이상의 NET_BUFFER 구조를 연결할 수 있습니다.

모든 NET_BUFFER_LIST 구조를 연결한 후 미니포트 드라이버는 목록의 첫 번째 NET_BUFFER_LIST 구조에 대한 포인터를 NdisMIndicateReceiveNetBufferLists 함수에 전달합니다. NDIS는 NET_BUFFER_LIST 구조를 검사하고 NET_BUFFER_LIST 구조와 연결된 각 프로토콜 드라이버의 ProtocolReceiveNetBufferLists 함수를 호출합니다. NDIS는 각 프로토콜 드라이버에 올바른 바인딩과 연결된 NET_BUFFER_LIST 구조만 포함하는 목록의 하위 집합을 전달합니다. NDIS는 NET_BUFFER_LIST 구조체에 지정된 NetBufferListFrameType 값과 각 프로토콜 드라이버가 등록하는 프레임 형식과 일치합니다.

프로토콜 드라이버의 ProtocolReceiveNetBufferLists 함수에 전달되는 ReceiveFlags 매개 변수의 NDIS_RECEIVE_FLAGS_RESOURCES 플래그가 설정된 경우 NDIS는 ProtocolReceiveNetBufferLists 호출이 반환된 직후에 NET_BUFFER_LIST 구조체의 소유권을 되찾습니다.

참고 NDIS_RECEIVE_FLAGS_RESOURCES 플래그가 설정된 경우 프로토콜 드라이버는 연결된 목록에 원래 NET_BUFFER_LIST 구조 집합을 유지해야 합니다. 예를 들어 이 플래그가 설정되면 드라이버는 구조를 처리하고 스택을 한 번에 하나씩 표시할 수 있지만 함수가 반환되기 전에 원래 연결된 목록을 복원해야 합니다.

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

미니포트 드라이버가 수신 리소스에서 부족한 경우 NdisMIndicateReceiveNetBufferLists 호출의 ReceiveFlags 매개 변수에서 NDIS_RECEIVE_FLAGS_RESOURCES 플래그를 설정할 수 있습니다. 이 경우 드라이버는 NdisMIndicateReceiveNetBufferLists가 반환되는 즉시 표시된 모든 NET_BUFFER_LIST 구조체 및 포함된 NET_BUFFER 구조체의 소유권을 회수할 수 있습니다. NDIS_RECEIVE_FLAGS_RESOURCES 플래그 집합이 있는 NET_BUFFER 구조를 표시하면 프로토콜 드라이버가 강제로 데이터를 복사하므로 피해야 합니다. 미니포트 드라이버는 수신 리소스가 부족할 때를 감지하고 이 상황을 방지하는 데 필요한 단계를 수행해야 합니다.

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

참고 미니포트 드라이버가 NDIS_RECEIVE_FLAGS_RESOURCES 플래그가 설정된 NET_BUFFER_LIST 구조를 나타내는 경우 NDIS가 동일한 상태 사용하여 프로토콜 드라이버에 대한 NET_BUFFER_LIST 구조를 나타내는 것은 아닙니다. 예를 들어 NDIS는 NDIS_RECEIVE_FLAGS_RESOURCES 플래그가 설정된 NET_BUFFER_LIST 구조를 복사하고 플래그가 지워진 프로토콜 드라이버에 복사본을 나타낼 수 있습니다.

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

미니포트 드라이버는 NET_BUFFER_LIST 구조체의 SourceHandle 멤버를 MiniportInitializeEx 함수의 미니포트 드라이버에 NDIS가 제공한 MiniportAdapterHandle로 설정해야 합니다. 필터 드라이버는 필터 드라이버가 FilterAttach 함수의 필터 드라이버에 제공한 필터의 NdisFilterHandle에서 시작된 각 NET_BUFFER_LIST 구조의 SourceHandle 멤버를 설정해야 합니다. 필터 드라이버는 필터 드라이버에서 시작되지 않은 NET_BUFFER_LIST 구조체에서 SourceHandle 멤버를 수정해서는 안 됩니다.

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