Поделиться через


Обновления IddCx 1.4 для удаленных идентификаторов

Следующие обновления IddCx версии 1.4 применяются только к драйверам удаленного непрямого отображения (IDD).

Разработчики удаленных idD также должны видеть обновления IddCx 1.4 для консоли и удаленные idD для дополнительных обновлений.

Объявление удаленного идентификатора для удаленных сеансов

IdD объявляет, что хочет создать адаптер удаленного идентификатора, задав бит IDDCX_ADAPTER_FLAGS_REMOTE_SESSION_DRIVER в IDDCX_ADAPTER_CAPS. Поле Flags при вызове IddCxAdapterInitAsync. ОС отслеживает, загружается ли IDD из-за подключения стека удаленного рабочего стола к удаленному сеансу, и завершится сбоем вызова IddCxAdapterInitAsync в следующих двух случаях:

  1. IdD не задал IDDCX_ADAPTER_FLAGS_REMOTE_SESSION_DRIVER для устройства, созданного стеком удаленных рабочих столов ОС для удаленного сеанса
  2. Набор IDD IDDCX_ADAPTER_FLAGS_REMOTE_SESSION_DRIVER для устройства, созданного не стеком удаленных рабочих столов ОС

Рекомендации по установке удаленных идентификаторов

UMDF позволяет драйверам управлять параметром пула устройств в СВОИХ INF-файлах, используя такие директивы, как UmdfHostProcessSharing и DeviceGroupId. Из-за некоторых проблем с состязанием за блокировку настоятельно рекомендуется установить директиву UmdfHostProcessSharingв значение ProcessSharingDisabled и удалить все директивы DeviceGroupId . Этот параметр настроит удаленный идентификатор idD для каждого сеанса, который будет находиться в отдельном процессе.

Дополнительные ограничения на существующие функции IddCx для удаленных идентификаторов

Для установки IDDCX_ADAPTER_FLAGS_USE_SMALLEST_MODE в IDDCX_ADAPTER_CAPS требуются удаленные идентификаторы. Поле Флаги. Это гарантирует, что виртуальные режимы не используются, и, следовательно, размер цепочки буферов всегда будет соответствовать разрешению рабочего стола. Если этот флаг не установлен, iddCxAdapterInitAsync завершится ошибкой.

Для удаленных идентификаторов поддерживаются только прогрессивные целевые режимы, поэтому IDDCX_TARGET_MODE. Параметр TargetVideoSignalInfo.targetVideoSignalInfo.scanLineOrdering должен иметь значение DISPLAYCONFIG_SCANLINE_ORDERING_PROGRESSIVE. Если это значение не задано, iddCxMonitorArrival завершится ошибкой.

Настройка конфигурации отображения для удаленного сеанса

Так как удаленные идентификаторы управляют всеми мониторами в удаленном сеансе, а конфигурация отображения удаленного сеанса должна зеркало конфигурации клиента, удаленному идентификатору idD требуется возможность указать конфигурацию отображения, заданную ОС в удаленном сеансе. Эту конфигурацию отображения необходимо задать, когда сеанс создается как удаленный сеанс или переходит в удаленный сеанс.

Удаленный идентификатор может обновить конфигурацию дисплея во время удаленного сеанса до следующего:

  • Изменение параметра для текущих мониторов (например, изменение положения рабочего стола, ориентации, физического размера или разрешения на дюйм)
  • Настройте конфигурацию рабочего стола после добавления или удаления мониторов, вызвав IddCxMonitorArrival/IddCxMonitorDeparture. Удаленные идентификаторы idD используют IddCxMonitorArrival и IddCxMonitorDeparture так же, как идентификаторы idD консоли, чтобы информировать ОС о прибытии и отъезде монитора.

Ниже приведена логика, использующаяся ОС для обработки отслеживания поступлений, отъездов и изменений в конфигурации рабочего стола. Для каждого удаленного сеанса ОС будет хранить одну текущую конфигурацию рабочего стола, предоставляемую удаленным идентификатором. Эта конфигурация рабочего стола будет пуста и будет обновляться каждый раз, когда удаленный 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. Новый сеанс начинается с двух подключенных мониторов

