Depurando drivers de exibição indireta

Drivers de monitores indiretos (IDDs) são drivers UMDF. Portanto, a documentação de depuração UMDF, como Determinando por que o driver UMDF não carrega ou o dispositivo UMDF falha ao iniciar, é um bom ponto de partida. Esta página fornece informações de depuração específicas de exibição indireta.

Controlo de registo

O Indirect Display Driver Class eXtension (IddCx) tem algumas configurações do registo que podem ser usadas para ajudar na depuração de IDDs. Todos os valores do Registro estão localizados na chave do Registro HKLM\System\CurrentControlSet\Control\GraphicsDrivers .

Nome do valor Detalhes
TerminateIndirectOnStall Um valor zero desativa o cão de guarda que encerra o driver se ele não processar um quadro dentro de 10 segundos após o quadro estar disponível. Qualquer outro valor deixa o watchdog ativo.
IddCxDebugCtrl Campo de bits que permitiu diferentes aspetos de depuração do IddCx. Veja a tabela a seguir.

Observação

Se o valor do registo TerminateIndirectOnStall for usado para desativar o watchdog, os testes HLK falharão.

Valores IddCxDebugCtrl

Bit em IddCxDebugCtrl Significado
0x0001 Invadir o depurador quando o IddCx detetar um erro
0x0002 Invadir o depurador quando o IddCx é carregado
0x0004 Interromper o depurador quando o IddCx for descarregado da memória
0x0008 Invada o depurador quando IddCx DriverEntry é chamado
0x0010 Interrompa no depurador quando a ligação do driver é chamada
0x0020 Interrompa o depurador quando o arranque do driver é chamado
0x0040 Invada o depurador quando a desvinculação do driver é chamada
0x0080 Desativa o watchdog DDI que termina o driver quando este demora demasiado tempo na chamada DDI
0x0100 Não utilizado
0x0200 Ative a sobreposição de depuração, veja a seguinte nota
0x0400 Sobreponha a caixa alfa colorida sobre os retângulos sujos no quadro; requer que 0x0200 esteja definido.
0x0800 Sobreponha estatísticas de perf no quadro
0x2000 O IddCx consultará os valores do registro do quadro de captura a cada quadro; requer 0x0200 a ser definido

Observação

Para que qualquer uma das funções de sobreposição funcione, o dispositivo Direct3D criado pelo driver e passado para IddCxSwapChainSetDevice deve ser criado com o sinalizador D3D11_CREATE_DEVICE_BGRA_SUPPORT.

Rastreamentos WPP IddCx

O Iddcx usa a infraestrutura WPP para registrar informações de depuração. As informações do WPP podem ser capturadas em um arquivo e, enquanto essa captura está em andamento, podem ser exibidas no depurador do kernel.

Capturando o rastreamento do IddCx WPP

Há várias maneiras de habilitar o rastreamento WPP. Uma maneira conveniente é usar o programa integrado logman.exe. Se copiar as seguintes linhas para um ficheiro batch e executá-lo a partir de um prompt de comando elevado, ele coletará rastreamentos WPP IddCx no ficheiro IddCx.etl.

@echo off  
echo Starting WPP tracing....
logman create trace IddCx -o IddCx.etl -ets -ow -mode sequential -p  {D92BCB52-FA78-406F-A9A5-2037509FADEA} 0x4f4 0xFF
echo Tracing enabled
pause
echo Stopping WPP tracing....
logman -stop IddCx -ets

Controlando o que é capturado

O parâmetro Flags de logman.exe (0x4f4 neste caso) controla as mensagens WPP que o IddCx registra. O significado de Flags mudou na compilação do Windows 19041 e posterior.

Significado dos sinalizadores para a versão 19041 e posteriores do Windows

O parâmetro Flags é um campo de bits, onde cada bit controla se esse tipo de mensagem é capturado.

