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 。

要求

要求 值
最低受支持的客户端 Windows 2000。
目标平台 通用
标头 ntifs.h(包括 Wdm.h、Ntddk.h、Ntifs.h)
Library NtosKrnl.lib
DLL NtosKrnl.exe
IRQL 请参见“备注”部分。
DDI 符合性规则 CompleteRequestStatusCheck (wdm) 、 CompletionRoutineRegistered (wdm) 、 DeleteDevice (wdm) 、 ForwardedAtBadIrql (wdm) 、 ForwardedAtBadIrqlAllocate (wdm) 、 ForwardedAtBadIrqlFsdAsync (wdm) 、 ForwardedAtBadIrqlFsdSync (wdm) 、 HwStorPortProhibitedDDi (storport) 、 IoAllocateForward (wdm) 、 IoAllocateIrpSignalEventInCompletionTimeout (wdm) , IoBuildDeviceControlWait (wdm) , IoBuildDeviceControlWaitTimeout (wdm) , IoBuildFsdForward (wdm) , IoBuildSynchronousFsdRequestWait (wdm) , IoBuildSynchronousFsdRequestWaitTimeout (wdm) , IoSetCompletionRoutineExCheck (wdm) , IrpProcessingComplete (wdm) , LowerDriverReturn (wdm) , MarkDevicePower (wdm) , MarkQueuedIrps (wdm) 、 MarkIrpPending (wdm) 、 MarkIrpPending2 (wdm) 、 MarkPower (wdm) 、 MarkPowerDown (wdm) 、 MarkQueryRelations (wdm) 、 MarkStartDev (wdm) , PendedCompletedRequest (wdm) , PendedCompletedRequest2 (wdm) , PendedCompletedRequest3 (wdm) , PendedCompletedRequestEx (wdm) , PnpIrpCompletion (wdm) 、 PowerDownFail (wdm) 、 PowerUpFail (wdm) 、 RemoveLockForward (wdm) 、 RemoveLockForward2 (wdm) 、 RemoveLockForwardDeviceControl (wdm) 、 RemoveLockForwardDeviceControl2 (wdm) 、 RemoveLockForwardDeviceControlInternal (wdm) 、 RemoveLockForwardDeviceControlInternal2 (wdm) , RemoveLockForwardRead (wdm) 、 RemoveLockForwardRead2 (wdm) 、 RemoveLockForwardWrite (wdm) 、 RemoveLockForwardWrite2 (wdm) 、 RemoveLockMnRemove2 (wdm) 、 RemoveLockMnSurpriseRemove (wdm) 、 RemoveLockQueryMnRemove (wdm) 、 TargetRelationNeedsRef (wdm) 、 WmiForward (wdm)

另请参阅

IRP

IRP_MN_QUERY_POWER

IRP_MN_SET_POWER

IoCallDriver

IoCompletion

IoCopyCurrentIrpStackLocationToNext

IoSkipCurrentIrpStackLocation

PoRequestPowerIrp

PoStartNextPowerIrp