NDIS 필터 드라이버에서 OID 요청 필터링
필터 드라이버는 지나치게 드라이버에서 시작된 OID 요청을 처리할 수 있습니다. NDIS는 FilterOidRequest 함수를 호출하여 각 OID 요청을 처리합니다. 필터 드라이버는 NdisFOidRequest 함수를 호출하여 기본 드라이버에 OID 요청을 전달할 수 있습니다.
NDIS는 필터 드라이버의 FilterCancelOidRequest 함수를 호출하여 OID 요청을 취소할 수 있습니다. NDIS가 FilterCancelOidRequest를 호출하는 경우 필터 드라이버는 가능한 한 빨리 NdisFOidRequest 함수를 호출하려고 시도해야 합니다.
다음 그림에서는 필터링된 OID 요청을 보여 줍니다.
필터 드라이버는 FilterOidRequest에서 각각 NDIS_STATUS_SUCCESS 또는 NDIS_STATUS_PENDING 반환하여 OID 요청을 동기적으로 또는 비동기적으로 완료할 수 있습니다. FilterOidRequest는 오류 상태 동기적으로 완료할 수도 있습니다.
OID 집합 요청을 성공적으로 처리하는 필터 드라이버는 OID 집합 요청에서 반환될 때 NDIS_OID_REQUEST 구조에서 SupportedRevision 멤버를 설정해야 합니다. SupportedRevision 멤버는 드라이버가 지원하는 수정 버전에 대해 OID 요청의 시작자에게 알릴 수 있습니다. NDIS 구조의 버전 정보에 대한 자세한 내용은 NDIS 버전 정보 지정을 참조하세요.
FilterOidRequest가 NDIS_STATUS_PENDING 반환하는 경우 OID 요청을 완료한 후 NdisFOidRequestComplete 함수를 호출해야 합니다. 이 경우 드라이버는 NdisFOidRequestComplete의 OidRequest 매개 변수에서 요청 결과를 전달합니다. 드라이버는 NdisFOidRequestComplete의 Status 매개 변수에서 요청의 최종 상태 전달합니다.
FilterOidRequest가 NDIS_STATUS_SUCCESS 반환하는 경우 OidRequest 매개 변수의 NDIS_OID_REQUEST 구조에서 쿼리 요청 결과를 반환합니다. 이 경우 드라이버는 NdisFOidRequestComplete 함수를 호출하지 않습니다.
기본 드라이버에 OID 요청을 전달하기 위해 필터 드라이버는 NdisFOidRequest 함수를 호출합니다. 요청을 기본 드라이버로 전달하지 않아야 하는 경우 필터 드라이버가 요청을 즉시 완료할 수 있습니다. 전달하지 않고 요청을 완료하기 위해 드라이버는 FilterOidRequest에서 NDIS_STATUS_SUCCESS(또는 오류 상태)를 반환하거나 NDIS_STATUS_PENDING 반환한 후 NdisFOidRequestComplete를 호출할 수 있습니다.
참고 드라이버가 NdisFOidRequest를 호출하기 전에 드라이버는 NDIS_OID_REQUEST 구조를 할당하고 NdisAllocateCloneOidRequest를 호출하여 요청 정보를 새 구조로 전송해야 합니다.
전달된 요청은 필터 드라이버에서 시작한 요청과 동일하게 진행됩니다. 자세한 내용은 NDIS 필터 드라이버에서 OID 요청 생성을 참조하세요.
기본 드라이버가 전달된 요청을 완료한 후 필터 드라이버는 필요한 경우 응답을 수정하고 지나치게 많은 드라이버에 전달할 수 있습니다.
필터 드라이버는 다시 시작, 실행 중, 일시 중지 또는 일시 중지 상태일 때 지나치게 드라이버에서 OID 요청을 받을 수 있습니다.
참고 미니포트 드라이버와 마찬가지로 필터 드라이버는 한 번에 하나의 OID 요청만 받을 수 있습니다. NDIS는 필터 모듈로 전송되는 요청을 직렬화하므로 이전 요청을 완료하기 전에 FilterOidRequest에서 필터 드라이버를 호출할 수 없습니다.
다음은 OID 요청을 수정하는 필터 드라이버의 예입니다.
- 필터 드라이버는 헤더를 추가합니다. 이 경우 드라이버가 기본 드라이버에서 OID_GEN_MAXIMUM_FRAME_SIZE 대한 쿼리에 대한 응답을 받은 후 필터는 응답에서 헤더의 크기를 뺍니다. 드라이버가 전송된 각 패킷 앞에 헤더를 삽입하고 받은 각 패킷에서 헤더를 제거하므로 드라이버는 헤더 크기를 뺍니다.