Bits de sinalização Tipo de mensagem capturado
0x001 Não utilizado
0x002 Não utilizado
0x004 Erros
0x008 Erros benignos, por exemplo, quando sobreposições de depuração são ativadas sem o parâmetro D3D11_CREATE_DEVICE_BGRA_SUPPORT definido
0x010 Objetos IddCx
0x020 A estrutura UMDF chama o IddCx
0x040 Chamadas DDI de IddCx para o controlador
0x080 Chamadas de baixa frequência do driver para o IddCx
0x100 Chamadas de alta frequência relacionadas com quadros do controlador para o IddCx
0x200 Chamadas de alta frequência relacionadas ao cursor entre o driver e o IddCx
0x400 Chamadas do kernel para o IddCx
0x800 Chamadas do IddCx para o kernel

Um cenário normal de registo de 0x0f4 é um bom ponto de partida. Se você quiser visualizar informações por quadro, então 0x1f4 é um bom ponto de partida.

Significado das bandeiras antes da versão 19041 do Windows

Os "Flags" foram tratados como níveis; cada novo nível adicionado introduzia um novo tipo de mensagem, juntamente com todas as mensagens dos níveis anteriores.

Valor do nível dos sinalizadores Tipo de mensagem capturado
1 Não utilizado
2 Erros
3 Advertências
4 Informação
5 Verbose

Decodificação do Rastreamento WPP IddCx

Como todos os rastreamentos WPP, as informações WPP são armazenadas em arquivos pdb . Assim, o acesso aos arquivos pdb com essas informações é necessário para decodificar. A partir da compilação 19560 do Windows, o IddCx.pdb no servidor de símbolos públicos contém as informações WPP necessárias para decodificar mensagens WPP. Antes da compilação 19560 do Windows, o IddCx.pdb no servidor de símbolos públicos não continha* as informações WPP necessárias para habilitar a decodificação WPP.

Qualquer uma das ferramentas padrão de decodificação WPP pode ser usada para decodificar e exibir as mensagens.

Depurando erros IddCx

Ao desenvolver um IDD, geralmente é útil obter informações adicionais quando o IddCx deteta um erro. Conforme descrito anteriormente, você pode configurar o IddCx para invadir o depurador quando o IddCx detetar um erro, mas também é útil exibir a mensagem de erro IddCx nas últimas mensagens de rastreamento para entender o contexto do erro.

Usando a seção anterior, você pode habilitar o rastreamento WPP usando logman.exe e, com as informações a seguir, exibir o buffer WPP na memória no depurador do kernel no ponto da falha.

Observação

Para que isso funcione, você precisa estar usando um depurador do kernel (não um depurador de modo de usuário) e o Windows build 19560 ou posterior para que o depurador obtenha o IddCx.pdb que contém as informações de decodificação WPP.

No exemplo a seguir, o IDD chama IddCxMonitorArrival. Como parte do processamento, o IddCx chama o DDI EvtIddCxMonitorQueryTargetModes do driver. Neste exemplo, o driver retornou um modo com DISPLAYCONFIG_VIDEO_SIGNAL_INFO. AdditionalSignalInfo.vSyncFreqDivider definido como zero, que é inválido e causa um erro.

Aqui está uma lista dos comandos do depurador usados:

Comando Significado
!wmitrace.bufdump Liste todo o buffer de registro junto com o nome, IddCx é o nome nosso, vem da linha de comando logman.exe
!wmitrace.logdump LogBufferName Decodifica e exibe o conteúdo do buffer de log especificado, que é IddCx no exemplo a seguir

Aqui está a saída do depurador para este exemplo:

0: kd> !wmitrace.bufdump
(WmiTrace) BufDump
    LoggerContext Array @ 0xFFFFE6055EB0AC40 [64 Elements]

 Logger Context  Number Available   Size    NPP Usage   PP Usage
