* System Information panel is now completely working

* fixed huge GDI handle leak

git-svn-id: svn://svn.code.sf.net/p/processhacker/code@3270 21ef857c-d57f-4fe0-8362-d861dc6d29cd
This commit is contained in:
wj32
2010-07-05 06:13:08 +00:00
parent a412c7e53e
commit 35dad68200
9 changed files with 447 additions and 123 deletions
+72 -81
View File
@@ -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
@@ -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;
+2
View File
@@ -135,6 +135,8 @@ static VOID PhpBeginBitmap(
hdc = CreateCompatibleDC(screenHdc);
bitmap = CreateCompatibleBitmap(screenHdc, Width, Height);
ReleaseDC(NULL, screenHdc);
initialized = TRUE;
}
*Bitmap = bitmap;
+13 -5
View File
@@ -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;
-3
View File
@@ -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
+267
View File
@@ -21,10 +21,13 @@
*/
#include <phapp.h>
#include <kph.h>
#include <settings.h>
#include <windowsx.h>
#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;
+14
View File
@@ -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,
+15 -9
View File
@@ -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)(
+61 -25
View File
@@ -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(