원격 IDD에 대한 IddCx 1.4 업데이트

IddCx 버전 1.4에 대한 다음 업데이트는 IDD(원격 간접 디스플레이 드라이버)에만 적용됩니다.

또한 원격 IDD 개발자는 추가 업데이트를 위해 콘솔 및 원격 IDD에 대한 IddCx 1.4 업데이트를 참조해야 합니다.

원격 세션에 대한 원격 IDD 선언

IDD는 IDDCX_ADAPTER_CAPSIDDCX_ADAPTER_FLAGS_REMOTE_SESSION_DRIVER 비트를 설정하여 원격 ID 어댑터를 만들려고 합니다. IddCxAdapterInitAsync를 호출할 때 플래그 필드입니다. OS는 원격 세션에 연결된 원격 데스크톱 스택으로 인해 IDD가 로드되고 있는지 여부를 추적하고 다음 두 경우에서 IddCxAdapterInitAsync 호출에 실패합니다.

  1. IDD가 원격 세션에 대한 OS 원격 데스크톱 스택에서 만든 디바이스에 대한 IDDCX_ADAPTER_FLAGS_REMOTE_SESSION_DRIVER 설정하지 않았습니다.
  2. OS 원격 데스크톱 스택에서 만들지 않은 디바이스에 대한 IDD 집합 IDDCX_ADAPTER_FLAGS_REMOTE_SESSION_DRIVER

원격 IDD에 대한 설치 권장 사항

UMDF를 사용하면 드라이버가 UmdfHostProcessSharingDeviceGroupId와 같은 지시문을 사용하여 INF 파일에서 디바이스 풀링 옵션을 제어할 수 있습니다. 일부 잠금 경합 문제로 인해 원격 IDD는 UmdfHostProcessSharing 지시문을 ProcessSharingDisabled 로 설정하고 DeviceGroupId 지시문을 제거하는 것이 좋습니다. 이 설정은 각 세션에 대한 원격 IDD가 자체 프로세스에 있도록 구성합니다.

원격 IDD에 대한 기존 IddCx 기능에 대한 추가 제한 사항

IDDCX_ADAPTER_CAPS IDDCX_ADAPTER_FLAGS_USE_SMALLEST_MODE 설정하려면 원격 ID가 필요합니다. 플래그 필드입니다. 이렇게 하면 가상 모드가 사용되지 않으므로 스왑 체인 크기가 항상 데스크톱 해상도와 일치합니다. 이 플래그가 설정되지 않으면 IddCxAdapterInitAsync가 실패합니다.

원격 IDD에는 점진적 대상 모드만 지원되므로 IDDCX_TARGET_MODE. TargetVideoSignalInfo.targetVideoSignalInfo.scanLineOrderingDISPLAYCONFIG_SCANLINE_ORDERING_PROGRESSIVE 설정해야 합니다. 이 값을 설정하지 않으면 IddCxMonitorArrival이 실패합니다.

원격 세션에 대한 표시 구성 설정

원격 IDD는 원격 세션의 모든 모니터를 제어하고 원격 세션 표시 구성은 클라이언트의 모니터를 미러 있으므로 원격 IDD에는 OS가 원격 세션에서 설정할 디스플레이 구성을 지정하는 기능이 필요합니다. 이 표시 구성은 세션이 원격 세션으로 생성되거나 원격 세션으로 전환될 때 설정되어야 합니다.

원격 IDD는 원격 세션 중에 디스플레이 구성을 다음 중 하나로 업데이트할 수 있습니다.

  • 현재 모니터에 대한 설정 변경(예: 데스크톱 위치, 방향, 물리적 크기 또는 DPI 변경)
  • IddCxMonitorArrival/IddCxMonitorDeparture를 호출하여 모니터를 추가/제거한 후 데스크톱 구성을 설정합니다. 원격 IDD는 콘솔 IDD와 동일한 방식으로 IddCxMonitorArrivalIddCxMonitorDeparture 를 사용하여 OS에 모니터 도착 및 출발에 대해 알릴 수 있습니다.

