Partilhar via


Atualizações do IdCx 1.4 para IDs remotas

As atualizações a seguir para o IddCx versão 1.4 se aplicam somente a IDS (drivers de exibição indiretos remotos).

Os desenvolvedores de IDD remota também devem ver atualizações do IdCx 1.4 para console e IDS remotas para atualizações adicionais.

Declarar uma IDD remota para sessões remotas

Uma IDD declara que deseja criar um adaptador de ID remoto definindo o bit IDDCX_ADAPTER_FLAGS_REMOTE_SESSION_DRIVER na IDDCX_ADAPTER_CAPS. Campo Sinalizadores ao chamar IddCxAdapterInitAsync. O sistema operacional controla se a IDD está sendo carregada devido à pilha de área de trabalho remota se conectando a uma sessão remota e falhará na chamada IddCxAdapterInitAsync nos dois casos a seguir:

  1. A IDD não definiu IDDCX_ADAPTER_FLAGS_REMOTE_SESSION_DRIVER para um dispositivo que foi criado pela pilha de área de trabalho remota do sistema operacional para uma sessão remota
  2. O conjunto de IDs IDDCX_ADAPTER_FLAGS_REMOTE_SESSION_DRIVER para um dispositivo que não foi criado pela pilha de área de trabalho remota do sistema operacional

Recomendações de instalação para IDDs remotas

O UMDF permite que os drivers controlem a opção de pool de dispositivos em seus arquivos INF, usando diretivas como UmdfHostProcessSharing e DeviceGroupId. Devido a alguns problemas de contenção de bloqueio, é altamente recomendável que as IDDs remotas definam a diretiva UmdfHostProcessSharing como ProcessSharingDisabled e removam quaisquer diretivas DeviceGroupId . Essa configuração configurará a IDD remota para cada sessão estar em seu próprio processo.

Restrições adicionais em recursos IddCx existentes para IDDs remotas

IDS remotas são necessárias para definir IDDCX_ADAPTER_FLAGS_USE_SMALLEST_MODE no IDDCX_ADAPTER_CAPS. Campo Sinalizadores . Isso garante que os modos virtuais não sejam usados e, portanto, o tamanho da cadeia de troca sempre corresponderá à resolução da área de trabalho. IddCxAdapterInitAsync falhará se esse sinalizador não estiver definido.

Somente modos de destino progressivos têm suporte para IDDs remotas, portanto , IDDCX_TARGET_MODE. TargetVideoSignalInfo.targetVideoSignalInfo.scanLineOrdering deve ser definido como DISPLAYCONFIG_SCANLINE_ORDERING_PROGRESSIVE. IddCxMonitorArrival falhará se esse valor não estiver definido.

Definir a configuração de exibição para a sessão remota

Como as IDDs remotas controlam todos os monitores em uma sessão remota e a configuração de exibição de sessão remota deve espelho a do cliente, uma ID remota precisa da capacidade de especificar a configuração de exibição que o sistema operacional definirá na sessão remota. Essa configuração de exibição precisa ser definida quando a sessão é criada como uma sessão remota ou transferida para uma sessão remota.

A ID remota pode atualizar a configuração de exibição durante uma sessão remota para:

  • Alterar a configuração para monitores atuais (por exemplo, alterar posição da área de trabalho, orientação, tamanho físico ou DPI)
  • Defina a configuração da área de trabalho depois que os monitores forem adicionados/removidos, chamando IddCxMonitorArrival/IddCxMonitorDeparture. As IDDs remotas usam IddCxMonitorArrival e IddCxMonitorDeparture da mesma forma que as IDDs do console para informar o sistema operacional sobre chegadas e saídas do monitor.

Abaixo está a lógica que o sistema operacional usa para processar as chegadas, as saídas e as alterações de configuração da área de trabalho. Para cada sessão remota, o sistema operacional armazenará uma única configuração de área de trabalho atual fornecida pela IDD remota. Essa configuração da área de trabalho começará vazia e será atualizada sempre que uma IDD remota chamar com êxito IddCxDisplayConfigUpdate.

Quando o driver recebe uma nova configuração de exibição

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

