間接顯示驅動程式 (IDD) 是 UMDF 驅動程式。 因此,UMDF 偵錯檔,例如 判斷 UMDF 驅動程式為何無法載入或 UMDF 裝置無法啟動,是不錯的起點。 此頁面提供與間接顯示相關的特定偵錯資訊。
註冊表控件
間接顯示驅動程序類別 eXtension (IddCx) 有一些登錄設定,可用來協助偵錯 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 | 在畫面上覆蓋效能統計數據 |
| 0x2000 | IddCx 會查詢每個畫面的擷取畫面格登錄值;需要設定0x0200 |
備註
若要讓任何重疊函式能夠運作,驅動程式所建立並傳遞至 IddCxSwapChainSetDevice 的 Direct3D 裝置必須使用 D3D11_CREATE_DEVICE_BGRA_SUPPORT 旗標來建立。
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 檔案中。 因此,要進行解碼,需要存取包含該資訊的 pdb 檔案。 從 Windows 組建 19560 開始,公用符號伺服器上的 IddCx.pdb 包含譯碼 WPP 訊息所需的 WPP 資訊。 在 Windows 組建 19560 之前,公用符號伺服器上的 IddCx.pdb 不包含啟用 WPP 譯碼所需的 WPP 資訊。
任何標準 WPP 譯碼工具都可以用來譯碼和顯示訊息。
偵錯 IddCx 錯誤
在開發 IDD 的過程中,當 IddCx 偵測到錯誤時,取得額外資訊通常非常有用。 如先前所述,您可以在 IddCx 偵測到錯誤時,將 IddCx 設定為中斷調試程式,但在最後幾個追蹤訊息中顯示 IddCx 錯誤訊息也很有用,以瞭解錯誤的內容。
使用上一節,您可以使用 logman.exe 啟用 WPP 追蹤,並在發生故障時,在核心調試器中顯示記憶體中的 WPP 緩衝區。
備註
若要解決此問題,您必須使用核心調試程式(而非使用者模式調試程式)和 Windows 組建 19560 或更新版本,才能讓調試程式取得包含 WPP 譯碼資訊的 IddCx.pdb 。
在下列範例中,IDD 會呼叫 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 中有控制此行為的主要控件值。 此設定可確保停用時不會降低效能。
備註
當 OPM 介面為驅動程式使用中時,會停用此功能。
控制擷取的登錄值
下列登錄值位於 HKLM\System\CurrentControlSet\Control\GraphicsDrivers\IddCxFrameCapture 中。 設定 IddCxDebugCtrl 值之前,應該先建立此登錄資料夾。
| 名稱 | 遺漏時的預設 | 意義 |
|---|---|---|
| TriggerUniqueness | 0 | 呼叫每個 IddCx 交換鏈以取得新的框架時,它會讀取此值。 如果 TriggerUniqueness 不是零值,且與先前讀取的值不同,則會讀取下列值,並啟用畫面擷取。 |
| TargetMask | 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
更新 TriggerUniqueness 的 REG 檔
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\IddCxFrameCapture]
"TriggerUniqueness"=dword:1
檔名和格式
擷取的畫面格採用下列檔名格式的 PNG 檔案格式:
S<控制台的會話 ID,為 0>_Ad<ID 配接器 LUID 的十六進位值>_T<目標 Idx 的十六進位值>_Frame<IDDCX_METADATA.PresentationFrameNumber 的框架編號>_<日期(格式為 mmddyy)>_<時間(格式為 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 檔案。
| 註冊表項 | 價值 | 備註 |
|---|---|---|
| 捕捉次數 | 20 | 設定20個畫格,而非預設10個 |
| 觸發獨特性 | 1 | 任何非零值都可以使用,因為目標對象開頭為零可以保證存放的唯一性。 |
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\IddCxFrameCapture]
"CaptureCount"=dword:00000014
"TriggerUniqueness"=dword:00000001
監視作用中時啟動擷取
考慮到交換鏈在驅動程式取得每個畫面時會檢查新的唯一性值,您應該在最後設置 TriggerUniqueness 項目,以確保所有參數都如預期般讀取。 下列範例也會減半檔案解析,以節省空間,並在 c:\frames 資料夾中寫入擷取檔案。
| 註冊表項 | 價值 | 備註 |
|---|---|---|
| 擷取數量 | 100 | 設定100個畫面格,而不是預設10 |
| ScaleFactor | 50 | 設定 50% 解析度以節省空間 |
| 擷取資料夾 | 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位 |
| 捕捉會話識別碼 | 3 | 啟用遠端會話 3 中的擷取 |
| TargetMask | 0x2 | 位 1 對應至目標 Idx 1 |
| SkipFrames | 5 | 略過在每個擷取之間擷取五個畫面格 |
| 觸發唯一性 | 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