diff --git a/2.x/trunk/ProcessHacker/ProcessHacker.rc b/2.x/trunk/ProcessHacker/ProcessHacker.rc index a36900e6f..c9616b2e9 100644 --- a/2.x/trunk/ProcessHacker/ProcessHacker.rc +++ b/2.x/trunk/ProcessHacker/ProcessHacker.rc @@ -1163,90 +1163,81 @@ BEGIN CONTROL "Hide unnamed handles",IDC_HIDEUNNAMEDHANDLES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,31,88,10 END -IDD_SYSINFO_PANEL DIALOGEX 0, 0, 387, 170 +IDD_SYSINFO_PANEL DIALOGEX 0, 0, 387, 148 STYLE DS_SETFONT | DS_FIXEDSYS | DS_CONTROL | WS_CHILD | WS_SYSMENU FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN - GROUPBOX "System",IDC_STATIC,0,0,114,58 - LTEXT "Processes",IDC_STATIC,10,12,33,8 - LTEXT "Threads",IDC_STATIC,9,23,27,8 - LTEXT "Handles",IDC_STATIC,8,34,26,8 - LTEXT "Uptime",IDC_STATIC,9,44,23,8 - GROUPBOX "Commit Charge",IDC_STATIC,0,61,114,52 - LTEXT "Current",IDC_STATIC,10,74,26,8 - LTEXT "Peak",IDC_STATIC,9,88,16,8 - LTEXT "Limit",IDC_STATIC,9,98,15,8 - GROUPBOX "Physical Memory",IDC_STATIC,0,119,113,46 - LTEXT "Current",IDC_STATIC,8,128,26,8 - LTEXT "System Cache",IDC_STATIC,8,138,46,8 - LTEXT "Total",IDC_STATIC,8,149,17,8 - GROUPBOX "File Cache",IDC_STATIC,119,0,131,53 - LTEXT "Current",IDC_STATIC,125,11,26,8 - LTEXT "Peak",IDC_STATIC,125,20,16,8 - LTEXT "Minimum",IDC_STATIC,125,29,28,8 - LTEXT "Maximum",IDC_STATIC,125,39,30,8 - GROUPBOX "Kernel Pools",IDC_STATIC,119,58,131,107 - LTEXT "Paged Phys.",IDC_STATIC,126,69,41,8 - LTEXT "Paged Virt.",IDC_STATIC,126,81,36,8 - LTEXT "Paged Allocs",IDC_STATIC,126,92,41,8 - LTEXT "Paged Frees",IDC_STATIC,125,102,41,8 - LTEXT "Paged Limit",IDC_STATIC,125,112,37,8 - LTEXT "Non-Paged Usage",IDC_STATIC,126,121,58,8 - LTEXT "Non-Paged Allocs",IDC_STATIC,126,131,56,8 - LTEXT "Non-Paged Frees",IDC_STATIC,125,140,56,8 - LTEXT "Non-Paged Limit",IDC_STATIC,125,150,52,8 - GROUPBOX "Page Faults",IDC_STATIC,255,0,132,54 - LTEXT "Total",IDC_STATIC,262,10,17,8 - LTEXT "Copy-on-write",IDC_STATIC,262,20,47,8 - LTEXT "Transition",IDC_STATIC,261,29,32,8 - LTEXT "Cache",IDC_STATIC,261,39,21,8 - GROUPBOX "I/O",IDC_STATIC,255,57,132,69 - LTEXT "Reads",IDC_STATIC,261,67,21,8 - LTEXT "Read Bytes",IDC_STATIC,261,76,38,8 - LTEXT "Writes",IDC_STATIC,261,85,22,8 - LTEXT "Write Bytes",IDC_STATIC,261,95,38,8 - LTEXT "Other",IDC_STATIC,261,104,20,8 - LTEXT "Other Bytes",IDC_STATIC,261,113,40,8 - GROUPBOX "CPU",IDC_STATIC,255,132,132,38 - LTEXT "Context Switches",IDC_STATIC,263,138,57,8 - LTEXT "Interrupts",IDC_STATIC,263,148,34,8 - LTEXT "System Calls",IDC_STATIC,263,157,41,8 - RTEXT "Static",IDC_ZPROCESSES_V,87,13,19,8,SS_ENDELLIPSIS - RTEXT "Static",IDC_ZTHREADS_V,87,24,19,8,SS_ENDELLIPSIS - RTEXT "Static",IDC_ZHANDLES_V,86,35,19,8,SS_ENDELLIPSIS - RTEXT "Static",IDC_ZUPTIME_V,86,45,19,8,SS_ENDELLIPSIS - RTEXT "Static",IDC_ZCOMMITCURRENT_V,86,73,19,8,SS_ENDELLIPSIS - RTEXT "Static",IDC_ZCOMMITPEAK_V,87,86,19,8,SS_ENDELLIPSIS - RTEXT "Static",IDC_ZCOMMITLIMIT_V,86,98,19,8,SS_ENDELLIPSIS - RTEXT "Static",IDC_ZPHYSICALCURRENT_V,88,128,19,8,SS_ENDELLIPSIS - RTEXT "Static",IDC_ZPHYSICALSYSTEMCACHE_V,88,139,19,8,SS_ENDELLIPSIS - RTEXT "Static",IDC_ZPHYSICALTOTAL_V,87,149,19,8,SS_ENDELLIPSIS - RTEXT "Static",IDC_ZFILECACHECURRENT_V,222,11,19,8,SS_ENDELLIPSIS - RTEXT "Static",IDC_ZFILECACHEPEAK_V,222,21,19,8,SS_ENDELLIPSIS - RTEXT "Static",IDC_ZFILECACHEMINIMUM_V,222,30,19,8,SS_ENDELLIPSIS - RTEXT "Static",IDC_ZFILECACHEMAXIMUM_V,221,39,19,8,SS_ENDELLIPSIS - RTEXT "Static",IDC_ZPAGEDPHYSICAL_V,221,70,19,8,SS_ENDELLIPSIS - RTEXT "Static",IDC_ZPAGEDVIRTUAL_V,221,79,19,8,SS_ENDELLIPSIS - RTEXT "Static",IDC_ZPAGEDALLOCS_V,220,91,19,8,SS_ENDELLIPSIS - RTEXT "Static",IDC_ZPAGEDFREES_V,219,102,19,8,SS_ENDELLIPSIS - RTEXT "Static",IDC_ZPAGEDLIMIT_V,220,111,19,8,SS_ENDELLIPSIS - RTEXT "Static",IDC_ZNONPAGEDUSAGE_V,220,122,19,8,SS_ENDELLIPSIS - RTEXT "Static",IDC_ZNONPAGEDALLOCS_V,220,133,19,8,SS_ENDELLIPSIS - RTEXT "Static",IDC_ZNONPAGEDFREES_V,220,142,19,8,SS_ENDELLIPSIS - RTEXT "Static",IDC_ZNONPAGEDLIMIT_V,220,150,19,8,SS_ENDELLIPSIS - RTEXT "Static",IDC_ZPAGEFAULTSTOTAL_V,361,9,19,8,SS_ENDELLIPSIS - RTEXT "Static",IDC_ZPAGEFAULTSCOPYONWRITE_V,361,18,19,8,SS_ENDELLIPSIS - RTEXT "Static",IDC_ZPAGEFAULTSTRANSITION_V,360,29,19,8,SS_ENDELLIPSIS - RTEXT "Static",IDC_ZPAGEFAULTSCACHE_V,360,39,19,8,SS_ENDELLIPSIS - RTEXT "Static",IDC_ZIOREADS_V,361,64,19,8,SS_ENDELLIPSIS - RTEXT "Static",IDC_ZIOREADBYTES_V,360,74,19,8,SS_ENDELLIPSIS - RTEXT "Static",IDC_ZIOWRITES_V,360,84,19,8,SS_ENDELLIPSIS - RTEXT "Static",IDC_ZIOWRITEBYTES_V,360,93,19,8,SS_ENDELLIPSIS - RTEXT "Static",IDC_ZIOOTHER_V,360,102,19,8,SS_ENDELLIPSIS - RTEXT "Static",IDC_ZIOOTHERBYTES_V,360,111,19,8,SS_ENDELLIPSIS - RTEXT "Static",IDC_ZCONTEXTSWITCHES_V,361,137,19,8,SS_ENDELLIPSIS - RTEXT "Static",IDC_ZINTERRUPTS_V,361,147,19,8,SS_ENDELLIPSIS - RTEXT "Static",IDC_ZSYSTEMCALLS_V,362,156,19,8,SS_ENDELLIPSIS + GROUPBOX "System",IDC_STATIC,0,0,114,50 + LTEXT "Processes",IDC_STATIC,7,10,33,8 + LTEXT "Threads",IDC_STATIC,7,19,27,8 + LTEXT "Handles",IDC_STATIC,7,28,26,8 + LTEXT "Uptime",IDC_STATIC,7,37,23,8 + GROUPBOX "Commit Charge",IDC_STATIC,0,52,114,41 + LTEXT "Current",IDC_STATIC,7,62,26,8 + LTEXT "Peak",IDC_STATIC,7,71,16,8 + LTEXT "Limit",IDC_STATIC,7,80,15,8 + GROUPBOX "Physical Memory",IDC_STATIC,0,96,113,41 + LTEXT "Current",IDC_STATIC,7,106,26,8 + LTEXT "System Cache",IDC_STATIC,7,115,46,8 + LTEXT "Total",IDC_STATIC,7,124,17,8 + GROUPBOX "Kernel Pools",IDC_STATIC,119,0,131,96 + LTEXT "Paged Phys.",IDC_STATIC,126,10,41,8 + LTEXT "Paged Virt.",IDC_STATIC,126,19,36,8 + LTEXT "Paged Allocs",IDC_STATIC,126,28,41,8 + LTEXT "Paged Frees",IDC_STATIC,126,37,41,8 + LTEXT "Paged Limit",IDC_STATIC,126,47,37,8 + LTEXT "Non-Paged Usage",IDC_STATIC,126,56,58,8 + LTEXT "Non-Paged Allocs",IDC_STATIC,126,66,56,8 + LTEXT "Non-Paged Frees",IDC_STATIC,126,75,56,8 + LTEXT "Non-Paged Limit",IDC_STATIC,126,84,52,8 + GROUPBOX "Page Faults",IDC_STATIC,119,98,132,50 + LTEXT "Total",IDC_STATIC,126,108,17,8 + LTEXT "Copy-on-write",IDC_STATIC,126,117,47,8 + LTEXT "Transition",IDC_STATIC,126,126,32,8 + LTEXT "Cache",IDC_STATIC,126,135,21,8 + GROUPBOX "I/O",IDC_STATIC,255,0,132,69 + LTEXT "Reads",IDC_STATIC,262,10,21,8 + LTEXT "Read Bytes",IDC_STATIC,262,19,38,8 + LTEXT "Writes",IDC_STATIC,262,28,22,8 + 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 + 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 + RTEXT "Static",IDC_ZUPTIME_V,40,37,67,8,SS_ENDELLIPSIS + RTEXT "Static",IDC_ZCOMMITCURRENT_V,44,62,63,8,SS_ENDELLIPSIS + RTEXT "Static",IDC_ZCOMMITPEAK_V,44,71,63,8,SS_ENDELLIPSIS + RTEXT "Static",IDC_ZCOMMITLIMIT_V,44,80,63,8,SS_ENDELLIPSIS + RTEXT "Static",IDC_ZPHYSICALCURRENT_V,59,106,48,8,SS_ENDELLIPSIS + RTEXT "Static",IDC_ZPHYSICALSYSTEMCACHE_V,59,115,48,8,SS_ENDELLIPSIS + RTEXT "Static",IDC_ZPHYSICALTOTAL_V,59,124,48,8,SS_ENDELLIPSIS + RTEXT "Static",IDC_ZPAGEDPHYSICAL_V,193,10,51,8,SS_ENDELLIPSIS + RTEXT "Static",IDC_ZPAGEDVIRTUAL_V,193,19,51,8,SS_ENDELLIPSIS + RTEXT "Static",IDC_ZPAGEDALLOCS_V,193,28,51,8,SS_ENDELLIPSIS + RTEXT "Static",IDC_ZPAGEDFREES_V,193,37,51,8,SS_ENDELLIPSIS + RTEXT "Static",IDC_ZPAGEDLIMIT_V,193,47,51,8,SS_ENDELLIPSIS + RTEXT "Static",IDC_ZNONPAGEDUSAGE_V,193,56,51,8,SS_ENDELLIPSIS + RTEXT "Static",IDC_ZNONPAGEDALLOCS_V,193,66,51,8,SS_ENDELLIPSIS + RTEXT "Static",IDC_ZNONPAGEDFREES_V,193,75,51,8,SS_ENDELLIPSIS + RTEXT "Static",IDC_ZNONPAGEDLIMIT_V,193,84,51,8,SS_ENDELLIPSIS + RTEXT "Static",IDC_ZPAGEFAULTSTOTAL_V,183,108,61,8,SS_ENDELLIPSIS + RTEXT "Static",IDC_ZPAGEFAULTSCOPYONWRITE_V,183,117,61,8,SS_ENDELLIPSIS + RTEXT "Static",IDC_ZPAGEFAULTSTRANSITION_V,183,126,61,8,SS_ENDELLIPSIS + RTEXT "Static",IDC_ZPAGEFAULTSCACHE_V,183,135,61,8,SS_ENDELLIPSIS + RTEXT "Static",IDC_ZIOREADS_V,313,10,67,8,SS_ENDELLIPSIS + RTEXT "Static",IDC_ZIOREADBYTES_V,313,19,67,8,SS_ENDELLIPSIS + RTEXT "Static",IDC_ZIOWRITES_V,313,28,67,8,SS_ENDELLIPSIS + 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 END diff --git a/2.x/trunk/ProcessHacker/include/providers.h b/2.x/trunk/ProcessHacker/include/providers.h index eafa8e406..490d0d7bb 100644 --- a/2.x/trunk/ProcessHacker/include/providers.h +++ b/2.x/trunk/ProcessHacker/include/providers.h @@ -19,6 +19,9 @@ extern ULONG PhStatisticsSampleCount; extern SYSTEM_PERFORMANCE_INFORMATION PhPerfInformation; extern PSYSTEM_PROCESSOR_PERFORMANCE_INFORMATION PhCpuInformation; extern SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION PhCpuTotals; +extern ULONG PhTotalProcesses; +extern ULONG PhTotalThreads; +extern ULONG PhTotalHandles; extern FLOAT PhCpuKernelUsage; extern FLOAT PhCpuUserUsage; diff --git a/2.x/trunk/ProcessHacker/notifico.c b/2.x/trunk/ProcessHacker/notifico.c index 8337cea85..462308301 100644 --- a/2.x/trunk/ProcessHacker/notifico.c +++ b/2.x/trunk/ProcessHacker/notifico.c @@ -135,6 +135,8 @@ static VOID PhpBeginBitmap( hdc = CreateCompatibleDC(screenHdc); bitmap = CreateCompatibleBitmap(screenHdc, Width, Height); ReleaseDC(NULL, screenHdc); + + initialized = TRUE; } *Bitmap = bitmap; diff --git a/2.x/trunk/ProcessHacker/procprv.c b/2.x/trunk/ProcessHacker/procprv.c index 177d09cc3..b22ddebf1 100644 --- a/2.x/trunk/ProcessHacker/procprv.c +++ b/2.x/trunk/ProcessHacker/procprv.c @@ -125,6 +125,9 @@ ULONG PhStatisticsSampleCount = 500; SYSTEM_PERFORMANCE_INFORMATION PhPerfInformation; PSYSTEM_PROCESSOR_PERFORMANCE_INFORMATION PhCpuInformation; SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION PhCpuTotals; +ULONG PhTotalProcesses; +ULONG PhTotalThreads; +ULONG PhTotalHandles; SYSTEM_PROCESS_INFORMATION PhDpcsProcessInformation; SYSTEM_PROCESS_INFORMATION PhInterruptsProcessInformation; @@ -999,13 +1002,11 @@ FORCEINLINE VOID PhpUpdateDynamicInfoProcessItem( VOID PhpUpdatePerfInformation() { - ULONG returnLength; - NtQuerySystemInformation( SystemPerformanceInformation, &PhPerfInformation, sizeof(SYSTEM_PERFORMANCE_INFORMATION), - &returnLength + NULL ); PhUpdateDelta(&PhIoReadDelta, PhPerfInformation.IoReadTransferCount.QuadPart); @@ -1017,7 +1018,6 @@ VOID PhpUpdateCpuInformation( __out PULONG64 TotalTime ) { - ULONG returnLength; ULONG i; ULONG64 totalTime; @@ -1026,7 +1026,7 @@ VOID PhpUpdateCpuInformation( PhCpuInformation, sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION) * (ULONG)PhSystemBasicInformation.NumberOfProcessors, - &returnLength + NULL ); // Zero the CPU totals. @@ -1259,6 +1259,10 @@ VOID PhProcessProviderUpdate( // Get the process list. + PhTotalProcesses = 0; + PhTotalThreads = 0; + PhTotalHandles = 0; + if (!NT_SUCCESS(PhEnumProcesses(&processes))) return; @@ -1271,6 +1275,10 @@ VOID PhProcessProviderUpdate( do { + PhTotalProcesses++; + PhTotalThreads += process->NumberOfThreads; + PhTotalHandles += process->HandleCount; + if (process->UniqueProcessId == SYSTEM_IDLE_PROCESS_ID) { process->KernelTime = PhCpuTotals.IdleTime; diff --git a/2.x/trunk/ProcessHacker/resource.h b/2.x/trunk/ProcessHacker/resource.h index 8529f71b6..45f69cb40 100644 --- a/2.x/trunk/ProcessHacker/resource.h +++ b/2.x/trunk/ProcessHacker/resource.h @@ -313,9 +313,6 @@ #define IDC_ZPHYSICALSYSTEMCACHE_V 1209 #define IDC_ZPHYSICALTOTAL_V 1210 #define IDC_ZFILECACHECURRENT_V 1211 -#define IDC_ZFILECACHEPEAK_V 1212 -#define IDC_ZFILECACHEMINIMUM_V 1213 -#define IDC_ZFILECACHEMAXIMUM_V 1214 #define IDC_ZPAGEDPHYSICAL_V 1215 #define IDC_ZPAGEDVIRTUAL_V 1216 #define IDC_ZPAGEDALLOCS_V 1217 diff --git a/2.x/trunk/ProcessHacker/sysinfo.c b/2.x/trunk/ProcessHacker/sysinfo.c index 3f961860c..022d20c4e 100644 --- a/2.x/trunk/ProcessHacker/sysinfo.c +++ b/2.x/trunk/ProcessHacker/sysinfo.c @@ -21,10 +21,13 @@ */ #include +#include #include #include #define WM_PH_SYSINFO_ACTIVATE (WM_APP + 150) +#define WM_PH_SYSINFO_UPDATE (WM_APP + 151) +#define WM_PH_SYSINFO_PANEL_UPDATE (WM_APP + 160) NTSTATUS PhpSysInfoThreadStart( __in PVOID Parameter @@ -49,10 +52,15 @@ HWND PhSysInfoWindowHandle = NULL; HWND PhSysInfoPanelWindowHandle = NULL; static PH_EVENT InitializedEvent = PH_EVENT_INIT; static PH_LAYOUT_MANAGER WindowLayoutManager; +static PH_CALLBACK_REGISTRATION ProcessesUpdatedRegistration; static BOOLEAN OneGraphPerCpu; static BOOLEAN AlwaysOnTop; +static BOOLEAN MmAddressesInitialized = FALSE; +static PSIZE_T MmSizeOfPagedPoolInBytes = NULL; +static PSIZE_T MmMaximumNonPagedPoolInBytes = NULL; + VOID PhShowSystemInformationDialog() { if (!PhSysInfoWindowHandle) @@ -69,6 +77,61 @@ VOID PhShowSystemInformationDialog() SendMessage(PhSysInfoWindowHandle, WM_PH_SYSINFO_ACTIVATE, 0, 0); } +static NTSTATUS PhpLoadMmAddresses( + __in PVOID Parameter + ) +{ + PRTL_PROCESS_MODULES kernelModules; + PPH_SYMBOL_PROVIDER symbolProvider; + PPH_STRING kernelFileName; + PPH_STRING newFileName; + PH_SYMBOL_INFORMATION symbolInfo; + + if (NT_SUCCESS(PhEnumKernelModules(&kernelModules))) + { + if (kernelModules->NumberOfModules >= 1) + { + symbolProvider = PhCreateSymbolProvider(NULL); + + kernelFileName = PhCreateStringFromAnsi(kernelModules->Modules[0].FullPathName); + newFileName = PhGetFileName(kernelFileName); + PhDereferenceObject(kernelFileName); + + PhSymbolProviderLoadModule( + symbolProvider, + newFileName->Buffer, + (ULONG64)kernelModules->Modules[0].ImageBase, + kernelModules->Modules[0].ImageSize + ); + PhDereferenceObject(newFileName); + + if (PhGetSymbolFromName( + symbolProvider, + L"MmSizeOfPagedPoolInBytes", + &symbolInfo + )) + { + MmSizeOfPagedPoolInBytes = (PSIZE_T)symbolInfo.Address; + } + + if (PhGetSymbolFromName( + symbolProvider, + L"MmMaximumNonPagedPoolInBytes", + &symbolInfo + )) + { + MmMaximumNonPagedPoolInBytes = (PSIZE_T)symbolInfo.Address; + } + + PhDereferenceObject(symbolProvider); + } + + PhFree(kernelModules); + } + + return STATUS_SUCCESS; +} + static NTSTATUS PhpSysInfoThreadStart( __in PVOID Parameter ) @@ -79,6 +142,12 @@ static NTSTATUS PhpSysInfoThreadStart( PhInitializeAutoPool(&autoPool); + if (!MmAddressesInitialized && PhKphHandle) + { + PhQueueGlobalWorkQueueItem(PhpLoadMmAddresses, NULL); + MmAddressesInitialized = TRUE; + } + PhSysInfoWindowHandle = CreateDialog( PhInstanceHandle, MAKEINTRESOURCE(IDD_SYSINFO), @@ -124,6 +193,14 @@ static VOID PhpSetOneGraphPerCpu() PhLayoutManagerLayout(&WindowLayoutManager); } +static VOID NTAPI SysInfoUpdateHandler( + __in PVOID Parameter, + __in PVOID Context + ) +{ + PostMessage(PhSysInfoWindowHandle, WM_PH_SYSINFO_UPDATE, 0, 0); +} + INT_PTR CALLBACK PhpSysInfoDlgProc( __in HWND hwndDlg, __in UINT uMsg, @@ -153,6 +230,13 @@ INT_PTR CALLBACK PhpSysInfoDlgProc( ); MoveWindow(hwndDlg, windowRectangle.Left, windowRectangle.Top, windowRectangle.Width, windowRectangle.Height, FALSE); + + PhRegisterCallback( + &PhProcessesUpdatedEvent, + SysInfoUpdateHandler, + NULL, + &ProcessesUpdatedRegistration + ); } break; case WM_DESTROY: @@ -160,6 +244,11 @@ INT_PTR CALLBACK PhpSysInfoDlgProc( WINDOWPLACEMENT placement = { sizeof(placement) }; PH_RECTANGLE windowRectangle; + PhUnregisterCallback( + &PhProcessesUpdatedEvent, + &ProcessesUpdatedRegistration + ); + PhSetIntegerSetting(L"SysInfoWindowAlwaysOnTop", AlwaysOnTop); PhSetIntegerSetting(L"SysInfoWindowOneGraphPerCpu", OneGraphPerCpu); @@ -206,6 +295,8 @@ INT_PTR CALLBACK PhpSysInfoDlgProc( PhAddLayoutItemEx(&WindowLayoutManager, PhSysInfoPanelWindowHandle, NULL, PH_ANCHOR_BOTTOM | PH_ANCHOR_LEFT, margin); PhLayoutManagerLayout(&WindowLayoutManager); + + SendMessage(hwndDlg, WM_PH_SYSINFO_UPDATE, 0, 0); } break; case WM_SIZE: @@ -251,11 +342,52 @@ INT_PTR CALLBACK PhpSysInfoDlgProc( BringWindowToTop(hwndDlg); } break; + case WM_PH_SYSINFO_UPDATE: + { + SendMessage(PhSysInfoPanelWindowHandle, WM_PH_SYSINFO_PANEL_UPDATE, 0, 0); + } + break; } return FALSE; } +static VOID PhpGetPoolLimits( + __out PSIZE_T Paged, + __out PSIZE_T NonPaged + ) +{ + SIZE_T paged = 0; + SIZE_T nonPaged = 0; + + if (MmSizeOfPagedPoolInBytes) + { + KphUnsafeReadVirtualMemory( + PhKphHandle, + NtCurrentProcess(), + MmSizeOfPagedPoolInBytes, + &paged, + sizeof(SIZE_T), + NULL + ); + } + + if (MmMaximumNonPagedPoolInBytes) + { + KphUnsafeReadVirtualMemory( + PhKphHandle, + NtCurrentProcess(), + MmMaximumNonPagedPoolInBytes, + &nonPaged, + sizeof(SIZE_T), + NULL + ); + } + + *Paged = paged; + *NonPaged = nonPaged; +} + INT_PTR CALLBACK PhpSysInfoPanelDlgProc( __in HWND hwndDlg, __in UINT uMsg, @@ -275,6 +407,141 @@ INT_PTR CALLBACK PhpSysInfoPanelDlgProc( } break; + case WM_PH_SYSINFO_PANEL_UPDATE: + { + WCHAR timeSpan[PH_TIMESPAN_STR_LEN_1] = L"Unknown"; + SYSTEM_TIMEOFDAY_INFORMATION timeOfDayInfo; + SYSTEM_FILECACHE_INFORMATION fileCacheInfo; + PWSTR pagedLimit; + PWSTR nonPagedLimit; + + if (!NT_SUCCESS(NtQuerySystemInformation( + SystemFileCacheInformation, + &fileCacheInfo, + sizeof(SYSTEM_FILECACHE_INFORMATION), + NULL + ))) + { + memset(&fileCacheInfo, 0, sizeof(SYSTEM_FILECACHE_INFORMATION)); + } + + // System + + SetDlgItemText(hwndDlg, IDC_ZPROCESSES_V, PhaFormatUInt64(PhTotalProcesses, TRUE)->Buffer); + SetDlgItemText(hwndDlg, IDC_ZTHREADS_V, PhaFormatUInt64(PhTotalThreads, TRUE)->Buffer); + SetDlgItemText(hwndDlg, IDC_ZHANDLES_V, PhaFormatUInt64(PhTotalHandles, TRUE)->Buffer); + + if (NT_SUCCESS(NtQuerySystemInformation( + SystemTimeOfDayInformation, + &timeOfDayInfo, + sizeof(SYSTEM_TIMEOFDAY_INFORMATION), + NULL + ))) + { + PhPrintTimeSpan( + timeSpan, + timeOfDayInfo.CurrentTime.QuadPart - timeOfDayInfo.BootTime.QuadPart, + PH_TIMESPAN_DHMS + ); + } + + SetDlgItemText(hwndDlg, IDC_ZUPTIME_V, timeSpan); + + // Commit Charge + + SetDlgItemText(hwndDlg, IDC_ZCOMMITCURRENT_V, + PhaFormatSize(UInt32x32To64(PhPerfInformation.CommittedPages, PAGE_SIZE), -1)->Buffer); + SetDlgItemText(hwndDlg, IDC_ZCOMMITPEAK_V, + PhaFormatSize(UInt32x32To64(PhPerfInformation.PeakCommitment, PAGE_SIZE), -1)->Buffer); + SetDlgItemText(hwndDlg, IDC_ZCOMMITLIMIT_V, + PhaFormatSize(UInt32x32To64(PhPerfInformation.CommitLimit, PAGE_SIZE), -1)->Buffer); + + // Physical Memory + + SetDlgItemText(hwndDlg, IDC_ZPHYSICALCURRENT_V, + PhaFormatSize(UInt32x32To64(PhSystemBasicInformation.NumberOfPhysicalPages - PhPerfInformation.AvailablePages, PAGE_SIZE), -1)->Buffer); + SetDlgItemText(hwndDlg, IDC_ZPHYSICALSYSTEMCACHE_V, + PhaFormatSize(UInt32x32To64(fileCacheInfo.CurrentSizeIncludingTransitionInPages, PAGE_SIZE), -1)->Buffer); + SetDlgItemText(hwndDlg, IDC_ZPHYSICALTOTAL_V, + PhaFormatSize(UInt32x32To64(PhSystemBasicInformation.NumberOfPhysicalPages, PAGE_SIZE), -1)->Buffer); + + // Kernel Pools + + SetDlgItemText(hwndDlg, IDC_ZPAGEDPHYSICAL_V, + PhaFormatSize(UInt32x32To64(PhPerfInformation.ResidentPagedPoolPage, PAGE_SIZE), -1)->Buffer); + SetDlgItemText(hwndDlg, IDC_ZPAGEDVIRTUAL_V, + PhaFormatSize(UInt32x32To64(PhPerfInformation.PagedPoolPages, PAGE_SIZE), -1)->Buffer); + SetDlgItemText(hwndDlg, IDC_ZPAGEDALLOCS_V, + PhaFormatUInt64(PhPerfInformation.PagedPoolAllocs, TRUE)->Buffer); + SetDlgItemText(hwndDlg, IDC_ZPAGEDFREES_V, + PhaFormatUInt64(PhPerfInformation.PagedPoolFrees, TRUE)->Buffer); + SetDlgItemText(hwndDlg, IDC_ZNONPAGEDUSAGE_V, + PhaFormatSize(UInt32x32To64(PhPerfInformation.NonPagedPoolPages, PAGE_SIZE), -1)->Buffer); + SetDlgItemText(hwndDlg, IDC_ZNONPAGEDALLOCS_V, + PhaFormatUInt64(PhPerfInformation.NonPagedPoolAllocs, TRUE)->Buffer); + SetDlgItemText(hwndDlg, IDC_ZNONPAGEDFREES_V, + PhaFormatUInt64(PhPerfInformation.NonPagedPoolFrees, TRUE)->Buffer); + + if (MmAddressesInitialized) + { + SIZE_T paged; + SIZE_T nonPaged; + + PhpGetPoolLimits(&paged, &nonPaged); + pagedLimit = PhaFormatSize(paged, -1)->Buffer; + nonPagedLimit = PhaFormatSize(nonPaged, -1)->Buffer; + } + else + { + if (!PhKphHandle) + { + pagedLimit = nonPagedLimit = L"no driver"; + } + else + { + pagedLimit = nonPagedLimit = L"no symbols"; + } + } + + SetDlgItemText(hwndDlg, IDC_ZPAGEDLIMIT_V, pagedLimit); + SetDlgItemText(hwndDlg, IDC_ZNONPAGEDLIMIT_V, nonPagedLimit); + + // Page Faults + + SetDlgItemText(hwndDlg, IDC_ZPAGEFAULTSTOTAL_V, + PhaFormatUInt64(PhPerfInformation.PageFaultCount, TRUE)->Buffer); + SetDlgItemText(hwndDlg, IDC_ZPAGEFAULTSCOPYONWRITE_V, + PhaFormatUInt64(PhPerfInformation.CopyOnWriteCount, TRUE)->Buffer); + SetDlgItemText(hwndDlg, IDC_ZPAGEFAULTSTRANSITION_V, + PhaFormatUInt64(PhPerfInformation.TransitionCount, TRUE)->Buffer); + SetDlgItemText(hwndDlg, IDC_ZPAGEFAULTSCACHE_V, + PhaFormatUInt64(fileCacheInfo.PageFaultCount, TRUE)->Buffer); + + // I/O + + SetDlgItemText(hwndDlg, IDC_ZIOREADS_V, + PhaFormatUInt64(PhPerfInformation.IoReadOperationCount, TRUE)->Buffer); + SetDlgItemText(hwndDlg, IDC_ZIOREADBYTES_V, + PhaFormatSize(PhPerfInformation.IoReadTransferCount.QuadPart, -1)->Buffer); + SetDlgItemText(hwndDlg, IDC_ZIOWRITES_V, + PhaFormatUInt64(PhPerfInformation.IoWriteOperationCount, TRUE)->Buffer); + SetDlgItemText(hwndDlg, IDC_ZIOWRITEBYTES_V, + PhaFormatSize(PhPerfInformation.IoWriteTransferCount.QuadPart, -1)->Buffer); + SetDlgItemText(hwndDlg, IDC_ZIOOTHER_V, + PhaFormatUInt64(PhPerfInformation.IoOtherOperationCount, TRUE)->Buffer); + SetDlgItemText(hwndDlg, IDC_ZIOOTHERBYTES_V, + PhaFormatSize(PhPerfInformation.IoOtherTransferCount.QuadPart, -1)->Buffer); + + // CPU + + SetDlgItemText(hwndDlg, IDC_ZCONTEXTSWITCHES_V, + PhaFormatUInt64(PhPerfInformation.ContextSwitches, TRUE)->Buffer); + SetDlgItemText(hwndDlg, IDC_ZINTERRUPTS_V, + PhaFormatUInt64(PhCpuTotals.InterruptCount, TRUE)->Buffer); + SetDlgItemText(hwndDlg, IDC_ZSYSTEMCALLS_V, + PhaFormatUInt64(PhPerfInformation.SystemCalls, TRUE)->Buffer); + } + break; } return FALSE; diff --git a/2.x/trunk/phlib/include/ph.h b/2.x/trunk/phlib/include/ph.h index ea4518924..86e173ab2 100644 --- a/2.x/trunk/phlib/include/ph.h +++ b/2.x/trunk/phlib/include/ph.h @@ -1337,6 +1337,14 @@ typedef enum _PH_SYMBOL_RESOLVE_LEVEL PhsrlInvalid } PH_SYMBOL_RESOLVE_LEVEL, *PPH_SYMBOL_RESOLVE_LEVEL; +typedef struct _PH_SYMBOL_INFORMATION +{ + ULONG64 Address; + ULONG64 ModuleBase; + ULONG Index; + ULONG Size; +} PH_SYMBOL_INFORMATION, *PPH_SYMBOL_INFORMATION; + BOOLEAN PhSymbolProviderInitialization(); VOID PhSymbolProviderDynamicImport(); @@ -1360,6 +1368,12 @@ PPH_STRING PhGetSymbolFromAddress( __out_opt PULONG64 Displacement ); +BOOLEAN PhGetSymbolFromName( + __in PPH_SYMBOL_PROVIDER SymbolProvider, + __in PWSTR Name, + __out PPH_SYMBOL_INFORMATION Information + ); + BOOLEAN PhSymbolProviderLoadModule( __in PPH_SYMBOL_PROVIDER SymbolProvider, __in PWSTR FileName, diff --git a/2.x/trunk/phlib/include/symprv.h b/2.x/trunk/phlib/include/symprv.h index 79536d368..650005ab8 100644 --- a/2.x/trunk/phlib/include/symprv.h +++ b/2.x/trunk/phlib/include/symprv.h @@ -13,19 +13,25 @@ typedef BOOL (WINAPI *_SymCleanup)( __in HANDLE hProcess ); -typedef BOOL (WINAPI *_SymEnumSymbols)( +typedef BOOL (WINAPI *_SymEnumSymbolsW)( __in HANDLE hProcess, __in ULONG64 BaseOfDll, - __in_opt PCTSTR Mask, - __in PSYM_ENUMERATESYMBOLS_CALLBACK EnumSymbolsCallback, + __in_opt PCWSTR Mask, + __in PSYM_ENUMERATESYMBOLS_CALLBACKW EnumSymbolsCallback, __in_opt const PVOID UserContext ); -typedef BOOL (WINAPI *_SymFromAddr)( +typedef BOOL (WINAPI *_SymFromAddrW)( __in HANDLE hProcess, __in DWORD64 Address, __out_opt PDWORD64 Displacement, - __inout PSYMBOL_INFO Symbol + __inout PSYMBOL_INFOW Symbol + ); + +typedef BOOL (WINAPI *_SymFromNameW)( + __in HANDLE hProcess, + __in PCWSTR Name, + __inout PSYMBOL_INFOW Symbol ); typedef DWORD64 (WINAPI *_SymLoadModule64)( @@ -43,15 +49,15 @@ typedef DWORD (WINAPI *_SymSetOptions)( __in DWORD SymOptions ); -typedef BOOL (WINAPI *_SymGetSearchPath)( +typedef BOOL (WINAPI *_SymGetSearchPathW)( __in HANDLE hProcess, - __out PSTR SearchPath, + __out PWSTR SearchPath, __in DWORD SearchPathLength ); -typedef BOOL (WINAPI *_SymSetSearchPath)( +typedef BOOL (WINAPI *_SymSetSearchPathW)( __in HANDLE hProcess, - __in_opt PCSTR SearchPath + __in_opt PCWSTR SearchPath ); typedef BOOL (WINAPI *_SymUnloadModule64)( diff --git a/2.x/trunk/phlib/symprv.c b/2.x/trunk/phlib/symprv.c index 5ee62602c..15154dc46 100644 --- a/2.x/trunk/phlib/symprv.c +++ b/2.x/trunk/phlib/symprv.c @@ -51,13 +51,14 @@ PH_MUTEX PhSymMutex; _SymInitialize SymInitialize_I; _SymCleanup SymCleanup_I; -_SymEnumSymbols SymEnumSymbols_I; -_SymFromAddr SymFromAddr_I; +_SymEnumSymbolsW SymEnumSymbolsW_I; +_SymFromAddrW SymFromAddrW_I; +_SymFromNameW SymFromNameW_I; _SymLoadModule64 SymLoadModule64_I; _SymGetOptions SymGetOptions_I; _SymSetOptions SymSetOptions_I; -_SymGetSearchPath SymGetSearchPath_I; -_SymSetSearchPath SymSetSearchPath_I; +_SymGetSearchPathW SymGetSearchPathW_I; +_SymSetSearchPathW SymSetSearchPathW_I; _SymUnloadModule64 SymUnloadModule64_I; _SymFunctionTableAccess64 SymFunctionTableAccess64_I; _SymGetModuleBase64 SymGetModuleBase64_I; @@ -89,13 +90,14 @@ VOID PhSymbolProviderDynamicImport() SymInitialize_I = PhGetProcAddress(L"dbghelp.dll", "SymInitialize"); SymCleanup_I = PhGetProcAddress(L"dbghelp.dll", "SymCleanup"); - SymEnumSymbols_I = PhGetProcAddress(L"dbghelp.dll", "SymEnumSymbols"); - SymFromAddr_I = PhGetProcAddress(L"dbghelp.dll", "SymFromAddr"); + SymEnumSymbolsW_I = PhGetProcAddress(L"dbghelp.dll", "SymEnumSymbolsW"); + SymFromAddrW_I = PhGetProcAddress(L"dbghelp.dll", "SymFromAddrW"); + SymFromNameW_I = PhGetProcAddress(L"dbghelp.dll", "SymFromNameW"); SymLoadModule64_I = PhGetProcAddress(L"dbghelp.dll", "SymLoadModule64"); SymGetOptions_I = PhGetProcAddress(L"dbghelp.dll", "SymGetOptions"); SymSetOptions_I = PhGetProcAddress(L"dbghelp.dll", "SymSetOptions"); - SymGetSearchPath_I = PhGetProcAddress(L"dbghelp.dll", "SymGetSearchPath"); - SymSetSearchPath_I = PhGetProcAddress(L"dbghelp.dll", "SymSetSearchPath"); + SymGetSearchPathW_I = PhGetProcAddress(L"dbghelp.dll", "SymGetSearchPathW"); + SymSetSearchPathW_I = PhGetProcAddress(L"dbghelp.dll", "SymSetSearchPathW"); SymUnloadModule64_I = PhGetProcAddress(L"dbghelp.dll", "SymUnloadModule64"); SymFunctionTableAccess64_I = PhGetProcAddress(L"dbghelp.dll", "SymFunctionTableAccess64"); SymGetModuleBase64_I = PhGetProcAddress(L"dbghelp.dll", "SymGetModuleBase64"); @@ -307,8 +309,8 @@ PPH_STRING PhGetSymbolFromAddress( __out_opt PULONG64 Displacement ) { - PSYMBOL_INFO symbolInfo; - UCHAR symbolInfoBuffer[sizeof(SYMBOL_INFO) + PH_MAX_SYMBOL_NAME_LEN]; + PSYMBOL_INFOW symbolInfo; + UCHAR symbolInfoBuffer[FIELD_OFFSET(SYMBOL_INFOW, Name) + PH_MAX_SYMBOL_NAME_LEN * 2]; PPH_STRING symbol = NULL; PH_SYMBOL_RESOLVE_LEVEL resolveLevel; ULONG64 displacement; @@ -317,7 +319,7 @@ PPH_STRING PhGetSymbolFromAddress( ULONG64 modBase; PPH_STRING symbolName = NULL; - if (!SymFromAddr_I) + if (!SymFromAddrW_I) return NULL; if (Address == 0) @@ -334,9 +336,9 @@ PPH_STRING PhGetSymbolFromAddress( PhpRegisterSymbolProvider(SymbolProvider); #endif - symbolInfo = (PSYMBOL_INFO)symbolInfoBuffer; - memset(symbolInfo, 0, sizeof(SYMBOL_INFO)); - symbolInfo->SizeOfStruct = sizeof(SYMBOL_INFO); + symbolInfo = (PSYMBOL_INFOW)symbolInfoBuffer; + memset(symbolInfo, 0, sizeof(SYMBOL_INFOW)); + symbolInfo->SizeOfStruct = sizeof(SYMBOL_INFOW); symbolInfo->MaxNameLen = PH_MAX_SYMBOL_NAME_LEN - 1; // Get the symbol name. @@ -347,7 +349,7 @@ PPH_STRING PhGetSymbolFromAddress( // it will not write to the symbolInfo structure // if it fails. We've already zeroed the structure, // so we can deal with it. - SymFromAddr_I( + SymFromAddrW_I( SymbolProvider->ProcessHandle, Address, &displacement, @@ -419,9 +421,9 @@ PPH_STRING PhGetSymbolFromAddress( // If we have everything, return the full symbol // name: module!symbol+offset. - symbolName = PhCreateStringFromAnsiEx( + symbolName = PhCreateStringEx( symbolInfo->Name, - symbolInfo->NameLen + symbolInfo->NameLen * 2 ); resolveLevel = PhsrlFunction; @@ -471,6 +473,46 @@ CleanupExit: return symbol; } +BOOLEAN PhGetSymbolFromName( + __in PPH_SYMBOL_PROVIDER SymbolProvider, + __in PWSTR Name, + __out PPH_SYMBOL_INFORMATION Information + ) +{ + BOOLEAN result; + PSYMBOL_INFOW symbolInfo; + UCHAR symbolInfoBuffer[FIELD_OFFSET(SYMBOL_INFOW, Name) + PH_MAX_SYMBOL_NAME_LEN * 2]; + + if (!SymFromNameW_I) + return FALSE; + +#ifdef PH_SYMBOL_PROVIDER_DELAY_INIT + PhpRegisterSymbolProvider(SymbolProvider); +#endif + + symbolInfo = (PSYMBOL_INFOW)symbolInfoBuffer; + memset(symbolInfo, 0, sizeof(SYMBOL_INFOW)); + symbolInfo->SizeOfStruct = sizeof(SYMBOL_INFOW); + symbolInfo->MaxNameLen = PH_MAX_SYMBOL_NAME_LEN - 1; + + // Get the symbol information. + + PhAcquireMutex(&PhSymMutex); + result = !!SymFromNameW_I( + SymbolProvider->ProcessHandle, + Name, + symbolInfo + ); + PhReleaseMutex(&PhSymMutex); + + Information->Address = symbolInfo->Address; + Information->ModuleBase = symbolInfo->ModBase; + Information->Index = symbolInfo->Index; + Information->Size = symbolInfo->Size; + + return result; +} + BOOLEAN PhSymbolProviderLoadModule( __in PPH_SYMBOL_PROVIDER SymbolProvider, __in PWSTR FileName, @@ -556,22 +598,16 @@ VOID PhSymbolProviderSetSearchPath( __in PWSTR SearchPath ) { - PPH_ANSI_STRING searchPath; - - if (!SymSetSearchPath_I) + if (!SymSetSearchPathW_I) return; #ifdef PH_SYMBOL_PROVIDER_DELAY_INIT PhpRegisterSymbolProvider(SymbolProvider); #endif - searchPath = PhCreateAnsiStringFromUnicode(SearchPath); - PhAcquireMutex(&PhSymMutex); - SymSetSearchPath_I(SymbolProvider->ProcessHandle, searchPath->Buffer); + SymSetSearchPathW_I(SymbolProvider->ProcessHandle, SearchPath); PhReleaseMutex(&PhSymMutex); - - PhDereferenceObject(searchPath); } BOOLEAN PhStackWalk(