gpt4 book ai didi

c# - 在 C# 中使用指针偏移

转载 作者:行者123 更新时间:2023-11-30 17:18:28 27 4
gpt4 key购买 nike

我一直在开发一个使用 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);

我能够获取填充有数据的结构,并且我可以使用 IntPtr.Add 访问 SourceName 和 ComputerName 部分。示例:

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/invoke 方面的专家。谢谢。

最佳答案

如果您使用 Marshal.PtrToStructure() 将数据 block 的第一部分复制到 EVENTLOGRECORD,那么您应该能够执行如下操作:

EVENTLOGRECORD record;
... Copy the ptr into record ...
IntPtr pStrings = IntPtr.Add(pRecord, (record.StringOffset * 2));

我很乐意为您解决这个问题,但我懒得做所有其他 p/invoke 位,这些位可以进行 ReadEventLog 调用。

关于c# - 在 C# 中使用指针偏移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5758049/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com