调试间接显示驱动程序

间接显示驱动程序 (IDD) 是 UMDF 驱动程序,因此 UMDF 调试文档(例如 确定 UMDF 驱动程序加载失败的原因或 UMDF 设备无法启动)是一个很好的起点。 此页提供特定于间接显示的调试信息。

注册表控件

Indirect Display Driver Class eXtension (IccDx) 具有一些可用于帮助调试 IDD 的注册表设置。 所有注册表值都位于 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 在框架中的脏凹槽上覆盖彩色 alpha 框;需要设置0x0200
0x0800 将 pref 统计信息叠加到帧中
0x2000 IddCx 将查询每个帧的捕获帧注册表值;需要设置0x0200

注意

若要运行任何覆盖函数,必须使用 D3D11_CREATE_DEVICE_BGRA_SUPPORT 标志创建由驱动程序创建并传递给 IddCxSwapChainSetDevice 的 Direct3D 设备。

IddCx WPP 跟踪

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

控制捕获的内容

在这种情况下 ,logman.exe 的 Flags 参数 (0x4f4) 控制 IddCx 记录的 WPP 消息。 此 的含义值在 Windows 版本 19041 及更高版本中已更改。

Windows 内部版本 19041 及更高版本的标志的含义

Flags 是一个位字段,其中每个位控制是否捕获该类型的消息。

标志位 捕获的消息类型
0x001 未使用
为 0x002 未使用
0x004 错误
0x008 良性错误,例如在没有设置D3D11_CREATE_DEVICE_BGRA_SUPPORT的情况下启用调试覆盖时
0x010 IddCx 对象
0x020 UMDF 框架调用 IddCx
0x040 从 IddCx 到驱动程序的 DDI 调用
0x080 从驱动程序到 IddCx 的低频率调用
0x100 从驱动程序到 IddCx 的与帧相关的高频率调用
0x200 从驱动程序到 IddCx 的与游标相关的高频率调用
0x400 从内核调用 IddCx
0x800 从 IddCx 调用内核

0x0f4的正常日志记录方案是一个很好的起点。 如果要查看每个帧的信息,则0x1f4是一个很好的起点。

Windows 内部版本 19041 之前的标志含义

标志被视为一个级别,每个递增级别都添加了一种新的消息类型以及以前级别中的所有消息。

标志级别值 捕获的消息类型
1 未使用
2 错误
3 警告
4 信息
5 详细

解码 IddCx WPP 跟踪

与所有 WPP 跟踪一样,WPP 信息存储在 pdb 文件中,因此需要使用该信息访问 pdbs 才能解码。 从 Windows 内部版本 19560 开始,公共符号服务器上的 IddCx.pdb 包含解码 WPP 消息所需的 WPP 信息。 在 Windows 内部版本 19560 之前,公共符号服务器上的 IddCx.pdb不包含 启用 WPP 解码所需的 WPP 信息。

任何标准 WPP 解码工具都可用于解码和显示消息。

调试 IddCx 错误

在开发间接显示驱动程序时,当 IddCx 检测到错误时,获取其他信息通常很有用。 如上所述,可以将 IddCx 配置为在 IddCx 检测到错误时闯入调试器,但在最后几个跟踪消息中显示 IddCx 错误消息来了解错误的上下文也很有用。

使用上一部分,可以使用 logman.exe 启用 WPP 跟踪,并结合以下信息在发生故障时在内核调试器中显示内存中的 WPP 缓冲区。

注意

为此,需要使用内核调试器 (而不是用户模式调试器) 和 Windows 版本 19560 或更高版本,以便调试器获取包含 WPP 解码信息的 IddCx.pdb

在下面的示例中,间接显示驱动程序调用 IddCxMonitorArrival。 作为处理的一部分,IddCx 调用驱动程序的 EvtIddCxMonitorQueryTargetModes DDI。 在此示例中,驱动程序返回了具有DISPLAYCONFIG_VIDEO_SIGNAL_INFO的模式。AdditionalSignalInfo.vSyncFreqDivider 设置为零,这无效并导致错误。

下面是使用的调试器命令的列表:

命令 含义
!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 中有一个主控件值,用于控制 IddCx 是否将为每个帧检查捕获注册表值。 这可确保禁用时不会造成性能损失。

注意

当 OPM 接口对驱动程序处于活动状态时,将禁用此功能。

控制捕获的注册表值

以下注册表值位于 HKLM\System\CurrentControlSet\Control\GraphicsDrivers\IddCxFrameCapture 中。 应在设置 IddCxDebugCtrl 值之前创建此注册表文件夹。

名称 缺少默认值 含义
TriggerUniqueness 0 调用每个 IddCx 交换链以获取新帧时,它将读取此值。 如果 TriggerUniqueness 为非零且不同于以前的读取值,则将读取以下值并启用帧捕获。
TargetMask 0xffff 位掩码:适配器上每个目标索引的一位,用于控制该目标的交换链是否应成为此捕获序列的一部分。
CaptureCount 10 每个 enabled-for-capture 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

用于更新 TriggerUniqueness 的 REG 文件

Windows Registry Editor Version 5.00

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

文件名和格式

捕获的帧采用 PNG 文件格式,文件名格式如下:

S<会话 ID,主机>为零_Ad<ID 适配器 LUID> 的十六进制值_T<ID 目标 Idx> 的十六进制值_Frame<IDDCX_METADATA 中的帧数。hhmmss>中 mmddyy format>_Time 的 PresentationFrameNumber>_<<Date.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 消息,其中包含图像文件的完整文件名。

示例捕获设置

从首次连接监视器时捕获帧

下面是捕获第一次插入任何监视器(后跟 REG 文件)的前 20 帧所需的注册表值。

注册表项 说明
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

从远程会话 3 中的第二个目标捕获 10 帧,每个捕获之间有 5 个帧

此捕获还使用调试覆盖来突出显示每个帧的脏区域。

注册表项 说明
IddCxDebugCtrl 还设置了位0x0400 0x0400启用脏区域突出显示,还需要0x2200位
CaptureSessionID 3 启用远程会话 3 中的捕获
TargetMask 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