Debugging indirect display drivers

Indirect Displays drivers (IDDs) are UMDF drivers so the UMDF debugging documentation, such as Determining Why the UMDF Driver Fails to Load or the UMDF Device Fails to Start, is a good starting point. This page provides indirect display-specific debugging information.

Registry control

The Indirect Display Driver Class eXtension (IccDx) has some registry settings that can be used to aid debugging IDDs. All registry values are located under the HKLM\System\CurrentControlSet\Control\GraphicsDrivers registry key.

Value Name Details
TerminateIndirectOnStall A zero value will disable the watchdog that terminates the driver if it does not process a frame within 10 seconds of the frame being available. Any other value will leave the watchdog enabled.
IddCxDebugCtrl Bit-field that enabled different debug aspects of IddCx. See the table below.

Note

If the TerminateIndirectOnStall registry value is used to disable the watchdog, HLK tests will fail.

IddCxDebugCtrl values

Bit in IddCxDebugCtrl Meaning
0x0001 Break into the debugger when IddCx detects an error
0x0002 Break into the debugger when IddCx is loaded
0x0004 Break into the debugger when IddCx is unloaded
0x0008 Break into the debugger when IddCx DriverEntry is called
0x0010 Break into the debugger when driver bind is called
0x0020 Break into the debugger when driver start is called
0x0040 Break into the debugger when driver unbind is called
0x0080 Disables the DDI watchdog which terminates driver is takes too long in DDI call
0x0100 Unused
0x0200 Enable debug overlay, see below
0x0400 Overlay colored alpha box over dirty rects in frame; requires 0x0200 to be set
0x0800 Overlay pref stats into frame
0x2000 IddCx will query the capture frame registry values every frame; requires 0x0200 to be set

Note

For any of the overlay functions to work, the Direct3D device created by the driver and passed to IddCxSwapChainSetDevice must be created with the D3D11_CREATE_DEVICE_BGRA_SUPPORT flag.

IddCx WPP traces

Iddcx uses the WPP infrastructure to log debug information. WPP information can be captured to a file, and while this capture is in progress it can be displayed in the kernel debugger.

Capturing IddCx WPP tracing

There are several ways to enable WPP tracing. One convenient way is to use the build in logman.exe program. If you copy the following line to a batch file and run from an elevated command prompt it will collect IddCx WPP traces into the IddCx.etl file.

@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

Controlling what is captured

The Flags parameter of logman.exe (0x4f4 in this case) control what WPP messages IddCx logs. The meaning value of this has change in Windows build 19041 and above.

Flags meaning for Windows build 19041 and above

The Flags is a bit-field, where each bit controls whether that type of message is captured.

Flags bit Message type captured
0x001 Unused
0x002 Unused
0x004 Errors
0x008 Benign errors, eg when debug overlay are enabled without D3D11_CREATE_DEVICE_BGRA_SUPPORT set
0x010 IddCx objects
0x020 UMDF framework calls into IddCx
0x040 DDI calls from IddCx to the driver
0x080 Low frequency calls from driver to IddCx
0x100 High frequency frame related calls from driver to IddCx
0x200 High frequency cursor related calls from driver to IddCx
0x400 Calls from kernel to IddCx
0x800 Calls from IddCx to kernel

A normal logging scenario of 0x0f4 is a good starting point. If you want to view per frame info then 0x1f4 is a good starting point.

Flags meaning prior to Windows build 19041

Flags was treated as a level, each increasing level added a new type of message along with all the messages from the previous levels.

Flags level value Message type captured
1 Not used
2 Errors
3 Warnings
4 Information
5 Verbose

Decoding IddCx WPP tracing

Like all WPP traces, the WPP information is stored in pdb files and hence access to pdbs with that information are necessary to decode. Starting with Windows build 19560, the IddCx.pdb on the public symbol server contains the WPP information necessary to decode WPP messages. Before Windows build 19560, the IddCx.pdb on the public symbol server does not contain the necessary WPP information to enable WPP decode.

Any of the standard WPP decode tools can be used to decode and display the messages.

Debugging IddCx errors

While developing an Indirect Display driver it is often useful to get additional information when IddCx detects an error. As described above, you can configure IddCx to break into the debugger when IddCx detects an error, but it is also useful to display the IddCx error message in the last few trace messages to understand the context of the error.

Using the above section, you can enable WPP tracing using logman.exe and with the following information display the in-memory WPP buffer in the kernel debugger at the point of the failure.

Note

For this to work you need to be using a kernel debugger (not user mode debugger) and Windows build 19560 or above in order for the debugger to get the IddCx.pdb that contain the WPP decode info.

