VOID PhSipTickCpuDialog( VOID ) { ULONG64 dpcCount; ULONG i; dpcCount = 0; if (NT_SUCCESS(NtQuerySystemInformation( SystemInterruptInformation, InterruptInformation, sizeof(SYSTEM_INTERRUPT_INFORMATION) * NumberOfProcessors, NULL ))) { for (i = 0; i < NumberOfProcessors; i++) dpcCount += InterruptInformation[i].DpcCount; } PhUpdateDelta(&ContextSwitchesDelta, PhPerfInformation.ContextSwitches); PhUpdateDelta(&InterruptsDelta, PhCpuTotals.InterruptCount); PhUpdateDelta(&DpcsDelta, dpcCount); PhUpdateDelta(&SystemCallsDelta, PhPerfInformation.SystemCalls); if (!NT_SUCCESS(NtPowerInformation( ProcessorInformation, NULL, 0, PowerInformation, sizeof(PROCESSOR_POWER_INFORMATION) * NumberOfProcessors ))) { memset(PowerInformation, 0, sizeof(PROCESSOR_POWER_INFORMATION) * NumberOfProcessors); } if (WindowsVersion >= WINDOWS_7) { if (PreviousPerformanceDistribution) PhFree(PreviousPerformanceDistribution); PreviousPerformanceDistribution = CurrentPerformanceDistribution; CurrentPerformanceDistribution = NULL; PhSipQueryProcessorPerformanceDistribution(&CurrentPerformanceDistribution); } CpuTicked++; if (CpuTicked > 2) CpuTicked = 2; PhSipUpdateCpuGraphs(); PhSipUpdateCpuPanel(); }
INT_PTR CALLBACK PhSipCpuDialogProc( _In_ HWND hwndDlg, _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam ) { switch (uMsg) { case WM_INITDIALOG: { PPH_LAYOUT_ITEM graphItem; PPH_LAYOUT_ITEM panelItem; WCHAR brandString[49]; PhSipInitializeCpuDialog(); CpuDialog = hwndDlg; PhInitializeLayoutManager(&CpuLayoutManager, hwndDlg); PhAddLayoutItem(&CpuLayoutManager, GetDlgItem(hwndDlg, IDC_CPUNAME), NULL, PH_ANCHOR_LEFT | PH_ANCHOR_TOP | PH_ANCHOR_RIGHT | PH_LAYOUT_FORCE_INVALIDATE); graphItem = PhAddLayoutItem(&CpuLayoutManager, GetDlgItem(hwndDlg, IDC_GRAPH_LAYOUT), NULL, PH_ANCHOR_ALL); CpuGraphMargin = graphItem->Margin; panelItem = PhAddLayoutItem(&CpuLayoutManager, GetDlgItem(hwndDlg, IDC_LAYOUT), NULL, PH_ANCHOR_LEFT | PH_ANCHOR_RIGHT | PH_ANCHOR_BOTTOM); SendMessage(GetDlgItem(hwndDlg, IDC_TITLE), WM_SETFONT, (WPARAM)CpuSection->Parameters->LargeFont, FALSE); SendMessage(GetDlgItem(hwndDlg, IDC_CPUNAME), WM_SETFONT, (WPARAM)CpuSection->Parameters->MediumFont, FALSE); PhSipGetCpuBrandString(brandString); SetDlgItemText(hwndDlg, IDC_CPUNAME, brandString); CpuPanel = CreateDialog(PhInstanceHandle, MAKEINTRESOURCE(IDD_SYSINFO_CPUPANEL), hwndDlg, PhSipCpuPanelDialogProc); ShowWindow(CpuPanel, SW_SHOW); PhAddLayoutItemEx(&CpuLayoutManager, CpuPanel, NULL, PH_ANCHOR_LEFT | PH_ANCHOR_RIGHT | PH_ANCHOR_BOTTOM, panelItem->Margin); PhSipCreateCpuGraphs(); if (NumberOfProcessors != 1) { OneGraphPerCpu = (BOOLEAN)PhGetIntegerSetting(L"SysInfoWindowOneGraphPerCpu"); Button_SetCheck(GetDlgItem(CpuPanel, IDC_ONEGRAPHPERCPU), OneGraphPerCpu ? BST_CHECKED : BST_UNCHECKED); PhSipSetOneGraphPerCpu(); } else { OneGraphPerCpu = FALSE; EnableWindow(GetDlgItem(CpuPanel, IDC_ONEGRAPHPERCPU), FALSE); PhSipSetOneGraphPerCpu(); } PhSipUpdateCpuGraphs(); PhSipUpdateCpuPanel(); } break; case WM_DESTROY: { PhDeleteLayoutManager(&CpuLayoutManager); } break; case WM_SIZE: { PhLayoutManagerLayout(&CpuLayoutManager); PhSipLayoutCpuGraphs(); } break; case WM_NOTIFY: { NMHDR *header = (NMHDR *)lParam; ULONG i; if (header->hwndFrom == CpuGraphHandle) { PhSipNotifyCpuGraph(-1, header); } else { for (i = 0; i < NumberOfProcessors; i++) { if (header->hwndFrom == CpusGraphHandle[i]) { PhSipNotifyCpuGraph(i, header); break; } } } } break; } return FALSE; }