필터 드라이버에서 보내기 요청 취소

필터 드라이버는 필터 드라이버에서 시작되었거나 지나치게 많은 드라이버에서 시작된 보내기 요청을 취소할 수 있습니다.

필터 드라이버 보내기 요청 취소

다음 그림에서는 필터 드라이버에서 시작된 송신 요청을 취소하는 방법을 보여 줍니다.

필터 드라이버에서 시작된 송신 요청을 취소하는 프로세스를 보여 주는 순서도입니다.

필터 드라이버는 보내기 작업을 위해 만드는 각 NET_BUFFER_LIST 구조에 대해 NDIS_SET_NET_BUFFER_LIST_CANCEL_ID매크로를 호출합니다. NDIS_SET_NET_BUFFER_LIST_CANCEL_ID 함수는 지정된 데이터를 취소 식별자로 표시합니다.

네트워크 데이터에 취소 ID를 할당하기 전에 필터 드라이버는 NdisGeneratePartialCancelId 를 호출하여 할당하는 각 취소 ID의 상위 바이트를 가져와야 합니다. 이렇게 하면 드라이버가 시스템의 다른 드라이버에서 할당한 취소 ID를 중복하지 않습니다. 드라이버는 일반적으로 DriverEntry 루틴에서 NdisGeneratePartialCancelId를 한 번 호출합니다. 그러나 드라이버는 NdisGeneratePartialCancelId를 여러 번 호출하여 둘 이상의 부분 취소 식별자를 가져올 수 있습니다.

표시된 NET_BUFFER_LIST 구조에서 보류 중인 데이터 전송을 취소하기 위해 필터 드라이버는 취소 ID를 NdisFCancelSendNetBufferLists 함수에 전달합니다. 드라이버는 NDIS_GET_NET_BUFFER_LIST_CANCEL_ID 매크로를 호출하여 NET_BUFFER_LIST 구조체의 취소 ID를 가져올 수 있습니다.

필터 드라이버가 동일한 취소 식별자를 사용하여 모든 NET_BUFFER_LIST 구조를 표시하는 경우 NdisFCancelSendNetBufferLists에 대한 단일 호출로 보류 중인 모든 전송을 취소할 수 있습니다. 필터 드라이버가 고유 식별자를 사용하여 NET_BUFFER_LIST 구조의 하위 그룹 내에 있는 모든 NET_BUFFER_LIST 구조를 표시하는 경우 NdisFCancelSendNetBufferLists에 대한 단일 호출을 사용하여 해당 하위 그룹 내에서 보류 중인 모든 전송을 취소할 수 있습니다.

NDIS는 기본 드라이버의 cancel send 함수를 호출합니다. 보류 중인 전송을 중단한 후 기본 드라이버는 send complete 함수(예: NdisMSendNetBufferListsComplete)를 호출하여 완료 상태 NDIS_STATUS_SEND_ABORTED NET_BUFFER_LIST 구조를 반환합니다. NDIS는 필터 드라이버의 FilterSendNetBufferListsComplete 함수를 호출합니다 .

FilterSendNetBufferListsComplete에서 필터 드라이버는 CancelIdNULL로 설정된 NDIS_SET_NET_BUFFER_LIST_CANCEL_ID 호출할 수 있습니다. 이렇게 하면 NET_BUFFER_LIST 실수로 부실 취소 ID와 함께 다시 사용되지 않습니다.

오버리싱 드라이버에서 시작된 송신 요청 취소

다음 그림에서는 지나치게 많은 드라이버에서 시작된 송신 요청을 취소하는 방법을 보여 줍니다.

오버리싱 드라이버에서 시작된 송신 요청을 취소하는 프로세스를 보여 주는 순서도입니다.

오버리싱 드라이버는 취소 보내기 함수( NdisFCancelSendNetBufferLists 또는 NdisCancelSendNetBufferLists)를 호출하여 미해결 송신 요청을 취소합니다. 이러한 오버리싱 드라이버는 보내기 요청을 하기 전에 전송 데이터를 취소 ID로 표시해야 합니다.

NDIS는 필터 드라이버의 FilterCancelSendNetBufferLists 함수를 호출하여 지정된 취소 식별자로 표시된 모든 NET_BUFFER_LIST 구조체의 전송을 취소합니다.

FilterCancelSendNetBufferLists는 다음 작업을 수행합니다.

  1. 지정된 필터 모듈에 대해 필터 드라이버의 큐에 대기된 NET_BUFFER_LIST 구조 목록을 트래버스하고 NDIS_GET_NET_BUFFER_LIST_CANCEL_ID 매크로를 호출하여 각 구조체에 대한 취소 식별자를 가져옵니다. 필터 드라이버는 NDIS_GET_NET_BUFFER_LIST_CANCEL_ID 반환하는 취소 ID를 NDIS가 FilterCancelSendNetBufferLists에 전달한 취소 ID와 비교합니다.

  2. 취소 식별자가 지정된 취소 식별자와 일치하는 모든 NET_BUFFER_LIST 구조체를 송신 큐(연결 해제)에서 제거합니다.

  3. 연결되지 않은 모든 NET_BUFFER_LIST 구조체에 대해 NdisFSendNetBufferListsComplete 함수를 호출하여 구조를 반환합니다. 필터 드라이버는 NET_BUFFER_LIST 구조체의 상태 필드를 NDIS_STATUS_SEND_ABORTED 설정합니다.

  4. NdisFCancelSendNetBufferLists 함수를 호출하여 기본 드라이버에 취소 보내기 요청을 전달합니다. 필터 드라이버는 오버리싱 드라이버로부터 받은 취소 식별자를 전달합니다. 취소 작업은 필터 드라이버에서 시작된 취소 보내기 작업과 마찬가지로 진행됩니다.