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 以降では、ドライバーは PoCallDriver ではなく IoCallDriver を呼び出して、次の下位ドライバーに電源 IRP を渡す必要があります。 ただし、Windows Server 2003、Windows XP、および Windows 2000 では、次の下位ドライバーに電源 IRP を渡すために、ドライバーは IoCallDriver ではなく PoCallDriver を呼び出す必要があります。 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 は 1 つだけです。 突入電流を必要とするデバイスに対して電源投入 IRP を渡す場合 (つまり、DO_POWER_INRUSH フラグはデバイス オブジェクトで設定されます)、 PoCallDriver は別の突入 IRP が既にアクティブかどうかを確認します。 その場合、 PoCallDriver は、前の IRP の完了後に処理するために現在の IRP をキューに入れ、STATUS_PENDINGを返します。 突入 IRP の詳細については、「 Power Management のデバイス オブジェクト フラグの設定」を参照してください。

IRP_MN_SET_POWERまたはIRP_MN_QUERY_POWER要求が DeviceObject に対して既にアクティブになっている場合、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 以降で使用できます。
対象プラットフォーム ユニバーサル
Header 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)HwStorPortProhibitedDDDIs(storport)IoAllocateForward(wdm)IoAllocateIrpSignalEventInCompletionTimeout(wdm)IoBuildDeviceControlWait(wdm)、、 IoBuildDeviceControlWaitTimeout(wdm), IoBuildFsdForward(wdm), IoBuildSynchronousFsdRequestWait(wdm), IoBuildSynchronousFsdRequestWaitTimeout(wdm)IoSetCompletionRoutineExCheck(wdm)IrpProcessingComplete(wdm)LowerDriverReturn(wdm)MarkDevicePower(wdm)MarkingQueuedIrps(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