我一直在研究使用API从Windows事件日志中获取事件的应用程序。目前我被困在指针偏移处。我使用的具体结构是EVENTLOGRECORD(请参阅:http://msdn.microsoft.com/en-us/library/aa363646(v=vs.85).aspx)。我的C#结构定义为:在C中使用指针偏移量#
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto, Pack = 1)]
internal struct EVENTLOGRECORD
{
internal UInt32 Length;
internal UInt32 Reserved;
internal UInt32 RecordNumber;
internal UInt32 TimeGenerated;
internal UInt32 TimeWritten;
internal UInt32 EventID;
internal UInt16 EventType;
internal UInt16 NumStrings;
internal UInt16 EventCategory;
internal UInt16 ReservedFlags;
internal UInt32 ClosingRecordNumber;
internal UInt32 StringOffset;
internal UInt32 UserSidLength;
internal UInt32 UserSidOffset;
internal UInt32 DataLength;
internal UInt32 DataOffset;
}
作为
我ReadEventLog函数声明:
[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Auto, EntryPoint = "ReadEventLog")]
internal static extern Boolean ReadEventLog(IntPtr hEventLog, EVT_READ_FLAGS dwReadFlags, UInt32 dwRecordOffset, IntPtr lpBuffer, UInt32 nNumberOfBytesToRead, out UInt32 pnBytesRead, out UInt32 pnMinNumberOfBytesNeeded);
我能够得到填充数据的结构,我可以用得到SOURCENAME和计算机名段IntPtr.Add。例如:
IntPtr pSrc = IntPtr.Add(pRecord, Marshal.SizeOf(typeof(EVENTLOGRECORD)));
string sSrc = Marshal.PtrToStringAuto(pSrc);
Console.WriteLine("source: {0}\n", sSrc);
IntPtr pComp = IntPtr.Add(pSrc, (sSrc.Length * 2) + 2);
string sComp = Marshal.PtrToStringAuto(pComp);
Console.WriteLine("computer: {0}\n", sComp);
我的问题是试图从结构中获取字符串部分。我似乎无法弄清楚什么是正确的偏移量。我可以用C++来完成,但我似乎无法使它在C#中工作。以下是我在C使用的一个片段++(ELR是(EVENTLOGRECORD *)pRecord):
char* strings = (LPSTR)((LPBYTE) elr + elr->StringOffset);
while (elr->NumStrings)
{
wprintf(L"String: %s\n", strings);
strings += (wcslen((wchar_t*)strings) * sizeof(wchar_t)) + sizeof(wchar_t);
elr->NumStrings--;
}
希望有人可以帮助解释,我错过了什么。我也很好奇,如果有任何替代IntPtr.Add,因为需要.NET 4.0。我不是以任何方式调用p /的专家。谢谢。
这是做为练习吗?为什么不使用System.Diagnostics.EventLog类读取条目? – Tom 2011-04-22 17:23:43
不。实际上,它是由于.NET框架中的错误而导致的:https://connect.microsoft.com/VisualStudio/feedback/details/654644/eventlog-entrywritten-and-event-log-overwrite-as -needed-problems 我提交了一个,显然这确实是一个问题。否则,我会遍布EventLog类。这很容易。 – Deviation 2011-04-22 17:25:04
我不明白为什么一个写入错误(它看起来是Connect链接)会阻止你使用内置的类从日志中读取事件。 – 2011-04-22 17:56:46