【 tulaoshi.com - 编程语言 】
                             
                              NT/2000方法:  
  #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("CPU 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
       &nb