事件ID与事件查看器中显示的内容不匹配

时间:2010-08-12 21:18:14

标签: windows winapi event-log formatmessage

在系统事件日志中,事件包含以下详细信息:

Source: Kernel-General
Event ID: 1
Details: The system time has changed to ‎2010‎-‎07‎-‎17T02:58:20.285000000Z from ‎2010‎-‎07‎-‎17T02:58:20.285868600Z.

EVENTLOGRECORD还有一个IFID字段,因此它与我们在事件日志查看器中看到的匹配。

到目前为止一切顺利。

问题是,当你查看advapi32.dll这个消息来源的地方时,你会看到:

ID:01000001
String: The system time has changed to %1 from %2.

事件日志查看器如何神奇地知道将这些额外的位添加到ID以找到正确的字符串?并非所有事件字符串都具有该高位,并且一些事件字符串具有其他高位设置。

使用1调用FormatMessage失败。用x01000001调用它成功。但这不是事件日志记录包含的内容...... :(

我找不到任何文档都可以讨论这个(其他描述ID格式的文件显示错误/严重性/设施/代码位)。

2 个答案:

答案 0 :(得分:1)

和我一样,我无法在任何地方找到它,但看起来事件查看器将EventType结构的EVENTLOGRECORD成员映射到消息的严重性位表格标识符。

因此,例如,服务控制管理器事件7035的类型为“信息”,它映射到严重性值1,产生的消息ID为0x40001B7B,这实际上是事件查看器显示的文本netevent.dll:%1服务已成功发送%2控件。

类似地,事件7000的类型为“错误”,映射到严重性 3,消息ID为0xC0001B58:由于以下错误,%1服务无法启动:%n %2

当然,这与你的例子不太一致;你确定你在正确的地方得到了你的0和1吗?

答案 1 :(得分:1)

据推测,在Windows XP及更早版本中,事件ID直接映射到消息表中的消息ID。使用Vista及更高版本,有两种方法可以将事件ID映射到消息ID。

  1. 事件限定符(这可能就像Brian最初提到的严重程度一样)
  2. Windows事件模板资源
  3. 本文将更详细地介绍这两种方法: https://github.com/libyal/libevtx/blob/master/documentation/Windows%20XML%20Event%20Log%20(EVTX).asciidoc#message-string-identifier

    对于此“系统时间已更改...”事件,Windows 10正在使用Windows事件模板资源。如果在注册表中为此事件查找EventMessageFile键(基于事件源= Microsoft-Windows-Kernel-General),则可以找到提供者DLL。

    电脑\ HKEY_LOCAL_MACHINE \系统\ CurrentControlSet \服务\事件日志\ SYSTEM \ Microsoft的Windows的内核一般

    然后,您可以使用Windows事件实用程序查看提供者dll的内容(添加/ gm:true标志将显示消息文本):

    wevtutil gp Microsoft-Windows-Kernel-General / ge:true

    输出显示带有事件任务5的事件ID 1的消息ID = 16777217(0x01000001)。