[TASKMGR] Cherry pick Hermes fixes

** WIP ** [TASKMGR] Get rid of thread-oriented updates. Just do it synchronously on WM_TIMER.

** WIP ** Merge RefreshPerformancePage() and PerformancePageRefreshThread(), now that we removed the separate performance page refreshing thread.

- Use _ui64tow() instead of _ultow() for converting ULONGLONGs into
  a string representation.

- Isolate the update of the status bar.

- Isolate the actual graphs redrawing. The idea for later is to not
  trigger any redrawings (and run unnecessary code) if the page is deactivated.

[TASKMGR] No need to get and save global handles for all the controls in the performance page.

... and especially for controls that are used only in one place.
Only handles to the graph controls are sufficient. For the others,
we can manage by using dialog control IDs.

- Rename AdjustFrameSize() 'pos' parameter to be more explicit.

** WIP ** Group trios of Memory performance getters together, as they are always used in succession.

- Group PerfDataGetCommitCharge[Total|Limit|Peak]K() together into
  PerfDataGetCommitChargeK().

- Group PerfDataGetKernelMemory[Total|Paged|NonPaged]K() together
  into PerfDataGetKernelMemoryK().

- Group PerfDataGetPhysicalMemory[Total|Available|SystemCache]K()
  together into PerfDataGetPhysicalMemoryK().

- Use these new Mem performance getters.

[TASKMGR] Use owner-drawn performance graphs.

- Use owner-drawn buttons to implement correct graph painting while
  maintaining the 3D appearance. As done on Windows (TM)

  Why using buttons (that should be disabled btw.)?
  Because we want, if the graphs fail to be created (due to e.g.
  lack of resources), to show a descriptive label of what's missing.

  This also allow the graphs to be drawn **properly** inside a 3D-border window.

- Redraw graphs on WM_DRAWITEM.

- Don't need to subclass button controls.

- Use DeferWindowPos() to avoid controls blinking on resize.

- Fix the problem of the buttons resizing as "1/x": this was due to
  the fact, using GetClientRect + Mapping, did't take the border into
  account. Instead, use GetWindowRect + a different coord mapping to
  fix all that.

- Remove some dead code.

- Rename the remaining ridiculously long variable names.

** WIP ** CPU/Mem meters: keep a separate copy of the CPU/Mem perf values.

+ Use structure for keeping state.

** WIP ** Add support for multiple-CPU stats. (In progress, needs code cleanup.)

In particular, use SystemProcessorTimeInfo to calculate the idle time
as done in ROSAPPS' ctm.exe, see commit c0873723.

See also https://ladydebug.com/blog/codes/cpuusage_win.htm

+ Fix the problem of NtQuerySystemInformation(SystemPerformanceInformation)
  that shows up when running a 32-bit build under Windows 7 x64.

** WIP ** Investigating showing physical memory in the MEM gauge.
This commit is contained in:
Hermès Bélusca-Maïto 2021-12-20 03:19:38 +02:00 committed by Timo Kreuzer
parent b036b616ea
commit 129f10ea26
43 changed files with 1234 additions and 1279 deletions

View file

@ -25,7 +25,7 @@ HWND hApplicationPageNewTaskButton; /* Application New Task button *
static int nApplicationPageWidth; static int nApplicationPageWidth;
static int nApplicationPageHeight; static int nApplicationPageHeight;
static BOOL bSortAscending = TRUE; static BOOL bSortAscending = TRUE;
DWORD WINAPI ApplicationPageRefreshThread(void *lpParameter); DWORD WINAPI ApplicationPageRefreshThread(PVOID Parameter);
BOOL noApps; BOOL noApps;
BOOL bApplicationPageSelectionMade = FALSE; BOOL bApplicationPageSelectionMade = FALSE;
@ -38,11 +38,6 @@ void ApplicationPageShowContextMenu2(void);
int CALLBACK ApplicationPageCompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort); int CALLBACK ApplicationPageCompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);
int ProcGetIndexByProcessId(DWORD dwProcessId); int ProcGetIndexByProcessId(DWORD dwProcessId);
#ifdef RUN_APPS_PAGE
static HANDLE hApplicationThread = NULL;
static DWORD dwApplicationThread;
#endif
static INT static INT
GetSystemColorDepth(VOID) GetSystemColorDepth(VOID)
{ {
@ -131,21 +126,12 @@ ApplicationPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
UpdateApplicationListControlViewSetting(); UpdateApplicationListControlViewSetting();
/* Start our refresh thread */
#ifdef RUN_APPS_PAGE
hApplicationThread = CreateThread(NULL, 0, ApplicationPageRefreshThread, NULL, 0, &dwApplicationThread);
#endif
/* Refresh page */ /* Refresh page */
ApplicationPageUpdate(); ApplicationPageUpdate();
return TRUE; return TRUE;
case WM_DESTROY: case WM_DESTROY:
/* Close refresh thread */
#ifdef RUN_APPS_PAGE
EndLocalThread(&hApplicationThread, dwApplicationThread);
#endif
AppPageCleanup(); AppPageCleanup();
break; break;
@ -222,11 +208,7 @@ ApplicationPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
void RefreshApplicationPage(void) void RefreshApplicationPage(void)
{ {
#ifdef RUN_APPS_PAGE ApplicationPageRefreshThread(NULL);
/* Signal the event so that our refresh thread
* will wake up and refresh the application page */
PostThreadMessage(dwApplicationThread, WM_TIMER, 0, 0);
#endif
} }
void UpdateApplicationListControlViewSetting(void) void UpdateApplicationListControlViewSetting(void)
@ -245,9 +227,9 @@ void UpdateApplicationListControlViewSetting(void)
RefreshApplicationPage(); RefreshApplicationPage();
} }
DWORD WINAPI ApplicationPageRefreshThread(void *lpParameter) DWORD WINAPI ApplicationPageRefreshThread(PVOID Parameter)
{ {
MSG msg; // MSG msg;
INT i; INT i;
BOOL bItemRemoved = FALSE; BOOL bItemRemoved = FALSE;
LV_ITEM item; LV_ITEM item;
@ -255,14 +237,14 @@ DWORD WINAPI ApplicationPageRefreshThread(void *lpParameter)
HIMAGELIST hImageListLarge; HIMAGELIST hImageListLarge;
HIMAGELIST hImageListSmall; HIMAGELIST hImageListSmall;
/* If we couldn't create the event then exit the thread */ ///* If we couldn't create the event then exit the thread */
while (1) //while (1)
{ {
/* Wait for an the event or application close */ ///* Wait for an the event or application close */
if (GetMessage(&msg, NULL, 0, 0) <= 0) //if (GetMessage(&msg, NULL, 0, 0) <= 0)
return 0; // return 0;
if (msg.message == WM_TIMER) //if (msg.message == WM_TIMER)
{ {
// FIXME: Should this be EnumDesktopWindows() instead? // FIXME: Should this be EnumDesktopWindows() instead?
noApps = TRUE; noApps = TRUE;
@ -323,6 +305,8 @@ DWORD WINAPI ApplicationPageRefreshThread(void *lpParameter)
ApplicationPageUpdate(); ApplicationPageUpdate();
} }
} }
return 0;
} }
BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam) BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam)

View file

@ -3,206 +3,112 @@
* LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later) * LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later)
* PURPOSE: Performance Graph Meters. * PURPOSE: Performance Graph Meters.
* COPYRIGHT: Copyright 1999-2001 Brian Palmer <brianp@reactos.org> * COPYRIGHT: Copyright 1999-2001 Brian Palmer <brianp@reactos.org>
* Copyright 2022 Hermès Bélusca-Maïto
*/ */
#include "precomp.h" #include "precomp.h"
int nlastBarsUsed = 0; /* Snapshot of instantaneous values */
ULONGLONG Meter_CommitChargeTotal = 0;
WNDPROC OldGraphWndProc; ULONGLONG Meter_CommitChargeLimit = 0;
void Graph_DrawCpuUsageGraph(HDC hDC, HWND hWnd);
void Graph_DrawMemUsageGraph(HDC hDC, HWND hWnd);
void Graph_DrawMemUsageHistoryGraph(HDC hDC, HWND hWnd);
INT_PTR CALLBACK INT_PTR CALLBACK
Graph_WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) Graph_DrawUsageGraph(HWND hWnd, PTM_GAUGE_CONTROL gauge, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
LONG WindowId;
switch (message)
{
case WM_ERASEBKGND:
return TRUE;
/*
* Filter out mouse & keyboard messages
*/
/* case WM_APPCOMMAND: */
case WM_CAPTURECHANGED:
case WM_LBUTTONDBLCLK:
case WM_LBUTTONDOWN:
case WM_LBUTTONUP:
case WM_MBUTTONDBLCLK:
case WM_MBUTTONDOWN:
case WM_MBUTTONUP:
case WM_MOUSEACTIVATE:
case WM_MOUSEHOVER:
case WM_MOUSELEAVE:
case WM_MOUSEMOVE:
/* case WM_MOUSEWHEEL: */
case WM_NCHITTEST:
case WM_NCLBUTTONDBLCLK:
case WM_NCLBUTTONDOWN:
case WM_NCLBUTTONUP:
case WM_NCMBUTTONDBLCLK:
case WM_NCMBUTTONDOWN:
case WM_NCMBUTTONUP:
/* case WM_NCMOUSEHOVER: */
/* case WM_NCMOUSELEAVE: */
case WM_NCMOUSEMOVE:
case WM_NCRBUTTONDBLCLK:
case WM_NCRBUTTONDOWN:
case WM_NCRBUTTONUP:
/* case WM_NCXBUTTONDBLCLK: */
/* case WM_NCXBUTTONDOWN: */
/* case WM_NCXBUTTONUP: */
case WM_RBUTTONDBLCLK:
case WM_RBUTTONDOWN:
case WM_RBUTTONUP:
/* case WM_XBUTTONDBLCLK: */
/* case WM_XBUTTONDOWN: */
/* case WM_XBUTTONUP: */
case WM_ACTIVATE:
case WM_CHAR:
case WM_DEADCHAR:
case WM_GETHOTKEY:
case WM_HOTKEY:
case WM_KEYDOWN:
case WM_KEYUP:
case WM_KILLFOCUS:
case WM_SETFOCUS:
case WM_SETHOTKEY:
case WM_SYSCHAR:
case WM_SYSDEADCHAR:
case WM_SYSKEYDOWN:
case WM_SYSKEYUP:
case WM_NCCALCSIZE:
return 0;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
WindowId = GetWindowLongPtrW(hWnd, GWLP_ID);
switch (WindowId)
{
case IDC_CPU_USAGE_GRAPH:
Graph_DrawCpuUsageGraph(hdc, hWnd);
break;
case IDC_MEM_USAGE_GRAPH:
Graph_DrawMemUsageGraph(hdc, hWnd);
break;
case IDC_MEM_USAGE_HISTORY_GRAPH:
Graph_DrawMemUsageHistoryGraph(hdc, hWnd);
break;
}
EndPaint(hWnd, &ps);
return 0;
}
/*
* Pass on all non-handled messages
*/
return CallWindowProcW(OldGraphWndProc, hWnd, message, wParam, lParam);
}
void Graph_DrawCpuUsageGraph(HDC hDC, HWND hWnd)
{ {
RECT rcClient; RECT rcClient;
RECT rcBarLeft; RECT rcBarLeft;
RECT rcBarRight; RECT rcBarRight;
RECT rcText; RECT rcText;
COLORREF crPrevForeground; COLORREF crPrevForeground;
WCHAR Text[260];
HFONT hOldFont; HFONT hOldFont;
ULONG CpuUsage; WCHAR Text[260];
ULONG CpuKernelUsage;
int nBars;
int nBarsUsed;
/* Bottom bars that are "used", i.e. are bright green, representing used cpu time */
int nBarsUsedKernel;
/* Bottom bars that are "used", i.e. are bright green, representing used cpu kernel time */
int nBarsFree;
/* Top bars that are "unused", i.e. are dark green, representing free cpu time */
int i;
/* /* Total number of bars */
* Get the client area rectangle int nBars;
*/ /* Bottom bars that are "used", i.e. are bright green, representing used CPU time / used memory */
int nBarsUsed = 0;
/* Bottom bars that are "used", i.e. are bright green, representing used CPU kernel time */
int nBarsUsedKernel;
/* Top bars that are "unused", i.e. are dark green, representing free CPU time / free memory */
int nBarsFree;
int i;
HDC hDC = (HDC)wParam;
/* Get the client area rectangle */
GetClientRect(hWnd, &rcClient); GetClientRect(hWnd, &rcClient);
/* /* Fill it with blackness */
* Fill it with blackness
*/
FillSolidRect(hDC, &rcClient, RGB(0, 0, 0)); FillSolidRect(hDC, &rcClient, RGB(0, 0, 0));
/* if (gauge->bIsCPU)
* Get the CPU usage {
*/ /* Show the CPU usage */
CpuUsage = PerfDataGetProcessorUsage(); wsprintfW(Text, L"%lu%%", gauge->Current1);
}
wsprintfW(Text, L"%d%%", (int)CpuUsage); else
{
/* Show the memory usage */
if (Meter_CommitChargeTotal > 1024)
wsprintfW(Text, L"%lu MB", (ULONG)(Meter_CommitChargeTotal / 1024));
else
wsprintfW(Text, L"%lu K", (ULONG)Meter_CommitChargeTotal);
}
/* /*
* Draw the font text onto the graph * Draw the text onto the graph
*/ */
rcText = rcClient; rcText = rcClient;
InflateRect(&rcText, -2, -2); InflateRect(&rcText, -2, -2);
crPrevForeground = SetTextColor(hDC, RGB(0, 255, 0)); crPrevForeground = SetTextColor(hDC, BRIGHT_GREEN);
hOldFont = SelectObject(hDC, GetStockObject(DEFAULT_GUI_FONT)); hOldFont = SelectObject(hDC, GetStockObject(DEFAULT_GUI_FONT));
DrawTextW(hDC, Text, -1, &rcText, DT_BOTTOM | DT_CENTER | DT_NOPREFIX | DT_SINGLELINE); DrawTextW(hDC, Text, -1, &rcText, DT_BOTTOM | DT_CENTER | DT_NOPREFIX | DT_SINGLELINE);
SelectObject(hDC, hOldFont); SelectObject(hDC, hOldFont);
SetTextColor(hDC, crPrevForeground); SetTextColor(hDC, crPrevForeground);
/* /*
* Draw the graph. So first find out how many bars we can fit * Now we have to draw the graph.
* So first find out how many bars we can fit.
*/ */
nBars = ((rcClient.bottom - rcClient.top) - 25) / 3; nBars = ((rcClient.bottom - rcClient.top) - 25) / 3;
nBarsUsed = (nBars * CpuUsage) / 100; nBarsUsed = (nBars * gauge->Current1) / 100;
if ((CpuUsage) && (nBarsUsed == 0)) if ((gauge->Current1 > 0) && (nBarsUsed == 0))
{
nBarsUsed = 1; nBarsUsed = 1;
}
nBarsFree = nBars - (nlastBarsUsed>nBarsUsed ? nlastBarsUsed : nBarsUsed);
if (TaskManagerSettings.ShowKernelTimes) if (gauge->bIsCPU)
{ {
CpuKernelUsage = PerfDataGetProcessorSystemUsage(); nBarsFree = nBars - max(nBarsUsed, gauge->nlastBarsUsed);
nBarsUsedKernel = (nBars * CpuKernelUsage) / 100;
if (TaskManagerSettings.ShowKernelTimes)
nBarsUsedKernel = (nBars * gauge->Current2) / 100;
else
nBarsUsedKernel = 0;
nBarsUsedKernel = min(max(nBarsUsedKernel, 0), nBars);
} }
else else
{ {
nBarsUsedKernel = 0; nBarsFree = nBars - nBarsUsed;
} }
nBarsUsed = min(max(nBarsUsed, 0), nBars);
nBarsFree = min(max(nBarsFree, 0), nBars);
/* /*
* Draw the bar graph * Draw the bar graph
*/ */
rcBarLeft.left = ((rcClient.right - rcClient.left) - 33) / 2; rcBarLeft.left = ((rcClient.right - rcClient.left) - 33) / 2;
rcBarLeft.right = rcBarLeft.left + 16; rcBarLeft.right = rcBarLeft.left + 16;
rcBarRight.left = rcBarLeft.left + 17; rcBarRight.left = rcBarLeft.left + 17;
rcBarRight.right = rcBarLeft.right + 17; rcBarRight.right = rcBarLeft.right + 17;
rcBarLeft.top = rcBarRight.top = 5; rcBarLeft.top = rcBarRight.top = 5;
rcBarLeft.bottom = rcBarRight.bottom = 7; rcBarLeft.bottom = rcBarRight.bottom = 7;
if (nBarsUsed < 0) nBarsUsed = 0;
if (nBarsUsed > nBars) nBarsUsed = nBars;
if (nBarsFree < 0) nBarsFree = 0;
if (nBarsFree > nBars) nBarsFree = nBars;
if (nBarsUsedKernel < 0) nBarsUsedKernel = 0;
if (nBarsUsedKernel > nBars) nBarsUsedKernel = nBars;
/* /*
* Draw the "free" bars * Draw the "free" bars
*/ */
for (i=0; i<nBarsFree; i++) for (i = 0; i < nBarsFree; i++)
{ {
FillSolidRect(hDC, &rcBarLeft, DARK_GREEN); FillSolidRect(hDC, &rcBarLeft, DARK_GREEN);
FillSolidRect(hDC, &rcBarRight, DARK_GREEN); FillSolidRect(hDC, &rcBarRight, DARK_GREEN);
@ -214,31 +120,43 @@ void Graph_DrawCpuUsageGraph(HDC hDC, HWND hWnd)
rcBarRight.bottom += 3; rcBarRight.bottom += 3;
} }
/* #if 1 // TEST
* Draw the last "used" bars
*/ if (gauge->bIsCPU)
if ((nlastBarsUsed - nBarsUsed) > 0) { {
for (i=0; i< (nlastBarsUsed - nBarsUsed); i++) /*
* Draw the last "used" bars
*/
if ((gauge->nlastBarsUsed - nBarsUsed) > 0)
{ {
if (nlastBarsUsed > 5000) nlastBarsUsed = 5000; for (i = 0; i < (gauge->nlastBarsUsed - nBarsUsed); i++)
{
if (gauge->nlastBarsUsed > 5000)
gauge->nlastBarsUsed = 5000;
FillSolidRect(hDC, &rcBarLeft, MEDIUM_GREEN); FillSolidRect(hDC, &rcBarLeft, MEDIUM_GREEN);
FillSolidRect(hDC, &rcBarRight, MEDIUM_GREEN); FillSolidRect(hDC, &rcBarRight, MEDIUM_GREEN);
rcBarLeft.top += 3; rcBarLeft.top += 3;
rcBarLeft.bottom += 3; rcBarLeft.bottom += 3;
rcBarRight.top += 3; rcBarRight.top += 3;
rcBarRight.bottom += 3; rcBarRight.bottom += 3;
}
} }
gauge->nlastBarsUsed = nBarsUsed;
} }
nlastBarsUsed = nBarsUsed;
/* /*
* Draw the "used" bars * Draw the "used" bars
*/ */
for (i=0; i<nBarsUsed; i++) for (i = 0; i < nBarsUsed; i++)
{ {
if (nBarsUsed > 5000) nBarsUsed = 5000; if (gauge->bIsCPU)
{
if (nBarsUsed > 5000)
nBarsUsed = 5000;
}
FillSolidRect(hDC, &rcBarLeft, BRIGHT_GREEN); FillSolidRect(hDC, &rcBarLeft, BRIGHT_GREEN);
FillSolidRect(hDC, &rcBarRight, BRIGHT_GREEN); FillSolidRect(hDC, &rcBarRight, BRIGHT_GREEN);
@ -250,188 +168,32 @@ void Graph_DrawCpuUsageGraph(HDC hDC, HWND hWnd)
rcBarRight.bottom += 3; rcBarRight.bottom += 3;
} }
/* if (gauge->bIsCPU)
* Draw the "used" kernel bars
*/
rcBarLeft.top -=3;
rcBarLeft.bottom -=3;
rcBarRight.top -=3;
rcBarRight.bottom -=3;
for (i=0; i<nBarsUsedKernel; i++)
{ {
FillSolidRect(hDC, &rcBarLeft, RED); /*
FillSolidRect(hDC, &rcBarRight, RED); * Draw the "used" kernel bars
*/
rcBarLeft.top -=3; rcBarLeft.top -=3;
rcBarLeft.bottom -=3; rcBarLeft.bottom -=3;
rcBarRight.top -=3; rcBarRight.top -=3;
rcBarRight.bottom -=3; rcBarRight.bottom -=3;
}
SelectObject(hDC, hOldFont); for (i = 0; i < nBarsUsedKernel; i++)
}
void Graph_DrawMemUsageGraph(HDC hDC, HWND hWnd)
{
RECT rcClient;
RECT rcBarLeft;
RECT rcBarRight;
RECT rcText;
COLORREF crPrevForeground;
WCHAR Text[260];
HFONT hOldFont;
ULONGLONG CommitChargeTotal;
ULONGLONG CommitChargeLimit;
int nBars;
int nBarsUsed = 0;
/* Bottom bars that are "used", i.e. are bright green, representing used memory */
int nBarsFree;
/* Top bars that are "unused", i.e. are dark green, representing free memory */
int i;
/*
* Get the client area rectangle
*/
GetClientRect(hWnd, &rcClient);
/*
* Fill it with blackness
*/
FillSolidRect(hDC, &rcClient, RGB(0, 0, 0));
/*
* Get the memory usage
*/
CommitChargeTotal = (ULONGLONG)PerfDataGetCommitChargeTotalK();
CommitChargeLimit = (ULONGLONG)PerfDataGetCommitChargeLimitK();
if (CommitChargeTotal > 1024)
wsprintfW(Text, L"%d MB", (int)(CommitChargeTotal / 1024));
else
wsprintfW(Text, L"%d K", (int)CommitChargeTotal);
/*
* Draw the font text onto the graph
*/
rcText = rcClient;
InflateRect(&rcText, -2, -2);
crPrevForeground = SetTextColor(hDC, RGB(0, 255, 0));
hOldFont = SelectObject(hDC, GetStockObject(DEFAULT_GUI_FONT));
DrawTextW(hDC, Text, -1, &rcText, DT_BOTTOM | DT_CENTER | DT_NOPREFIX | DT_SINGLELINE);
SelectObject(hDC, hOldFont);
SetTextColor(hDC, crPrevForeground);
/*
* Draw the graph. So first find out how many bars we can fit
*/
nBars = ((rcClient.bottom - rcClient.top) - 25) / 3;
if (CommitChargeLimit)
nBarsUsed = (nBars * (int)((CommitChargeTotal * 100) / CommitChargeLimit)) / 100;
nBarsFree = nBars - nBarsUsed;
if (nBarsUsed < 0) nBarsUsed = 0;
if (nBarsUsed > nBars) nBarsUsed = nBars;
if (nBarsFree < 0) nBarsFree = 0;
if (nBarsFree > nBars) nBarsFree = nBars;
/*
* Draw the bar graph
*/
rcBarLeft.left = ((rcClient.right - rcClient.left) - 33) / 2;
rcBarLeft.right = rcBarLeft.left + 16;
rcBarRight.left = rcBarLeft.left + 17;
rcBarRight.right = rcBarLeft.right + 17;
rcBarLeft.top = rcBarRight.top = 5;
rcBarLeft.bottom = rcBarRight.bottom = 7;
/*
* Draw the "free" bars
*/
for (i=0; i<nBarsFree; i++)
{
FillSolidRect(hDC, &rcBarLeft, DARK_GREEN);
FillSolidRect(hDC, &rcBarRight, DARK_GREEN);
rcBarLeft.top += 3;
rcBarLeft.bottom += 3;
rcBarRight.top += 3;
rcBarRight.bottom += 3;
}
/*
* Draw the "used" bars
*/
for (i=0; i<nBarsUsed; i++)
{
FillSolidRect(hDC, &rcBarLeft, BRIGHT_GREEN);
FillSolidRect(hDC, &rcBarRight, BRIGHT_GREEN);
rcBarLeft.top += 3;
rcBarLeft.bottom += 3;
rcBarRight.top += 3;
rcBarRight.bottom += 3;
}
SelectObject(hDC, hOldFont);
}
void Graph_DrawMemUsageHistoryGraph(HDC hDC, HWND hWnd)
{
RECT rcClient;
//ULONGLONG CommitChargeLimit;
int i;
static int offset = 0;
if (offset++ >= 10)
offset = 0;
/*
* Get the client area rectangle
*/
GetClientRect(hWnd, &rcClient);
/*
* Fill it with blackness
*/
FillSolidRect(hDC, &rcClient, RGB(0, 0, 0));
/*
* Get the memory usage
*/
//CommitChargeLimit = (ULONGLONG)PerfDataGetCommitChargeLimitK();
/*
* Draw the graph background and horizontal bars
*/
for (i=0; i<rcClient.bottom; i++)
{
if ((i % 11) == 0)
{ {
//FillSolidRect2(hDC, 0, i, rcClient.right, 1, DARK_GREEN); FillSolidRect(hDC, &rcBarLeft, RED);
FillSolidRect(hDC, &rcBarRight, RED);
rcBarLeft.top -=3;
rcBarLeft.bottom -=3;
rcBarRight.top -=3;
rcBarRight.bottom -=3;
} }
} }
/* #endif
* Draw the vertical bars
*/
for (i=11; i<rcClient.right + offset; i++)
{
if ((i % 11) == 0)
{
//FillSolidRect2(hDC, i - offset, 0, 1, rcClient.bottom, DARK_GREEN);
}
}
/* return 0;
* Draw the memory usage
*/
for (i=rcClient.right; i>=0; i--)
{
}
} }

