필터 드라이버는 수신 표시를 시작하거나 기본 드라이버에서 수신 표시를 필터링할 수 있습니다. 미니포트 드라이버가 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 반환된 직후 소유권을 되찾습니다.
필터 드라이버가 NdisFIndicateReceiveNetBufferListsReceiveFlags 매개 변수에서 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가 ReceiveFlags 매개변수에서 NDIS_RECEIVE_FLAGS_RESOURCES 플래그를 지운 경우, 필터 드라이버는 FilterReceiveNetBufferLists을 사용하여 NdisFReturnNetBufferLists을 호출해 버퍼를 반환합니다. NDIS가 FilterReceiveNetBufferLists함수의 ReceiveFlags 매개 변수에 NDIS_RECEIVE_FLAGS_RESOURCES 플래그를 설정하면, FilterReceiveNetBufferLists에서 반환될 때 버퍼가 반환됩니다.