在系统事件日志中,事件包含以下详细信息:
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格式的文件显示错误/严重性/设施/代码位)。
答案 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。
本文将更详细地介绍这两种方法: 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)。