#include #include #include #include #include #include #include #include "pperf.h" #include "..\pstat.h" extern UCHAR Buffer[]; extern PDISPLAY_ITEM Calc1, Calc2; extern PDISPLAY_ITEM PerfGraphList; extern ULONG NumberOfProcessors; extern BOOL LazyOp; #define BufferSize 60000 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 }; INT_PTR CALLBACK CalcDlgProc( HWND hDlg, unsigned int message, WPARAM wParam, LPARAM lParam ) { PDISPLAY_ITEM pPerf; UINT ButtonState; UINT Index, i; switch (message) { case WM_INITDIALOG: Buffer[BufferSize - 1] = 0; _snprintf (Buffer, BufferSize - 1, "A. %s", Calc1->PerfName); SetDlgItemText(hDlg, IDM_CALC_TEXTA, Buffer); _snprintf (Buffer, BufferSize - 1, "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; pPerf->DispName[sizeof(pPerf->DispName) - 1] = 0; _snprintf (pPerf->DispName, sizeof(pPerf->DispName) - 1, "%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 ) { // for now use same type _snprintf (pPerf->PerfName, sizeof(pPerf->PerfName) - 1, "%d %%of %d", Calc1->CalcId, Calc2->CalcId); pPerf->PerfName[sizeof(pPerf->PerfName) - 1] = 0; pPerf->SnapData = SnapPercent; pPerf->IsPercent = TRUE; pPerf->AutoTotal = FALSE; pPerf->MaxToUse = &StaticPercentScale; pPerf->DisplayMode= DISPLAY_MODE_TOTAL; } VOID InitSum ( IN OUT PDISPLAY_ITEM pPerf ) { // for now use same type _snprintf (pPerf->PerfName, sizeof(pPerf->PerfName) - 1, "Sum %d+%d", Calc1->CalcId, Calc2->CalcId); pPerf->PerfName[sizeof(pPerf->PerfName) - 1] = 0; 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]; } }