リモート IDD 向けの IddCx 1.4 の更新

IddCx バージョン 1.4 の次の更新プログラムは、リモート間接ディスプレイ ドライバー (IDD) にのみ適用されます。

リモート IDD 開発者には、コンソールの IddCx 1.4 更新プログラムと、追加の更新プログラムの リモート ID も表示 されます。

リモート セッションのリモート IDD を宣言する

IDD は、 IDDCX_ADAPTER_CAPSIDDCX_ADAPTER_FLAGS_REMOTE_SESSION_DRIVERビットを設定することによって、リモート ID アダプターを成することを宣言します。IddCxAdapterInitAsync を呼び出すときの フラグフィールド。 OS は、リモート セッションに接続しているリモート デスクトップ スタックのために IDD が読み込まれているかどうかを追跡し、次の 2 つの場合に IddCxAdapterInitAsync 呼び出しに失敗します。

  1. IDD は、リモート セッションの OS リモート デスクトップ スタックによって作成されたデバイスの IDDCX_ADAPTER_FLAGS_REMOTE_SESSION_DRIVER を設定しませんでした
  2. OS リモート デスクトップ スタックによって作成されなかったデバイスの IDD セット IDDCX_ADAPTER_FLAGS_REMOTE_SESSION_DRIVER

リモート ID のインストールに関する推奨事項

UMDF を使用すると、ドライバーは、UmdfHostProcessSharing や DeviceGroupId などのディレクティブを使用して、INF ファイル内の デバイス プール オプション制御できます。 ロック競合の問題があるため、リモート ID では UmdfHostProcessSharing ディレクティブを ProcessSharingDisabled に設定し、 DeviceGroupId ディレクティブを削除することを強くお勧めします。 この設定により、各セッションのリモート IDD が独自のプロセスに含まれるよう構成されます。

リモート IDD の既存の IddCx 機能に関する追加の制限

IDDCX_ADAPTER_CAPSで IDDCX_ADAPTER_FLAGS_USE_SMALLEST_MODE を設定するには、 リモート ID が必要です。Flags フィールド。 これにより、仮想モードが使用されないことが保証されるため、スワップチェーンのサイズは常にデスクトップの解像度と一致します。 このフラグが設定されていない場合、IddCxAdapterInitAsync は失敗します。

リモート ID ではプログレッシブ ターゲット モードのみがサポートされるため、 IDDCX_TARGET_MODE。TargetVideoSignalInfo.targetVideoSignalInfo.scanLineOrderingDISPLAYCONFIG_SCANLINE_ORDERING_PROGRESSIVEに設定する必要があります。 この値が設定されていない場合、IddCxMonitorArrival は失敗します。

リモート セッションの表示構成を設定する

リモート ID はリモート セッション内のすべてのモニターを制御し、リモート セッションの表示構成はクライアントのモニターをミラーする必要があります。リモート IDD では、OS がリモート セッションで設定する表示構成を指定する機能が必要です。 この表示構成は、セッションがリモート セッションとして作成されるか、リモート セッションに移行されるときに設定する必要があります。

リモート IDD は、リモート セッション中に表示構成を次のいずれかに更新できます。

  • 現在のモニターの設定を変更する (デスクトップの位置、向き、物理サイズ、DPI の変更など)
  • IddCxMonitorArrival IddCxMonitorDeparture/を呼び出して、モニターの追加/削除後にデスクトップ構成を設定します。 リモート IDD は、コンソール IDD と同じ方法で IddCxMonitorArrivalIddCxMonitorDeparture を使用して、モニターの到着と出発について OS に通知します。

OS がモニターの到着、出発、およびデスクトップ構成の変更を処理するために使用するロジックを次に示します。 リモート セッションごとに、OS はリモート IDD によって提供される 1 つの現在のデスクトップ構成を格納します。 このデスクトップ構成は空になり、リモート IDD が IddCxDisplayConfigUpdateを正常に呼び出すたびに更新されます。

ドライバーが新しい表示構成を受け取ったとき

If all monitors in the new display configuration are present in the system
    If new display configuration is supported by driver (eg resolutions)
        Store new display configuration
        Set new display configuration (this will disable any active monitors
            that are not part of new configuration)

