디스패치 루틴 및 IRQL

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

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

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

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

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

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

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

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