C#ReadProcessMemory错误299

时间:2018-08-12 03:29:56

标签: c# .net memory readprocessmemory

我正在尝试读取进程的所有内存。我一直在用这个

        ProcessModule pm = process.MainModule;
        temp = new byte[pm.ModuleMemorySize];
        byte[] d = new byte[temp.Length];
        int read;
        int size = temp.Length;
        MessageBox.Show("Size: " + size);

        if (ReadProcessMemory(process.Handle, pm.BaseAddress, temp, size, out read)) {
            //d = temp;
            fileData = encoder.GetString(temp);
        } else MessageBox.Show("Error: " + Marshal.GetLastWin32Error());

有时,这完全可以正常工作,但对于其他应用程序则根本无法工作,并返回“错误299”。

我正在以x64和管理员身份运行我的应用程序。我尝试阅读哪种类型的过程似乎没有什么区别。即使是大文件(26MB)也可以读取。然后,我尝试读取我的其他C#程序之一,但它不起作用。

编辑:是否有可能仅在尝试读取C#.exe进程时才发生这种情况?为什么会这样?

1 个答案:

答案 0 :(得分:0)

如果目标是x64,则显式编译为x64。如果目标是x86,则显式编译x86。您可以在项目属性中找到设置。

之所以必须这样做,是因为每种架构的许多Windows API结构都不同,这是因为如果该结构包含指针,则它们在x86上为4字节,在x64上为8字节。

将IntPtr用于所有地址/偏移量,这将使其为要为其构建目标的目标使用正确的指针大小。这样,您就不会在尝试将8个字节的值装入4个字节的变量中时遇到任何问题。

如果您遵循此技术,则不会出现这些问题。