次の方法で共有


コールバック関数DXGKDDI_NOTIFY_SURPRISE_REMOVAL (dispmprt.h)

DXGKDDI_NOTIFY_SURPRISE_REMOVAL は、ユーザーがシステムに通知せずに外部ディスプレイ デバイスを切断したときに、オペレーティング システムによって呼び出されます。

構文

DXGKDDI_NOTIFY_SURPRISE_REMOVAL DxgkddiNotifySurpriseRemoval;

NTSTATUS DxgkddiNotifySurpriseRemoval(
  [in] PVOID MiniportDeviceContext,
  [in] DXGK_SURPRISE_REMOVAL_TYPE RemovalType
)
{...}

パラメーター

[in] MiniportDeviceContext

ディスプレイ アダプターに関連付けられているコンテキスト ブロックへのハンドル。 ディスプレイ ミニポート ドライバーの DxgkDdiAddDevice 関数は、以前に DirectX グラフィックス カーネル サブシステムにこのハンドルを提供しました。

[in] RemovalType

突然の削除イベントの種類を識別する DXGK_SURPRISE_REMOVAL_TYPE 型の値。

戻り値

RemovalType = DxgkRemovalHibernation のソフトウェア リソースがクリーンアップされた場合のSTATUS_SUCCESSを返します。 ドライバーが代わりにエラー コードを返す場合、オペレーティング システムは、次の「備考」セクションで説明するように、システムの再起動を試みます。

注釈

このコールバックは、必要に応じて、Windows ディスプレイ ドライバー モデル (WDDM) 1.2 以降のディスプレイ ミニポート ドライバーによって実装できます。

注意

オペレーティング システムは、ディスプレイ ミニポート ドライバーが、DXGK_DRIVERCAPS構造体の SupportSurpriseRemovalInHibernation メンバーを 1 に設定してサポートを示している場合にのみ、DxgkDdiNotifySurpriseRemoval を呼び出します。

OS が突然の削除を検出すると、可能な限り迅速にドライバーに通知されます。 DxgkDdiNotifySurpriseRemovalレベル 0 の DDI 関数です。つまり、ドライバーに保留中の GPU ワークロードがある場合や、他の DDI 関数内で実行されている場合に呼び出すことができます。 この関数を呼び出すと、グラフィックス ハードウェアが物理的に削除されたか、システムから消失したことが示されるため、ハードウェアにアクセスしようとすると、ハード ハングなどの問題が発生する可能性があります。

OS は、驚きの削除を次のように分類します。

  • 驚きの削除は、システムとグラフィックス デバイスがスリープや休止状態などの低電力状態にある場合に発生します。 OS が低電力状態から再開されると、この突然の削除が検出され、すぐにドライバーの DxgkDdiNotifySurpriseRemoval コールバックが RemovalType = DxgkRemovalHibernation で呼び出されます。 この場合、保留中の GPU 作業や DDI 呼び出しは発生しない可能性があるため、ドライバーが処理するのは比較的安全で簡単である必要があります。 戻り状態の詳細は次のとおりです。

    • OS は、ドライバーが DxgkDdiNotifySurpriseRemoval 呼び出しを正しく処理し、STATUS_SUCCESSを返す必要 があります
    • 削除されたグラフィックス デバイスが電源オンセルフテスト (POST) デバイスの場合、OS は、返された状態に関係なく、システムを正常に再起動しようとします。
    • POST 以外のデバイスの場合、ドライバーが呼び出しに失敗し、そのDXGK_DRIVERCAPSSupportSurpriseRemovalInHibernation のみがサポートされている場合、OS はシステムを正常に再起動します。 DXGK_DRIVERCAPSSupportSurpriseRemoval がサポートされている場合、OS は戻り状態を無視し、グラフィックス デバイスの停止を続行します。 以下のその他のリターン ノートを参照してください。
  • グラフィックス デバイスは、実行中に突然取り外されたり取り外されたりします。 OS は、この種類の突然の削除を検出すると、すぐにドライバーの DxgkDdiNotifySurpriseRemoval コールバックを RemovalType = DxgkRemovalPnPNotify で呼び出します。 この場合も、保留中の GPU 作業または DDI 呼び出しが完了する可能性があります。 ドライバーがこの通知を受け取り、この突然の削除を処理できる場合、ドライバーは、ハードウェアへのアクセスを回避するために、このデバイスを独自のデバイス コンテキストで突然の削除としてすぐにマークし、OS にSTATUS_SUCCESS戻す必要があります。 OS は引き続き他の DDI 関数を呼び出してリソースをクリーンし、グラフィックス デバイスを停止します。 以下に示すように、ドライバーはソフトウェア リソースを解放またはクリーンする必要があり、これらの DDI 呼び出しでハードウェアに触れたり、ハードウェアにアクセスしたりすることはできません。 ドライバーがこの突然の削除を処理できない場合は、OS に適切なエラーを返す必要があります。 障害が発生した場合、OS はシステムを直ちにバグチェックして、それ以上のハードウェアまたはデータの損傷を回避します。

ディスプレイ ミニポート ドライバーが STATUS_SUCCESSを返す場合、DirectX グラフィックス カーネル サブシステムは引き続きグラフィックス スタックから外部ディスプレイ アダプターを削除し、他のドライバー実装 DxgkDdiXxx カーネル モード関数を呼び出してすべてのリソースを解放します。 この場合、ドライバーはオペレーティング システムからの呼び出しに応じてソフトウェア リソースのクリーンアップを完了する必要がありますが、ハードウェア設定に触れたりクリーンしたりすることはできません。 他のハードウェアがドライバーを使用していない場合、オペレーティング システムはドライバーをアンロードします。

ドライバーがエラー コードを返す場合、 は DXGK_DRIVERCAPSを設定しません。SupportSurpriseRemovalInHibernation、またはこの関数を実装していない場合、DirectX グラフィックス カーネル サブシステムはドライバーによって実装された DxgkDdiXxx 関数をこれ以上呼び出さないため、システムの再起動を試みます。 この場合、外部ディスプレイ・デバイスが切断される前に割り振られたリソースは解放されません。

要件

要件
サポートされている最小のクライアント Windows 8
サポートされている最小のサーバー Windows Server 2012
対象プラットフォーム デスクトップ
Header dispmprt.h
IRQL PASSIVE_LEVEL

こちらもご覧ください

D3DKMT_WDDM_1_2_CAPS

DXGK_DRIVERCAPS

DXGK_SURPRISE_REMOVAL_TYPE

DxgkDdiAddDevice