별도의 디스패치만들기 및 디스패치클라오스 루틴

IRP_MJ_CREATE 및 IRP_MJ_CLOSE 요청에 대한 드라이버의 Dispatch 루틴은 STATUS_SUCCESS 입력 IRP를 완료하는 것 이상의 작업을 수행할 수 없습니다. 자세한 내용은 IRP 완료를 참조하세요.

IRP_MJ_CREATEIRP_MJ_CLOSE 요청에 대한 다른 드라이버의 디스패치 루틴은 기본 디바이스 드라이버 또는 기본 디바이스에 따라 더 많은 작업을 수행할 수 있습니다. 다음 시나리오를 고려하세요.

  • 만들기 요청을 받으면 클래스 드라이버가 내부 큐를 초기화하고 디바이스 구성 정보 또는 컨트롤러 포트에 대한 단독 액세스를 요청하는 해당 포트 드라이버로 IRP_MJ_INTERNAL_DEVICE_CONTROL 요청을 보낼 수 있습니다.

  • IRP_MJ_CLOSE 수신은 대상 디바이스 개체와 연결된 파일 개체에 대한 마지막 참조가 제거되었음을 나타냅니다. 이는 파일 개체에 대한 모든 핸들이 닫혀 있고 모든 미해결 I/O 요청이 완료되거나 취소되었음을 의미합니다.

  • 만들기 요청을 받으면 자주 사용되지 않는 디바이스의 드라이버가 MmLockPagableCodeSection 을 호출하여 다른 IRP_MJ_XXX 요청을 처리하는 드라이버 루틴 중 일부를 상주하도록 할 수 있습니다. 상호 닫기 요청이 수신되면 드라이버는 MmUnlockPagableImageSection 을 호출하여 해당 드라이버의 디바이스 개체에 대한 모든 파일 개체 핸들이 닫히면 pageable-image 섹션을 페이징하여 시스템 메모리를 절약할 수 있습니다.

보호된 하위 시스템 또는 상위 수준 드라이버에서 디바이스 개체를 연 후 시스템 자체가 종료될 때까지 하위 수준의 드라이버의 디바이스 개체가 닫혀 있지 않기 때문에 일부 드라이버는 대칭에 대해서만 IRP_MJ_CLOSE 요청을 처리 합니다. 예를 들어 키보드 및 마우스 드라이버는 시스템이 실행되는 동안 작동해야 하는 물리적 디바이스를 나타내는 디바이스 개체를 설정하므로 이러한 드라이버는 대칭에 대한 DispatchClose 루틴을 최소화하거나 DispatchCreateClose 루틴을 결합했을 수 있습니다.

시스템이 계속 실행되도록 하위 수준 드라이버에서 제어하는 디바이스를 사용할 수 있어야 하는 경우 일반적으로 드라이버의 DispatchClose 루틴이 호출되지 않습니다. 예를 들어 일부 시스템 디스크 드라이버에는 DispatchClose 루틴이 없지만 이러한 드라이버에는 일반적으로 시스템이 종료되기 전에 미해결 파일 I/O 작업을 완료하기 위한 DispatchFlushBuffersDispatchShutdown 루틴이 있습니다.

별도의 DRIVER_DISPATCHDispatchClose 루틴을 구현할 수 있지만 드라이버에는 만들기 및 닫기 요청을 모두 처리하기 위한 단일 DispatchCreateClose 루틴 이 있는 경우가 있습니다.