Compartir a través de


Actualizaciones de IddCx 1.4 para idD remotos

Las siguientes actualizaciones de IddCx versión 1.4 solo se aplican a controladores de pantalla indirectos remotos (IDD).

Los desarrolladores de IDD remotos también deben ver las actualizaciones de IddCx 1.4 para la consola y los IDD remotos para obtener actualizaciones adicionales.

Declarar un IDD remoto para sesiones remotas

Un IDD declara que quiere crear un adaptador de identificador remoto estableciendo el bit de IDDCX_ADAPTER_FLAGS_REMOTE_SESSION_DRIVER en el IDDCX_ADAPTER_CAPS. Campo Marcas al llamar a IddCxAdapterInitAsync. El sistema operativo realiza un seguimiento de si el IDD se está cargando debido a que la pila de escritorio remoto se conecta a una sesión remota y producirá un error en la llamada a IddCxAdapterInitAsync en los dos casos siguientes:

  1. El IDD no estableció IDDCX_ADAPTER_FLAGS_REMOTE_SESSION_DRIVER para un dispositivo creado por la pila de escritorio remoto del sistema operativo para una sesión remota
  2. El conjunto de IDD IDDCX_ADAPTER_FLAGS_REMOTE_SESSION_DRIVER para un dispositivo que no creó la pila de escritorio remoto del sistema operativo

Recomendaciones de instalación para id. remotos

UMDF permite a los controladores controlar la opción de agrupación de dispositivos en sus archivos INF, mediante directivas como UmdfHostProcessSharing y DeviceGroupId. Debido a algunos problemas de contención de bloqueos, se recomienda encarecidamente que los IDD remotos establezcan la directiva UmdfHostProcessSharing en ProcessSharingDisabled y quite las directivas DeviceGroupId . Esta configuración configurará el IDD remoto para cada sesión para que esté en su propio proceso.

Restricciones adicionales sobre las características de IddCx existentes para los IDD remotos

Los IDD remotos son necesarios para establecer IDDCX_ADAPTER_FLAGS_USE_SMALLEST_MODE en el IDDCX_ADAPTER_CAPS. Campo Marcas . Esto garantiza que no se usen modos virtuales y, por tanto, el tamaño de la cadena de intercambio siempre coincidirá con la resolución del escritorio. Se producirá un error en IddCxAdapterInitAsync si no se establece esta marca.

Solo se admiten modos de destino progresivos para id. remotos, por lo que IDDCX_TARGET_MODE. TargetVideoSignalInfo.targetVideoSignalInfo.scanLineOrdering debe establecerse en DISPLAYCONFIG_SCANLINE_ORDERING_PROGRESSIVE. IddCxMonitorArrival producirá un error si este valor no está establecido.

Establecer la configuración de visualización para la sesión remota

Como los IDD remotos controlan todos los monitores de una sesión remota y la configuración de visualización de la sesión remota debe reflejar la del cliente, un IDD remoto necesita la capacidad de especificar la configuración de visualización que el sistema operativo establecerá en la sesión remota. Esta configuración de visualización debe establecerse cuando la sesión se crea como una sesión remota o se pasa a una sesión remota.

El IDD remoto puede actualizar la configuración de presentación durante una sesión remota a:

  • Cambie la configuración de los monitores actuales (por ejemplo, cambiar la posición del escritorio, la orientación, el tamaño físico o PPP).
  • Establezca la configuración de escritorio después de agregar o quitar los monitores, llamando a IddCxMonitorArrival/IddCxMonitorDeparture. Los IDD remotos usan IddCxMonitorArrival e IddCxMonitorDeparture de la misma manera que los IDD de consola para informar al sistema operativo sobre las llegadas y salidas del sistema operativo.

A continuación se muestra la lógica que el sistema operativo usa para procesar los cambios de configuración de escritorio, salidas y llegadas. Para cada sesión remota, el sistema operativo almacenará una única configuración de escritorio actual proporcionada por el IDD remoto. Esta configuración de escritorio se iniciará vacía y se actualizará cada vez que un IDD remoto llama correctamente a IddCxDisplayConfigUpdate.

Cuando el controlador recibe una nueva configuración de visualización

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