================ ====== ========= ======== =========== ==========
ffffe6055ee6c800      4         2     4096       16384             Circular Kernel Context Logger
ffffe6055eaa8640      2         2    65536      131072             Eventlog-Security
ffffe6055eb83a00      2         1    65536      131072             DefenderApiLogger
ffffe6055ebb6a00      2         2    65536      131072             DefenderAuditLogger
ffffe6055eb74040      2         1    16384       32768             DiagLog
ffffe6055eb74640      4         2    65536      262144             Diagtrack-Listener
ffffe6055eaa8040      2         2    65536                 131072  EventLog-Application
ffffe6055eb7c040      2         1    65536      131072             EventLog-System
ffffe6055eb7c640      5         3    65536      327680             LwtNetLog
ffffe6055eb85040      4         2    65536      262144             Microsoft-Windows-Rdp-Graphics-RdpIdd-Trace
ffffe6055eb85680      8         6   131072     1048576             NetCore
ffffe6055eb89040      4         4     4096       16384             NtfsLog
ffffe6055eb89640      8         6   131072     1048576             RadioMgr
ffffe605683ef040      3         2     4096                  12288  WindowsUpdate_trace_log
ffffe6055eb8f640      2         2     2048        4096             UBPM
ffffe6055eb108c0      4         2    16384       65536             WdiContextLog
ffffe6055eb968c0      4         2    81920      327680             WiFiSession
ffffe60567e8a6c0      5         3     8192       40960             IddCx
ffffe605658379c0     10         9     3072       30720             umstartup
ffffe605659d4840     10         9   131072     1310720             SCM
ffffe605655af9c0      2         1    65536      131072             UserNotPresentTraceSession
ffffe605659d6840      2         1     4096        8192             COM
ffffe60565925080     10         8    20480      204800             Terminal-Services-LSM
ffffe60565956080     10         9    20480      204800             Terminal-Services-RCM
ffffe6055eba39c0     50        49     3072      153600             UserMgr
ffffe60567388280      2         2    32768       65536             WFP-IPsec Diagnostics
ffffe605678a3040      5         3     4096       20480             MpWppTracing-20200424-092923-00000003-ffffffff
ffffe60567e35080      2         1    65536      131072             ScreenOnPowerStudyTraceSession
ffffe605655e0a00      5         3     4096       20480             SHS-04242020-092951-7-7f
ffffe605692054c0      4         4     8192       32768             RdpIdd
ffffe60567f597c0      4         3    65536      262144             SgrmEtwSession
ffffe605678a9a00      4         4     8192       32768             DispBrok-DeskSrv
ffffe60569286680      4         4     8192       32768             DispBrok-Desk
ffffe605668026c0      4         4     8192       32768             DispBrok
================ ====== ========= ======== =========== ==========
                    195       159             6651904     143360

