C# 精简多指针的内存读取

标签 c# c++ pinvoke readprocessmemory

我已经创建了一个方法,通过提供所需的偏移量 + 起始地址来读取多指针。 (下面的代码)。总而言之,我正在尝试简化此方法,下面我将解释我的问题。

我一直在为转换而苦苦挣扎。参数是 IntPtr,读取地址的输出是字节数组,我的第一个想法是:“将字节数组转换为 IntPtr,重新处理它,最后将最后读取的地址转换为 int32(因为最后一个地址不是指针它永远不会被读取,所以在这里转换为 Int32 应该没问题)",

然而,这并没有给出一个好的结果。所以目前我坚持将字节数组转换为 Int32,然后将 Int32 转换为 IntPtr 的解决方案。人们确实说 bitconverter 是一种糟糕的方法,因为它可能会在 64 位平台上引起问题,我也相信有一种方法可以提供更好的性能(因为我将一个对象转换了 2 次)。

最后,如果有人认为可以在 C++ 中创建类似的函数,然后在 C# 中 P/Invoke 它(我想这样会更有效?)请告诉我。 (我正在尝试调整我的编程知识。并且发现语言组合非常有趣)

[DllImport("kernel32.dll", EntryPoint = "ReadProcessMemory")]
public static extern Int32 ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress,
[In, Out] byte[] buffer, Int32 sizeout, out IntPtr lpNumberOfBytesRead);

public Int32 ReadBytes(IntPtr Handle, IntPtr Address, int[] Offsets, int BytesToRead = 4)
{
    IntPtr ptrBytesRead;
    byte[] value = new byte[BytesToRead];

    ReadProcessMemory(Handle, Address, value, BytesToRead, out ptrBytesRead);

    //Read Offsets
    for (int i = 0; i < Offsets.Length; i++)
    {
        ReadProcessMemory(Handle, 
        new IntPtr(BitConverter.ToInt32(value, 0) + Offsets[i]), 
        value, 
        BytesToRead, 
        out ptrBytesRead);
    }

    return BitConverter.ToInt32(value, 0);
}

任何简化此方法的想法将不胜感激!提前致谢!

最佳答案

如@usr 所述,代码的性能将完全由对 ReadProcessMemory 的调用决定。您不应期望从当前水平提高性能。

但是,您可以通过避免使用字节数组和 BitConverter 使代码更易于阅读。像这样:

[DllImport("kernel32.dll", SetLastError = true)]
public static extern int ReadProcessMemory(
    IntPtr hProcess, 
    IntPtr lpBaseAddress,
    out IntPtr lpBuffer, 
    IntPtr nSize, 
    out IntPtr lpNumberOfBytesRead
);

private static IntPtr ReadProcessPointer(IntPtr hProcess, IntPtr Address)
{
    IntPtr result;
    IntPtr NumberOfBytesRead;
    if (ReadProcessMemory(hProcess, Address, out result, (IntPtr)IntPtr.Size, out NumberOfBytesRead) == 0)
        throw new Win32Exception();
    return result;
}

public static IntPtr FollowPointers(IntPtr hProcess, IntPtr Address, int[] Offsets)
{
    IntPtr ptr = ReadProcessPointer(hProcess, Address);
    for (int i = 0; i < Offsets.Length; i++)
        ptr = ReadProcessPointer(hProcess, ptr + Offsets[i]);
    return ptr;
}

关于C# 精简多指针的内存读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18934726/

相关文章:

c# - 如何调用 scanf 而不是 Console.ReadLine()?

c# - 无法将 UTF-8 文件中的特殊字符转换为 ANSI

c++ - std::experimental::directory_iterator 的意外别名

c++ - 用户定义的参数化操纵器

c# - 结构 DEVMODE 中的 Marshal.PtrToStructure() 和字符数组出现问题

c# - F# 指针成员访问器

c# - 如何从 Form1 访问 Form3 中的文本框?

c# - ListView 函数中的行错误帮助

java - 在java中的c#脚本中访问信息

c++ - constexpr 值的数据结构