2014-11-05 80 views
2

TL調用VirtualQueryEx功能; DR:如果我請VirtualQueryEx上的32位的過程從一個64位的過程中,應使用MEMORY_BASIC_INFORMATIONMEMORY_BASIC_INFORMATION32從64位進程上的32位的一個

嗨!

我有一個64位應用程序讀取其他進程的內存(OpenProcess,VirtualQueryEx,然後ReadProcessMemory)。我想知道如果我應該做一個特殊的檢查,看看其他進程是否是32位的。

我的代碼是這樣的:

MEMORY_BASIC_INFORMATION info; 

SIZE_T r = VirtualQueryEx((HANDLE) handle, 
(void *) 0x0, 
&info, 
sizeof(info)); 

的事情是,the documentation of MEMORY_BASIC_INFORMATION這樣說:

要啓用一個調試器來調試是在不同的 架構上運行的目標(32比特與64比特),使用這種結構的明確形式之一 。

這兩個進程在同一臺計算機上運行(相同的架構?),但一個是32位進程,另一個是64位的進程。

我在64位的Windows 8測試這個程序和它的作品對我的測試案例(搜索在32位進程內存的特定字符串),但我不希望它以後適得其反。

備註:我知道this answer,這就是爲什麼我首先提出這個問題。我使用32位二進制文​​件進行了測試,結果無誤。

+0

不,他們談論的調試功能[這一個](http://msdn.microsoft.com/en-us/library/windows/硬件/ ff553502%28V = vs.85%29.aspx)。您無法在32位程序中可靠地使用VirtualQueryEx()進行64位進程。 – 2014-11-05 22:30:40

+0

那麼'VirtualQueryEx'不被視爲調試器?該文檔看起來不明確:( – Marco 2014-11-06 02:07:46

回答

2

所以,一切的一切我只是一個菜鳥,它用一個簡單的測試解決:

VirtualQueryEx失敗,錯誤(ERROR_BAD_LENGTH),如果我嘗試使用MEMORY_BASIC_INFORMATION32,而不是MEMORY_BASIC_INFORMATION

答案是,總是使用MEMORY_BASIC_INFORMATION

這是我如何打電話VirtualQueryEx

MEMORY_BASIC_INFORMATION32 info32; 
SIZE_T r32 = VirtualQueryEx(hndl, 
          (void *) 0x0, 
          (PMEMORY_BASIC_INFORMATION) &info32, 
          sizeof(info32)); 
+0

這不可能是正確的,因爲當你使用32位指針時,你如何在64位進程中定位內存?你鏈接的答案是正確的(並告訴你不要這樣做)。(我的答案錯了 - 。刪除) – usr 2014-11-05 23:23:35

+0

請記住,這個問題問如果目標是32位是否有問題(來源進程爲64位),所以沒有問題,指針大小 – Marco 2014-11-06 02:04:19

+0

權在另一個方向上它會成爲一個問題。 – usr 2014-11-06 11:45:29