2011-09-10 36 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