https://github.com/gongluck/Windows-Core-Program.gitc++
//第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; }