디스패치 루틴 및 IRQL

대부분의 드라이버 디스패치 루틴은 IRQL = PASSIVE_LEVEL 임의 스레드 컨텍스트에서 호출되며 다음과 같은 예외가 있습니다.

  • 최상위 드라이버의 디스패치 루틴은 일반적으로 사용자 모드 애플리케이션 스레드인 I/O 요청을 시작한 스레드의 컨텍스트에서 호출됩니다.

    즉, 파일 시스템 드라이버 및 기타 최고 수준의 드라이버의 디스패치 루틴은 IRQL = PASSIVE_LEVEL 비비타 스레드 컨텍스트에서 호출됩니다.

  • 가장 낮은 수준의 디바이스 드라이버 및 시스템 페이징 경로에서 계층화된 중간 드라이버의 DispatchRead, DispatchWriteDispatchDeviceControl 루틴은 IRQL = APC_LEVEL 및 임의의 스레드 컨텍스트에서 호출할 수 있습니다.

    DispatchRead 및/또는 DispatchWrite 루틴과 이러한 최하위 수준 디바이스 또는 중간 드라이버에서 읽기 및/또는 쓰기 요청을 처리하는 다른 루틴은 항상 상주해야 합니다. 이러한 드라이버 루틴은 페이저블하거나 드라이버의 pageable-image 섹션에 속할 수 없습니다. 페이지 가능한 메모리에 액세스해서는 안됩니다. 또한 차단 호출(예: 0이 아닌 시간 초과가 있는 KeWaitForSingleObject )에 의존해서는 안 됩니다.

  • 최대 절전 모드 및/또는 페이징 경로에 있는 드라이버의 DispatchPower 루틴은 IRQL = DISPATCH_LEVEL 호출할 수 있습니다. 이러한 드라이버의 DispatchPnP 루틴은 PnP IRP_MN_DEVICE_USAGE_NOTIFICATION 요청을 처리할 준비가 되어 있어야 합니다.

  • 시작 시 인러시브 전원이 필요한 드라이버의 DispatchPower 루틴은 IRQL = DISPATCH_LEVEL 호출할 수 있습니다.

자세한 내용은 하드웨어 우선 순위 관리를 참조하세요.