Freigeben über


IddCx 1.4-Updates für Remote-IDDs

Die folgenden Updates von IddCx Version 1.4 gelten nur für Indirekte Remoteanzeigetreiber (IDDs).

Remote-IDD-Entwickler sollten auch IddCx 1.4-Updates für Konsolen- und Remote-IDDs für zusätzliche Updates sehen.

Deklarieren einer Remote-IDD für Remotesitzungen

Eine IDD deklariert, dass sie einen Remote-ID-Adapter erstellen möchte, indem sie das IDDCX_ADAPTER_FLAGS_REMOTE_SESSION_DRIVER Bit im IDDCX_ADAPTER_CAPS festlegt. Flags-Feld beim Aufrufen von IddCxAdapterInitAsync. Das Betriebssystem verfolgt nach, ob die IDD geladen wird, weil der Remotedesktopstapel eine Verbindung mit einer Remotesitzung herstellt. In den folgenden beiden Fällen schlägt der IddCxAdapterInitAsync-Aufruf fehl:

  1. Die IDD hat nicht IDDCX_ADAPTER_FLAGS_REMOTE_SESSION_DRIVER für ein Gerät festgelegt, das vom Remotedesktopstapel des Betriebssystems für eine Remotesitzung erstellt wurde.
  2. Der IDD-Satz IDDCX_ADAPTER_FLAGS_REMOTE_SESSION_DRIVER für ein Gerät, das nicht vom Remotedesktopstapel des Betriebssystems erstellt wurde

Installationsempfehlungen für Remote-IDDs

UMDF ermöglicht Es Treibern, die Option Gerätepooling in ihren INF-Dateien mithilfe von Anweisungen wie UmdfHostProcessSharing und DeviceGroupId zu steuern. Aufgrund einiger Probleme mit sperrenden Konflikten wird dringend empfohlen, dass Remote-IDDs die UmdfHostProcessSharing-Anweisung auf ProcessSharingDisabled festlegen und alle DeviceGroupId-Anweisungen entfernen. Mit dieser Einstellung wird die Remote-IDD für jede Sitzung so konfiguriert, dass sie sich in einem eigenen Prozess befindet.

Zusätzliche Einschränkungen für vorhandene IddCx-Features für Remote-IDDs

Remote-IDDs sind erforderlich, um IDDCX_ADAPTER_FLAGS_USE_SMALLEST_MODE im IDDCX_ADAPTER_CAPS festzulegen. Feld "Flags". Dadurch wird sichergestellt, dass keine virtuellen Modi verwendet werden und daher die Swapchaingröße immer der Desktopauflösung entspricht. IddCxAdapterInitAsync schlägt fehl, wenn dieses Flag nicht festgelegt ist.

Nur progressive Zielmodi werden für Remote-IDDs unterstützt, daher IDDCX_TARGET_MODE. TargetVideoSignalInfo.targetVideoSignalInfo.scanLineOrdering muss auf DISPLAYCONFIG_SCANLINE_ORDERING_PROGRESSIVE festgelegt werden. IddCxMonitorArrival schlägt fehl, wenn dieser Wert nicht festgelegt ist.

Festlegen der Anzeigekonfiguration für die Remotesitzung

Da die Remote-IDDs alle Monitore in einer Remotesitzung steuern und die Konfiguration der Remotesitzungsanzeige die des Clients Spiegel sollte, muss eine Remote-IDD die Möglichkeit haben, die Anzeigekonfiguration anzugeben, die das Betriebssystem in der Remotesitzung festlegen wird. Diese Anzeigekonfiguration muss festgelegt werden, wenn die Sitzung entweder als Remotesitzung erstellt oder auf eine Remotesitzung umgestellt wird.

Die Remote-IDD kann die Anzeigekonfiguration während einer Remotesitzung auf folgendes aktualisieren:

  • Ändern der Einstellung für aktuelle Monitore (z. B. Ändern der Desktopposition, Ausrichtung, physische Größe oder DPI)
  • Legen Sie die Desktopkonfiguration fest, nachdem Monitore hinzugefügt/entfernt wurden, indem Sie IddCxMonitorArrival/IddCxMonitorDeparture aufrufen. Remote-IDDs verwenden IddCxMonitorArrival und IddCxMonitorDeparture auf die gleiche Weise wie Konsolen-IDDs, um das Betriebssystem über An- und Abflüge von Monitoren zu informieren.

Im Folgenden finden Sie die Logik, die das Betriebssystem verwendet, um Ankünfte, Abgänge und Desktopkonfigurationsänderungen zu überwachen. Für jede Remotesitzung speichert das Betriebssystem eine einzelne aktuelle Desktopkonfiguration, die von der Remote-IDD bereitgestellt wird. Diese Desktopkonfiguration beginnt leer und wird jedes Mal aktualisiert, wenn eine Remote-IDD erfolgreich IddCxDisplayConfigUpdate aufruft.

Wenn der Treiber eine neue Anzeigekonfiguration erhält

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