다음은 OS가 모니터 도착, 출발 및 데스크톱 구성 변경을 처리하는 데 사용하는 논리입니다. 각 원격 세션에 대해 OS는 원격 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: 새 세션이 연결된 두 개의 모니터로 시작됩니다.

드라이버 작업 현재 표시 토폴로지 현재 연결된 모니터 현재 활성 모니터 참고
None 없음 없음 세션 시작 구성
IddCxMonitorArrival(Mon1) 없음 Mon1 없음 활성 디스플레이 구성이 없으므로 아무것도 변경되지 않습니다.
IddCxMonitorArrival(Mon2) 없음 Mon1, Mon2 없음 여전히 디스플레이 구성이 변경되지 않음
IddCxDisplayConfigUpdate Mon1, Mon2 Mon1, Mon2 Mon1, Mon2 모든 모니터가 연결되면 구성을 설정합니다.

참고: 드라이버는 동일한 결과에 대한 모니터를 추가하기 전에 IddCxDisplayConfigUpdate 를 호출했을 수 있습니다.

시나리오 2: 시나리오 1에 세 번째 모니터를 추가하고 활성화

드라이버 작업 현재 표시 토폴로지 현재 연결된 모니터 현재 활성 모니터 참고
IddCxMonitorArrival(Mon3) Mon1, Mon2 Mon1, Mon2, Mon3 Mon1, Mon2 구성 표시에 대한 변경 내용 없음
IddCxDisplayConfigUpdate Mon1, Mon2, Mon3 Mon1, Mon2, Mon3 Mon1, Mon2, Mon3 새 구성 집합

시나리오 3: 활성 구성에서 모니터 제거

드라이버 작업 현재 표시 토폴로지 현재 연결된 모니터 현재 활성 모니터 참고
Mon1, Mon2 Mon1, Mon2 Mon1, Mon2 구성 시작
IddCxDisplayConfigUpdate() Mon1 Mon1, Mon2 Mon1 먼저 Mon1만 사용하도록 구성 변경
IddCxMonitorDeparture(Mon2) Mon1 Mon1 Mon1

시나리오 4: 드라이버가 단일 모드만 지원하는 경우 경로 모드 변경

드라이버 작업 현재 표시 토폴로지 현재 연결된 모니터 현재 활성 모니터 참고
Mon1 10x7 , Mon2 19x10 Mon1, Mon2 Mon1, Mon2 구성 시작
IddCxMonitorUpdateModes(Mon1은 16x9 지원) 없음 Mon1, Mon2 없음 Mon1에서 16x9로 업데이트된 모드 목록
IddCxDisplayConfigUpdate() Mon1 16x9, Mon2 19x10 Mon1, Mon2 Mon1, Mon2 Mon1에 대한 구성을 16x9로 설정

IddCxDisplayConfigUpdate 오류 처리

원격 드라이버는 IddCxDisplayConfigUpdate의 오류를 처리해야 합니다. 일부 오류가 발생할 수 있습니다. 예를 들어 연결이 임시 세션을 사용하는 경우입니다.

초기 구성에서 예기치 않은 경우 드라이버에는 다음과 같은 옵션이 있습니다.

  • IddCxReportCriticalError를 호출하여 드라이버 프로세스를 종료하고 사용자 세션의 연결을 끊습니다. 충돌 및 Watson 보고서에서 이러한 사례를 식별할 수 있도록 드라이버에서 고유한 주/부 조합을 사용하는 것이 좋습니다.
  • 일시적인 오류인 경우 구성을 다시 시도합니다.
  • 다른 구성을 사용해 보세요.

원격 드라이버는 세션 중 구성 변경 실패가 초기 구성 오류만큼 중요하지 않다고 결정할 수 있으므로 IddCxReportCriticalError 중간 세션을 호출하지 않을 수 있습니다.

IDdCxDisplayConfigUpdate에서 대상 세션의 연결이 끊어지거나 해당 세션의 IddCx 어댑터가 중지되는 것을 감지한 결과로 iddCxDisplayConfigUpdate가 STATUS_GRAPHICS_INDIRECT_DISPLAY_DEVICE_STOPPED 반환하는 경우 드라이버는 IddCxReportCriticalError를 호출하지 않아야 합니다.

간접 디스플레이 원격 세션에서 API 변경 내용 표시

