windows核心编程 第14章,虚拟内存:获取系统信息

news2024/11/16 1:17:30

windows核心编程 第14章,虚拟内存:获取系统信息

14,获取系统消息

文章目录

  • windows核心编程 第14章,虚拟内存:获取系统信息
  • 14.1 系统信息


14.1 系统信息

许多操作系统的值是根据主机而定的,比如页面的大小,分配粒度的大小等。这些值决不应该用硬编码的形式放入你的源代码。相反,你始终都应该在进程初始化的时候检索这些值并在你的源代码中使用检索到的值。GetSystemInfo函数将用于检索与主机相关的值:

VOID  GetSystemInfo(LPSYSTEM_INFO psinf):

必须传递SYSTEM_INFO结构的地址给这个函数。这个函数将初始化所有的结构成员然后返回。下面是SYSTEM INFO数据结构的样子

typedef struct _SYSTEM_INFO {
    union {
        DWORD dwOemId;          // Obsolete field...do not use
        struct {
            WORD wProcessorArchitecture;
            WORD wReserved;
        } DUMMYSTRUCTNAME;
    } DUMMYUNIONNAME;
    DWORD dwPageSize;
    LPVOID lpMinimumApplicationAddress;
    LPVOID lpMaximumApplicationAddress;
    DWORD_PTR dwActiveProcessorMask;
    DWORD dwNumberOfProcessors;
    DWORD dwProcessorType;
    DWORD dwAllocationGranularity;
    WORD wProcessorLevel;
    WORD wProcessorRevision;
} SYSTEM_INFO, * LPSYSTEM_INFO;

当系统引导时,它要确定这些成员的值是什么。对于任何既定的系统来说,这些值总是相同的,因此决不需要为任何既定的进程多次调用该函数。由于有了GetSystemInfo函数,因此应用程序能够在运行的时候查询这些值。在该结构的所有成员中,只有4个成员与内存有关。表14-1对这4个成员作了描述。

/******************************************************************************
14_SysInfo.cpp 
显示SYSTEM_INFO结构体信息
******************************************************************************/


#include "CmnHdr.h"     /* See Appendix A. */
#include <windowsx.h>
#include <tchar.h>
#include <stdio.h>
#include "Resource.h"
#include <StrSafe.h>



///
//将数据转换为字符,并用逗号分开
PTSTR BigNumToString(LONG lNum, PTSTR szBuf, DWORD chBufSize);
void ShowCPUInfo(HWND hWnd, WORD wProcessorArchitecture, WORD wProcessorLevel,
    WORD wProcessorRevision);//显示CPU信息
void ShowBitness(HWND hWnd);//显示对话框标题
BOOL Dlg_OnInitDialog(HWND hWnd, HWND hWndFocus, LPARAM lParam);
void Dlg_OnCommand(HWND hWnd, int id, HWND hWndCtl, UINT codeNotify);
INT_PTR WINAPI Dlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
///

int WINAPI _tWinMain(HINSTANCE hInstExe, HINSTANCE, PTSTR, int) {

    DialogBox(hInstExe, MAKEINTRESOURCE(IDD_SYSINFO), NULL, Dlg_Proc);
    return(0);
}

INT_PTR WINAPI Dlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) {

    switch (uMsg) {
        chHANDLE_DLGMSG(hDlg, WM_INITDIALOG, Dlg_OnInitDialog);
        chHANDLE_DLGMSG(hDlg, WM_COMMAND, Dlg_OnCommand);
    }
    return(FALSE);
}

