필터 드라이버에서 데이터 수신
필터 드라이버는 수신 표시를 시작하거나 기본 드라이버에서 수신 표시를 필터링할 수 있습니다. 미니포트 드라이버가 NdisMIndicateReceiveNetBufferLists 함수를 호출하면 NDIS는 지정된 NET_BUFFER_LIST 구조를 드라이버 스택의 가장 낮은 오버레이 필터 모듈에 제출합니다.
필터 드라이버에서 시작한 표시 수신
다음 그림에서는 필터 드라이버에서 시작하는 수신 표시를 보여 줍니다.
필터 드라이버는 NdisFIndicateReceiveNetBufferLists 함수를 호출하여 수신된 데이터를 나타냅니다. NdisFIndicateReceiveNetBufferLists 함수는 표시된 NET_BUFFER_LIST 구조 목록을 스택 위로 지나친 드라이버에 전달합니다. 필터 드라이버는 초기화 중에 만든 풀의 구조를 할당합니다.
필터 드라이버가 NdisFIndicateReceiveNetBufferLists의 ReceiveFlags 매개 변수에서 NDIS_RECEIVE_FLAGS_RESOURCES 플래그를 설정하는 경우 필터 드라이버가 NET_BUFFER_LIST 구조체의 소유권을 즉시 되찾아야 했음을 나타냅니다. 이 경우 NDIS는 필터 드라이버의 FilterReturnNetBufferLists 함수를 호출하여 NET_BUFFER_LIST 구조를 반환하지 않습니다. 필터 드라이버는 NdisFIndicateReceiveNetBufferLists 가 반환된 직후 소유권을 되찾습니다.
필터 드라이버가 NdisFIndicateReceiveNetBufferLists의 ReceiveFlags 매개 변수에서 NDIS_RECEIVE_FLAGS_RESOURCES 플래그를 설정하지 않으면 NDIS는 표시된 NET_BUFFER_LIST 구조를 필터 드라이버의 FilterReturnNetBufferLists 함수에 반환합니다. 이 경우 필터 드라이버는 NDIS가 FilterReturnNetBufferLists로 반환할 때까지 표시된 구조체의 소유권을 포기합니다.
참고 필터 드라이버는 시작되는 수신 표시를 추적하고 수신 작업이 완료될 때 NdisFReturnNetBufferLists 함수를 호출하지 않는지 확인해야 합니다.
수신 표시 필터링
다음 그림에서는 기본 드라이버에서 시작하는 필터링된 수신 표시를 보여 줍니다.
NDIS는 필터 드라이버의 FilterReceiveNetBufferLists 함수를 호출하여 기본 드라이버에서 제공되는 표시를 처리합니다. NDIS는 기본 드라이버가 수신 표시 함수(예: NdisMIndicateReceiveNetBufferLists)를 호출한 후 FilterReceiveNetBufferLists를 호출하여 수신된 네트워크 데이터 또는 루프백 데이터를 나타냅니다.
FilterReceiveNetBufferLists의 ReceiveFlags 매개 변수에 있는 NDIS_RECEIVE_FLAGS_RESOURCES 플래그가 설정되지 않은 경우 필터 드라이버는 NdisFReturnNetBufferLists 함수를 호출할 때까지 NET_BUFFER_LIST 구조체의 소유권을 유지합니다.
ReceiveFlags 매개 변수의 NDIS_RECEIVE_FLAGS_RESOURCES 플래그가 설정된 경우 필터 드라이버는 NET_BUFFER_LIST 구조와 연결된 기본 드라이버 할당 리소스를 유지할 수 없습니다. 이 플래그는 기본 드라이버가 수신 리소스에서 부족함을 나타낼 수 있습니다. FilterReceiveNetBufferLists 함수는 가능한 한 빨리 반환되어야 합니다.
참고NDIS_RECEIVE_FLAGS_RESOURCES 플래그가 설정된 경우 필터 드라이버는 연결된 목록에 원래 NET_BUFFER_LIST 구조 집합을 유지해야 합니다. 예를 들어 이 플래그가 설정되면 드라이버는 구조를 처리하고 스택을 한 번에 하나씩 표시할 수 있지만 함수가 반환되기 전에 원래 연결된 목록을 복원해야 합니다.
필터 드라이버는 데이터를 오버리싱 드라이버에 표시하기 전에 수신된 데이터에 대한 필터 작업을 수행할 수 있습니다. FilterReceiveNetBufferLists 함수에 제출된 각 버퍼에 대해 필터 드라이버는 다음을 수행할 수 있습니다.
NdisFIndicateReceiveNetBufferLists를 호출하여 다음 오버레이 드라이버에 전달합니다. 드라이버는 버퍼의 내용을 수정할 수 있습니다. NDIS는 컨텍스트 공간의 가용성을 보장합니다( NET_BUFFER_LIST_CONTEXT 구조 참조).
필터 드라이버는 NDIS가 FilterReceiveNetBufferLists에 전달한 상태 변경하거나 단순히 NdisFIndicateReceiveNetBufferLists에 전달할 수 있습니다.
참고 필터 드라이버는 NDIS가 FilterReceiveNetBufferLists의 ReceiveFlags 매개 변수에서 NDIS_RECEIVE_FLAGS_RESOURCES 플래그를 설정하는 경우에도 NdisFIndicateReceiveNetBufferLists를 사용하여 버퍼를 전달할 수 있습니다. 이 경우 필터 드라이버는 버퍼의 소유권을 다시 얻을 때까지 FilterReceiveNetBufferLists 에서 반환하지 않아야 합니다.
버퍼를 삭제합니다. NDIS가 FilterReceiveNetBufferLists의 ReceiveFlags 매개 변수에서 NDIS_RECEIVE_FLAGS_RESOURCES 플래그를 지우면 NdisFReturnNetBufferLists 함수를 호출하여 버퍼를 삭제합니다. NDIS가 FilterReceiveNetBufferLists의 ReceiveFlags 매개 변수에서 NDIS_RECEIVE_FLAGS_RESOURCES 플래그를 설정하는 경우 아무 작업도 수행하지 않고 FilterReceiveNetBufferLists에서 반환하여 버퍼를 삭제합니다.
나중에 처리하기 위해 로컬 데이터 구조에서 버퍼를 큐에 대기합니다. NDIS가 FilterReceiveNetBufferLists의 ReceiveFlags 매개 변수에서 NDIS_RECEIVE_FLAGS_RESOURCES 플래그를 설정하는 경우 필터 드라이버는 FilterReceiveNetBufferLists에서 반환하기 전에 복사본을 만들어야 합니다.
버퍼를 복사하고 복사본을 사용하여 수신 표시를 시작합니다. 수신 표시는 필터 드라이버 시작 수신 표시와 유사합니다. 이 경우 드라이버는 원래 버퍼를 기본 드라이버로 반환해야 합니다.
NdisFIndicateReceiveNetBufferLists 함수는 표시된 NET_BUFFER_LIST 구조 목록을 드라이버 스택 위로 지나친 드라이버에 전달합니다. 수신 작업은 필터 드라이버 시작 수신 작업과 유사하게 진행됩니다.
오버레이 드라이버가 버퍼의 소유권을 유지하는 경우 NDIS는 필터 모듈에 대한 FilterReturnNetBufferLists 함수를 호출합니다. FilterReturnNetBufferLists 함수에서 필터 드라이버는 수신 표시 경로의 버퍼에서 수행한 작업을 실행 취소합니다.
가장 낮은 계층 필터 모듈이 버퍼로 수행되었음을 나타내는 경우 NDIS는 버퍼를 미니포트 드라이버에 반환합니다. NDIS가 FilterReceiveNetBufferLists의 ReceiveFlags 매개 변수에서 NDIS_RECEIVE_FLAGS_RESOURCES 플래그를 지운 경우 필터 드라이버는 NdisFReturnNetBufferLists를 호출하여 버퍼를 반환합니다. NDIS가 FilterReceiveNetBufferLists의 ReceiveFlags 매개 변수에 NDIS_RECEIVE_FLAGS_RESOURCES 플래그를 설정하면 FilterReceiveNetBufferLists에서 반환하면 버퍼가 반환됩니다.