IRP 디스패치 루틴 작성

참고

최적의 안정성과 성능을 위해 레거시 파일 시스템 필터 드라이버 대신 필터 관리자 지원과 함께 파일 시스템 미니필터 드라이버를 사용합니다. 레거시 드라이버를 미니필터 드라이버로 포팅하려면 레거시 필터 드라이버 포팅에 대한 지침을 참조하세요.

파일 시스템 필터 드라이버는 디바이스 드라이버에 사용되는 것과 유사한 디스패치 루틴을 사용합니다. 디스패치 루틴은 하나 이상의 유형의 IRP를 처리합니다. (IRP의 형식 은 주 함수 코드에 의해 결정됩니다.) 드라이버의 DriverEntry 루틴은 드라이버 개체의 디스패치 테이블에 저장하여 디스패치 루틴 진입점을 등록 합니다. IRP가 드라이버로 전송되면 I/O 하위 시스템은 IRP의 주요 함수 코드를 기반으로 적절한 디스패치 루틴을 호출합니다.

모든 IRP 디스패치 루틴은 다음과 같이 정의됩니다.

NTSTATUS
(*PDRIVER_DISPATCH) (
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    );

파일 시스템 필터 드라이버 디스패치 루틴은 일반적으로 사용자 모드 애플리케이션 스레드인 I/O 요청을 시작한 스레드의 컨텍스트에서 IRQL PASSIVE_LEVEL 가장 자주 호출됩니다. 그러나 이 규칙에는 몇 가지 예외가 있습니다. 예를 들어 페이지 오류로 인해 IRQL APC_LEVEL 읽기 및 쓰기 디스패치 루틴이 호출됩니다. 이러한 예외는 디스패치 루틴 IRQL 및 스레드 컨텍스트의 테이블에 요약되어 있습니다. 아쉽게도 현재 필터 체인의 드라이버가 IRQL > PASSIVE_LEVEL IoCallDriver를 호출하지 못하도록 방지할 수 없습니다(예: 스핀 잠금 또는 빠른 뮤텍스 해제 실패). 그럼에도 불구하고 필터 디스패치 루틴은 항상 호출된 동일한 IRQL에서 IoCallDriver 를 호출하는 것이 좋습니다.

디스패치 루틴은 Kernel-Mode 드라이버 아키텍처 디자인 가이드의 드라이버 페이게이블 만들기 섹션에 설명된 조건을 충족하는 경우 페이지 가능하게 만들 수 있습니다.

파일 시스템 필터 드라이버에 CDO(제어 디바이스 개체)가 있는 경우 해당 디스패치 루틴은 IRP의 대상 디바이스 개체가 탑재된 볼륨에 대한 VDO(볼륨 디바이스 개체)가 아닌 CDO인 경우를 감지하고 처리할 수 있어야 합니다. CDO에 대한 자세한 내용은 필터 드라이버의 제어 디바이스 개체를 참조하세요.

이 섹션에서는 다음 항목에 대해 설명합니다.

IRP 완료

IRP를 Lower-Level 드라이버에 전달

디스패치 루틴에서 상태 반환

예: 완료 루틴을 설정하지 않고 IRP를 아래로 전달

디스패치 루틴에 대한 제약 조건

디스패치 루틴 IRQL 및 스레드 컨텍스트