//CpuInfo.cpp
#include "stdafx.h"
#include <windows.h>
#include "CpuInfo.h"
#include <strsafe.h>
#include"tlhelp32.h"
//#define USE_DEPRECATED_FUNCS
BOOL SetPrivilege(HANDLE hProcess, LPCTSTR lpszPrivilege, BOOL bEnablePrivilege);
double FileTimeToDouble(FILETIME &filetime);
DWORD CheckModule( char* ProcessName);
bool GetSysUsage(char * ProcessName,int &SysUseage,int &ProcessUseage)
{
int nCPUUseRate = -1;
int nProcessUseRate = -1;
double fOldCPUIdleTime;
double fOldCPUKernelTime;
double fOldCPUUserTime;
double fOldProcCreationTime;
double fOldProcExitTime;
double fOldProcKernelTime;
double fOldProcUserTime;
double fCPUIdleTime;
double fCPUKernelTime;
double fCPUUserTime;
double fProcCreationTime;
double fProcExitTime;
double fProcKernelTime;
double fProcUserTime;
FILETIME ftIdle, ftKernel, ftUser;
FILETIME ftProcCreation, ftProcExit, ftProcKernel, ftProcUser;
DWORD ProcessId = CheckModule(ProcessName);
HANDLE hCurrentProcess = GetCurrentProcess();
if(!SetPrivilege(hCurrentProcess, SE_DEBUG_NAME, TRUE))
{
return false;
}
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION , TRUE, ProcessId);
if (GetSystemTimes(&ftIdle, &ftKernel, &ftUser))
{
fOldCPUIdleTime = FileTimeToDouble(ftIdle);
fOldCPUKernelTime = FileTimeToDouble(ftKernel);
fOldCPUUserTime = FileTimeToDouble(ftUser);
}
else
{
return false;
}
if(GetProcessTimes(hProcess, &ftProcCreation, &ftProcExit, &ftProcKernel, &ftProcUser))
{
fOldProcCreationTime = FileTimeToDouble(ftProcCreation);
fOldProcExitTime= FileTimeToDouble(ftProcExit);
fOldProcKernelTime= FileTimeToDouble(ftProcKernel);
fOldProcUserTime= FileTimeToDouble(ftProcUser);
}
else
{
return false;
}
Sleep(1000);
if (GetSystemTimes(&ftIdle, &ftKernel, &ftUser))
{
fCPUIdleTime = FileTimeToDouble(ftIdle);
fCPUKernelTime = FileTimeToDouble(ftKernel);
fCPUUserTime = FileTimeToDouble(ftUser);
nCPUUseRate= (int)(100.0 - (fCPUIdleTime - fOldCPUIdleTime)
/ (fCPUKernelTime - fOldCPUKernelTime + fCPUUserTime - fOldCPUUserTime)
*100.0);
SysUseage = nCPUUseRate;
}
else
{
return false;
}
if(GetProcessTimes(hProcess, &ftProcCreation, &ftProcExit, &ftProcKernel, &ftProcUser))
{
fProcCreationTime = FileTimeToDouble(ftProcCreation);
fProcExitTime= FileTimeToDouble(ftProcExit);
fProcKernelTime= FileTimeToDouble(ftProcKernel);
fProcUserTime= FileTimeToDouble(ftProcUser);
nProcessUseRate= (int)((fProcUserTime - fOldProcUserTime+fProcKernelTime - fOldProcKernelTime)
/(fCPUKernelTime - fOldCPUKernelTime + fCPUUserTime - fOldCPUUserTime)*100.0);
ProcessUseage = nProcessUseRate;
}
else
{
return false;
}
}
DWORD CheckModule( char* ProcessName)
{
HANDLE hSnapshot;
PROCESSENTRY32 lppe;
BOOL Find;
BOOL Found;
hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);//创建进程快照
lppe.dwSize=sizeof(PROCESSENTRY32);
Found=Process32First(hSnapshot,&lppe);//得到第一个进程
while(Found)//进程不是空
{
if(strcmpi(ProcessName,lppe.szExeFile)==0)//进程名比较
return lppe.th32ProcessID;//一样即反回进程ID
Found = Process32Next(hSnapshot,&lppe);//得到下一个进程
}
CloseHandle(hSnapshot);
return NULL;
}
double FileTimeToDouble(FILETIME &filetime)
{
return (double)(filetime.dwHighDateTime * 4.294967296E9) + (double)filetime.dwLowDateTime;
}
BOOL SetPrivilege(HANDLE hProcess, LPCTSTR lpszPrivilege, BOOL bEnablePrivilege)
{
HANDLE hToken;
if(!OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES, &hToken))
{
return FALSE;
}
LUID luid;
if(!LookupPrivilegeValue(NULL, lpszPrivilege, &luid))
{
return FALSE;
}
TOKEN_PRIVILEGES tkp;
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Luid = luid;
tkp.Privileges[0].Attributes = (bEnablePrivilege) ? SE_PRIVILEGE_ENABLED : FALSE;
if(!AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES)NULL, (PDWORD)NULL))
{
return FALSE;
}
return TRUE;
}