Windows下获取硬件信息的编程(CPU、硬盘、内存和启动时间等)

1. 计算CPU利用率

在Windows中计算CPU利用率的方法是使用SystemProcessorPerformanceInformation参数反复调用NtQuerySystemInformation函数,然后根据返回的IdleTime、KernelTime和UseTime值,分别使用后一次调用获得的值减去前一次调用获得的值,得到各个增量值,然后使用一个除法就可以得到CPU利用率。

这里唯一需要注意的是KernelTime成员值包含IdleTime和核心调用的使用时间。

当使用SystemBasicInformation 调用 NtQuerySystemInformation 来试图获取CPU个数时会失败,返回0xC0000004错误码,可以使用GetSystemInfo函数获得CPU的个数。

CPU利用率的计算公式如下:

100.0 * (IdleTime –PrevIdleTime) / (KernelTime + UserTime – PrevKernelTime – PrevUserTime)

注1:实际内核时间(ActualKernelTime)= KernelTime– IdleTime,内核时间-空闲时间。

注2:全部CPU时间(CpuTime)= UserTime +KernelTime,用户时间+内核时间。

int GetSystemCpuTimes(SystemCpuTimes*cputimes, int num)

{

   typedef DWORD (_stdcall *NTQSI_PROC) (int,PVOID, ULONG, PULONG);

    // dynamic linking is mandatory to use NtQuerySystemInformation

    HINSTANCE hNtDll =LoadLibrary("ntdll.dll");

    if (hNtDll == NULL) {

        fprintf(stderr, "LoadLibraryntdll.dll failed.\n");

        return -1;

    }

    // gets NtQuerySystemInformation address

    NTQSI_PROC NtQuerySystemInformation =(NTQSI_PROC)GetProcAddress(hNtDll, "NtQuerySystemInformation");

    if (NtQuerySystemInformation == NULL) {

        FreeLibrary(hNtDll);

        return -2;

    }

 

    // retrieves number of processors

    SYSTEM_INFO si;

    si.dwNumberOfProcessors = 0;

    GetSystemInfo(&si);

    if (si.dwNumberOfProcessors == 0)

        si.dwNumberOfProcessors = 1;

    // allocates an array ofSYSTEM_PROCESSOR_PERFORMANCE_INFORMATION structures, one per processor

    SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION*sppi

        = newSYSTEM_PROCESSOR_PERFORMANCE_INFORMATION[si.dwNumberOfProcessors];

    if (sppi == NULL) {

        FreeLibrary(hNtDll);

        return -3;

    }

    // Get CPU time informations

    if (NtQuerySystemInformation(SystemProcessorPerformanceInformation,

        sppi, si.dwNumberOfProcessors *

sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION), NULL) != 0) {

        FreeLibrary(hNtDll);

        delete []sppi;

        return -4;

    }

    // computes system global times summingeach processor value

    for (DWORD i = 0; i <si.dwNumberOfProcessors; i++) {

        if ((int)i >= num)

            break;

        // kernel time includes idle time onwindows

        // we return only busy kernel timesubtracting

        // idle time from kernel time

        cputimes[i].user = LO_T *sppi[i].UserTime.QuadPart;

        cputimes[i].kernel = LO_T *sppi[i].KernelTime.QuadPart;

        cputimes[i].idle = LO_T *sppi[i].IdleTime.QuadPart;

        cputimes[i].total = cputimes[i].user + cputimes[i].kernel;

        cputimes[i].kernel -= cputimes[i].idle;

    }

    FreeLibrary(hNtDll);

    delete []sppi;

 

    return 0;

}

获取CPU个数

在Windows中可以使用GetSystemInfo函数来获取本机的CPU个数。

int GetNumCpus()

{

    SYSTEM_INFO system_info;

    memset(&system_info, 0x0,sizeof(system_info));

    GetSystemInfo(&system_info);

    if (system_info.dwNumberOfProcessors == 0)

        return 1;

    else

        returnsystem_info.dwNumberOfProcessors;

}

2. 获取内存使用情况

         在Windows下使用GlobalMemoryStatusEx函数来获取物理内存、虚拟内存和内存页的大小,通过总内存和空闲内存可以计算出内存使用率。

int GetVirtualMem(MemoryInfo &mi)