원격 XDDM 세션에서 OS 디스플레이 제어판은 사용자에게 디스플레이 구성을 변경하는 컨트롤을 제공하지 않습니다. 이는 주로 원격 세션 데스크톱 구성이 세션에서 실행되는 애플리케이션이 아니라 연결 클라이언트 시스템에 의해 제어되기 때문입니다. 예를 들어 Win+P 프로젝션 사용자 인터페이스를 지원하는 것은 원격 세션에서 의미가 없습니다.

일반적으로 원격 ID 세션의 경우:

흥미롭게도 원격 XDDM 솔루션은 ChangeDisplaySetting을 사용하여 모드 및 데스크톱 위치를 변경합니다. 이는 클라이언트에서 변경 내용을 적용할 수 있는 유일한 방법입니다. 원격 ID 솔루션에는 IddCxDisplayConfigUpdate 기능이 있으므로 원격 ID 세션에서 작동하기 위해 ChangeDisplaySetting 이 더 이상 필요하지 않습니다.

다음 표에서는 XDDM 원격 세션 및 WDDM 원격 세션의 API 및 CPL(디스플레이 제어판) 기능을 보여 줍니다.

API/CPL XDDM 원격 세션 WDDM 원격 세션
CPL 표시 정보가 표시되지 않고 '원격 세션에서 표시 설정을 변경할 수 없습니다.'라는 메시지가 표시됩니다. XDDM 원격 세션과 동일한 동작입니다.
Win+P UI 및 기능 UI가 표시되지 않고 API가 실패합니다. XDDM 원격 세션과 동일한 동작입니다.
레거시 디스플레이 열거형 API(예: EnumDisplaySettings & EnumDisplayDevices) API는 예상대로 작동하고 관련 정보를 반환합니다. XDDM 원격 세션과 동일한 동작입니다.
레거시 ChangeDisplaySetting 및 는 클라이언트의 데스크톱 변경 내용을 반영하는 데 사용됩니다. 애플리케이션 호환성 이유로 성공을 반환하지만 호출을 무시하고 표시 구성을 변경하지 않습니다. IDD는 IddCxDisplayConfigUpdate 를 사용하여 데스크톱 구성을 변경합니다.
QueryDisplayConfig 실패. 예상대로 작동합니다.
DisplayConfigGetDeviceInfo 실패. 예상 정보를 작동하고 보고합니다.
SetDisplayConfig 및 DisplayConfigSetDeviceInfo 실패. XDDM 원격 세션과 동일한 동작입니다.

ID 원격 세션에서 유휴 동작 모니터링

프로토콜 스택이 IWRdsProtocolConnectionCallback::StopScreenUpdates를 호출하여 클라이언트 화면 업데이트를 중지하면 OS는 스왑 체인을 삭제하고 해당 세션의 모든 경로를 비활성 상태로 만들어 IDD의 EVT_IDD_CX_ADAPTER_COMMIT_MODES 콜백이 IDDCX_PATH 설정된 IDDCX_PATH_FLAGS_NONE 호출됩니다. 모든 경로에 대한 플래그입니다.

프로토콜 스택이 IWRdsProtocolConnectionCallback::RedrawWindow 를 호출하여 업데이트를 다시 사용하도록 설정하면 OS는 IDD의 EVT_IDD_CX_ADAPTER_COMMIT_MODES 콜백을 사용하여 새 활성 경로를 설정하고 새 스왑 체인을 만듭니다.

ID 원격 세션에서의 연결 끊기 동작

사용자가 원격 세션에서 연결을 끊으면 OS는 해당 세션에 대한 원격 ID 디바이스를 호스팅하는 devnode를 삭제하여 해당 세션에 대한 원격 ID 어댑터가 PnpStopped됩니다. UMDF는 원격 IDD의 EVT_WDF_DEVICE_D0_EXIT 콜백을 호출합니다.

세션이 원격으로 다시 연결되면 OS는 해당 세션에 대한 원격 IDD에 대한 새 devnode를 만듭니다. 원격 IDD는 정상 시작 시퀀스를 다시 거치고 어댑터를 초기화한 다음 모니터 등을 추가해야 합니다.