0: kd> !wmitrace.logdump IddCx
(WmiTrace) LogDump for Logger Id 0x13
Found Buffers: 5 Messages: 537, sorting entries
[1]0EF8.0CF0::04/24/2020-09:43:36.894 [cx][IddCx]DriverEntry: Enter
[1]0EF8.0CF0::04/24/2020-09:43:36.897 [cx][IddCx]?IddCxLibraryInitialize@@YAJXZ: Enter
[1]0EF8.0CF0::04/24/2020-09:43:36.897 [cx][IddCx]?IddCxLibraryInitialize@@YAJXZ: Exit
[1]0EF8.0CF0::04/24/2020-09:43:36.897 [cx][IddCx]DriverEntry: Exit, status=STATUS_SUCCESS
[0]0EF8.0CF0::04/24/2020-09:43:36.904 [cx][IddCx]?IddCxLibraryBindClient@@YAJPEAU_WDF_CLASS_BIND_INFO@@PEAPEAX@Z: Enter
[0]0EF8.0CF0::04/24/2020-09:43:36.904 [cx][IddCx]?IddCxLibraryBindClient@@YAJPEAU_WDF_CLASS_BIND_INFO@@PEAPEAX@Z: Exit, status=STATUS_SUCCESS
[0]0EF8.0CF0::04/24/2020-09:43:36.910 [cx][IddCx]IddCxImplDeviceInitConfig: Enter
[0]0EF8.0CF0::04/24/2020-09:43:36.910 [cx][IddCx]IddCxImplDeviceInitConfig: Exit, status=STATUS_SUCCESS
[0]0EF8.0CF0::04/24/2020-09:43:36.910 [cx][IddCx]IddCxImplGetVersion: Enter
[0]0EF8.0CF0::04/24/2020-09:43:36.910 [cx][IddCx]IddCxImplGetVersion: Exit, status=STATUS_SUCCESS
[0]0EF8.0CF0::04/24/2020-09:43:36.911 [cx][IddCx]IddCxImplDeviceInitialize: Enter
[0]0EF8.0CF0::04/24/2020-09:43:36.912 [cx][IddCx]IddCxImplDeviceInitialize: New IddDevice 0x000001642F5E0770 created
[0]0EF8.0CF0::04/24/2020-09:43:36.912 [cx][IddCx]IddCxImplDeviceInitialize: Exit, status=STATUS_SUCCESS
[0]0EF8.0CF0::04/24/2020-09:43:36.917 [cx][IddCx]IddCxImplAdapterInitAsync: Enter
[0]0EF8.0CF0::04/24/2020-09:43:36.917 [cx][IddCx]?Init@IddAdapter@@QEAAXPEAUIDDCX_ADAPTER__@@PEAVIddDevice@@PEAUIDDCX_ADAPTER_CAPS@@@Z: New IddAdapter 0x000001642F5E77D0 created, API object 0xFFFFFE9BD0A18978, IddDevice 0x000001642F5E0770
[0]0EF8.0CF0::04/24/2020-09:43:36.917 [cx][IddCx]?SendUserModeMessage@IddAdapter@@QEAAJIPEAXI0W4DXGK_IDD_ESCAPE_CODE@@PEAI@Z: Sending escape 0x0 to kernel
Unknown( 76): GUID=ac5ec775-ccdb-3c2c-6150-28b4eacacbc4 (No Format Information found).
[0]0EF8.0CF0::04/24/2020-09:43:36.917 [cx][IddCx]IddCxImplAdapterInitAsync: Exit, status=STATUS_SUCCESS
[0]0EF8.0558::04/24/2020-09:43:36.935 [cx][IddCx]?HandleKernelModeMessage@IddAdapter@@QEAAXIPEAXI0PEAI@Z: IddAdapter 0x000001642F5E77D0, processing command START_ADAPTER_COMPLETE from KMD
[0]0EF8.0558::04/24/2020-09:43:36.935 [cx][IddCx]?HandleKernelModeMessage@IddAdapter@@QEAAXIPEAXI0PEAI@Z: IddAdapter 0x000001642F5E77D0, Successful adapter start, Wddm Luid = 0xe6e90, Adapter caps 0x0, Session Id 0, Terminal Luid 0x0
[0]0EF8.0558::04/24/2020-09:43:36.935 [cx][IddCx]?HandleKernelModeMessage@IddAdapter@@QEAAXIPEAXI0PEAI@Z: Exit
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]<lambda_e42696d61f3ea0fd0d39fdb90d856b7b>::operator(): DDI: Calling EvtIddCxAdapterInitFinished DDI, IddAdapter 0xFFFFFE9BD0A18978
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]IddCxImplMonitorCreate: Enter
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]IddCxImplMonitorCreate: New IddMonitor 0x000001642F5EF720 created, API object 0xFFFFFE9BD0A11A38, IddAdapter 0x000001642F5E77D0
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]IddCxImplMonitorCreate: Exit, status=STATUS_SUCCESS
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]IddCxImplMonitorArrival: Enter
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]?StartWatchInternal@IddWatchdog@@AEAAXK@Z: IddWatchdog 0x000001642F5E77F0, still has pending watch not started by watchdog thread.
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]?ParseMonitorDescription@IddDevice@@QEAAXUIDDCX_MONITOR_DESCRIPTION@@AEAV?$vector@UIDDCX_MONITOR_MODE@@V?$allocator@UIDDCX_MONITOR_MODE@@@std@@@std@@AEAI@Z: DDI: Calling EvtIddCxParseMonitorDescriptio DDI to get mode count, Device 0x000001642F5E0770
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]?ParseMonitorDescription@IddDevice@@QEAAXUIDDCX_MONITOR_DESCRIPTION@@AEAV?$vector@UIDDCX_MONITOR_MODE@@V?$allocator@UIDDCX_MONITOR_MODE@@@std@@@std@@AEAI@Z: DDI: Return successfully from EvtIddCxParseMonitorDescriptio DDI to get mode count, mode count 23
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]?StartWatchInternal@IddWatchdog@@AEAAXK@Z: IddWatchdog 0x000001642F5E77F0, still has pending watch not started by watchdog thread.
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]?StartWatchInternal@IddWatchdog@@AEAAXK@Z: IddWatchdog 0x000001642F5E77F0, still has pending watch not started by watchdog thread.
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]?ParseMonitorDescription@IddDevice@@QEAAXUIDDCX_MONITOR_DESCRIPTION@@AEAV?$vector@UIDDCX_MONITOR_MODE@@V?$allocator@UIDDCX_MONITOR_MODE@@@std@@@std@@AEAI@Z: DDI: Calling EvtIddCxParseMonitorDescriptio DDI to get modes, Device 0x000001642F5E0770
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]?ParseMonitorDescription@IddDevice@@QEAAXUIDDCX_MONITOR_DESCRIPTION@@AEAV?$vector@UIDDCX_MONITOR_MODE@@V?$allocator@UIDDCX_MONITOR_MODE@@@std@@@std@@AEAI@Z: DDI: Return successfully from EvtIddCxParseMonitorDescriptio DDI to get modes
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]?StartWatchInternal@IddWatchdog@@AEAAXK@Z: IddWatchdog 0x000001642F5E77F0, still has pending watch not started by watchdog thread.
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]?AddMonitorModes@IddMonitor@@AEAAXAEAV?$vector@UTARGET_MONITOR_MODE@@V?$allocator@UTARGET_MONITOR_MODE@@@std@@@std@@@Z: IddMonitor 0x000001642F5EF720, parseMonitorDescription returned 23 modes.
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]?StartWatchInternal@IddWatchdog@@AEAAXK@Z: IddWatchdog 0x000001642F5E77F0, still has pending watch not started by watchdog thread.
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]?QueryModes@IddMonitor@@AEAAXAEAV?$vector@UIDDCX_TARGET_MODE@@V?$allocator@UIDDCX_TARGET_MODE@@@std@@@std@@@Z: DDI: Calling EvtIddCxMonitorQueryTargetModes DDI for mode count, IddMonitor 0x000001642F5EF720
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]?QueryModes@IddMonitor@@AEAAXAEAV?$vector@UIDDCX_TARGET_MODE@@V?$allocator@UIDDCX_TARGET_MODE@@@std@@@std@@@Z: DDI: Return successfully from EvtIddCxMonitorQueryTargetModes DDI, mode count = 0x23
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]?StartWatchInternal@IddWatchdog@@AEAAXK@Z: IddWatchdog 0x000001642F5E77F0, still has pending watch not started by watchdog thread.
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]?StartWatchInternal@IddWatchdog@@AEAAXK@Z: IddWatchdog 0x000001642F5E77F0, still has pending watch not started by watchdog thread.
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]?QueryModes@IddMonitor@@AEAAXAEAV?$vector@UIDDCX_TARGET_MODE@@V?$allocator@UIDDCX_TARGET_MODE@@@std@@@std@@@Z: DDI: Calling EvtIddCxMonitorQueryTargetModes DDI to get modes, IddMonitor 0x000001642F5EF720
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]?QueryModes@IddMonitor@@AEAAXAEAV?$vector@UIDDCX_TARGET_MODE@@V?$allocator@UIDDCX_TARGET_MODE@@@std@@@std@@@Z: DDI: Return successfully from EvtIddCxMonitorQueryTargetModes DDI
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]?StartWatchInternal@IddWatchdog@@AEAAXK@Z: IddWatchdog 0x000001642F5E77F0, still has pending watch not started by watchdog thread.
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]?AddTargetModes@IddMonitor@@AEAAXAEAV?$vector@UTARGET_MONITOR_MODE@@V?$allocator@UTARGET_MONITOR_MODE@@@std@@@std@@@Z: IddMonitor 0x000001642F5EF720, queryTargetModes returned 23 modes.
[0]0EF8.1588::04/24/2020-09:43:55.341 [cx][IddCx] Throwing error (Status 0xc000000d(STATUS_INVALID_PARAMETER)) from function Validate in onecoreuap\windows\core\dxkernel\indirectdisplays\classext\cx\ddivalidation.cpp:412, Msg DISPLAYCONFIG_VIDEO_SIGNAL_INFO.AdditionalSignalInfo.vSyncFreqDivider cannot be zero for target mode
Total of 537 Messages from 5 Buffers

