poCallDriver 函数 (wdm.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 上,只需调用 PoStartNextPowerIrp 即可使用与关机 IRP 关联的 IoCompletion 例程。

系统中一次只能有一个浪涌 IRP 处于活动状态。 为需要浪涌当前 (的设备传递上电 IRP 时,DO_POWER_INRUSH标志在设备对象) 中设置, PoCallDriver 检查另一个浪涌 IRP 是否已处于活动状态。 如果是这样, PoCallDriver 在上一个 IRP 完成后将当前 IRP 排队进行处理,然后返回STATUS_PENDING。 有关浪涌 IRP 的详细信息,请参阅 为电源管理设置设备对象标志

如果 deviceObject的IRP_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 开始可用。
目标平台 通用
标头 wdm.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) MarkStartDevice (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