这是一篇关于 retrowin32 的系列文章的一部分,主要介绍了 Windows API 的实现及相关改进。
- 功能实现:retrowin32 实现了 Windows API,如
WriteFile
函数,在 Rust 中编写了其实现,并通过代码生成器处理参数传递和栈操作。 - DLL 调用机制:在 Windows 中,通过“导入地址表”(IAT)处理对 DLL 函数的调用,执行代码在加载时将所需的 DLL 地址写入 IAT。
- retrowin32 的过去与现在:过去 retrowin32 通过在 IAT 中插入魔术数来识别调用,存在一些问题,如在 x86 - 64 模式下无法拦截所有调用等。现在通过创建真实的系统库 DLL 并加载它们来解决这些问题,每个存根函数触发 retrowin32 处理内置函数的代码。
- Vtables:COM 库如 DirectDraw 暴露 vtables,之前需在使用 DLL 时分配内存来存储函数指针,现在可将 vtables 作为静态数据从 DLL 中暴露。
- 构建 DLL:使用
clang - cl
工具链生成存根 DLL,虽需引入单独的编译器工具链,但目前较方便,也尝试过其他方法但遇到问题。 - 动态链接思考:动态链接的相关机制复杂,Go 尝试避免动态链接,作者也反思自己对动态链接的工程价值的看法。
- 附录:dllimport 调用:在 stub DLL 中最初生成的代码通过 IAT 进行调用时存在额外的间接跳转,通过修改生成的汇编代码可消除此间接跳转。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。