Cuando se quita un monitor

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

Cuando llega un monitor

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

A continuación se muestran algunos escenarios sencillos para ilustrar cómo se puede usar IddCxDisplayConfigUpdate .

Escenario 1: una nueva sesión comienza con dos monitores conectados

Acción del controlador Topología de visualización actual Monitor conectado actualmente Monitores activos actualmente Notas
None None None Configuración de inicio de sesión
IddCxMonitorArrival(Mon1) None Mon1 None No hay ninguna configuración de pantalla activa, por lo que no cambia nada
IddCxMonitorArrival(Mon2) None Mon1, Mon2 None Todavía no hay ningún cambio en la configuración de visualización
IddCxDisplayConfigUpdate Mon1, Mon2 Mon1, Mon2 Mon1, Mon2 A medida que todos los monitores están conectados, establezca la configuración.

NOTA: El controlador podría haber llamado a IddCxDisplayConfigUpdate antes de agregar los monitores para el mismo resultado.

Escenario 2: Agregar un tercer monitor al escenario 1 y activarlo

Acción del controlador Topología de visualización actual Monitor conectado actualmente Monitores activos actualmente Notas
IddCxMonitorArrival(Mon3) Mon1, Mon2 Mon1, Mon2, Mon3 Mon1, Mon2 No hay ningún cambio para mostrar la configuración
IddCxDisplayConfigUpdate Mon1, Mon2, Mon3 Mon1, Mon2, Mon3 Mon1, Mon2, Mon3 Nuevo conjunto de configuración

Escenario 3: Quitar un monitor de una configuración activa

Acción del controlador Topología de visualización actual Monitor conectado actualmente Monitores activos actualmente Notas
Mon1, Mon2 Mon1, Mon2 Mon1, Mon2 Inicio de la configuración
IddCxDisplayConfigUpdate() Mon1 Mon1, Mon2 Mon1 Cambiar la configuración para usar solo Mon1 en primer lugar
IddCxMonitorDeparture(Mon2) Mon1 Mon1 Mon1

Escenario 4: Cambio del modo de una ruta de acceso cuando el controlador solo admite un modo único

Acción del controlador Topología de visualización actual Monitor conectado actualmente Monitores activos actualmente Notas
Mon1 10x7 , Mon2 19x10 Mon1, Mon2 Mon1, Mon2 Inicio de la configuración
IddCxMonitorUpdateModes(Mon1 admite 16x9) None Mon1, Mon2 None Lista de modo actualizada para Mon1 a 16x9
IddCxDisplayConfigUpdate() Mon1 16x9, Mon2 19x10 Mon1, Mon2 Mon1, Mon2 Establecer la configuración de Mon1 en 16x9

Control de errores IddCxDisplayConfigUpdate

El controlador remoto debe controlar los errores de IddCxDisplayConfigUpdate. Se esperan algunos errores; por ejemplo, cuando la conexión estaba usando una sesión temporal.

En casos inesperados en la configuración inicial, el controlador tiene opciones como:

  • Llame a IddCxReportCriticalError para finalizar el proceso del controlador y desconectar la sesión del usuario. Se recomienda que el controlador use una combinación única principal o secundaria para que estos casos se puedan identificar en bloqueos e informes watson.
  • Vuelva a intentar la configuración en caso de que se haya producido un error transitorio.
  • Pruebe otra configuración.

Un controlador remoto podría decidir que los errores de cambio de configuración de la sesión intermedia no son tan críticos como errores de configuración iniciales y, por lo tanto, nunca podría llamar a IddCxReportCriticalError mid-session.

El controlador no debe llamar a IddCxReportCriticalError si IddCxDisplayConfigUpdate devuelve STATUS_GRAPHICS_INDIRECT_DISPLAY_DEVICE_STOPPED como resultado de la detección del sistema operativo de que la sesión de destino se está desconectando o el adaptador de IddCx para esa sesión se está deteniendo, ya que se espera.

Mostrar cambios de API en una sesión remota de visualización indirecta