Quando um monitor é removido

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

Quando um monitor chega

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

Abaixo estão alguns cenários simples para ilustrar como IddCxDisplayConfigUpdate pode ser usado.

Cenário 1: uma nova sessão começa com dois monitores conectados

Ação do driver Topologia de exibição atual Monitor conectado no momento Monitores ativos no momento Observações
Nenhum Nenhum Nenhum Configuração de início da sessão
IddCxMonitorArrival(Mon1) Nenhum Seg1 Nenhum Nenhuma configuração de exibição ativa, portanto, nada muda
IddCxMonitorArrival(Mon2) Nenhum Mon1, Mon2 Nenhum Ainda não há alteração na configuração de exibição
IddCxDisplayConfigUpdate Mon1, Mon2 Mon1, Mon2 Mon1, Mon2 Como todos os monitores estão conectados, defina a configuração

OBSERVAÇÃO: o driver poderia ter chamado IddCxDisplayConfigUpdate antes de adicionar os monitores para o mesmo resultado.

Cenário 2: Adicionar um terceiro monitor ao Cenário 1 e torná-lo ativo

Ação do driver Topologia de exibição atual Monitor conectado no momento Monitores ativos no momento Observações
IddCxMonitorArrival(Mon3) Mon1, Mon2 Mon1, Mon2, Mon3 Mon1, Mon2 Nenhuma alteração na configuração de exibição
IddCxDisplayConfigUpdate Mon1, Mon2, Mon3 Mon1, Mon2, Mon3 Mon1, Mon2, Mon3 Novo conjunto de configurações

Cenário 3: remover um monitor de uma configuração ativa

Ação do driver Topologia de exibição atual Monitor conectado no momento Monitores ativos no momento Observações
Mon1, Mon2 Mon1, Mon2 Mon1, Mon2 Iniciando a configuração
IddCxDisplayConfigUpdate() Seg1 Mon1, Mon2 Seg1 Alterar a configuração para usar o Mon1 apenas primeiro
IddCxMonitorDeparture(Mon2) Seg1 Seg1 Seg1

Cenário 4: alterando o modo de um caminho quando o driver dá suporte apenas a um único modo

Ação do driver Topologia de exibição atual Monitor conectado no momento Monitores ativos no momento Observações
Mon1 10x7 , Mon2 19x10 Mon1, Seg2 Mon1, Seg2 Iniciando a configuração
IddCxMonitorUpdateModes(Mon1 dá suporte a 16x9) Nenhum Mon1, Seg2 Nenhum Lista de modo atualizado para Mon1 a 16x9
IddCxDisplayConfigUpdate() Mon1 16x9, Mon2 19x10 Mon1, Seg2 Mon1, Seg2 Definir a configuração para Mon1 como 16x9

Tratamento de erros IddCxDisplayConfigUpdate

O driver remoto precisa lidar com erros de IddCxDisplayConfigUpdate. Alguns erros são esperados; por exemplo, quando a conexão estava usando uma sessão temporária.

Em casos inesperados na configuração inicial, o driver tem opções como:

  • Chame IddCxReportCriticalError para encerrar o processo de driver e desconectar a sessão do usuário. É recomendável que o driver use uma combinação principal/secundária exclusiva para que esses casos possam ser identificados em falhas e relatórios watson.
  • Repita a configuração caso tenha sido um erro transitório.
  • Tente uma configuração diferente.

Um driver remoto pode decidir que falhas de alteração de configuração no meio da sessão não são tão críticas quanto falhas de configuração iniciais e, portanto, pode nunca chamar IddCxReportCriticalError no meio da sessão.

O driver não deve chamar IddCxReportCriticalError se IddCxDisplayConfigUpdate retornar STATUS_GRAPHICS_INDIRECT_DISPLAY_DEVICE_STOPPED como resultado da detecção do sistema operacional de que a sessão de destino está sendo desconectada ou o adaptador IddCx para essa sessão está sendo interrompido, pois isso é esperado.

Exibir alterações de API em uma sessão remota de exibição indireta

