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


Отладка драйверов непрямого отображения

Драйверы непрямых дисплеев (IDD) являются драйверами UMDF, поэтому в документации по отладке UMDF, такой как Определение причины, по которой драйвер UMDF не загружается или устройство UMDF не запускается, является хорошей отправной точкой. На этой странице содержатся сведения об отладке, связанные с косвенным отображением.

Элемент управления реестром

Класс eXtension (IccDx) непрямого драйвера отображения имеет некоторые параметры реестра, которые можно использовать для отладки идентификаторов. Все значения реестра находятся в разделе реестра HKLM\System\CurrentControlSet\Control\GraphicsDrivers .

Имя значения Сведения
TerminateIndirectOnStall Нулевое значение отключает наблюдатель, который завершает работу драйвера, если он не обрабатывает кадр в течение 10 секунд после того, как кадр станет доступным. Любое другое значение оставляет сторожевой параметр включенным.
IddCxDebugCtrl Битовое поле, включающее различные аспекты отладки IddCx. См. таблицу ниже.

Примечание

Если параметр реестра TerminateIndirectOnStall используется для отключения наблюдателя, HLK-тесты завершатся ошибкой.

Значения IddCxDebugCtrl

Бит в IddCxDebugCtrl Значение
0x0001 Войдите в отладчик, когда IddCx обнаруживает ошибку
0x0002 Переход к отладчику при загрузке IddCx
0x0004 Прерывание использования отладчика при выгрузке IddCx
0x0008 Войдите в отладчик при вызове IddCx DriverEntry
0x0010 Прерывание использования отладчика при вызове привязки драйвера
0x0020 Прерывание работы отладчика при вызове запуска драйвера
0x0040 Прерывание использования отладчика при вызове отмены привязки драйвера
0x0080 Отключает функцию наблюдения DDI, которая завершает работу драйвера, занимает слишком много времени в вызове DDI.
0x0100 Не используется
0x0200 Включение наложения отладки см. ниже
0x0400 Наложение цветного альфа-поля на грязное прямоугольника в рамке; требуется, чтобы 0x0200 было задано
0x0800 Наложение предварительной статистики в кадр
0x2000 IddCx будет запрашивать значения реестра кадра записи каждого кадра; требуется задать 0x0200

Примечание

Для работы любой из функций наложения устройство Direct3D, созданное драйвером и переданное в IddCxSwapChainSetDevice , должно быть создано с флагом D3D11_CREATE_DEVICE_BGRA_SUPPORT .

Трассировки WPP IddCx

Iddcx использует инфраструктуру WPP для ведения журнала отладочной информации. Данные WPP можно записать в файл, и во время выполнения этой записи они могут отображаться в отладчике ядра.

Запись трассировки IDdCx WPP

Существует несколько способов включения трассировки WPP. Один из удобных способов — использовать сборку в logman.exe программе. Если скопировать следующую строку в пакетный файл и выполнить команду из командной строки с повышенными привилегиями, она соберет трассировки IDdCx WPP в файл 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

Управление тем, что захватывается

Параметр Flags logman.exe (0x4f4 в данном случае) управляет тем, какие сообщения WPP регистрирует IddCx. Значение этого значения изменилось в сборке Windows 19041 и более поздних версий.

Флаги для сборки Windows 19041 и более поздних версий

Флаги — это битовое поле, где каждый бит определяет, записывается ли сообщение этого типа.

Бит флагов Захваченный тип сообщения
0x001 Не используется
0x002 Не используется
0x004 ошибки
0x008 Неопасные ошибки, например, если наложение отладки включено без D3D11_CREATE_DEVICE_BGRA_SUPPORT задано
0x010 Объекты IddCx
0x020 Вызовы платформы UMDF в IddCx
0x040 Вызовы DDI из IddCx в драйвер
0x080 Низкочастотные вызовы от драйвера к IddCx
0x100 Вызовы, связанные с высокочастотным кадром, от драйвера к IddCx
0x200 Высокочастотные вызовы, связанные с курсором, от драйвера к IddCx
0x400 Вызовы из ядра в IddCx
0x800 Вызовы из IddCx в ядро

