Win32 API 日本語リファレンス
ホームSystem.EventLog › EVENTLOGRECORD

EVENTLOGRECORD

構造体
サイズx64: 56 バイト / x86: 56 バイト

サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。

フィールド

フィールドサイズx64x86説明
LengthDWORD4+0+0このイベントレコードのサイズ (バイト単位)。この値は、ログ内を前方または後方へ移動しやすくするために、エントリの両端に格納される点に注意してください。この長さには、DWORD 境界に合わせるためにレコードの末尾に挿入されたパディングバイトも含まれます。
ReservedDWORD4+4+4常に ELF_LOG_SIGNATURE (値は 0x654c664c) に設定される DWORD 値です。これは ASCII で eLfL を表します。
RecordNumberDWORD4+8+8レコードの番号です。この値は、 ReadEventLog 関数の EVENTLOG_SEEK_READ フラグと共に使用して、指定したレコードから読み取りを開始するために利用できます。詳細については、 イベントログレコードを参照してください。
TimeGeneratedDWORD4+12+12このエントリが送信された時刻です。この時刻は、協定世界時 1970 年 1 月 1 日 00:00:00 からの経過秒数で表されます。
TimeWrittenDWORD4+16+16このエントリが、ログへ書き込むためにサービスによって受信された時刻です。この時刻は、協定世界時 1970 年 1 月 1 日 00:00:00 からの経過秒数で表されます。
EventIDDWORD4+20+20イベント識別子です。この値はイベントのイベントソースに固有であり、ソース名と共に、イベントソースのメッセージファイル内にある説明文字列を特定するために使用されます。詳細については、 イベント識別子を参照してください。
EventTypeREPORT_EVENT_TYPE2+24+24

イベントの種類です。このメンバーには次のいずれかの値を指定できます。

意味
EVENTLOG_ERROR_TYPE
0x0001
エラーイベント
EVENTLOG_AUDIT_FAILURE
0x0010
失敗の監査イベント
EVENTLOG_AUDIT_SUCCESS
0x0008
成功の監査イベント
EVENTLOG_INFORMATION_TYPE
0x0004
情報イベント
EVENTLOG_WARNING_TYPE
0x0002
警告イベント

詳細については、 イベントの種類を参照してください。

NumStringsWORD2+26+26ログ内 (StringOffset で示される位置) に存在する文字列の数です。これらの文字列は、ユーザーに表示される前にメッセージへマージされます。
EventCategoryWORD2+28+28このイベントのカテゴリです。この値の意味はイベントソースによって異なります。詳細については、 イベントカテゴリを参照してください。
ReservedFlagsWORD2+30+30予約済みです。
ClosingRecordNumberDWORD4+32+32予約済みです。
StringOffsetDWORD4+36+36このイベントログレコード内における説明文字列のオフセットです。
UserSidLengthDWORD4+40+40UserSid メンバーのサイズ (バイト単位)。セキュリティ識別子が指定されていない場合、この値は 0 になることがあります。
UserSidOffsetDWORD4+44+44このイベントログレコード内におけるセキュリティ識別子 (SID) のオフセットです。この SID に対応するユーザー名を取得するには、 LookupAccountSid 関数を使用します。
DataLengthDWORD4+48+48イベント固有のデータ (DataOffset で示される位置) のサイズ (バイト単位)。
DataOffsetDWORD4+52+52このイベントログレコード内におけるイベント固有の情報のオフセット (バイト単位)。この情報は、何らかの特定の内容 (たとえばディスクドライバーであれば再試行回数を記録するなど) に続いて、記録されるイベントおよびそのエントリを生成したソースに固有のバイナリ情報が並ぶ形になります。

公式ドキュメント

ReadEventLog 関数によって返されるイベントレコードに関する情報を格納します。

解説(Remarks)

定義済みのメンバーの後には、イベント識別子で識別されるメッセージ用の置換文字列、バイナリ情報、エントリ全体を DWORD 境界に合わせるためのパディングバイト、そして最後にもう一度ログエントリの長さが続きます。文字列とバイナリ情報は任意の長さになり得るため、それらを参照する構造体メンバーは定義されていません。Winnt.h におけるこの構造体の宣言では、これらのメンバーは次のように記述されています。

    // WCHAR SourceName[]
    // WCHAR Computername[]
    // SID   UserSid
    // WCHAR Strings[]
    // BYTE  Data[]
    // CHAR  Pad[]
    // DWORD Length;

ソース名は、イベントソースの名前を指定する可変長の文字列です。コンピューター名は、イベントを生成したコンピューターの名前です。ユーザー SID が DWORD 境界に配置されるように、その後ろにパディングバイトが続く場合があります。ユーザー SID は、このイベントが記録された時点のアクティブなユーザーを識別します。UserSidLength が 0 の場合、このフィールドは空になることがあります。

