我正在尝试读取进程的所有内存。我一直在用这个
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进程时才发生这种情况?为什么会这样?
答案 0 :(得分:0)
如果目标是x64,则显式编译为x64。如果目标是x86,则显式编译x86。您可以在项目属性中找到设置。
之所以必须这样做,是因为每种架构的许多Windows API结构都不同,这是因为如果该结构包含指针,则它们在x86上为4字节,在x64上为8字节。
将IntPtr用于所有地址/偏移量,这将使其为要为其构建目标的目标使用正确的指针大小。这样,您就不会在尝试将8个字节的值装入4个字节的变量中时遇到任何问题。
如果您遵循此技术,则不会出现这些问题。