BOOL Dlg_OnInitDialog(HWND hWnd, HWND hWndFocus, LPARAM lParam) {

    chSETDLGICONS(hWnd, IDI_SYSINFO);

    //获取系统信息
    SYSTEM_INFO sinf;
    GetSystemInfo(&sinf);

    //显示CPU信息
    ShowCPUInfo(hWnd, sinf.wProcessorArchitecture,
        sinf.wProcessorLevel, sinf.wProcessorRevision);

    //显示页面大小
    TCHAR szBuf[50];
    SetDlgItemText(hWnd, IDC_PAGESIZE,
        BigNumToString(sinf.dwPageSize, szBuf, _countof(szBuf)));

    //显示进程可用的最小地址
    StringCchPrintf(szBuf, _countof(szBuf), TEXT("%p"),
        sinf.lpMinimumApplicationAddress);
    SetDlgItemText(hWnd, IDC_MINAPPADDR, szBuf);

    //显示进程可用的最大地址
    StringCchPrintf(szBuf, _countof(szBuf), TEXT("%p"),
        sinf.lpMaximumApplicationAddress);
    SetDlgItemText(hWnd, IDC_MAXAPPADDR, szBuf);

    //显示CPU掩码
    StringCchPrintf(szBuf, _countof(szBuf), TEXT("0x%016I64X"),
        (__int64)sinf.dwActiveProcessorMask);
    SetDlgItemText(hWnd, IDC_ACTIVEPROCMASK, szBuf);

    //显示CPU核数
    SetDlgItemText(hWnd, IDC_NUMOFPROCS,
        BigNumToString(sinf.dwNumberOfProcessors, szBuf, _countof(szBuf)));

    //分配颗粒度
    SetDlgItemText(hWnd, IDC_ALLOCGRAN,
        BigNumToString(sinf.dwAllocationGranularity, szBuf, _countof(szBuf)));

    //显示对话框标题
    ShowBitness(hWnd);

    return(TRUE);
}

void Dlg_OnCommand(HWND hWnd, int id, HWND hWndCtl, UINT codeNotify) {

    switch (id) {
    case IDCANCEL:
        EndDialog(hWnd, id);
        break;
    }
}


//将数据转换为字符,并用逗号分开
PTSTR BigNumToString(LONG lNum, PTSTR szBuf, DWORD chBufSize) {

   TCHAR szNum[100];
   StringCchPrintf(szNum, _countof(szNum), TEXT("%d"), lNum);
   NUMBERFMT nf;
   nf.NumDigits = 0;//系数为数
   nf.LeadingZero = FALSE;//是否添加前导0
   nf.Grouping = 3;//每3位一组
   nf.lpDecimalSep = (LPWSTR)TEXT(".");//指向以null结尾的小数分隔符字符串的指针
   nf.lpThousandSep = (LPWSTR)TEXT(",");//指向以null结尾的千位分隔符字符串的指针
   nf.NegativeOrder = 0;//负数模式
   //将数字字符串格式化位标识符指定的语言环境定制的数字字符串
   GetNumberFormat(LOCALE_USER_DEFAULT, 0, szNum, &nf, szBuf, chBufSize);
   return(szBuf);
}


///


