如何使用 Windows Native API 访问 PE 资源?

Posted

技术标签:

【中文标题】如何使用 Windows Native API 访问 PE 资源?【英文标题】:How to access PE resources using Windows Native API? 【发布时间】:2016-08-05 01:12:37 【问题描述】:

我有一个包含embedded resources 的Windows native application,我想使用native API 访问它们。是否有处理资源的本机函数(类似于FindResource/LoadResource)或者我必须创建自己的PE阅读器来提取它们?

【问题讨论】:

如果我可能会问,您为什么要编写本机应用程序?如果资源被映射到内存中,并且我认为它们会被映射,或者您可以轻松地将其余可执行文件映射到其中,您只需知道它们的地址即可访问它们,因此不需要特殊的 API。您使用哪种嵌入式资源? @KubaOber:如果您想在加载 Win32 子系统之前执行,您需要一个本机应用程序。 “您只需知道他们的地址就可以访问它们” - FindResource 将是了解地址的 API。 没错,就是Win32加载前需要执行的应用程序。如果包含资源的其余可执行文件未映射到内存,我该怎么办?一旦我没有事先定义资源地址,我如何以编程方式找到它(将资源放入可执行文件是链接器的工作)。 我想你会使用 cvtres 从你的 .res 文件中获取一个目标文件,然后转储它以了解每个资源的符号名称,然后将它们声明为编译器的外部数据,并根据需要从 C 代码中获取它们的地址。链接器会将其全部修补,就像它对编译时未知的所有其他地址所做的那样。您还可以调整链接,以便映射 .rsrc 部分(如果不是)。 这是个好建议。让我看看是否有其他人有更简单的方法来解决它:) 【参考方案1】:

Ntdll 导出 LdrFindResource_ULdrAccessResource,它们几乎分别对应于 FindResource 和 LoadResource。您还需要GetModuleHandle 的对应方才能使用它们。 Wine source(特别是 resource.c 和 module.c)可以用作这些函数的文档。

【讨论】:

以上是关于如何使用 Windows Native API 访问 PE 资源?的主要内容,如果未能解决你的问题,请参考以下文章

WebRTC Windows Native音频中的Core Audio API

用Windows Native API枚举所有句柄及查找文件句柄对应文件名的方法

掉坑日志:Windows Native API与DPI缩放

如何使用 Redux 在 React Native 中使用线程调用 API?

如何在“native c ++”环境中使用WinRT IAsyncOperation *对象

如何使用 javascript 将 API 数据转换为 react-native 中的部分列表数据