View file

@ -3,25 +3,34 @@
* LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later) * LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later)
* PURPOSE: Performance Graph Meters * PURPOSE: Performance Graph Meters
* COPYRIGHT: Copyright 1999-2001 Brian Palmer <brianp@reactos.org> * COPYRIGHT: Copyright 1999-2001 Brian Palmer <brianp@reactos.org>
* Copyright 2022 Hermès Bélusca-Maïto
*/ */
#pragma once #pragma once
#ifdef __cplusplus #define BRIGHT_GREEN RGB(0, 255, 0)
extern "C" { #define MEDIUM_GREEN RGB(0, 190, 0)
#endif #define DARK_GREEN RGB(0, 130, 0)
#define RED RGB(255, 0, 0)
typedef struct _TM_GAUGE_CONTROL
{
// HWND hParentWnd;
// HWND hWnd;
ULONG Current1; // Usage
ULONG Current2;
ULONG Maximum; // Limit
BOOL DrawSecondaryLevel;
#define BRIGHT_GREEN RGB(0, 255, 0) INT nlastBarsUsed;
#define MEDIUM_GREEN RGB(0, 190, 0)
#define DARK_GREEN RGB(0, 130, 0)
#define RED RGB(255, 0, 0)
extern WNDPROC OldGraphWndProc; /*** TEMP! ***/
BOOL bIsCPU; // TRUE: Gauge for CPU; FALSE: Gauge for Memory
} TM_GAUGE_CONTROL, *PTM_GAUGE_CONTROL;
INT_PTR CALLBACK Graph_WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); /* Snapshot of instantaneous values */
extern ULONGLONG Meter_CommitChargeTotal;
extern ULONGLONG Meter_CommitChargeLimit;
INT_PTR CALLBACK
#ifdef __cplusplus Graph_DrawUsageGraph(HWND hWnd, PTM_GAUGE_CONTROL gauge, WPARAM wParam, LPARAM lParam);
};
#endif

View file

@ -9,10 +9,6 @@
#include "precomp.h" #include "precomp.h"
#include <math.h>
WNDPROC OldGraphCtrlWndProc;
BOOL BOOL
GraphCtrl_Create(PTM_GRAPH_CONTROL inst, HWND hWnd, HWND hParentWnd, PTM_FORMAT fmt) GraphCtrl_Create(PTM_GRAPH_CONTROL inst, HWND hWnd, HWND hParentWnd, PTM_FORMAT fmt)
{ {
@ -292,124 +288,38 @@ GraphCtrl_RedrawOnHeightChange(PTM_GRAPH_CONTROL inst, INT nh)
GraphCtrl_RedrawBitmap(inst, nh); GraphCtrl_RedrawBitmap(inst, nh);
} }
extern TM_GRAPH_CONTROL PerformancePageCpuUsageHistoryGraph; INT_PTR CALLBACK
extern TM_GRAPH_CONTROL PerformancePageMemUsageHistoryGraph; GraphCtrl_OnSize(HWND hWnd, PTM_GRAPH_CONTROL graph, WPARAM wParam, LPARAM lParam)
extern HWND hPerformancePageCpuUsageHistoryGraph; {
extern HWND hPerformancePageMemUsageHistoryGraph; #if 0
RECT rcClient;
GetClientRect(hWnd, &rcClient);
// rcClient.bottom - rcClient.top is the sought new height.
#endif
if (HIWORD(lParam) != graph->BitmapHeight)
{
GraphCtrl_RedrawOnHeightChange(graph, HIWORD(lParam));
}
InvalidateRect(hWnd, NULL, FALSE);
return 0;
}
INT_PTR CALLBACK INT_PTR CALLBACK
GraphCtrl_WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) GraphCtrl_OnDraw(HWND hWnd, PTM_GRAPH_CONTROL graph, WPARAM wParam, LPARAM lParam)
{ {
PTM_GRAPH_CONTROL graph; RECT rcClient;
HDC hdc = (HDC)wParam;
switch (message) GetClientRect(hWnd, &rcClient);
{ BitBlt(hdc, 0, 0,
case WM_ERASEBKGND: rcClient.right,
return TRUE; rcClient.bottom,
/* graph->hdcGraph,
* Filter out mouse & keyboard messages graph->BitmapWidth - rcClient.right,
*/ 0,
// case WM_APPCOMMAND: SRCCOPY);
case WM_CAPTURECHANGED:
case WM_LBUTTONDBLCLK:
case WM_LBUTTONDOWN:
case WM_LBUTTONUP:
case WM_MBUTTONDBLCLK:
case WM_MBUTTONDOWN:
case WM_MBUTTONUP:
case WM_MOUSEACTIVATE:
case WM_MOUSEHOVER:
case WM_MOUSELEAVE:
case WM_MOUSEMOVE:
// case WM_MOUSEWHEEL:
case WM_NCHITTEST:
case WM_NCLBUTTONDBLCLK:
case WM_NCLBUTTONDOWN:
case WM_NCLBUTTONUP:
case WM_NCMBUTTONDBLCLK:
case WM_NCMBUTTONDOWN:
case WM_NCMBUTTONUP:
// case WM_NCMOUSEHOVER:
// case WM_NCMOUSELEAVE:
case WM_NCMOUSEMOVE:
case WM_NCRBUTTONDBLCLK:
case WM_NCRBUTTONDOWN:
case WM_NCRBUTTONUP:
// case WM_NCXBUTTONDBLCLK:
// case WM_NCXBUTTONDOWN:
// case WM_NCXBUTTONUP:
case WM_RBUTTONDBLCLK:
case WM_RBUTTONDOWN:
case WM_RBUTTONUP:
// case WM_XBUTTONDBLCLK:
// case WM_XBUTTONDOWN:
// case WM_XBUTTONUP:
case WM_ACTIVATE:
case WM_CHAR:
case WM_DEADCHAR:
case WM_GETHOTKEY:
case WM_HOTKEY:
case WM_KEYDOWN:
case WM_KEYUP:
case WM_KILLFOCUS:
case WM_SETFOCUS:
case WM_SETHOTKEY:
case WM_SYSCHAR:
case WM_SYSDEADCHAR:
case WM_SYSKEYDOWN:
case WM_SYSKEYUP:
return 0;
case WM_NCCALCSIZE: return 0;
return 0;
case WM_SIZE:
{
if (hWnd == hPerformancePageCpuUsageHistoryGraph)
graph = &PerformancePageCpuUsageHistoryGraph;
else if (hWnd == hPerformancePageMemUsageHistoryGraph)
graph = &PerformancePageMemUsageHistoryGraph;
else
return 0;
if (HIWORD(lParam) != graph->BitmapHeight)
{
GraphCtrl_RedrawOnHeightChange(graph, HIWORD(lParam));
}
InvalidateRect(hWnd, NULL, FALSE);
return 0;
}
case WM_PAINT:
{
RECT rcClient;
HDC hdc;
PAINTSTRUCT ps;
if (hWnd == hPerformancePageCpuUsageHistoryGraph)
graph = &PerformancePageCpuUsageHistoryGraph;
else if (hWnd == hPerformancePageMemUsageHistoryGraph)
graph = &PerformancePageMemUsageHistoryGraph;
else
return 0;
hdc = BeginPaint(hWnd, &ps);
GetClientRect(hWnd, &rcClient);
BitBlt(hdc, 0, 0,
rcClient.right,
rcClient.bottom,
graph->hdcGraph,
graph->BitmapWidth - rcClient.right,
0,
SRCCOPY);
EndPaint(hWnd, &ps);
return 0;
}
}
/*
* We pass on all non-handled messages
*/
return CallWindowProcW(OldGraphCtrlWndProc, hWnd, message, wParam, lParam);
} }

View file

@ -12,10 +12,6 @@
#define NUM_PLOTS 2 #define NUM_PLOTS 2
#define PLOT_SHIFT 2 #define PLOT_SHIFT 2
#ifdef __cplusplus
extern "C" {
#endif
typedef struct _TM_GRAPH_CONTROL typedef struct _TM_GRAPH_CONTROL
{ {
HWND hParentWnd; HWND hParentWnd;
@ -54,15 +50,11 @@ typedef struct _TM_FORMAT
} }
TM_FORMAT, *PTM_FORMAT; TM_FORMAT, *PTM_FORMAT;
extern WNDPROC OldGraphCtrlWndProc; INT_PTR CALLBACK GraphCtrl_OnSize(HWND hWnd, PTM_GRAPH_CONTROL graph, WPARAM wParam, LPARAM lParam);
INT_PTR CALLBACK GraphCtrl_WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); INT_PTR CALLBACK GraphCtrl_OnDraw(HWND hWnd, PTM_GRAPH_CONTROL graph, WPARAM wParam, LPARAM lParam);
BOOL GraphCtrl_Create(PTM_GRAPH_CONTROL inst, HWND hWnd, HWND hParentWnd, PTM_FORMAT fmt); BOOL GraphCtrl_Create(PTM_GRAPH_CONTROL inst, HWND hWnd, HWND hParentWnd, PTM_FORMAT fmt);
void GraphCtrl_Dispose(PTM_GRAPH_CONTROL inst); void GraphCtrl_Dispose(PTM_GRAPH_CONTROL inst);
void GraphCtrl_AddPoint(PTM_GRAPH_CONTROL inst, BYTE val0, BYTE val1); void GraphCtrl_AddPoint(PTM_GRAPH_CONTROL inst, BYTE val0, BYTE val1);
void GraphCtrl_RedrawOnHeightChange(PTM_GRAPH_CONTROL inst, INT nh); void GraphCtrl_RedrawOnHeightChange(PTM_GRAPH_CONTROL inst, INT nh);
void GraphCtrl_RedrawBitmap(PTM_GRAPH_CONTROL inst, INT h); void GraphCtrl_RedrawBitmap(PTM_GRAPH_CONTROL inst, INT h);
#ifdef __cplusplus
}
#endif

View file

@ -224,10 +224,10 @@ BEGIN
ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
GROUPBOX "Дневник на ЦПУ", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT GROUPBOX "Дневник на ЦПУ", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT
GROUPBOX "Дневник на паметта", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT GROUPBOX "Дневник на паметта", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT
PUSHBUTTON "CPU Usage Display", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "CPU Usage Display", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Показване заетостта на паметта", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Показване заетостта на паметта", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Дневник на ЦПУ", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Дневник на ЦПУ", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Дневник на паметта", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Дневник на паметта", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
END END
IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154 IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154

View file

@ -224,10 +224,10 @@ BEGIN
ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
GROUPBOX "Historie využití CPU", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT GROUPBOX "Historie využití CPU", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT
GROUPBOX "Historie využití paměti", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT GROUPBOX "Historie využití paměti", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT
PUSHBUTTON "Zobrazení využití CPU", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Zobrazení využití CPU", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Zobrazení využití paměti", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Zobrazení využití paměti", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Historie využití CPU", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Historie využití CPU", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Historie využití paměti", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Historie využití paměti", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
END END
IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154 IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154

View file

@ -224,10 +224,10 @@ BEGIN
ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
GROUPBOX "CPU Usage History", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT GROUPBOX "CPU Usage History", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT
GROUPBOX "MEM Hukommelses Forbrug Historik", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT GROUPBOX "MEM Hukommelses Forbrug Historik", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT
PUSHBUTTON "CPU Forbrug Visning", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "CPU Forbrug Visning", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Hukommelses Forbrug Visning", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Hukommelses Forbrug Visning", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "CPU Forbrug Historik", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "CPU Forbrug Historik", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Hukommelses Forbrug Historik", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Hukommelses Forbrug Historik", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
END END
IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154 IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154

View file

@ -224,12 +224,12 @@ BEGIN
ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
EDITTEXT IDC_KERNEL_MEMORY_NONPAGED, 192, 193, 45, 8, ES_RIGHT | ES_READONLY | EDITTEXT IDC_KERNEL_MEMORY_NONPAGED, 192, 193, 45, 8, ES_RIGHT | ES_READONLY |
ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
GROUPBOX "CPU-Lastverlauf", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT GROUPBOX "Verlauf der CPU-Auslastung", IDC_CPU_USAGE_HISTORY_FRAME, 76, 5, 166, 54, 0, WS_EX_TRANSPARENT
GROUPBOX "Speicher-Lastverlauf", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT GROUPBOX "Verlauf der Auslagerungsdateiauslastung", IDC_MEMORY_USAGE_HISTORY_FRAME, 76, 63, 166, 54, 0, WS_EX_TRANSPARENT
PUSHBUTTON "CPU-Lastanzeige", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "CPU-Auslastungsanzeige", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Speicher-Lastanzeige", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Auslagerungsdateiauslastungsanzeige", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "CPU-Lastverlaufsanzeige", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "CPU-Auslastungsverlaufsanzeige", IDC_CPU_USAGE_HISTORY_GRAPH, 82, 17, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Speicher-Lastverlaufsanzeige", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Auslagerungsdateiauslastungs-Verlaufsanzeige", IDC_MEM_USAGE_HISTORY_GRAPH, 82, 75, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
END END
IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154 IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154

View file

@ -226,10 +226,10 @@ BEGIN
ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
GROUPBOX "CPU Usage History", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT GROUPBOX "CPU Usage History", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT
GROUPBOX "Memory Usage History", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT GROUPBOX "Memory Usage History", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT
PUSHBUTTON "CPU Usage Display", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "CPU Usage Display", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "MEM Usage Display", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "MEM Usage Display", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "CPU Usage History", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "CPU Usage History", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "MEM Usage History", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "MEM Usage History", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
END END
IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154 IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154

View file

@ -224,10 +224,10 @@ BEGIN
ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
GROUPBOX "CPU Usage History", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT GROUPBOX "CPU Usage History", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT
GROUPBOX "Memory Usage History", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT GROUPBOX "Memory Usage History", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT
PUSHBUTTON "CPU Usage Display", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "CPU Usage Display", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "MEM Usage Display", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "MEM Usage Display", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "CPU Usage History", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "CPU Usage History", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "MEM Usage History", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "MEM Usage History", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
END END
IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154 IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154

View file

@ -226,10 +226,10 @@ BEGIN
ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
GROUPBOX "Historial de uso de CPU", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT GROUPBOX "Historial de uso de CPU", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT
GROUPBOX "Historial de uso de memoria física", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT GROUPBOX "Historial de uso de memoria física", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT
PUSHBUTTON "Gráfico de uso de CPU", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Gráfico de uso de CPU", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Gráfico de uso de memoria", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Gráfico de uso de memoria", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Historial de uso de CPU", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Historial de uso de CPU", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Historial de uso de memoria", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Historial de uso de memoria", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
END END
IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154 IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154

View file

@ -230,10 +230,10 @@ BEGIN
ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
GROUPBOX "CPU hõivatuse ajalugu", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT GROUPBOX "CPU hõivatuse ajalugu", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT
GROUPBOX "Füüsilise mälu hõivatuse ajalugu", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT GROUPBOX "Füüsilise mälu hõivatuse ajalugu", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT
PUSHBUTTON "CPU hõivatuse kuva", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "CPU hõivatuse kuva", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Füüsilise mälu hõivatuse kuva", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Füüsilise mälu hõivatuse kuva", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "CPU hõivatuse ajalugu", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "CPU hõivatuse ajalugu", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Füüsilise mälu hõivatuse ajalugu", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Füüsilise mälu hõivatuse ajalugu", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
END END
IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154 IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154