Нормальный сценарий ведения журнала 0x0f4 является хорошей отправной точкой. Если вы хотите просмотреть сведения о кадре, 0x1f4 является хорошей отправной точкой.

Флаги, означающее до сборки Windows 19041

Флаги рассматривались как уровень, каждый увеличивающийся уровень добавлял новый тип сообщения вместе со всеми сообщениями из предыдущих уровней.

Значение уровня флагов Захваченный тип сообщения
1 Не используется
2 ошибки
3 Предупреждения
4 Сведения
5 Подробный

Декодирование трассировки IDdCx WPP

Как и все трассировки WPP, данные WPP хранятся в PDB-файлах , поэтому для декодирования необходим доступ к PDB-файламс этой информацией. Начиная со сборки Windows 19560 , iddCx.pdb на сервере открытых символов содержит сведения WPP, необходимые для декодирования сообщений WPP. До сборки Windows 19560 iddCx.pdb на сервере открытых символов не содержал необходимых сведений WPP для включения декодирования WPP.

Для декодирования и отображения сообщений можно использовать любые стандартные средства декодирования WPP.

Ошибки отладки IddCx

При разработке драйвера косвенного отображения часто полезно получить дополнительные сведения, когда IddCx обнаруживает ошибку. Как описано выше, вы можете настроить IddCx для прерывания работы отладчика, когда IddCx обнаруживает ошибку, но также полезно отобразить сообщение об ошибке IddCx в последних нескольких сообщениях трассировки, чтобы понять контекст ошибки.

В приведенном выше разделе вы можете включить трассировку WPP с помощью logman.exe и со следующими сведениями отобразить буфер WPP в памяти в отладчике ядра в точке сбоя.

Примечание

Для этого необходимо использовать отладчик ядра (не отладчик пользовательского режима) и windows сборки 19560 или более поздней версии, чтобы отладчик мог получить iddCx.pdb , содержащий сведения о декодирования WPP.

В приведенном ниже примере драйвер косвенного отображения вызывает IddCxMonitorArrival. В рамках обработки IddCx вызывает драйвер EvtIddCxMonitorQueryTargetModes DDI. В этом примере драйвер вернул режим с DISPLAYCONFIG_VIDEO_SIGNAL_INFO. Параметр AdditionalSignalInfo.vSyncFreqDivider имеет значение 0, что является недопустимым и вызывает ошибку.

Ниже приведен список используемых команд отладчика:

Get-Help Значение
!wmitrace.bufdump Перечисление всех буферов ведения журнала вместе с именем, IddCx — это имя нашего, происходит из командной строки logman.exe
!wmitrace.logdump LogBufferName Декодирует и отображает содержимое указанного буфера ведения журнала, который является IddCx в приведенном ниже примере.

Ниже приведены выходные данные отладчика для этого примера:

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

Последняя строка указывает причину сбоя.

Функции отладки непрямого отображения снимка экрана

Начиная со сборки Windows 25164, IddCx имеет возможность дампа кадра рабочего стола, который IddCx передает драйверу. Эту функцию можно использовать для отладки визуальных проблем. Его можно сочетать с отладочными наложениями, такими как заливка грязное областях кадра.

Так как IddCx будет искать изменения в параметре реестра отладки для захвата кадра на каждом кадре, в IddCxDebugCtrl есть значение элемента управления master, которое определяет, будет ли IddCx проверка значение реестра записи для каждого кадра. Это гарантирует отсутствие снижения производительности при отключении.

Примечание

Эта функция отключается, если интерфейс OPM активен для драйвера.

Значения реестра, управляющие записью

Следующие значения реестра находятся в HKLM\System\CurrentControlSet\Control\GraphicsDrivers\IddCxFrameCapture. Эта папка реестра должна быть создана до установки значения IddCxDebugCtrl.