En una sesión XDDM remota, el panel de control de pantalla del sistema operativo no proporciona al usuario ningún control para cambiar la configuración de visualización. Esto se debe principalmente a que la configuración del escritorio de sesión remoto se controla mediante el sistema cliente de conexión y no por las aplicaciones que se ejecutan en la sesión. Por ejemplo, la compatibilidad con la interfaz de usuario de proyección de Win+P no tiene sentido en una sesión remota.

En general, para las sesiones de identificador remoto:

  • Las API de enumeración de visualización funcionan, incluido QueryDisplayConfig.
  • Las API de configuración de visualización no funcionan. Por ejemplo, no es conveniente que una aplicación que se ejecute en la sesión remota llame a ChangeDisplaySettings/SetDisplayConfig para cambiar la configuración de escritorio (por ejemplo, cambiar la posición de escritorio o la topología).

Curiosamente, las soluciones XDDM remotas usan ChangeDisplaySetting para cambiar los modos y las posiciones de escritorio, ya que es la única manera en que se pueden aplicar los cambios del cliente. Dado que las soluciones de identificador remoto tienen la funcionalidad IddCxDisplayConfigUpdate , ChangeDisplaySetting ya no es necesario para funcionar en sesiones de identificador remoto.

En la tabla siguiente se muestran las API y la funcionalidad del panel de control de visualización (CPL) en una sesión remota XDDM y una sesión remota de WDDM.

API/CPL Sesión remota de XDDM Sesión remota de WDDM
Mostrar CPL No se muestra información y se emite un mensaje que indica que no se puede cambiar la configuración de pantalla de una sesión remota. Mismo comportamiento que una sesión remota de XDDM.
Interfaz de usuario y funcionalidad de Win+P La interfaz de usuario no se muestra y se produce un error en la API. Mismo comportamiento que una sesión remota de XDDM.
API de enumeración de visualización heredadas (como EnumDisplaySettings & EnumDisplayDevices) La API funciona según lo esperado y devuelve información relevante. Mismo comportamiento que una sesión remota de XDDM.
ChangeDisplaySetting heredado Funciona y se usa para reflejar los cambios de escritorio del cliente. Devuelve el éxito por motivos de compatibilidad de aplicaciones, pero omite la llamada y no cambia ninguna configuración de presentación. El IDD usará IddCxDisplayConfigUpdate para cambiar la configuración de escritorio.
QueryDisplayConfig Falla. Funciona según lo previsto.
DisplayConfigGetDeviceInfo Falla. Funciona e informa de la información esperada.
SetDisplayConfig y DisplayConfigSetDeviceInfo Falla. Mismo comportamiento que una sesión remota de XDDM.

Supervisión del comportamiento inactivo en una sesión remota de identificador

Cuando la pila de protocolos llama a IWRdsProtocolConnectionCallback::StopScreenUpdates para dejar de actualizar la pantalla del cliente, el sistema operativo destruye las cadenas de intercambio y hace que todas las rutas de acceso de esa sesión estén inactivas, lo que da lugar a la devolución de llamada EVT_IDD_CX_ADAPTER_COMMIT_MODES del IDD que se llama con IDDCX_PATH_FLAGS_NONE establecido en IDDCX_PATH. Marcas para todas las rutas de acceso.

Cuando la pila de protocolos llama a IWRdsProtocolConnectionCallback::RedrawWindow para habilitar las actualizaciones de nuevo, el sistema operativo establece nuevas rutas de acceso activas mediante la devolución de llamada EVT_IDD_CX_ADAPTER_COMMIT_MODES del IDD y se crearán nuevas cadenas de intercambio.

Comportamiento de desconexión en una sesión remota de identificador

Cuando el usuario se desconecta de una sesión remota, el sistema operativo destruye el nodo de desarrollo que hospeda el dispositivo de identificador remoto para esa sesión, lo que da lugar a que el adaptador de identificador remoto de esa sesión sea PnpStopped. UMDF llamará a la devolución de llamada EVT_WDF_DEVICE_D0_EXIT del IDD remoto.

Si la sesión se conecta de nuevo de forma remota, el sistema operativo creará un nuevo devnode para el IDD remoto de esa sesión. El IDD remoto debe volver a pasar por la secuencia de inicio normal, inicializar el adaptador y, a continuación, agregar monitores, etc.