View file

@ -226,10 +226,10 @@ BEGIN
ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
GROUPBOX "Historique de l'utilisation de l'UC", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT GROUPBOX "Historique de l'utilisation de l'UC", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT
GROUPBOX "Historique d'utilisation de la mémoire", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT GROUPBOX "Historique d'utilisation de la mémoire", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT
PUSHBUTTON "Affichage de l'utilisation de l'UC", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Affichage de l'utilisation de l'UC", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Affichage de l'utilisation du fichier d'échange", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Affichage de l'utilisation du fichier d'échange", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Historique de l'utilisation de l'UC", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Historique de l'utilisation de l'UC", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Historique d'utilisation du fichier d'échange", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Historique d'utilisation du fichier d'échange", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
END END
IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154 IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154

View file

@ -226,10 +226,10 @@ BEGIN
ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
GROUPBOX "היסטורית שימוש במעבד", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT GROUPBOX "היסטורית שימוש במעבד", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT
GROUPBOX "היסטורית שימוש בזיכרון", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT GROUPBOX "היסטורית שימוש בזיכרון", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT
PUSHBUTTON "CPU Usage Display", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "CPU Usage Display", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "MEM Usage Display", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "MEM Usage Display", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "היסטורית שימוש במעבד", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "היסטורית שימוש במעבד", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "היסטורית שימוש בזיכרון", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "היסטורית שימוש בזיכרון", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
END END
IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154 IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154

View file

@ -226,10 +226,10 @@ BEGIN
ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
GROUPBOX "CPU használat", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT GROUPBOX "CPU használat", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT
GROUPBOX "Memória használat", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT GROUPBOX "Memória használat", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT
PUSHBUTTON "CPU használat megjelenítése", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "CPU használat megjelenítése", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Memória használat megjelenítése", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Memória használat megjelenítése", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "CPU használata", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "CPU használata", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Memória használata", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Memória használata", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
END END
IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154 IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154

View file

@ -226,10 +226,10 @@ BEGIN
ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
GROUPBOX "Riwayat Pemakaian CPU", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT GROUPBOX "Riwayat Pemakaian CPU", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT
GROUPBOX "Riwayat Pemakaian MEM", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT GROUPBOX "Riwayat Pemakaian MEM", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT
PUSHBUTTON "Tampilan Pemakaian CPU", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Tampilan Pemakaian CPU", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Tampilan Pemakaian MEM", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Tampilan Pemakaian MEM", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Riwayat Pemakaian CPU", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Riwayat Pemakaian CPU", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Riwayat Pemakaian MEM", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Riwayat Pemakaian MEM", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
END END
IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154 IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154

View file

@ -224,10 +224,10 @@ BEGIN
ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
GROUPBOX "Storico uso CPU", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT GROUPBOX "Storico uso CPU", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT
GROUPBOX "Storico uso Memoria", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT GROUPBOX "Storico uso Memoria", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT
PUSHBUTTON "Visualizzazione uso CPU", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Visualizzazione uso CPU", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Visualizzazione uso MEM", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Visualizzazione uso MEM", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Storico uso CPU", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Storico uso CPU", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Storico uso MEM", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Storico uso MEM", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
END END
IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154 IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154

View file

@ -224,10 +224,10 @@ BEGIN
ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
GROUPBOX "CPU 使用率の履歴", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT GROUPBOX "CPU 使用率の履歴", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT
GROUPBOX "メモリ使用量の履歴", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT GROUPBOX "メモリ使用量の履歴", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT
PUSHBUTTON "CPU 使用率の表示", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "CPU 使用率の表示", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "メモリ使用量の表示", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "メモリ使用量の表示", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "CPU 使用率の履歴", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "CPU 使用率の履歴", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "メモリ使用量の履歴", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "メモリ使用量の履歴", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
END END
IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154 IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154

View file

@ -226,10 +226,10 @@ BEGIN
ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
GROUPBOX "CPU 사용 기록", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT GROUPBOX "CPU 사용 기록", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT
GROUPBOX "메모리 사용 기록", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT GROUPBOX "메모리 사용 기록", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT
PUSHBUTTON "CPU 사용 표시", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "CPU 사용 표시", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "메모리 사용 표시", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "메모리 사용 표시", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "CPU 사용 기록", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "CPU 사용 기록", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "메모리 사용 기록", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "메모리 사용 기록", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
END END
IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154 IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154

View file

@ -224,10 +224,10 @@ BEGIN
ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
GROUPBOX "Geschiedenis van CPU gebruik", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT GROUPBOX "Geschiedenis van CPU gebruik", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT
GROUPBOX "Geschiedenis van wisselbestandsgebruik", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT GROUPBOX "Geschiedenis van wisselbestandsgebruik", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT
PUSHBUTTON "Weergave van CPU-gebruik", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Weergave van CPU-gebruik", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Weergave van wisselbestandsgebruik", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Weergave van wisselbestandsgebruik", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Geschiedenis van CPU gebruik", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Geschiedenis van CPU gebruik", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Geschiedenis van wisselbestandsgebruik", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Geschiedenis van wisselbestandsgebruik", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
END END
IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154 IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154

View file

@ -224,10 +224,10 @@ BEGIN
ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
GROUPBOX "Logg for bruk av prosessor", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT GROUPBOX "Logg for bruk av prosessor", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT
GROUPBOX "Logg for bruk av fysisk minne", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT GROUPBOX "Logg for bruk av fysisk minne", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT
PUSHBUTTON "Vis prosessorbruk", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Vis prosessorbruk", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Vis minnebruk", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Vis minnebruk", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Logg for prosessorbruk", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Logg for prosessorbruk", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Minne bruk historie", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Minne bruk historie", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
END END
IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154 IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154

View file

@ -229,10 +229,10 @@ BEGIN
ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
GROUPBOX "Historia użycia procesora CPU", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT GROUPBOX "Historia użycia procesora CPU", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT
GROUPBOX "Historia uzycia pliku stronicowania MEM", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT GROUPBOX "Historia uzycia pliku stronicowania MEM", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT
PUSHBUTTON "Wyświetl użycie procesora", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Wyświetl użycie procesora", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Wyświetl zużycie pamięci", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Wyświetl zużycie pamięci", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Historia użycia procesora", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Historia użycia procesora", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Historia zużycia pamięci", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Historia zużycia pamięci", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
END END
IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154 IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154

View file

@ -224,10 +224,10 @@ BEGIN
ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
GROUPBOX "Histórico de uso de CPU", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT GROUPBOX "Histórico de uso de CPU", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT
GROUPBOX "Histórico de uso de Memoria", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT GROUPBOX "Histórico de uso de Memoria", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT
PUSHBUTTON "CPU Usage Display", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "CPU Usage Display", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "MEM Usage Display", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "MEM Usage Display", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "CPU Usage History", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "CPU Usage History", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "MEM Usage History", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "MEM Usage History", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
END END
IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154 IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154

View file

@ -226,10 +226,10 @@ BEGIN
ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
GROUPBOX "Histórico de uso de CPU", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT GROUPBOX "Histórico de uso de CPU", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT
GROUPBOX "Histórico de uso de Memoria", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT GROUPBOX "Histórico de uso de Memoria", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT
PUSHBUTTON "Mostra o uso da CPU", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Mostra o uso da CPU", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Mostra o uso da RAM", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Mostra o uso da RAM", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Histórico de uso da CPU", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Histórico de uso da CPU", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Histórico de uso da memória RAM", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Histórico de uso da memória RAM", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
END END
IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154 IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154

View file

@ -233,10 +233,10 @@ BEGIN
ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
GROUPBOX "Istoric utilizare CPU", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT GROUPBOX "Istoric utilizare CPU", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT
GROUPBOX "Istoric utilizare memorie", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT GROUPBOX "Istoric utilizare memorie", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT
PUSHBUTTON "Afișare utilizare CPU", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Afișare utilizare CPU", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Afișare utilizare memorie", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Afișare utilizare memorie", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Afișare istoric utlizare procesor", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Afișare istoric utilizare procesor", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Afișare istoric utlizare memorie", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Afișare istoric utilizare memorie", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
END END
IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154 IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154

View file

@ -226,10 +226,10 @@ BEGIN
ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
GROUPBOX "Хронология загрузки ЦП", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT GROUPBOX "Хронология загрузки ЦП", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT
GROUPBOX "Хронология использования файла подкачки", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT GROUPBOX "Хронология использования файла подкачки", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT
PUSHBUTTON "Отображение загрузки ЦП", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Отображение загрузки ЦП", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Отображение использования памяти", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Отображение использования памяти", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Хронология загрузки ЦП", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Хронология загрузки ЦП", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Хронология использования памяти", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Хронология использования памяти", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
END END
IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154 IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154

View file

@ -226,10 +226,10 @@ BEGIN
ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
GROUPBOX "História využitia procesora", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT GROUPBOX "História využitia procesora", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT
GROUPBOX "História využitia stránkovacieho súboru", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT GROUPBOX "História využitia stránkovacieho súboru", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT
PUSHBUTTON "Zobrazenie využitia procesora", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Zobrazenie využitia procesora", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Zobrazenie využitia pamäte", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Zobrazenie využitia pamäte", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "História využitia procesora", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "História využitia procesora", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "História využitia pamäte", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "História využitia pamäte", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
END END
IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 270, 154 IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 270, 154

View file

@ -226,10 +226,10 @@ BEGIN
ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
GROUPBOX "Historia e perdorimit CPU", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT GROUPBOX "Historia e perdorimit CPU", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT
GROUPBOX "Historia e perdorimit Memories", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT GROUPBOX "Historia e perdorimit Memories", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT
PUSHBUTTON "Shfaq perdorimin e CPU", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Shfaq perdorimin e CPU", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Shfaq perdorimin e MEM", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Shfaq perdorimin e MEM", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Historia e perdorimit CPU", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Historia e perdorimit CPU", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Historia e perdorimit MEM", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Historia e perdorimit MEM", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
END END
IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154 IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154

View file

@ -226,10 +226,10 @@ BEGIN
ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
GROUPBOX "Processorhistorik", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT GROUPBOX "Processorhistorik", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT
GROUPBOX "Minneshistorik", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT GROUPBOX "Minneshistorik", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT
PUSHBUTTON "Processoranvändning", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Processoranvändning", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Minnesanvändning", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Minnesanvändning", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Processorhistorik", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Processorhistorik", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Minneshistorik", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Minneshistorik", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
END END
IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154 IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154

View file

@ -226,10 +226,10 @@ BEGIN
ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
GROUPBOX "CPU Kullanım Geçmişi", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT GROUPBOX "CPU Kullanım Geçmişi", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT
GROUPBOX "Bellek Kullanım Geçmişi", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT GROUPBOX "Bellek Kullanım Geçmişi", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT
PUSHBUTTON "CPU Kullanım Grafiği", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "CPU Kullanım Grafiği", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Bellek Kullanım Grafiği", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Bellek Kullanım Grafiği", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "CPU Kullanım Geçmişi Grafiği", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "CPU Kullanım Geçmişi Grafiği", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Bellek Kullanım Geçmişi Grafiği", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Bellek Kullanım Geçmişi Grafiği", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
END END
IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154 IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154

View file

@ -224,10 +224,10 @@ BEGIN
ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
GROUPBOX "Хронологія використання ЦП", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT GROUPBOX "Хронологія використання ЦП", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT
GROUPBOX "Хронологія використання пам'яті", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT GROUPBOX "Хронологія використання пам'яті", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT
PUSHBUTTON "Відображення використання ЦП", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Відображення використання ЦП", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Відображення використання пам'яті", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Відображення використання пам'яті", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Хронологія використання ЦП", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Хронологія використання ЦП", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Хронологія використання пам'яті", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "Хронологія використання пам'яті", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
END END
IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154 IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154

View file

@ -227,10 +227,10 @@ BEGIN
ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
GROUPBOX "CPU 使用记录", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT GROUPBOX "CPU 使用记录", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT
GROUPBOX "内存使用记录", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT GROUPBOX "内存使用记录", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT
PUSHBUTTON "CPU 使用情况显示", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "CPU 使用情况显示", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "内存使用情况显示", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "内存使用情况显示", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "CPU 使用记录", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "CPU 使用记录", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "内存使用记录", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "内存使用记录", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
END END
IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154 IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154

View file

@ -232,10 +232,10 @@ BEGIN
ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
GROUPBOX "CPU 使用記錄", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT GROUPBOX "CPU 使用記錄", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT
GROUPBOX "記憶體使用記錄", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT GROUPBOX "記憶體使用記錄", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT
PUSHBUTTON "CPU 使用情況顯示", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "CPU 使用情況顯示", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "記憶體使用情況顯示", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "記憶體使用情況顯示", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "CPU 使用記錄", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "CPU 使用記錄", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "記憶體使用記錄", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE PUSHBUTTON "記憶體使用記錄", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
END END
IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154 IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154

View file

