使用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使用相同的方法。
那么在没有收到警告的情况下使用此功能的正确方法是什么?
答案 0 :(得分:3)
“转换为来自不同大小的的指针 ” - 这意味着DWORD
和void*
是不同的字节大小,只能如果您正在编译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位。