如何获取电脑的各种事件信息,我相信随便一搜索就都知道了,这样的帖子很多,但是他们的例子很多根本获取不到事件的详细信息。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