@ -15,22 +15,32 @@
#include <ndk/psfuncs.h> #include <ndk/psfuncs.h>
#include <ndk/exfuncs.h> #include <ndk/exfuncs.h>
CRITICAL_SECTION PerfDataCriticalSection; CRITICAL_SECTION PerfDataCriticalSection;
PPERFDATA pPerfDataOld = NULL; /* Older perf data (saved to establish delta values) */ PPERFDATA pPerfDataOld = NULL; /* Older perf data (saved to establish delta values) */
PPERFDATA pPerfData = NULL; /* Most recent copy of perf data */ PPERFDATA pPerfData = NULL; /* Most recent copy of perf data */
ULONG ProcessCountOld = 0; ULONG ProcessCountOld = 0;
ULONG ProcessCount = 0; ULONG ProcessCount = 0;
double dbIdleTime;
double dbKernelTime; typedef struct _CPU_TIMES
double dbSystemTime; {
LARGE_INTEGER liOldIdleTime = {{0,0}}; double dbIdleTime;
double OldKernelTime = 0; double dbKernelTime;
LARGE_INTEGER liOldSystemTime = {{0,0}};
SYSTEM_PERFORMANCE_INFORMATION SystemPerfInfo; LARGE_INTEGER OldIdleTime;
LARGE_INTEGER OldKernelTime;
} CPU_TIMES, *PCPU_TIMES;
static PCPU_TIMES ProcessorTimes = NULL;
static CPU_TIMES ProcessorMeanTimes = {0};
double dbSystemTime;
LARGE_INTEGER OldSystemTime = {{0,0}};
SYSTEM_BASIC_INFORMATION SystemBasicInfo; SYSTEM_BASIC_INFORMATION SystemBasicInfo;
SYSTEM_FILECACHE_INFORMATION SystemCacheInfo;
ULONG SystemNumberOfHandles;
PSYSTEM_PROCESSOR_PERFORMANCE_INFORMATION SystemProcessorTimeInfo = NULL; PSYSTEM_PROCESSOR_PERFORMANCE_INFORMATION SystemProcessorTimeInfo = NULL;
SYSTEM_PERFORMANCE_INFORMATION SystemPerfInfo = {0};
SYSTEM_FILECACHE_INFORMATION SystemCacheInfo = {0};
ULONG SystemNumberOfHandles = 0;
PSID SystemUserSid = NULL; PSID SystemUserSid = NULL;
PCMD_LINE_CACHE global_cache = NULL; PCMD_LINE_CACHE global_cache = NULL;
@ -46,38 +56,71 @@ typedef struct _SIDTOUSERNAME
static LIST_ENTRY SidToUserNameHead = {&SidToUserNameHead, &SidToUserNameHead}; static LIST_ENTRY SidToUserNameHead = {&SidToUserNameHead, &SidToUserNameHead};
BOOL PerfDataInitialize(void) /*static*/ VOID
__cdecl
_DiagError(
_In_ PCWSTR Format,
...)
{
va_list args;
WCHAR Buffer[1024];
va_start(args, Format);
StringCbVPrintfW(Buffer, sizeof(Buffer), Format, args);
va_end(args);
MessageBoxW(NULL, Buffer, L"Error", MB_ICONERROR | MB_OK);
}
BOOL PerfDataInitialize(VOID)
{ {
SID_IDENTIFIER_AUTHORITY NtSidAuthority = {SECURITY_NT_AUTHORITY}; SID_IDENTIFIER_AUTHORITY NtSidAuthority = {SECURITY_NT_AUTHORITY};
NTSTATUS status; NTSTATUS status;
ULONG BufferSize;
InitializeCriticalSection(&PerfDataCriticalSection); InitializeCriticalSection(&PerfDataCriticalSection);
/* /* Retrieve basic system information, including the number of processors in the system */
* Get number of processors in the system
*/
status = NtQuerySystemInformation(SystemBasicInformation, &SystemBasicInfo, sizeof(SystemBasicInfo), NULL); status = NtQuerySystemInformation(SystemBasicInformation, &SystemBasicInfo, sizeof(SystemBasicInfo), NULL);
if (!NT_SUCCESS(status)) if (!NT_SUCCESS(status))
{
// ZeroMemory(&SystemBasicInfo, sizeof(SystemBasicInfo));
return FALSE; return FALSE;
}
/* /* Allocate the array for per-processor time information */
* Create the SYSTEM Sid // TODO: For supporting more CPUs, see e.g.
*/ // https://github.com/processhacker/processhacker/commit/8b3a09f99d06e45df64bfee2ce4c91d7c02b8b3d
// but this should be Win7+.
BufferSize = sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION) * SystemBasicInfo.NumberOfProcessors;
SystemProcessorTimeInfo = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, BufferSize);
/* Allocate an array for per-CPU times. If allocation fails (e.g.
* low memory resources), use the mean times instead. */
ProcessorTimes = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
sizeof(CPU_TIMES) * SystemBasicInfo.NumberOfProcessors);
if (!ProcessorTimes)
ProcessorTimes = &ProcessorMeanTimes;
/* Create the SYSTEM Sid */
AllocateAndInitializeSid(&NtSidAuthority, 1, SECURITY_LOCAL_SYSTEM_RID, 0, 0, 0, 0, 0, 0, 0, &SystemUserSid); AllocateAndInitializeSid(&NtSidAuthority, 1, SECURITY_LOCAL_SYSTEM_RID, 0, 0, 0, 0, 0, 0, 0, &SystemUserSid);
return TRUE; return TRUE;
} }
void PerfDataUninitialize(void) VOID PerfDataUninitialize(VOID)
{ {
PLIST_ENTRY pCur; PLIST_ENTRY pCur;
PSIDTOUSERNAME pEntry; PSIDTOUSERNAME pEntry;
if (pPerfData != NULL) if (pPerfData)
{
HeapFree(GetProcessHeap(), 0, pPerfData); HeapFree(GetProcessHeap(), 0, pPerfData);
pPerfData = NULL;
}
DeleteCriticalSection(&PerfDataCriticalSection); DeleteCriticalSection(&PerfDataCriticalSection);
if (SystemUserSid != NULL) if (SystemUserSid)
{ {
FreeSid(SystemUserSid); FreeSid(SystemUserSid);
SystemUserSid = NULL; SystemUserSid = NULL;
@ -92,12 +135,24 @@ void PerfDataUninitialize(void)
HeapFree(GetProcessHeap(), 0, pEntry); HeapFree(GetProcessHeap(), 0, pEntry);
} }
if (SystemProcessorTimeInfo) { if (ProcessorTimes && (ProcessorTimes != &ProcessorMeanTimes))
{
HeapFree(GetProcessHeap(), 0, ProcessorTimes);
ProcessorTimes = NULL;
}
if (SystemProcessorTimeInfo)
{
HeapFree(GetProcessHeap(), 0, SystemProcessorTimeInfo); HeapFree(GetProcessHeap(), 0, SystemProcessorTimeInfo);
SystemProcessorTimeInfo = NULL;
} }
} }
static void SidToUserName(PSID Sid, LPWSTR szBuffer, DWORD BufferSize) static VOID
SidToUserName(
_In_ PSID Sid,
_Out_ LPWSTR szBuffer,
_In_ DWORD BufferSize)
{ {
static WCHAR szDomainNameUnused[255]; static WCHAR szDomainNameUnused[255];
DWORD DomainNameLen = _countof(szDomainNameUnused); DWORD DomainNameLen = _countof(szDomainNameUnused);
@ -107,12 +162,13 @@ static void SidToUserName(PSID Sid, LPWSTR szBuffer, DWORD BufferSize)
LookupAccountSidW(NULL, Sid, szBuffer, &BufferSize, szDomainNameUnused, &DomainNameLen, &Use); LookupAccountSidW(NULL, Sid, szBuffer, &BufferSize, szDomainNameUnused, &DomainNameLen, &Use);
} }
/* Should be from utildll.dll */
VOID VOID
WINAPI WINAPI
CachedGetUserFromSid( CachedGetUserFromSid(
PSID pSid, _In_ PSID pSid,
LPWSTR pUserName, _Out_ LPWSTR pUserName,
PULONG pcwcUserName) _Inout_ PULONG pcwcUserName)
{ {
PLIST_ENTRY pCur; PLIST_ENTRY pCur;
PSIDTOUSERNAME pEntry; PSIDTOUSERNAME pEntry;
@ -121,9 +177,9 @@ CachedGetUserFromSid(
cwcUserName = *pcwcUserName; cwcUserName = *pcwcUserName;
/* Walk through the list */ /* Walk through the list */
for(pCur = SidToUserNameHead.Flink; for (pCur = SidToUserNameHead.Flink;
pCur != &SidToUserNameHead; pCur != &SidToUserNameHead;
pCur = pCur->Flink) pCur = pCur->Flink)
{ {
pEntry = CONTAINING_RECORD(pCur, SIDTOUSERNAME, List); pEntry = CONTAINING_RECORD(pCur, SIDTOUSERNAME, List);
if (EqualSid((PSID)&pEntry->Data, pSid)) if (EqualSid((PSID)&pEntry->Data, pSid))
@ -149,73 +205,93 @@ CachedGetUserFromSid(
wcsncpy(pEntry->pszName, pUserName, cwcUserName); wcsncpy(pEntry->pszName, pUserName, cwcUserName);
/* Insert the new entry */ /* Insert the new entry */
// InsertHeadList();
pEntry->List.Flink = &SidToUserNameHead; pEntry->List.Flink = &SidToUserNameHead;
pEntry->List.Blink = SidToUserNameHead.Blink; pEntry->List.Blink = SidToUserNameHead.Blink;
SidToUserNameHead.Blink->Flink = &pEntry->List; SidToUserNameHead.Blink->Flink = &pEntry->List;
SidToUserNameHead.Blink = &pEntry->List; SidToUserNameHead.Blink = &pEntry->List;
} }
void PerfDataRefresh(void) VOID PerfDataRefresh(VOID)
{ {
ULONG ulSize; ULONG ulSize;
NTSTATUS status; NTSTATUS status;
LPBYTE pBuffer; LPBYTE pBuffer;
ULONG BufferSize; ULONG BufferSize;
PSYSTEM_PROCESS_INFORMATION pSPI; PSYSTEM_PROCESS_INFORMATION pSPI;
PPERFDATA pPDOld; PPERFDATA pPDOld;
ULONG Idx, Idx2; ULONG Idx, Idx2;
HANDLE hProcess; HANDLE hProcess;
HANDLE hProcessToken; HANDLE hProcessToken;
SYSTEM_PERFORMANCE_INFORMATION SysPerfInfo;
SYSTEM_TIMEOFDAY_INFORMATION SysTimeInfo; SYSTEM_TIMEOFDAY_INFORMATION SysTimeInfo = {0};
SYSTEM_FILECACHE_INFORMATION SysCacheInfo; #if (NTDDI_VERSION < NTDDI_WIN7)
SYSTEM_HANDLE_INFORMATION SysHandleInfoData; /* Larger on Win2k8/Win7 */
PSYSTEM_PROCESSOR_PERFORMANCE_INFORMATION SysProcessorTimeInfo; DECLSPEC_ALIGN(8) BYTE SysPerfInfoData[sizeof(SYSTEM_PERFORMANCE_INFORMATION) + 16] = {0};
double CurrentKernelTime; #else
PSECURITY_DESCRIPTOR ProcessSD; SYSTEM_PERFORMANCE_INFORMATION SysPerfInfoData = {0};
PSID ProcessUser; #endif
ULONG Buffer[64]; /* must be 4 bytes aligned! */ PSYSTEM_PERFORMANCE_INFORMATION pSysPerfInfo = (PSYSTEM_PERFORMANCE_INFORMATION)SysPerfInfoData;
ULONG cwcUserName; SYSTEM_FILECACHE_INFORMATION SysCacheInfo = {0};
SYSTEM_HANDLE_INFORMATION SysHandleInfo = {0};
LARGE_INTEGER CurrentIdleTime, MeanIdleTime;
LARGE_INTEGER CurrentKernelTime, MeanKernelTime;
LARGE_INTEGER liCurrentTime;
PSECURITY_DESCRIPTOR ProcessSD;
PSID ProcessUser;
ULONG Buffer[64]; /* Must be 4 bytes aligned! */
ULONG cwcUserName;
/*
* Retrieve several pieces of system information.
*
* Retrieval may sometimes fail, either because we are actually interested
* only in partial information (e.g. SystemHandleInformation), or because
* we are low in memory resources, or because of (Windows 7 WOW64-only) bugs
* (see below). In any of these cases, we try to fallback to sane values,
* and continue retrieving other information.
*/
/* Get new system time */ /* Get new system time */
status = NtQuerySystemInformation(SystemTimeOfDayInformation, &SysTimeInfo, sizeof(SysTimeInfo), NULL); status = NtQuerySystemInformation(SystemTimeOfDayInformation, &SysTimeInfo, sizeof(SysTimeInfo), NULL);
if (!NT_SUCCESS(status)) if (!NT_SUCCESS(status))
return; SysTimeInfo.CurrentTime = OldSystemTime;
/* Get new CPU's idle time */ /*
status = NtQuerySystemInformation(SystemPerformanceInformation, &SysPerfInfo, sizeof(SysPerfInfo), NULL); * Get general system performance info.
*
* The SYSTEM_PERFORMANCE_INFORMATION structure's size increased in Win7+.
* NtQuerySystemInformation(SystemPerformanceInformation) also supports its
* older version by filling in as much of the whole structure as possible,
* and returns STATUS_SUCCESS. However, Windows 7 x64 WOW64 has a bug, in
* wow64.dll!whNtQuerySystemInformation_SystemPerformanceInformation(),
* that fails to handle the different structures sizes, only supporting
* the largest possible one, and fails if the structure uses its legacy
* size (no data is copied, and STATUS_INFO_LENGTH_MISMATCH is returned).
* This problem thus happens only for 32-bit compiled code, but does not
* happen with native 64-bit compiled code. This problems does not happen
* on 32-bit Windows 7.
*/
// ZeroMemory(&SysPerfInfoData, sizeof(SysPerfInfoData));
status = NtQuerySystemInformation(SystemPerformanceInformation, &SysPerfInfoData, sizeof(SysPerfInfoData), NULL);
if (!NT_SUCCESS(status)) if (!NT_SUCCESS(status))
return; *pSysPerfInfo = SystemPerfInfo;
/* Get system cache information */ /* Get system cache information */
status = NtQuerySystemInformation(SystemFileCacheInformation, &SysCacheInfo, sizeof(SysCacheInfo), NULL); status = NtQuerySystemInformation(SystemFileCacheInformation, &SysCacheInfo, sizeof(SysCacheInfo), NULL);
if (!NT_SUCCESS(status)) if (!NT_SUCCESS(status))
return; SysCacheInfo = SystemCacheInfo;
/* Get processor time information */ /* Get handle information. Number of handles is enough, no need for data array. */
SysProcessorTimeInfo = (PSYSTEM_PROCESSOR_PERFORMANCE_INFORMATION)HeapAlloc(GetProcessHeap(), 0, sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION) * SystemBasicInfo.NumberOfProcessors); status = NtQuerySystemInformation(SystemHandleInformation, &SysHandleInfo, sizeof(SysHandleInfo), NULL);
status = NtQuerySystemInformation(SystemProcessorPerformanceInformation, SysProcessorTimeInfo, sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION) * SystemBasicInfo.NumberOfProcessors, &ulSize); if (!NT_SUCCESS(status) && (status != STATUS_INFO_LENGTH_MISMATCH))
SysHandleInfo.NumberOfHandles = SystemNumberOfHandles;
if (!NT_SUCCESS(status)) /* Get process information.
{
if (SysProcessorTimeInfo != NULL)
HeapFree(GetProcessHeap(), 0, SysProcessorTimeInfo);
return;
}
/* Get handle information
* Number of handles is enough, no need for data array.
*/
status = NtQuerySystemInformation(SystemHandleInformation, &SysHandleInfoData, sizeof(SysHandleInfoData), NULL);
/* On unexpected error, reuse previous value.
* STATUS_SUCCESS (0-1 handle) should never happen.
*/
if (status != STATUS_INFO_LENGTH_MISMATCH)
SysHandleInfoData.NumberOfHandles = SystemNumberOfHandles;
/* Get process information
* We don't know how much data there is so just keep * We don't know how much data there is so just keep
* increasing the buffer size until the call succeeds * increasing the buffer size until the call succeeds.
*/ */
BufferSize = 0; BufferSize = 0;
do do
@ -224,110 +300,170 @@ void PerfDataRefresh(void)
pBuffer = (LPBYTE)HeapAlloc(GetProcessHeap(), 0, BufferSize); pBuffer = (LPBYTE)HeapAlloc(GetProcessHeap(), 0, BufferSize);
status = NtQuerySystemInformation(SystemProcessInformation, pBuffer, BufferSize, &ulSize); status = NtQuerySystemInformation(SystemProcessInformation, pBuffer, BufferSize, &ulSize);
if (status == STATUS_INFO_LENGTH_MISMATCH)
if (status == STATUS_INFO_LENGTH_MISMATCH) {
HeapFree(GetProcessHeap(), 0, pBuffer); HeapFree(GetProcessHeap(), 0, pBuffer);
}
} while (status == STATUS_INFO_LENGTH_MISMATCH); } while (status == STATUS_INFO_LENGTH_MISMATCH);
EnterCriticalSection(&PerfDataCriticalSection); EnterCriticalSection(&PerfDataCriticalSection);
/* /* Save system performance, cache, and handle information */
* Save system performance info SystemPerfInfo = *pSysPerfInfo;
*/ SystemCacheInfo = SysCacheInfo;
memcpy(&SystemPerfInfo, &SysPerfInfo, sizeof(SYSTEM_PERFORMANCE_INFORMATION)); SystemNumberOfHandles = SysHandleInfo.NumberOfHandles;
/* /* If it's a first call, skip idle time calcs */
* Save system cache info if (OldSystemTime.QuadPart != 0)
*/ {
memcpy(&SystemCacheInfo, &SysCacheInfo, sizeof(SYSTEM_FILECACHE_INFORMATION)); liCurrentTime.QuadPart = SysTimeInfo.CurrentTime.QuadPart - OldSystemTime.QuadPart;
dbSystemTime = Li2Double(liCurrentTime);
/*
* Save system processor time info
*/
if (SystemProcessorTimeInfo) {
HeapFree(GetProcessHeap(), 0, SystemProcessorTimeInfo);
} }
SystemProcessorTimeInfo = SysProcessorTimeInfo; /* Store the system time */
OldSystemTime = SysTimeInfo.CurrentTime;
/* /* Get system processor time information. In case of failure, keep the old data. */
* Save system handle info ulSize = sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION) * SystemBasicInfo.NumberOfProcessors;
*/ status = NtQuerySystemInformation(SystemProcessorPerformanceInformation,
SystemNumberOfHandles = SysHandleInfoData.NumberOfHandles; SystemProcessorTimeInfo,
ulSize,
for (CurrentKernelTime=0, Idx=0; Idx<(ULONG)SystemBasicInfo.NumberOfProcessors; Idx++) { NULL);
CurrentKernelTime += Li2Double(SystemProcessorTimeInfo[Idx].KernelTime); if (!NT_SUCCESS(status))
CurrentKernelTime += Li2Double(SystemProcessorTimeInfo[Idx].DpcTime); {
CurrentKernelTime += Li2Double(SystemProcessorTimeInfo[Idx].InterruptTime); /* Keep the same data as before */
// ZeroMemory(SystemProcessorTimeInfo, ulSize);
} }
/* If it's a first call - skip idle time calcs */ MeanIdleTime.QuadPart = 0;
if (liOldIdleTime.QuadPart != 0) { MeanKernelTime.QuadPart = 0;
/* CurrentValue = NewValue - OldValue */ for (Idx = 0; Idx < SystemBasicInfo.NumberOfProcessors; Idx++)
dbIdleTime = Li2Double(SysPerfInfo.IdleProcessTime) - Li2Double(liOldIdleTime); {
dbKernelTime = CurrentKernelTime - OldKernelTime; /* IDLE Time */
dbSystemTime = Li2Double(SysTimeInfo.CurrentTime) - Li2Double(liOldSystemTime); CurrentIdleTime = SystemProcessorTimeInfo[Idx].IdleTime;
/* CurrentCpuIdle = IdleTime / SystemTime */ /* Kernel Time */
dbIdleTime = dbIdleTime / dbSystemTime; CurrentKernelTime = SystemProcessorTimeInfo[Idx].KernelTime;
dbKernelTime = dbKernelTime / dbSystemTime; CurrentKernelTime.QuadPart += SystemProcessorTimeInfo[Idx].DpcTime.QuadPart;
CurrentKernelTime.QuadPart += SystemProcessorTimeInfo[Idx].InterruptTime.QuadPart;
/* CurrentCpuUsage% = 100 - (CurrentCpuIdle * 100) / NumberOfProcessors */ /* Save the per-CPU times */
dbIdleTime = 100.0 - dbIdleTime * 100.0 / (double)SystemBasicInfo.NumberOfProcessors; /* + 0.5; */ if (ProcessorTimes != &ProcessorMeanTimes)
dbKernelTime = 100.0 - dbKernelTime * 100.0 / (double)SystemBasicInfo.NumberOfProcessors; /* + 0.5; */ {
/* If it's a first call, skip idle time calcs */
if (ProcessorMeanTimes.OldIdleTime.QuadPart != 0)
{
/* CurrentValue = NewValue - OldValue */
liCurrentTime.QuadPart = CurrentIdleTime.QuadPart;
liCurrentTime.QuadPart -= ProcessorTimes[Idx].OldIdleTime.QuadPart;
ProcessorTimes[Idx].dbIdleTime = Li2Double(liCurrentTime);
liCurrentTime.QuadPart = CurrentKernelTime.QuadPart;
liCurrentTime.QuadPart -= ProcessorTimes[Idx].OldKernelTime.QuadPart;
ProcessorTimes[Idx].dbKernelTime = Li2Double(liCurrentTime);
/* CurrentCpuIdle = IdleTime / SystemTime */
ProcessorTimes[Idx].dbIdleTime /= dbSystemTime;
ProcessorTimes[Idx].dbKernelTime /= dbSystemTime;
/* CurrentCpuUsage% = 100 - (CurrentCpuIdle * 100) */
ProcessorTimes[Idx].dbIdleTime =
100.0 - ProcessorTimes[Idx].dbIdleTime * 100.0; /* + 0.5; */
ProcessorTimes[Idx].dbKernelTime =
100.0 - ProcessorTimes[Idx].dbKernelTime * 100.0; /* + 0.5; */
/* Sanitize the values (percentages between 0 and 100) */
ProcessorTimes[Idx].dbIdleTime = min(max(ProcessorTimes[Idx].dbIdleTime, 0.), 100.);
ProcessorTimes[Idx].dbKernelTime = min(max(ProcessorTimes[Idx].dbKernelTime, 0.), 100.);
}
/* Store new CPU's idle and kernel times */
ProcessorTimes[Idx].OldIdleTime = CurrentIdleTime;
ProcessorTimes[Idx].OldKernelTime = CurrentKernelTime;
}
/* Calculate the mean values as well */
MeanIdleTime.QuadPart += CurrentIdleTime.QuadPart;
MeanKernelTime.QuadPart += CurrentKernelTime.QuadPart;
} }
/* Store new CPU's idle and system time */ /* If it's a first call, skip idle time calcs */
liOldIdleTime = SysPerfInfo.IdleProcessTime; if (ProcessorMeanTimes.OldIdleTime.QuadPart != 0)
liOldSystemTime = SysTimeInfo.CurrentTime; {
OldKernelTime = CurrentKernelTime; /* CurrentValue = NewValue - OldValue */
liCurrentTime.QuadPart = MeanIdleTime.QuadPart - ProcessorMeanTimes.OldIdleTime.QuadPart;
ProcessorMeanTimes.dbIdleTime = Li2Double(liCurrentTime);
/* Determine the process count liCurrentTime.QuadPart = MeanKernelTime.QuadPart - ProcessorMeanTimes.OldKernelTime.QuadPart;
ProcessorMeanTimes.dbKernelTime = Li2Double(liCurrentTime);
/* CurrentCpuIdle = IdleTime / SystemTime */
ProcessorMeanTimes.dbIdleTime /= dbSystemTime;
ProcessorMeanTimes.dbKernelTime /= dbSystemTime;
/* CurrentCpuUsage% = 100 - (CurrentCpuIdle * 100) / NumberOfProcessors */
ProcessorMeanTimes.dbIdleTime =
100.0 - ProcessorMeanTimes.dbIdleTime * 100.0 / (double)SystemBasicInfo.NumberOfProcessors; /* + 0.5; */
ProcessorMeanTimes.dbKernelTime =
100.0 - ProcessorMeanTimes.dbKernelTime * 100.0 / (double)SystemBasicInfo.NumberOfProcessors; /* + 0.5; */
/* Sanitize the values (percentages between 0 and 100) */
ProcessorMeanTimes.dbIdleTime = min(max(ProcessorMeanTimes.dbIdleTime, 0.), 100.);
ProcessorMeanTimes.dbKernelTime = min(max(ProcessorMeanTimes.dbKernelTime, 0.), 100.);
}
/* Store the mean CPU times */
ProcessorMeanTimes.OldIdleTime = MeanIdleTime;
ProcessorMeanTimes.OldKernelTime = MeanKernelTime;
/* Determine the process count.
* We loop through the data we got from NtQuerySystemInformation * We loop through the data we got from NtQuerySystemInformation
* and count how many structures there are (until RelativeOffset is 0) * and count how many structures there are (until NextEntryOffset is 0)
*/ */
ProcessCountOld = ProcessCount; ProcessCountOld = ProcessCount;
ProcessCount = 0; ProcessCount = 0;
pSPI = (PSYSTEM_PROCESS_INFORMATION)pBuffer; for (pSPI = (PSYSTEM_PROCESS_INFORMATION)pBuffer;
while (pSPI) { pSPI && (pSPI->NextEntryOffset != 0);
pSPI = (PSYSTEM_PROCESS_INFORMATION)((ULONG_PTR)pSPI + pSPI->NextEntryOffset))
{
ProcessCount++; ProcessCount++;
if (pSPI->NextEntryOffset == 0)
break;
pSPI = (PSYSTEM_PROCESS_INFORMATION)((LPBYTE)pSPI + pSPI->NextEntryOffset);
} }
/* Now alloc a new PERFDATA array and fill in the data */ /* Now alloc a new PERFDATA array and fill in the data */
pPerfData = (PPERFDATA)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(PERFDATA) * ProcessCount); pPerfData = (PPERFDATA)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(PERFDATA) * ProcessCount);
pSPI = (PSYSTEM_PROCESS_INFORMATION)pBuffer; pSPI = (PSYSTEM_PROCESS_INFORMATION)pBuffer;
for (Idx=0; Idx<ProcessCount; Idx++) { for (Idx=0; Idx<ProcessCount; Idx++)
/* Get the old perf data for this process (if any) */ {
/* so that we can establish delta values */ /* Get the old perf data for this process (if any)
* so that we can establish delta values */
pPDOld = NULL; pPDOld = NULL;
if (pPerfDataOld) { if (pPerfDataOld)
for (Idx2=0; Idx2<ProcessCountOld; Idx2++) { {
if (pPerfDataOld[Idx2].ProcessId == pSPI->UniqueProcessId) { for (Idx2=0; Idx2<ProcessCountOld; Idx2++)
{
if (pPerfDataOld[Idx2].ProcessId == pSPI->UniqueProcessId)
{
pPDOld = &pPerfDataOld[Idx2]; pPDOld = &pPerfDataOld[Idx2];
break; break;
} }
} }
} }
if (pSPI->ImageName.Buffer) { if (pSPI->ImageName.Buffer)
/* Don't assume a UNICODE_STRING Buffer is zero terminated: */ {
int len = pSPI->ImageName.Length / 2; StringCbCopyNW(pPerfData[Idx].ImageName, sizeof(pPerfData[Idx].ImageName),
/* Check against max size and allow for terminating zero (already zeroed): */ pSPI->ImageName.Buffer, pSPI->ImageName.Length);
if(len >= MAX_PATH)len=MAX_PATH - 1; }
wcsncpy(pPerfData[Idx].ImageName, pSPI->ImageName.Buffer, len); else
} else { {
LoadStringW(hInst, IDS_IDLE_PROCESS, pPerfData[Idx].ImageName, LoadStringW(hInst, IDS_IDLE_PROCESS,
_countof(pPerfData[Idx].ImageName)); pPerfData[Idx].ImageName,
_countof(pPerfData[Idx].ImageName));
} }
pPerfData[Idx].ProcessId = pSPI->UniqueProcessId; pPerfData[Idx].ProcessId = pSPI->UniqueProcessId;
if (pPDOld) { if (pPDOld)
{
double CurTime = Li2Double(pSPI->KernelTime) + Li2Double(pSPI->UserTime); double CurTime = Li2Double(pSPI->KernelTime) + Li2Double(pSPI->UserTime);
double OldTime = Li2Double(pPDOld->KernelTime) + Li2Double(pPDOld->UserTime); double OldTime = Li2Double(pPDOld->KernelTime) + Li2Double(pPDOld->UserTime);
double CpuTime = (CurTime - OldTime) / dbSystemTime; double CpuTime = (CurTime - OldTime) / dbSystemTime;
@ -337,15 +473,19 @@ void PerfDataRefresh(void)
pPerfData[Idx].CPUTime.QuadPart = pSPI->UserTime.QuadPart + pSPI->KernelTime.QuadPart; pPerfData[Idx].CPUTime.QuadPart = pSPI->UserTime.QuadPart + pSPI->KernelTime.QuadPart;
pPerfData[Idx].WorkingSetSizeBytes = pSPI->WorkingSetSize; pPerfData[Idx].WorkingSetSizeBytes = pSPI->WorkingSetSize;
pPerfData[Idx].PeakWorkingSetSizeBytes = pSPI->PeakWorkingSetSize; pPerfData[Idx].PeakWorkingSetSizeBytes = pSPI->PeakWorkingSetSize;
if (pPDOld) if (pPDOld)
pPerfData[Idx].WorkingSetSizeDelta = labs((LONG)pSPI->WorkingSetSize - (LONG)pPDOld->WorkingSetSizeBytes); pPerfData[Idx].WorkingSetSizeDelta = labs((LONG)pSPI->WorkingSetSize - (LONG)pPDOld->WorkingSetSizeBytes);
else else
pPerfData[Idx].WorkingSetSizeDelta = 0; pPerfData[Idx].WorkingSetSizeDelta = 0;
pPerfData[Idx].PageFaultCount = pSPI->PageFaultCount; pPerfData[Idx].PageFaultCount = pSPI->PageFaultCount;
if (pPDOld) if (pPDOld)
pPerfData[Idx].PageFaultCountDelta = labs((LONG)pSPI->PageFaultCount - (LONG)pPDOld->PageFaultCount); pPerfData[Idx].PageFaultCountDelta = labs((LONG)pSPI->PageFaultCount - (LONG)pPDOld->PageFaultCount);
else else
pPerfData[Idx].PageFaultCountDelta = 0; pPerfData[Idx].PageFaultCountDelta = 0;
pPerfData[Idx].VirtualMemorySizeBytes = pSPI->VirtualSize; pPerfData[Idx].VirtualMemorySizeBytes = pSPI->VirtualSize;
pPerfData[Idx].PagedPoolUsagePages = pSPI->QuotaPeakPagedPoolUsage; pPerfData[Idx].PagedPoolUsagePages = pSPI->QuotaPeakPagedPoolUsage;
pPerfData[Idx].NonPagedPoolUsagePages = pSPI->QuotaPeakNonPagedPoolUsage; pPerfData[Idx].NonPagedPoolUsagePages = pSPI->QuotaPeakNonPagedPoolUsage;
@ -359,11 +499,13 @@ void PerfDataRefresh(void)
ProcessUser = SystemUserSid; ProcessUser = SystemUserSid;
ProcessSD = NULL; ProcessSD = NULL;
if (pSPI->UniqueProcessId != NULL) { if (pSPI->UniqueProcessId != NULL)
{
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | READ_CONTROL, FALSE, PtrToUlong(pSPI->UniqueProcessId)); hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | READ_CONTROL, FALSE, PtrToUlong(pSPI->UniqueProcessId));
if (hProcess) { if (hProcess)
/* don't query the information of the system process. It's possible but {
returns Administrators as the owner of the process instead of SYSTEM */ /* Don't query the information of the system process. It's possible but
* returns Administrators as the owner of the process instead of SYSTEM. */
if (pSPI->UniqueProcessId != (HANDLE)0x4) if (pSPI->UniqueProcessId != (HANDLE)0x4)
{ {
if (OpenProcessToken(hProcess, TOKEN_QUERY, &hProcessToken)) if (OpenProcessToken(hProcess, TOKEN_QUERY, &hProcessToken))
@ -391,12 +533,16 @@ ReadProcOwner:
GetProcessIoCounters(hProcess, &pPerfData[Idx].IOCounters); GetProcessIoCounters(hProcess, &pPerfData[Idx].IOCounters);
CloseHandle(hProcess); CloseHandle(hProcess);
} else { }
else
{
goto ClearInfo; goto ClearInfo;
} }
} else { }
else
{
ClearInfo: ClearInfo:
/* clear information we were unable to fetch */ /* Clear information we were unable to fetch */
ZeroMemory(&pPerfData[Idx].IOCounters, sizeof(IO_COUNTERS)); ZeroMemory(&pPerfData[Idx].IOCounters, sizeof(IO_COUNTERS));
} }
@ -404,19 +550,27 @@ ClearInfo:
CachedGetUserFromSid(ProcessUser, pPerfData[Idx].UserName, &cwcUserName); CachedGetUserFromSid(ProcessUser, pPerfData[Idx].UserName, &cwcUserName);
if (ProcessSD != NULL) if (ProcessSD != NULL)
{
LocalFree((HLOCAL)ProcessSD); LocalFree((HLOCAL)ProcessSD);
}
pPerfData[Idx].UserTime.QuadPart = pSPI->UserTime.QuadPart; pPerfData[Idx].UserTime.QuadPart = pSPI->UserTime.QuadPart;
pPerfData[Idx].KernelTime.QuadPart = pSPI->KernelTime.QuadPart; pPerfData[Idx].KernelTime.QuadPart = pSPI->KernelTime.QuadPart;
pSPI = (PSYSTEM_PROCESS_INFORMATION)((LPBYTE)pSPI + pSPI->NextEntryOffset); pSPI = (PSYSTEM_PROCESS_INFORMATION)((ULONG_PTR)pSPI + pSPI->NextEntryOffset);
} }
HeapFree(GetProcessHeap(), 0, pBuffer); HeapFree(GetProcessHeap(), 0, pBuffer);
if (pPerfDataOld) { if (pPerfDataOld)
HeapFree(GetProcessHeap(), 0, pPerfDataOld); HeapFree(GetProcessHeap(), 0, pPerfDataOld);
}
pPerfDataOld = pPerfData; pPerfDataOld = pPerfData;
LeaveCriticalSection(&PerfDataCriticalSection);
}
VOID PerfDataAcquireLock(VOID)
{
EnterCriticalSection(&PerfDataCriticalSection);
}
VOID PerfDataReleaseLock(VOID)
{
LeaveCriticalSection(&PerfDataCriticalSection); LeaveCriticalSection(&PerfDataCriticalSection);
} }
@ -452,24 +606,45 @@ ULONG PerfDataGetProcessCount(void)
return Result; return Result;
} }
ULONG PerfDataGetProcessorUsage(void) ULONG PerfDataGetProcessorCount(VOID)
{
/* Note: No need for locking since this is a one-time initialized data */
// TODO: Investigate how this should be fixed with NUMA support.
return SystemBasicInfo.NumberOfProcessors;
}
ULONG PerfDataGetProcessorUsage(VOID)
{ {
ULONG Result; ULONG Result;
EnterCriticalSection(&PerfDataCriticalSection); EnterCriticalSection(&PerfDataCriticalSection);
Result = (ULONG)min(max(dbIdleTime, 0.), 100.); Result = (ULONG)ProcessorMeanTimes.dbIdleTime;
LeaveCriticalSection(&PerfDataCriticalSection); LeaveCriticalSection(&PerfDataCriticalSection);
return Result; return Result;
} }
ULONG PerfDataGetProcessorSystemUsage(void) ULONG PerfDataGetProcessorSystemUsage(VOID)
{ {
ULONG Result; ULONG Result;
EnterCriticalSection(&PerfDataCriticalSection); EnterCriticalSection(&PerfDataCriticalSection);
Result = (ULONG)min(max(dbKernelTime, 0.), 100.); Result = (ULONG)ProcessorMeanTimes.dbKernelTime;
LeaveCriticalSection(&PerfDataCriticalSection); LeaveCriticalSection(&PerfDataCriticalSection);
return Result; return Result;
} }
ULONG PerfDataGetProcessorUsagePerCPU(ULONG CPUIndex)
{
if (CPUIndex >= SystemBasicInfo.NumberOfProcessors)
return 0;
return (ULONG)ProcessorTimes[CPUIndex].dbIdleTime;
}
ULONG PerfDataGetProcessorSystemUsagePerCPU(ULONG CPUIndex)
{
if (CPUIndex >= SystemBasicInfo.NumberOfProcessors)
return 0;
return (ULONG)ProcessorTimes[CPUIndex].dbKernelTime;
}
BOOL PerfDataGetImageName(ULONG Index, LPWSTR lpImageName, ULONG nMaxCount) BOOL PerfDataGetImageName(ULONG Index, LPWSTR lpImageName, ULONG nMaxCount)
{ {
BOOL bSuccessful; BOOL bSuccessful;
@ -916,161 +1091,86 @@ BOOL PerfDataGetIOCounters(ULONG Index, PIO_COUNTERS pIoCounters)
return bSuccessful; return bSuccessful;
} }
ULONG PerfDataGetCommitChargeTotalK(void) VOID
PerfDataGetCommitChargeK(
_Out_opt_ PULONGLONG ChargeTotal,
_Out_opt_ PULONGLONG ChargeLimit,
_Out_opt_ PULONGLONG ChargePeak)
{ {
ULONG Total; ULONG Total;
ULONG PageSize; ULONG Limit;
ULONG Peak;
ULONG PageSize;
EnterCriticalSection(&PerfDataCriticalSection); EnterCriticalSection(&PerfDataCriticalSection);
Total = SystemPerfInfo.CommittedPages; Total = SystemPerfInfo.CommittedPages;
PageSize = SystemBasicInfo.PageSize;
LeaveCriticalSection(&PerfDataCriticalSection);
Total = Total * (PageSize / 1024);
return Total;
}
ULONG PerfDataGetCommitChargeLimitK(void)
{
ULONG Limit;
ULONG PageSize;
EnterCriticalSection(&PerfDataCriticalSection);
Limit = SystemPerfInfo.CommitLimit; Limit = SystemPerfInfo.CommitLimit;
Peak = SystemPerfInfo.PeakCommitment;
PageSize = SystemBasicInfo.PageSize; PageSize = SystemBasicInfo.PageSize;
LeaveCriticalSection(&PerfDataCriticalSection); LeaveCriticalSection(&PerfDataCriticalSection);
Limit = Limit * (PageSize / 1024); if (ChargeTotal)
*ChargeTotal = (ULONGLONG)Total * (PageSize / 1024);
return Limit; if (ChargeLimit)
*ChargeLimit = (ULONGLONG)Limit * (PageSize / 1024);
if (ChargePeak)
*ChargePeak = (ULONGLONG)Peak * (PageSize / 1024);
} }
ULONG PerfDataGetCommitChargePeakK(void) VOID
PerfDataGetKernelMemoryK(
_Out_opt_ PULONGLONG MemTotal,
_Out_opt_ PULONGLONG MemPaged,
_Out_opt_ PULONGLONG MemNonPaged)
{ {
ULONG Peak; ULONG Paged;
ULONG PageSize; ULONG NonPaged;
ULONG PageSize;
EnterCriticalSection(&PerfDataCriticalSection); EnterCriticalSection(&PerfDataCriticalSection);
Peak = SystemPerfInfo.PeakCommitment; Paged = SystemPerfInfo.PagedPoolPages;
PageSize = SystemBasicInfo.PageSize;
LeaveCriticalSection(&PerfDataCriticalSection);
Peak = Peak * (PageSize / 1024);
return Peak;
}
ULONG PerfDataGetKernelMemoryTotalK(void)
{
ULONG Total;
ULONG Paged;
ULONG NonPaged;
ULONG PageSize;
EnterCriticalSection(&PerfDataCriticalSection);
Paged = SystemPerfInfo.PagedPoolPages;
NonPaged = SystemPerfInfo.NonPagedPoolPages; NonPaged = SystemPerfInfo.NonPagedPoolPages;
PageSize = SystemBasicInfo.PageSize; PageSize = SystemBasicInfo.PageSize;
LeaveCriticalSection(&PerfDataCriticalSection); LeaveCriticalSection(&PerfDataCriticalSection);
Paged = Paged * (PageSize / 1024); if (MemTotal)
NonPaged = NonPaged * (PageSize / 1024); *MemTotal = (ULONGLONG)(Paged + NonPaged) * (PageSize / 1024);
if (MemPaged)
Total = Paged + NonPaged; *MemPaged = (ULONGLONG)Paged * (PageSize / 1024);
if (MemNonPaged)
return Total; *MemNonPaged = (ULONGLONG)NonPaged * (PageSize / 1024);
} }
ULONG PerfDataGetKernelMemoryPagedK(void) VOID
PerfDataGetPhysicalMemoryK(
_Out_opt_ PULONGLONG MemTotal,
_Out_opt_ PULONGLONG MemAvailable,
_Out_opt_ PULONGLONG MemSysCache)
{ {
ULONG Paged; ULONG Total;
ULONG PageSize; ULONG Available;
ULONG SystemCache;
EnterCriticalSection(&PerfDataCriticalSection); ULONG PageSize;
Paged = SystemPerfInfo.PagedPoolPages;
PageSize = SystemBasicInfo.PageSize;
LeaveCriticalSection(&PerfDataCriticalSection);
Paged = Paged * (PageSize / 1024);
return Paged;
}
ULONG PerfDataGetKernelMemoryNonPagedK(void)
{
ULONG NonPaged;
ULONG PageSize;
EnterCriticalSection(&PerfDataCriticalSection);
NonPaged = SystemPerfInfo.NonPagedPoolPages;
PageSize = SystemBasicInfo.PageSize;
LeaveCriticalSection(&PerfDataCriticalSection);
NonPaged = NonPaged * (PageSize / 1024);
return NonPaged;
}
ULONG PerfDataGetPhysicalMemoryTotalK(void)
{
ULONG Total;
ULONG PageSize;
EnterCriticalSection(&PerfDataCriticalSection); EnterCriticalSection(&PerfDataCriticalSection);
Total = SystemBasicInfo.NumberOfPhysicalPages; Total = SystemBasicInfo.NumberOfPhysicalPages;
Available = SystemPerfInfo.AvailablePages;
SystemCache = SystemCacheInfo.CurrentSizeIncludingTransitionInPages;
PageSize = SystemBasicInfo.PageSize; PageSize = SystemBasicInfo.PageSize;
LeaveCriticalSection(&PerfDataCriticalSection); LeaveCriticalSection(&PerfDataCriticalSection);
Total = Total * (PageSize / 1024); if (MemTotal)
*MemTotal = (ULONGLONG)Total * (PageSize / 1024);
return Total; if (MemAvailable)
} *MemAvailable = (ULONGLONG)Available * (PageSize / 1024);
if (MemSysCache)
ULONG PerfDataGetPhysicalMemoryAvailableK(void) *MemSysCache = (ULONGLONG)SystemCache * (PageSize / 1024);
{
ULONG Available;
ULONG PageSize;
EnterCriticalSection(&PerfDataCriticalSection);
Available = SystemPerfInfo.AvailablePages;
PageSize = SystemBasicInfo.PageSize;
LeaveCriticalSection(&PerfDataCriticalSection);
Available = Available * (PageSize / 1024);
return Available;
}
ULONG PerfDataGetPhysicalMemorySystemCacheK(void)
{
ULONG SystemCache;
ULONG PageSize;
EnterCriticalSection(&PerfDataCriticalSection);
PageSize = SystemBasicInfo.PageSize;
SystemCache = SystemCacheInfo.CurrentSizeIncludingTransitionInPages * PageSize;
LeaveCriticalSection(&PerfDataCriticalSection);
return SystemCache / 1024;
} }
ULONG PerfDataGetSystemHandleCount(void) ULONG PerfDataGetSystemHandleCount(void)

