码迷,mamicode.com
首页 > Windows程序 > 详细

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

时间:2018-08-18 17:40:37      阅读:207      评论:0      收藏:0      [点我收藏+]

标签:ecif   http   ESS   bre   pie   单元   cal   地址   线程   

Github

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

//第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;
}

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

标签:ecif   http   ESS   bre   pie   单元   cal   地址   线程   

原文地址:https://www.cnblogs.com/gongluck/p/9497620.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!