Index: ProcessHacker/ProcessHacker.rc =================================================================== --- ProcessHacker/ProcessHacker.rc (revision 3742) +++ ProcessHacker/ProcessHacker.rc (working copy) @@ -1291,10 +1291,10 @@ LTEXT "Write Bytes",IDC_STATIC,262,37,38,8 LTEXT "Other",IDC_STATIC,262,47,20,8 LTEXT "Other Bytes",IDC_STATIC,262,56,40,8 - GROUPBOX "CPU",IDC_STATIC,255,71,132,40 - LTEXT "Context Switches",IDC_STATIC,262,81,57,8 - LTEXT "Interrupts",IDC_STATIC,262,90,34,8 - LTEXT "System Calls",IDC_STATIC,262,99,41,8 + GROUPBOX "CPU",IDC_STATIC,255,71,132,53 + LTEXT "Context Switches",IDC_STATIC,262,91,57,8 + LTEXT "Interrupts",IDC_STATIC,262,100,34,8 + LTEXT "System Calls",IDC_STATIC,262,110,41,8 RTEXT "Static",IDC_ZPROCESSES_V,57,10,50,8,SS_ENDELLIPSIS RTEXT "Static",IDC_ZTHREADS_V,50,19,57,8,SS_ENDELLIPSIS RTEXT "Static",IDC_ZHANDLES_V,45,28,62,8,SS_ENDELLIPSIS @@ -1324,9 +1324,11 @@ RTEXT "Static",IDC_ZIOWRITEBYTES_V,313,37,67,8,SS_ENDELLIPSIS RTEXT "Static",IDC_ZIOOTHER_V,313,47,67,8,SS_ENDELLIPSIS RTEXT "Static",IDC_ZIOOTHERBYTES_V,313,56,67,8,SS_ENDELLIPSIS - RTEXT "Static",IDC_ZCONTEXTSWITCHES_V,326,81,54,8,SS_ENDELLIPSIS - RTEXT "Static",IDC_ZINTERRUPTS_V,326,90,54,8,SS_ENDELLIPSIS - RTEXT "Static",IDC_ZSYSTEMCALLS_V,326,99,54,8,SS_ENDELLIPSIS + RTEXT "Static",IDC_ZCONTEXTSWITCHES_V,326,91,54,8,SS_ENDELLIPSIS + RTEXT "Static",IDC_ZINTERRUPTS_V,326,100,54,8,SS_ENDELLIPSIS + RTEXT "Static",IDC_ZSYSTEMCALLS_V,326,110,54,8,SS_ENDELLIPSIS + LTEXT "Cycles",IDC_STATIC,262,81,22,8 + RTEXT "Static",IDC_ZCYCLES_V,298,81,82,8,SS_ENDELLIPSIS END IDD_GDIHANDLES DIALOGEX 0, 0, 351, 307 Index: ProcessHacker/sysinfo.c =================================================================== --- ProcessHacker/sysinfo.c (revision 3742) +++ ProcessHacker/sysinfo.c (working copy) @@ -68,6 +68,8 @@ static PH_GRAPH_STATE PhysicalGraphState; static PPH_GRAPH_STATE CpusGraphState; +static PULARGE_INTEGER CpuCyclesBlock = NULL; + static BOOLEAN MmAddressesInitialized = FALSE; static PSIZE_T MmSizeOfPagedPoolInBytes = NULL; static PSIZE_T MmMaximumNonPagedPoolInBytes = NULL; @@ -413,6 +415,12 @@ PhDeleteGraphState(&IoGraphState); PhDeleteGraphState(&PhysicalGraphState); + if (CpuCyclesBlock) + { + PhFree(CpuCyclesBlock); + CpuCyclesBlock = NULL; + } + PhSetIntegerSetting(L"SysInfoWindowAlwaysOnTop", AlwaysOnTop); PhSetIntegerSetting(L"SysInfoWindowOneGraphPerCpu", OneGraphPerCpu); @@ -1241,6 +1249,43 @@ // CPU + if (WINDOWS_HAS_CYCLE_TIME) + { + ULONG blockSize; + + blockSize = sizeof(ULARGE_INTEGER) * (ULONG)PhSystemBasicInformation.NumberOfProcessors; + + if (!CpuCyclesBlock) + CpuCyclesBlock = PhAllocate(blockSize); + + if (NT_SUCCESS(NtQuerySystemInformation( + SystemProcessorCycleTimeInformation, + CpuCyclesBlock, + blockSize, + NULL + ))) + { + ULONG64 total; + ULONG i; + + total = 0; + + for (i = 0; i < (ULONG)PhSystemBasicInformation.NumberOfProcessors; i++) + total += CpuCyclesBlock[i].QuadPart; + + SetDlgItemText(hwndDlg, IDC_ZCYCLES_V, + PhaFormatUInt64(total, TRUE)->Buffer); + } + else + { + SetDlgItemText(hwndDlg, IDC_ZCYCLES_V, L"Unknown"); + } + } + else + { + SetDlgItemText(hwndDlg, IDC_ZCYCLES_V, L"N/A"); + } + SetDlgItemText(hwndDlg, IDC_ZCONTEXTSWITCHES_V, PhaFormatUInt64(PhPerfInformation.ContextSwitches, TRUE)->Buffer); SetDlgItemText(hwndDlg, IDC_ZINTERRUPTS_V,