View file

@ -45,15 +45,24 @@ typedef struct _CMD_LINE_CACHE
struct _CMD_LINE_CACHE* pnext; struct _CMD_LINE_CACHE* pnext;
} CMD_LINE_CACHE, *PCMD_LINE_CACHE; } CMD_LINE_CACHE, *PCMD_LINE_CACHE;
BOOL PerfDataInitialize(void); BOOL PerfDataInitialize(VOID);
void PerfDataUninitialize(void); VOID PerfDataUninitialize(VOID);
void PerfDataRefresh(void); VOID PerfDataRefresh(VOID);
VOID PerfDataAcquireLock(VOID);
VOID PerfDataReleaseLock(VOID);
BOOL PerfDataGet(ULONG Index, PPERFDATA *lppData); BOOL PerfDataGet(ULONG Index, PPERFDATA *lppData);
ULONG PerfDataGetProcessIndex(ULONG pid); ULONG PerfDataGetProcessIndex(ULONG pid);
ULONG PerfDataGetProcessCount(void); ULONG PerfDataGetProcessCount(void);
ULONG PerfDataGetProcessorUsage(void);
ULONG PerfDataGetProcessorSystemUsage(void); ULONG PerfDataGetProcessorCount(VOID);
ULONG PerfDataGetProcessorUsage(VOID);
ULONG PerfDataGetProcessorSystemUsage(VOID);
/****/
ULONG PerfDataGetProcessorUsagePerCPU(ULONG CPUIndex);
ULONG PerfDataGetProcessorSystemUsagePerCPU(ULONG CPUIndex);
/****/
BOOL PerfDataGetImageName(ULONG Index, LPWSTR lpImageName, ULONG nMaxCount); BOOL PerfDataGetImageName(ULONG Index, LPWSTR lpImageName, ULONG nMaxCount);
ULONG PerfDataGetProcessId(ULONG Index); ULONG PerfDataGetProcessId(ULONG Index);
@ -80,17 +89,23 @@ ULONG PerfDataGetUSERObjectCount(ULONG Index);
ULONG PerfDataGetGDIObjectCount(ULONG Index); ULONG PerfDataGetGDIObjectCount(ULONG Index);
BOOL PerfDataGetIOCounters(ULONG Index, PIO_COUNTERS pIoCounters); BOOL PerfDataGetIOCounters(ULONG Index, PIO_COUNTERS pIoCounters);
ULONG PerfDataGetCommitChargeTotalK(void); VOID
ULONG PerfDataGetCommitChargeLimitK(void); PerfDataGetCommitChargeK(
ULONG PerfDataGetCommitChargePeakK(void); _Out_opt_ PULONGLONG Total,
_Out_opt_ PULONGLONG Limit,
_Out_opt_ PULONGLONG Peak);
ULONG PerfDataGetKernelMemoryTotalK(void); VOID
ULONG PerfDataGetKernelMemoryPagedK(void); PerfDataGetKernelMemoryK(
ULONG PerfDataGetKernelMemoryNonPagedK(void); _Out_opt_ PULONGLONG MemTotal,
_Out_opt_ PULONGLONG MemPaged,
_Out_opt_ PULONGLONG MemNonPaged);
ULONG PerfDataGetPhysicalMemoryTotalK(void); VOID
ULONG PerfDataGetPhysicalMemoryAvailableK(void); PerfDataGetPhysicalMemoryK(
ULONG PerfDataGetPhysicalMemorySystemCacheK(void); _Out_opt_ PULONGLONG MemTotal,
_Out_opt_ PULONGLONG MemAvailable,
_Out_opt_ PULONGLONG MemSysCache);
ULONG PerfDataGetSystemHandleCount(void); ULONG PerfDataGetSystemHandleCount(void);

