UrsSetPoHandle 関数 (ursdevice.h)

電源管理フレームワーク (PoFx) を使用して、クライアント ドライバーの登録を登録および削除します。

構文

void UrsSetPoHandle(
  [in] WDFDEVICE Device,
  [in] POHANDLE  PoHandle
);

パラメーター

[in] Device

WdfDeviceCreate の前回の呼び出しでクライアント ドライバーが取得したフレームワーク デバイス オブジェクトへのハンドル。

[in] PoHandle

PoFx を使用したデバイスの登録を表すハンドル。 クライアント ドライバーは、 EvtDeviceWdmPostPoFxRegisterDevice および EvtDeviceWdmPrePoFxUnregisterDevice コールバック関数の WDF からこのハンドルを受け取ります。

戻り値

なし

解説

デュアルロール コントローラーのクライアント ドライバーは、電源ポリシー所有者である必要があります。 ドライバーは、電源管理フレームワーク (PoFx) から通知を受け取ることができます。 これを行うには、 UrsDeviceInitialize を呼び出した後、ドライバーは PoFx コールバック関数を登録する必要があります。 クライアント ドライバーは、デバイスを電源フレームワークに直接登録するか、 EvtDeviceWdmPostPoFxRegisterDevice の WDF から POHANDLE を取得します。 登録が成功すると、ドライバーは USB デュアルロール クラス拡張機能へのハンドルを提供します。

EvtDeviceWdmPostPoFxRegisterDevice コールバック関数のクライアント ドライバーの実装では、ドライバーは、受信したハンドルを渡すことによって UrsSetPoHandle を呼び出すことが期待されます。 一部のプラットフォームでは、クラス拡張機能で POHANDLE を使用してコントローラーの電源管理を行う場合があります。 逆に、クラス拡張機能が電源フレームワークへの登録を削除する前に、クライアント ドライバーの EvtDeviceWdmPrePoFxUnregisterDevice 実装を 呼び出します。 ドライバーは、PoHandle 値として NULL を渡すことによって UrsSetPoHandle を呼び出すことが想定されています。



EVT_WDFDEVICE_WDM_POST_PO_FX_REGISTER_DEVICE EvtDevicePostPoFxRegister;

EVT_WDFDEVICE_WDM_PRE_PO_FX_UNREGISTER_DEVICE EvtDevicePrePoFxUnregister;


EvtDriverDeviceAdd (
    _In_ WDFDRIVER Driver,
    _Inout_ PWDFDEVICE_INIT DeviceInit
    )
{
...

    WDFDEVICE device;
    NTSTATUS status;
...

    WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS idleSettings;
    WDF_POWER_FRAMEWORK_SETTINGS poFxSettings;
...
 
    TRY {

        WDF_POWER_FRAMEWORK_SETTINGS_INIT(&poFxSettings);
        poFxSettings.EvtDeviceWdmPostPoFxRegisterDevice = EvtDevicePostPoFxRegister;
        poFxSettings.EvtDeviceWdmPrePoFxUnregisterDevice = EvtDevicePrePoFxUnregister;

        status = WdfDeviceWdmAssignPowerFrameworkSettings(device, &poFxSettings);
        if (!NT_SUCCESS(status)) {
            // WdfDeviceWdmAssignPowerFrameworkSettings failed.

        }

        WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS_INIT(&idleSettings, IdleCannotWakeFromS0);
        idleSettings.IdleTimeoutType = SystemManagedIdleTimeout;

        status = WdfDeviceAssignS0IdleSettings(device, &idleSettings);
        if (!NT_SUCCESS(status)) {
            // WdfDeviceAssignS0IdleSettings failed.

        }

    } FINALLY {
    }

..

}

NTSTATUS
EvtDevicePostPoFxRegister (
    _In_ WDFDEVICE Device,
    _In_ POHANDLE PoHandle
    )
{
    UrsSetPoHandle(Device, PoHandle);

    return STATUS_SUCCESS;
}


VOID
EvtDevicePrePoFxUnregister (
    _In_ WDFDEVICE Device,
    _In_ POHANDLE PoHandle
    )
{
    UNREFERENCED_PARAMETER(PoHandle);

    UrsSetPoHandle(Device, NULL);
}

要件

要件
サポートされている最小のクライアント Windows 10
サポートされている最小のサーバー Windows Server 2016
対象プラットフォーム Windows
最小 KMDF バージョン 1.15
Header ursdevice.h (Urscx.h を含む)
Library Urscxstub.lib
IRQL PASSIVE_LEVEL

こちらもご覧ください

EvtDeviceWdmPostPoFxRegisterDevice

EvtDeviceWdmPrePoFxUnregisterDevice