A última linha dá o motivo da falha.

Funcionalidade de depuração para captura de tela indireta

A partir da compilação 25164 do Windows, o IddCx tem a capacidade de despejar o quadro da área de trabalho que o IddCx passa para o driver. Essa funcionalidade pode ser usada para depurar problemas visuais. Pode ser combinado com as sobreposições de depuração, como o sombreamento de regiões problemáticas de um fotograma.

O IddCx procura alterações na configuração do Registro de depuração para captura de quadros em cada quadro. Portanto, há um valor de controle mestre em IddCxDebugCtrl que controla esse comportamento. Essa configuração garante que não haja penalidade de desempenho quando desativado.

Observação

Essa funcionalidade é desativada quando a interface OPM está ativa para o driver.

Valores do Registro que controlam a captura

Os seguintes valores do Registro estão localizados em HKLM\System\CurrentControlSet\Control\GraphicsDrivers\IddCxFrameCapture. Essa pasta do Registro deve ser criada antes que o valor IddCxDebugCtrl seja definido.

Nome Padrão se em falta Significado
TriggerUniqueness 0 Quando cada cadeia de permuta IddCx é chamada para adquirir um novo quadro, ela lerá esse valor. Se TriggerUniqueness for diferente de zero e diferente do valor lido anteriormente, os valores abaixo serão lidos e a captura de quadros será ativada.
Máscara de destino 0xffff Bitmask, um bit correspondente a cada índice de destino no adaptador que controla se a cadeia de permuta desse destino deve fazer parte desta sequência de captura.
CaptureCount 10 Número de fotogramas que cada cadeia de permuta IddCx, habilitada para captura, deve capturar.
SkipFrames 0 Número de quadros a ignorar entre cada quadro capturado.
CaptureSessionID 0 A sessão em que a captura de quadros será ativada. Um valor zero sempre significa a sessão do console.
Fator de escala 100 Controla o fator de escala usado para decidir quais as dimensões do arquivo capturado, valores válidos 1-100
CaptureFolder c:\IddCxImages Pasta onde os arquivos de captura serão gravados. Uma pasta c:\IddCxImages será criada se não existir.

