x64dbg 插件 API 指南:GuiReferenceSetSingleSelection 详解——Reference 视图行选中与滚动定位

x64dbg 插件 API 指南:GuiReferenceSetSingleSelection 详解——Reference 视图行选中与滚动定位 逆向工程调试器开发工具应用安全【免费下载链接】x64dbgAn open-source user mode debugger for Windows. Optimized for reverse engineering and malware analysis.项目地址https://gitcode.com/gh_mirrors/x6/x64dbg点击查看免费下载x64dbg 是一款面向 Windows 用户态的开源调试器专为逆向工程与恶意代码分析优化。在插件或脚本开发中GuiReferenceSetSingleSelection是操控Reference 视图即搜索/引用结果列表窗口选中行的核心桥接函数用于把当前选中行精确同步到指定索引并可选择是否将目标行滚动到可视区域。读完本文你将掌握该函数的完整签名、参数语义、底层消息传递链路以及它在反汇编视图与内存转储视图上一条/下一条引用导航中的真实用法。函数原型与基本语义GuiReferenceSetSingleSelection由调试器核心bridge 层导出供插件与脚本向 GUI 发送设置 Reference 视图当前选中行的指令。其声明位于 src/bridge/bridgemain.hBRIDGE_IMPEXP void GuiReferenceSetSingleSelection(int index, bool scroll);index整数表示要设置为当前选中行的行索引从 0 开始。行索引的有效范围对应 Reference 视图当前的数据行数该行数由 GuiReferenceSetRowCount 设置并可通过 GuiReferenceGetRowCount 查询。scroll布尔值指示当目标行不在当前可视区域内时是否将其滚动进入视野。传入true会同时把选中行滚动到可视位置false则只改变选中状态、不调整滚动位置。返回值该函数无返回值void且调用本身不会导致同步等待属于典型的发送后即返回风格接口。最小调用示例与官方文档一致// 选中第 0 行第一行并将其滚动到可视区域 GuiReferenceSetSingleSelection(0, true);底层实现从 Bridge 消息到 Reference 视图槽函数该函数并非直接在 GUI 线程内操作表格控件而是通过 x64dbg 的桥接消息机制实现跨模块通信。其实现位于 src/bridge/bridgemain.cppBRIDGE_IMPEXP void GuiReferenceSetSingleSelection(int index, bool scroll) { _gui_sendmessage(GUI_REF_SETSINGLESELECTION, (void*)(duint)index, (void*)(duint)scroll); }调用方把index与scroll分别包装为消息参数发送GUI_REF_SETSINGLESELECTION消息。该消息在 GUI 侧由 src/gui/Src/Bridge/Bridge.cpp 接收并转译为 Qt 信号case GUI_REF_SETSINGLESELECTION: emit referenceSetSingleSelection((int)(duint)param1, (bool)param2); break;referenceSetSingleSelection(int, bool)信号随后连接到 Reference 视图实例的槽函数。在 src/gui/Src/BasicView/ReferenceView.cpp 中建立了该连接connect(Bridge::getBridge(), SIGNAL(referenceSetSingleSelection(int, bool)), this, SLOT(setSingleSelection(int, bool)));槽函数的实现见 src/gui/Src/BasicView/ReferenceView.cppvoid ReferenceView::setSingleSelection(int index, bool scroll) { //clearFilter(); stdList()-setSingleSelection(index); stdSearchList()-setSingleSelection(index); if(scroll) //TODO: better scrolling { stdList()-setTableOffset(index); stdSearchList()-setTableOffset(index); } }从中可以看到两个关键细节双列表同步Reference 视图内部同时维护完整结果列表stdList()与搜索过滤结果列表stdSearchList()该函数对两者执行相同的选中操作因此无论在过滤前后选中行始终一致。滚动语义scroll参数通过setTableOffset(index)直接移动表格的顶部可见行偏移来实现滚动。源码中留有//TODO: better scrolling注释表明这是一种朴素实现——将目标行设为表格顶端而非保持目标行在视野中间的精细化滚动。选中操作最终落在通用表格基类AbstractStdTable::setSingleSelection(duint index)见 src/gui/Src/BasicView/AbstractStdTable.cpp它把内部选区收缩为单行并发出selectionChanged信号void AbstractStdTable::setSingleSelection(duint index) { mSelection.firstSelectedIndex index; mSelection.fromIndex index; mSelection.toIndex index; emit selectionChanged(index); accessibilitySelectionChanged(); }这也解释了为何调用后可以立即用getInitialSelection()读到新选中行见同文件 AbstractStdTable.cpp。实战场景反汇编与内存转储中的引用导航该函数最典型的应用场景是在引用搜索结果之间跳转时保持 GUI 选中行与当前跳转位置同步。x64dbg 内置的refsearch引用搜索结果与反汇编/转储视图联动当用户在上一条引用 / 下一条引用之间切换时代码会同时调用GuiReferenceSetSingleSelection更新 Reference 视图的选中行。在反汇编视图中src/gui/Src/Gui/CPUDisassembly.cppvoid CPUDisassembly::gotoPreviousReferenceSlot() { auto count DbgEval(refsearch.count()), index DbgEval($__disasm_refindex), addr DbgEval(refsearch.addr($__disasm_refindex)); if(count) { if(index 0 addr rvaToVa(getInitialSelection())) DbgValSetScalar($__disasm_refindex, index - 1); gotoAddress(DbgValFromString(refsearch.addr($__disasm_refindex))); GuiReferenceSetSingleSelection(int(DbgEval($__disasm_refindex)), false); } } void CPUDisassembly::gotoNextReferenceSlot() { // ... 类似的逻辑向前递增 $__disasm_refindex ... gotoAddress(DbgValFromString(refsearch.addr($__disasm_refindex))); GuiReferenceSetSingleSelection(int(DbgEval($__disasm_refindex)), false); }内存转储视图Dump中也有对称实现src/gui/Src/Gui/CPUDump.cpp区别在于跳转通过DbgCmdExec(dump refsearch.addr($__dump_refindex))执行随后同样调用GuiReferenceSetSingleSelection同步选中行。这段真实代码揭示的调用约定值得插件开发者借鉴行索引与选中行之间的同步变量是脚本变量$__disasm_refindex反汇编场景与$__dump_refindex转储场景跳转发生后再调用GuiReferenceSetSingleSelection同步选中行且scroll传false——因为在跳转过程中表格通常已通过其他路径滚动无需重复滚动调用前用DbgEval读取当前索引、用DbgValSetScalar修改索引说明索引值本质上是调试器脚本环境中的一个标量变量插件可用相同机制读写它。此外Reference 视图自身在选中变化时也会反向写回该变量src/gui/Src/BasicView/ReferenceView.cpp从而实现 GUI 点击与代码跳转之间的双向同步void ReferenceView::searchSelectionChanged(duint index) { DbgValSetScalar($__disasm_refindex, index); DbgValSetScalar($__dump_refindex, index); }使用建议与边界结合源码实现使用时有以下几点值得注意先建表再选中Reference 视图需要先经过 GuiReferenceInitialize 初始化并写入行数据后GuiReferenceSetSingleSelection才能产生有意义的效果对空列表设置选中行不会报错但也不会改变任何可见状态。索引越界行为AbstractStdTable::setSingleSelection对传入索引没有显式的越界检查因此插件应自行确保0 index 行数建议先调用 GuiReferenceGetRowCount 获取行数再做边界判断。scroll 参数的选择若目标行已在可视区域内scrolltrue与false视觉效果相同若需快速定位到列表深处如搜索结果跳转传true可避免用户手动滚动而在连续上下条跳转时传false可避免视图频繁跳动内置代码即采用此策略。线程安全性该函数通过_gui_sendmessage投递消息可在插件的工作线程中安全调用无需手动切换到 GUI 线程但需注意投递是异步的返回后选中行可能尚未立即更新。相关函数一览GuiReferenceSetSingleSelection属于完整的 Reference 视图 API 家族协同使用可实现对引用结果列表的全面控制函数用途GuiReferenceInitialize初始化一个 Reference 视图实例GuiReferenceAddColumn向视图添加列GuiReferenceDeleteAllColumns清空全部列定义GuiReferenceSetRowCount设置总行数GuiReferenceGetRowCount获取当前行数GuiReferenceSetCellContent写入单元格内容GuiReferenceGetCellContent读取单元格内容GuiReferenceSetSingleSelection设置当前选中行本文主题GuiReferenceReloadData触发视图数据重载GuiReferenceSetSearchStartCol设置搜索起始列GuiReferenceSetProgress设置总进度条GuiReferenceSetCurrentTaskProgress设置当前任务进度条这些函数的完整索引可在 docs/developers/functions/gui/index.rst 中查阅。对 Reference 视图 API 的整体架构感兴趣的读者还可进一步阅读 src/gui/Src/BasicView/ReferenceView.cpp 与 src/gui/Src/BasicView/ReferenceView.h了解视图的生命周期管理、右键菜单与搜索过滤机制从而在自己的插件中构建出与 x64dbg 内置引用列表体验一致的结果面板。赞分享逆向工程调试器开发工具应用安全【免费下载链接】x64dbgAn open-source user mode debugger for Windows. Optimized for reverse engineering and malware analysis.项目地址https://gitcode.com/gh_mirrors/x6/x64dbg点击查看免费下载相关推荐x64dbg 插件 API 详解用 GuiReferenceGetRowCount 获取 Reference View 行数x64dbg 插件 API 详解用 GuiReferenceGetRowCount 获取 Reference View 行数 本文围绕 x64dbg 插件 A逆向工程调试器开发工具应用安全x64dbg 插件开发指南GuiReferenceSetRowCount 与引用视图Reference View行数控制x64dbg 插件开发指南GuiReferenceSetRowCount 与引用视图Reference View行数控制 导读 GuiReferenceS逆向工程调试器开发工具应用安全x64dbg 插件与脚本开发指南GuiFocusView 视图切换 API 详解x64dbg 插件与脚本开发指南GuiFocusView 视图切换 API 详解 导读 GuiFocusView 是 x64dbg 桥接层Bridge提供逆向工程调试器开发工具应用安全创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考