If all monitors in the new display config are not currently present in the system
    Store new display configuration
    Disable all active paths and wait for the correct set of monitors to arrive

モニターが削除されたとき

If removed monitor is not in the current display configuration
    Remove the monitor and do not change the current desktop configuration

If removed monitor is part of the current display configuration
    Remove the monitor
    Disable all active paths and wait for the correct set of monitors to arrive

モニターが到着したとき

If added monitor is not part of current display configuration
    Do not change the display configuration

If added monitor is part of the current display configuration
    If now all the monitors in the current display configurations are present
        Set the new display configuration

IddCxDisplayConfigUpdate を使用する方法 を示す簡単なシナリオを次に示します。

シナリオ 1: 2 つのモニターが接続された状態で新しいセッションが開始される

ドライバーアクション 現在の表示トポロジ 現在接続されているモニター 現在アクティブなモニター メモ
なし None なし セッション開始の構成
IddCxMonitorArrival(Mon1) なし Mon1 なし アクティブな表示構成がないため、何も変更されません
IddCxMonitorArrival(Mon2) なし Mon1、Mon2 なし 表示構成に変更はありません
IddCxDisplayConfigUpdate Mon1、Mon2 Mon1、Mon2 Mon1、Mon2 すべてのモニターが接続されている場合は、構成を設定します。

注: ドライバーは、同じ結果のモニターを追加する前に IddCxDisplayConfigUpdate を呼び出す可能性があります。

シナリオ 2: シナリオ 1 に 3 番目のモニターを追加してアクティブにする

ドライバーアクション 現在の表示トポロジ 現在接続されているモニター 現在アクティブなモニター メモ
IddCxMonitorArrival(Mon3) Mon1、Mon2 Mon1、Mon2、Mon3 Mon1、Mon2 表示構成を変更しない
IddCxDisplayConfigUpdate Mon1、Mon2、Mon3 Mon1、Mon2、Mon3 Mon1、Mon2、Mon3 新しい構成設定

シナリオ 3: アクティブな構成からモニターを削除する

ドライバーアクション 現在の表示トポロジ 現在接続されているモニター 現在アクティブなモニター メモ
Mon1、Mon2 Mon1、Mon2 Mon1、Mon2 構成の開始
IddCxDisplayConfigUpdate() Mon1 Mon1、Mon2 Mon1 最初に Mon1 のみを使用するように構成を変更する
IddCxMonitorDeparture(Mon2) Mon1 Mon1 Mon1

シナリオ 4: ドライバーが単一モードのみをサポートしている場合にパスのモードを変更する

ドライバーアクション 現在の表示トポロジ 現在接続されているモニター 現在アクティブなモニター メモ
Mon1 10x7、Mon2 19x10 Mon1、Mon2 Mon1、Mon2 構成の開始
IddCxMonitorUpdateModes(Mon1 は 16x9 をサポート) なし Mon1、Mon2 なし Mon1 のモード 一覧を 16 x 9 に更新しました
IddCxDisplayConfigUpdate() Mon1 16x9、Mon2 19x10 Mon1、Mon2 Mon1、Mon2 Mon1 の構成を 16 x 9 に設定する

IddCxDisplayConfigUpdate エラーの処理

リモート ドライバーは、 IddCxDisplayConfigUpdateからのエラーを処理する必要があります。 一部のエラーが予想されます。たとえば、接続が一時的なセッションを使用していた場合などです。

初期構成で予期しない場合、ドライバーには次のようなオプションがあります。

  • IddCxReportCriticalError を呼び出 してドライバー プロセスを終了し、ユーザー セッションを切断します。 ドライバーは一意のメジャー/マイナーの組み合わせを使用して、クラッシュや Watson レポートでこれらのケースを識別できるようにすることをお勧めします。
  • 一時的なエラーが発生した場合は、構成をもう一度やり直してください。
  • 別の構成を試してください。

リモート ドライバーは、セッション途中の構成変更エラーが初期構成エラーほど重要でないと判断する場合があるため、 IddCxReportCriticalError をセッション途中で呼び出さない可能性があります。