Действие драйвера Топология текущего отображения Монитор, подключенный в данный момент Активные в настоящее время мониторы Примечания
Нет Нет Нет Настройка запуска сеанса
IddCxMonitorArrival(Mon1) Нет Пн1 Нет Нет активной конфигурации дисплея, поэтому ничего не меняется
IddCxMonitorArrival(Mon2) Нет Пн1, Пн2 Нет По-прежнему нет изменений в конфигурации отображения
IddCxDisplayConfigUpdate Пн1, Пн2 Пн1, Пн2 Пн1, Пн2 Так как все мониторы подключены, задайте конфигурацию

ПРИМЕЧАНИЕ. Драйвер мог вызвать IddCxDisplayConfigUpdate перед добавлением мониторов для того же результата.

Сценарий 2. Добавьте третий монитор в сценарий 1 и сделайте его активным

Действие драйвера Топология текущего отображения Монитор, подключенный в данный момент Активные в настоящее время мониторы Примечания
IddCxMonitorArrival(Mon3) Пн1, Пн2 Пн1, Пн2, Пн3 Пн1, Пн2 Нет изменений в конфигурации отображения
IddCxDisplayConfigUpdate Пн1, Пн2, Пн3 Пн1, Пн2, Пн3 Пн1, Пн2, Пн3 Новый набор конфигураций

Сценарий 3. Удаление монитора из активной конфигурации

Действие драйвера Топология текущего отображения Монитор, подключенный в данный момент Активные в настоящее время мониторы Примечания
Пн1, Пн2 Пн1, Пн2 Пн1, Пн2 Начальная настройка
IddCxDisplayConfigUpdate() Пн1 Пн1, Пн2 Пн1 Измените конфигурацию, чтобы использовать только Mon1 в первую очередь
IddCxMonitorDeparture(Mon2) Пн1 Пн1 Пн1

Сценарий 4. Изменение режима пути, когда драйвер поддерживает только один режим

Действие драйвера Топология текущего отображения Монитор, подключенный в данный момент Активные в настоящее время мониторы Примечания
Mon1 10x7 , Mon2 19x10 Пн1, Пн2 Пн1, Пн2 Начальная настройка
IddCxMonitorUpdateModes(Mon1 поддерживает 16x9) Нет Пн1, Пн2 Нет Обновлен список режимов для Mon1 до 16x9
IddCxDisplayConfigUpdate() Mon1 16x9, Mon2 19x10 Пн1, Пн2 Пн1, Пн2 Задайте для параметра Mon1 значение 16x9.

Обработка ошибок IddCxDisplayConfigUpdate

Удаленный драйвер должен обрабатывать ошибки из IddCxDisplayConfigUpdate. Некоторые ошибки ожидаются; например, если подключение использовало временный сеанс.

В непредвиденных случаях в начальной конфигурации драйвер имеет следующие параметры:

  • Вызовите IddCxReportCriticalError , чтобы завершить процесс драйвера и отключить сеанс пользователя. Рекомендуется, чтобы драйвер использовал уникальное сочетание основных и дополнительных компонентов, чтобы эти случаи можно было определить в отчетах о сбоях и Watson.
  • Повторите попытку конфигурации в случае временной ошибки.
  • Попробуйте другую конфигурацию.

Удаленный драйвер может решить, что сбои изменения конфигурации в середине сеанса не так важны, как сбои начальной конфигурации, и, следовательно, никогда не вызывать IddCxReportCriticalError в середине сеанса .

Драйвер не должен вызывать IddCxReportCriticalError, если IddCxDisplayConfigUpdate возвращает STATUS_GRAPHICS_INDIRECT_DISPLAY_DEVICE_STOPPED в результате обнаружения операционной системой отключения целевого сеанса или остановки адаптера IddCx для этого сеанса, так как это ожидаемо.

Изменения API отображения в удаленном сеансе косвенного отображения

