Mises à jour d’IddCx 1.4 pour les IDD distants
Les mises à jour suivantes d’IddCx version 1.4 s’appliquent uniquement aux pilotes d’affichage indirect (IDD) distants.
Les développeurs d’IDD distants doivent également voir les mises à jour IddCx 1.4 pour la console et les IDD distants pour les mises à jour supplémentaires.
Déclarer un IDD distant pour les sessions à distance
Un IDD déclare qu’il souhaite créer un adaptateur d’ID distant en définissant le bit IDDCX_ADAPTER_FLAGS_REMOTE_SESSION_DRIVER dans le IDDCX_ADAPTER_CAPS. Champ Indicateurs lors de l’appel d’IddCxAdapterInitAsync. Le système d’exploitation effectue le suivi du chargement de l’IDD en raison de la connexion de la pile bureau à distance à une session à distance et échoue à l’appel IddCxAdapterInitAsync dans les deux cas suivants :
- L’IDD n’a pas défini IDDCX_ADAPTER_FLAGS_REMOTE_SESSION_DRIVER pour un appareil créé par la pile Bureau à distance du système d’exploitation pour une session à distance
- Le jeu IDD IDDCX_ADAPTER_FLAGS_REMOTE_SESSION_DRIVER pour un appareil qui n’a pas été créé par la pile Bureau à distance du système d’exploitation
Recommandations d’installation pour les IDD distants
UMDF permet aux pilotes de contrôler l’option de regroupement de périphériques dans leurs fichiers INF, à l’aide de directives telles que UmdfHostProcessSharing et DeviceGroupId. En raison de certains problèmes de contention de verrou, il est vivement recommandé que les IDD distants définissent la directive UmdfHostProcessSharing sur ProcessSharingDisabled et suppriment toutes les directives DeviceGroupId . Ce paramètre configure l’IDD distant pour que chaque session soit dans son propre processus.
Restrictions supplémentaires sur les fonctionnalités IddCx existantes pour les IDD distants
Des IDD distants sont nécessaires pour définir IDDCX_ADAPTER_FLAGS_USE_SMALLEST_MODE dans le IDDCX_ADAPTER_CAPS. Champ Indicateurs . Cela garantit que les modes virtuels ne sont pas utilisés et que, par conséquent, la taille de la chaîne d’échange correspondra toujours à la résolution du bureau. IddCxAdapterInitAsync échoue si cet indicateur n’est pas défini.
Seuls les modes cibles progressifs sont pris en charge pour les IDD distants, donc IDDCX_TARGET_MODE. TargetVideoSignalInfo.targetVideoSignalInfo.scanLineOrdering doit être défini sur DISPLAYCONFIG_SCANLINE_ORDERING_PROGRESSIVE. IddCxMonitorArrival échoue si cette valeur n’est pas définie.
Définir la configuration d’affichage pour la session à distance
Comme les IDD distants contrôlent tous les moniteurs d’une session à distance et que la configuration d’affichage de session à distance doit miroir celle du client, un IDD distant doit pouvoir spécifier la configuration d’affichage que le système d’exploitation définira dans la session à distance. Cette configuration d’affichage doit être définie lorsque la session est créée en tant que session à distance ou transférée vers une session à distance.
L’IDD distant peut mettre à jour la configuration d’affichage pendant une session à distance sur :
- Modifier le paramètre des moniteurs actuels (par exemple, modifier la position du bureau, l’orientation, la taille physique ou ppp)
- Définissez la configuration du bureau après l’ajout/la suppression des moniteurs, en appelant IddCxMonitorArrival/IddCxMonitorDeparture. Les IDD distants utilisent IddCxMonitorArrival et IddCxMonitorDeparture de la même façon que les IDD de console pour informer le système d’exploitation des arrivées et des départs de la surveillance.
Voici la logique que le système d’exploitation utilise pour traiter les arrivées, les départs et les modifications de configuration du bureau. Pour chaque session à distance, le système d’exploitation stocke une seule configuration de bureau actuelle fournie par l’IDD distant. Cette configuration du bureau démarre vide et est mise à jour chaque fois qu’un IDD distant appelle correctement IddCxDisplayConfigUpdate.
Quand le pilote reçoit une nouvelle configuration d’affichage
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
Lorsqu’un moniteur est supprimé
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
Quand un moniteur 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
Voici quelques scénarios simples pour illustrer comment IddCxDisplayConfigUpdate peut être utilisé.
Scénario 1 : Une nouvelle session commence avec deux moniteurs connectés
Action du pilote | Topologie d’affichage actuelle | Moniteur actuellement connecté | Moniteurs actifs | Notes |
---|---|---|---|---|
None | None | None | Configuration du démarrage de session | |
IddCxMonitorArrival(Mon1) | None | Lun1 | None | Aucune configuration d’affichage active, donc rien ne change |
IddCxMonitorArrival(Mon2) | None | Mon1, Mon2 | None | Toujours aucune modification dans la configuration de l’affichage |
IddCxDisplayConfigUpdate | Mon1, Mon2 | Mon1, Mon2 | Mon1, Mon2 | Comme tous les moniteurs sont connectés, définissez la configuration |
REMARQUE : Le pilote a pu appeler IddCxDisplayConfigUpdate avant d’ajouter les moniteurs pour le même résultat.
Scénario 2 : Ajouter un troisième moniteur au scénario 1 et le rendre actif
Action du pilote | Topologie d’affichage actuelle | Moniteur actuellement connecté | Moniteurs actifs | Notes |
---|---|---|---|---|
IddCxMonitorArrival(Mon3) | Mon1, Mon2 | Mon1, Mon2, Mon3 | Mon1, Mon2 | Aucune modification de la configuration d’affichage |
IddCxDisplayConfigUpdate | Mon1, Mon2, Mon3 | Mon1, Mon2, Mon3 | Mon1, Mon2, Mon3 | Nouveau jeu de configuration |
Scénario 3 : Supprimer un moniteur d’une configuration active
Action du pilote | Topologie d’affichage actuelle | Moniteur actuellement connecté | Moniteurs actifs | Notes |
---|---|---|---|---|
Mon1, Mon2 | Mon1, Mon2 | Mon1, Mon2 | Configuration de démarrage | |
IddCxDisplayConfigUpdate() | Lun1 | Mon1, Mon2 | Lun1 | Modifier la configuration pour utiliser Mon1 uniquement en premier |
IddCxMonitorDeparture(Mon2) | Lun1 | Lun1 | Lun1 |
Scénario 4 : Modification du mode d’un chemin lorsque le pilote ne prend en charge qu’un seul mode
Action du pilote | Topologie d’affichage actuelle | Moniteur actuellement connecté | Moniteurs actuellement actifs | Notes |
---|---|---|---|---|
Mon1 10x7 , Mon2 19x10 | Mon1, Mon2 | Mon1, Mon2 | Configuration de démarrage | |
IddCxMonitorUpdateModes(Mon1 prend en charge 16x9) | None | Mon1, Mon2 | None | Mise à jour de la liste des modes mon1 à 16x9 |
IddCxDisplayConfigUpdate() | Mon1 16x9, Mon2 19x10 | Mon1, Mon2 | Mon1, Mon2 | Définir la configuration pour Mon1 sur 16x9 |
Gestion des erreurs IddCxDisplayConfigUpdate
Le pilote distant doit gérer les erreurs d’IddCxDisplayConfigUpdate. Certaines erreurs sont attendues ; par exemple, lorsque la connexion utilisait une session temporaire.
Dans les cas inattendus de la configuration initiale, le pilote dispose d’options telles que :
- Appelez IddCxReportCriticalError pour arrêter le processus de pilote et déconnecter la session utilisateur. Il est recommandé que le pilote utilise une combinaison unique majeure/mineure afin que ces cas puissent être identifiés dans les rapports d’incidents et Watson.
- Réessayez la configuration au cas où il s’agissait d’une erreur temporaire.
- Essayez une autre configuration.
Un pilote distant peut décider que les échecs de modification de configuration de mi-session ne sont pas aussi critiques que les échecs de configuration initiale, et par conséquent, il peut ne jamais appeler IddCxReportCriticalError en mi-session.
Le pilote ne doit pas appeler IddCxReportCriticalError si IddCxDisplayConfigUpdate retourne STATUS_GRAPHICS_INDIRECT_DISPLAY_DEVICE_STOPPED à la suite de la détection par le système d’exploitation que la session cible est déconnectée ou que l’adaptateur IddCx de cette session est arrêté, car cela est attendu.
Afficher les modifications de l’API dans une session distante d’affichage indirect
Dans une session XDDM distante, le panneau de configuration d’affichage du système d’exploitation ne fournit aucun contrôle permettant à l’utilisateur de modifier la configuration d’affichage. Cela est principalement dû au fait que la configuration du bureau de session à distance est contrôlée par le système client qui se connecte et non par les applications s’exécutant dans la session. Par exemple, la prise en charge de l’interface utilisateur de la projection Win+P n’a pas de sens dans une session distante.
En général pour les sessions d’ID à distance :
- Afficher le travail des API d’énumération, y compris QueryDisplayConfig
- Les API de paramètre d’affichage ne fonctionnent pas. Par exemple, il n’est pas souhaitable qu’une application s’exécutant dans la session distante appelle ChangeDisplaySettings/SetDisplayConfig pour modifier la configuration du bureau (par exemple, modifier la position ou la topologie du bureau).
Il est intéressant de noter que les solutions XDDM distantes utilisent ChangeDisplaySetting pour modifier les modes et les positions du bureau, car c’est la seule façon d’appliquer les modifications du client. Étant donné que les solutions d’ID à distance ont la fonctionnalité IddCxDisplayConfigUpdate , ChangeDisplaySetting n’est plus nécessaire pour fonctionner dans les sessions d’ID à distance.
Le tableau suivant montre les API et la fonctionnalité d’affichage du panneau de configuration (CPL) dans une session à distance XDDM et une session à distance WDDM.
API/CPL | Session à distance XDDM | Session à distance WDDM |
---|---|---|
Afficher le CPL | Aucune information n’est affichée et un message indiquant « Les paramètres d’affichage ne peuvent pas être modifiés à partir d’une session distante » est émis. | Même comportement qu’une session à distance XDDM. |
Interface utilisateur et fonctionnalités Win+P | L’interface utilisateur n’est pas affichée et l’API échoue. | Même comportement qu’une session à distance XDDM. |
API d’énumération d’affichage héritées (telles que EnumDisplaySettings & EnumDisplayDevices) | L’API fonctionne comme prévu et retourne les informations pertinentes. | Même comportement qu’une session à distance XDDM. |
ChangeDisplaySetting hérité | Fonctionne et est utilisé pour refléter les modifications du bureau à partir du client. | Retourne la réussite pour des raisons de compatibilité des applications, mais ignore l’appel et ne modifie aucune configuration d’affichage. L’IDD utilisera IddCxDisplayConfigUpdate pour modifier la configuration du bureau. |
QueryDisplayConfig | Échoue. | Fonctionne comme prévu. |
DisplayConfigGetDeviceInfo | Échoue. | Fonctionne et signale les informations attendues. |
SetDisplayConfig et DisplayConfigSetDeviceInfo | Échoue. | Même comportement qu’une session à distance XDDM. |
Surveiller le comportement inactif dans une session à distance d’ID
Lorsque la pile de protocoles appelle IWRdsProtocolConnectionCallback ::StopScreenUpdates pour arrêter la mise à jour de l’écran du client, le système d’exploitation détruit les chaînes d’échange et rend tous les chemins d’accès de cette session inactifs, ce qui entraîne l’appel du rappel EVT_IDD_CX_ADAPTER_COMMIT_MODES de l’IDD avec IDDCX_PATH_FLAGS_NONE défini dans IDDCX_PATH. Indicateurs pour tous les chemins d’accès.
Lorsque la pile de protocoles appelle IWRdsProtocolConnectionCallback ::RedrawWindow pour activer à nouveau les mises à jour, le système d’exploitation définit de nouveaux chemins d’accès actifs à l’aide du rappel EVT_IDD_CX_ADAPTER_COMMIT_MODES de l’IDD, et de nouvelles chaînes d’échange sont créées.
Comportement de déconnexion dans une session distante d’ID
Lorsque l’utilisateur se déconnecte d’une session à distance, le système d’exploitation détruit le devnode hébergeant le périphérique d’ID distant pour cette session, ce qui entraîne le PnpStopped de l’adaptateur d’ID distant pour cette session. UMDF appelle le rappel EVT_WDF_DEVICE_D0_EXIT de l’IDD distant.
Si la session est à nouveau connectée à distance, le système d’exploitation crée un devnode pour l’IDD distant de cette session. L’IDD distant doit passer à nouveau par la séquence de démarrage normale, initialiser l’adaptateur, puis ajouter des moniteurs, etc.