イベント識別子は、ソース名および言語識別子と組み合わせて、イベントをより詳しく説明する文字列を識別します。これらの文字列は置換文字列として使用され、メッセージ文字列にマージされて完全なメッセージになります。メッセージ文字列は、レジストリのソースエントリで指定されたメッセージファイルに含まれています。メッセージファイルから適切なメッセージ文字列を取得するには、 LoadLibrary 関数でメッセージファイルを読み込み、 FormatMessage 関数を使用します。

バイナリ情報は、イベントに固有の情報です。デバイスドライバーでエラーが発生したときのプロセッサレジスタの内容、ネットワークから受信した不正なパケットのダンプ、(データ領域の破損が検出されたときの) プログラム内のすべての構造体のダンプなどが該当します。この情報は、デバイスドライバーやアプリケーションの作成者が、バグやアプリケーションへの不正な侵入を突き止める際に役立つはずです。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での定義

#include <windows.h>

// EVENTLOGRECORD  (x64 56 / x86 56 バイト)
typedef struct EVENTLOGRECORD {
    DWORD Length;
    DWORD Reserved;
    DWORD RecordNumber;
    DWORD TimeGenerated;
    DWORD TimeWritten;
    DWORD EventID;
    REPORT_EVENT_TYPE EventType;
    WORD NumStrings;
    WORD EventCategory;
    WORD ReservedFlags;
    DWORD ClosingRecordNumber;
    DWORD StringOffset;
    DWORD UserSidLength;
    DWORD UserSidOffset;
    DWORD DataLength;
    DWORD DataOffset;
} EVENTLOGRECORD;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct EVENTLOGRECORD
{
    public uint Length;
    public uint Reserved;
    public uint RecordNumber;
    public uint TimeGenerated;
    public uint TimeWritten;
    public uint EventID;
    public ushort EventType;
    public ushort NumStrings;
    public ushort EventCategory;
    public ushort ReservedFlags;
    public uint ClosingRecordNumber;
    public uint StringOffset;
    public uint UserSidLength;
    public uint UserSidOffset;
    public uint DataLength;
    public uint DataOffset;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure EVENTLOGRECORD
    Public Length As UInteger
    Public Reserved As UInteger
    Public RecordNumber As UInteger
    Public TimeGenerated As UInteger
    Public TimeWritten As UInteger
    Public EventID As UInteger
    Public EventType As UShort
    Public NumStrings As UShort
    Public EventCategory As UShort
    Public ReservedFlags As UShort
    Public ClosingRecordNumber As UInteger
    Public StringOffset As UInteger
    Public UserSidLength As UInteger
    Public UserSidOffset As UInteger
    Public DataLength As UInteger
    Public DataOffset As UInteger
End Structure
import ctypes
from ctypes import wintypes

class EVENTLOGRECORD(ctypes.Structure):
    _fields_ = [
        ("Length", wintypes.DWORD),
        ("Reserved", wintypes.DWORD),
        ("RecordNumber", wintypes.DWORD),
        ("TimeGenerated", wintypes.DWORD),
        ("TimeWritten", wintypes.DWORD),
        ("EventID", wintypes.DWORD),
        ("EventType", ctypes.c_ushort),
        ("NumStrings", ctypes.c_ushort),
        ("EventCategory", ctypes.c_ushort),
        ("ReservedFlags", ctypes.c_ushort),
        ("ClosingRecordNumber", wintypes.DWORD),
        ("StringOffset", wintypes.DWORD),
        ("UserSidLength", wintypes.DWORD),
        ("UserSidOffset", wintypes.DWORD),
        ("DataLength", wintypes.DWORD),
        ("DataOffset", wintypes.DWORD),
    ]
#[repr(C)]
pub struct EVENTLOGRECORD {
    pub Length: u32,
    pub Reserved: u32,
    pub RecordNumber: u32,
    pub TimeGenerated: u32,
    pub TimeWritten: u32,
    pub EventID: u32,
    pub EventType: u16,
    pub NumStrings: u16,
    pub EventCategory: u16,
    pub ReservedFlags: u16,
    pub ClosingRecordNumber: u32,
    pub StringOffset: u32,
    pub UserSidLength: u32,
    pub UserSidOffset: u32,
    pub DataLength: u32,
    pub DataOffset: u32,
}
import "golang.org/x/sys/windows"

type EVENTLOGRECORD struct {
	Length uint32
	Reserved uint32
	RecordNumber uint32
	TimeGenerated uint32
	TimeWritten uint32
	EventID uint32
	EventType uint16
	NumStrings uint16
	EventCategory uint16
	ReservedFlags uint16
	ClosingRecordNumber uint32
	StringOffset uint32
	UserSidLength uint32
	UserSidOffset uint32
	DataLength uint32
	DataOffset uint32
}
type
  EVENTLOGRECORD = record
    Length: DWORD;
    Reserved: DWORD;
    RecordNumber: DWORD;
    TimeGenerated: DWORD;
    TimeWritten: DWORD;
    EventID: DWORD;
    EventType: Word;
    NumStrings: Word;
    EventCategory: Word;
    ReservedFlags: Word;
    ClosingRecordNumber: DWORD;
    StringOffset: DWORD;
    UserSidLength: DWORD;
    UserSidOffset: DWORD;
    DataLength: DWORD;
    DataOffset: DWORD;
  end;
const EVENTLOGRECORD = extern struct {
    Length: u32,
    Reserved: u32,
    RecordNumber: u32,
    TimeGenerated: u32,
    TimeWritten: u32,
    EventID: u32,
    EventType: u16,
    NumStrings: u16,
    EventCategory: u16,
    ReservedFlags: u16,
    ClosingRecordNumber: u32,
    StringOffset: u32,
    UserSidLength: u32,
    UserSidOffset: u32,
    DataLength: u32,
    DataOffset: u32,
};
type
  EVENTLOGRECORD {.bycopy.} = object
    Length: uint32
    Reserved: uint32
    RecordNumber: uint32
    TimeGenerated: uint32
    TimeWritten: uint32
    EventID: uint32
    EventType: uint16
    NumStrings: uint16
    EventCategory: uint16
    ReservedFlags: uint16
    ClosingRecordNumber: uint32
    StringOffset: uint32
    UserSidLength: uint32
    UserSidOffset: uint32
    DataLength: uint32
    DataOffset: uint32
struct EVENTLOGRECORD
{
    uint Length;
    uint Reserved;
    uint RecordNumber;
    uint TimeGenerated;
    uint TimeWritten;
    uint EventID;
    ushort EventType;
    ushort NumStrings;
    ushort EventCategory;
    ushort ReservedFlags;
    uint ClosingRecordNumber;
    uint StringOffset;
    uint UserSidLength;
    uint UserSidOffset;
    uint DataLength;
    uint DataOffset;
}

HSP用 定義

HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; EVENTLOGRECORD サイズ: 56 バイト(x64)
dim st, 14    ; 4byte整数×14(構造体サイズ 56 / 4 切り上げ)
; Length : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; Reserved : DWORD (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; RecordNumber : DWORD (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; TimeGenerated : DWORD (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; TimeWritten : DWORD (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; EventID : DWORD (+20, 4byte)  st.5 = 値  /  値 = st.5   (lpoke/lpeek も可)
; EventType : REPORT_EVENT_TYPE (+24, 2byte)  wpoke st,24,値  /  値 = wpeek(st,24)
; NumStrings : WORD (+26, 2byte)  wpoke st,26,値  /  値 = wpeek(st,26)
; EventCategory : WORD (+28, 2byte)  wpoke st,28,値  /  値 = wpeek(st,28)
; ReservedFlags : WORD (+30, 2byte)  wpoke st,30,値  /  値 = wpeek(st,30)
; ClosingRecordNumber : DWORD (+32, 4byte)  st.8 = 値  /  値 = st.8   (lpoke/lpeek も可)
; StringOffset : DWORD (+36, 4byte)  st.9 = 値  /  値 = st.9   (lpoke/lpeek も可)
; UserSidLength : DWORD (+40, 4byte)  st.10 = 値  /  値 = st.10   (lpoke/lpeek も可)
; UserSidOffset : DWORD (+44, 4byte)  st.11 = 値  /  値 = st.11   (lpoke/lpeek も可)
; DataLength : DWORD (+48, 4byte)  st.12 = 値  /  値 = st.12   (lpoke/lpeek も可)
; DataOffset : DWORD (+52, 4byte)  st.13 = 値  /  値 = st.13   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global EVENTLOGRECORD
    #field int Length
    #field int Reserved
    #field int RecordNumber
    #field int TimeGenerated
    #field int TimeWritten
    #field int EventID
    #field short EventType
    #field short NumStrings
    #field short EventCategory
    #field short ReservedFlags
    #field int ClosingRecordNumber
    #field int StringOffset
    #field int UserSidLength
    #field int UserSidOffset
    #field int DataLength
    #field int DataOffset
#endstruct

stdim st, EVENTLOGRECORD        ; NSTRUCT 変数を確保
st->Length = 100
mes "Length=" + st->Length