详解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



猜你喜欢

转载自blog.csdn.net/u011569253/article/details/76088008