PoCallDriver 함수(ntifs.h)
PoCallDriver 루틴은 전원 IRP를 디바이스 스택의 다음 하위 드라이버에 전달합니다. (Windows Server 2003, Windows XP 및 Windows 2000만 해당)
구문
NTSTATUS PoCallDriver(
[in] PDEVICE_OBJECT DeviceObject,
[in, out] __drv_aliasesMem PIRP Irp
);
매개 변수
[in] DeviceObject
IRP를 라우팅할 드라이버에서 만든 DEVICE_OBJECT 대한 포인터입니다.
[in, out] Irp
IRP에 대한 포인터입니다.
반환 값
PoCallDriver는 성공을 나타내기 위해 STATUS_SUCCESS 반환합니다. IRP를 큐에 대기한 경우 STATUS_PENDING 반환합니다.
설명
Windows Vista부터 드라이버는 PoCallDriver가 아닌 IoCallDriver 를 호출하여 전원 IRP를 다음 하위 드라이버에 전달해야 합니다. 그러나 Windows Server 2003, Windows XP 및 Windows 2000에서 드라이버는 IoCallDriver가 아닌 PoCallDriver 를 호출하여 전원 IRP를 다음 하위 드라이버에 전달해야 합니다. Windows Server 2003, Windows XP, Windows 2000에서 드라이버는 PoCallDriver를 호출하기 전에 PoStartNextPowerIrp를 호출해야 합니다.
새 IRP가 필요한 드라이버는 PoRequestPowerIrp를 호출해야 합니다. 드라이버는 자체 전원 IRP를 할당하지 않아야 합니다.
전원 IRP를 다음 하위 드라이버로 전달할 때 호출자는 IoSkipCurrentIrpStackLocation 또는 IoCopyCurrentIrpStackLocationToNext 를 사용하여 IRP 스택 위치를 설정한 다음 PoCallDriver를 호출해야 합니다. IRP를 처리하려면 IoCompletion 루틴을 설정해야 하는 경우 IoCopyCurrentIrpStackLocationToNext를 사용하고, IoCompletion 루틴이 필요하지 않은 경우 IoSkipCurrentStackLocation을 사용합니다.
디바이스 전원이 켜지면 버스 드라이버가 디바이스를 작업 상태로 설정한 후 드라이버가 시작 작업(디바이스 초기화, 컨텍스트 복원 등)을 수행하도록 IoCompletion 루틴을 설정해야 합니다. PoCallDriver를 호출하기 전에 IoCompletion 루틴을 설정합니다.
디바이스의 전원이 다운되면 IRP를 다음 하위 드라이버에 전달하기 전에 드라이버가 필요한 전원 다운 작업을 수행해야 합니다. IRP가 버스 드라이버에 도달하면 디바이스 전원이 꺼지고 해당 드라이버가 더 이상 액세스할 수 없습니다. Windows Server 2003, Windows XP 및 Windows 2000에서는 Power-Down IRP와 연결된 IoCompletion 루틴은 PoStartNextPowerIrp를 호출하는 데만 필요합니다.
한 번에 하나의 Inrush IRP만 시스템에서 활성화할 수 있습니다. inrush 전류가 필요한 디바이스에 대한 전원 켜기 IRP를 전달할 때(즉, 디바이스 개체에 DO_POWER_INRUSH 플래그가 설정됨) PoCallDriver 는 다른 inrush IRP가 이미 활성 상태인지 확인합니다. 이 경우 PoCallDriver 는 이전 IRP가 완료된 후 처리를 위해 현재 IRP를 큐에 대기한 다음 STATUS_PENDING 반환합니다. inrush IRP에 대한 자세한 내용은 전원 관리를 위한 디바이스 개체 플래그 설정을 참조하세요.
DeviceObject에 대해 IRP_MN_SET_POWER 또는 IRP_MN_QUERY_POWER 요청이 이미 활성화된 경우 PoCallDriver는 이 IRP를 큐에 대기하고 STATUS_PENDING 반환합니다.
Windows 2000 이상 시스템에서 페이저블 드라이버(디바이스 개체에서 DO_POWER_PAGABLE 플래그가 설정됨)는 IRQL = PASSIVE_LEVEL PoCallDriver 를 호출해야 합니다. 페이징할 수 없거나(DO_POWER_PAGABLE 디바이스 개체에 설정되지 않음) 현재(디바이스 개체에 설정된 DO_POWER_INRUSH)가 필요한 드라이버는 IRQL = PASSIVE_LEVEL 또는 DISPATCH_LEVEL PoCallDriver 를 호출할 수 있습니다.
Windows 98/Me에서 모든 드라이버는 IRQL = PASSIVE_LEVEL PoCallDriver 를 호출합니다.