Wenn ein Monitor entfernt wird

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

Wenn ein Monitor eintrifft

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

Im Folgenden finden Sie einige einfache Szenarien, um zu veranschaulichen, wie IddCxDisplayConfigUpdate verwendet werden kann.

Szenario 1: Eine neue Sitzung beginnt mit zwei angeschlossenen Monitoren

Treiberaktion Aktuelle Anzeigetopologie Aktuell verbundener Monitor Derzeit aktive Monitore Hinweise
Keine Keine Keine Konfiguration des Sitzungsstarts
IddCxMonitorArrival(Mon1) Keine Mon1 Keine Keine aktive Anzeigekonfiguration, sodass sich nichts ändert
IddCxMonitorArrival(Mon2) Keine Mon1, Mon2 Keine Weiterhin keine Änderung in der Anzeigekonfiguration
IddCxDisplayConfigUpdate Mon1, Mon2 Mon1, Mon2 Mon1, Mon2 Wenn alle Monitore verbunden sind, legen Sie die Konfiguration fest.

HINWEIS: Der Treiber könnte IddCxDisplayConfigUpdate aufgerufen haben, bevor er die Monitore für dasselbe Ergebnis hinzugefügt hat.

Szenario 2: Hinzufügen eines dritten Monitors zu Szenario 1 und aktivieren

Treiberaktion Aktuelle Anzeigetopologie Aktuell verbundener Monitor Derzeit aktive Monitore Hinweise
IddCxMonitorArrival(Mon3) Mon1, Mon2 Mon1, Mon2, Mon3 Mon1, Mon2 Keine Änderung der Anzeigekonfiguration
IddCxDisplayConfigUpdate Mon1, Mon2, Mon3 Mon1, Mon2, Mon3 Mon1, Mon2, Mon3 Neuer Konfigurationssatz

Szenario 3: Entfernen eines Monitors aus einer aktiven Konfiguration

Treiberaktion Aktuelle Anzeigetopologie Aktuell verbundener Monitor Derzeit aktive Monitore Hinweise
Mon1, Mon2 Mon1, Mon2 Mon1, Mon2 Starten der Konfiguration
IddCxDisplayConfigUpdate() Mon1 Mon1, Mon2 Mon1 Ändern der Konfiguration, um zuerst nur Mon1 zu verwenden
IddCxMonitorDeparture(Mon2) Mon1 Mon1 Mon1

Szenario 4: Ändern des Pfadmodus, wenn der Treiber nur einen einzelnen Modus unterstützt

Treiberaktion Aktuelle Anzeigetopologie Aktuell verbundener Monitor Derzeit aktive Monitore Hinweise
Mon1 10x7 , Mon2 19x10 Mon1, Mon2 Mon1, Mon2 Starten der Konfiguration
IddCxMonitorUpdateModes(Mon1 unterstützt 16x9) Keine Mon1, Mon2 Keine Aktualisierte Modusliste für Mon1 auf 16x9
IddCxDisplayConfigUpdate() Mo1 16x9, Mo2 19x10 Mon1, Mon2 Mon1, Mon2 Festlegen der Konfiguration für Mon1 auf 16x9

Behandeln von IddCxDisplayConfigUpdate-Fehlern

Der Remotetreiber muss Fehler von IddCxDisplayConfigUpdate behandeln. Einige Fehler werden erwartet. beispielsweise, wenn die Verbindung eine temporäre Sitzung verwendet hat.

In unerwarteten Fällen in der Erstkonfiguration verfügt der Treiber über Folgende Optionen:

  • Rufen Sie IddCxReportCriticalError auf, um den Treiberprozess zu beenden und die Benutzersitzung zu trennen. Es wird empfohlen, dass der Treiber eine eindeutige Haupt-/Nebenkombination verwendet, damit diese Fälle in Abstürze und Watson-Berichten identifiziert werden können.
  • Wiederholen Sie die Konfiguration für den Fall, dass es sich um einen vorübergehenden Fehler handelt.
  • Probieren Sie eine andere Konfiguration aus.

Ein Remotetreiber entscheidet möglicherweise, dass Fehler bei Konfigurationsänderungen während der Sitzung nicht so wichtig sind wie Fehler bei der anfänglichen Konfiguration, sodass iddCxReportCriticalError während der Sitzung niemals aufgerufen wird.

Der Treiber sollte IddCxReportCriticalError nicht aufrufen, wenn IddCxDisplayConfigUpdate STATUS_GRAPHICS_INDIRECT_DISPLAY_DEVICE_STOPPED zurückgibt, da das Betriebssystem erkennt, dass die Zielsitzung getrennt wird oder der IddCx-Adapter für diese Sitzung beendet wird, da dies erwartet wird.

Anzeigen von API-Änderungen in einer indirekten Anzeige-Remotesitzung