View file

@ -8,57 +8,48 @@
#include "precomp.h" #include "precomp.h"
#include <shlwapi.h> #include <shlwapi.h>
TM_GRAPH_CONTROL PerformancePageCpuUsageHistoryGraph; #define MAX_CPU_PER_LINE 16 // TODO: Make this selectable in submenu.
TM_GRAPH_CONTROL PerformancePageMemUsageHistoryGraph;
HWND hPerformancePage; /* Performance Property Page */ // typedef struct _CPU_GRAPH CPU_GRAPH, *PCPU_GRAPH;
static HWND hCpuUsageGraph; /* CPU Usage Graph */ static ULONG CpuTotalPanes = 0;
static HWND hMemUsageGraph; /* MEM Usage Graph */ static PTM_GRAPH_CONTROL CpuUsageHistoryGraphs = NULL; /* CPU Usage History Graphs Array */
HWND hPerformancePageCpuUsageHistoryGraph; /* CPU Usage History Graph */
HWND hPerformancePageMemUsageHistoryGraph; /* Memory Usage History Graph */
static HWND hTotalsFrame; /* Totals Frame */
static HWND hCommitChargeFrame; /* Commit Charge Frame */
static HWND hKernelMemoryFrame; /* Kernel Memory Frame */
static HWND hPhysicalMemoryFrame; /* Physical Memory Frame */
static HWND hCpuUsageFrame;
static HWND hMemUsageFrame;
static HWND hCpuUsageHistoryFrame;
static HWND hMemUsageHistoryFrame;
static HWND hCommitChargeTotalEdit; /* Commit Charge Total Edit Control */
static HWND hCommitChargeLimitEdit; /* Commit Charge Limit Edit Control */
static HWND hCommitChargePeakEdit; /* Commit Charge Peak Edit Control */
static HWND hKernelMemoryTotalEdit; /* Kernel Memory Total Edit Control */
static HWND hKernelMemoryPagedEdit; /* Kernel Memory Paged Edit Control */
static HWND hKernelMemoryNonPagedEdit; /* Kernel Memory NonPaged Edit Control */
static HWND hPhysicalMemoryTotalEdit; /* Physical Memory Total Edit Control */
static HWND hPhysicalMemoryAvailableEdit; /* Physical Memory Available Edit Control */
static HWND hPhysicalMemorySystemCacheEdit; /* Physical Memory System Cache Edit Control */
static HWND hTotalsHandleCountEdit; /* Total Handles Edit Control */
static HWND hTotalsProcessCountEdit; /* Total Processes Edit Control */
static HWND hTotalsThreadCountEdit; /* Total Threads Edit Control */
#ifdef RUN_PERF_PAGE static HWND hCpuUsageHistoryGraph; /* CPU Usage History Graph */
static HANDLE hPerformanceThread = NULL; static TM_GRAPH_CONTROL CpuUsageHistoryGraph; /* CPU Usage History Graph template control */
static DWORD dwPerformanceThread; static RECT rcCpuGraphArea; /* Rectangle area for CPU graphs */
#endif
static HWND hMemUsageHistoryGraph; /* Memory Usage History Graph */
static TM_GRAPH_CONTROL MemUsageHistoryGraph;
static HWND hCpuUsageGraph; /* CPU Usage Graph */
static HWND hMemUsageGraph; /* MEM Usage Graph */
static TM_GAUGE_CONTROL CpuUsageGraph = {0};
static TM_GAUGE_CONTROL MemUsageGraph = {0};
HWND hPerformancePage; /* Performance Property Page */
static int nPerformancePageWidth; static int nPerformancePageWidth;
static int nPerformancePageHeight; static int nPerformancePageHeight;
static int lastX, lastY; static int lastX, lastY;
DWORD WINAPI PerformancePageRefreshThread(PVOID Parameter);
void AdjustFrameSize(HWND hCntrl, HWND hDlg, int nXDifference, int nYDifference, int pos) static void
AdjustFrameSize(HDWP* phdwp, HWND hCntrl, HWND hDlg, int nXDifference, int nYDifference, int posFlag)
{ {
RECT rc; RECT rc;
int cx, cy, sx, sy; int cx, cy, sx, sy;
GetClientRect(hCntrl, &rc); if (!phdwp || !*phdwp)
MapWindowPoints(hCntrl, hDlg, (LPPOINT)(PRECT)(&rc), sizeof(RECT)/sizeof(POINT)); return;
if (pos) {
GetWindowRect(hCntrl, &rc);
MapWindowPoints(NULL, hDlg, (LPPOINT)&rc, sizeof(RECT) / sizeof(POINT));
if (posFlag)
{
cx = rc.left; cx = rc.left;
cy = rc.top; cy = rc.top;
sx = rc.right - rc.left; sx = rc.right - rc.left;
switch (pos) { switch (posFlag)
{
case 1: case 1:
break; break;
case 2: case 2:
@ -73,44 +64,38 @@ void AdjustFrameSize(HWND hCntrl, HWND hDlg, int nXDifference, int nYDifference,
break; break;
} }
sy = rc.bottom - rc.top + nYDifference / 2; sy = rc.bottom - rc.top + nYDifference / 2;
SetWindowPos(hCntrl, NULL, cx, cy, sx, sy, SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOZORDER); *phdwp = DeferWindowPos(*phdwp,
} else { hCntrl, NULL,
cx, cy, sx, sy,
SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOZORDER);
}
else
{
cx = rc.left + nXDifference; cx = rc.left + nXDifference;
cy = rc.top + nYDifference; cy = rc.top + nYDifference;
SetWindowPos(hCntrl, NULL, cx, cy, 0, 0, SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER); *phdwp = DeferWindowPos(*phdwp,
hCntrl, NULL,
cx, cy, 0, 0,
SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER);
} }
InvalidateRect(hCntrl, NULL, TRUE); InvalidateRect(hCntrl, NULL, TRUE);
} }
// AdjustControlPosition
static inline static inline
void AdjustControlPosition(HWND hCntrl, HWND hDlg, int nXDifference, int nYDifference) void AdjustCntrlPos(HDWP* phdwp, int ctrl_id, HWND hDlg, int nXDifference, int nYDifference)
{ {
AdjustFrameSize(hCntrl, hDlg, nXDifference, nYDifference, 0); AdjustFrameSize(phdwp, GetDlgItem(hDlg, ctrl_id), hDlg, nXDifference, nYDifference, 0);
}
static inline
void AdjustCntrlPos(int ctrl_id, HWND hDlg, int nXDifference, int nYDifference)
{
AdjustFrameSize(GetDlgItem(hDlg, ctrl_id), hDlg, nXDifference, nYDifference, 0);
} }
INT_PTR CALLBACK INT_PTR CALLBACK
PerformancePageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) PerformancePageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{ {
RECT rc;
switch (message) switch (message)
{ {
case WM_DESTROY:
GraphCtrl_Dispose(&PerformancePageCpuUsageHistoryGraph);
GraphCtrl_Dispose(&PerformancePageMemUsageHistoryGraph);
#ifdef RUN_PERF_PAGE
EndLocalThread(&hPerformanceThread, dwPerformanceThread);
#endif
break;
case WM_INITDIALOG: case WM_INITDIALOG:
{ {
RECT rc;
BOOL bGraph; BOOL bGraph;
TM_FORMAT fmt; TM_FORMAT fmt;
@ -122,84 +107,194 @@ PerformancePageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
/* Update window position */ /* Update window position */
SetWindowPos(hDlg, NULL, 15, 30, 0, 0, SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER); SetWindowPos(hDlg, NULL, 15, 30, 0, 0, SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER);
/* /* Get handles to the graph controls */
* Get handles to all the controls
*/
hTotalsFrame = GetDlgItem(hDlg, IDC_TOTALS_FRAME);
hCommitChargeFrame = GetDlgItem(hDlg, IDC_COMMIT_CHARGE_FRAME);
hKernelMemoryFrame = GetDlgItem(hDlg, IDC_KERNEL_MEMORY_FRAME);
hPhysicalMemoryFrame = GetDlgItem(hDlg, IDC_PHYSICAL_MEMORY_FRAME);
hCpuUsageFrame = GetDlgItem(hDlg, IDC_CPU_USAGE_FRAME);
hMemUsageFrame = GetDlgItem(hDlg, IDC_MEM_USAGE_FRAME);
hCpuUsageHistoryFrame = GetDlgItem(hDlg, IDC_CPU_USAGE_HISTORY_FRAME);
hMemUsageHistoryFrame = GetDlgItem(hDlg, IDC_MEMORY_USAGE_HISTORY_FRAME);
hCommitChargeTotalEdit = GetDlgItem(hDlg, IDC_COMMIT_CHARGE_TOTAL);
hCommitChargeLimitEdit = GetDlgItem(hDlg, IDC_COMMIT_CHARGE_LIMIT);
hCommitChargePeakEdit = GetDlgItem(hDlg, IDC_COMMIT_CHARGE_PEAK);
hKernelMemoryTotalEdit = GetDlgItem(hDlg, IDC_KERNEL_MEMORY_TOTAL);
hKernelMemoryPagedEdit = GetDlgItem(hDlg, IDC_KERNEL_MEMORY_PAGED);
hKernelMemoryNonPagedEdit = GetDlgItem(hDlg, IDC_KERNEL_MEMORY_NONPAGED);
hPhysicalMemoryTotalEdit = GetDlgItem(hDlg, IDC_PHYSICAL_MEMORY_TOTAL);
hPhysicalMemoryAvailableEdit = GetDlgItem(hDlg, IDC_PHYSICAL_MEMORY_AVAILABLE);
hPhysicalMemorySystemCacheEdit = GetDlgItem(hDlg, IDC_PHYSICAL_MEMORY_SYSTEM_CACHE);
hTotalsHandleCountEdit = GetDlgItem(hDlg, IDC_TOTALS_HANDLE_COUNT);
hTotalsProcessCountEdit = GetDlgItem(hDlg, IDC_TOTALS_PROCESS_COUNT);
hTotalsThreadCountEdit = GetDlgItem(hDlg, IDC_TOTALS_THREAD_COUNT);
hCpuUsageGraph = GetDlgItem(hDlg, IDC_CPU_USAGE_GRAPH); hCpuUsageGraph = GetDlgItem(hDlg, IDC_CPU_USAGE_GRAPH);
hMemUsageGraph = GetDlgItem(hDlg, IDC_MEM_USAGE_GRAPH); hMemUsageGraph = GetDlgItem(hDlg, IDC_MEM_USAGE_GRAPH);
hPerformancePageMemUsageHistoryGraph = GetDlgItem(hDlg, IDC_MEM_USAGE_HISTORY_GRAPH); hCpuUsageHistoryGraph = GetDlgItem(hDlg, IDC_CPU_USAGE_HISTORY_GRAPH);
hPerformancePageCpuUsageHistoryGraph = GetDlgItem(hDlg, IDC_CPU_USAGE_HISTORY_GRAPH); hMemUsageHistoryGraph = GetDlgItem(hDlg, IDC_MEM_USAGE_HISTORY_GRAPH);
/* Create the graph controls */
CpuUsageGraph.bIsCPU = TRUE;
// CpuUsageGraph.hWnd = hCpuUsageGraph;
MemUsageGraph.bIsCPU = FALSE;
// MemUsageGraph.hWnd = hMemUsageGraph;
/* Create the controls */
fmt.clrBack = RGB(0, 0, 0); fmt.clrBack = RGB(0, 0, 0);
fmt.clrGrid = RGB(0, 128, 64); fmt.clrGrid = RGB(0, 128, 64);
fmt.clrPlot0 = RGB(0, 255, 0); fmt.clrPlot0 = RGB(0, 255, 0);
fmt.clrPlot1 = RGB(255, 0, 0); fmt.clrPlot1 = RGB(255, 0, 0);
fmt.GridCellWidth = fmt.GridCellHeight = 12; fmt.GridCellWidth = fmt.GridCellHeight = 12;
fmt.DrawSecondaryPlot = TaskManagerSettings.ShowKernelTimes; fmt.DrawSecondaryPlot = TaskManagerSettings.ShowKernelTimes;
bGraph = GraphCtrl_Create(&PerformancePageCpuUsageHistoryGraph, hPerformancePageCpuUsageHistoryGraph, hDlg, &fmt);
if (!bGraph) /* Retrieve the size of the single original CPU graph control,
* that will serve as our overall CPU graph area where the
* per-CPU graph panels will reside. */
GetWindowRect(hCpuUsageHistoryGraph, &rcCpuGraphArea);
MapWindowPoints(NULL, hDlg, (LPPOINT)&rcCpuGraphArea, sizeof(RECT) / sizeof(POINT));
/* Initialize the number of total CPU history graph panes to the number of CPUs on the system */
CpuTotalPanes = PerfDataGetProcessorCount();
/* Initialize the CPU history graph panes */
if (CpuTotalPanes > 1)
{ {
EndDialog(hDlg, 0); /*
return FALSE; * Inherit the characteristics of the new per-CPU graph panes
* from the main original one, and create their corresponding panes.
*/
LPCWSTR lpClassAtom = (LPCWSTR)GetClassLongPtrW(hCpuUsageHistoryGraph, GCW_ATOM);
DWORD dwExStyle = GetWindowLongPtrW(hCpuUsageHistoryGraph, GWL_EXSTYLE);
DWORD dwStyle = GetWindowLongPtrW(hCpuUsageHistoryGraph, GWL_STYLE);
HWND hwndParent = GetParent(hCpuUsageHistoryGraph);
HWND hwndCPU;
ULONG i;
CpuUsageHistoryGraphs = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
sizeof(TM_GRAPH_CONTROL) * CpuTotalPanes);
if (!CpuUsageHistoryGraphs)
goto oneCPUGraph; /* Fall back to one graph for all CPUs */
/* Initialize the first entry for CPU #0 */
bGraph = GraphCtrl_Create(&CpuUsageHistoryGraphs[0], hCpuUsageHistoryGraph, hDlg, &fmt);
if (!bGraph)
{
/* Ignore graph creation failure (may happen under low memory resources) */
// CpuUsageHistoryGraphs[0].hWnd = hCpuUsageHistoryGraph;
// NOTHING;
}
/* Start the loop at 1 for the other CPUs */
ASSERT(CpuTotalPanes <= MAXWORD);
for (i = 1; i < CpuTotalPanes; ++i)
{
/* Allocate a new window, inheriting its class and style
* from the single original CPU graph control. Its actual
* position will be determined at the first WM_SIZE event
* after the property sheet page gets created. */
hwndCPU = CreateWindowExW(dwExStyle, lpClassAtom, L"CPU Graph", dwStyle,
rcCpuGraphArea.left, rcCpuGraphArea.top,
0, 0,
hwndParent,
/* Specifies child ID */
(HMENU)ULongToHandle(MAKELONG(IDC_CPU_USAGE_HISTORY_GRAPH, (WORD)i)),
hInst, NULL);
if (!hwndCPU)
continue;
bGraph = GraphCtrl_Create(&CpuUsageHistoryGraphs[i], hwndCPU, hDlg, &fmt);
if (!bGraph)
{
/* Ignore graph creation failure (may happen under low memory resources) */
// CpuUsageHistoryGraphs[i].hWnd = hwndCPU;
// NOTHING;
}
ShowWindow(hwndCPU, TaskManagerSettings.CPUHistory_OneGraphPerCPU ? SW_SHOW : SW_HIDE);
}
}
else
{
HMENU hCPUHistoryMenu;
oneCPUGraph:
/* Fall back to one graph for all CPUs */
CpuTotalPanes = 1;
CpuUsageHistoryGraphs = &CpuUsageHistoryGraph;
bGraph = GraphCtrl_Create(&CpuUsageHistoryGraphs[0], hCpuUsageHistoryGraph, hDlg, &fmt);
if (!bGraph)
{
/* Ignore graph creation failure (may happen under low memory resources) */
// NOTHING;
}
/* Select one graph for all CPUs and disable the per-CPU graph menu item */
PerformancePage_OnViewCPUHistoryGraph(TRUE);
hCPUHistoryMenu = GetSubMenu(GetSubMenu(GetMenu(hMainWnd), 2), 3);
EnableMenuItem(hCPUHistoryMenu, ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU, MF_BYCOMMAND | MF_DISABLED);
} }
fmt.clrPlot0 = RGB(255, 255, 0); fmt.clrPlot0 = RGB(255, 255, 0);
fmt.clrPlot1 = RGB(100, 255, 255); fmt.clrPlot1 = RGB(100, 255, 255);
fmt.DrawSecondaryPlot = TRUE; fmt.DrawSecondaryPlot = TRUE;
bGraph = GraphCtrl_Create(&PerformancePageMemUsageHistoryGraph, hPerformancePageMemUsageHistoryGraph, hDlg, &fmt); bGraph = GraphCtrl_Create(&MemUsageHistoryGraph, hMemUsageHistoryGraph, hDlg, &fmt);
if (!bGraph) if (!bGraph)
{ {
EndDialog(hDlg, 0); /* Ignore graph creation failure (may happen under low memory resources) */
return FALSE; // NOTHING;
} }
/* Start our refresh thread */
#ifdef RUN_PERF_PAGE
hPerformanceThread = CreateThread(NULL, 0, PerformancePageRefreshThread, NULL, 0, &dwPerformanceThread);
#endif
/*
* Subclass graph buttons
*/
OldGraphWndProc = (WNDPROC)SetWindowLongPtrW(hCpuUsageGraph, GWLP_WNDPROC, (LONG_PTR)Graph_WndProc);
SetWindowLongPtrW(hMemUsageGraph, GWLP_WNDPROC, (LONG_PTR)Graph_WndProc);
OldGraphCtrlWndProc = (WNDPROC)SetWindowLongPtrW(hPerformancePageMemUsageHistoryGraph, GWLP_WNDPROC, (LONG_PTR)GraphCtrl_WndProc);
SetWindowLongPtrW(hPerformancePageCpuUsageHistoryGraph, GWLP_WNDPROC, (LONG_PTR)GraphCtrl_WndProc);
return TRUE; return TRUE;
} }
case WM_COMMAND: case WM_DESTROY:
{
if (CpuUsageHistoryGraphs && (CpuUsageHistoryGraphs != &CpuUsageHistoryGraph))
{
ULONG i;
for (i = 0; i < CpuTotalPanes; ++i)
{
HWND hwnd = CpuUsageHistoryGraphs[i].hWnd;
GraphCtrl_Dispose(&CpuUsageHistoryGraphs[i]);
DestroyWindow(hwnd);
}
HeapFree(GetProcessHeap(), 0, CpuUsageHistoryGraphs);
CpuUsageHistoryGraphs = NULL;
}
GraphCtrl_Dispose(&CpuUsageHistoryGraph);
GraphCtrl_Dispose(&MemUsageHistoryGraph);
break; break;
}
case WM_DRAWITEM:
{
LPDRAWITEMSTRUCT drawItem = (LPDRAWITEMSTRUCT)lParam;
if (LOWORD(drawItem->CtlID) == IDC_CPU_USAGE_HISTORY_GRAPH)
{
ULONG i = HIWORD(drawItem->CtlID);
if ((i < CpuTotalPanes) &&
(drawItem->hwndItem == CpuUsageHistoryGraphs[i].hWnd))
{
GraphCtrl_OnDraw(drawItem->hwndItem,
&CpuUsageHistoryGraphs[i],
(WPARAM)drawItem->hDC, 0);
}
}
else if (drawItem->CtlID == IDC_MEM_USAGE_HISTORY_GRAPH)
{
ASSERT(drawItem->hwndItem == MemUsageHistoryGraph.hWnd);
GraphCtrl_OnDraw(drawItem->hwndItem,
&MemUsageHistoryGraph,
(WPARAM)drawItem->hDC, 0);
}
else if (drawItem->CtlID == IDC_CPU_USAGE_GRAPH)
{
Graph_DrawUsageGraph(drawItem->hwndItem,
&CpuUsageGraph,
(WPARAM)drawItem->hDC, 0);
}
else if (drawItem->CtlID == IDC_MEM_USAGE_GRAPH)
{
Graph_DrawUsageGraph(drawItem->hwndItem,
&MemUsageGraph,
(WPARAM)drawItem->hDC, 0);
}
break;
// return TRUE;
}
case WM_SIZE: case WM_SIZE:
{ {
int cx, cy; int cx, cy;
int nXDifference; int nXDifference;
int nYDifference; int nYDifference;
HDWP hdwp;
RECT rcClient;
ULONG CPUPanes;
ULONG i;
if (wParam == SIZE_MINIMIZED) if (wParam == SIZE_MINIMIZED)
return 0; return 0;
@ -211,36 +306,40 @@ PerformancePageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
nPerformancePageWidth = cx; nPerformancePageWidth = cx;
nPerformancePageHeight = cy; nPerformancePageHeight = cy;
/* Reposition the performance page's controls */ CPUPanes = (TaskManagerSettings.CPUHistory_OneGraphPerCPU ? CpuTotalPanes : 1);
AdjustFrameSize(hTotalsFrame, hDlg, 0, nYDifference, 0);
AdjustFrameSize(hCommitChargeFrame, hDlg, 0, nYDifference, 0);
AdjustFrameSize(hKernelMemoryFrame, hDlg, 0, nYDifference, 0);
AdjustFrameSize(hPhysicalMemoryFrame, hDlg, 0, nYDifference, 0);
AdjustCntrlPos(IDS_COMMIT_CHARGE_TOTAL, hDlg, 0, nYDifference);
AdjustCntrlPos(IDS_COMMIT_CHARGE_LIMIT, hDlg, 0, nYDifference);
AdjustCntrlPos(IDS_COMMIT_CHARGE_PEAK, hDlg, 0, nYDifference);
AdjustCntrlPos(IDS_KERNEL_MEMORY_TOTAL, hDlg, 0, nYDifference);
AdjustCntrlPos(IDS_KERNEL_MEMORY_PAGED, hDlg, 0, nYDifference);
AdjustCntrlPos(IDS_KERNEL_MEMORY_NONPAGED, hDlg, 0, nYDifference);
AdjustCntrlPos(IDS_PHYSICAL_MEMORY_TOTAL, hDlg, 0, nYDifference);
AdjustCntrlPos(IDS_PHYSICAL_MEMORY_AVAILABLE, hDlg, 0, nYDifference);
AdjustCntrlPos(IDS_PHYSICAL_MEMORY_SYSTEM_CACHE, hDlg, 0, nYDifference);
AdjustCntrlPos(IDS_TOTALS_HANDLE_COUNT, hDlg, 0, nYDifference);
AdjustCntrlPos(IDS_TOTALS_PROCESS_COUNT, hDlg, 0, nYDifference);
AdjustCntrlPos(IDS_TOTALS_THREAD_COUNT, hDlg, 0, nYDifference);
AdjustControlPosition(hCommitChargeTotalEdit, hDlg, 0, nYDifference); hdwp = BeginDeferWindowPos(16 + 12 + 6 + CPUPanes + 1);
AdjustControlPosition(hCommitChargeLimitEdit, hDlg, 0, nYDifference);
AdjustControlPosition(hCommitChargePeakEdit, hDlg, 0, nYDifference); /* Reposition the performance page's controls */
AdjustControlPosition(hKernelMemoryTotalEdit, hDlg, 0, nYDifference); AdjustCntrlPos(&hdwp, IDC_TOTALS_FRAME, hDlg, 0, nYDifference);
AdjustControlPosition(hKernelMemoryPagedEdit, hDlg, 0, nYDifference); AdjustCntrlPos(&hdwp, IDC_COMMIT_CHARGE_FRAME, hDlg, 0, nYDifference);
AdjustControlPosition(hKernelMemoryNonPagedEdit, hDlg, 0, nYDifference); AdjustCntrlPos(&hdwp, IDC_KERNEL_MEMORY_FRAME, hDlg, 0, nYDifference);
AdjustControlPosition(hPhysicalMemoryTotalEdit, hDlg, 0, nYDifference); AdjustCntrlPos(&hdwp, IDC_PHYSICAL_MEMORY_FRAME, hDlg, 0, nYDifference);
AdjustControlPosition(hPhysicalMemoryAvailableEdit, hDlg, 0, nYDifference); AdjustCntrlPos(&hdwp, IDS_COMMIT_CHARGE_TOTAL, hDlg, 0, nYDifference);
AdjustControlPosition(hPhysicalMemorySystemCacheEdit, hDlg, 0, nYDifference); AdjustCntrlPos(&hdwp, IDS_COMMIT_CHARGE_LIMIT, hDlg, 0, nYDifference);
AdjustControlPosition(hTotalsHandleCountEdit, hDlg, 0, nYDifference); AdjustCntrlPos(&hdwp, IDS_COMMIT_CHARGE_PEAK, hDlg, 0, nYDifference);
AdjustControlPosition(hTotalsProcessCountEdit, hDlg, 0, nYDifference); AdjustCntrlPos(&hdwp, IDS_KERNEL_MEMORY_TOTAL, hDlg, 0, nYDifference);
AdjustControlPosition(hTotalsThreadCountEdit, hDlg, 0, nYDifference); AdjustCntrlPos(&hdwp, IDS_KERNEL_MEMORY_PAGED, hDlg, 0, nYDifference);
AdjustCntrlPos(&hdwp, IDS_KERNEL_MEMORY_NONPAGED, hDlg, 0, nYDifference);
AdjustCntrlPos(&hdwp, IDS_PHYSICAL_MEMORY_TOTAL, hDlg, 0, nYDifference);
AdjustCntrlPos(&hdwp, IDS_PHYSICAL_MEMORY_AVAILABLE, hDlg, 0, nYDifference);
AdjustCntrlPos(&hdwp, IDS_PHYSICAL_MEMORY_SYSTEM_CACHE, hDlg, 0, nYDifference);
AdjustCntrlPos(&hdwp, IDS_TOTALS_HANDLE_COUNT, hDlg, 0, nYDifference);
AdjustCntrlPos(&hdwp, IDS_TOTALS_PROCESS_COUNT, hDlg, 0, nYDifference);
AdjustCntrlPos(&hdwp, IDS_TOTALS_THREAD_COUNT, hDlg, 0, nYDifference);
AdjustCntrlPos(&hdwp, IDC_COMMIT_CHARGE_TOTAL, hDlg, 0, nYDifference);
AdjustCntrlPos(&hdwp, IDC_COMMIT_CHARGE_LIMIT, hDlg, 0, nYDifference);
AdjustCntrlPos(&hdwp, IDC_COMMIT_CHARGE_PEAK, hDlg, 0, nYDifference);
AdjustCntrlPos(&hdwp, IDC_KERNEL_MEMORY_TOTAL, hDlg, 0, nYDifference);
AdjustCntrlPos(&hdwp, IDC_KERNEL_MEMORY_PAGED, hDlg, 0, nYDifference);
AdjustCntrlPos(&hdwp, IDC_KERNEL_MEMORY_NONPAGED, hDlg, 0, nYDifference);
AdjustCntrlPos(&hdwp, IDC_PHYSICAL_MEMORY_TOTAL, hDlg, 0, nYDifference);
AdjustCntrlPos(&hdwp, IDC_PHYSICAL_MEMORY_AVAILABLE, hDlg, 0, nYDifference);
AdjustCntrlPos(&hdwp, IDC_PHYSICAL_MEMORY_SYSTEM_CACHE, hDlg, 0, nYDifference);
AdjustCntrlPos(&hdwp, IDC_TOTALS_HANDLE_COUNT, hDlg, 0, nYDifference);
AdjustCntrlPos(&hdwp, IDC_TOTALS_THREAD_COUNT, hDlg, 0, nYDifference);
AdjustCntrlPos(&hdwp, IDC_TOTALS_PROCESS_COUNT, hDlg, 0, nYDifference);
nXDifference += lastX; nXDifference += lastX;
nYDifference += lastY; nYDifference += lastY;
@ -271,38 +370,129 @@ PerformancePageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
lastY--; lastY--;
} }
} }
AdjustFrameSize(hCpuUsageFrame, hDlg, nXDifference, nYDifference, 1);
AdjustFrameSize(hMemUsageFrame, hDlg, nXDifference, nYDifference, 2); AdjustFrameSize(&hdwp, GetDlgItem(hDlg, IDC_CPU_USAGE_FRAME), hDlg, nXDifference, nYDifference, 1);
AdjustFrameSize(hCpuUsageHistoryFrame, hDlg, nXDifference, nYDifference, 3); AdjustFrameSize(&hdwp, GetDlgItem(hDlg, IDC_MEM_USAGE_FRAME), hDlg, nXDifference, nYDifference, 2);
AdjustFrameSize(hMemUsageHistoryFrame, hDlg, nXDifference, nYDifference, 4); AdjustFrameSize(&hdwp, GetDlgItem(hDlg, IDC_CPU_USAGE_HISTORY_FRAME), hDlg, nXDifference, nYDifference, 3);
AdjustFrameSize(hCpuUsageGraph, hDlg, nXDifference, nYDifference, 1); AdjustFrameSize(&hdwp, GetDlgItem(hDlg, IDC_MEMORY_USAGE_HISTORY_FRAME), hDlg, nXDifference, nYDifference, 4);
AdjustFrameSize(hMemUsageGraph, hDlg, nXDifference, nYDifference, 2); AdjustFrameSize(&hdwp, hCpuUsageGraph, hDlg, nXDifference, nYDifference, 1);
AdjustFrameSize(hPerformancePageCpuUsageHistoryGraph, hDlg, nXDifference, nYDifference, 3); AdjustFrameSize(&hdwp, hMemUsageGraph, hDlg, nXDifference, nYDifference, 2);
AdjustFrameSize(hPerformancePageMemUsageHistoryGraph, hDlg, nXDifference, nYDifference, 4);
/* Lay out the CPU graphs */
// if (CPUPanes > 1)
{
int nWidth, nHeight;
/* Lay out the several CPU graphs in a grid-like manner */
rcCpuGraphArea.right += nXDifference;
rcCpuGraphArea.bottom += nYDifference / 2;
nWidth = (rcCpuGraphArea.right - rcCpuGraphArea.left) / min(CPUPanes, MAX_CPU_PER_LINE); // - GetSystemMetrics(SM_CXBORDER);
nHeight = (rcCpuGraphArea.bottom - rcCpuGraphArea.top) / (1 + (CPUPanes-1) / MAX_CPU_PER_LINE); // - GetSystemMetrics(SM_CYBORDER);
for (i = 0; i < CPUPanes; ++i)
{
hdwp = DeferWindowPos(hdwp,
CpuUsageHistoryGraphs[i].hWnd,
NULL,
rcCpuGraphArea.left + (i % MAX_CPU_PER_LINE) * nWidth,
rcCpuGraphArea.top + (i / MAX_CPU_PER_LINE) * nHeight,
nWidth,
nHeight,
SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOZORDER);
InvalidateRect(CpuUsageHistoryGraphs[i].hWnd, NULL, TRUE);
}
}
#if 0
else
{
/* The single CPU graph takes the whole CPU graph area */
AdjustFrameSize(&hdwp, CpuUsageHistoryGraphs[0].hWnd, hDlg, nXDifference, nYDifference, 3);
}
#endif
AdjustFrameSize(&hdwp, hMemUsageHistoryGraph, hDlg, nXDifference, nYDifference, 4);
if (hdwp)
EndDeferWindowPos(hdwp);
/* Resize the graphs */
for (i = 0; i < CPUPanes; ++i)
{
GetClientRect(CpuUsageHistoryGraphs[i].hWnd, &rcClient);
GraphCtrl_OnSize(CpuUsageHistoryGraphs[i].hWnd,
&CpuUsageHistoryGraphs[i],
wParam,
MAKELPARAM(rcClient.right - rcClient.left,
rcClient.bottom - rcClient.top));
}
GetClientRect(hMemUsageHistoryGraph, &rcClient);
GraphCtrl_OnSize(hMemUsageHistoryGraph,
&MemUsageHistoryGraph,
wParam,
MAKELPARAM(rcClient.right - rcClient.left,
rcClient.bottom - rcClient.top));
break; break;
} }
} }
return 0; return 0;
} }
void RefreshPerformancePage(void) static void
UpdatePerfStatusBar(
_In_ ULONG TotalProcesses,
_In_ ULONG CpuUsage,
_In_ ULONGLONG CommitChargeTotal,
_In_ ULONGLONG CommitChargeLimit)
{ {
#ifdef RUN_PERF_PAGE extern BOOL bTrackMenu; // From taskmgr.c
/* Signal the event so that our refresh thread
* will wake up and refresh the performance page */ static WCHAR szProcesses[256] = L"";
PostThreadMessage(dwPerformanceThread, WM_TIMER, 0, 0); static WCHAR szCpuUsage[256] = L"";
#endif static WCHAR szMemUsage[256] = L"";
WCHAR szChargeTotalFormat[256];
WCHAR szChargeLimitFormat[256];
WCHAR Text[260];
/* Do nothing if the status bar is used to show menu hints */
if (bTrackMenu)
return;
if (!*szProcesses)
LoadStringW(hInst, IDS_STATUS_PROCESSES, szProcesses, ARRAYSIZE(szProcesses));
if (!*szCpuUsage)
LoadStringW(hInst, IDS_STATUS_CPUUSAGE, szCpuUsage, ARRAYSIZE(szCpuUsage));
if (!*szMemUsage)
LoadStringW(hInst, IDS_STATUS_MEMUSAGE, szMemUsage, ARRAYSIZE(szMemUsage));
wsprintfW(Text, szProcesses, TotalProcesses);
SendMessageW(hStatusWnd, SB_SETTEXT, 0, (LPARAM)Text);
wsprintfW(Text, szCpuUsage, CpuUsage);
SendMessageW(hStatusWnd, SB_SETTEXT, 1, (LPARAM)Text);
StrFormatByteSizeW(CommitChargeTotal * 1024,
szChargeTotalFormat,
ARRAYSIZE(szChargeTotalFormat));
StrFormatByteSizeW(CommitChargeLimit * 1024,
szChargeLimitFormat,
ARRAYSIZE(szChargeLimitFormat));
wsprintfW(Text, szMemUsage, szChargeTotalFormat, szChargeLimitFormat,
(CommitChargeLimit ? ((CommitChargeTotal * 100) / CommitChargeLimit) : 0));
SendMessageW(hStatusWnd, SB_SETTEXT, 2, (LPARAM)Text);
} }
DWORD WINAPI PerformancePageRefreshThread(PVOID Parameter) void RefreshPerformancePage(void)
{ {
ULONGLONG CommitChargeTotal; ULONGLONG CommitChargeTotal;
ULONGLONG CommitChargeLimit; ULONGLONG CommitChargeLimit;
ULONGLONG CommitChargePeak; ULONGLONG CommitChargePeak;
ULONG CpuUsage;
ULONG CpuKernelUsage;
ULONGLONG KernelMemoryTotal; ULONGLONG KernelMemoryTotal;
ULONGLONG KernelMemoryPaged; ULONGLONG KernelMemoryPaged;
ULONGLONG KernelMemoryNonPaged; ULONGLONG KernelMemoryNonPaged;
@ -315,191 +505,194 @@ DWORD WINAPI PerformancePageRefreshThread(PVOID Parameter)
ULONG TotalThreads; ULONG TotalThreads;
ULONG TotalProcesses; ULONG TotalProcesses;
MSG msg; ULONG CpuUsage;
ULONG CpuKernelUsage;
ULONG i;
WCHAR Text[260]; WCHAR Text[260];
WCHAR szMemUsage[256], szCpuUsage[256], szProcesses[256];
LoadStringW(hInst, IDS_STATUS_CPUUSAGE, szCpuUsage, _countof(szCpuUsage)); int nBarsUsed1;
LoadStringW(hInst, IDS_STATUS_MEMUSAGE, szMemUsage, _countof(szMemUsage)); int nBarsUsed2;
LoadStringW(hInst, IDS_STATUS_PROCESSES, szProcesses, _countof(szProcesses));
while (1) /*
* Update the commit charge info
*/
PerfDataGetCommitChargeK(&CommitChargeTotal,
&CommitChargeLimit,
&CommitChargePeak);
_ui64tow(CommitChargeTotal, Text, 10);
SetDlgItemTextW(hPerformancePage, IDC_COMMIT_CHARGE_TOTAL, Text);
_ui64tow(CommitChargeLimit, Text, 10);
SetDlgItemTextW(hPerformancePage, IDC_COMMIT_CHARGE_LIMIT, Text);
_ui64tow(CommitChargePeak, Text, 10);
SetDlgItemTextW(hPerformancePage, IDC_COMMIT_CHARGE_PEAK, Text);
/*
* Update the kernel memory info
*/
PerfDataGetKernelMemoryK(&KernelMemoryTotal,
&KernelMemoryPaged,
&KernelMemoryNonPaged);
_ui64tow(KernelMemoryTotal, Text, 10);
SetDlgItemTextW(hPerformancePage, IDC_KERNEL_MEMORY_TOTAL, Text);
_ui64tow(KernelMemoryPaged, Text, 10);
SetDlgItemTextW(hPerformancePage, IDC_KERNEL_MEMORY_PAGED, Text);
_ui64tow(KernelMemoryNonPaged, Text, 10);
SetDlgItemTextW(hPerformancePage, IDC_KERNEL_MEMORY_NONPAGED, Text);
/*
* Update the physical memory info
*/
PerfDataGetPhysicalMemoryK(&PhysicalMemoryTotal,
&PhysicalMemoryAvailable,
&PhysicalMemorySystemCache);
_ui64tow(PhysicalMemoryTotal, Text, 10);
SetDlgItemTextW(hPerformancePage, IDC_PHYSICAL_MEMORY_TOTAL, Text);
_ui64tow(PhysicalMemoryAvailable, Text, 10);
SetDlgItemTextW(hPerformancePage, IDC_PHYSICAL_MEMORY_AVAILABLE, Text);
_ui64tow(PhysicalMemorySystemCache, Text, 10);
SetDlgItemTextW(hPerformancePage, IDC_PHYSICAL_MEMORY_SYSTEM_CACHE, Text);
/*
* Update the totals info
*/
TotalHandles = PerfDataGetSystemHandleCount();
TotalThreads = PerfDataGetTotalThreadCount();
TotalProcesses = PerfDataGetProcessCount();
_ultow(TotalHandles, Text, 10);
SetDlgItemTextW(hPerformancePage, IDC_TOTALS_HANDLE_COUNT, Text);
_ultow(TotalThreads, Text, 10);
SetDlgItemTextW(hPerformancePage, IDC_TOTALS_THREAD_COUNT, Text);
_ultow(TotalProcesses, Text, 10);
SetDlgItemTextW(hPerformancePage, IDC_TOTALS_PROCESS_COUNT, Text);
/*
* Get the CPU usage
*/
CpuUsage = PerfDataGetProcessorUsage();
CpuKernelUsage = PerfDataGetProcessorSystemUsage();
if (CpuUsageHistoryGraphs)
{ {
extern BOOL bTrackMenu; // From taskmgr.c PerfDataAcquireLock();
int nBarsUsed1; for (i = 0; i < CpuTotalPanes; ++i)
int nBarsUsed2;
WCHAR szChargeTotalFormat[256];
WCHAR szChargeLimitFormat[256];
/* Wait for an the event or application close */
if (GetMessage(&msg, NULL, 0, 0) <= 0)
return 0;
if (msg.message == WM_TIMER)
{ {
/* GraphCtrl_AddPoint(&CpuUsageHistoryGraphs[i],
* Update the commit charge info PerfDataGetProcessorUsagePerCPU(i),
*/ PerfDataGetProcessorSystemUsagePerCPU(i));
CommitChargeTotal = PerfDataGetCommitChargeTotalK(); InvalidateRect(CpuUsageHistoryGraphs[i].hWnd, NULL, FALSE);
CommitChargeLimit = PerfDataGetCommitChargeLimitK();
CommitChargePeak = PerfDataGetCommitChargePeakK();
_ultow(CommitChargeTotal, Text, 10);
SetWindowTextW(hCommitChargeTotalEdit, Text);
_ultow(CommitChargeLimit, Text, 10);
SetWindowTextW(hCommitChargeLimitEdit, Text);
_ultow(CommitChargePeak, Text, 10);
SetWindowTextW(hCommitChargePeakEdit, Text);
StrFormatByteSizeW(CommitChargeTotal * 1024,
szChargeTotalFormat,
_countof(szChargeTotalFormat));
StrFormatByteSizeW(CommitChargeLimit * 1024,
szChargeLimitFormat,
_countof(szChargeLimitFormat));
if (!bTrackMenu)
{
wsprintfW(Text, szMemUsage, szChargeTotalFormat, szChargeLimitFormat,
(CommitChargeLimit ? ((CommitChargeTotal * 100) / CommitChargeLimit) : 0));
SendMessageW(hStatusWnd, SB_SETTEXT, 2, (LPARAM)Text);
}
/*
* Update the kernel memory info
*/
KernelMemoryTotal = PerfDataGetKernelMemoryTotalK();
KernelMemoryPaged = PerfDataGetKernelMemoryPagedK();
KernelMemoryNonPaged = PerfDataGetKernelMemoryNonPagedK();
_ultow(KernelMemoryTotal, Text, 10);
SetWindowTextW(hKernelMemoryTotalEdit, Text);
_ultow(KernelMemoryPaged, Text, 10);
SetWindowTextW(hKernelMemoryPagedEdit, Text);
_ultow(KernelMemoryNonPaged, Text, 10);
SetWindowTextW(hKernelMemoryNonPagedEdit, Text);
/*
* Update the physical memory info
*/
PhysicalMemoryTotal = PerfDataGetPhysicalMemoryTotalK();
PhysicalMemoryAvailable = PerfDataGetPhysicalMemoryAvailableK();
PhysicalMemorySystemCache = PerfDataGetPhysicalMemorySystemCacheK();
_ultow(PhysicalMemoryTotal, Text, 10);
SetWindowTextW(hPhysicalMemoryTotalEdit, Text);
_ultow(PhysicalMemoryAvailable, Text, 10);
SetWindowTextW(hPhysicalMemoryAvailableEdit, Text);
_ultow(PhysicalMemorySystemCache, Text, 10);
SetWindowTextW(hPhysicalMemorySystemCacheEdit, Text);
/*
* Update the totals info
*/
TotalHandles = PerfDataGetSystemHandleCount();
TotalThreads = PerfDataGetTotalThreadCount();
TotalProcesses = PerfDataGetProcessCount();
_ultow(TotalHandles, Text, 10);
SetWindowTextW(hTotalsHandleCountEdit, Text);
_ultow(TotalThreads, Text, 10);
SetWindowTextW(hTotalsThreadCountEdit, Text);
_ultow(TotalProcesses, Text, 10);
SetWindowTextW(hTotalsProcessCountEdit, Text);
if (!bTrackMenu)
{
wsprintfW(Text, szProcesses, TotalProcesses);
SendMessageW(hStatusWnd, SB_SETTEXT, 0, (LPARAM)Text);
}
/*
* Redraw the graphs
*/
InvalidateRect(hCpuUsageGraph, NULL, FALSE);
InvalidateRect(hMemUsageGraph, NULL, FALSE);
/*
* Get the CPU usage
*/
CpuUsage = PerfDataGetProcessorUsage();
CpuKernelUsage = PerfDataGetProcessorSystemUsage();
if (!bTrackMenu)
{
wsprintfW(Text, szCpuUsage, CpuUsage);
SendMessageW(hStatusWnd, SB_SETTEXT, 1, (LPARAM)Text);
}
/*
* Get the memory usage
*/
CommitChargeTotal = PerfDataGetCommitChargeTotalK();
CommitChargeLimit = PerfDataGetCommitChargeLimitK();
nBarsUsed1 = CommitChargeLimit ? ((CommitChargeTotal * 100) / CommitChargeLimit) : 0;
PhysicalMemoryTotal = PerfDataGetPhysicalMemoryTotalK();
PhysicalMemoryAvailable = PerfDataGetPhysicalMemoryAvailableK();
nBarsUsed2 = PhysicalMemoryTotal ? ((PhysicalMemoryAvailable * 100) / PhysicalMemoryTotal) : 0;
GraphCtrl_AddPoint(&PerformancePageCpuUsageHistoryGraph, CpuUsage, CpuKernelUsage);
GraphCtrl_AddPoint(&PerformancePageMemUsageHistoryGraph, nBarsUsed1, nBarsUsed2);
InvalidateRect(hPerformancePageMemUsageHistoryGraph, NULL, FALSE);
InvalidateRect(hPerformancePageCpuUsageHistoryGraph, NULL, FALSE);
} }
PerfDataReleaseLock();
} }
return 0; else
{
GraphCtrl_AddPoint(&CpuUsageHistoryGraph, CpuUsage, CpuKernelUsage);
InvalidateRect(CpuUsageHistoryGraph.hWnd, NULL, FALSE);
}
/*
* Update the graphs
*/
nBarsUsed1 = CommitChargeLimit ? ((CommitChargeTotal * 100) / CommitChargeLimit) : 0;
nBarsUsed2 = PhysicalMemoryTotal ? ((PhysicalMemoryAvailable * 100) / PhysicalMemoryTotal) : 0;
// nBarsUsed2 = PhysicalMemoryTotal ? (((PhysicalMemoryTotal - PhysicalMemoryAvailable) * 100) / PhysicalMemoryTotal) : 0;
GraphCtrl_AddPoint(&MemUsageHistoryGraph, nBarsUsed1, nBarsUsed2);
// CpuUsageGraph.Maximum = 100;
CpuUsageGraph.Current1 = CpuUsage;
CpuUsageGraph.Current2 = CpuKernelUsage;
//
// TODO: The memory gauge may show the commit charge (Win2000/XP/2003),
// or show the **physical** memory amount (Windows Vista+). Have something
// to set the preference...
//
Meter_CommitChargeTotal = (PhysicalMemoryTotal - PhysicalMemoryAvailable); // CommitChargeTotal;
Meter_CommitChargeLimit = PhysicalMemoryTotal; // CommitChargeLimit;
// MemUsageGraph.Maximum = Meter_CommitChargeLimit;
if (Meter_CommitChargeLimit)
MemUsageGraph.Current1 = (ULONG)((Meter_CommitChargeTotal * 100) / Meter_CommitChargeLimit);
else
MemUsageGraph.Current1 = 0;
/* Update the status bar */
UpdatePerfStatusBar(TotalProcesses, CpuUsage, CommitChargeTotal, CommitChargeLimit);
/** Down below, that's what we do IIF we are actually active and need to repaint stuff **/
/*
* Redraw the graphs
*/
InvalidateRect(hCpuUsageGraph, NULL, FALSE);
InvalidateRect(hMemUsageGraph, NULL, FALSE);
// InvalidateRect(CpuUsageHistoryGraph.hwndGraph, NULL, FALSE);
#if 0
for (i = 0; i < (TaskManagerSettings.CPUHistory_OneGraphPerCPU ? CpuTotalPanes : 1); ++i)
{
InvalidateRect(CpuUsageHistoryGraphs[i].hWnd, NULL, FALSE);
}
#endif
InvalidateRect(hMemUsageHistoryGraph, NULL, FALSE);
} }
void PerformancePage_OnViewShowKernelTimes(void) void PerformancePage_OnViewShowKernelTimes(void)
{ {
HMENU hMenu;
HMENU hViewMenu; HMENU hViewMenu;
ULONG i;
hMenu = GetMenu(hMainWnd); hViewMenu = GetSubMenu(GetMenu(hMainWnd), 2);
hViewMenu = GetSubMenu(hMenu, 2);
/* Check or uncheck the show 16-bit tasks menu item */ /* Check or uncheck the show kernel times menu item */
if (GetMenuState(hViewMenu, ID_VIEW_SHOWKERNELTIMES, MF_BYCOMMAND) & MF_CHECKED) if (GetMenuState(hViewMenu, ID_VIEW_SHOWKERNELTIMES, MF_BYCOMMAND) & MF_CHECKED)
{ {
CheckMenuItem(hViewMenu, ID_VIEW_SHOWKERNELTIMES, MF_BYCOMMAND|MF_UNCHECKED); CheckMenuItem(hViewMenu, ID_VIEW_SHOWKERNELTIMES, MF_BYCOMMAND|MF_UNCHECKED);
TaskManagerSettings.ShowKernelTimes = FALSE; TaskManagerSettings.ShowKernelTimes = FALSE;
PerformancePageCpuUsageHistoryGraph.DrawSecondaryPlot = FALSE;
} }
else else
{ {
CheckMenuItem(hViewMenu, ID_VIEW_SHOWKERNELTIMES, MF_BYCOMMAND|MF_CHECKED); CheckMenuItem(hViewMenu, ID_VIEW_SHOWKERNELTIMES, MF_BYCOMMAND|MF_CHECKED);
TaskManagerSettings.ShowKernelTimes = TRUE; TaskManagerSettings.ShowKernelTimes = TRUE;
PerformancePageCpuUsageHistoryGraph.DrawSecondaryPlot = TRUE;
} }
GraphCtrl_RedrawBitmap(&PerformancePageCpuUsageHistoryGraph, PerformancePageCpuUsageHistoryGraph.BitmapHeight); for (i = 0; i < CpuTotalPanes; ++i)
{
CpuUsageHistoryGraphs[i].DrawSecondaryPlot = TaskManagerSettings.ShowKernelTimes;
GraphCtrl_RedrawBitmap(&CpuUsageHistoryGraphs[i], CpuUsageHistoryGraphs[i].BitmapHeight);
}
RefreshPerformancePage(); RefreshPerformancePage();
} }
void PerformancePage_OnViewCPUHistoryOneGraphAll(void) VOID
PerformancePage_OnViewCPUHistoryGraph(
_In_ BOOL bShowAll)
{ {
HMENU hMenu;
HMENU hViewMenu;
HMENU hCPUHistoryMenu; HMENU hCPUHistoryMenu;
ULONG i;
hMenu = GetMenu(hMainWnd); hCPUHistoryMenu = GetSubMenu(GetSubMenu(GetMenu(hMainWnd), 2), 3);
hViewMenu = GetSubMenu(hMenu, 2);
hCPUHistoryMenu = GetSubMenu(hViewMenu, 3);
TaskManagerSettings.CPUHistory_OneGraphPerCPU = FALSE; TaskManagerSettings.CPUHistory_OneGraphPerCPU = !bShowAll;
CheckMenuRadioItem(hCPUHistoryMenu, ID_VIEW_CPUHISTORY_ONEGRAPHALL, ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU, ID_VIEW_CPUHISTORY_ONEGRAPHALL, MF_BYCOMMAND); CheckMenuRadioItem(hCPUHistoryMenu,
} ID_VIEW_CPUHISTORY_ONEGRAPHALL,
ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU,
void PerformancePage_OnViewCPUHistoryOneGraphPerCPU(void) bShowAll ? ID_VIEW_CPUHISTORY_ONEGRAPHALL
{ : ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU,
HMENU hMenu; MF_BYCOMMAND);
HMENU hViewMenu;
HMENU hCPUHistoryMenu; /* Start the loop at 1 for the other CPUs; always keep the first CPU pane around */
// ShowWindow(CpuUsageHistoryGraphs[0].hwndGraph, SW_SHOW);
hMenu = GetMenu(hMainWnd); for (i = 1; i < CpuTotalPanes; ++i)
hViewMenu = GetSubMenu(hMenu, 2); {
hCPUHistoryMenu = GetSubMenu(hViewMenu, 3); ShowWindow(CpuUsageHistoryGraphs[i].hWnd, TaskManagerSettings.CPUHistory_OneGraphPerCPU ? SW_SHOW : SW_HIDE);
}
TaskManagerSettings.CPUHistory_OneGraphPerCPU = TRUE;
CheckMenuRadioItem(hCPUHistoryMenu, ID_VIEW_CPUHISTORY_ONEGRAPHALL, ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU, ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU, MF_BYCOMMAND); // RefreshPerformancePage();
} }

