前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Windows核心编程:第14章 探索虚拟内存

Windows核心编程:第14章 探索虚拟内存

作者头像
gongluck
发布2019-02-22 09:49:39
4340
发布2019-02-22 09:49:39
举报
文章被收录于专栏:C++C++

Github

https://github.com/gongluck/Windows-Core-Program.git

代码语言:javascript
复制
//第14章 探索虚拟内存.cpp: 定义应用程序的入口点。
//

#include "stdafx.h"
#include "第14章 探索虚拟内存.h"

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
    _In_opt_ HINSTANCE hPrevInstance,
    _In_ LPWSTR    lpCmdLine,
    _In_ int       nCmdShow)
{
    //系统信息
    SYSTEM_INFO sysinfo = { 0 };
    GetSystemInfo(&sysinfo);

    //获取逻辑处理器的详细信息
    PSYSTEM_LOGICAL_PROCESSOR_INFORMATION pBuffer = nullptr;
    DWORD dwSize = 0;
    BOOL bRet = GetLogicalProcessorInformation(pBuffer, &dwSize);
    DWORD lErr = GetLastError(); //ERROR_INSUFFICIENT_BUFFER;
    pBuffer = (PSYSTEM_LOGICAL_PROCESSOR_INFORMATION)malloc(dwSize);
    bRet = GetLogicalProcessorInformation(pBuffer, &dwSize);
    for (DWORD i = 0; i < dwSize / sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION); i++)
    {
        pBuffer[i].Relationship == RelationProcessorCore ? 
            "指定的逻辑处理器共享一个处理器核心。ProcessorCore成员包含额外的信息。" : "";
        pBuffer[i].ProcessorCore.Flags == 1 ?
            "如果这个成员的值是1,那么由ProcessorMask成员的值来识别的逻辑处理器,就像在超线程或SMT中一样。否则,被识别的逻辑处理器不共享功能单元。" : "";
        pBuffer[i].Relationship == RelationCache ? 
            "The specified logical processors share a cache. The Cache member contains additional information. " : "";
    }
    free(pBuffer);
    pBuffer = nullptr;

    //Windows 32-bit On Windows 64-bit (WOW64)
    BOOL iswow = FALSE;
    bRet = IsWow64Process(GetCurrentProcess(), &iswow);//只有32位程序运行在WOW64上时iswow才被置为TRUE。
    
    //获取原来的系统信息(取代GetSystemInfo)
    GetNativeSystemInfo(&sysinfo);

    //虚拟内存状态
    MEMORYSTATUSEX memstatusex = { 0 };//ex增强在支持4GB内存大小长度
    memstatusex.dwLength = sizeof(memstatusex);
    bRet = GlobalMemoryStatusEx(&memstatusex);
    memstatusex.ullTotalPhys;//物理内存总量
    memstatusex.ullAvailPhys;//可分配的内存总量
    memstatusex.ullTotalVirtual;//进程私有空间大小
    memstatusex.ullAvailVirtual;//进程闲置空间大小

    //确定地址空间的状态
    MEMORY_BASIC_INFORMATION info = { 0 };
    lErr = VirtualQueryEx(GetCurrentProcess(), (LPCVOID)0x55, &info, sizeof(info));
    switch (info.State)//State 用于指明所有相邻页面的状态。
    {
    case MEM_FREE://空闲状态。该区域的虚拟地址不受任何内存的支持。该地址空间没有被保留。该状态下AllocationBase、AllocationProtect、Protect和Type等成员均未定义。
        break;
    case MEM_RESERVE://指明页面被保留,但是没有分配任何物理内存。该状态下Protect成员未定。
        break;
    case MEM_COMMIT://指明已分配物理内存或者系统页文件。
        break;
    default:
        break;
    }

    system("pause");
    return 0;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-08-18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Github
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档