我一直在研究使用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