質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

5200閲覧

Windowsのイベントログ出力について

spike0726

総合スコア12

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

1クリップ

投稿2020/03/03 07:52

C++のアプリケーションからイベントログを出力しようと考えています。
2点、わからないことがあり、ご質問です。

イベントログは以下のAPIを使用し、出力する想定です。

BOOL ReportEvent( HANDLE hEventLog, WORD EventType, WORD Category, カテゴリ(独自定義でOK) DWORD EventId, イベントID PSID UserSid, ユーザのSID。NULLを指定可能。 WORD StringNum, 埋込み文字列の数 DWORD DataSize, 付加情報のサイズ LPCTSTR *StringArray, 埋込み文字列の配列 LPVOID Data); 付加情報

1.イベントIDはカテゴリがユニークであれば自由に採番してよいものでしょうか?
システムが使用しているイベントIDは使ってはいけないなどの規定はないでしょうか。

2.メッセージファイルDLLを使用しない方法はあるでしょうか?
メッセージファイルDLLを作成しないと、イベントビューワで見たときに以下の
ようなメッセージが表示されます。壊れているとか修復とか表示されるため、
これを回避したいのですが方法はあるでしょうか?

ソース "XXX" からのイベント ID 999 の説明が見つかりません。 このイベントを発生させるコンポーネントがローカル コンピューターにインストールされていないか、 インストールが壊れています。 ローカル コンピューターにコンポーネントをインストールするか、コンポーネントを修復してください。

以上、よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

1.イベントID
ReportEventによるイベントログ出力は、メッセージコンパイラ用ソースとなる、.mcファイルに形式を記述してメッセージコンパイラでコンパイルするのが大前提なので、下記リンク先のEvent Identifiersの形式で定義します。このうち質問に関係ありそうなCodeの部分は、コンパイル時に自動的に連番が振られるため、Symbolを他の項目とは変えるだけでOKですが、他のフィ―ルドは既定の値(例えばError=0x3など)を正しく記述する必要があります。

Event Identifiers
Message Text Files

2.メッセージファイルDLLを使用しない方法
C++のアプリケーションからの出力では、前述の通りメッセージコンパイラを使用する前提なので、その出力を処理するメッセージファイルDLLを作成することが通常で、他の方法があるとは思えません。

意味があるかどうかは分かりませんが、カーネルモードのWindowsデバイスドライバーではビルド時にコンパイル済メッセージリソースを取り込むので、DLL無しでIoWriteErrorLogEntryのカーネルコールを呼び出すことで、mcファイルをコンパイルしたリソースのイベントメッセージ出力が可能です。

従ってイベントメッセージ出力専用のカーネルモードドライバーを作ってインストールして、出力したいイベントメッセージをそのドライバーに受け渡すことで、DLL無しでメッセージ出力ができます。
おそらくそれと同じことを簡単に実現するのがメッセージファイルDLLだとは思いますが、DLLを使用しない方法はあるのか?と聞かれていますので、一応お伝えします。

ご参考までに、実際にドライバーで使用しているMCファイルの例を以下に載せます。

C

1;// 2;// Status values are 32 bit values layed out as follows: 3;// 4;// 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 5;// 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 6;// +---+-+-------------------------+-------------------------------+ 7;// |Sev|C| Facility | Code | 8;// +---+-+-------------------------+-------------------------------+ 9;// 10;// where 11;// 12;// Sev - is the severity code 13;// 14;// 00 - Success 15;// 01 - Informational 16;// 10 - Warning 17;// 11 - Error 18;// 19;// C - is the Customer code flag 20;// 21;// Facility - is the facility code 22;// 23;// Code - is the facility's status code 24;// 25; 26MessageIdTypedef=NTSTATUS 27 28SeverityNames=(Success=0x0:STATUS_SEVERITY_SUCCESS 29 Informational=0x1:STATUS_SEVERITY_INFORMATIONAL 30 Warning=0x2:STATUS_SEVERITY_WARNING 31 Error=0x3:STATUS_SEVERITY_ERROR 32 ) 33 34FacilityNames=(System=0x0 35 RpcRuntime=0x2:FACILITY_RPC_RUNTIME 36 RpcStubs=0x3:FACILITY_RPC_STUBS 37 Io=0x4:FACILITY_IO_ERROR_CODE 38 XpDriver=0x7:FACILITY_XP_ERROR_CODE 39 ) 40 41 42MessageId=0x0001 Facility=XpDriver Severity=Error SymbolicName=MISSING_REGISTRY_INFORMATION 43Language=English 44Information needed to start device %2 is missing from the registry. The key missing is %3. 45. 46 47MessageId=0x0002 Facility=XpDriver Severity=Error 48SymbolicName=FAILED_TO_MAP_ADDRESS 49Language=English 50The device failed to map the address. Another device may be using this address. 51. 52

投稿2020/03/08 16:22

編集2020/09/01 23:20
ahidaka

総合スコア391

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

spike0726

2020/03/09 03:46

大変丁寧な解説ありがとうございました。 1につきましては理解できました、ありがとうございます。 2につきましてはドライバレベルに手を出すには敷居が高すぎるため、メッセージDLLを作成しよと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問