View file

@ -12,5 +12,11 @@ INT_PTR CALLBACK PerformancePageWndProc(HWND hDlg, UINT message, WPARAM wParam,
void RefreshPerformancePage(void); void RefreshPerformancePage(void);
void PerformancePage_OnViewShowKernelTimes(void); void PerformancePage_OnViewShowKernelTimes(void);
void PerformancePage_OnViewCPUHistoryOneGraphAll(void);
void PerformancePage_OnViewCPUHistoryOneGraphPerCPU(void); VOID
PerformancePage_OnViewCPUHistoryGraph(
_In_ BOOL bShowAll);
#ifdef __cplusplus
};
#endif

View file

@ -16,6 +16,9 @@
#include <stdlib.h> #include <stdlib.h>
#include <stdarg.h> #include <stdarg.h>
#include <assert.h>
#define ASSERT assert
#define WIN32_NO_STATUS #define WIN32_NO_STATUS
#include <windef.h> #include <windef.h>
@ -33,8 +36,9 @@
#include "column.h" #include "column.h"
#include "taskmgr.h" #include "taskmgr.h"
#include "perfdata.h" #include "perfdata.h"
#include "procpage.h"
#include "applpage.h" #include "applpage.h"
#include "procpage.h"
#include "perfpage.h"
#include "endproc.h" #include "endproc.h"
#include "graph.h" #include "graph.h"
#include "graphctl.h" #include "graphctl.h"

