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:
- 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.
- 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.