다음을 통해 공유


DispatchPower 루틴

드라이버의 DispatchPower 루틴은 IRP_MJ_POWER I/O 함수 코드에 대한 IRP를 처리하여 전원 관리를 지원합니다. IRP_MJ_POWER 함수 코드와 연결된 전원 관리에 대한 몇 가지 사소한 I/O 함수 코드입니다. Power Manager는 이러한 부 함수 코드를 사용하여 드라이버가 전원 상태를 변경하고, 시스템 절전 모드 해제 이벤트를 대기 및 응답하고, 드라이버의 디바이스에 대해 쿼리하도록 지시합니다.

각 드라이버의 DispatchPower 루틴은 다음 작업을 수행합니다.

  • 가능하면 IRP를 처리합니다.

  • PoCallDriver를 사용하여 디바이스 스택의 다음 하위 드라이버에 IRP를 전달합니다.

  • 버스 드라이버인 경우 디바이스에서 요청된 전원 작업을 수행하고 IRP를 완료합니다.

함수 또는 필터 드라이버가 IRP에 실패할 수 있는 몇 가지 경우를 제외하고 디바이스의 모든 드라이버는 디바이스에 대한 전원 IRP를 처리할 수 있어야 합니다. 대부분의 함수 및 필터 드라이버는 일부 처리를 수행하거나 각 전원 IRP에 대한 IoCompletion 루틴을 설정한 다음 IRP를 완료하지 않고 다음 하위 드라이버로 전달합니다. 결국 IRP는 버스 드라이버에 도달하여 필요한 경우 디바이스의 전원 상태를 물리적으로 변경하고 IRP를 완료합니다.

IRP가 완료되면 IRP가 디바이스 스택 아래로 이동할 때 I/O 관리자는 드라이버가 설정한 모든 IoCompletion 루틴을 호출합니다. 드라이버가 완료 루틴을 설정해야 하는지 여부는 IRP 유형 및 드라이버의 개별 요구 사항에 따라 달라집니다.

디바이스 전원을 공급하는 전원 IRP는 먼저 디바이스 스택의 가장 낮은 드라이버(기본 버스 드라이버)에 의해 처리된 다음, 각 연속 드라이버가 스택 위로 처리해야 합니다. 디바이스 전원을 낮추는 전원 IRP는 먼저 디바이스 스택의 맨 위에 있는 드라이버가 처리한 다음 스택 아래로 내려가는 각 연속 드라이버에 의해 처리되어야 합니다.

이동식 디바이스에 대한 특수 처리

DispatchPower 루틴에서 이동식 디바이스의 드라이버는 디바이스가 여전히 있는지 확인하기 위해 검사 합니다. 디바이스가 제거된 경우 드라이버는 IRP를 다음 하위 드라이버로 전달해서는 안 됩니다. 대신 드라이버는 다음을 수행해야 합니다.

  • PoStartNextPowerIrp를 호출하여 다음 전원 IRP 처리를 시작합니다.

  • Irp-IoStatus.Status>를 STATUS_DELETE_PENDING 설정합니다.

  • IO_NO_INCREMENT 지정하여 IoCompleteRequest를 호출하여 IRP를 완료합니다.

  • STATUS_DELETE_PENDING 반환합니다.