2011-09-10 29 views
1

有人可以请帮助我,我不知道为什么ReadProcessMemory函数失败,GetLastError = 299.这是我的代码,我看不出有什么不对。ReadProcessMemory总是失败与GLE:299

if(ReadProcessMemory(hProcess, (void*)0, IDH_Buffer, sizeof(IMAGE_DOS_HEADER), 0) != true) 
     std::cout << "Failed to read from Process, GLE=" << GetLastError() << "\n"; 

IDH_Buffer已被分配,hProcess非NULL

我的应用程序运行作为管理员和我试着从一个标准用户模式应用程序读取应用程序。

请你能劝我。 由于

+0

您不应该将系统函数的返回值与“true”进行比较,您应该检查它们是否为“== false”。原因是错误,它保证返回0.在成功它可以返回任何其他。与“真”相比是不正确的。但是,这可能不是你的问题。 – SoapBox

+0

一个进程从地址0x400000开始,而不是0.那么,无论如何,ASLR(地址空间布局随机化)会把这个过程分散开来。主要是为了阻止你做你打算做的事情。你确实需要使用VirtualQueryEx()来找出东西的位置。 –

回答

4

MSDN on Win32 error codes引用:

ERROR_PARTIAL_COPY
299(0x12B)
一个ReadProcessMemory或WriteProcessMemory的请求的一部分,只有完成了。

我的猜测是你指定的地址包含一些有效的数据,但在该地址和(地址+副本长度)之间的某处,没有映射内存。

请参阅wikipedia on page tablevirtual memory以更多地了解操作系统如何建立地址空间。用这种说法,在那个内存范围的某个地方有一个无效的页表项。

其实,看着你的代码......很明显,这是行不通的。 BaseAddress参数为零。您试图在其他进程的地址空间中取消引用NULL指针。如果目标进程本身试图拉这个,它会崩溃。 :-) EXE的头文件没有映射到地址0.如果你想从EXE文件本身读取,我建议在GetModuleFileNameEx获得的路径上调用CreateFile