システム イベント ログへの書き込み
エラーは NTSTATUS 値によって指定されます。 システムは、ドライバーで使用できる特定の NTSTATUS 値を事前に定義し、ドライバー ライターは追加のエラーを定義できます。 エラーをログに記録する場合は、特定の NTSTATUS 値のみを使用できることに注意してください。
エラーのログ記録時に使用できる NTSTATUS 値ごとに、関連するエラー メッセージがあります。 たとえば、並列ポート ドライバーは、NTSTATUS 値 PAR_INTERRUPT_CONFLICTを使用して、ハードウェア割り込みの競合を表します。"割り込み競合が %1 で検出されました" というメッセージ テキストが表示されます。
イベント ビューアーは、ログ エントリのプロパティ シートの [説明] テキスト ボックスにメッセージ テキストを表示します。 メッセージ テキスト文字列に "%1" が含まれている場合、イベント ビューアーはエントリをログに記録したデバイスの名前に置き換えます。 メッセージ テキストには、フォーム "%2"、"%3" などの追加パラメーターを含めることができます。 ドライバーがエラーをログに記録すると、それらのパラメーターの文字列値を指定できます。 これらの文字列値は、 挿入文字列 と呼ばれます。 イベント ビューアーでは、パーセント値の代わりにそれらが自動的に挿入されます。
ドライバーは、ログ エントリにバイナリ データ ( ダンプ データ と呼ばれます) を含めることもできます。 イベント ビューアーは、ログ エントリのプロパティ シートの [データ] テキスト ボックスにダンプ データを表示します。
ログ エントリのプロパティ シートを表示するには、イベント ビューアーのエントリをダブルクリックします。 次のスクリーン ショットは、ログ エントリのプロパティ シートのサンプルを示しています。
ドライバーは、 IoAllocateErrorLogEntry ルーチンを使用してエラー ログ エントリを割り当てます。 ログ エントリは、可変長の IO_ERROR_LOG_PACKET ヘッダーの後に挿入文字列が続きます。
次の図は、メモリ内のエラー ログ エントリのレイアウトを示しています。
IO_ERROR_LOG_PACKET の ErrorCode メンバー は、エラーの NTSTATUS 値を指定します。 DumpData メンバーは、ログ エントリのダンプ データを指定します。 DumpData は可変サイズの配列で、そのサイズは DumpDataSize メンバーによって指定されます。 ドライバーは、 StringOffset メンバーを持つ最初の挿入文字列の先頭と、 NumberOfStrings メンバー内の文字列の数を指定します。 各挿入文字列自体は、null で終わる Unicode 文字列です。
ドライバーは、割り当てられたエラー ログ エントリを入力すると、 IoWriteErrorLogEntry を使用してエラー ログにエントリを書き込みます。 IoWriteErrorLogEntry は、ログ エントリに割り当てられたメモリを自動的に解放します。 ドライバーは IoFreeErrorLogEntry を使用して、未使用のログ エントリを解放できます。
定義済みのエラー コード (IO_ERR_XXX形式) は、Windows Driver Kit (WDK) に含まれている ntiologc.h ヘッダー ファイルで定義されています。 各エラー コードに関連付けられているエラー メッセージは、エラー コードの宣言の横にある ntiologc.h のコメントにあります。 定義済みのエラー コードを使用するには、ドライバーは、関連するエラー メッセージのソースとして、システム ファイル iologmsg.dll を登録する必要があります。 詳細については、「 エラー メッセージのソースとしての登録」を参照してください。
ドライバーは、独自のカスタム エラーの種類と関連するエラー メッセージを定義することもできます。 詳細については、 「カスタム エラーの種類の定義」 を参照してください。