如何在不引发警告的情况下正确使用ReadProcessMemory

时间:2017-06-09 19:20:36

标签: c++ windows winapi memory 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使用相同的方法。

那么在没有收到警告的情况下使用此功能的正确方法是什么?

1 个答案:

答案 0 :(得分:3)

转换为来自不同大小的的指针 ” - 这意味着DWORDvoid*是不同的字节大小,只能如果您正在编译64位代码,则会发生这种情况,因为它们在32位编译中的字节大小相同。

从MSDN文档Windows Data Types

  

DWORD
   32位无符号整数。范围是0到4294967295十进制。

DWORD根本不足以容纳64位内存地址(你提到的other code同样只能在32位中正常工作。)

更改Addr(以及您使用的任何代码来确定Addr的值)以改为使用DWORD_PTR

  

DWORD_PTR
  指针精度的无符号长整型。在将指针强制转换为long类型时使用以执行指针算术运算。 (也常用于在64位Windows中扩展到64位的一般32位参数。)

然后Addr将是正确的字节大小,无论您是编译为32位还是64位。