Windows获取物理内存的2种方式 - 随笔记录
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Windows获取物理内存的2种方式 - 随笔记录相关的知识,希望对你有一定的参考价值。
1 typedef enum _SYSTEM_INFORMATION_CLASS { 2 SystemBasicInformation, 3 SystemProcessorInformation, // obsolete...delete 4 SystemPerformanceInformation, 5 SystemTimeOfDayInformation, 6 SystemPathInformation, 7 SystemProcessInformation, 8 SystemCallCountInformation, 9 SystemDeviceInformation, 10 SystemProcessorPerformanceInformation, 11 SystemFlagsInformation, 12 SystemCallTimeInformation, 13 SystemModuleInformation, 14 SystemLocksInformation, 15 SystemStackTraceInformation, 16 SystemPagedPoolInformation, 17 SystemNonPagedPoolInformation, 18 SystemHandleInformation, 19 SystemObjectInformation, 20 SystemPageFileInformation, 21 SystemVdmInstemulInformation, 22 SystemVdmBopInformation, 23 SystemFileCacheInformation, 24 SystemPoolTagInformation, 25 SystemInterruptInformation, 26 SystemDpcBehaviorInformation, 27 SystemFullMemoryInformation, 28 SystemLoadGdiDriverInformation, 29 SystemUnloadGdiDriverInformation, 30 SystemTimeAdjustmentInformation, 31 SystemSummaryMemoryInformation, 32 SystemMirrorMemoryInformation, 33 SystemPerformanceTraceInformation, 34 SystemObsolete0, 35 SystemExceptionInformation, 36 SystemCrashDumpStateInformation, 37 SystemKernelDebuggerInformation, 38 SystemContextSwitchInformation, 39 SystemRegistryQuotaInformation, 40 SystemExtendServiceTableInformation, 41 SystemPrioritySeperation, 42 SystemVerifierAddDriverInformation, 43 SystemVerifierRemoveDriverInformation, 44 SystemProcessorIdleInformation, 45 SystemLegacyDriverInformation, 46 SystemCurrentTimeZoneInformation, 47 SystemLookasideInformation, 48 SystemTimeSlipNotification, 49 SystemSessionCreate, 50 SystemSessionDetach, 51 SystemSessionInformation, 52 SystemRangeStartInformation, 53 SystemVerifierInformation, 54 SystemVerifierThunkExtend, 55 SystemSessionProcessInformation, 56 SystemLoadGdiDriverInSystemSpace, 57 SystemNumaProcessorMap, 58 SystemPrefetcherInformation, 59 SystemExtendedProcessInformation, 60 SystemRecommendedSharedDataAlignment, 61 SystemComPlusPackage, 62 SystemNumaAvailableMemory, 63 SystemProcessorPowerInformation, 64 SystemEmulationBasicInformation, 65 SystemEmulationProcessorInformation, 66 SystemExtendedHandleInformation, 67 SystemLostDelayedWriteInformation, 68 SystemBigPoolInformation, 69 SystemSessionPoolTagInformation, 70 SystemSessionMappedViewInformation, 71 SystemHotpatchInformation, 72 SystemObjectSecurityMode, 73 SystemWatchdogTimerHandler, 74 SystemWatchdogTimerInformation, 75 SystemLogicalProcessorInformation, 76 SystemWow64SharedInformation, 77 SystemRegisterFirmwareTableInformationHandler, 78 SystemFirmwareTableInformation, 79 SystemModuleInformationEx, 80 SystemVerifierTriageInformation, 81 SystemSuperfetchInformation, 82 SystemMemoryListInformation, 83 SystemFileCacheInformationEx, 84 MaxSystemInfoClass, // MaxSystemInfoClass should always be the last enum 85 86 SystemPageMemoryInformation = 123 87 } SYSTEM_INFORMATION_CLASS, *PSYSTEM_INFORMATION_CLASS; 88 89 typedef struct _SYSTEM_BASIC_INFORMATION 90 { 91 ULONG Unknown; //Always contains zero 92 ULONG MaximumIncrement; //一个时钟的计量单位 93 ULONG PhysicalPageSize; //一个内存页的大小 94 ULONG NumberOfPhysicalPages; //系统管理着多少个页 95 ULONG LowestPhysicalPage; //低端内存页 96 ULONG HighestPhysicalPage; //高端内存页 97 ULONG AllocationGranularity; 98 ULONG LowestUserAddress; //地端用户地址 99 ULONG HighestUserAddress; //高端用户地址 100 ULONG ActiveProcessors; //激活的处理器 101 UCHAR NumberProcessors; //有多少个处理器 102 }SYSTEM_BASIC_INFORMATION, *PSYSTEM_BASIC_INFORMATION; 103 104 NTSTATUS (__stdcall *ZwQuerySystemInformation)( 105 _In_ SYSTEM_INFORMATION_CLASS SystemInformationClass, 106 _Inout_ PVOID SystemInformation, 107 _In_ ULONG SystemInformationLength, 108 _Out_opt_ PULONG ReturnLength) = 0; 109 110 111 int _tmain(int argc, _TCHAR* argv[]) 112 { 113 //方式一 ZwQuerySystemInformation 114 HMODULE hNtdll = GetModuleHandle(_T("ntdll.dll")); 115 *(LPVOID *)&ZwQuerySystemInformation = GetProcAddress(hNtdll, "ZwQuerySystemInformation"); 116 117 SYSTEM_BASIC_INFORMATION sbi = { 0 }; 118 ZwQuerySystemInformation( 119 SystemBasicInformation, 120 &sbi, 121 sizeof(sbi), 122 NULL); 123 124 unsigned __int64 nsize = (unsigned __int64)sbi.NumberOfPhysicalPages * sbi.PhysicalPageSize; 125 126 127 //方式二 GlobalMemoryStatusEx 128 MEMORYSTATUSEX msex; 129 msex.dwLength = sizeof(msex); 130 GlobalMemoryStatusEx(&msex); 131 msex.ullTotalPhys;//物理内存大小 132 133 return 0; 134 }
以上是关于Windows获取物理内存的2种方式 - 随笔记录的主要内容,如果未能解决你的问题,请参考以下文章