详解EVENTLOGRECORD结构体遇到的问题

如何获取电脑的各种事件信息,我相信随便一搜索就都知道了,这样的帖子很多,但是他们的例子很多根本获取不到事件的详细信息。ReadEventLog获取具体事件信息,我就不做过多讲述了,很多帖子都有使用方法,下面我要讲的是EVENTLOGRECORD结构体。这个结构体https://msdn.microsoft.com/en-us/library/windows/desktop/aa363646(v=vs.85).aspx有介绍,但是不是很详细

typedef struct _EVENTLOGRECORD {
    DWORD  Length;        // Length of full record
    DWORD  Reserved;      // Used by the service
    DWORD  RecordNumber;  // Absolute record number
    DWORD  TimeGenerated; // Seconds since 1-1-1970
    DWORD  TimeWritten;   // Seconds since 1-1-1970
    DWORD  EventID;
    WORD   EventType;
    WORD   NumStrings;
    WORD   EventCategory;
    WORD   ReservedFlags; // For use with paired events (auditing)
    DWORD  ClosingRecordNumber; // For use with paired events (auditing)
    DWORD  StringOffset;  // Offset from beginning of record
    DWORD  UserSidLength;
    DWORD  UserSidOffset;
    DWORD  DataLength;
    DWORD  DataOffset;    // Offset from beginning of record
    //
    // Then follow:
    //
    // WCHAR SourceName[]
    // WCHAR Computername[]
    // SID   UserSid
    // WCHAR Strings[]
    // BYTE  Data[]
    // CHAR  Pad[]
    // DWORD Length;
    //
} EVENTLOGRECORD, *PEVENTLOGRECORD;

 注意:DWORD  EventID;这个字段不能直接作为判断事件的id 需要转(short)pevlr->EventID在做判断。

这个是源码的内容,下面我就讲如何获取详细信息,前面的数据可以直接看出来,但是结构体后面的数据块存放的是源名称,计算机名,详细信息

下面我就讲讲如何获取这些东西,我看了好多帖子  他们都是这样获取源名称 

UINTuOffset = 0; // 偏移量

uOffset = sizeof(EVENTLOGRECORD) ;
LPTSTR pstr = (LPTSTR)(LPBYTE)pevlr + uOffset;

我试着这样写,但是实际情况根本获取不到完整的源名称,存在偏差我在win7和win10测试 偏差结果一样 下面是我获取源名称的方法

UINTuOffset = 0; // 偏移量
uOffset = sizeof(EVENTLOGRECORD) - 10;
LPTSTR pstr = (LPTSTR)(LPBYTE)pevlr + uOffset;

之后获取计算机名称 

uOffset += lstrlen(pstr) + 1;
LPTSTR pstrcomputer = (LPTSTR)(LPBYTE)pevlr + uOffset;就ok了

下面我要讲述的是获取详细信息。msdn上介绍这个结构体 有一个这个字段 

DWORD  StringOffset;  // Offset from beginning of record

The offset of the description strings within this event log record.

这个字段是详细信息的偏移量,但是你会发现在获取详细信息的时候根本不对

我不知道这个值返回为什么不对,希望有知道大神讲一下。

我发现这个字段并不是没有用,他的值是2倍的详细信息起始点,找到了这个规律,就可以获取详细信息了。

代码如下:

uOffset = pevlr->StringOffset / 2;
LPTSTR ShutdownActionType = (LPTSTR)(LPBYTE)pevlr + uOffset;

之后的字段获取直接加字符串长度再加1,就可以获取之后的字段了。

相关代码请参考http://download.csdn.net/detail/u011569253/9910254



  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
`EVENTLOGRECORD` 是一个用于表示事件日志记录的结构体。以下是其大致定义: ```c typedef struct _EVENTLOGRECORD { DWORD Length; DWORD Reserved; DWORD RecordNumber; DWORD TimeGenerated; DWORD TimeWritten; DWORD EventID; WORD EventType; WORD NumStrings; WORD EventCategory; WORD ReservedFlags; DWORD ClosingRecordNumber; DWORD StringOffset; DWORD UserSidLength; DWORD UserSidOffset; DWORD DataLength; DWORD DataOffset; // 后续可能会有可变长度的字段 } EVENTLOGRECORD, *PEVENTLOGRECORD; ``` 其中,各字段的含义如下: - `Length`:事件日志记录的总长度(包括结构体本身和后续可能的可变长度字段)。 - `Reserved`:保留字段,不使用。 - `RecordNumber`:事件日志记录的序号。 - `TimeGenerated`:事件发生的时间戳(生成时间)。 - `TimeWritten`:事件写入日志的时间戳。 - `EventID`:事件的标识符。 - `EventType`:事件类型,如信息、警告、错误等。 - `NumStrings`:事件中包含的字符串数量。 - `EventCategory`:事件的分类。 - `ReservedFlags`:保留字段,不使用。 - `ClosingRecordNumber`:关闭事件记录的序号。 - `StringOffset`:第一个字符串的偏移量。 - `UserSidLength`:用户安全标识符(SID)的长度。 - `UserSidOffset`:用户SID的偏移量。 - `DataLength`:事件数据的长度。 - `DataOffset`:事件数据的偏移量。 请注意,`EVENTLOGRECORD` 结构体中的字段可能会根据实际情况有所变化,具体取决于事件日志记录的内容和属性。以上仅为一般定义示例。如果您需要在代码中使用该结构体,请根据实际情况进行适当调整。 希望对您有所帮助!如果您有任何其他问题,请随时提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值