Os parâmetros de captura são armazenados por destino, o que permite que uma sessão de captura abranja uma mudança de modo em um determinado alvo.

Se um novo valor TriggerUniqueness diferente de zero for detetado enquanto um objeto de monitor ainda estiver capturando quadros de uma captura anterior, ele interromperá a captura atual e iniciará a captura recém-acionada.

Usando arquivos REG para controlar a captura de quadros

Os arquivos REG são uma boa maneira de controlar as capturas de quadros. Um arquivo pode definir os valores iniciais e outro pode atualizar TriggerUniqueness.

Ficheiro REG para definir valores iniciais

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers]
"IddCxDebugCtrl"=dword:2200

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\IddCxFrameCapture]
"TriggerUniqueness"=dword:0

Arquivo REG para atualizar TriggerUniqueness

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\IddCxFrameCapture]
"TriggerUniqueness"=dword:1

Nome e formato do ficheiro

Os quadros capturados estão no formato de arquivo PNG com o seguinte formato de nome de arquivo:

ID da sessão S<, zero para console>_Ad<Valor hexadecimal do adaptador ID LUID>_T<Valor hexadecimal do ID de destino Idx>_Frame<Número do quadro de IDDCX_METADATA.PresentationFrameNumber>_<Data no formato mmddyy>_<Hora no formato hhmmss>.png

