Я работал над приложением, которое использует API для получения событий из журнала событий Windows.Я застрял на смещении указателя в данный момент.Конкретной структурой, которую я использую, является EVENTLOGRECORD (см .: http://msdn.microsoft.com/en-us/library/aa363646(v=vs.85).aspx). Моя структура 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 и ComputerName с помощью 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);
Моя проблема заключается в попытке получить часть Strings из структуры.Я не могу понять, какие будут правильные смещения. Я могу сделать это в C ++, но я не могу заставить его работать в C #. Вот фрагмент того, что я использую в C ++ (elr is (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 / invoke любым способом. Спасибо.