1

システムイベントログには、次の詳細が記載されたイベントがあります。

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のEventIDフィールドにも1があるため、イベントログビューアに表示される内容と一致します。

ここまでは順調ですね。

問題は、このソースがメッセージを取得する場所であるadvapi32.dllを見ると、次のように表示されることです。

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

イベントログビューアは、正しい文字列を見つけるためにIDにこれらの余分なビットを追加することを魔法のようにどのように知っていますか?すべてのイベント文字列にその上位ビットがあるわけではなく、他の上位ビットが設定されているものもあります。

1でFormatMessageを呼び出すと失敗します。x01000001で呼び出すと成功します。しかし、それはイベントログレコードに含まれているものではありません... :(

私が見つけることができるドキュメントはこれについてまったく説明していません(エラー/重大度/機能/コードビットを示すID形式を説明しているドキュメントを除く)。

4

2 に答える 2

1

あなたのように、私はそれがどこにも文書化されていないのを見つけることができませんが、イベントビューアは構造のEventTypeメンバーをメッセージテーブル識別子の重大度ビットにマップしているようです。EVENTLOGRECORD

したがって、たとえば、サービスコントロールマネージャーのイベント7035はタイプ「情報」であり、重大度の値1にマップされ、メッセージIDが0x40001B7Bになります。これは、実際にイベントビューアーがnetevent.dllから表示するテキストです。%1サービスは正常に実行されました。 %2コントロールを送信しました。

同様に、イベント7000のタイプは「エラー」であり、重大度3にマッピングされ、メッセージIDは0xC0001B58です。次のエラーのために%1サービスを開始できませんでした:%n%2

もちろん、それはあなたの例に完全には適合しません。0と1が正しい場所にあると確信していますか?

于 2010-08-12T23:00:17.147 に答える
1

おそらく、Windows XP以前では、イベントIDはメッセージテーブル内のメッセージIDに直接マップされていました。Vista以降では、イベントIDをメッセージIDにマップする方法が2つあります。

  1. イベント修飾子(これはおそらく、ブライアンが最初に述べたように重大度がマスクされているように見えます)
  2. Windowsイベントテンプレートリソース

この記事では、2つの方法について詳しく説明します 。https ://github.com/libyal/libevtx/blob/master/documentation/Windows%20XML%20Event%20Log%20(EVTX).asciidoc#message-string-identifier

特にこの「システム時刻が変更されました...」イベントでは、Windows10はWindowsイベントテンプレートリソースを使用しています。レジストリでEventMessageFileキーを検索すると、このイベント(Event Source = Microsoft-Windows-Kernel-Generalに基づく)のプロバイダーDLLが見つかります。

Computer \ HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ EventLog \ System\Microsoft-Windows-カーネル-一般

次に、Windowsイベントユーティリティを使用して、プロバイダーdllの内容を確認できます(/ gm:trueフラグを追加すると、メッセージテキストが表示されます)。

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

出力は、イベントタスク5を持つイベントID1のメッセージID= 16777217(0x01000001)であることを示しています。

于 2018-04-17T14:35:54.297 に答える