【问题标题】:Determining if the running executable has IMAGE_FILE_LARGE_ADDRESS_AWARE?确定正在运行的可执行文件是否具有 IMAGE_FILE_LARGE_ADDRESS_AWARE?
【发布时间】:2015-01-24 01:41:50
【问题描述】:

是否有某种 Windows API 或其他相当直接的方法来确定当前运行的程序是否启用了 IMAGE_FILE_LARGE_ADDRESS_AWARE?我知道我可以将进程的 exe 作为文件打开,读取它的头信息,然后在某个地方解析它,但如果有更简洁的方法,我想知道。

明确一点:我说的是当前正在执行的进程——即我想为自己的可执行文件编写检测此标志(或缺少标志)的代码,而不是针对某些完全不同的可执行文件。

【问题讨论】:

    标签: windows winapi memory exe portable-executable


    【解决方案1】:

    使用GlobalMemoryStatusEx 函数查询您的进程可用的虚拟内存量。

    如果 ullTotalVirtual 在 32 位进程中返回超过 2GB 的数据,您就知道设置了 LARGE_ADDRESS_AWARE 标志。

    【讨论】:

    • 谢谢,但如果我理解正确的话,这并不是我想要的(我的措辞可能很糟糕)。这告诉您有超过 2GB 的可用空间,而不是是否设置了标志。可以在不超过 2GB 可用的情况下设置标志。我真的想知道是否设置了标志,而不是是否有超过 2GB 的可用空间。
    • @BobVesterman 如果设置的标志超过 2GB 将可用,这就是标志的重点。请记住,这是虚拟地址空间,而不是物理内存。
    • 该标志的全部目的是增加进程可用的虚拟内存量。寻找实际标志本身没有意义,您应该寻找标志触发的效果 - 即更多可用的虚拟内存。只寻找标志本身有什么意义?
    • 查找实际标志的唯一方法是解析可执行文件的 PE 标头。没有用于查询标志值的 API。
    • 乔纳森,你确定吗?我相信该标志对某些操作系统没有影响(例如,如果我没记错的话是 XP),例如,如果 boot.ini 中未启用 3GB 开关。
    猜你喜欢
    • 2021-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    • 2014-09-16
    • 2016-12-20
    相关资源
    最近更新 更多