void ShowCPUInfo(HWND hWnd, WORD wProcessorArchitecture, WORD wProcessorLevel, 
   WORD wProcessorRevision) {

   TCHAR szCPUArch[64]  = TEXT("(未知)");
   TCHAR szCPULevel[64] = TEXT("(未知)");
   TCHAR szCPURev[64]   = TEXT("(未知)");

   switch (wProcessorArchitecture) {
      // Notice that AMD processors are seen as PROCESSOR_ARCHITECTURE_INTEL.
      // In the Registry, the content of the "VendorIdentifier" key under 
      // HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0
      // is either "GenuineIntel" or "AuthenticAMD"
      // 
      case PROCESSOR_ARCHITECTURE_INTEL: //x86
         _tcscpy_s(szCPUArch, _countof(szCPUArch), TEXT("Intel")); 
         switch (wProcessorLevel) {
         case 3: case 4: //80386,80486
            StringCchPrintf(szCPULevel, _countof(szCPULevel), TEXT("80%c86"), wProcessorLevel + '0');
            StringCchPrintf(szCPURev, _countof(szCPURev), TEXT("%c%d"), 
               HIBYTE(wProcessorRevision) + TEXT('A'), 
               LOBYTE(wProcessorRevision));
            break;

         case 5:
            _tcscpy_s(szCPULevel, _countof(szCPULevel), TEXT("Pentium"));
            StringCchPrintf(szCPURev, _countof(szCPURev), TEXT("Model %d, Stepping %d"),
               HIBYTE(wProcessorRevision), LOBYTE(wProcessorRevision));
            break;

         case 6:
            switch (HIBYTE(wProcessorRevision)) { // Model
               case 1: 
                  _tcscpy_s(szCPULevel, _countof(szCPULevel), 
                     TEXT("Pentium Pro"));
                  break; 
                  
               case 3:
               case 5: 
                  _tcscpy_s(szCPULevel, _countof(szCPULevel), 
                     TEXT("Pentium II"));
                  break; 
               
               case 6: 
                  _tcscpy_s(szCPULevel, _countof(szCPULevel), 
                     TEXT("Celeron"));
                  break; 
               
               case 7:
               case 8:
               case 11: 
                  _tcscpy_s(szCPULevel, _countof(szCPULevel), 
                     TEXT("Pentium III"));
                  break; 

               case 9:
               case 13:
                  _tcscpy_s(szCPULevel, _countof(szCPULevel), 
                     TEXT("Pentium M"));
                  break; 
               
               case 10:
                  _tcscpy_s(szCPULevel, _countof(szCPULevel), 
                     TEXT("Pentium Xeon"));
                  break; 

               case 15:
                  _tcscpy_s(szCPULevel, _countof(szCPULevel), 
                     TEXT("Core 2 Duo"));
                  break; 

               default:
                  _tcscpy_s(szCPULevel, _countof(szCPULevel), 
                     TEXT("Unknown Pentium"));
                  break;
            } 
            StringCchPrintf(szCPURev, _countof(szCPURev), TEXT("Model %d, Stepping %d"),
               HIBYTE(wProcessorRevision), LOBYTE(wProcessorRevision));
            break;

         case 15: 
            _tcscpy_s(szCPULevel, _countof(szCPULevel), TEXT("Pentium 4"));
            StringCchPrintf(szCPURev, _countof(szCPURev), TEXT("Model %d, Stepping %d"),
               HIBYTE(wProcessorRevision), LOBYTE(wProcessorRevision));
            break; 
         }
         break;

      case PROCESSOR_ARCHITECTURE_IA64:
         _tcscpy_s(szCPUArch, _countof(szCPUArch), TEXT("IA-64"));
         StringCchPrintf(szCPULevel, _countof(szCPULevel), TEXT("%d"), wProcessorLevel);
         StringCchPrintf(szCPURev, _countof(szCPURev), TEXT("Model %c, Pass %d"), 
            HIBYTE(wProcessorRevision) + TEXT('A'), 
            LOBYTE(wProcessorRevision));
         break;

      case PROCESSOR_ARCHITECTURE_AMD64:
         _tcscpy_s(szCPUArch, _countof(szCPUArch), TEXT("AMD64"));
         StringCchPrintf(szCPULevel, _countof(szCPULevel), TEXT("%d"), wProcessorLevel);
         StringCchPrintf(szCPURev, _countof(szCPURev), TEXT("Model %c, Pass %d"), 
            HIBYTE(wProcessorRevision) + TEXT('A'), 
            LOBYTE(wProcessorRevision));
         break;


      case PROCESSOR_ARCHITECTURE_UNKNOWN:
      default:
         _tcscpy_s(szCPUArch, _countof(szCPUArch), TEXT("Unknown"));
         break;
   }
   SetDlgItemText(hWnd, IDC_PROCARCH,  szCPUArch);
   SetDlgItemText(hWnd, IDC_PROCLEVEL, szCPULevel);
   SetDlgItemText(hWnd, IDC_PROCREV,   szCPURev);
}


void ShowBitness(HWND hWnd) {
   TCHAR szFullTitle[100];
   TCHAR szTitle[32];
   GetWindowText(hWnd, szTitle, _countof(szTitle));

#if defined(_WIN64)
  //64位的应用程序只能运行在64位操作系统,这里不需要检查
   StringCchPrintf(szFullTitle, _countof(szFullTitle), 
      TEXT("64-bit %s"), szTitle);
#else
	BOOL bIsWow64 = FALSE;
    //去顶指定的进程是在WOW64还是X64处理器的Intel64下运行
   if (!IsWow64Process(GetCurrentProcess(), &bIsWow64)) {
      chFAIL((PSTR)TEXT("Failed to get WOW64 state."));
      return;
   }
   
   if (bIsWow64) {
      StringCchPrintf(szFullTitle, _countof(szFullTitle), 
         TEXT("32-bit %s on WOW64"), szTitle);
   } else {
      StringCchPrintf(szFullTitle, _countof(szFullTitle), 
         TEXT("32-bit %s on 32-bit Windows"), szTitle);
   }
#endif

   SetWindowText(hWnd, szFullTitle);
}