ターゲット セッションが切断されているか、そのセッションの IddCx アダプターが停止していることを OS が検出した結果として IddCxDisplayConfigUpdateSTATUS_GRAPHICS_INDIRECT_DISPLAY_DEVICE_STOPPED を返す場合、ドライバーは IddCxReportCriticalError を呼び出さないでください。これは想定されているためです。

間接表示リモート セッションで API の変更を表示する

リモート XDDM セッションでは、OS 表示コントロール・パネルは、表示構成を変更するためのコントロールをユーザーに提供しません。 これは主に、リモート セッション デスクトップの構成は、セッションで実行されているアプリケーションではなく、接続しているクライアント システムによって制御されるためです。 たとえば、Win + P プロジェクション ユーザー インターフェイスをサポートすることは、リモート セッションでは意味がありません。

一般に、リモート ID セッションの場合:

  • QueryDisplayConfig を含む 列挙 API の機能を表示する
  • 表示設定 API は機能しません。 たとえば、リモート セッションで実行されているアプリケーションが ChangeDisplay設定/SetDisplayConfig を呼び出してデスクトップの構成を変更することは望ましくありません (デスクトップの位置やトポロジの変更など)。

興味深いことに、リモート XDDM ソリューションでは ChangeDisplaySetting を使用してモードとデスクトップの位置を変更します。これは、クライアントからの変更を適用する唯一の方法です。 リモート ID ソリューションには IddCxDisplayConfigUpdate 機能があるため、 ChangeDisplaySetting はリモート ID セッションで機能する必要がなくなりました。

次の表に、XDDM リモート セッションと WDDM リモート セッションの API と表示コントロール パネル (CPL) 機能を示します。

API/CPL XDDM リモート セッション WDDM リモート セッション
CPL の表示 情報は表示されておらず、「表示設定はリモート・セッションから変更できません」というメッセージが発行されます。 XDDM リモート セッションと同じ動作。
Win + P UI と機能 UI が表示されず、API が失敗します。 XDDM リモート セッションと同じ動作。
レガシ表示列挙型 API (EnumDisplay設定 & EnumDisplayDevices など) API は期待どおりに動作し、関連情報を返します。 XDDM リモート セッションと同じ動作。
従来の ChangeDisplaySetting 動作し、クライアントからのデスクトップの変更を反映するために使用されます。 アプリケーションの互換性の理由から成功を返しますが、呼び出しは無視され、表示構成は変更されません。 IDD は IddCxDisplayConfigUpdate を使用してデスクトップ構成を変更します。
QueryDisplayConfig 失敗。 期待どおりに動作します。
DisplayConfigGetDeviceInfo 失敗。 期待される情報を動作させ、報告します。
SetDisplayConfig と DisplayConfigSetDeviceInfo 失敗。 XDDM リモート セッションと同じ動作。

ID リモート セッションでのアイドル動作の監視

プロトコル スタックが IWRdsProtocolConnectionCallback::StopScreen更新 を呼び出してクライアント画面の更新を停止すると、OS によってスワップチェーンが破棄され、そのセッションのすべてのパスが非アクティブになり、IDDの EVT_IDD_CX_ADAPTER_COMMIT_MODES コールバックが IDDCX_PATH設定IDDCX_PATH_FLAGS_NONE呼び出されます。すべてのパスのフラグ

プロトコル スタックが IWRdsProtocolConnectionCallback::RedrawWindow を呼び出して更新を再度有効にすると、OS は IDD の EVT_IDD_CX_ADAPTER_COMMIT_MODES コールバックを使用して新しいアクティブ パスを設定し、新しいスワップチェーンが作成されます。

ID リモート セッションでの切断動作

ユーザーがリモート セッションから切断すると、OS は、そのセッションのリモート ID デバイスをホストしている開発ノードを破棄し、そのセッションのリモート ID アダプターが PnpStopped になります。 UMDF は、リモート IDD の EVT_WDF_DEVICE_D0_EXIT コールバックを呼び出します。

セッションが再びリモートに接続されている場合、OS は、そのセッションのリモート IDD 用の新しい devnode を作成します。 リモート IDD は、通常の起動シーケンスをもう一度実行し、アダプターを初期化してからモニターを追加する必要があります。