2017-06-09 73 views
-3

使用ReadProcessMemory的正確方法是什麼?如何在不引發警告的情況下正確使用ReadProcessMemory

我目前使用的是這樣的:

DWORD read_mem(DWORD addr) 
{ 
    DWORD buffer = 0x0; 
    if (!ReadProcessMemory(phandle, LPCVOID(addr), &buffer, sizeof(DWORD), nullptr)) 
    { 
     return false; 
    } 

    return buffer; 
} 

這會導致由於addr被錯誤地鑄造警告。

warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] 

其它示例代碼,我已經看到了諸如this使用相同的方法。

那麼什麼是正確的方式來使用此功能,而不會收到警告?

+3

廣告地址將是一個指針。你爲什麼決定使用DWORD?你瞭解這個警告嗎?如果不是,爲什麼在理解警告之前詢問解決方案?你想了解,還是隻想讓別人爲你編寫程序? –

+0

@DavidHeffernan對不起,如果措辭不對,我不是英語母語人士。我在問哪種類型最適合在這裏使用。你可以用'INT_PTR'作爲地址,但這是正確的選擇嗎? –

+3

我會用一個指針來表示一個指針 –

回答

3

投給指針不同大小的整數」 - 這意味着DWORDvoid*是不同的字節大小,如果你正在編譯代碼爲64位,這隻能發生,因爲它們是相同的字節大小在32位編譯中。

從MSDN文檔,Windows Data Types

DWORD
32位無符號整數。範圍是0到4294967295十進制。

一個DWORD根本就沒有大到足以容納一個64位的內存地址(other code你提到將同樣僅在32位正常工作)。

變化Addr(及任何代碼使用的是確定的Addr值)來使用,而不是DWORD_PTR

DWORD_PTR
一個unsigned long類型指針精確。將指針轉換爲長類型以執行指針算術時使用。 (通常也被用於已被擴展到64位中的64位的Windows一般的32位參數。)

然後Addr將是正確的字節大小是否編譯爲32位或64位。

相關問題