[转载]Windows 2000中获取CPU使用率

来源:互联网 发布:java sychronized嵌套 编辑:程序博客网 时间:2024/04/30 05:09
// cpusagent.cpp (Windows NT/2000)
//
// Getting the CPU usage in percent on Windows NT/2000
//
// (c)2000 Ashot Oganesyan K, SmartLine, Inc
// mailto:ashot@aha.ru, [url]http://www.protect-me.com[/url], [url]http://www.codepile.com[/url]

#include <windows.h>
#include <conio.h>
#include <stdio.h>

#define SystemBasicInformation     0
#define SystemPerformanceInformation 2
#define SystemTimeInformation     3

#define Li2Double(x) ((double)((x).HighPart) * 4.294967296E9 + (double)((x).LowPart))

typedef struct
{
  DWORD   dwUnknown1;
  ULONG   uKeMaximumIncrement;
  ULONG   uPageSize;
  ULONG   uMmNumberOfPhysicalPages;
  ULONG   uMmLowestPhysicalPage;
  ULONG   uMmHighestPhysicalPage;
  ULONG   uAllocationGranularity;
  PVOID   pLowestUserAddress;
  PVOID   pMmHighestUserAddress;
  ULONG   uKeActiveProcessors;
  BYTE   bKeNumberProcessors;
  BYTE   bUnknown2;
  WORD   wUnknown3;
} SYSTEM_BASIC_INFORMATION;

typedef struct
{
  LARGE_INTEGER   liIdleTime;
  DWORD       dwSpare[76];
} SYSTEM_PERFORMANCE_INFORMATION;

typedef struct
{
  LARGE_INTEGER liKeBootTime;
  LARGE_INTEGER liKeSystemTime;
  LARGE_INTEGER liExpTimeZoneBias;
  ULONG       uCurrentTimeZoneId;
  DWORD       dwReserved;
} SYSTEM_TIME_INFORMATION;


// ntdll!NtQuerySystemInformation (NT specific!)
//
// The function copies the system information of the
// specified type into a buffer
//
// NTSYSAPI
// NTSTATUS
// NTAPI
// NtQuerySystemInformation(
//   IN UINT SystemInformationClass,   // information type
//   OUT PVOID SystemInformation,     // pointer to buffer
//   IN ULONG SystemInformationLength, // buffer size in bytes
//   OUT PULONG ReturnLength OPTIONAL   // pointer to a 32-bit
//                           // variable that receives
//                           // the number of bytes
//                           // written to the buffer
// );
typedef LONG (WINAPI *PROCNTQSI)(UINT,PVOID,ULONG,PULONG);

PROCNTQSI NtQuerySystemInformation;


void main(void)
{
  SYSTEM_PERFORMANCE_INFORMATION SysPerfInfo;
  SYSTEM_TIME_INFORMATION     SysTimeInfo;
  SYSTEM_BASIC_INFORMATION     SysBaseInfo;
  double                 dbIdleTime;
  double                 dbSystemTime;
  LONG                   status;
  LARGE_INTEGER             liOldIdleTime = {0,0};
  LARGE_INTEGER             liOldSystemTime = {0,0};

  NtQuerySystemInformation = (PROCNTQSI)GetProcAddress(
                            GetModuleHandle("ntdll"),
                          "NtQuerySystemInformation"
                          );

  if (!NtQuerySystemInformation)
    return;

  // get number of processors in the system
  status = NtQuerySystemInformation(SystemBasicInformation,&SysBaseInfo,sizeof(SysBaseInfo),NULL);
  if (status != NO_ERROR)
    return;
 
  printf("/nCPU Usage (press any key to exit):   ");
  while(!_kbhit())
  {
    // get new system time
    status = NtQuerySystemInformation(SystemTimeInformation,&SysTimeInfo,sizeof(SysTimeInfo),0);
    if (status!=NO_ERROR)
        return;

    // get new CPU's idle time
    status = NtQuerySystemInformation(SystemPerformanceInformation,&SysPerfInfo,sizeof(SysPerfInfo),NULL);
    if (status != NO_ERROR)
        return;

    // if it's a first call - skip it
    if (liOldIdleTime.QuadPart != 0)
    {
        // CurrentValue = NewValue - OldValue
        dbIdleTime = Li2Double(SysPerfInfo.liIdleTime) - Li2Double(liOldIdleTime);
        dbSystemTime = Li2Double(SysTimeInfo.liKeSystemTime) - Li2Double(liOldSystemTime);

        // CurrentCpuIdle = IdleTime / SystemTime
        dbIdleTime = dbIdleTime / dbSystemTime;

        // CurrentCpuUsage% = 100 - (CurrentCpuIdle * 100) / NumberOfProcessors
        dbIdleTime = 100.0 - dbIdleTime * 100.0 / (double)SysBaseInfo.bKeNumberProcessors + 0.5;

        printf("/b/b/b/b%3d%%",(UINT)dbIdleTime);
    }

    // store new CPU's idle and system time
    liOldIdleTime = SysPerfInfo.liIdleTime;
    liOldSystemTime = SysTimeInfo.liKeSystemTime;
     
    // wait one second
    Sleep(1000);
  }
  printf("/n");
}
原创粉丝点击