
x64dbg 插件 API 深度解析GuiReferenceGetCellContent 读取 Reference View 单元格数据【免费下载链接】x64dbgAn open-source user mode debugger for Windows. Optimized for reverse engineering and malware analysis.项目地址: https://gitcode.com/gh_mirrors/x6/x64dbgGuiReferenceGetCellContent是 x64dbg 插件 API 中 Reference View插件数据表视图系列函数的读取入口用于按行号、列号取回当前 Reference View 实例中某个单元格存储的字符串数据。阅读本文你将掌握该函数的签名、参数与返回值语义含内存归属与 NULL 判定、标准用法示例以及它在 Bridge 消息机制下从x64dbg.dll桥接到 GUI 侧的完整调用链从而在插件中正确实现写入表格 → 回读校验的数据访问模式。函数签名函数原型如下引自官方 API 文档 GuiReferenceGetCellContent.mdchar* GuiReferenceGetCellContent(int row, int col)该函数通过当前 Reference View 实例定位数据它不接收视图句柄而是始终作用于插件当前激活的那个 Reference View。若插件尚未初始化视图或视图已销毁函数将取不到数据。参数说明参数类型含义rowint要读取的单元格的行号从 0 开始。colint要读取的单元格的列号从 0 开始。两个参数都是简单的整型索引行号应与之前通过GuiReferenceSetRowCount设置的行数保持一致列号应与GuiReferenceAddColumn添加列后的实际列数保持一致越界的行/列不会导致崩溃只会取不到有效数据返回 NULL详见下节。返回值与内存语义官方文档对返回值的描述是返回值为指向 char 的指针表示存储在指定 row/column 处的数据通常是字符串如果无数据或指定的 row/column 不正确则返回 NULL。结合源码可以对这一返回值做三点精确理解内存由 Bridge 分配器持有用完必须释放。在 GUI 侧的处理分支 Bridge.cpp 中取到的QString被转换为 UTF-8 字节串后通过BridgeAlloc(bytes.size() 1)分配缓冲区并拷贝数据再把该指针原样返回给调用方。因此这块内存并不属于std::string、char[]这类由调用方管理的形式必须用BridgeFree释放直接free/delete会造成分配器错配。取不到数据时拿不到有效字符串。文档声明无数据或行列号错误时返回 NULL无论哪种情况调用方都应把空结果统一处理为无效数据而不要假设返回的指针恒非空。内容是 UTF-8 编码的字符串。GUI 侧统一用toUtf8()序列化见 Bridge.cpp 中content.toUtf8()所以拿到的字节流可以直接按 UTF-8 处理。典型用法示例官方文档给出的最小示例Data GuiReferenceGetCellContent(0, 0);即读取第 0 行第 0 列的单元格内容。一个符合内存语义、且能体现完整建表—填充—回读流程的插件侧写法大致如下对应文档中的 Related functions 组合// 1. 初始化 Reference View指定视图标题 GuiReferenceInitialize(My Plugin Data); // 2. 建列并设置行数 GuiReferenceAddColumn(120, Address); // 列宽 120标题 Address GuiReferenceSetRowCount(4); // 3. 写入数据 GuiReferenceSetCellContent(0, 0, 7FF60000); GuiReferenceReloadData(); // 让视图刷新显示 // 4. 回读第 0 行第 0 列并校验 char* Data GuiReferenceGetCellContent(0, 0); if (Data) { // ... 使用 DataUTF-8 字符串... BridgeFree(Data); // 必须释放 }注意GuiReferenceInitialize返回前是同步等待Bridge 侧使用BridgeResult阻塞保证后续操作时视图已经就绪GuiReferenceReloadData负责把已写入的单元格内容刷新到表格控件上。源码级调用链从 dll 函数到 GUI 表格模型GuiReferenceGetCellContent属于 x64dbg 的 Bridge 层函数——它把一次普通 C 调用转换为一条带参数的桥接消息发给 GUI 线程执行。完整链路如下第一步桥接函数把 row/col 打包进消息。bridgemain.cpp 中的实现只有两行BRIDGE_IMPEXP char* GuiReferenceGetCellContent(int row, int col) { return (char*)_gui_sendmessage(GUI_REF_GETCELLCONTENT, (void*)(duint)row, (void*)(duint)col); }row和col分别被压缩为无符号整数塞进消息的两个参数槽位返回值直接把 GUI 侧返回的指针透传回来。第二步消息契约由桥接头文件声明。在 bridgemain.h 中可以看到该消息的参数签名msg(GUI_REF_GETCELLCONTENT, int row, int col) \这与GUI_REF_SETCELLCONTENT传一个CELLINFO*形成对照写入走结构体打包读取走两个整数参数返回一个堆分配的字符串指针。第三步GUI 线程定位当前 Reference View并读取模型。GUI 侧分发在 Bridge.cppcase GUI_REF_GETCELLCONTENT: { QString content; if(mReferenceManager-currentReferenceView()) content mReferenceManager-currentReferenceView()-stdList()-getCellContent((int)(duint)param1, (int)(duint)param2); auto bytes content.toUtf8(); auto data BridgeAlloc(bytes.size() 1); memcpy(data, bytes.constData(), bytes.size()); return data; }这里有两个关键实现细节数据源是stdList()——即 Reference View 背后的标准全量数据模型。同文件紧接着的GUI_REF_SEARCH_GETCELLCONTENT分支读取的是mCurList搜索过滤后的当前列表两者区别决定了你在用户正在表格内搜索时该用哪个函数。返回前用BridgeAlloc复制了一份字节串所以调用方拿到的指针生命周期独立于 GUI 内部模型但也就产生了必须BridgeFree的义务。内部佐证表达式函数 refaddr 的标准姿势x64dbg 自身就在使用这个函数。exprfunc.cpp 中定义了一个表达式函数refaddr用于在脚本/条件表达式里引用 Reference View 某行第一列的地址值duint refaddr(duint row) { auto content GuiReferenceGetCellContent(int(row), 0); duint addr 0; valfromstring(content, addr, false); BridgeFree(content); return addr; }这段代码恰好演示了文档要求的全部要点取第row行、第 0 列的内容把字符串解析为数值最后调用BridgeFree释放。与之配套的refcount()同文件 exprfunc.cpp则调用GuiReferenceGetRowCount()获取行数是遍历表格前先问行数的标准做法duint refcount() { return GuiReferenceGetRowCount(); }与 GuiReferenceSearchGetCellContent 的区分从源码结构看Reference View 同时维护两套列表函数数据源GUI 侧适用场景GuiReferenceGetCellContentstdList()全量数据按原始行号读取插件写入的完整数据GuiReferenceSearchGetCellContentmCurList搜索过滤后用户触发搜索后按过滤结果中的行号读取若插件需要在用户于表格内搜索之后读取看到的某一行应改用搜索版函数否则行号会与实际显示错位。相关函数一览围绕本函数文档列出的 Reference View 配套 API对应仓库内 gui 函数文档目录函数文档作用GuiReferenceInitializeGuiReferenceInitialize.md初始化当前 Reference View 实例GuiReferenceAddColumnGuiReferenceAddColumn.md添加列列宽 标题GuiReferenceSetRowCountGuiReferenceSetRowCount.md设置行数GuiReferenceGetRowCountGuiReferenceGetRowCount.md获取行数GuiReferenceSetCellContentGuiReferenceSetCellContent.md写入单元格内容本函数的对偶GuiReferenceReloadDataGuiReferenceReloadData.md刷新视图显示GuiReferenceDeleteAllColumnsGuiReferenceDeleteAllColumns.md清空全部列GuiReferenceSetProgressGuiReferenceSetProgress.md设置进度条GuiReferenceSetCurrentTaskProgressGuiReferenceSetCurrentTaskProgress.md设置当前任务进度GuiReferenceSetSearchStartColGuiReferenceSetSearchStartCol.md设置搜索起始列GuiReferenceSetSingleSelectionGuiReferenceSetSingleSelection.md设置单选并可选滚动到该行小结GuiReferenceGetCellContent虽只有一行桥接实现但完整体现了 x64dbg 插件 API 的三条基本纪律调用作用于当前视图实例、字符串以 UTF-8 经 Bridge 分配器跨线程返回、取回数据必须由调用方BridgeFree。把它与GuiReferenceInitialize/GuiReferenceAddColumn/GuiReferenceSetCellContent/GuiReferenceReloadData组合起来即可在插件中构建一张可双向访问的数据表x64dbg 内建表达式函数refcount/refaddr的实现就是这一模式的权威参照。【免费下载链接】x64dbgAn open-source user mode debugger for Windows. Optimized for reverse engineering and malware analysis.项目地址: https://gitcode.com/gh_mirrors/x6/x64dbg创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考