在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2047851.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

无人机挂载垂直抛投灭火弹技术详解

随着城市化进程的加快&#xff0c;高层建筑、森林、化工园区等区域火灾防控难度日益增大。传统消防手段在面对复杂地形或高层火灾时&#xff0c;往往存在响应速度慢、作业难度大、人员安全风险高等问题。无人机挂载垂直抛投灭火弹技术的出现&#xff0c;为高效、安全、精准的火…

conda install vs pip install

1背景 最近使用pyinstaller打包python程序&#xff0c;启动程序的时候&#xff0c;发现了以下的报错信息 Failed to execute script "pyi_rth_pkgres" due to unhandled dll load failed while importing pyexpat后面查阅了相关文档&#xff0c;比如根据stackoverf…

Vue3+Ts封装下拉懒加载自定义指令

文件夹目录如下: 使用方式: <template><divclass="time-line"v-infinite-scroll="{loadMore: loadMoreItems,threshold: 100 // 当滚动到距离底部 100 像素时触发加载}"> </div> </template><script lang="ts" se…

7次多项式对若干个点进行拟合,并生成图像|MATLAB实现

文章目录 拟合运行结果完整代码拟合 MATLAB对数据进行拟合的意义是通过数学模型和统计方法对实际数据进行分析和预测。拟合可以帮助我们理解数据背后的规律和趋势,从而做出科学决策。 拟合的意义 揭示数据的规律 预测未来趋势 数据修正和异常检测 数据分析和模型验证 总之,…

Prometheus+Grafana保姆笔记(2)——监控Spring Boot微服务程序

Prometheus Grafana 的组合在微服务项目中可以完成许多DevOps任务&#xff0c;它们共同提供了强大的监控和可视化功能。 我们陆续介绍Prometheus Grafana 的相关用法。 上一期&#xff0c;我们介绍了PrometheusGrafana的安装&#xff0c; PrometheusGrafana保姆笔记&#…

javaFx桌面程序开发代码示例

程序效果&#xff1a; 弹窗内容&#xff1a; 1.启动类 HelloJavaFX&#xff1a; import javafx.application.Application; import javafx.application.Platform; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.scene…

赵本山:你把这玩意借我带上,黄晓娟:驴蒙脸你要带这个?--小品《麻将豆腐》(中3)的台词与解说

赵本山&#xff1a;你把这玩意借我带上&#xff0c;黄晓娟&#xff1a;驴蒙脸你要带这个&#xff1f; --小品《麻将豆腐》&#xff08;中3&#xff09;的台词与解说 &#xff08;接上&#xff09; 黄晓娟&#xff08;饰演小姨子&#xff09;&#xff1a;忘了麻将 赵本山&…

车载客流计数器在公交系统中的应用

车载客流计数器在公交系统中的应用&#xff0c;已成为提升运营效率与服务质量的关键工具。随着大数据概念的深入人心&#xff0c;人们愈发认识到数据在决策中的核心地位。公交车客流统计的引入&#xff0c;正是基于这一认识&#xff0c;旨在为公交车辆的运营组织提供详实、精准…

MySQL:表的设计原则和聚合函数

所属专栏&#xff1a;MySQL学习 &#x1f48e;1. 表的设计原则 1. 从需求中找到类&#xff0c;类对应到数据库中的实体&#xff0c;实体在数据库中表现为一张一张的表&#xff0c;类中的属性对应着表中的字段 2. 确定类与类的对应关系 3. 使用SQL去创建具体的表 范式&#xff1…

【Linux多线程】线程同步 与 生产者消费者模型(无锁化模型)

文章目录 1. Linux线程同步1.1 条件变量1.2 同步概念与竞态条件1.3 条件变量函数示例代码1:示例代码2 1.4 为什么 pthread_ cond_ wait 需要互斥量1.5 条件变量使用规范 2. 生产者消费者模型3. 读者 写者 问题3.1 读写锁3.2 读写锁的相关接口 4. 扩展&#xff1a;无锁化模型4.1…