View file

@ -33,10 +33,6 @@ BOOL bProcessPageSelectionMade = FALSE; /* Is item in ListCtrl selected */
static int nProcessPageWidth; static int nProcessPageWidth;
static int nProcessPageHeight; static int nProcessPageHeight;
#ifdef RUN_PROC_PAGE
static HANDLE hProcessThread = NULL;
static DWORD dwProcessThread;
#endif
int CALLBACK ProcessPageCompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort); int CALLBACK ProcessPageCompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);
void AddProcess(ULONG Index); void AddProcess(ULONG Index);
@ -45,7 +41,7 @@ void gethmsfromlargeint(LARGE_INTEGER largeint, DWORD *dwHours, DWORD *dwMinutes
void ProcessPageOnNotify(WPARAM wParam, LPARAM lParam); void ProcessPageOnNotify(WPARAM wParam, LPARAM lParam);
void ProcessPageShowContextMenu(DWORD dwProcessId); void ProcessPageShowContextMenu(DWORD dwProcessId);
BOOL PerfDataGetText(ULONG Index, ULONG ColumnIndex, LPTSTR lpText, ULONG nMaxCount); BOOL PerfDataGetText(ULONG Index, ULONG ColumnIndex, LPTSTR lpText, ULONG nMaxCount);
DWORD WINAPI ProcessPageRefreshThread(void *lpParameter); DWORD WINAPI ProcessPageRefreshThread(PVOID Parameter);
int ProcessRunning(ULONG ProcessId); int ProcessRunning(ULONG ProcessId);
void Cleanup(void) void Cleanup(void)
@ -158,22 +154,12 @@ ProcessPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
*/ */
OldProcessListWndProc = (WNDPROC)SetWindowLongPtrW(hProcessPageListCtrl, GWLP_WNDPROC, (LONG_PTR)ProcessListWndProc); OldProcessListWndProc = (WNDPROC)SetWindowLongPtrW(hProcessPageListCtrl, GWLP_WNDPROC, (LONG_PTR)ProcessListWndProc);
#ifdef RUN_PROC_PAGE
/* Start our refresh thread */
hProcessThread = CreateThread(NULL, 0, ProcessPageRefreshThread, NULL, 0, &dwProcessThread);
#endif
/* Refresh page */ /* Refresh page */
ProcessPageUpdate(); ProcessPageUpdate();
return TRUE; return TRUE;
case WM_DESTROY: case WM_DESTROY:
/* Close the event handle, this will make the */
/* refresh thread exit when the wait fails */
#ifdef RUN_PROC_PAGE
EndLocalThread(&hProcessThread, dwProcessThread);
#endif
SaveColumnSettings(); SaveColumnSettings();
Cleanup(); Cleanup();
break; break;
@ -447,24 +433,21 @@ void ProcessPageShowContextMenu(DWORD dwProcessId)
void RefreshProcessPage(void) void RefreshProcessPage(void)
{ {
#ifdef RUN_PROC_PAGE ProcessPageRefreshThread(NULL);
/* Signal the event so that our refresh thread */
/* will wake up and refresh the process page */
PostThreadMessage(dwProcessThread, WM_TIMER, 0, 0);
#endif
} }
DWORD WINAPI ProcessPageRefreshThread(void *lpParameter) DWORD WINAPI ProcessPageRefreshThread(PVOID Parameter)
{ {
MSG msg; //MSG msg;
while (1) { //while (1)
/* Wait for an the event or application close */ {
if (GetMessage(&msg, NULL, 0, 0) <= 0) ///* Wait for an the event or application close */
return 0; //if (GetMessage(&msg, NULL, 0, 0) <= 0)
// return 0;
if (msg.message == WM_TIMER) {
//if (msg.message == WM_TIMER)
{
UpdateProcesses(); UpdateProcesses();
if (IsWindowVisible(hProcessPage)) if (IsWindowVisible(hProcessPage))

View file

@ -122,8 +122,8 @@
#define IDC_MEM_USAGE_GRAPH2 1048 #define IDC_MEM_USAGE_GRAPH2 1048
#define IDC_MEM_USAGE_GRAPH 1048 #define IDC_MEM_USAGE_GRAPH 1048
#define IDC_CPU30 1049 #define IDC_CPU30 1049
#define IDC_MEM_USAGE_HISTORY_GRAPH 1049 #define IDC_CPU_USAGE_HISTORY_GRAPH 1049
#define IDC_CPU_USAGE_HISTORY_GRAPH 1050 #define IDC_MEM_USAGE_HISTORY_GRAPH 1050
#define IDC_CPU31 1051 #define IDC_CPU31 1051
#define IDS_TOTALS_HANDLE_COUNT 1060 #define IDS_TOTALS_HANDLE_COUNT 1060

View file

@ -233,10 +233,10 @@ TaskManagerWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
PerformancePage_OnViewShowKernelTimes(); PerformancePage_OnViewShowKernelTimes();
break; break;
case ID_VIEW_CPUHISTORY_ONEGRAPHALL: case ID_VIEW_CPUHISTORY_ONEGRAPHALL:
PerformancePage_OnViewCPUHistoryOneGraphAll(); PerformancePage_OnViewCPUHistoryGraph(TRUE);
break; break;
case ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU: case ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU:
PerformancePage_OnViewCPUHistoryOneGraphPerCPU(); PerformancePage_OnViewCPUHistoryGraph(FALSE);
break; break;
case ID_VIEW_UPDATESPEED_HIGH: case ID_VIEW_UPDATESPEED_HIGH:
case ID_VIEW_UPDATESPEED_NORMAL: case ID_VIEW_UPDATESPEED_NORMAL:
@ -497,7 +497,8 @@ void FillSolidRect(HDC hDC, LPCRECT lpRect, COLORREF clr)
static void SetUpdateSpeed(HWND hWnd) static void SetUpdateSpeed(HWND hWnd)
{ {
/* Setup update speed (pause=fall down) */ /* Setup update speed (pause=fall down) */
switch (TaskManagerSettings.UpdateSpeed) { switch (TaskManagerSettings.UpdateSpeed)
{
case ID_VIEW_UPDATESPEED_HIGH: case ID_VIEW_UPDATESPEED_HIGH:
SetTimer(hWnd, 1, 500, NULL); SetTimer(hWnd, 1, 500, NULL);
break; break;
@ -693,9 +694,8 @@ BOOL OnCreate(HWND hWnd)
SetUpdateSpeed(hWnd); SetUpdateSpeed(hWnd);
/* /*
* Refresh the performance data * Refresh the performance data. Sample it twice
* Sample it twice so we can establish * so we can establish the delta values & cpu usage.
* the delta values & cpu usage
*/ */
PerfDataRefresh(); PerfDataRefresh();
PerfDataRefresh(); PerfDataRefresh();
@ -1106,6 +1106,7 @@ LPWSTR GetLastErrorText(LPWSTR lpszBuf, DWORD dwSize)
return lpszBuf; return lpszBuf;
} }
#if 0
DWORD EndLocalThread(HANDLE *hThread, DWORD dwThread) DWORD EndLocalThread(HANDLE *hThread, DWORD dwThread)
{ {
DWORD dwExitCodeThread = 0; DWORD dwExitCodeThread = 0;
@ -1128,4 +1129,4 @@ DWORD EndLocalThread(HANDLE *hThread, DWORD dwThread)
} }
return dwExitCodeThread; return dwExitCodeThread;
} }
#endif

View file

@ -9,10 +9,6 @@
#include "resource.h" #include "resource.h"
#define RUN_APPS_PAGE
#define RUN_PROC_PAGE
#define RUN_PERF_PAGE
#define STATUS_WINDOW 2001 #define STATUS_WINDOW 2001
#define STATUS_SIZE1 85 #define STATUS_SIZE1 85
#define STATUS_SIZE2 157 // he-IL.rc determines minimum width: 72 == 157 - 85 #define STATUS_SIZE2 157 // he-IL.rc determines minimum width: 72 == 157 - 85