Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

228 lines
5.0 KiB

  1. #include <nt.h>
  2. #include <ntrtl.h>
  3. #include <nturtl.h>
  4. #include <windows.h>
  5. #include <errno.h>
  6. #include <malloc.h>
  7. #include <stdio.h>
  8. #include "pperf.h"
  9. #include "..\pstat.h"
  10. extern UCHAR Buffer[];
  11. extern PDISPLAY_ITEM Calc1, Calc2;
  12. extern PDISPLAY_ITEM PerfGraphList;
  13. extern ULONG NumberOfProcessors;
  14. extern BOOL LazyOp;
  15. VOID AssignCalcId (PDISPLAY_ITEM pPerf);
  16. PDISPLAY_ITEM LookUpCalcId (IN ULONG id);
  17. VOID SnapPercent (PDISPLAY_ITEM);
  18. VOID SnapSum (PDISPLAY_ITEM);
  19. VOID InitPercent (PDISPLAY_ITEM);
  20. VOID InitSum (PDISPLAY_ITEM);
  21. ULONG StaticPercentScale = 10000;
  22. ULONG CalcSort = 300000;
  23. VOID (*InitCalc[])(PDISPLAY_ITEM) = {
  24. InitPercent, InitSum, InitPercent, InitPercent
  25. };
  26. BOOL
  27. APIENTRY CalcDlgProc(
  28. HWND hDlg,
  29. unsigned message,
  30. DWORD wParam,
  31. LONG lParam
  32. )
  33. {
  34. PDISPLAY_ITEM pPerf;
  35. UINT ButtonState;
  36. UINT Index, i;
  37. switch (message) {
  38. case WM_INITDIALOG:
  39. sprintf (Buffer, "A. %s", Calc1->PerfName);
  40. SetDlgItemText(hDlg, IDM_CALC_TEXTA, Buffer);
  41. sprintf (Buffer, "B. %s", Calc2->PerfName);
  42. SetDlgItemText(hDlg, IDM_CALC_TEXTB, Buffer);
  43. return (TRUE);
  44. case WM_COMMAND:
  45. switch(wParam) {
  46. case IDOK:
  47. if (Calc1 && Calc2) {
  48. for (i=IDM_CALC_FORM1; i <= IDM_CALC_FORM4; i++) {
  49. if (SendDlgItemMessage(hDlg,i,BM_GETCHECK,0,0)) {
  50. // found selected form type
  51. i = i - IDM_CALC_FORM1;
  52. AssignCalcId (Calc1);
  53. AssignCalcId (Calc2);
  54. pPerf = AllocateDisplayItem();
  55. pPerf->CalcPercentId[0] = Calc1->CalcId;
  56. pPerf->CalcPercentId[1] = Calc2->CalcId;
  57. pPerf->SnapParam1 = i;
  58. pPerf->IsCalc = TRUE;
  59. InitCalc[i](pPerf);
  60. SetDisplayToTrue (pPerf, CalcSort++);
  61. RefitWindows(NULL, NULL);
  62. break;
  63. }
  64. }
  65. }
  66. EndDialog(hDlg, DIALOG_SUCCESS);
  67. return (TRUE);
  68. case IDCANCEL:
  69. EndDialog(hDlg, DIALOG_CANCEL );
  70. return (TRUE);
  71. }
  72. }
  73. return (FALSE);
  74. }
  75. VOID
  76. AssignCalcId (
  77. IN OUT PDISPLAY_ITEM pPerf
  78. )
  79. {
  80. PDISPLAY_ITEM p;
  81. ULONG l;
  82. if (pPerf->CalcId) {
  83. return ;
  84. }
  85. l = 0;
  86. for (p=PerfGraphList; p; p=p->Next) {
  87. if (p->CalcId > l) {
  88. l = p->CalcId;
  89. }
  90. }
  91. pPerf->CalcId = l + 1;
  92. sprintf (pPerf->DispName, "%d. %s", l+1, pPerf->PerfName);
  93. pPerf->DispNameLen = strlen(pPerf->DispName);
  94. }
  95. PDISPLAY_ITEM
  96. LookUpCalcId (
  97. IN ULONG id
  98. )
  99. {
  100. PDISPLAY_ITEM p;
  101. for (p=PerfGraphList; p; p=p->Next) {
  102. if (p->CalcId == id) {
  103. return p;
  104. }
  105. }
  106. return NULL;
  107. }
  108. VOID
  109. InitPercent (
  110. IN OUT PDISPLAY_ITEM pPerf
  111. )
  112. {
  113. // bugbug.. for now use same type
  114. sprintf (pPerf->PerfName, "%d %%of %d",
  115. Calc1->CalcId, Calc2->CalcId);
  116. pPerf->SnapData = SnapPercent;
  117. pPerf->IsPercent = TRUE;
  118. pPerf->AutoTotal = FALSE;
  119. pPerf->MaxToUse = &StaticPercentScale;
  120. pPerf->DisplayMode= DISPLAY_MODE_TOTAL;
  121. }
  122. VOID
  123. InitSum (
  124. IN OUT PDISPLAY_ITEM pPerf
  125. )
  126. {
  127. // bugbug.. for now use same type
  128. sprintf (pPerf->PerfName, "Sum %d+%d",
  129. Calc1->CalcId, Calc2->CalcId);
  130. pPerf->SnapData = SnapSum;
  131. }
  132. VOID
  133. SnapPercent (
  134. IN OUT PDISPLAY_ITEM pPerf
  135. )
  136. {
  137. PDISPLAY_ITEM p1, p2;
  138. ULONG i, l, l1, l2;
  139. p1 = pPerf->CalcPercent[0];
  140. p2 = pPerf->CalcPercent[1];
  141. if (p1 == NULL || p2 == NULL) {
  142. p1 = pPerf->CalcPercent[0] = LookUpCalcId (pPerf->CalcPercentId[0]);
  143. p2 = pPerf->CalcPercent[1] = LookUpCalcId (pPerf->CalcPercentId[1]);
  144. if (p1 == NULL || p2 == NULL) {
  145. LazyOp = TRUE;
  146. pPerf->DeleteMe = TRUE;
  147. return;
  148. }
  149. }
  150. l1 = p1->DataList[0][0];
  151. l2 = p2->DataList[0][0];
  152. if (l1 > 0x60000) {
  153. l2 = l2 / 10000;
  154. } else {
  155. l1 = l1 * 10000;
  156. }
  157. if (l2) {
  158. pPerf->CurrentDataPoint[0] = l1 / l2;
  159. } else {
  160. pPerf->CurrentDataPoint[0] = 0;
  161. }
  162. }
  163. VOID
  164. SnapSum (
  165. IN OUT PDISPLAY_ITEM pPerf
  166. )
  167. {
  168. PDISPLAY_ITEM p1, p2;
  169. ULONG i, l, l1, l2;
  170. p1 = pPerf->CalcPercent[0];
  171. p2 = pPerf->CalcPercent[1];
  172. if (p1 == NULL || p2 == NULL) {
  173. p1 = pPerf->CalcPercent[0] = LookUpCalcId (pPerf->CalcPercentId[0]);
  174. p2 = pPerf->CalcPercent[1] = LookUpCalcId (pPerf->CalcPercentId[1]);
  175. if (p1 == NULL || p2 == NULL) {
  176. LazyOp = TRUE;
  177. pPerf->DeleteMe = TRUE;
  178. return;
  179. }
  180. }
  181. for (i=0; i < NumberOfProcessors; i++) {
  182. pPerf->CurrentDataPoint[i+1] =
  183. p1->CurrentDataPoint[i+1] + p2->CurrentDataPoint[i+1];
  184. }
  185. }
  186.