В удаленном сеансе XDDM панель управления отображением ОС не предоставляет пользователю никаких элементов управления для изменения конфигурации дисплея. В первую очередь это связано с тем, что конфигурация удаленного рабочего стола сеанса контролируется подключающейся клиентской системой, а не приложениями, работающими в сеансе. Например, поддержка пользовательского интерфейса проекции Win+P не имеет смысла в удаленном сеансе.

Как правило, для сеансов удаленного идентификатора:

  • Api отображения перечисления работают, включая QueryDisplayConfig
  • API-интерфейсы параметров отображения не работают. Например, нежелательно, чтобы приложение, работающее в удаленном сеансе, вызывало ChangeDisplaySettings/SetDisplayConfig , чтобы изменить конфигурацию рабочего стола (например, изменить положение рабочего стола или топологию).

Интересно, что удаленные решения XDDM используют ChangeDisplaySetting для изменения режимов и положения рабочего стола, так как это единственный способ применения изменений, внесенных клиентом. Так как решения для удаленной идентификации имеют функции IddCxDisplayConfigUpdate , функция ChangeDisplaySetting больше не требуется для работы в сеансах удаленного идентификатора.

В следующей таблице показаны API-интерфейсы и функции панели управления отображением (CPL) в удаленном сеансе XDDM и удаленном сеансе WDDM.

API/CPL Удаленный сеанс XDDM Удаленный сеанс WDDM
Отображение CPL Информация не отображается, и выводится сообщение "Параметры отображения невозможно изменить из удаленного сеанса". То же поведение, что и удаленный сеанс XDDM.
Пользовательский интерфейс Win+P и функциональные возможности Пользовательский интерфейс не отображается, и API завершается сбоем. То же поведение, что и удаленный сеанс XDDM.
Устаревшие API перечисления отображения (например, EnumDisplaySettings & EnumDisplayDevices) API работает должным образом и возвращает соответствующие сведения. То же поведение, что и удаленный сеанс XDDM.
Устаревшая версия ChangeDisplaySetting Работает и используется для отражения изменений рабочего стола, внесенных клиентом. Возвращает успешное выполнение по соображениям совместимости приложений, но игнорирует вызов и не изменяет конфигурацию отображения. IdD будет использовать IddCxDisplayConfigUpdate для изменения конфигурации рабочего стола.
QueryDisplayConfig Не. Работает должным образом.
DisplayConfigGetDeviceInfo Не. Работает и сообщает ожидаемые сведения.
SetDisplayConfig и DisplayConfigSetDeviceInfo Не. То же поведение, что и удаленный сеанс XDDM.

Мониторинг поведения бездействия в удаленном сеансе с идентификатором

Когда стек протоколов вызывает IWRdsProtocolConnectionCallback::StopScreenUpdates , чтобы остановить обновление экрана клиента, ОПЕРАЦИОННая система удаляет цепочки буферов и делает все пути для этого сеанса неактивными, в результате чего обратный вызов idD EVT_IDD_CX_ADAPTER_COMMIT_MODES вызывается с IDDCX_PATH_FLAGS_NONE , заданными в IDDCX_PATH. Флаги для всех путей.

Когда стек протокола вызывает IWRdsProtocolConnectionCallback::RedrawWindow для повторного включения обновлений, ОС задает новые активные пути с помощью обратного вызова idD EVT_IDD_CX_ADAPTER_COMMIT_MODES , и будут созданы новые цепочки буферов.

Отключение в удаленном сеансе идентификатора

Когда пользователь отключается от удаленного сеанса, ОПЕРАЦИОННая система удаляет devnode, на котором размещено устройство удаленного идентификатора для этого сеанса, в результате чего адаптер удаленного идентификатора для этого сеанса будет PnpStopped. UMDF вызовет обратный вызов EVT_WDF_DEVICE_D0_EXIT удаленного idD .

Если сеанс снова подключен удаленно, ОС создаст новый devnode для удаленного идентификатора для этого сеанса. Удаленный идентификатор должен снова пройти обычную последовательность запуска, инициализацию адаптера, а затем добавить мониторы и т. д.