229 lines
5 KiB
C
229 lines
5 KiB
C
#include <nt.h>
|
||
#include <ntrtl.h>
|
||
#include <nturtl.h>
|
||
#include <windows.h>
|
||
#include <errno.h>
|
||
#include <malloc.h>
|
||
#include <stdio.h>
|
||
#include "pperf.h"
|
||
#include "..\pstat.h"
|
||
|
||
extern UCHAR Buffer[];
|
||
extern PDISPLAY_ITEM Calc1, Calc2;
|
||
extern PDISPLAY_ITEM PerfGraphList;
|
||
extern ULONG NumberOfProcessors;
|
||
extern BOOL LazyOp;
|
||
|
||
VOID AssignCalcId (PDISPLAY_ITEM pPerf);
|
||
PDISPLAY_ITEM LookUpCalcId (IN ULONG id);
|
||
|
||
|
||
VOID SnapPercent (PDISPLAY_ITEM);
|
||
VOID SnapSum (PDISPLAY_ITEM);
|
||
VOID InitPercent (PDISPLAY_ITEM);
|
||
VOID InitSum (PDISPLAY_ITEM);
|
||
|
||
ULONG StaticPercentScale = 10000;
|
||
ULONG CalcSort = 300000;
|
||
|
||
VOID (*InitCalc[])(PDISPLAY_ITEM) = {
|
||
InitPercent, InitSum, InitPercent, InitPercent
|
||
};
|
||
|
||
|
||
BOOL
|
||
APIENTRY CalcDlgProc(
|
||
HWND hDlg,
|
||
unsigned message,
|
||
DWORD wParam,
|
||
LONG lParam
|
||
)
|
||
{
|
||
PDISPLAY_ITEM pPerf;
|
||
UINT ButtonState;
|
||
UINT Index, i;
|
||
|
||
switch (message) {
|
||
case WM_INITDIALOG:
|
||
sprintf (Buffer, "A. %s", Calc1->PerfName);
|
||
SetDlgItemText(hDlg, IDM_CALC_TEXTA, Buffer);
|
||
|
||
sprintf (Buffer, "B. %s", Calc2->PerfName);
|
||
SetDlgItemText(hDlg, IDM_CALC_TEXTB, Buffer);
|
||
return (TRUE);
|
||
|
||
case WM_COMMAND:
|
||
|
||
switch(wParam) {
|
||
case IDOK:
|
||
if (Calc1 && Calc2) {
|
||
for (i=IDM_CALC_FORM1; i <= IDM_CALC_FORM4; i++) {
|
||
if (SendDlgItemMessage(hDlg,i,BM_GETCHECK,0,0)) {
|
||
// found selected form type
|
||
i = i - IDM_CALC_FORM1;
|
||
|
||
AssignCalcId (Calc1);
|
||
AssignCalcId (Calc2);
|
||
|
||
pPerf = AllocateDisplayItem();
|
||
pPerf->CalcPercentId[0] = Calc1->CalcId;
|
||
pPerf->CalcPercentId[1] = Calc2->CalcId;
|
||
pPerf->SnapParam1 = i;
|
||
pPerf->IsCalc = TRUE;
|
||
InitCalc[i](pPerf);
|
||
|
||
SetDisplayToTrue (pPerf, CalcSort++);
|
||
RefitWindows(NULL, NULL);
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
EndDialog(hDlg, DIALOG_SUCCESS);
|
||
return (TRUE);
|
||
|
||
case IDCANCEL:
|
||
EndDialog(hDlg, DIALOG_CANCEL );
|
||
return (TRUE);
|
||
}
|
||
}
|
||
return (FALSE);
|
||
}
|
||
|
||
|
||
VOID
|
||
AssignCalcId (
|
||
IN OUT PDISPLAY_ITEM pPerf
|
||
)
|
||
{
|
||
PDISPLAY_ITEM p;
|
||
ULONG l;
|
||
|
||
if (pPerf->CalcId) {
|
||
return ;
|
||
}
|
||
|
||
l = 0;
|
||
for (p=PerfGraphList; p; p=p->Next) {
|
||
if (p->CalcId > l) {
|
||
l = p->CalcId;
|
||
}
|
||
}
|
||
|
||
pPerf->CalcId = l + 1;
|
||
sprintf (pPerf->DispName, "%d. %s", l+1, pPerf->PerfName);
|
||
pPerf->DispNameLen = strlen(pPerf->DispName);
|
||
}
|
||
|
||
|
||
PDISPLAY_ITEM
|
||
LookUpCalcId (
|
||
IN ULONG id
|
||
)
|
||
{
|
||
PDISPLAY_ITEM p;
|
||
|
||
for (p=PerfGraphList; p; p=p->Next) {
|
||
if (p->CalcId == id) {
|
||
return p;
|
||
}
|
||
}
|
||
return NULL;
|
||
}
|
||
|
||
|
||
|
||
VOID
|
||
InitPercent (
|
||
IN OUT PDISPLAY_ITEM pPerf
|
||
)
|
||
{
|
||
// bugbug.. for now use same type
|
||
sprintf (pPerf->PerfName, "%d %%of %d",
|
||
Calc1->CalcId, Calc2->CalcId);
|
||
|
||
pPerf->SnapData = SnapPercent;
|
||
pPerf->IsPercent = TRUE;
|
||
pPerf->AutoTotal = FALSE;
|
||
pPerf->MaxToUse = &StaticPercentScale;
|
||
pPerf->DisplayMode= DISPLAY_MODE_TOTAL;
|
||
}
|
||
|
||
|
||
VOID
|
||
InitSum (
|
||
IN OUT PDISPLAY_ITEM pPerf
|
||
)
|
||
{
|
||
// bugbug.. for now use same type
|
||
sprintf (pPerf->PerfName, "Sum %d+%d",
|
||
Calc1->CalcId, Calc2->CalcId);
|
||
|
||
pPerf->SnapData = SnapSum;
|
||
}
|
||
|
||
|
||
VOID
|
||
SnapPercent (
|
||
IN OUT PDISPLAY_ITEM pPerf
|
||
)
|
||
{
|
||
PDISPLAY_ITEM p1, p2;
|
||
ULONG i, l, l1, l2;
|
||
|
||
p1 = pPerf->CalcPercent[0];
|
||
p2 = pPerf->CalcPercent[1];
|
||
if (p1 == NULL || p2 == NULL) {
|
||
p1 = pPerf->CalcPercent[0] = LookUpCalcId (pPerf->CalcPercentId[0]);
|
||
p2 = pPerf->CalcPercent[1] = LookUpCalcId (pPerf->CalcPercentId[1]);
|
||
|
||
if (p1 == NULL || p2 == NULL) {
|
||
LazyOp = TRUE;
|
||
pPerf->DeleteMe = TRUE;
|
||
return;
|
||
}
|
||
}
|
||
|
||
l1 = p1->DataList[0][0];
|
||
l2 = p2->DataList[0][0];
|
||
|
||
if (l1 > 0x60000) {
|
||
l2 = l2 / 10000;
|
||
} else {
|
||
l1 = l1 * 10000;
|
||
}
|
||
|
||
if (l2) {
|
||
pPerf->CurrentDataPoint[0] = l1 / l2;
|
||
} else {
|
||
pPerf->CurrentDataPoint[0] = 0;
|
||
}
|
||
}
|
||
|
||
|
||
VOID
|
||
SnapSum (
|
||
IN OUT PDISPLAY_ITEM pPerf
|
||
)
|
||
{
|
||
PDISPLAY_ITEM p1, p2;
|
||
ULONG i, l, l1, l2;
|
||
|
||
p1 = pPerf->CalcPercent[0];
|
||
p2 = pPerf->CalcPercent[1];
|
||
if (p1 == NULL || p2 == NULL) {
|
||
p1 = pPerf->CalcPercent[0] = LookUpCalcId (pPerf->CalcPercentId[0]);
|
||
p2 = pPerf->CalcPercent[1] = LookUpCalcId (pPerf->CalcPercentId[1]);
|
||
|
||
if (p1 == NULL || p2 == NULL) {
|
||
LazyOp = TRUE;
|
||
pPerf->DeleteMe = TRUE;
|
||
return;
|
||
}
|
||
}
|
||
|
||
for (i=0; i < NumberOfProcessors; i++) {
|
||
pPerf->CurrentDataPoint[i+1] =
|
||
p1->CurrentDataPoint[i+1] + p2->CurrentDataPoint[i+1];
|
||
}
|
||
}
|
||
|