发新话题
打印

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

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

信息来源:邪恶八进制 中国
文章作者:ashot@aha.ru
复制内容到剪贴板
代码:
// 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&#39;s idle time
      status = NtQuerySystemInformation(SystemPerformanceInformation,&SysPerfInfo,sizeof(SysPerfInfo),NULL);
      if (status != NO_ERROR)
        return;

      // if it&#39;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&#39;s idle and system time
      liOldIdleTime = SysPerfInfo.liIdleTime;
      liOldSystemTime = SysTimeInfo.liKeSystemTime;
        
      // wait one second
      Sleep(1000);
   }
   printf("\n");
}
请加47809945   100%通过!每个月总有那么几天,您的网络会受到黑客的攻击--坐立不安,烦躁无力,使用虎虎开发的"月月舒"防火墙,超轻超薄,易于携带,提供由内到外的全方位保护,即使流量再大,也可以冲浪自如,再也不用担心侧漏啦。

TOP

发新话题