mirror of
https://github.com/mirror/processhacker
synced 2026-06-08 16:03:24 +00:00
* 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:
@@ -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;
|
||||
|
||||
@@ -135,6 +135,8 @@ static VOID PhpBeginBitmap(
|
||||
hdc = CreateCompatibleDC(screenHdc);
|
||||
bitmap = CreateCompatibleBitmap(screenHdc, Width, Height);
|
||||
ReleaseDC(NULL, screenHdc);
|
||||
|
||||
initialized = TRUE;
|
||||
}
|
||||
|
||||
*Bitmap = bitmap;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user