In the example below, a Indirect Display driver calls IddCxMonitorArrival. As a part of the processing, IddCx calls the driver's EvtIddCxMonitorQueryTargetModes DDI. In this example, the driver returned a mode with DISPLAYCONFIG_VIDEO_SIGNAL_INFO.AdditionalSignalInfo.vSyncFreqDivider set to zero which is invalid and causes an error.

Here is a list of the debugger commands used:

Command Meaning
!wmitrace.bufdump List all the logging buffer along with the name, IddCx is the name of ours, comes from the logman.exe command line
!wmitrace.logdump LogBufferName Decodes and displays the content of the specified logging buffer, which is IddCx in the example below

Here is the debugger output for this example:

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

The last line gives the reason for the failure.

Indirect display screen capture debug functionality

Starting in Windows build 25164, IddCx has the ability to dump the desktop frame that IddCx passes to the driver. This functionality can be used to debug visual issues. It can be combined with the debug overlays like shading dirty regions of a frame.

As IddCx will look for changes in the debug registry setting for frame capture on every frame, there is a master control value in IddCxDebugCtrl that controls whether IddCx will check the capture registry value each frame. This ensures there is no performance penalty when disabled.

Note

This functionality is disabled when the OPM interface is active to the driver.

Registry values that control the capture

The following registry values are located in HKLM\System\CurrentControlSet\Control\GraphicsDrivers\IddCxFrameCapture. This registry folder should be created before the IddCxDebugCtrl value is set.

Name Default if missing Meaning
TriggerUniqueness 0 When each IddCx swapchain is called to acquire a new frame it will read this value. If TriggerUniqueness is non-zero and different from the previously read value then the below values will be read and frame capture will be enabled.
TargetMask 0xffff Bitmask, one bit for each target index on the adapter that controls whether the swapchain for that target should be part of this capture sequence.
CaptureCount 10 Number of frames that each enabled-for-capture IddCx swapchain should capture.
SkipFrames 0 Number of frames to skip between each captured frame.
CaptureSessionID 0 The session in which frame capture will be enabled. A value of zero always means the console session.
ScaleFactor 100 Controls the scale factor used to decide what the dimensions of the captured file, valid values 1-100
CaptureFolder c:\IddCxImages Folder where capture files will be written. A c:\IddCxImages folder will be created if it doesn't exist.

The capture parameters are stored per target which allows a capture session to span a mode change on a given target.

If a new non-zero TriggerUniqueness value is detected while a monitor object is still capturing frames from a previous capture it will stop the current capture and start the newly triggered one.

Using REG files to control frame capture

REG files are a good way to control the frame captures. One file can set the initial values and another can update TriggerUniqueness.

REG file to set initial values

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 file to update TriggerUniqueness

Windows Registry Editor Version 5.00

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

File name and format

The captured frames will be in PNG file format with the following file name format:

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 in mmddyy format>_<Time in hhmmss>.png

The following are some example file names:

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

WPP logging

For each new capture session that is started, WPP messages will be logged for each value read in from the registry or set by default.

Each time a frame is captured and written to file, IddCx will add a WPP message that contains the full filename of the image file.

Example capture setting

Capture frames from when a monitor is first connected

The following are the registry values needed in order to capture the first 20 frames of when any monitor is first plugged in, followed by the REG file.

Registry entry Value Notes
CaptureCount 20 Set 20 frames rather than the default 10
TriggerUniqueness 1 Any non-zero value will work as target object starts with zero as store uniqueness
Windows Registry Editor Version 5.00

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

Start capture while monitor is active

Given that the swapchains check for a new uniqueness value when the driver acquires each frame, you should set the TriggerUniqueness entry last to ensure all the parameters are read as expected. The following example also halves the file resolution in order to save space and writes the capture files in the c:\frames folder.

Registry entry Value Notes
CaptureCount 100 Set 100 frames rather than the default 10
ScaleFactor 50 Set 50% resolution to save space
CaptureFolder c:\frames Set output folder
TriggerUniqueness 1 Any non-zero value will work as the target object starts with zero as store uniqueness
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 frames from second target in remote session 3 with 5 frames between each capture

This capture also uses debug overlay to highlight the dirty regions for each of the frames.

Registry entry Value Notes
IddCxDebugCtrl Bit 0x0400 also set 0x0400 enables dirty region highlighting, 0x2200 bits also required
CaptureSessionID 3 Enables capture in remote session 3
TargetMask 0x2 Bit 1 corresponds to target Idx 1
SkipFrames 5 Skip capturing 5 frames between each capture
TriggerUniqueness 1 Any non-zero value will work as target object starts with zero as store uniqueness
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