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 开始,驱动程序应调用 IoCallDriver,而不是 PoCallDriver ,以便将电源 IRP 传递给下一个较低的驱动程序。 但是,在 Windows Server 2003、Windows XP 和 Windows 2000 上,驱动程序必须调用 PoCallDriver,而不是 IoCallDriver 才能将电源 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 上,与关机 IRP 关联的 IoCompletion 例程只需调用 PoStartNextPowerIrp。
系统中一次只能有一个浪涌 IRP 处于活动状态。 为需要当前 (的设备传递上电 IRP 时,DO_POWER_INRUSH标志在设备对象) 中设置, PoCallDriver 会检查另一个浪涌 IRP 是否已处于活动状态。 如果是这样, PoCallDriver 在上一个 IRP 完成后将当前 IRP 排队进行处理,然后返回STATUS_PENDING。 有关浪涌 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 。