ZDMA / LeechCore 中文集成指南

LightningZ 中文教程

ZDMA / LeechCore 中文集成指南

面向开发者的 LeechCore 软件集成与应用分发说明:DLL 同目录、单 exe 打包、版本对齐以及验证排错。

范围:本教程仅说明 Windows 用户态的软件和项目集成、应用分发方式;不包含固件刷写、JTAG、接线、内核驱动安装或其他硬件操作。

1. 版本要求

写代码前先核对版本。多数集成问题来自不同 release 的 DLL 混用,或依赖文件放错目录。
  • leechcore.dllleechcore_driver.dll 必须来自同一个 release,不能新旧混用。
  • 若用 MemProcFS 的 vmm.dll 做进程级解析,它的版本必须与 leechcore.dll 一致。
  • FTD3XX.dll(FTDI 官方 64 位)仅 FT601 / USB3 板卡需要;ZDMA 走 Thunderbolt,使用自带驱动。
  • ZDMA 新固件 v4.17 / FPGA1 v4+ 需配最新 leechcore.dll
  • 实操建议:三个 DLL 从同一 release 一起下、一起升级;跑起来前先用 pcileech.exe -device fpga probe 验证版本与连通性。

2. 所需用户态 DLL

文件 是否需要 说明
leechcore.dll + leechcore_driver.dll 必需 必须来自同一 release。
vmm.dll 可选 仅在需按进程或虚拟地址读取时使用,版本须与 leechcore.dll 一致。
FTD3XX.dll 按设备而定 仅 FT601 板卡需要,ZDMA Thunderbolt 通常不需要。

3. 方式一:DLL 与 exe 同目录

这是最简单的方式,适合开发期或内部工具。

your_app/
|- your_app.exe
|- leechcore.dll
|- leechcore_driver.dll
|- vmm.dll              可选
`- FTD3XX.dll           仅 FT601 板卡需要

Windows 启动应用时会搜索 exe 所在目录。将上述文件放到同一个文件夹即可。

C/C++ 最小示例

#include "leechcore.h"
LC_CONFIG cfg = {0};
cfg.dwVersion = LC_CONFIG_VERSION;
strcpy(cfg.szDevice, "fpga");
// 设备字符串可带参数:"fpga://algo=0,tmread=500,pciegen=2"
HANDLE h = LcCreate(&cfg);
LcRead(h, pa, cb, pb);
LcWrite(h, pa, cb, pb);
LcReadScatter(h, ...); // 高吞吐读取
LcClose(h);

如需按进程读取虚拟内存,再叠加 vmm.dll:使用 VMMDLL_Initialize(-device fpga) 初始化,再调用 VMMDLL_MemRead

4. 方式二:所有 DLL 集成进单个 exe

关键前提:LeechCore 只发布预编译 DLL,没有静态库。因此“单文件”是把 DLL 作为资源嵌入 exe,运行时释放再加载。

路线 A(推荐)

  1. leechcore.dllleechcore_driver.dll 嵌入 exe 资源。
  2. 启动时创建临时目录,并将两个 DLL 释放到同一目录。
  3. 调用 SetDllDirectory 指向该目录。
  4. 调用 LoadLibrary 加载 leechcore.dll
// 两个 DLL 必须释放在同一目录
SetDllDirectoryW(dllDir);
HMODULE hLeechCore = LoadLibraryW(L"leechcore.dll");

版本要求不变:嵌进 exe 的两个 DLL 仍须同一 release。

路线 B(有坑)

MemoryModule 一类的纯内存加载方式并不可靠:leechcore.dll 还会通过 LoadLibrary 加载 driver,二级依赖常在内存加载时失败。实际项目仍建议使用路线 A。

语言 单文件做法
C/C++ DLL 写入 .rc 资源,使用 FindResource 释放,再 LoadLibrary 加载。
C#/.NET <PublishSingleFile>true + <IncludeNativeLibrariesForSelfExtract>true,或 Costura.Fody。
Rust include_bytes! 嵌入,写盘后使用 libloading::Library::new
Python pyinstaller --onefile --add-binary "leechcore.dll;.",并确保所有相关 DLL 都被包含。

5. 验证与排错

pcileech.exe -device fpga probe
pcileech.exe -device fpga display -min 0x1000 -max 0x2000
现象 常见原因 建议处理
LcCreate 返回 NULL,或 probe 无设备 DLL 版本不匹配 重新从同一 release 下载 leechcore.dllleechcore_driver.dll;如使用 vmm.dll 也一并升级。
读取结果全为 0xFF IOMMU / VT-d 拦截 DMA 在 BIOS 中关闭 IOMMU / VT-d 后重新验证。
找不到 leechcore_driver.dll 单文件模式的二级依赖未释放到同目录 把两个 DLL 释放到同一目录,并在加载前调用 SetDllDirectory

6. 两种方式对比

方式 优点 限制 适用场景
DLL 同目录 集成简单、好调试、DLL 可单独替换升级 发布目录有多个文件 开发期、内部工具
单个 exe 分发干净、便携 升级 DLL 要重新打包 对外交付
建议:开发期先使用 DLL 同目录,确认 probe 通过;对外发布再切到单文件路线 A。DLL 那一对始终保持同一 release。

参考资料

滚动至顶部