In einer XDDM-Remotesitzung stellt die Systemsteuerung der Betriebssystemanzeige dem Benutzer keine Steuerelemente zum Ändern der Anzeigekonfiguration bereit. Dies liegt in erster Linie daran, dass die Konfiguration des Remotesitzungsdesktops vom Clientsystem gesteuert wird, das eine Verbindung herstellt, und nicht von Anwendungen, die in der Sitzung ausgeführt werden. Beispielsweise ist die Unterstützung der Win+P-Projektions-Benutzeroberfläche in einer Remotesitzung nicht sinnvoll.

Im Allgemeinen für Remote-ID-Sitzungen:

  • Anzeigen von Enumerations-APIs funktionieren, einschließlich QueryDisplayConfig
  • Anzeigeeinstellungs-APIs funktionieren nicht. Beispielsweise ist es nicht wünschenswert, dass eine Anwendung, die in der Remotesitzung ausgeführt wird, ChangeDisplaySettingsSetDisplayConfig aufruft/, um die Desktopkonfiguration zu ändern (z. B. die Desktopposition oder -topologie ändern).

Interessanterweise verwenden XDDM-Remotelösungen ChangeDisplaySetting , um Modi und Desktoppositionen zu ändern, da dies die einzige Möglichkeit ist, Änderungen vom Client anzuwenden. Da Remote-ID-Lösungen über die IddCxDisplayConfigUpdate-Funktionalität verfügen, ist ChangeDisplaySetting nicht mehr erforderlich, um in Remote-ID-Sitzungen zu funktionieren.

In der folgenden Tabelle sind die APIs und CPL-Funktionen (Display Control Panel) in einer XDDM-Remotesitzung und einer WDDM-Remotesitzung aufgeführt.

API/CPL XDDM-Remotesitzung WDDM-Remotesitzung
Anzeigen der CPL Es werden keine Informationen angezeigt, und es wird eine Meldung ausgegeben, die besagt, dass die Anzeigeeinstellungen von einer Remotesitzung nicht geändert werden können. Dasselbe Verhalten wie eine XDDM-Remotesitzung.
Win+P-Benutzeroberfläche und -Funktionalität Die Benutzeroberfläche wird nicht angezeigt, und die API schlägt fehl. Dasselbe Verhalten wie eine XDDM-Remotesitzung.
Ältere Anzeige-Enumerations-APIs (z. B. EnumDisplaySettings & EnumDisplayDevices) Die API funktioniert wie erwartet und gibt relevante Informationen zurück. Dasselbe Verhalten wie eine XDDM-Remotesitzung.
Legacy ChangeDisplaySetting Funktioniert und wird verwendet, um Desktopänderungen vom Client widerzuspiegeln. Gibt aus Gründen der Anwendungskompatibilität Erfolg zurück, ignoriert jedoch den Aufruf und ändert keine Anzeigekonfiguration. Die IDD verwendet IddCxDisplayConfigUpdate , um die Desktopkonfiguration zu ändern.
QueryDisplayConfig Fehlschlägt. Funktioniert wie erwartet.
DisplayConfigGetDeviceInfo Fehlschlägt. Funktioniert und meldet die erwarteten Informationen.
SetDisplayConfig und DisplayConfigSetDeviceInfo Fehlschlägt. Dasselbe Verhalten wie eine XDDM-Remotesitzung.

Überwachen des Leerlaufverhaltens in einer ID-Remotesitzung

Wenn der Protokollstapel IWRdsProtocolConnectionCallback::StopScreenUpdates aufruft, um die Aktualisierung des Clientbildschirms zu beenden, zerstört das Betriebssystem die Swapchains und macht alle Pfade für diese Sitzung inaktiv, was dazu führt, dass der EVT_IDD_CX_ADAPTER_COMMIT_MODES Rückruf der IDD aufgerufen wird, wobei IDDCX_PATH_FLAGS_NONE in IDDCX_PATH festgelegt ist. Flags für alle Pfade.

Wenn der Protokollstapel IWRdsProtocolConnectionCallback::RedrawWindow aufruft, um Updates erneut zu aktivieren, legt das Betriebssystem mithilfe des EVT_IDD_CX_ADAPTER_COMMIT_MODES Rückrufs der IDD neue aktive Pfade fest, und neue Swapchains werden erstellt.

Trennungsverhalten in einer ID-Remotesitzung

Wenn der Benutzer die Verbindung mit einer Remotesitzung trennt, zerstört das Betriebssystem den Devnode, der das Remote-ID-Gerät für diese Sitzung hostet, was dazu führt, dass der Remote-ID-Adapter für diese Sitzung PnpStopped wird. UMDF ruft den EVT_WDF_DEVICE_D0_EXIT Rückruf der Remote-IDD auf.

Wenn die Sitzung erneut remote mit verbunden ist, erstellt das Betriebssystem einen neuen Devnode für die Remote-IDD für diese Sitzung. Die Remote-IDD sollte die normale Startsequenz erneut durchlaufen, den Adapter initialisieren und dann Monitore hinzufügen usw.