找回密码
注册 登录
查看: 1021|回复: 2

[PECMD开发] API获取物理内存大小(PECMD2012演示代码)

[复制链接]
  • TA的每日心情

    2017-11-24 01:58
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2021-11-27 02:55:54 | 显示全部楼层 |阅读模式
    1. //https://docs.microsoft.com/en-us/windows/win32/api/sysinfoapi/nf-sysinfoapi-getphysicallyinstalledsystemmemory
    2. ENVI$ &NL=0d 0a
    3. ENVI$# &&pTotalMemoryInKilobytes=*8 0
    4. //这个API只在Vista SP1及以后在系统支持
    5. //该GetPhysicallyInstalledSystemMemory功能从计算机的SMBIOS固件表中检索物理安装的RAM量。这可能与GlobalMemoryStatusEx函数报告的数量不同,后者将MEMORYSTATUSEX结构的ullTotalPhys成员设置为可供操作系统使用的物理内存量。操作系统可用的内存量可能小于计算机中物理安装的内存量,因为 BIOS 和某些驱动程序可能会将内存保留为内存映射设备的 I/O 区域,从而使操作系统无法使用这些内存和应用。GetPhysicallyInstalledSystemMemory函数检索的物理内存量必须等于或大于GlobalMemoryStatusEx函数报告的量;如果小于,则 SMBIOS 数据格式错误并且函数失败并显示ERROR_INVALID_DATA。格式错误的 SMBIOS 数据可能表明用户的计算机存在问题。
    6. CALL $--qd --bool --ret:&&GetPhysicallyInstalledSystemMemoryRet Kernel32.dll,GetPhysicallyInstalledSystemMemory,*&&pTotalMemoryInKilobytes
    7. ENVI?longlong &&pTotalMemoryInKilobytes=&&TotalMemoryInKilobytes
    8. MESS. %&&GetPhysicallyInstalledSystemMemoryRet%《%&TotalMemoryInKilobytes%》

    9. ENVI &&dwLength=64
    10. ENVI$# &&lpBuffer=*%&&dwLength% 0
    11. ENVI-long &&lpBuffer.dwLength=%&&dwLength%
    12. ENVI-copy &&lpBuffer=&&lpBuffer.dwLength;0;4;0
    13. CALL $--qd --bool --ret:&&GlobalMemoryStatusExRet Kernel32.dll,GlobalMemoryStatusEx,*&&lpBuffer
    14. ENVI?long &&lpBuffer=&&dwMemoryLoad:4
    15. ENVI?longlong &&lpBuffer=&&ullTotalPhys:(4 + 4)
    16. ENVI?longlong &&lpBuffer=&&ullAvailPhys:(4 + 4 + 8)
    17. ENVI?longlong &&lpBuffer=&&ullTotalPageFile:(4 + 4 + 8 + 8)
    18. ENVI?longlong &&lpBuffer=&&ullAvailPageFile:(4 + 4 + 8 + 8 + 8)
    19. ENVI?longlong &&lpBuffer=&&ullTotalVirtual:(4 + 4 + 8 + 8 + 8 + 8)
    20. ENVI?longlong &&lpBuffer=&&ullAvailVirtual:(4 + 4 + 8 + 8 + 8 + 8 + 8)
    21. MESS. %&&GlobalMemoryStatusExRet%
    22. \%&NL%%&dwMemoryLoad%
    23. \%&NL%%&ullTotalPhys%
    24. \%&NL%%&ullAvailPhys%
    25. \%&NL%%&ullTotalPageFile%
    26. \%&NL%%&ullAvailPageFile%
    27. \%&NL%%&ullTotalVirtual%
    28. \%&NL%%&ullAvailVirtual%


    29. EXIT FILE
    30. typedef struct _MEMORYSTATUSEX
    31.     {
    32.         DWORD dwLength;                                       // 结构的长度,在使用函数前必须初始化此值
    33.         DWORD dwMemoryLoad;                            // 物理内存的使用率(0~100的整数)
    34.         DWORDLONG ullTotalPhys;                       // 物理内存的总量,以字节为单位(以下均相同)
    35.         DWORDLONG ullAvailPhys;                       // 物理内存的剩余量
    36.         DWORDLONG ullTotalPageFile;                // 系统页面文件大小
    37.         DWORDLONG ullAvailPageFile;                // 系统可用页面文件大小
    38.         DWORDLONG ullTotalVirtual;                     // 虚拟内存的总量
    39.         DWORDLONG ullAvailVirtual;                     // 虚拟内存的剩余量
    40.         DWORDLONG ullAvailExtendedVirtual;    // 保留,值为0
    41.     } MEMORYSTATUSEX,*LPMEMORYSTATUSEX;
    42.    
    复制代码


    评分

    参与人数 1金钱 +2 贡献 +2 收起 理由
    aflyhawk + 2 + 2 很给力!

    查看全部评分





    上一篇:升级怎么扩大引导分区
    下一篇:自动打开sgi
  • TA的每日心情
    开心
    昨天 00:26
  • 签到天数: 2278 天

    [LV.Master]伴坛终老

    发表于 2021-11-27 08:20:26 | 显示全部楼层
    给专家点个赞!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2021-11-27 09:35:44 | 显示全部楼层
    感谢分享!
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则