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 向下传递到下一个较低的驱动程序时,调用方应使用 IoSkipCurrentIrpStackLocationIoCopyCurrentIrpStackLocationToNext 来设置 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 的详细信息,请参阅 为电源管理设置设备对象标志

如果 DeviceObjectIRP_MN_SET_POWERIRP_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