Em uma sessão XDDM remota, o painel de controle de exibição do sistema operacional não fornece ao usuário nenhum controle para alterar a configuração de exibição. Isso ocorre principalmente porque a configuração da área de trabalho de sessão remota é controlada pelo sistema cliente de conexão e não por aplicativos em execução na sessão. Por exemplo, dar suporte à interface do usuário de projeção do Win+P não faz sentido em uma sessão remota.

Em geral, para sessões de ID remota:

  • Exibir o trabalho das APIs de enumeração, incluindo QueryDisplayConfig
  • As APIs de configuração de exibição não funcionam. Por exemplo, não é desejável que um aplicativo em execução na sessão remota chame ChangeDisplaySettings/SetDisplayConfig para alterar a configuração da área de trabalho (por exemplo, alterar a posição da área de trabalho ou a topologia).

Curiosamente, as soluções XDDM remotas usam ChangeDisplaySetting para alterar modos e posições da área de trabalho, pois essa é a única maneira de aplicar as alterações do cliente. Como as soluções de ID remota têm a funcionalidade IdCxDisplayConfigUpdate , ChangeDisplaySetting não é mais necessário para funcionar em sessões de ID remotas.

A tabela a seguir mostra as APIs e a funcionalidade do painel de controle de exibição (CPL) em uma sessão remota XDDM e em uma sessão remota do WDDM.

API/CPL Sessão remota do XDDM Sessão remota do WDDM
Exibir CPL Nenhuma informação é exibida e uma mensagem dizendo "As Configurações de Exibição não podem ser alteradas de uma sessão remota" é emitida. Mesmo comportamento de uma sessão remota XDDM.
Interface do usuário e funcionalidade do Win+P A interface do usuário não é mostrada e a API falha. Mesmo comportamento de uma sessão remota XDDM.
APIs de enumeração de exibição herdadas (como EnumDisplaySettings & EnumDisplayDevices) A API funciona conforme o esperado e retorna informações relevantes. Mesmo comportamento de uma sessão remota XDDM.
ChangeDisplaySetting herdado Funciona e é usado para refletir as alterações da área de trabalho do cliente. Retorna êxito por motivos de compatibilidade do aplicativo, mas ignora a chamada e não altera nenhuma configuração de exibição. A IDD usará IddCxDisplayConfigUpdate para alterar a configuração da área de trabalho.
QueryDisplayConfig Falhar. Funciona conforme o esperado.
DisplayConfigGetDeviceInfo Falhar. Funciona e relata as informações esperadas.
SetDisplayConfig e DisplayConfigSetDeviceInfo Falhar. Mesmo comportamento de uma sessão remota XDDM.

Monitorar o comportamento ocioso em uma sessão remota de ID

Quando a pilha de protocolo chama IWRdsProtocolConnectionCallback::StopScreenUpdates para parar de atualizar a tela do cliente, o sistema operacional destrói os swapchains e torna todos os caminhos dessa sessão inativos, resultando no retorno de chamada EVT_IDD_CX_ADAPTER_COMMIT_MODES da IDD sendo chamado com IDDCX_PATH_FLAGS_NONE definidos em IDDCX_PATH. Sinalizadores para todos os caminhos.

Quando a pilha de protocolo chama IWRdsProtocolConnectionCallback::RedrawWindow para habilitar as atualizações novamente, o sistema operacional define novos caminhos ativos usando o retorno de chamada EVT_IDD_CX_ADAPTER_COMMIT_MODES da IDD e novos swapchains serão criados.

Comportamento de desconexão em uma sessão remota de ID

Quando o usuário se desconecta de uma sessão remota, o sistema operacional destrói o devnode que hospeda o dispositivo de ID remoto para essa sessão, resultando no adaptador de ID remoto para essa sessão sendo PnpStopped. O UMDF chamará o retorno de chamada EVT_WDF_DEVICE_D0_EXIT da IDD remota.

Se a sessão estiver conectada novamente remotamente, o sistema operacional criará um novo devnode para a ID remota dessa sessão. A IDD remota deve passar pela sequência de inicialização normal novamente, inicializar o adaptador e adicionar monitores etc.