{

   MEMORYSTATUSEX mem_info;

   mem_info.dwLength = sizeof(mem_info);

   if (!GlobalMemoryStatusEx(&mem_info)) {

       memset(&mi, 0x0, sizeof(mi));

       return -1;

    }

   mi.avail_page_file = mem_info.ullAvailPageFile;

   mi.avail_phys = mem_info.ullAvailPhys;

   mi.avail_virtual = mem_info.ullAvailVirtual;

   mi.total_page_file = mem_info.ullTotalPageFile;

   mi.total_phys = mem_info.ullTotalPhys;

   mi.total_virtual = mem_info.ullTotalVirtual;

   mi.usage = (int)(100.0 * (mi.total_phys - mi.avail_phys) /mi.total_phys);

 

   return 0;

}

3. 硬盘使用情况

         在Windows下可以使用GetDiskFreeSpaceEx函数来获取该路径下的硬盘使用情况,使用总硬盘大小和空闲硬盘大小可以计算硬盘使用率。

int GetDiskUsage(const char *path, DiskInfo&disk_info)

{

   if (path == NULL)

       path = "C:\\";

   ULARGE_INTEGER caller, total, free;

   if (GetDiskFreeSpaceEx(path, &caller, &total, &free) == 0) {

       memset(&disk_info, 0x0, sizeof(disk_info));

       return -1;

    }

    disk_info.free= free.QuadPart;

   disk_info.total = total.QuadPart;

   disk_info.usage = (int)(100.0 * (disk_info.total - disk_info.free) /disk_info.total);

 

   return 0;

}

4. 系统启动时间

         在Windows下可以使用GetTickCount64函数来获取系统的运行时间,它输出一个64位的毫秒值,通过除以1000可以获得系统的运行秒值。

double GetSystemBootTime()

{

   return GetTickCount64() / 1000.0f; // return seconds.

}

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
主版: 制造商 = SUPoX COMPUTER CO.,LTD 型 号 = H110MC-Q3 D4 序列号 = None 版 本 = BIOS: 当前语言 = zh|CN|unicode 制造商 = American Megatrends Inc. 发行日期 = 20170213000000.000000+000 版 本 = 5.12 SMBIOSMajorVersion = 3 SMBIOSMinorVersion = 0 CPU: CPU个数 = 1 处理器版本 = Intel64 Family 6 Model 94 Stepping 3 外 频 = 100 名称及主频率 = Intel(R) Celeron(R) CPU G3900 @ 2.80GHz 显示器: 类 型 = 通用即插即用监视器 其他信息 = DISPLAY\HKC0215\4&1E0FF502&0&UID200195 屏幕高 = 1080 屏幕宽 = 1920 硬 盘: 接口类型 = IDE 硬盘型号 = tigo SSD 60GB 分区数 = 3 容 量 = 60019868160 总扇区 = 117226305 分区信息: D e s c r i p t i o n D e v i c e I D F i l e S y s t e m F r e e S p a c e S i z e C : N T F S 7 9 5 7 7 7 0 2 4 0 5 3 7 2 3 7 8 7 2 6 4 D : N T F S 3 2 5 7 4 0 2 9 0 0 4 8 3 3 2 8 5 9 9 6 1 3 4 4 E : N T F S 2 0 6 8 9 0 9 0 5 6 0 0 3 3 2 8 5 9 9 6 1 3 4 4 F : N T F S 1 6 3 7 4 7 9 2 1 9 2 0 3 3 4 4 8 1 0 5 9 8 4 0 网 卡: 网卡类型 = Realtek PCIe FE Family Controller 网卡IP = {"不给你看"} 网卡MAC = 删减 打印机: 打印机名字 = 发送至 OneNote 2010 声 卡: 其他信息 = HDAUDIO\FUNC_01&VEN_10EC&DEV_0867&SUBSYS_1565824D&REV_1000\4&2262D0FE&0&0101 型 号 = Realtek High Definition Audio 内 存: 物理内存总量: 4,022 MB 4534 可用的物理内存: 1,658 MB 4534 虚拟内存: 最大值: 6,710 MB 4534 虚拟内存: 可用: 3,363 MB 4534 虚拟内存: 使用中: 3,347 MB 4534 显 卡: 显卡型号: Intel(R) HD Graphics 510 显存大小: 2138 MB 当前设置: 1920 x 1080 (32 bit) (60Hz) 额外的系统信息(略)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值