Python 如何创建和解析 XML 文件

XML&#xff08;可扩展标记语言&#xff09;是一种广泛使用的标记语言&#xff0c;主要用于存储和传输数据。它具有结构化、层次化的特点&#xff0c;常被用作数据交换格式。Python 提供了多种工具和库来处理 XML 文件&#xff0c;包括创建、解析和操作 XML 文档。 一、XML 简…

免费webp转jpeg或gif工具

1、”“添加webp文件&#xff1b;”-“移除webp文件&#xff1b;”>>“开始转换&#xff1b;”X“清空内容。 也可以把想要转换的文件全选&#xff0c;拖进窗口里。 2、默认将webp文件转换成同名的png文件放在原来的文件夹里。如果不是静态图片&#xff0c;则自动尝试转…

案例:ZooKeeper + Kafka消息队列集群部署

目录 消息队列 概念 使用场景 不适宜 适宜 消息队列的特征 存储 异步 异步的优点 同步 为什么需要消息队列 解耦 作用 冗余 扩展性 灵活性 峰值处理能力 可恢复性 顺序保证 Kafka 概念 Kafka技术名词 &#xff08;1&#xff09;Broker &#xff08;2&a…

基于Orangepi全志H616智能视觉垃圾分类系统

目录 一、功能需求 二、Python的安装和环境搭建 三、Python基础 3.1 Python的特点&#xff1a; 3.2 Python的基础学习&#xff1a; 3.3 字典的多层嵌套&#xff1a; 四、C语言调用Python 4.1 搭建编译环境&#xff1a; 4.2 C语言执行Python语句&#xff1a; 4.3 C语言…

22 注意力机制—Transformer

目录 TransformerTransformer 架构对比 seq2seq多头注意力(Multi-head attention)带掩码的多头注意力(Masked Multi-head attention)基于位置的前馈网络(Positionwise FFN)残差连接和归一化(Add & norm)(加 & 规范化)1、加入归一化能够更好地训练比较深的网络…

UE基础 —— 项目与模板

虚幻引擎 项目 包含游戏和应用程序的所有内容&#xff0c;并将所有内容联系在一起&#xff1b;包含磁盘上的许多文件夹和资产&#xff0c;如蓝图、材质、3D资产、动画等&#xff1b;内容浏览器与磁盘上的文件夹和文件夹结构相同&#xff1b; 每个项目都有与之关联的.uproject文…

性能优化理论篇 | 彻底弄懂系统平均负载

Linux 上的进程状态 要讨论系统平均负载&#xff0c;首先要了解Linux 上的进程状态。 标志名称内核名称及解释R运行中或可运行TASK_RUNNING。进程正在执行或等待执行。可以在用户空间&#xff08;用户代码&#xff09;或内核空间&#xff08;内核代码&#xff09;中运行。S可…

【项目】基于Vue3.2+ElementUI Plus+Vite 通用后台管理系统

构建项目 环境配置 全局安装vue脚手架 npm install -g vue/cli-init打开脚手架图形化界面 vue ui创建项目 在图形化界面创建项目根据要求填写项目相关信息选择手动配置勾选配置项目选择配置项目然后我们就搭建完成啦&#x1f973;&#xff0c;构建可能需要一点时间&#xff0…

Navicat Premium Lite For Linux,一款免费的专业可视化 SQL 数据库设计工具,支持各种数据库并行连接,在业界可是大名鼎鼎!

Navicat Premium Lite For Linux&#xff0c;一款免费的专业可视化 SQL 数据库设计工具&#xff0c;支持各种数据库并行连接&#xff0c;在业界可是大名鼎鼎&#xff01; Navicat 是一个可视化数据库、数据表设计软件&#xff0c;支持MySQL、MariaDB、SQLite、MongoDB、Redshi…

论文阅读笔记:ST-MetaNet-1

目录 前言 摘要 CCS 关键词 介绍 时空相关性的复杂组合 空间相关性 时间相关性 时空相关性的多样性 本篇博客结语 前言 读这篇论文边读边学&#xff0c;每天坚持发博客&#xff0c;看到哪学到哪&#xff0c;这系列文章既有翻译&#xff0c;又有深度详细解释&#xff…