c# - C# ReadProcessMemory 错误 299
问题描述
我正在尝试读取所有进程的内存。我一直在用这个
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 进程时发生?为什么会这样?
解决方案
如果您的目标是 x64,请为 x64 显式编译。如果您的目标是 x86,请为 x86 显式编译。您可以在项目属性中找到设置。
您必须这样做,因为每个体系结构的许多 Windows API 结构都不同,这是因为如果结构包含指针,它们在 x86 上是 4 字节,在 x64 上是 8 字节。
对所有地址/偏移量使用 IntPtr,这将使它为您构建它的目标使用正确的指针大小。这样,您在尝试将 8 字节值放入 4 字节变量时不会有任何问题。
如果您遵循此技术,您将不会遇到这些问题。
推荐阅读
- c++ - C7608:原子约束在使用 range::to_vector 时应该是一个常量表达式
- javascript - 在移动设备中显示鼠标光标 - CSS/JS
- wpf - 如何更改 WPF 工具栏下拉按钮的背景颜色?
- r - 输入 Shiny App 输入后执行脚本
- python - tf.keras.preprocessing.image.load_img 无法直接导入灰度图像而不会出现裁剪错误
- android - 片段不会改变其他片段的背景颜色
- firebase - 我们可以将相同的分析事件发送到 2 个不同的谷歌分析帐户吗?
- python - 从 Python 调用时禁止在 MATLAB 程序中打印
- scala - ScalaPB 代码生成选项,用于方法实现中的元数据访问
- ios - Firebase 没有向我的应用发送短信