Имя Значение по умолчанию, если отсутствует Значение
TriggerUniqueness 0 При вызове каждой цепочки буферов IddCx для получения нового кадра он считывает это значение. Если значение TriggerUniqueness не равно нулю и отличается от ранее прочитанного значения, то приведенные ниже значения будут считываться, а запись кадра будет включена.
Целевая маска 0xffff Битовая маска— по одному биту для каждого целевого индекса на адаптере, который определяет, должна ли цепочка буферов для этого целевого объекта быть частью этой последовательности захвата.
CaptureCount 10 Количество кадров, которые должна захватывать каждая цепочка буферов IddCx, включенная для записи.
SkipFrames 0 Количество кадров, пропускаемых между каждым захваченным кадром.
CaptureSessionID 0 Сеанс, в котором будет включена запись кадра. Нулевое значение всегда означает сеанс консоли.
ScaleFactor 100 Управляет коэффициентом масштабирования, используемым для определения размеров захваченного файла, допустимые значения 1–100
CaptureFolder c:\IddCxImages Папка, в которой будут записываться файлы записи. Папка c:\IddCxImages будет создана, если она не существует.

Параметры записи хранятся для каждого целевого объекта, что позволяет сеансу захвата охватывать изменение режима на заданном целевом объекте.

Если обнаружено новое ненулевое значение TriggerUniqueness , пока объект монитора по-прежнему захватывает кадры из предыдущего захвата, он остановит текущий захват и запустит только что активированный.

Использование REG-файлов для управления записью кадров

REG-файлы — хороший способ управления кадрами. Один файл может задать начальные значения, а другой — обновить TriggerUniqueness.

REG-файл для задания начальных значений

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

REG-файл для обновления TriggerUniqueness

Windows Registry Editor Version 5.00

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

Имя и формат файла

Захваченные кадры будут иметь формат PNG-файла со следующим форматом имени файла:

S<Session Id, zero for console>_Ad<Hex value of ID adapter LUID>_T<Hex Value of ID target Idx>_Frame<Frame number from IDDCX_METADATA. PresentationFrameNumber>_<Date в формате> mmddy_<Time в hhmmss>.png

Ниже приведены некоторые примеры имен файлов:

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

Ведение журнала WPP

Для каждого запущенного нового сеанса записи сообщения WPP будут регистрироваться для каждого значения, считываемого из реестра или заданного по умолчанию.

Каждый раз, когда кадр записывается и записывается в файл, IddCx добавляет сообщение WPP, содержащее полное имя файла изображения.

Пример параметра записи

Запись кадров при первом подключении монитора

Ниже приведены значения реестра, необходимые для записи первых 20 кадров при первом подключении любого монитора, за которым следует REG-файл.

Параметр реестра Значение Примечания
CaptureCount 20 Задайте 20 кадров, а не 10 по умолчанию
TriggerUniqueness 1 Любое ненулевое значение будет работать как целевой объект начинается с нуля как уникальность хранилища
Windows Registry Editor Version 5.00

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

Запуск записи при активном мониторе

Учитывая, что цепочки буферов проверка для нового значения уникальности, когда драйвер получает каждый кадр, следует задать запись TriggerUniqueness последней, чтобы убедиться, что все параметры считываются должным образом. В следующем примере также выполняется половина разрешения файлов, чтобы сэкономить место, и файлы записи записываются в папку c:\frames .

Параметр реестра Значение Примечания
CaptureCount 100 Задайте 100 кадров, а не 10 по умолчанию
ScaleFactor 50 Настройка разрешения 50 % для экономии места
CaptureFolder c:\frames Задать выходную папку
TriggerUniqueness 1 Любое ненулевое значение будет работать, так как целевой объект начинается с нуля в качестве уникальности хранилища.
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

Захват 10 кадров из второго целевого объекта в удаленном сеансе 3 с 5 кадрами между ними

В этом захвате также используется отладочное наложение для выделения грязное регионов для каждого кадра.

Параметр реестра Значение Примечания
IddCxDebugCtrl Битовое 0x0400 также задано 0x0400 позволяет выделять грязное области, 0x2200 битами
CaptureSessionID 3 Включает запись в удаленном сеансе 3
Целевая маска 0x2 Бит 1 соответствует целевому idx 1
SkipFrames 5 Пропуск записи по 5 кадров между каждым захватом
TriggerUniqueness 1 Любое ненулевое значение будет работать как целевой объект начинается с нуля в качестве уникальности хранилища
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