Идентификаторы событий не совпадают с отображаемыми в средстве просмотра событий - PullRequest
1 голос
/ 13 августа 2010

В системном журнале событий есть событие со следующими данными:

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 также имеет 1 для поля EventID, поэтому он соответствует тому, что мы видим в программе просмотра журнала событий.

Пока все хорошо.

Проблема в том, что когда вы смотрите на файл advapi32.dll, откуда этот источник получает сообщения, вы видите следующее:

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

Как программа просмотра журнала событий магически знает, как добавить эти дополнительные биты в идентификатор, чтобы найти правильную строку? Не все строки событий имеют этот верхний бит, а в некоторых установлены другие верхние биты.

Сбой вызова FormatMessage с 1. Вызов его с x01000001 успешно. Но это не то, что содержит запись в журнале событий ...: (

Нет документов, которые я могу найти, чтобы обсудить это вообще (кроме описания формата идентификатора, который показывает ошибки / серьезность / средство / биты кода).

Ответы [ 2 ]

1 голос
/ 17 апреля 2018

Предположительно, в Windows XP и более ранних версиях идентификатор события был напрямую сопоставлен с идентификатором сообщения в таблице сообщений.В Vista и более поздних версиях существует два способа сопоставления идентификатора события и идентификатора сообщения.

  1. Спецификаторы событий (это, вероятно, то, что похоже на серьезность, маскируемую, как упоминал Брайан)
  2. Ресурс шаблона событий Windows

В данной статье более подробно описываются два способа: 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), вы найдете библиотеку поставщика.

Компьютер \ HKEY_LOCAL_MACHINE \ SYSTEM \CurrentControlSet \ Services \ EventLog \ System \ Microsoft-Windows-Kernel-General

Затем можно использовать утилиту событий Windows, чтобы просмотреть содержимое dll провайдера (добавление флага / gm: true приведет котобразить текст сообщения):

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

Выходные данные показывают, что идентификатор события 1 с задачей события 5 имеетID сообщения = 16777217 (0x01000001).

1 голос
/ 13 августа 2010

Как и вы, я нигде не могу найти его документированным, но похоже, что средство просмотра событий отображает EventType член структуры EVENTLOGRECORD в Серьезность битов идентификатора таблицы сообщений.

Так, например, событие 7035 Service Control Manager имеет тип «Информация», который соответствует Серьезность значение 1, что дает идентификатор сообщения 0x40001B7B, который действительно является текстом, который отображается из средства просмотра событий.netevent.dll: Служба% 1 успешно отправила элемент управления% 2.

Аналогично, событие 7000 имеет тип «Ошибка», сопоставляется с Серьезность 3 иидентификатор сообщения 0xC0001B58: Не удалось запустить службу% 1 из-за следующей ошибки:% n% 2

Конечно, это не совсем соответствует вашему примеру;Вы уверены, что получили 0 и 1 в нужном месте?

...