同一个二进制文件中有多个MESSAGETABLE资源

时间:2017-11-01 09:14:28

标签: winapi resources event-log etw

有一个二进制文件应该同时具有ETW跟踪和编译的消息文件。两个文件都使用消息编译工具(mc.exe)编译并生成MESSAGETABLE二进制文件,随后应该编译成模块资源

mc.exe生成一个如下所示的资源文件: LANGUAGE 0x9,0x1 1 11 "Module_MSG00001.bin"

当存在其中两个时,由于资源ID重复,二进制文件无法构建。如果我将其中一个ID更改为除1以外的任何值,则二进制构建,但以太日志字符串从事件查看器中消失,或FormatMessage API停止从消息表中解码错误代码。

是否可以在同一个二进制文件中包含多个MESSAGETABLE,以便事件查看器和FormatMessage继续工作?我google了很多,但到目前为止还没找到答案。

我看到如何解决问题的唯一方法是编写一个将两个消息表合并为一个的工具,但也许我错过了一些东西。

1 个答案:

答案 0 :(得分:1)

消息表就像字符串表一样。每种语言只允许一种。

执行此操作的唯一方法是将所有mc文件收集到一个大型mc文件中并使用mc.exe进行编译(如您所愿)。 Saddly mc.exe甚至没有多个源文件。即使在组合mc文件时,您也必须注意仅出现一次的LanguageName块。

应该可以编写程序来组合bin文件。 数据由MESSAGE_RESOURCE_DATA结构组成,其中包含一个或 更多MESSAGE_RESOURCE_BLOCKS,反过来可能由一个或多个组成 更多MESSAGE_RESOURCE_ENTRY个结构。结构类似于 STRINGTABLE资源的资源。

我的old link已被破坏(我包含了通过支路的链接),它描述了MESSAGETABLE格式。

编辑有关结构的新文档也可以在MSDN中找到:MESSAGE_RESOURCE_BLOCKMESSAGE_RESOURCE_DATAMESSAGE_RESOURCE_ENTRY