1. 程式人生 > >Windows核心編程:第14章 探索虛擬內存

Windows核心編程:第14章 探索虛擬內存

nullptr .com cpp 32位 應用 lin mem 區域 沒有

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章 探索虛擬內存