Seguem-se alguns exemplos de nomes de ficheiros:

  • S0_Ad8ade_T3_Frame2343_020422_173434.png
  • S0_Ad8ade_T3_Frame2344_020422_173434.png
  • S0_Ad8ade_T3_Frame2345_020422_173435.png

Registo WPP

Para cada nova sessão de captura iniciada, as mensagens WPP serão registradas para cada valor lido do Registro ou definido por padrão.

Cada vez que um quadro é capturado e gravado no arquivo, o IddCx adiciona uma mensagem WPP que contém o nome de arquivo completo do arquivo de imagem.

Exemplo de configuração de captura

Capturar quadros de quando um monitor é conectado pela primeira vez

A seguir estão os valores do Registro necessários para capturar os primeiros 20 quadros de quando qualquer monitor é conectado pela primeira vez, seguido pelo arquivo REG.

Entrada de registro Valor Observações
CaptureCount 20 Definir 20 quadros em vez dos 10 padrão
TriggerUniqueness 1 Qualquer valor diferente de zero serve, pois o objeto de destino começa com zero, indicando uma unicidade de armazenamento.
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\IddCxFrameCapture]
"CaptureCount"=dword:00000014
"TriggerUniqueness"=dword:00000001

Iniciar a captura enquanto o monitor está ativo

Dado que as cadeias de permuta verificam um novo valor de exclusividade quando o driver adquire cada quadro, você deve definir a entrada TriggerUniqueness por último para garantir que todos os parâmetros sejam lidos conforme o esperado. O exemplo a seguir também reduz pela metade a resolução do arquivo para economizar espaço e grava os arquivos de captura na pasta c:\frames .

Entrada de registo Valor Observações
CaptureCount 100 Definir 100 quadros em vez dos 10 padrão
Fator de escala 50 Defina uma resolução de 50% para economizar espaço
CaptureFolder c:\frames Definir pasta de saída
TriggerUniqueness 1 Qualquer valor diferente de zero funciona, dado que o objeto de destino começa com zero para representar a exclusividade do armazenamento.
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\IddCxFrameCapture]
"CaptureCount"=dword:00000014
"CaptureFolder"="c:\\frames"
"ScaleFactor"=dword:00000032
"TriggerUniqueness"=dword:00000001

Capture 10 fotogramas do segundo alvo na sessão remota 3, com 5 fotogramas entre cada captura.

Essa captura também usa a sobreposição de depuração para destacar as regiões sujas de cada um dos quadros.

Entrada de registo Valor Observações
IddCxDebugCtrl Bit 0x0400 também definido 0x0400 permite realce de região suja, 0x2200 bits também necessários
IDDeSessãoDeCaptura 3 Permite a captura na sessão remota 3
Máscara de destino 0x2 O bit 1 corresponde ao destino Idx 1
SkipFrames 5 Ignorar a captura de cinco quadros entre cada captura
TriggerUniqueness 1 Qualquer valor diferente de zero é usado, pois o objeto de destino começa com zero, estabelecendo a unicidade do armazenamento.
Windows Registry Editor Version 5.00  

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers]  
"IddCxDebugCtrl"=dword:2600

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\IddCxFrameCapture]
"CaptureSessionID"=dword:00000003
"TargetMask"=dword:00000002
"SkipFrames"=dword:00000005    
"TriggerUniqueness"=dword:00000001