다음을 통해 공유


선택적 디스패치 루틴

드라이버에는 다음과 같은 디스패치 루틴이 포함될 수 있습니다.

  • DispatchCleanup

    IRP_MJ_CLEANUP 대상 디바이스 개체와 연결된 파일 개체의 마지막 핸들이 닫혀 있음을 나타냅니다. 파일 개체에 대한 미해결 I/O 요청이 여전히 존재할 수 있습니다. 드라이버는 DispatchCleanup 루틴을 구현하여 특정 파일 핸들과 관련이 없는 정리를 수행할 수 있습니다. 드라이버는 동일한 용도로 DispatchClose 루틴을 사용할 수도 있습니다.

  • DispatchQueryInformation, DispatchSetInformation

    일부 최고 수준의 드라이버는 IRP_MJ_QUERY_INFORMATION 처리하고IRP_MJ_SET_INFORMATION IRP를 처리해야 할 수 있습니다. 이러한 요청은 사용자 모드 애플리케이션, 커널 모드 구성 요소 또는 드라이버가 사용자 모드 요청자가 핸들을 가지고 있거나 사용자 모드 요청자가 해당 파일 개체에서 파일 끝을 설정하려고 시도하는 파일 개체의 길이(드라이버의 디바이스 개체를 나타내는)에 대한 정보를 요청했음을 나타냅니다.

    병렬 클래스 및 직렬 디바이스 드라이버는 FILE_STANDARD_INFORMATION 또는 FILE_POSITION_INFORMATION 길이 또는 위치를 0으로 설정하여 이러한 요청을 처리합니다. 특히 사용자 모드 애플리케이션 또는 커널 모드 드라이버가 C 런타임 함수를 호출하여 파일 개체를 조작할 수 있는 경우 다른 최상위 디바이스 드라이버는 이러한 요청을 지원해야 합니다. 파일 시스템 드라이버는 이러한 최고 수준의 디바이스 드라이버보다 이러한 요청을 더 완벽하게 지원해야 합니다.

  • DispatchFlushBuffers

    디바이스의 데이터를 캐시하거나 드라이버 할당 메모리에서 내부적으로 데이터를 버퍼링하는 드라이버는 IRP_MJ_FLUSH_BUFFERS 받을 수 있습니다. 이 요청을 수신하면 드라이버가 버퍼링된 데이터를 쓰거나 캐시된 데이터를 디바이스로 플러시하거나 디바이스에서 읽은 버퍼링되거나 캐시된 데이터를 삭제해야 했음을 나타냅니다.

    예를 들어 디바이스의 입력 데이터에 대한 내부 링 버퍼가 있는 시스템 키보드 및 마우스 클래스 드라이버는 플러시 요청을 지원합니다. 대용량 스토리지 디바이스 및 그 위에 계층화된 드라이버도 이 요청을 지원합니다.

  • DispatchShutdown

    시스템이 종료되기 전에 호출될 가능성이 있는 모든 드라이버는 IRP_MJ_SHUTDOWN 처리해야 합니다. DispatchShutdown 루틴은 전원 관리자가 시스템 설정 전원 IRP를 보내 시스템을 종료하기 전에 드라이버 결정 정리가 필요한 모든 작업을 수행해야 합니다. 드라이버는 IoRegisterShutdownNotification 또는 IoRegisterLastChanceShutdownNotification 을 호출하여 종료 알림을 등록할 수 있습니다.

대량 스토리지 디바이스 및 계층화된 중간 드라이버용 드라이버는 시스템이 종료될 때 최고 수준의 파일 시스템 드라이버에 의존하여 종료 IRP를 보낼 수 있습니다. 즉, FSD는 캐시된 파일 데이터가 주변 디바이스에 기록되도록 하고, 기본 드라이버를 호출하여 디바이스 캐시 또는 버퍼(있는 경우)에서 데이터를 플러시하는 등의 작업을 수행합니다.

데이터를 내부적으로 캐시하는 대용량 스토리지 디바이스의 드라이버는 DispatchShutdownDispatchFlushBuffers 루틴을 제공해야 합니다. 대용량 스토리지 드라이버가 메모리의 데이터를 버퍼링하지만 디바이스에 내부 캐시가 없는 경우 DispatchShutdownDispatchFlushBuffers 루틴도 제공해야 합니다.

IRP_MJ_FLUSH_BUFFERSIRP_MJ_SHUTDOWN 요청을 처리하는 드라이버 위에 계층화된 중간 드라이버는 DispatchShutdownDispatchFlushBuffers 루틴도 제공합니다.