【问题标题】:How to properly use ReadProcessMemory without raising warnings如何正确使用 ReadProcessMemory 而不发出警告
【发布时间】:2017-11-11 21:57:33
【问题描述】:

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 使用相同的方法。

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

【问题讨论】:

  • 广告地址是一个指针。您为什么决定使用 DWORD?你明白这个警告吗?如果不是,为什么在理解警告之前询问解决方案?你是想了解,还是只是想让别人为你写程序。
  • @DavidHeffernan 抱歉,如果措辞有误,我不是以英语为母语的人。我在问哪种类型最适合在这里使用。例如,您可以使用INT_PTR 作为地址,但这是正确的选择吗?
  • 我会用一个指针来表示一个指针
  • 对于指针需要使用 PVOID 或者如果需要算术运算(添加、比较) - PBYTEULONG_PTR。您的警告是因为大小不同。有时,当需要将 DWORD d 转换为指针时,需要使用 2 类型强制转换以避免警告 - (PVOID)(ULONG_PTR)(d) 。在basetsd.h 中查找ULongToPtr 实现。但是需要非常注意符号扩展或零扩展 4 字节 DWORD 到 8 字节 PVOID - 这可能会产生非常严重的错误

标签: c++ windows winapi memory readprocessmemory


【解决方案1】:

从整数大小不同转换为指针” - 这意味着DWORDvoid* 是不同的字节大小,只有当你是将代码编译为 64 位,因为它们在 32 位编译中的字节大小相同。

来自 MSDN 文档,Windows Data Types

双字
32 位 无符号整数。范围是 0 到 4294967295(十进制)。

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-17
    相关资源
    最近更新 更多