Windows获取物理内存的2种方式 - 随笔记录

本文详细介绍了通过ZwQuerySystemInformation API获取系统基本信息的方法,并对比了使用GlobalMemoryStatusEx获取物理内存大小的过程。展示了如何利用内核API进行系统资源查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  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 }

 

转载于:https://www.cnblogs.com/kindly/p/7427011.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值