Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
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