From 4a7e90efb0b287c1be1fc7b5aa93cece18d1e9c8 Mon Sep 17 00:00:00 2001 From: wj32 Date: Sat, 12 Nov 2011 09:40:41 +0000 Subject: [PATCH] * moved Memory Lists from ExtendedTools to main program * ExtendedTools: added Disk and Network sections git-svn-id: svn://svn.code.sf.net/p/processhacker/code@4837 21ef857c-d57f-4fe0-8362-d861dc6d29cd --- 2.x/trunk/ProcessHacker/ProcessHacker.rc | 76 +- 2.x/trunk/ProcessHacker/ProcessHacker.vcxproj | 1 + .../ProcessHacker.vcxproj.filters | 3 + 2.x/trunk/ProcessHacker/include/phapp.h | 8 + 2.x/trunk/ProcessHacker/include/sysinfop.h | 8 + 2.x/trunk/ProcessHacker/memlists.c | 278 ++++ 2.x/trunk/ProcessHacker/resource.h | 23 +- 2.x/trunk/ProcessHacker/settings.c | 1 + 2.x/trunk/ProcessHacker/sysinfo.c | 61 +- .../plugins/ExtendedTools/ExtendedTools.rc | 105 +- .../ExtendedTools/ExtendedTools.vcxproj | 3 +- .../ExtendedTools.vcxproj.filters | 9 +- 2.x/trunk/plugins/ExtendedTools/etwstat.c | 10 + 2.x/trunk/plugins/ExtendedTools/etwsys.c | 1303 +++++++++-------- 2.x/trunk/plugins/ExtendedTools/etwsys.h | 90 ++ 2.x/trunk/plugins/ExtendedTools/exttools.h | 30 +- 2.x/trunk/plugins/ExtendedTools/gpumon.c | 88 +- 2.x/trunk/plugins/ExtendedTools/gpumon.h | 16 + 2.x/trunk/plugins/ExtendedTools/gpusys.c | 85 +- 2.x/trunk/plugins/ExtendedTools/gpusys.h | 79 + 2.x/trunk/plugins/ExtendedTools/main.c | 26 +- 2.x/trunk/plugins/ExtendedTools/memlists.c | 267 ---- 2.x/trunk/plugins/ExtendedTools/resource.h | 14 +- 23 files changed, 1532 insertions(+), 1052 deletions(-) create mode 100644 2.x/trunk/ProcessHacker/memlists.c create mode 100644 2.x/trunk/plugins/ExtendedTools/etwsys.h create mode 100644 2.x/trunk/plugins/ExtendedTools/gpusys.h delete mode 100644 2.x/trunk/plugins/ExtendedTools/memlists.c diff --git a/2.x/trunk/ProcessHacker/ProcessHacker.rc b/2.x/trunk/ProcessHacker/ProcessHacker.rc index f8fb15865..46d07d45f 100644 --- a/2.x/trunk/ProcessHacker/ProcessHacker.rc +++ b/2.x/trunk/ProcessHacker/ProcessHacker.rc @@ -444,6 +444,17 @@ BEGIN END END +IDR_EMPTYMEMLISTS MENU +BEGIN + POPUP "Empty" + BEGIN + MENUITEM "Empty Working Sets", ID_EMPTY_EMPTYWORKINGSETS + MENUITEM "Empty Modified Page List", ID_EMPTY_EMPTYMODIFIEDPAGELIST + MENUITEM "Empty Standby List", ID_EMPTY_EMPTYSTANDBYLIST + MENUITEM "Empty Priority 0 Standby List", ID_EMPTY_EMPTYPRIORITY0STANDBYLIST + END +END + ///////////////////////////////////////////////////////////////////////////// // @@ -1517,7 +1528,7 @@ BEGIN RTEXT "Static",IDC_ZTHREADS_V,45,38,46,8,SS_ENDELLIPSIS RTEXT "Static",IDC_ZHANDLES_V,45,48,46,8,SS_ENDELLIPSIS RTEXT "Static",IDC_ZUPTIME_V,46,58,45,8,SS_ENDELLIPSIS - CONTROL "Show one graph per CPU",IDC_ONEGRAPHPERCPU,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,0,76,96,10 + CONTROL "&Show one graph per CPU",IDC_ONEGRAPHPERCPU,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,0,76,96,10 GROUPBOX "CPU",IDC_STATIC,101,17,136,55 LTEXT "Context Switches Delta",IDC_STATIC,109,28,76,8 LTEXT "Interrupts Delta",IDC_STATIC,109,38,52,8 @@ -1531,6 +1542,7 @@ END IDD_SYSINFO_MEMPANEL DIALOGEX 0, 0, 358, 171 STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_SYSMENU +EXSTYLE WS_EX_CONTROLPARENT FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN GROUPBOX "Commit Charge",IDC_STATIC,0,0,108,44 @@ -1571,7 +1583,7 @@ BEGIN LTEXT "Limit",IDC_STATIC,7,135,15,8 LTEXT "Frees Delta",IDC_STATIC,7,155,38,8 RTEXT "Static",IDC_ZNONPAGEDFREESDELTA_V,56,155,45,8,SS_ENDELLIPSIS - GROUPBOX "Memory Lists",IDC_STATIC,234,0,123,154 + GROUPBOX "Memory Lists",IDC_STATIC,234,0,123,169 LTEXT "Zeroed",IDC_STATIC,242,11,24,8 LTEXT "Modified",IDC_STATIC,242,31,28,8 RTEXT "Static",IDC_ZLISTZEROED_V,304,11,47,8,SS_ENDELLIPSIS @@ -1609,10 +1621,12 @@ BEGIN RTEXT "Static",IDC_ZPAGINGMAPPEDWRITESDELTA_V,191,108,31,8,SS_ENDELLIPSIS LTEXT "Modified pagefile",IDC_STATIC,242,51,55,8 RTEXT "Static",IDC_ZLISTMODIFIEDPAGEFILE_V,303,51,48,8,SS_ENDELLIPSIS + PUSHBUTTON "&More",IDC_MORE,242,152,50,14 END IDD_SYSINFO_MEM DIALOGEX 0, 0, 316, 250 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CONTROL | WS_CHILD | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_CONTROLPARENT CAPTION "Memory" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN @@ -1653,6 +1667,56 @@ BEGIN RTEXT "Static",IDC_ZOTHERBYTESDELTA_V,81,61,45,8,SS_ENDELLIPSIS END +IDD_MEMLISTS DIALOGEX 0, 0, 228, 195 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_TOPMOST +CAPTION "Memory Lists" +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + DEFPUSHBUTTON "Close",IDOK,171,174,50,14 + LTEXT "Zeroed",IDC_STATIC,7,7,24,8 + LTEXT "Free",IDC_STATIC,7,17,16,8 + LTEXT "Modified",IDC_STATIC,7,28,28,8 + LTEXT "Modified no-write",IDC_STATIC,7,39,56,8 + LTEXT "Bad",IDC_STATIC,7,60,13,8 + LTEXT "Standby",IDC_STATIC,7,72,28,8 + LTEXT "Priority 0",IDC_STATIC,23,83,30,8 + LTEXT "Priority 1",IDC_STATIC,23,94,30,8 + LTEXT "Priority 2",IDC_STATIC,23,105,30,8 + LTEXT "Priority 3",IDC_STATIC,23,116,30,8 + LTEXT "Priority 4",IDC_STATIC,23,128,30,8 + LTEXT "Priority 5",IDC_STATIC,23,139,30,8 + LTEXT "Priority 6",IDC_STATIC,23,150,30,8 + LTEXT "Priority 7",IDC_STATIC,23,161,30,8 + RTEXT "Static",IDC_ZLISTZEROED_V,73,7,59,8,SS_ENDELLIPSIS + RTEXT "Static",IDC_ZLISTFREE_V,73,17,59,8,SS_ENDELLIPSIS + RTEXT "Static",IDC_ZLISTMODIFIED_V,73,28,59,8,SS_ENDELLIPSIS + RTEXT "Static",IDC_ZLISTMODIFIEDNOWRITE_V,73,39,59,8,SS_ENDELLIPSIS + RTEXT "Static",IDC_ZLISTBAD_V,73,60,59,8,SS_ENDELLIPSIS + RTEXT "Static",IDC_ZLISTSTANDBY_V,73,72,59,8,SS_ENDELLIPSIS + RTEXT "Static",IDC_ZLISTSTANDBY0_V,73,83,59,8,SS_ENDELLIPSIS + RTEXT "Static",IDC_ZLISTSTANDBY1_V,73,94,59,8,SS_ENDELLIPSIS + RTEXT "Static",IDC_ZLISTSTANDBY2_V,73,105,59,8,SS_ENDELLIPSIS + RTEXT "Static",IDC_ZLISTSTANDBY3_V,73,116,59,8,SS_ENDELLIPSIS + RTEXT "Static",IDC_ZLISTSTANDBY4_V,73,128,59,8,SS_ENDELLIPSIS + RTEXT "Static",IDC_ZLISTSTANDBY5_V,73,139,59,8,SS_ENDELLIPSIS + RTEXT "Static",IDC_ZLISTSTANDBY6_V,73,150,59,8,SS_ENDELLIPSIS + RTEXT "Static",IDC_ZLISTSTANDBY7_V,73,161,59,8,SS_ENDELLIPSIS + RTEXT "Static",IDC_ZLISTREPURPOSED_V,162,72,59,8,SS_ENDELLIPSIS + RTEXT "Static",IDC_ZLISTREPURPOSED0_V,162,84,59,8,SS_ENDELLIPSIS + RTEXT "Static",IDC_ZLISTREPURPOSED1_V,162,95,59,8,SS_ENDELLIPSIS + RTEXT "Static",IDC_ZLISTREPURPOSED2_V,162,106,59,8,SS_ENDELLIPSIS + RTEXT "Static",IDC_ZLISTREPURPOSED3_V,162,117,59,8,SS_ENDELLIPSIS + RTEXT "Static",IDC_ZLISTREPURPOSED4_V,162,128,59,8,SS_ENDELLIPSIS + RTEXT "Static",IDC_ZLISTREPURPOSED5_V,162,139,59,8,SS_ENDELLIPSIS + RTEXT "Static",IDC_ZLISTREPURPOSED6_V,162,150,59,8,SS_ENDELLIPSIS + RTEXT "Static",IDC_ZLISTREPURPOSED7_V,162,161,59,8,SS_ENDELLIPSIS + RTEXT "(Repurposed)",IDC_STATIC,162,60,59,8 + PUSHBUTTON "&Empty",IDC_EMPTY,117,174,50,14 + LTEXT "Modified pagefile",IDC_STATIC,7,49,55,8 + RTEXT "Static",IDC_ZLISTMODIFIEDPAGEFILE_V,73,49,59,8,SS_ENDELLIPSIS +END + ///////////////////////////////////////////////////////////////////////////// // @@ -2157,6 +2221,14 @@ BEGIN BEGIN BOTTOMMARGIN, 74 END + + IDD_MEMLISTS, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 221 + TOPMARGIN, 7 + BOTTOMMARGIN, 188 + END END #endif // APSTUDIO_INVOKED diff --git a/2.x/trunk/ProcessHacker/ProcessHacker.vcxproj b/2.x/trunk/ProcessHacker/ProcessHacker.vcxproj index e074174bf..a964643a0 100644 --- a/2.x/trunk/ProcessHacker/ProcessHacker.vcxproj +++ b/2.x/trunk/ProcessHacker/ProcessHacker.vcxproj @@ -276,6 +276,7 @@ + diff --git a/2.x/trunk/ProcessHacker/ProcessHacker.vcxproj.filters b/2.x/trunk/ProcessHacker/ProcessHacker.vcxproj.filters index 42385ae02..157d2ba12 100644 --- a/2.x/trunk/ProcessHacker/ProcessHacker.vcxproj.filters +++ b/2.x/trunk/ProcessHacker/ProcessHacker.vcxproj.filters @@ -453,6 +453,9 @@ PCRE + + Process Hacker + diff --git a/2.x/trunk/ProcessHacker/include/phapp.h b/2.x/trunk/ProcessHacker/include/phapp.h index 962b2102b..4a5b082cc 100644 --- a/2.x/trunk/ProcessHacker/include/phapp.h +++ b/2.x/trunk/ProcessHacker/include/phapp.h @@ -1451,6 +1451,14 @@ VOID PhShowMemoryEditorDialog( __in ULONG SelectLength ); +// memlists + +VOID PhShowMemoryListsDialog( + __in HWND ParentWindowHandle, + __in_opt VOID (NTAPI *RegisterDialog)(HWND), + __in_opt VOID (NTAPI *UnregisterDialog)(HWND) + ); + // memprot VOID PhShowMemoryProtectDialog( diff --git a/2.x/trunk/ProcessHacker/include/sysinfop.h b/2.x/trunk/ProcessHacker/include/sysinfop.h index cd4baad5a..3d0fa61ae 100644 --- a/2.x/trunk/ProcessHacker/include/sysinfop.h +++ b/2.x/trunk/ProcessHacker/include/sysinfop.h @@ -77,6 +77,14 @@ VOID PhSipOnUserMessage( // Framework +VOID PhSipRegisterDialog( + __in HWND DialogWindowHandle + ); + +VOID PhSipUnregisterDialog( + __in HWND DialogWindowHandle + ); + VOID PhSipInitializeParameters( VOID ); diff --git a/2.x/trunk/ProcessHacker/memlists.c b/2.x/trunk/ProcessHacker/memlists.c new file mode 100644 index 000000000..08a708138 --- /dev/null +++ b/2.x/trunk/ProcessHacker/memlists.c @@ -0,0 +1,278 @@ +/* + * Process Hacker - + * memory list information + * + * Copyright (C) 2010-2011 wj32 + * + * This file is part of Process Hacker. + * + * Process Hacker is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Process Hacker is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Process Hacker. If not, see . + */ + +#include + +#define MSG_UPDATE (WM_APP + 1) + +INT_PTR CALLBACK PhpMemoryListsDlgProc( + __in HWND hwndDlg, + __in UINT uMsg, + __in WPARAM wParam, + __in LPARAM lParam + ); + +HWND PhMemoryListsWindowHandle = NULL; +static VOID (NTAPI *UnregisterDialogFunction)(HWND); +static PH_CALLBACK_REGISTRATION ProcessesUpdatedRegistration; + +VOID PhShowMemoryListsDialog( + __in HWND ParentWindowHandle, + __in_opt VOID (NTAPI *RegisterDialog)(HWND), + __in_opt VOID (NTAPI *UnregisterDialog)(HWND) + ) +{ + if (!PhMemoryListsWindowHandle) + { + PhMemoryListsWindowHandle = CreateDialog( + PhInstanceHandle, + MAKEINTRESOURCE(IDD_MEMLISTS), + ParentWindowHandle, + PhpMemoryListsDlgProc + ); + RegisterDialog(PhMemoryListsWindowHandle); + UnregisterDialogFunction = UnregisterDialog; + } + + if (!IsWindowVisible(PhMemoryListsWindowHandle)) + ShowWindow(PhMemoryListsWindowHandle, SW_SHOW); + else if (IsIconic(PhMemoryListsWindowHandle)) + ShowWindow(PhMemoryListsWindowHandle, SW_RESTORE); + else + SetForegroundWindow(PhMemoryListsWindowHandle); +} + +static VOID NTAPI ProcessesUpdatedCallback( + __in_opt PVOID Parameter, + __in_opt PVOID Context + ) +{ + PostMessage(PhMemoryListsWindowHandle, MSG_UPDATE, 0, 0); +} + +static VOID PhpUpdateMemoryListInfo( + __in HWND hwndDlg + ) +{ + SYSTEM_MEMORY_LIST_INFORMATION memoryListInfo; + + if (NT_SUCCESS(NtQuerySystemInformation( + SystemMemoryListInformation, + &memoryListInfo, + sizeof(SYSTEM_MEMORY_LIST_INFORMATION), + NULL + ))) + { + ULONG_PTR standbyPageCount; + ULONG_PTR repurposedPageCount; + ULONG i; + + standbyPageCount = 0; + repurposedPageCount = 0; + + for (i = 0; i < 8; i++) + { + standbyPageCount += memoryListInfo.PageCountByPriority[i]; + repurposedPageCount += memoryListInfo.RepurposedPagesByPriority[i]; + } + + SetDlgItemText(hwndDlg, IDC_ZLISTZEROED_V, PhaFormatSize((ULONG64)memoryListInfo.ZeroPageCount * PAGE_SIZE, -1)->Buffer); + SetDlgItemText(hwndDlg, IDC_ZLISTFREE_V, PhaFormatSize((ULONG64)memoryListInfo.FreePageCount * PAGE_SIZE, -1)->Buffer); + SetDlgItemText(hwndDlg, IDC_ZLISTMODIFIED_V, PhaFormatSize((ULONG64)memoryListInfo.ModifiedPageCount * PAGE_SIZE, -1)->Buffer); + SetDlgItemText(hwndDlg, IDC_ZLISTMODIFIEDNOWRITE_V, PhaFormatSize((ULONG64)memoryListInfo.ModifiedNoWritePageCount * PAGE_SIZE, -1)->Buffer); + SetDlgItemText(hwndDlg, IDC_ZLISTBAD_V, PhaFormatSize((ULONG64)memoryListInfo.BadPageCount * PAGE_SIZE, -1)->Buffer); + SetDlgItemText(hwndDlg, IDC_ZLISTSTANDBY_V, PhaFormatSize((ULONG64)standbyPageCount * PAGE_SIZE, -1)->Buffer); + SetDlgItemText(hwndDlg, IDC_ZLISTSTANDBY0_V, PhaFormatSize((ULONG64)memoryListInfo.PageCountByPriority[0] * PAGE_SIZE, -1)->Buffer); + SetDlgItemText(hwndDlg, IDC_ZLISTSTANDBY1_V, PhaFormatSize((ULONG64)memoryListInfo.PageCountByPriority[1] * PAGE_SIZE, -1)->Buffer); + SetDlgItemText(hwndDlg, IDC_ZLISTSTANDBY2_V, PhaFormatSize((ULONG64)memoryListInfo.PageCountByPriority[2] * PAGE_SIZE, -1)->Buffer); + SetDlgItemText(hwndDlg, IDC_ZLISTSTANDBY3_V, PhaFormatSize((ULONG64)memoryListInfo.PageCountByPriority[3] * PAGE_SIZE, -1)->Buffer); + SetDlgItemText(hwndDlg, IDC_ZLISTSTANDBY4_V, PhaFormatSize((ULONG64)memoryListInfo.PageCountByPriority[4] * PAGE_SIZE, -1)->Buffer); + SetDlgItemText(hwndDlg, IDC_ZLISTSTANDBY5_V, PhaFormatSize((ULONG64)memoryListInfo.PageCountByPriority[5] * PAGE_SIZE, -1)->Buffer); + SetDlgItemText(hwndDlg, IDC_ZLISTSTANDBY6_V, PhaFormatSize((ULONG64)memoryListInfo.PageCountByPriority[6] * PAGE_SIZE, -1)->Buffer); + SetDlgItemText(hwndDlg, IDC_ZLISTSTANDBY7_V, PhaFormatSize((ULONG64)memoryListInfo.PageCountByPriority[7] * PAGE_SIZE, -1)->Buffer); + SetDlgItemText(hwndDlg, IDC_ZLISTREPURPOSED_V, PhaFormatSize((ULONG64)repurposedPageCount * PAGE_SIZE, -1)->Buffer); + SetDlgItemText(hwndDlg, IDC_ZLISTREPURPOSED0_V, PhaFormatSize((ULONG64)memoryListInfo.RepurposedPagesByPriority[0] * PAGE_SIZE, -1)->Buffer); + SetDlgItemText(hwndDlg, IDC_ZLISTREPURPOSED1_V, PhaFormatSize((ULONG64)memoryListInfo.RepurposedPagesByPriority[1] * PAGE_SIZE, -1)->Buffer); + SetDlgItemText(hwndDlg, IDC_ZLISTREPURPOSED2_V, PhaFormatSize((ULONG64)memoryListInfo.RepurposedPagesByPriority[2] * PAGE_SIZE, -1)->Buffer); + SetDlgItemText(hwndDlg, IDC_ZLISTREPURPOSED3_V, PhaFormatSize((ULONG64)memoryListInfo.RepurposedPagesByPriority[3] * PAGE_SIZE, -1)->Buffer); + SetDlgItemText(hwndDlg, IDC_ZLISTREPURPOSED4_V, PhaFormatSize((ULONG64)memoryListInfo.RepurposedPagesByPriority[4] * PAGE_SIZE, -1)->Buffer); + SetDlgItemText(hwndDlg, IDC_ZLISTREPURPOSED5_V, PhaFormatSize((ULONG64)memoryListInfo.RepurposedPagesByPriority[5] * PAGE_SIZE, -1)->Buffer); + SetDlgItemText(hwndDlg, IDC_ZLISTREPURPOSED6_V, PhaFormatSize((ULONG64)memoryListInfo.RepurposedPagesByPriority[6] * PAGE_SIZE, -1)->Buffer); + SetDlgItemText(hwndDlg, IDC_ZLISTREPURPOSED7_V, PhaFormatSize((ULONG64)memoryListInfo.RepurposedPagesByPriority[7] * PAGE_SIZE, -1)->Buffer); + + if (WindowsVersion >= WINDOWS_8) + SetDlgItemText(hwndDlg, IDC_ZLISTMODIFIEDPAGEFILE_V, PhaFormatSize((ULONG64)memoryListInfo.ModifiedPageCountPageFile * PAGE_SIZE, -1)->Buffer); + else + SetDlgItemText(hwndDlg, IDC_ZLISTMODIFIEDPAGEFILE_V, L"N/A"); + } + else + { + SetDlgItemText(hwndDlg, IDC_ZLISTZEROED_V, L"Unknown"); + SetDlgItemText(hwndDlg, IDC_ZLISTFREE_V, L"Unknown"); + SetDlgItemText(hwndDlg, IDC_ZLISTMODIFIED_V, L"Unknown"); + SetDlgItemText(hwndDlg, IDC_ZLISTMODIFIEDNOWRITE_V, L"Unknown"); + SetDlgItemText(hwndDlg, IDC_ZLISTMODIFIEDPAGEFILE_V, L"Unknown"); + SetDlgItemText(hwndDlg, IDC_ZLISTBAD_V, L"Unknown"); + SetDlgItemText(hwndDlg, IDC_ZLISTSTANDBY_V, L"Unknown"); + SetDlgItemText(hwndDlg, IDC_ZLISTSTANDBY0_V, L"Unknown"); + SetDlgItemText(hwndDlg, IDC_ZLISTSTANDBY1_V, L"Unknown"); + SetDlgItemText(hwndDlg, IDC_ZLISTSTANDBY2_V, L"Unknown"); + SetDlgItemText(hwndDlg, IDC_ZLISTSTANDBY3_V, L"Unknown"); + SetDlgItemText(hwndDlg, IDC_ZLISTSTANDBY4_V, L"Unknown"); + SetDlgItemText(hwndDlg, IDC_ZLISTSTANDBY5_V, L"Unknown"); + SetDlgItemText(hwndDlg, IDC_ZLISTSTANDBY6_V, L"Unknown"); + SetDlgItemText(hwndDlg, IDC_ZLISTSTANDBY7_V, L"Unknown"); + SetDlgItemText(hwndDlg, IDC_ZLISTREPURPOSED_V, L"Unknown"); + SetDlgItemText(hwndDlg, IDC_ZLISTREPURPOSED0_V, L"Unknown"); + SetDlgItemText(hwndDlg, IDC_ZLISTREPURPOSED1_V, L"Unknown"); + SetDlgItemText(hwndDlg, IDC_ZLISTREPURPOSED2_V, L"Unknown"); + SetDlgItemText(hwndDlg, IDC_ZLISTREPURPOSED3_V, L"Unknown"); + SetDlgItemText(hwndDlg, IDC_ZLISTREPURPOSED4_V, L"Unknown"); + SetDlgItemText(hwndDlg, IDC_ZLISTREPURPOSED5_V, L"Unknown"); + SetDlgItemText(hwndDlg, IDC_ZLISTREPURPOSED6_V, L"Unknown"); + SetDlgItemText(hwndDlg, IDC_ZLISTREPURPOSED7_V, L"Unknown"); + } +} + +INT_PTR CALLBACK PhpMemoryListsDlgProc( + __in HWND hwndDlg, + __in UINT uMsg, + __in WPARAM wParam, + __in LPARAM lParam + ) +{ + switch (uMsg) + { + case WM_INITDIALOG: + { + PhRegisterCallback(&PhProcessesUpdatedEvent, ProcessesUpdatedCallback, NULL, &ProcessesUpdatedRegistration); + PhpUpdateMemoryListInfo(hwndDlg); + + PhLoadWindowPlacementFromSetting(L"MemoryListsWindowPosition", NULL, hwndDlg); + PhRegisterDialog(hwndDlg); + } + break; + case WM_DESTROY: + { + PhUnregisterDialog(hwndDlg); + PhSaveWindowPlacementToSetting(L"MemoryListsWindowPosition", NULL, hwndDlg); + + PhUnregisterCallback(&PhProcessesUpdatedEvent, &ProcessesUpdatedRegistration); + + UnregisterDialogFunction(hwndDlg); + PhMemoryListsWindowHandle = NULL; + } + break; + case WM_COMMAND: + { + switch (LOWORD(wParam)) + { + case IDCANCEL: + case IDOK: + DestroyWindow(hwndDlg); + break; + case IDC_EMPTY: + { + HMENU menu; + HMENU subMenu; + RECT buttonRect; + POINT point; + UINT selectedItem; + SYSTEM_MEMORY_LIST_COMMAND command = -1; + + menu = LoadMenu(PhInstanceHandle, MAKEINTRESOURCE(IDR_EMPTYMEMLISTS)); + subMenu = GetSubMenu(menu, 0); + + GetClientRect(GetDlgItem(hwndDlg, IDC_EMPTY), &buttonRect); + point.x = 0; + point.y = buttonRect.bottom; + + ClientToScreen(GetDlgItem(hwndDlg, IDC_EMPTY), &point); + selectedItem = PhShowContextMenu2( + hwndDlg, + GetDlgItem(hwndDlg, IDC_EMPTY), + subMenu, + point + ); + + switch (selectedItem) + { + case ID_EMPTY_EMPTYWORKINGSETS: + command = MemoryEmptyWorkingSets; + break; + case ID_EMPTY_EMPTYMODIFIEDPAGELIST: + command = MemoryFlushModifiedList; + break; + case ID_EMPTY_EMPTYSTANDBYLIST: + command = MemoryPurgeStandbyList; + break; + case ID_EMPTY_EMPTYPRIORITY0STANDBYLIST: + command = MemoryPurgeLowPriorityStandbyList; + break; + } + + if (command != -1) + { + NTSTATUS status; + PVOID returnedState; + ULONG privilege = SE_PROF_SINGLE_PROCESS_PRIVILEGE; + + if (NT_SUCCESS(status = RtlAcquirePrivilege( + &privilege, + 1, + 0, + &returnedState + ))) + { + status = NtSetSystemInformation( + SystemMemoryListInformation, + &command, + sizeof(SYSTEM_MEMORY_LIST_COMMAND) + ); + RtlReleasePrivilege(returnedState); + } + + if (status == STATUS_PRIVILEGE_NOT_HELD) + { + PhShowError(hwndDlg, L"Process Hacker must be elevated to execute this command."); + } + else if (!NT_SUCCESS(status)) + { + PhShowStatus(hwndDlg, L"Unable to execute the memory list command", status, 0); + } + } + + DestroyMenu(menu); + } + break; + } + } + break; + case MSG_UPDATE: + { + PhpUpdateMemoryListInfo(hwndDlg); + } + break; + } + + return FALSE; +} diff --git a/2.x/trunk/ProcessHacker/resource.h b/2.x/trunk/ProcessHacker/resource.h index 89d2c1b61..dcd01470b 100644 --- a/2.x/trunk/ProcessHacker/resource.h +++ b/2.x/trunk/ProcessHacker/resource.h @@ -116,6 +116,9 @@ #define IDD_SYSINFO_MEM 199 #define IDD_SYSINFO_IO 200 #define IDD_SYSINFO_IOPANEL 201 +#define IDD_MEMLISTS 202 +#define IDR_EMPTYMEMORYLISTS 203 +#define IDR_EMPTYMEMLISTS 204 #define IDC_TERMINATE 1003 #define IDC_FILEICON 1005 #define IDC_FILE 1006 @@ -215,6 +218,7 @@ #define IDC_ADD 1079 #define IDC_FONT 1079 #define IDC_INTEGRITY 1079 +#define IDC_MORE 1079 #define IDC_EDITDEP 1080 #define IDC_VIEWPARENTPROCESS 1081 #define IDC_OPENFILENAME 1082 @@ -485,6 +489,17 @@ #define IDC_ZLISTSTANDBY1_V 1347 #define IDC_ZLISTSTANDBY2_V 1348 #define IDC_ZLISTSTANDBY3_V 1349 +#define IDC_ZLISTBAD_V 1350 +#define IDC_ZLISTREPURPOSED_V 1351 +#define IDC_ZLISTREPURPOSED0_V 1352 +#define IDC_ZLISTREPURPOSED1_V 1353 +#define IDC_ZLISTREPURPOSED2_V 1354 +#define IDC_ZLISTREPURPOSED3_V 1355 +#define IDC_ZLISTREPURPOSED4_V 1356 +#define IDC_ZLISTREPURPOSED5_V 1357 +#define IDC_ZLISTREPURPOSED6_V 1358 +#define IDC_ZLISTREPURPOSED7_V 1359 +#define IDC_EMPTY 1360 #define IDC_ZLISTSTANDBY4_V 1364 #define IDC_ZLISTSTANDBY5_V 1365 #define IDC_ZLISTSTANDBY6_V 1366 @@ -714,6 +729,10 @@ #define ID_MODULE_OPENFILELOCATION 40247 #define ID_PROCESS_OPENFILELOCATION 40248 #define ID_MISCELLANEOUS_REDUCEWORKINGSET 40249 +#define ID_EMPTY_EMPTYWORKINGSETS 40250 +#define ID_EMPTY_EMPTYMODIFIEDPAGELIST 40251 +#define ID_EMPTY_EMPTYSTANDBYLIST 40252 +#define ID_EMPTY_EMPTYPRIORITY0STANDBYLIST 40253 #define IDC_BACK 40255 #define IDDYNAMIC 50000 #define IDPLUGINS 55000 @@ -723,9 +742,9 @@ // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 199 +#define _APS_NEXT_RESOURCE_VALUE 205 #define _APS_NEXT_COMMAND_VALUE 40256 -#define _APS_NEXT_CONTROL_VALUE 1347 +#define _APS_NEXT_CONTROL_VALUE 1361 #define _APS_NEXT_SYMED_VALUE 135 #endif #endif diff --git a/2.x/trunk/ProcessHacker/settings.c b/2.x/trunk/ProcessHacker/settings.c index f5d60af07..4ee6d5456 100644 --- a/2.x/trunk/ProcessHacker/settings.c +++ b/2.x/trunk/ProcessHacker/settings.c @@ -127,6 +127,7 @@ VOID PhSettingsInitialization( PhpAddIntegerPairSetting(L"MemResultsPosition", L"300,300"); PhpAddIntegerPairSetting(L"MemResultsSize", L"500,520"); PhpAddStringSetting(L"MemoryListViewColumns", L""); + PhpAddIntegerPairSetting(L"MemoryListsWindowPosition", L"400,400"); PhpAddStringSetting(L"MemoryReadWriteAddressChoices", L""); PhpAddStringSetting(L"ModuleTreeListColumns", L""); PhpAddStringSetting(L"ModuleTreeListSort", L"0,0"); // 0, NoSortOrder diff --git a/2.x/trunk/ProcessHacker/sysinfo.c b/2.x/trunk/ProcessHacker/sysinfo.c index 40bbde4dd..3bb05b8cf 100644 --- a/2.x/trunk/ProcessHacker/sysinfo.c +++ b/2.x/trunk/ProcessHacker/sysinfo.c @@ -34,6 +34,7 @@ static HANDLE PhSipThread = NULL; static HWND PhSipWindow = NULL; +static PPH_LIST PhSipDialogList = NULL; static PH_EVENT InitializedEvent = PH_EVENT_INIT; static PH_LAYOUT_MANAGER WindowLayoutManager; static RECT MinimumSize; @@ -157,6 +158,20 @@ NTSTATUS PhSipSysInfoThreadStart( processed = TRUE; } + if (PhSipDialogList) + { + ULONG i; + + for (i = 0; i < PhSipDialogList->Count; i++) + { + if (IsDialogMessage((HWND)PhSipDialogList->Items[i], &message)) + { + processed = TRUE; + break; + } + } + } + if (!processed) { if (!IsDialogMessage(PhSipWindow, &message)) @@ -176,6 +191,12 @@ NTSTATUS PhSipSysInfoThreadStart( PhSipWindow = NULL; PhSipThread = NULL; + if (PhSipDialogList) + { + PhDereferenceObject(PhSipDialogList); + PhSipDialogList = NULL; + } + return STATUS_SUCCESS; } @@ -264,8 +285,6 @@ VOID PhSipOnInitDialog( NULL, &ProcessesUpdatedRegistration ); - - PhLoadWindowPlacementFromSetting(L"SysInfoWindowPosition", L"SysInfoWindowSize", PhSipWindow); } VOID PhSipOnDestroy( @@ -378,6 +397,8 @@ VOID PhSipOnShowWindow( GetSystemMetrics(SM_CYSIZEFRAME) * 2; } + PhLoadWindowPlacementFromSetting(L"SysInfoWindowPosition", L"SysInfoWindowSize", PhSipWindow); + AlwaysOnTop = (BOOLEAN)PhGetIntegerSetting(L"SysInfoWindowAlwaysOnTop"); Button_SetCheck(GetDlgItem(PhSipWindow, IDC_ALWAYSONTOP), AlwaysOnTop ? BST_CHECKED : BST_UNCHECKED); PhSipSetAlwaysOnTop(); @@ -637,6 +658,26 @@ VOID PhSiSetColorsGraphDrawInfo( DrawInfo->LineBackColor2 = PhMakeColorBrighter(Color2, 125); } +VOID PhSipRegisterDialog( + __in HWND DialogWindowHandle + ) +{ + if (!PhSipDialogList) + PhSipDialogList = PhCreateList(4); + + PhAddItemList(PhSipDialogList, DialogWindowHandle); +} + +VOID PhSipUnregisterDialog( + __in HWND DialogWindowHandle + ) +{ + ULONG index; + + if ((index = PhFindItemList(PhSipDialogList, DialogWindowHandle)) != -1) + PhRemoveItemList(PhSipDialogList, index); +} + VOID PhSipInitializeParameters( VOID ) @@ -662,10 +703,10 @@ VOID PhSipInitializeParameters( hdc = GetDC(PhSipWindow); - logFont.lfHeight -= MulDiv(4, GetDeviceCaps(hdc, LOGPIXELSY), 72); + logFont.lfHeight -= MulDiv(3, GetDeviceCaps(hdc, LOGPIXELSY), 72); CurrentParameters.MediumFont = CreateFontIndirect(&logFont); - logFont.lfHeight -= MulDiv(4, GetDeviceCaps(hdc, LOGPIXELSY), 72); + logFont.lfHeight -= MulDiv(3, GetDeviceCaps(hdc, LOGPIXELSY), 72); CurrentParameters.LargeFont = CreateFontIndirect(&logFont); CurrentParameters.GraphBackColor = RGB(0xef, 0xef, 0xef); @@ -2193,6 +2234,18 @@ INT_PTR CALLBACK PhSipMemoryPanelDialogProc( NOTHING; } break; + case WM_COMMAND: + { + switch (LOWORD(wParam)) + { + case IDC_MORE: + { + PhShowMemoryListsDialog(PhSipWindow, PhSipRegisterDialog, PhSipUnregisterDialog); + } + break; + } + } + break; } return FALSE; diff --git a/2.x/trunk/plugins/ExtendedTools/ExtendedTools.rc b/2.x/trunk/plugins/ExtendedTools/ExtendedTools.rc index e208c7519..db6d92e9c 100644 --- a/2.x/trunk/plugins/ExtendedTools/ExtendedTools.rc +++ b/2.x/trunk/plugins/ExtendedTools/ExtendedTools.rc @@ -51,8 +51,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,7,0,0 - PRODUCTVERSION 1,7,0,0 + FILEVERSION 1,8,0,0 + PRODUCTVERSION 1,8,0,0 FILEFLAGSMASK 0x17L #ifdef _DEBUG FILEFLAGS 0x1L @@ -69,12 +69,12 @@ BEGIN BEGIN VALUE "CompanyName", "wj32" VALUE "FileDescription", "Extended Tools plugin for Process Hacker" - VALUE "FileVersion", "1.7" + VALUE "FileVersion", "1.8" VALUE "InternalName", "ExtendedTools" VALUE "LegalCopyright", "Licensed under the GNU GPL, v3." VALUE "OriginalFilename", "ExtendedTools.dll" VALUE "ProductName", "Extended Tools plugin for Process Hacker" - VALUE "ProductVersion", "1.7" + VALUE "ProductVersion", "1.8" END END BLOCK "VarFileInfo" @@ -208,39 +208,19 @@ BEGIN RTEXT "Static",IDC_ZSENDBYTESDELTA_V,205,74,38,8,SS_ENDELLIPSIS END -IDD_SYSDISKNET DIALOGEX 0, 0, 361, 221 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -CAPTION "Disk and Network" -FONT 8, "MS Shell Dlg", 400, 0, 0x1 -BEGIN - DEFPUSHBUTTON "Close",IDOK,304,200,50,14 - GROUPBOX "Disk I/O",IDC_GROUPDISK,7,7,347,53,0,WS_EX_TRANSPARENT - GROUPBOX "Network I/O",IDC_GROUPNETWORK,7,62,347,53,0,WS_EX_TRANSPARENT - CONTROL "Always on Top",IDC_ALWAYSONTOP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,238,202,63,10 -END - -IDD_SYSDISKNET_PANEL DIALOGEX 0, 0, 246, 58 +IDD_SYSINFO_DISKPANEL DIALOGEX 0, 0, 146, 58 STYLE DS_SETFONT | DS_FIXEDSYS | DS_CONTROL | WS_CHILD | WS_SYSMENU FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN - GROUPBOX "Disk I/O",IDC_STATIC,0,0,118,58 - LTEXT "Reads",IDC_STATIC,8,11,21,8 - LTEXT "Read Bytes",IDC_STATIC,8,22,38,8 - LTEXT "Writes",IDC_STATIC,8,33,22,8 - LTEXT "Write Bytes",IDC_STATIC,8,44,38,8 - RTEXT "Static",IDC_ZREADS_V,55,11,54,8,SS_ENDELLIPSIS - RTEXT "Static",IDC_ZREADBYTES_V,71,22,38,8,SS_ENDELLIPSIS - RTEXT "Static",IDC_ZWRITES_V,55,33,54,8,SS_ENDELLIPSIS - RTEXT "Static",IDC_ZWRITEBYTES_V,71,44,38,8,SS_ENDELLIPSIS - GROUPBOX "Network I/O",IDC_STATIC,122,0,124,58 - LTEXT "Receives",IDC_STATIC,130,11,30,8 - LTEXT "Receive Bytes",IDC_STATIC,130,23,46,8 - LTEXT "Sends",IDC_STATIC,130,34,20,8 - LTEXT "Send Bytes",IDC_STATIC,130,44,37,8 - RTEXT "Static",IDC_ZRECEIVES_V,182,11,54,8,SS_ENDELLIPSIS - RTEXT "Static",IDC_ZRECEIVEBYTES_V,198,23,38,8,SS_ENDELLIPSIS - RTEXT "Static",IDC_ZSENDS_V,182,34,54,8,SS_ENDELLIPSIS - RTEXT "Static",IDC_ZSENDBYTES_V,198,44,38,8,SS_ENDELLIPSIS + GROUPBOX "Disk I/O",IDC_STATIC,0,0,145,58 + LTEXT "Reads Delta",IDC_STATIC,8,11,40,8 + LTEXT "Read Bytes Delta",IDC_STATIC,8,22,56,8 + LTEXT "Writes Delta",IDC_STATIC,8,33,40,8 + LTEXT "Write Bytes Delta",IDC_STATIC,8,44,57,8 + RTEXT "Static",IDC_ZREADSDELTA_V,84,11,54,8,SS_ENDELLIPSIS + RTEXT "Static",IDC_ZREADBYTESDELTA_V,78,22,60,8,SS_ENDELLIPSIS + RTEXT "Static",IDC_ZWRITESDELTA_V,84,33,54,8,SS_ENDELLIPSIS + RTEXT "Static",IDC_ZWRITEBYTESDELTA_V,82,44,56,8,SS_ENDELLIPSIS END IDD_OPTIONS DIALOGEX 0, 0, 215, 77 @@ -337,6 +317,41 @@ BEGIN RTEXT "Static",IDC_ZTOTALNODES_V,205,40,38,8,SS_ENDELLIPSIS END +IDD_SYSINFO_DISK DIALOGEX 0, 0, 315, 186 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME +CAPTION "Disk" +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + LTEXT "Disk",IDC_TITLE,0,0,72,21 + LTEXT "Panel layout",IDC_LAYOUT,0,124,315,61,NOT WS_VISIBLE + LTEXT "Graph layout",IDC_GRAPH_LAYOUT,0,22,315,99,NOT WS_VISIBLE +END + +IDD_SYSINFO_NETPANEL DIALOGEX 0, 0, 145, 58 +STYLE DS_SETFONT | DS_FIXEDSYS | DS_CONTROL | WS_CHILD | WS_SYSMENU +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + GROUPBOX "Network I/O",IDC_STATIC,0,0,145,58 + LTEXT "Receives Delta",IDC_STATIC,8,11,48,8 + LTEXT "Receive Bytes Delta",IDC_STATIC,8,22,65,8 + LTEXT "Sends Delta",IDC_STATIC,8,33,39,8 + LTEXT "Send Bytes Delta",IDC_STATIC,8,44,56,8 + RTEXT "Static",IDC_ZRECEIVESDELTA_V,84,11,54,8,SS_ENDELLIPSIS + RTEXT "Static",IDC_ZRECEIVEBYTESDELTA_V,78,22,60,8,SS_ENDELLIPSIS + RTEXT "Static",IDC_ZSENDSDELTA_V,84,33,54,8,SS_ENDELLIPSIS + RTEXT "Static",IDC_ZSENDBYTESDELTA_V,82,44,56,8,SS_ENDELLIPSIS +END + +IDD_SYSINFO_NET DIALOGEX 0, 0, 315, 186 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME +CAPTION "Network" +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + LTEXT "Network",IDC_TITLE,0,0,72,21 + LTEXT "Panel layout",IDC_LAYOUT,0,124,315,61,NOT WS_VISIBLE + LTEXT "Graph layout",IDC_GRAPH_LAYOUT,0,22,315,99,NOT WS_VISIBLE +END + ///////////////////////////////////////////////////////////////////////////// // @@ -394,15 +409,7 @@ BEGIN BOTTOMMARGIN, 253 END - IDD_SYSDISKNET, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 354 - TOPMARGIN, 7 - BOTTOMMARGIN, 214 - END - - IDD_SYSDISKNET_PANEL, DIALOG + IDD_SYSINFO_DISKPANEL, DIALOG BEGIN END @@ -437,6 +444,18 @@ BEGIN TOPMARGIN, 7 BOTTOMMARGIN, 253 END + + IDD_SYSINFO_DISK, DIALOG + BEGIN + END + + IDD_SYSINFO_NETPANEL, DIALOG + BEGIN + END + + IDD_SYSINFO_NET, DIALOG + BEGIN + END END #endif // APSTUDIO_INVOKED diff --git a/2.x/trunk/plugins/ExtendedTools/ExtendedTools.vcxproj b/2.x/trunk/plugins/ExtendedTools/ExtendedTools.vcxproj index 34a94ed6f..31cab31d2 100644 --- a/2.x/trunk/plugins/ExtendedTools/ExtendedTools.vcxproj +++ b/2.x/trunk/plugins/ExtendedTools/ExtendedTools.vcxproj @@ -184,7 +184,6 @@ - @@ -197,8 +196,10 @@ + + diff --git a/2.x/trunk/plugins/ExtendedTools/ExtendedTools.vcxproj.filters b/2.x/trunk/plugins/ExtendedTools/ExtendedTools.vcxproj.filters index e9703e3b1..a3d22483e 100644 --- a/2.x/trunk/plugins/ExtendedTools/ExtendedTools.vcxproj.filters +++ b/2.x/trunk/plugins/ExtendedTools/ExtendedTools.vcxproj.filters @@ -33,9 +33,6 @@ Source Files - - Source Files - Source Files @@ -95,6 +92,12 @@ Header Files + + Header Files + + + Header Files + diff --git a/2.x/trunk/plugins/ExtendedTools/etwstat.c b/2.x/trunk/plugins/ExtendedTools/etwstat.c index 8f65077b3..cea96a936 100644 --- a/2.x/trunk/plugins/ExtendedTools/etwstat.c +++ b/2.x/trunk/plugins/ExtendedTools/etwstat.c @@ -55,6 +55,11 @@ PH_UINT32_DELTA EtDiskWriteDelta; PH_UINT32_DELTA EtNetworkReceiveDelta; PH_UINT32_DELTA EtNetworkSendDelta; +PH_UINT32_DELTA EtDiskReadCountDelta; +PH_UINT32_DELTA EtDiskWriteCountDelta; +PH_UINT32_DELTA EtNetworkReceiveCountDelta; +PH_UINT32_DELTA EtNetworkSendCountDelta; + PH_CIRCULAR_BUFFER_ULONG EtDiskReadHistory; PH_CIRCULAR_BUFFER_ULONG EtDiskWriteHistory; PH_CIRCULAR_BUFFER_ULONG EtNetworkReceiveHistory; @@ -237,6 +242,11 @@ static VOID NTAPI ProcessesUpdatedCallback( PhUpdateDelta(&EtNetworkReceiveDelta, EtpNetworkReceiveRaw); PhUpdateDelta(&EtNetworkSendDelta, EtpNetworkSendRaw); + PhUpdateDelta(&EtDiskReadCountDelta, EtDiskReadCount); + PhUpdateDelta(&EtDiskWriteCountDelta, EtDiskWriteCount); + PhUpdateDelta(&EtNetworkReceiveCountDelta, EtNetworkReceiveCount); + PhUpdateDelta(&EtNetworkSendCountDelta, EtNetworkSendCount); + // Update per-process statistics. // Note: no lock is needed because we only ever modify the list on this same thread. diff --git a/2.x/trunk/plugins/ExtendedTools/etwsys.c b/2.x/trunk/plugins/ExtendedTools/etwsys.c index 6507f86ee..dea19b7ea 100644 --- a/2.x/trunk/plugins/ExtendedTools/etwsys.c +++ b/2.x/trunk/plugins/ExtendedTools/etwsys.c @@ -1,6 +1,6 @@ /* * Process Hacker Extended Tools - - * ETW system information dialog + * ETW system information section * * Copyright (C) 2010-2011 wj32 * @@ -23,127 +23,378 @@ #include "exttools.h" #include "resource.h" #include -#include - -#define WM_ET_ETWSYS_ACTIVATE (WM_APP + 150) -#define WM_ET_ETWSYS_UPDATE (WM_APP + 151) -#define WM_ET_ETWSYS_PANEL_UPDATE (WM_APP + 160) - -NTSTATUS EtpEtwSysThreadStart( - __in PVOID Parameter - ); - -INT_PTR CALLBACK EtpEtwSysDlgProc( - __in HWND hwndDlg, - __in UINT uMsg, - __in WPARAM wParam, - __in LPARAM lParam - ); - -INT_PTR CALLBACK EtpEtwSysPanelDlgProc( - __in HWND hwndDlg, - __in UINT uMsg, - __in WPARAM wParam, - __in LPARAM lParam - ); - -HANDLE EtpEtwSysThreadHandle = NULL; -HWND EtpEtwSysWindowHandle = NULL; -HWND EtpEtwSysPanelWindowHandle = NULL; -static PH_EVENT InitializedEvent = PH_EVENT_INIT; -static PH_LAYOUT_MANAGER WindowLayoutManager; -static PH_CALLBACK_REGISTRATION ProcessesUpdatedRegistration; - -static BOOLEAN AlwaysOnTop; +#include "etwsys.h" +static PPH_SYSINFO_SECTION DiskSection; +static HWND DiskDialog; +static PH_LAYOUT_MANAGER DiskLayoutManager; static HWND DiskGraphHandle; -static HWND NetworkGraphHandle; - static PH_GRAPH_STATE DiskGraphState; +static HWND DiskPanel; + +static PPH_SYSINFO_SECTION NetworkSection; +static HWND NetworkDialog; +static PH_LAYOUT_MANAGER NetworkLayoutManager; +static HWND NetworkGraphHandle; static PH_GRAPH_STATE NetworkGraphState; +static HWND NetworkPanel; -static RECT EtpNormalGraphTextMargin = { 5, 5, 5, 5 }; -static RECT EtpNormalGraphTextPadding = { 3, 3, 3, 3 }; +VOID EtEtwSystemInformationInitializing( + __in PPH_PLUGIN_SYSINFO_POINTERS Pointers + ) +{ + PH_SYSINFO_SECTION section; -VOID EtShowEtwSystemDialog( + memset(§ion, 0, sizeof(PH_SYSINFO_SECTION)); + PhInitializeStringRef(§ion.Name, L"Disk"); + section.Flags = 0; + section.Callback = EtpDiskSectionCallback; + + DiskSection = Pointers->CreateSection(§ion); + + memset(§ion, 0, sizeof(PH_SYSINFO_SECTION)); + PhInitializeStringRef(§ion.Name, L"Network"); + section.Flags = 0; + section.Callback = EtpNetworkSectionCallback; + + NetworkSection = Pointers->CreateSection(§ion); +} + +BOOLEAN EtpDiskSectionCallback( + __in PPH_SYSINFO_SECTION Section, + __in PH_SYSINFO_SECTION_MESSAGE Message, + __in_opt PVOID Parameter1, + __in_opt PVOID Parameter2 + ) +{ + switch (Message) + { + case SysInfoDestroy: + { + if (DiskDialog) + { + PhDeleteGraphState(&DiskGraphState); + DiskDialog = NULL; + } + } + return TRUE; + case SysInfoTick: + { + if (DiskDialog) + { + EtpUpdateDiskGraph(); + EtpUpdateDiskPanel(); + } + } + return TRUE; + case SysInfoCreateDialog: + { + PPH_SYSINFO_CREATE_DIALOG createDialog = Parameter1; + + createDialog->Instance = PluginInstance->DllBase; + createDialog->Template = MAKEINTRESOURCE(IDD_SYSINFO_DISK); + createDialog->DialogProc = EtpDiskDialogProc; + } + return TRUE; + case SysInfoGraphGetDrawInfo: + { + PPH_GRAPH_DRAW_INFO drawInfo = Parameter1; + + drawInfo->Flags = PH_GRAPH_USE_GRID | PH_GRAPH_USE_LINE_2; + Section->Parameters->ColorSetupFunction(drawInfo, PhGetIntegerSetting(L"ColorIoReadOther"), PhGetIntegerSetting(L"ColorIoWrite")); + PhGetDrawInfoGraphBuffers(&Section->GraphState.Buffers, drawInfo, EtDiskReadHistory.Count); + + if (!Section->GraphState.Valid) + { + ULONG i; + FLOAT max = 0; + + for (i = 0; i < drawInfo->LineDataCount; i++) + { + FLOAT data1; + FLOAT data2; + + Section->GraphState.Data1[i] = data1 = + (FLOAT)PhGetItemCircularBuffer_ULONG(&EtDiskReadHistory, i); + Section->GraphState.Data2[i] = data2 = + (FLOAT)PhGetItemCircularBuffer_ULONG(&EtDiskWriteHistory, i); + + if (max < data1 + data2) + max = data1 + data2; + } + + // Minimum scaling of 1 MB. + if (max < 1024 * 1024) + max = 1024 * 1024; + + // Scale the data. + + PhxfDivideSingle2U( + Section->GraphState.Data1, + max, + drawInfo->LineDataCount + ); + PhxfDivideSingle2U( + Section->GraphState.Data2, + max, + drawInfo->LineDataCount + ); + + Section->GraphState.Valid = TRUE; + } + } + return TRUE; + case SysInfoGraphGetTooltipText: + { + PPH_SYSINFO_GRAPH_GET_TOOLTIP_TEXT getTooltipText = Parameter1; + ULONG64 diskRead; + ULONG64 diskWrite; + + diskRead = PhGetItemCircularBuffer_ULONG(&EtDiskReadHistory, getTooltipText->Index); + diskWrite = PhGetItemCircularBuffer_ULONG(&EtDiskWriteHistory, getTooltipText->Index); + + PhSwapReference2(&Section->GraphState.TooltipText, PhFormatString( + L"R: %s\nW: %s%s\n%s", + PhaFormatSize(diskRead, -1)->Buffer, + PhaFormatSize(diskWrite, -1)->Buffer, + PhGetStringOrEmpty(EtpGetMaxDiskString(getTooltipText->Index)), + ((PPH_STRING)PHA_DEREFERENCE(PhGetStatisticsTimeString(NULL, getTooltipText->Index)))->Buffer + )); + getTooltipText->Text = Section->GraphState.TooltipText->sr; + } + return TRUE; + case SysInfoGraphDrawPanel: + { + PPH_SYSINFO_DRAW_PANEL drawPanel = Parameter1; + + drawPanel->Title = PhCreateString(L"Disk"); + drawPanel->SubTitle = PhFormatString( + L"R: %s\nW: %s", + PhaFormatSize(EtDiskReadDelta.Delta, -1)->Buffer, + PhaFormatSize(EtDiskWriteDelta.Delta, -1)->Buffer + ); + } + return TRUE; + } + + return FALSE; +} + +INT_PTR CALLBACK EtpDiskDialogProc( + __in HWND hwndDlg, + __in UINT uMsg, + __in WPARAM wParam, + __in LPARAM lParam + ) +{ + switch (uMsg) + { + case WM_INITDIALOG: + { + PPH_LAYOUT_ITEM graphItem; + PPH_LAYOUT_ITEM panelItem; + + PhInitializeGraphState(&DiskGraphState); + + DiskDialog = hwndDlg; + PhInitializeLayoutManager(&DiskLayoutManager, hwndDlg); + graphItem = PhAddLayoutItem(&DiskLayoutManager, GetDlgItem(hwndDlg, IDC_GRAPH_LAYOUT), NULL, PH_ANCHOR_ALL); + panelItem = PhAddLayoutItem(&DiskLayoutManager, GetDlgItem(hwndDlg, IDC_LAYOUT), NULL, PH_ANCHOR_LEFT | PH_ANCHOR_RIGHT | PH_ANCHOR_BOTTOM); + + SendMessage(GetDlgItem(hwndDlg, IDC_TITLE), WM_SETFONT, (WPARAM)DiskSection->Parameters->LargeFont, FALSE); + + DiskPanel = CreateDialog(PluginInstance->DllBase, MAKEINTRESOURCE(IDD_SYSINFO_DISKPANEL), hwndDlg, EtpDiskPanelDialogProc); + ShowWindow(DiskPanel, SW_SHOW); + PhAddLayoutItemEx(&DiskLayoutManager, DiskPanel, NULL, PH_ANCHOR_LEFT | PH_ANCHOR_RIGHT | PH_ANCHOR_BOTTOM, panelItem->Margin); + + DiskGraphHandle = CreateWindow( + PH_GRAPH_CLASSNAME, + NULL, + WS_VISIBLE | WS_CHILD | WS_BORDER, + 0, + 0, + 3, + 3, + hwndDlg, + (HMENU)IDC_DISK, + PluginInstance->DllBase, + NULL + ); + Graph_SetTooltip(DiskGraphHandle, TRUE); + + PhAddLayoutItemEx(&DiskLayoutManager, DiskGraphHandle, NULL, PH_ANCHOR_ALL, graphItem->Margin); + + EtpUpdateDiskGraph(); + EtpUpdateDiskPanel(); + } + break; + case WM_DESTROY: + { + PhDeleteLayoutManager(&DiskLayoutManager); + } + break; + case WM_SIZE: + { + PhLayoutManagerLayout(&DiskLayoutManager); + } + break; + case WM_NOTIFY: + { + NMHDR *header = (NMHDR *)lParam; + + if (header->hwndFrom == DiskGraphHandle) + { + EtpNotifyDiskGraph(header); + } + } + break; + } + + return FALSE; +} + +INT_PTR CALLBACK EtpDiskPanelDialogProc( + __in HWND hwndDlg, + __in UINT uMsg, + __in WPARAM wParam, + __in LPARAM lParam + ) +{ + return FALSE; +} + +VOID EtpNotifyDiskGraph( + __in NMHDR *Header + ) +{ + switch (Header->code) + { + case GCN_GETDRAWINFO: + { + PPH_GRAPH_GETDRAWINFO getDrawInfo = (PPH_GRAPH_GETDRAWINFO)Header; + PPH_GRAPH_DRAW_INFO drawInfo = getDrawInfo->DrawInfo; + + drawInfo->Flags = PH_GRAPH_USE_GRID | PH_GRAPH_USE_LINE_2; + DiskSection->Parameters->ColorSetupFunction(drawInfo, PhGetIntegerSetting(L"ColorIoReadOther"), PhGetIntegerSetting(L"ColorIoWrite")); + + PhGraphStateGetDrawInfo( + &DiskGraphState, + getDrawInfo, + EtDiskReadHistory.Count + ); + + if (!DiskGraphState.Valid) + { + ULONG i; + FLOAT max = 0; + + for (i = 0; i < drawInfo->LineDataCount; i++) + { + FLOAT data1; + FLOAT data2; + + DiskGraphState.Data1[i] = data1 = + (FLOAT)PhGetItemCircularBuffer_ULONG(&EtDiskReadHistory, i); + DiskGraphState.Data2[i] = data2 = + (FLOAT)PhGetItemCircularBuffer_ULONG(&EtDiskWriteHistory, i); + + if (max < data1 + data2) + max = data1 + data2; + } + + // Minimum scaling of 1 MB. + if (max < 1024 * 1024) + max = 1024 * 1024; + + // Scale the data. + + PhxfDivideSingle2U( + DiskGraphState.Data1, + max, + drawInfo->LineDataCount + ); + PhxfDivideSingle2U( + DiskGraphState.Data2, + max, + drawInfo->LineDataCount + ); + + DiskGraphState.Valid = TRUE; + } + } + break; + case GCN_GETTOOLTIPTEXT: + { + PPH_GRAPH_GETTOOLTIPTEXT getTooltipText = (PPH_GRAPH_GETTOOLTIPTEXT)Header; + + if (getTooltipText->Index < getTooltipText->TotalCount) + { + if (DiskGraphState.TooltipIndex != getTooltipText->Index) + { + ULONG64 diskRead; + ULONG64 diskWrite; + + diskRead = PhGetItemCircularBuffer_ULONG(&EtDiskReadHistory, getTooltipText->Index); + diskWrite = PhGetItemCircularBuffer_ULONG(&EtDiskWriteHistory, getTooltipText->Index); + + PhSwapReference2(&DiskGraphState.TooltipText, PhFormatString( + L"R: %s\nW: %s%s\n%s", + PhaFormatSize(diskRead, -1)->Buffer, + PhaFormatSize(diskWrite, -1)->Buffer, + PhGetStringOrEmpty(EtpGetMaxDiskString(getTooltipText->Index)), + ((PPH_STRING)PHA_DEREFERENCE(PhGetStatisticsTimeString(NULL, getTooltipText->Index)))->Buffer + )); + } + + getTooltipText->Text = DiskGraphState.TooltipText->sr; + } + } + break; + case GCN_MOUSEEVENT: + { + PPH_GRAPH_MOUSEEVENT mouseEvent = (PPH_GRAPH_MOUSEEVENT)Header; + PPH_PROCESS_RECORD record; + + record = NULL; + + if (mouseEvent->Message == WM_LBUTTONDBLCLK && mouseEvent->Index < mouseEvent->TotalCount) + { + record = EtpReferenceMaxDiskRecord(mouseEvent->Index); + } + + if (record) + { + PhShowProcessRecordDialog(DiskDialog, record); + PhDereferenceProcessRecord(record); + } + } + break; + } +} + +VOID EtpUpdateDiskGraph( VOID ) { - if (!EtpEtwSysWindowHandle) - { - if (!(EtpEtwSysThreadHandle = PhCreateThread(0, EtpEtwSysThreadStart, NULL))) - { - PhShowStatus(PhMainWndHandle, L"Unable to create the ETW information window", 0, GetLastError()); - return; - } - - PhWaitForEvent(&InitializedEvent, NULL); - } - - SendMessage(EtpEtwSysWindowHandle, WM_ET_ETWSYS_ACTIVATE, 0, 0); + DiskGraphState.Valid = FALSE; + DiskGraphState.TooltipIndex = -1; + Graph_MoveGrid(DiskGraphHandle, 1); + Graph_Draw(DiskGraphHandle); + Graph_UpdateTooltip(DiskGraphHandle); + InvalidateRect(DiskGraphHandle, NULL, FALSE); } -static NTSTATUS EtpEtwSysThreadStart( - __in PVOID Parameter - ) -{ - PH_AUTO_POOL autoPool; - BOOL result; - MSG message; - - PhInitializeAutoPool(&autoPool); - - EtpEtwSysWindowHandle = CreateDialog( - PluginInstance->DllBase, - MAKEINTRESOURCE(IDD_SYSDISKNET), - NULL, - EtpEtwSysDlgProc - ); - - PhSetEvent(&InitializedEvent); - - while (result = GetMessage(&message, NULL, 0, 0)) - { - if (result == -1) - break; - - if (!IsDialogMessage(EtpEtwSysWindowHandle, &message)) - { - TranslateMessage(&message); - DispatchMessage(&message); - } - - PhDrainAutoPool(&autoPool); - } - - PhDeleteAutoPool(&autoPool); - PhResetEvent(&InitializedEvent); - NtClose(EtpEtwSysThreadHandle); - - EtpEtwSysWindowHandle = NULL; - EtpEtwSysPanelWindowHandle = NULL; - EtpEtwSysThreadHandle = NULL; - - return STATUS_SUCCESS; -} - -static VOID EtpSetAlwaysOnTop( +VOID EtpUpdateDiskPanel( VOID ) { - SetWindowPos(EtpEtwSysWindowHandle, AlwaysOnTop ? HWND_TOPMOST : HWND_NOTOPMOST, 0, 0, 0, 0, - SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE); + SetDlgItemText(DiskPanel, IDC_ZREADSDELTA_V, PhaFormatUInt64(EtDiskReadCountDelta.Delta, TRUE)->Buffer); + SetDlgItemText(DiskPanel, IDC_ZREADBYTESDELTA_V, PhaFormatSize(EtDiskReadDelta.Delta, -1)->Buffer); + SetDlgItemText(DiskPanel, IDC_ZWRITESDELTA_V, PhaFormatUInt64(EtDiskWriteCountDelta.Delta, TRUE)->Buffer); + SetDlgItemText(DiskPanel, IDC_ZWRITEBYTESDELTA_V, PhaFormatSize(EtDiskWriteDelta.Delta, -1)->Buffer); } -static VOID NTAPI EtwSysUpdateHandler( - __in_opt PVOID Parameter, - __in_opt PVOID Context - ) -{ - PostMessage(EtpEtwSysWindowHandle, WM_ET_ETWSYS_UPDATE, 0, 0); -} - -static PPH_PROCESS_RECORD EtpReferenceMaxDiskRecord( +PPH_PROCESS_RECORD EtpReferenceMaxDiskRecord( __in LONG Index ) { @@ -161,7 +412,7 @@ static PPH_PROCESS_RECORD EtpReferenceMaxDiskRecord( return PhFindProcessRecord((HANDLE)maxProcessId, &time); } -static PPH_STRING EtpGetMaxDiskString( +PPH_STRING EtpGetMaxDiskString( __in LONG Index ) { @@ -181,7 +432,341 @@ static PPH_STRING EtpGetMaxDiskString( return maxUsageString; } -static PPH_PROCESS_RECORD EtpReferenceMaxNetworkRecord( +BOOLEAN EtpNetworkSectionCallback( + __in PPH_SYSINFO_SECTION Section, + __in PH_SYSINFO_SECTION_MESSAGE Message, + __in_opt PVOID Parameter1, + __in_opt PVOID Parameter2 + ) +{ + switch (Message) + { + case SysInfoDestroy: + { + if (NetworkDialog) + { + PhDeleteGraphState(&NetworkGraphState); + NetworkDialog = NULL; + } + } + return TRUE; + case SysInfoTick: + { + if (NetworkDialog) + { + EtpUpdateNetworkGraph(); + EtpUpdateNetworkPanel(); + } + } + return TRUE; + case SysInfoCreateDialog: + { + PPH_SYSINFO_CREATE_DIALOG createDialog = Parameter1; + + createDialog->Instance = PluginInstance->DllBase; + createDialog->Template = MAKEINTRESOURCE(IDD_SYSINFO_NET); + createDialog->DialogProc = EtpNetworkDialogProc; + } + return TRUE; + case SysInfoGraphGetDrawInfo: + { + PPH_GRAPH_DRAW_INFO drawInfo = Parameter1; + + drawInfo->Flags = PH_GRAPH_USE_GRID | PH_GRAPH_USE_LINE_2; + Section->Parameters->ColorSetupFunction(drawInfo, PhGetIntegerSetting(L"ColorIoReadOther"), PhGetIntegerSetting(L"ColorIoWrite")); + PhGetDrawInfoGraphBuffers(&Section->GraphState.Buffers, drawInfo, EtNetworkReceiveHistory.Count); + + if (!Section->GraphState.Valid) + { + ULONG i; + FLOAT max = 0; + + for (i = 0; i < drawInfo->LineDataCount; i++) + { + FLOAT data1; + FLOAT data2; + + Section->GraphState.Data1[i] = data1 = + (FLOAT)PhGetItemCircularBuffer_ULONG(&EtNetworkReceiveHistory, i); + Section->GraphState.Data2[i] = data2 = + (FLOAT)PhGetItemCircularBuffer_ULONG(&EtNetworkSendHistory, i); + + if (max < data1 + data2) + max = data1 + data2; + } + + // Minimum scaling of 4 kB. + if (max < 4 * 1024) + max = 4 * 1024; + + // Scale the data. + + PhxfDivideSingle2U( + Section->GraphState.Data1, + max, + drawInfo->LineDataCount + ); + PhxfDivideSingle2U( + Section->GraphState.Data2, + max, + drawInfo->LineDataCount + ); + + Section->GraphState.Valid = TRUE; + } + } + return TRUE; + case SysInfoGraphGetTooltipText: + { + PPH_SYSINFO_GRAPH_GET_TOOLTIP_TEXT getTooltipText = Parameter1; + ULONG64 networkReceive; + ULONG64 networkSend; + + networkReceive = PhGetItemCircularBuffer_ULONG(&EtNetworkReceiveHistory, getTooltipText->Index); + networkSend = PhGetItemCircularBuffer_ULONG(&EtNetworkSendHistory, getTooltipText->Index); + + PhSwapReference2(&Section->GraphState.TooltipText, PhFormatString( + L"R: %s\nS: %s%s\n%s", + PhaFormatSize(networkReceive, -1)->Buffer, + PhaFormatSize(networkSend, -1)->Buffer, + PhGetStringOrEmpty(EtpGetMaxNetworkString(getTooltipText->Index)), + ((PPH_STRING)PHA_DEREFERENCE(PhGetStatisticsTimeString(NULL, getTooltipText->Index)))->Buffer + )); + getTooltipText->Text = Section->GraphState.TooltipText->sr; + } + return TRUE; + case SysInfoGraphDrawPanel: + { + PPH_SYSINFO_DRAW_PANEL drawPanel = Parameter1; + + drawPanel->Title = PhCreateString(L"Network"); + drawPanel->SubTitle = PhFormatString( + L"R: %s\nS: %s", + PhaFormatSize(EtNetworkReceiveDelta.Delta, -1)->Buffer, + PhaFormatSize(EtNetworkSendDelta.Delta, -1)->Buffer + ); + } + return TRUE; + } + + return FALSE; +} + +INT_PTR CALLBACK EtpNetworkDialogProc( + __in HWND hwndDlg, + __in UINT uMsg, + __in WPARAM wParam, + __in LPARAM lParam + ) +{ + switch (uMsg) + { + case WM_INITDIALOG: + { + PPH_LAYOUT_ITEM graphItem; + PPH_LAYOUT_ITEM panelItem; + + PhInitializeGraphState(&NetworkGraphState); + + NetworkDialog = hwndDlg; + PhInitializeLayoutManager(&NetworkLayoutManager, hwndDlg); + graphItem = PhAddLayoutItem(&NetworkLayoutManager, GetDlgItem(hwndDlg, IDC_GRAPH_LAYOUT), NULL, PH_ANCHOR_ALL); + panelItem = PhAddLayoutItem(&NetworkLayoutManager, GetDlgItem(hwndDlg, IDC_LAYOUT), NULL, PH_ANCHOR_LEFT | PH_ANCHOR_RIGHT | PH_ANCHOR_BOTTOM); + + SendMessage(GetDlgItem(hwndDlg, IDC_TITLE), WM_SETFONT, (WPARAM)NetworkSection->Parameters->LargeFont, FALSE); + + NetworkPanel = CreateDialog(PluginInstance->DllBase, MAKEINTRESOURCE(IDD_SYSINFO_NETPANEL), hwndDlg, EtpNetworkPanelDialogProc); + ShowWindow(NetworkPanel, SW_SHOW); + PhAddLayoutItemEx(&NetworkLayoutManager, NetworkPanel, NULL, PH_ANCHOR_LEFT | PH_ANCHOR_RIGHT | PH_ANCHOR_BOTTOM, panelItem->Margin); + + NetworkGraphHandle = CreateWindow( + PH_GRAPH_CLASSNAME, + NULL, + WS_VISIBLE | WS_CHILD | WS_BORDER, + 0, + 0, + 3, + 3, + hwndDlg, + (HMENU)IDC_NETWORK, + PluginInstance->DllBase, + NULL + ); + Graph_SetTooltip(NetworkGraphHandle, TRUE); + + PhAddLayoutItemEx(&NetworkLayoutManager, NetworkGraphHandle, NULL, PH_ANCHOR_ALL, graphItem->Margin); + + EtpUpdateNetworkGraph(); + EtpUpdateNetworkPanel(); + } + break; + case WM_DESTROY: + { + PhDeleteLayoutManager(&NetworkLayoutManager); + } + break; + case WM_SIZE: + { + PhLayoutManagerLayout(&NetworkLayoutManager); + } + break; + case WM_NOTIFY: + { + NMHDR *header = (NMHDR *)lParam; + + if (header->hwndFrom == NetworkGraphHandle) + { + EtpNotifyNetworkGraph(header); + } + } + break; + } + + return FALSE; +} + +INT_PTR CALLBACK EtpNetworkPanelDialogProc( + __in HWND hwndDlg, + __in UINT uMsg, + __in WPARAM wParam, + __in LPARAM lParam + ) +{ + return FALSE; +} + +VOID EtpNotifyNetworkGraph( + __in NMHDR *Header + ) +{ + switch (Header->code) + { + case GCN_GETDRAWINFO: + { + PPH_GRAPH_GETDRAWINFO getDrawInfo = (PPH_GRAPH_GETDRAWINFO)Header; + PPH_GRAPH_DRAW_INFO drawInfo = getDrawInfo->DrawInfo; + + drawInfo->Flags = PH_GRAPH_USE_GRID | PH_GRAPH_USE_LINE_2; + NetworkSection->Parameters->ColorSetupFunction(drawInfo, PhGetIntegerSetting(L"ColorIoReadOther"), PhGetIntegerSetting(L"ColorIoWrite")); + + PhGraphStateGetDrawInfo( + &NetworkGraphState, + getDrawInfo, + EtNetworkReceiveHistory.Count + ); + + if (!NetworkGraphState.Valid) + { + ULONG i; + FLOAT max = 0; + + for (i = 0; i < drawInfo->LineDataCount; i++) + { + FLOAT data1; + FLOAT data2; + + NetworkGraphState.Data1[i] = data1 = + (FLOAT)PhGetItemCircularBuffer_ULONG(&EtNetworkReceiveHistory, i); + NetworkGraphState.Data2[i] = data2 = + (FLOAT)PhGetItemCircularBuffer_ULONG(&EtNetworkSendHistory, i); + + if (max < data1 + data2) + max = data1 + data2; + } + + // Minimum scaling of 4 kB. + if (max < 4 * 1024) + max = 4 * 1024; + + // Scale the data. + + PhxfDivideSingle2U( + NetworkGraphState.Data1, + max, + drawInfo->LineDataCount + ); + PhxfDivideSingle2U( + NetworkGraphState.Data2, + max, + drawInfo->LineDataCount + ); + + NetworkGraphState.Valid = TRUE; + } + } + break; + case GCN_GETTOOLTIPTEXT: + { + PPH_GRAPH_GETTOOLTIPTEXT getTooltipText = (PPH_GRAPH_GETTOOLTIPTEXT)Header; + + if (getTooltipText->Index < getTooltipText->TotalCount) + { + if (NetworkGraphState.TooltipIndex != getTooltipText->Index) + { + ULONG64 networkReceive; + ULONG64 networkSend; + + networkReceive = PhGetItemCircularBuffer_ULONG(&EtNetworkReceiveHistory, getTooltipText->Index); + networkSend = PhGetItemCircularBuffer_ULONG(&EtNetworkSendHistory, getTooltipText->Index); + + PhSwapReference2(&NetworkGraphState.TooltipText, PhFormatString( + L"R: %s\nS: %s%s\n%s", + PhaFormatSize(networkReceive, -1)->Buffer, + PhaFormatSize(networkSend, -1)->Buffer, + PhGetStringOrEmpty(EtpGetMaxNetworkString(getTooltipText->Index)), + ((PPH_STRING)PHA_DEREFERENCE(PhGetStatisticsTimeString(NULL, getTooltipText->Index)))->Buffer + )); + } + + getTooltipText->Text = NetworkGraphState.TooltipText->sr; + } + } + break; + case GCN_MOUSEEVENT: + { + PPH_GRAPH_MOUSEEVENT mouseEvent = (PPH_GRAPH_MOUSEEVENT)Header; + PPH_PROCESS_RECORD record; + + record = NULL; + + if (mouseEvent->Message == WM_LBUTTONDBLCLK && mouseEvent->Index < mouseEvent->TotalCount) + { + record = EtpReferenceMaxNetworkRecord(mouseEvent->Index); + } + + if (record) + { + PhShowProcessRecordDialog(NetworkDialog, record); + PhDereferenceProcessRecord(record); + } + } + break; + } +} + +VOID EtpUpdateNetworkGraph( + VOID + ) +{ + NetworkGraphState.Valid = FALSE; + NetworkGraphState.TooltipIndex = -1; + Graph_MoveGrid(NetworkGraphHandle, 1); + Graph_Draw(NetworkGraphHandle); + Graph_UpdateTooltip(NetworkGraphHandle); + InvalidateRect(NetworkGraphHandle, NULL, FALSE); +} + +VOID EtpUpdateNetworkPanel( + VOID + ) +{ + SetDlgItemText(NetworkPanel, IDC_ZRECEIVESDELTA_V, PhaFormatUInt64(EtNetworkReceiveCountDelta.Delta, TRUE)->Buffer); + SetDlgItemText(NetworkPanel, IDC_ZRECEIVEBYTESDELTA_V, PhaFormatSize(EtNetworkReceiveDelta.Delta, -1)->Buffer); + SetDlgItemText(NetworkPanel, IDC_ZSENDSDELTA_V, PhaFormatUInt64(EtNetworkSendCountDelta.Delta, TRUE)->Buffer); + SetDlgItemText(NetworkPanel, IDC_ZSENDBYTESDELTA_V, PhaFormatSize(EtNetworkSendDelta.Delta, -1)->Buffer); +} + +PPH_PROCESS_RECORD EtpReferenceMaxNetworkRecord( __in LONG Index ) { @@ -199,7 +784,7 @@ static PPH_PROCESS_RECORD EtpReferenceMaxNetworkRecord( return PhFindProcessRecord((HANDLE)maxProcessId, &time); } -static PPH_STRING EtpGetMaxNetworkString( +PPH_STRING EtpGetMaxNetworkString( __in LONG Index ) { @@ -218,503 +803,3 @@ static PPH_STRING EtpGetMaxNetworkString( return maxUsageString; } - -INT_PTR CALLBACK EtpEtwSysDlgProc( - __in HWND hwndDlg, - __in UINT uMsg, - __in WPARAM wParam, - __in LPARAM lParam - ) -{ - switch (uMsg) - { - case WM_INITDIALOG: - { - PhSetWindowStyle(hwndDlg, WS_CLIPCHILDREN, WS_CLIPCHILDREN); - - PhInitializeLayoutManager(&WindowLayoutManager, hwndDlg); - - PhAddLayoutItem(&WindowLayoutManager, GetDlgItem(hwndDlg, IDC_ALWAYSONTOP), NULL, PH_ANCHOR_RIGHT | PH_ANCHOR_BOTTOM); - PhAddLayoutItem(&WindowLayoutManager, GetDlgItem(hwndDlg, IDOK), NULL, PH_ANCHOR_RIGHT | PH_ANCHOR_BOTTOM); - - PhLoadWindowPlacementFromSetting(SETTING_NAME_ETWSYS_WINDOW_POSITION, SETTING_NAME_ETWSYS_WINDOW_SIZE, hwndDlg); - - PhInitializeGraphState(&DiskGraphState); - PhInitializeGraphState(&NetworkGraphState); - - DiskGraphHandle = CreateWindow( - PH_GRAPH_CLASSNAME, - L"", - WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE, - 0, - 0, - 3, - 3, - hwndDlg, - (HMENU)IDC_DISK, - PluginInstance->DllBase, - NULL - ); - Graph_SetTooltip(DiskGraphHandle, TRUE); - BringWindowToTop(DiskGraphHandle); - - NetworkGraphHandle = CreateWindow( - PH_GRAPH_CLASSNAME, - L"", - WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE, - 0, - 0, - 3, - 3, - hwndDlg, - (HMENU)IDC_NETWORK, - PluginInstance->DllBase, - NULL - ); - Graph_SetTooltip(NetworkGraphHandle, TRUE); - BringWindowToTop(NetworkGraphHandle); - - PhRegisterCallback( - &PhProcessesUpdatedEvent, - EtwSysUpdateHandler, - NULL, - &ProcessesUpdatedRegistration - ); - } - break; - case WM_DESTROY: - { - PhUnregisterCallback( - &PhProcessesUpdatedEvent, - &ProcessesUpdatedRegistration - ); - - PhDeleteGraphState(&DiskGraphState); - PhDeleteGraphState(&NetworkGraphState); - - PhSetIntegerSetting(SETTING_NAME_ETWSYS_ALWAYS_ON_TOP, AlwaysOnTop); - PhSaveWindowPlacementToSetting(SETTING_NAME_ETWSYS_WINDOW_POSITION, SETTING_NAME_ETWSYS_WINDOW_SIZE, hwndDlg); - - PhDeleteLayoutManager(&WindowLayoutManager); - PostQuitMessage(0); - } - break; - case WM_SHOWWINDOW: - { - RECT margin; - - EtpEtwSysPanelWindowHandle = CreateDialog( - PluginInstance->DllBase, - MAKEINTRESOURCE(IDD_SYSDISKNET_PANEL), - EtpEtwSysWindowHandle, - EtpEtwSysPanelDlgProc - ); - - SetWindowPos(EtpEtwSysPanelWindowHandle, NULL, 10, 0, 0, 0, - SWP_NOACTIVATE | SWP_NOREDRAW | SWP_NOSIZE | SWP_NOZORDER); - ShowWindow(EtpEtwSysPanelWindowHandle, SW_SHOW); - - AlwaysOnTop = (BOOLEAN)PhGetIntegerSetting(SETTING_NAME_ETWSYS_ALWAYS_ON_TOP); - Button_SetCheck(GetDlgItem(hwndDlg, IDC_ALWAYSONTOP), AlwaysOnTop ? BST_CHECKED : BST_UNCHECKED); - EtpSetAlwaysOnTop(); - - margin.left = 0; - margin.top = 0; - margin.right = 0; - margin.bottom = 25; - MapDialogRect(hwndDlg, &margin); - - PhAddLayoutItemEx(&WindowLayoutManager, EtpEtwSysPanelWindowHandle, NULL, PH_ANCHOR_BOTTOM | PH_ANCHOR_LEFT, margin); - - SendMessage(hwndDlg, WM_SIZE, 0, 0); - SendMessage(hwndDlg, WM_ET_ETWSYS_UPDATE, 0, 0); - } - break; - case WM_SIZE: - { - HDWP deferHandle; - HWND diskGroupBox = GetDlgItem(hwndDlg, IDC_GROUPDISK); - HWND networkGroupBox = GetDlgItem(hwndDlg, IDC_GROUPNETWORK); - RECT clientRect; - RECT panelRect; - RECT margin = { 13, 13, 13, 13 }; - RECT innerMargin = { 10, 20, 10, 10 }; - LONG between = 3; - LONG width; - LONG height; - - PhLayoutManagerLayout(&WindowLayoutManager); - - DiskGraphState.Valid = FALSE; - NetworkGraphState.Valid = FALSE; - - GetClientRect(hwndDlg, &clientRect); - // Limit the rectangle bottom to the top of the panel. - GetWindowRect(EtpEtwSysPanelWindowHandle, &panelRect); - MapWindowPoints(NULL, hwndDlg, (POINT *)&panelRect, 2); - clientRect.bottom = panelRect.top; - - width = clientRect.right - margin.left - margin.right; - height = (clientRect.bottom - margin.top - margin.bottom - between * 2) / 2; - - deferHandle = BeginDeferWindowPos(4); - - deferHandle = DeferWindowPos(deferHandle, diskGroupBox, NULL, margin.left, margin.top, - width, height, SWP_NOACTIVATE | SWP_NOZORDER); - deferHandle = DeferWindowPos( - deferHandle, - DiskGraphHandle, - NULL, - margin.left + innerMargin.left, - margin.top + innerMargin.top, - width - innerMargin.left - innerMargin.right, - height - innerMargin.top - innerMargin.bottom, - SWP_NOACTIVATE | SWP_NOZORDER - ); - - deferHandle = DeferWindowPos(deferHandle, networkGroupBox, NULL, margin.left, margin.top + height + between, - width, height, SWP_NOACTIVATE | SWP_NOZORDER); - deferHandle = DeferWindowPos( - deferHandle, - NetworkGraphHandle, - NULL, - margin.left + innerMargin.left, - margin.top + height + between + innerMargin.top, - width - innerMargin.left - innerMargin.right, - height - innerMargin.top - innerMargin.bottom, - SWP_NOACTIVATE | SWP_NOZORDER - ); - - EndDeferWindowPos(deferHandle); - } - break; - case WM_SIZING: - { - PhResizingMinimumSize((PRECT)lParam, wParam, 420, 350); - } - break; - case WM_COMMAND: - { - switch (LOWORD(wParam)) - { - case IDCANCEL: - case IDOK: - DestroyWindow(hwndDlg); - break; - case IDC_ALWAYSONTOP: - { - AlwaysOnTop = Button_GetCheck(GetDlgItem(hwndDlg, IDC_ALWAYSONTOP)) == BST_CHECKED; - EtpSetAlwaysOnTop(); - } - break; - } - } - break; - case WM_NOTIFY: - { - LPNMHDR header = (LPNMHDR)lParam; - - switch (header->code) - { - case GCN_GETDRAWINFO: - { - PPH_GRAPH_GETDRAWINFO getDrawInfo = (PPH_GRAPH_GETDRAWINFO)header; - PPH_GRAPH_DRAW_INFO drawInfo = getDrawInfo->DrawInfo; - - if (header->hwndFrom == DiskGraphHandle) - { - if (PhGetIntegerSetting(L"GraphShowText")) - { - HDC hdc; - - PhSwapReference2(&DiskGraphState.TooltipText, - PhFormatString( - L"R: %s, W: %s", - PhaFormatSize(EtDiskReadDelta.Delta, -1)->Buffer, - PhaFormatSize(EtDiskWriteDelta.Delta, -1)->Buffer - )); - - hdc = Graph_GetBufferedContext(DiskGraphHandle); - SelectObject(hdc, PhApplicationFont); - PhSetGraphText(hdc, drawInfo, &DiskGraphState.TooltipText->sr, - &EtpNormalGraphTextMargin, &EtpNormalGraphTextPadding, PH_ALIGN_TOP | PH_ALIGN_LEFT); - } - else - { - drawInfo->Text.Buffer = NULL; - } - - drawInfo->Flags = PH_GRAPH_USE_GRID | PH_GRAPH_USE_LINE_2; - drawInfo->LineColor1 = PhGetIntegerSetting(L"ColorIoReadOther"); - drawInfo->LineColor2 = PhGetIntegerSetting(L"ColorIoWrite"); - drawInfo->LineBackColor1 = PhHalveColorBrightness(drawInfo->LineColor1); - drawInfo->LineBackColor2 = PhHalveColorBrightness(drawInfo->LineColor2); - - PhGraphStateGetDrawInfo( - &DiskGraphState, - getDrawInfo, - EtDiskReadHistory.Count - ); - - if (!DiskGraphState.Valid) - { - ULONG i; - FLOAT max = 0; - - for (i = 0; i < drawInfo->LineDataCount; i++) - { - FLOAT data1; - FLOAT data2; - - DiskGraphState.Data1[i] = data1 = - (FLOAT)PhGetItemCircularBuffer_ULONG(&EtDiskReadHistory, i); - DiskGraphState.Data2[i] = data2 = - (FLOAT)PhGetItemCircularBuffer_ULONG(&EtDiskWriteHistory, i); - - if (max < data1 + data2) - max = data1 + data2; - } - - if (max != 0) - { - // Scale the data. - - PhxfDivideSingle2U( - DiskGraphState.Data1, - max, - drawInfo->LineDataCount - ); - PhxfDivideSingle2U( - DiskGraphState.Data2, - max, - drawInfo->LineDataCount - ); - } - - DiskGraphState.Valid = TRUE; - } - } - else if (header->hwndFrom == NetworkGraphHandle) - { - if (PhGetIntegerSetting(L"GraphShowText")) - { - HDC hdc; - - PhSwapReference2(&NetworkGraphState.TooltipText, - PhFormatString( - L"R: %s, S: %s", - PhaFormatSize(EtNetworkReceiveDelta.Delta, -1)->Buffer, - PhaFormatSize(EtNetworkSendDelta.Delta, -1)->Buffer - )); - - hdc = Graph_GetBufferedContext(NetworkGraphHandle); - SelectObject(hdc, PhApplicationFont); - PhSetGraphText(hdc, drawInfo, &NetworkGraphState.TooltipText->sr, - &EtpNormalGraphTextMargin, &EtpNormalGraphTextPadding, PH_ALIGN_TOP | PH_ALIGN_LEFT); - } - else - { - drawInfo->Text.Buffer = NULL; - } - - drawInfo->Flags = PH_GRAPH_USE_GRID | PH_GRAPH_USE_LINE_2; - drawInfo->LineColor1 = PhGetIntegerSetting(L"ColorIoReadOther"); - drawInfo->LineColor2 = PhGetIntegerSetting(L"ColorIoWrite"); - drawInfo->LineBackColor1 = PhHalveColorBrightness(drawInfo->LineColor1); - drawInfo->LineBackColor2 = PhHalveColorBrightness(drawInfo->LineColor2); - - PhGraphStateGetDrawInfo( - &NetworkGraphState, - getDrawInfo, - EtNetworkReceiveHistory.Count - ); - - if (!NetworkGraphState.Valid) - { - ULONG i; - FLOAT max = 0; - - for (i = 0; i < drawInfo->LineDataCount; i++) - { - FLOAT data1; - FLOAT data2; - - NetworkGraphState.Data1[i] = data1 = - (FLOAT)PhGetItemCircularBuffer_ULONG(&EtNetworkReceiveHistory, i); - NetworkGraphState.Data2[i] = data2 = - (FLOAT)PhGetItemCircularBuffer_ULONG(&EtNetworkSendHistory, i); - - if (max < data1 + data2) - max = data1 + data2; - } - - if (max != 0) - { - // Scale the data. - - PhxfDivideSingle2U( - NetworkGraphState.Data1, - max, - drawInfo->LineDataCount - ); - PhxfDivideSingle2U( - NetworkGraphState.Data2, - max, - drawInfo->LineDataCount - ); - } - - NetworkGraphState.Valid = TRUE; - } - } - } - break; - case GCN_GETTOOLTIPTEXT: - { - PPH_GRAPH_GETTOOLTIPTEXT getTooltipText = (PPH_GRAPH_GETTOOLTIPTEXT)lParam; - - if ( - header->hwndFrom == DiskGraphHandle && - getTooltipText->Index < getTooltipText->TotalCount - ) - { - if (DiskGraphState.TooltipIndex != getTooltipText->Index) - { - ULONG64 diskRead; - ULONG64 diskWrite; - - diskRead = PhGetItemCircularBuffer_ULONG(&EtDiskReadHistory, getTooltipText->Index); - diskWrite = PhGetItemCircularBuffer_ULONG(&EtDiskWriteHistory, getTooltipText->Index); - - PhSwapReference2(&DiskGraphState.TooltipText, PhFormatString( - L"R: %s\nW: %s%s\n%s", - PhaFormatSize(diskRead, -1)->Buffer, - PhaFormatSize(diskWrite, -1)->Buffer, - PhGetStringOrEmpty(EtpGetMaxDiskString(getTooltipText->Index)), - ((PPH_STRING)PHA_DEREFERENCE(PhGetStatisticsTimeString(NULL, getTooltipText->Index)))->Buffer - )); - } - - getTooltipText->Text = DiskGraphState.TooltipText->sr; - } - else if ( - header->hwndFrom == NetworkGraphHandle && - getTooltipText->Index < getTooltipText->TotalCount - ) - { - if (NetworkGraphState.TooltipIndex != getTooltipText->Index) - { - ULONG64 networkReceive; - ULONG64 networkSend; - - networkReceive = PhGetItemCircularBuffer_ULONG(&EtNetworkReceiveHistory, getTooltipText->Index); - networkSend = PhGetItemCircularBuffer_ULONG(&EtNetworkSendHistory, getTooltipText->Index); - - PhSwapReference2(&NetworkGraphState.TooltipText, PhFormatString( - L"R: %s\nS: %s%s\n%s", - PhaFormatSize(networkReceive, -1)->Buffer, - PhaFormatSize(networkSend, -1)->Buffer, - PhGetStringOrEmpty(EtpGetMaxNetworkString(getTooltipText->Index)), - ((PPH_STRING)PHA_DEREFERENCE(PhGetStatisticsTimeString(NULL, getTooltipText->Index)))->Buffer - )); - } - - getTooltipText->Text = NetworkGraphState.TooltipText->sr; - } - } - break; - case GCN_MOUSEEVENT: - { - PPH_GRAPH_MOUSEEVENT mouseEvent = (PPH_GRAPH_MOUSEEVENT)lParam; - PPH_PROCESS_RECORD record; - - record = NULL; - - if (mouseEvent->Message == WM_LBUTTONDBLCLK) - { - if ( - header->hwndFrom == DiskGraphHandle && - mouseEvent->Index < mouseEvent->TotalCount - ) - { - record = EtpReferenceMaxDiskRecord(mouseEvent->Index); - } - else if ( - header->hwndFrom == NetworkGraphHandle && - mouseEvent->Index < mouseEvent->TotalCount - ) - { - record = EtpReferenceMaxNetworkRecord(mouseEvent->Index); - } - } - - if (record) - { - PhShowProcessRecordDialog(hwndDlg, record); - PhDereferenceProcessRecord(record); - } - } - break; - } - } - break; - case WM_ET_ETWSYS_ACTIVATE: - { - if (IsIconic(hwndDlg)) - ShowWindow(hwndDlg, SW_RESTORE); - else - ShowWindow(hwndDlg, SW_SHOW); - - SetForegroundWindow(hwndDlg); - } - break; - case WM_ET_ETWSYS_UPDATE: - { - DiskGraphState.Valid = FALSE; - DiskGraphState.TooltipIndex = -1; - Graph_MoveGrid(DiskGraphHandle, 1); - Graph_Draw(DiskGraphHandle); - Graph_UpdateTooltip(DiskGraphHandle); - InvalidateRect(DiskGraphHandle, NULL, FALSE); - - NetworkGraphState.Valid = FALSE; - NetworkGraphState.TooltipIndex = -1; - Graph_MoveGrid(NetworkGraphHandle, 1); - Graph_Draw(NetworkGraphHandle); - Graph_UpdateTooltip(NetworkGraphHandle); - InvalidateRect(NetworkGraphHandle, NULL, FALSE); - - SendMessage(EtpEtwSysPanelWindowHandle, WM_ET_ETWSYS_PANEL_UPDATE, 0, 0); - } - break; - } - - return FALSE; -} - -INT_PTR CALLBACK EtpEtwSysPanelDlgProc( - __in HWND hwndDlg, - __in UINT uMsg, - __in WPARAM wParam, - __in LPARAM lParam - ) -{ - switch (uMsg) - { - case WM_ET_ETWSYS_PANEL_UPDATE: - { - SetDlgItemText(hwndDlg, IDC_ZREADS_V, PhaFormatUInt64(EtDiskReadCount, TRUE)->Buffer); - SetDlgItemText(hwndDlg, IDC_ZREADBYTES_V, PhaFormatSize(EtDiskReadDelta.Value, -1)->Buffer); - SetDlgItemText(hwndDlg, IDC_ZWRITES_V, PhaFormatUInt64(EtDiskWriteCount, TRUE)->Buffer); - SetDlgItemText(hwndDlg, IDC_ZWRITEBYTES_V, PhaFormatSize(EtDiskWriteDelta.Value, -1)->Buffer); - - SetDlgItemText(hwndDlg, IDC_ZRECEIVES_V, PhaFormatUInt64(EtNetworkReceiveCount, TRUE)->Buffer); - SetDlgItemText(hwndDlg, IDC_ZRECEIVEBYTES_V, PhaFormatSize(EtNetworkReceiveDelta.Value, -1)->Buffer); - SetDlgItemText(hwndDlg, IDC_ZSENDS_V, PhaFormatUInt64(EtNetworkSendCount, TRUE)->Buffer); - SetDlgItemText(hwndDlg, IDC_ZSENDBYTES_V, PhaFormatSize(EtNetworkSendDelta.Value, -1)->Buffer); - } - break; - } - - return FALSE; -} diff --git a/2.x/trunk/plugins/ExtendedTools/etwsys.h b/2.x/trunk/plugins/ExtendedTools/etwsys.h new file mode 100644 index 000000000..fbccbed4d --- /dev/null +++ b/2.x/trunk/plugins/ExtendedTools/etwsys.h @@ -0,0 +1,90 @@ +#ifndef ETWSYS_H +#define ETWSYS_H + +// Disk section + +BOOLEAN EtpDiskSectionCallback( + __in PPH_SYSINFO_SECTION Section, + __in PH_SYSINFO_SECTION_MESSAGE Message, + __in_opt PVOID Parameter1, + __in_opt PVOID Parameter2 + ); + +INT_PTR CALLBACK EtpDiskDialogProc( + __in HWND hwndDlg, + __in UINT uMsg, + __in WPARAM wParam, + __in LPARAM lParam + ); + +INT_PTR CALLBACK EtpDiskPanelDialogProc( + __in HWND hwndDlg, + __in UINT uMsg, + __in WPARAM wParam, + __in LPARAM lParam + ); + +VOID EtpNotifyDiskGraph( + __in NMHDR *Header + ); + +VOID EtpUpdateDiskGraph( + VOID + ); + +VOID EtpUpdateDiskPanel( + VOID + ); + +PPH_PROCESS_RECORD EtpReferenceMaxDiskRecord( + __in LONG Index + ); + +PPH_STRING EtpGetMaxDiskString( + __in LONG Index + ); + +// Network section + +BOOLEAN EtpNetworkSectionCallback( + __in PPH_SYSINFO_SECTION Section, + __in PH_SYSINFO_SECTION_MESSAGE Message, + __in_opt PVOID Parameter1, + __in_opt PVOID Parameter2 + ); + +INT_PTR CALLBACK EtpNetworkDialogProc( + __in HWND hwndDlg, + __in UINT uMsg, + __in WPARAM wParam, + __in LPARAM lParam + ); + +INT_PTR CALLBACK EtpNetworkPanelDialogProc( + __in HWND hwndDlg, + __in UINT uMsg, + __in WPARAM wParam, + __in LPARAM lParam + ); + +VOID EtpNotifyNetworkGraph( + __in NMHDR *Header + ); + +VOID EtpUpdateNetworkGraph( + VOID + ); + +VOID EtpUpdateNetworkPanel( + VOID + ); + +PPH_PROCESS_RECORD EtpReferenceMaxNetworkRecord( + __in LONG Index + ); + +PPH_STRING EtpGetMaxNetworkString( + __in LONG Index + ); + +#endif diff --git a/2.x/trunk/plugins/ExtendedTools/exttools.h b/2.x/trunk/plugins/ExtendedTools/exttools.h index 67c92759c..3f8057a9f 100644 --- a/2.x/trunk/plugins/ExtendedTools/exttools.h +++ b/2.x/trunk/plugins/ExtendedTools/exttools.h @@ -15,13 +15,6 @@ extern HWND NetworkTreeNewHandle; #define SETTING_NAME_DISK_TREE_LIST_SORT (SETTING_PREFIX L"DiskTreeListSort") #define SETTING_NAME_ENABLE_ETW_MONITOR (SETTING_PREFIX L"EnableEtwMonitor") #define SETTING_NAME_ENABLE_GPU_MONITOR (SETTING_PREFIX L"EnableGpuMonitor") -#define SETTING_NAME_ETWSYS_ALWAYS_ON_TOP (SETTING_PREFIX L"EtwSysAlwaysOnTop") -#define SETTING_NAME_ETWSYS_WINDOW_POSITION (SETTING_PREFIX L"EtwSysWindowPosition") -#define SETTING_NAME_ETWSYS_WINDOW_SIZE (SETTING_PREFIX L"EtwSysWindowSize") -#define SETTING_NAME_GPUSYS_ALWAYS_ON_TOP (SETTING_PREFIX L"GpuSysAlwaysOnTop") -#define SETTING_NAME_GPUSYS_WINDOW_POSITION (SETTING_PREFIX L"GpuSysWindowPosition") -#define SETTING_NAME_GPUSYS_WINDOW_SIZE (SETTING_PREFIX L"GpuSysWindowSize") -#define SETTING_NAME_MEMORY_LISTS_WINDOW_POSITION (SETTING_PREFIX L"MemoryListsWindowPosition") // Process icon @@ -265,6 +258,11 @@ extern PH_UINT32_DELTA EtDiskWriteDelta; extern PH_UINT32_DELTA EtNetworkReceiveDelta; extern PH_UINT32_DELTA EtNetworkSendDelta; +extern PH_UINT32_DELTA EtDiskReadCountDelta; +extern PH_UINT32_DELTA EtDiskWriteCountDelta; +extern PH_UINT32_DELTA EtNetworkReceiveCountDelta; +extern PH_UINT32_DELTA EtNetworkSendCountDelta; + extern PH_CIRCULAR_BUFFER_ULONG EtDiskReadHistory; extern PH_CIRCULAR_BUFFER_ULONG EtDiskWriteHistory; extern PH_CIRCULAR_BUFFER_ULONG EtNetworkReceiveHistory; @@ -397,6 +395,14 @@ typedef struct _ET_PROCESS_GPU_STATISTICS ULONG64 ContextSwitches; } ET_PROCESS_GPU_STATISTICS, *PET_PROCESS_GPU_STATISTICS; +ULONG EtGetGpuAdapterCount( + VOID + ); + +PPH_STRING EtGetGpuAdapterDescription( + __in ULONG Index + ); + VOID EtQueryProcessGpuStatistics( __in HANDLE ProcessHandle, __out PET_PROCESS_GPU_STATISTICS Statistics @@ -432,8 +438,8 @@ ET_FIREWALL_STATUS EtQueryFirewallStatus( // etwsys -VOID EtShowEtwSystemDialog( - VOID +VOID EtEtwSystemInformationInitializing( + __in PPH_PLUGIN_SYSINFO_POINTERS Pointers ); // gpusys @@ -442,12 +448,6 @@ VOID EtGpuSystemInformationInitializing( __in PPH_PLUGIN_SYSINFO_POINTERS Pointers ); -// memlists - -VOID EtShowMemoryListsDialog( - VOID - ); - // modsrv VOID EtShowModuleServicesDialog( diff --git a/2.x/trunk/plugins/ExtendedTools/gpumon.c b/2.x/trunk/plugins/ExtendedTools/gpumon.c index 661afe927..dd1959502 100644 --- a/2.x/trunk/plugins/ExtendedTools/gpumon.c +++ b/2.x/trunk/plugins/ExtendedTools/gpumon.c @@ -34,6 +34,7 @@ static _SetupDiGetClassDevsW SetupDiGetClassDevsW_I; static _SetupDiDestroyDeviceInfoList SetupDiDestroyDeviceInfoList_I; static _SetupDiEnumDeviceInterfaces SetupDiEnumDeviceInterfaces_I; static _SetupDiGetDeviceInterfaceDetailW SetupDiGetDeviceInterfaceDetailW_I; +static _SetupDiGetDeviceRegistryPropertyW SetupDiGetDeviceRegistryPropertyW_I; BOOLEAN EtGpuEnabled; static PPH_LIST EtpGpuAdapterList; @@ -80,6 +81,7 @@ VOID EtGpuMonitorInitialization( SetupDiDestroyDeviceInfoList_I = (PVOID)GetProcAddress(setupapiHandle, "SetupDiDestroyDeviceInfoList"); SetupDiEnumDeviceInterfaces_I = (PVOID)GetProcAddress(setupapiHandle, "SetupDiEnumDeviceInterfaces"); SetupDiGetDeviceInterfaceDetailW_I = (PVOID)GetProcAddress(setupapiHandle, "SetupDiGetDeviceInterfaceDetailW"); + SetupDiGetDeviceRegistryPropertyW_I = (PVOID)GetProcAddress(setupapiHandle, "SetupDiGetDeviceRegistryPropertyW"); } if ( @@ -128,6 +130,7 @@ static BOOLEAN EtpInitializeD3DStatistics( ULONG memberIndex; SP_DEVICE_INTERFACE_DATA deviceInterfaceData; PSP_DEVICE_INTERFACE_DETAIL_DATA detailData; + SP_DEVINFO_DATA deviceInfoData; ULONG detailDataSize; D3DKMT_OPENADAPTERFROMDEVICENAME openAdapterFromDeviceName; D3DKMT_QUERYSTATISTICS queryStatistics; @@ -145,8 +148,9 @@ static BOOLEAN EtpInitializeD3DStatistics( detailDataSize = 0x100; detailData = PhAllocate(detailDataSize); detailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); + deviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA); - if (!(result = SetupDiGetDeviceInterfaceDetailW_I(deviceInfoSet, &deviceInterfaceData, detailData, detailDataSize, &detailDataSize, NULL)) && + if (!(result = SetupDiGetDeviceInterfaceDetailW_I(deviceInfoSet, &deviceInterfaceData, detailData, detailDataSize, &detailDataSize, &deviceInfoData)) && GetLastError() == ERROR_INSUFFICIENT_BUFFER) { PhFree(detailData); @@ -155,7 +159,7 @@ static BOOLEAN EtpInitializeD3DStatistics( if (detailDataSize >= sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA)) detailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); - result = SetupDiGetDeviceInterfaceDetailW_I(deviceInfoSet, &deviceInterfaceData, detailData, detailDataSize, &detailDataSize, NULL); + result = SetupDiGetDeviceInterfaceDetailW_I(deviceInfoSet, &deviceInterfaceData, detailData, detailDataSize, &detailDataSize, &deviceInfoData); } if (result) @@ -175,6 +179,7 @@ static BOOLEAN EtpInitializeD3DStatistics( gpuAdapter = PhAllocate(sizeof(ETP_GPU_ADAPTER)); gpuAdapter->AdapterLuid = openAdapterFromDeviceName.AdapterLuid; + gpuAdapter->Description = EtpQueryDeviceDescription(deviceInfoSet, &deviceInfoData); gpuAdapter->NodeCount = queryStatistics.QueryResult.AdapterInformation.NodeCount; gpuAdapter->SegmentCount = queryStatistics.QueryResult.AdapterInformation.NbSegments; gpuAdapter->ApertureBitMap = 0; @@ -232,6 +237,56 @@ static BOOLEAN EtpInitializeD3DStatistics( return TRUE; } +static PPH_STRING EtpQueryDeviceDescription( + __in HDEVINFO DeviceInfoSet, + __in PSP_DEVINFO_DATA DeviceInfoData + ) +{ + LOGICAL result; + PPH_STRING string; + ULONG bufferSize; + + if (!SetupDiGetDeviceRegistryPropertyW_I) + return NULL; + + bufferSize = 0x40; + string = PhCreateStringEx(NULL, bufferSize); + + if (!(result = SetupDiGetDeviceRegistryPropertyW_I( + DeviceInfoSet, + DeviceInfoData, + SPDRP_DEVICEDESC, + NULL, + (PBYTE)string->Buffer, + bufferSize, + &bufferSize + )) && GetLastError() == ERROR_INSUFFICIENT_BUFFER) + { + PhDereferenceObject(string); + string = PhCreateStringEx(NULL, bufferSize); + + result = SetupDiGetDeviceRegistryPropertyW_I( + DeviceInfoSet, + DeviceInfoData, + SPDRP_DEVICEDESC, + NULL, + (PBYTE)string->Buffer, + bufferSize, + NULL + ); + } + + if (!result) + { + PhDereferenceObject(string); + return NULL; + } + + PhTrimToNullTerminatorString(string); + + return string; +} + static VOID EtpUpdateSegmentInformation( __in_opt PET_PROCESS_BLOCK Block ) @@ -467,6 +522,35 @@ static VOID NTAPI ProcessesUpdatedCallback( runCount++; } +ULONG EtGetGpuAdapterCount( + VOID + ) +{ + return EtpGpuAdapterList->Count; +} + +PPH_STRING EtGetGpuAdapterDescription( + __in ULONG Index + ) +{ + PPH_STRING description; + + if (Index >= EtpGpuAdapterList->Count) + return NULL; + + description = ((PETP_GPU_ADAPTER)EtpGpuAdapterList->Items[Index])->Description; + + if (description) + { + PhReferenceObject(description); + return description; + } + else + { + return NULL; + } +} + VOID EtQueryProcessGpuStatistics( __in HANDLE ProcessHandle, __out PET_PROCESS_GPU_STATISTICS Statistics diff --git a/2.x/trunk/plugins/ExtendedTools/gpumon.h b/2.x/trunk/plugins/ExtendedTools/gpumon.h index 627c28790..252cd0d9c 100644 --- a/2.x/trunk/plugins/ExtendedTools/gpumon.h +++ b/2.x/trunk/plugins/ExtendedTools/gpumon.h @@ -31,11 +31,22 @@ typedef BOOL (WINAPI *_SetupDiGetDeviceInterfaceDetailW)( __out_opt PSP_DEVINFO_DATA DeviceInfoData ); +typedef BOOL (WINAPI *_SetupDiGetDeviceRegistryPropertyW)( + __in HDEVINFO DeviceInfoSet, + __in PSP_DEVINFO_DATA DeviceInfoData, + __in DWORD Property, + __out_opt PDWORD PropertyRegDataType, + __out_opt PBYTE PropertyBuffer, + __in DWORD PropertyBufferSize, + __out_opt PDWORD RequiredSize + ); + // Structures typedef struct _ETP_GPU_ADAPTER { LUID AdapterLuid; + PPH_STRING Description; ULONG SegmentCount; ULONG NodeCount; @@ -48,6 +59,11 @@ BOOLEAN EtpInitializeD3DStatistics( VOID ); +PPH_STRING EtpQueryDeviceDescription( + __in HDEVINFO DeviceInfoSet, + __in PSP_DEVINFO_DATA DeviceInfoData + ); + VOID NTAPI ProcessesUpdatedCallback( __in_opt PVOID Parameter, __in_opt PVOID Context diff --git a/2.x/trunk/plugins/ExtendedTools/gpusys.c b/2.x/trunk/plugins/ExtendedTools/gpusys.c index 0509163aa..bfb9d27cd 100644 --- a/2.x/trunk/plugins/ExtendedTools/gpusys.c +++ b/2.x/trunk/plugins/ExtendedTools/gpusys.c @@ -23,81 +23,7 @@ #include "exttools.h" #include "resource.h" #include - -#define ET_GPU_PADDING 3 - -BOOLEAN EtpGpuSectionCallback( - __in PPH_SYSINFO_SECTION Section, - __in PH_SYSINFO_SECTION_MESSAGE Message, - __in_opt PVOID Parameter1, - __in_opt PVOID Parameter2 - ); - -VOID EtpInitializeGpuDialog( - VOID - ); - -VOID EtpUninitializeGpuDialog( - VOID - ); - -VOID EtpTickGpuDialog( - VOID - ); - -INT_PTR CALLBACK EtpGpuDialogProc( - __in HWND hwndDlg, - __in UINT uMsg, - __in WPARAM wParam, - __in LPARAM lParam - ); - -INT_PTR CALLBACK EtpGpuPanelDialogProc( - __in HWND hwndDlg, - __in UINT uMsg, - __in WPARAM wParam, - __in LPARAM lParam - ); - -VOID EtpCreateGpuGraphs( - VOID - ); - -VOID EtpLayoutGpuGraphs( - VOID - ); - -VOID EtpNotifyGpuGraph( - __in NMHDR *Header - ); - -VOID EtpNotifyDedicatedGraph( - __in NMHDR *Header - ); - -VOID EtpNotifySharedGraph( - __in NMHDR *Header - ); - -VOID EtpUpdateGpuGraphs( - VOID - ); - -VOID EtpUpdateGpuPanel( - VOID - ); - -PPH_PROCESS_RECORD EtpReferenceMaxNodeRecord( - __in LONG Index - ); - -PPH_STRING EtpGetMaxNodeString( - __in LONG Index - ); - -PPH_STRING EtpGetGpuNameString( - VOID - ); +#include "gpusys.h" static PPH_SYSINFO_SECTION GpuSection; static HWND GpuDialog; @@ -749,5 +675,12 @@ PPH_STRING EtpGetGpuNameString( VOID ) { - return PhCreateString(L"TODO"); + PPH_STRING description; + + description = EtGetGpuAdapterDescription(0); + + if (!description) + description = PhReferenceEmptyString(); + + return description; } diff --git a/2.x/trunk/plugins/ExtendedTools/gpusys.h b/2.x/trunk/plugins/ExtendedTools/gpusys.h new file mode 100644 index 000000000..39752944d --- /dev/null +++ b/2.x/trunk/plugins/ExtendedTools/gpusys.h @@ -0,0 +1,79 @@ +#ifndef GPUSYS_H +#define GPUSYS_H + +#define ET_GPU_PADDING 3 + +BOOLEAN EtpGpuSectionCallback( + __in PPH_SYSINFO_SECTION Section, + __in PH_SYSINFO_SECTION_MESSAGE Message, + __in_opt PVOID Parameter1, + __in_opt PVOID Parameter2 + ); + +VOID EtpInitializeGpuDialog( + VOID + ); + +VOID EtpUninitializeGpuDialog( + VOID + ); + +VOID EtpTickGpuDialog( + VOID + ); + +INT_PTR CALLBACK EtpGpuDialogProc( + __in HWND hwndDlg, + __in UINT uMsg, + __in WPARAM wParam, + __in LPARAM lParam + ); + +INT_PTR CALLBACK EtpGpuPanelDialogProc( + __in HWND hwndDlg, + __in UINT uMsg, + __in WPARAM wParam, + __in LPARAM lParam + ); + +VOID EtpCreateGpuGraphs( + VOID + ); + +VOID EtpLayoutGpuGraphs( + VOID + ); + +VOID EtpNotifyGpuGraph( + __in NMHDR *Header + ); + +VOID EtpNotifyDedicatedGraph( + __in NMHDR *Header + ); + +VOID EtpNotifySharedGraph( + __in NMHDR *Header + ); + +VOID EtpUpdateGpuGraphs( + VOID + ); + +VOID EtpUpdateGpuPanel( + VOID + ); + +PPH_PROCESS_RECORD EtpReferenceMaxNodeRecord( + __in LONG Index + ); + +PPH_STRING EtpGetMaxNodeString( + __in LONG Index + ); + +PPH_STRING EtpGetGpuNameString( + VOID + ); + +#endif diff --git a/2.x/trunk/plugins/ExtendedTools/main.c b/2.x/trunk/plugins/ExtendedTools/main.c index 0558471aa..aa6df8409 100644 --- a/2.x/trunk/plugins/ExtendedTools/main.c +++ b/2.x/trunk/plugins/ExtendedTools/main.c @@ -296,14 +296,7 @@ LOGICAL DllMain( { StringSettingType, SETTING_NAME_DISK_TREE_LIST_COLUMNS, L"" }, { IntegerPairSettingType, SETTING_NAME_DISK_TREE_LIST_SORT, L"4,2" }, // 4, DescendingSortOrder { IntegerSettingType, SETTING_NAME_ENABLE_ETW_MONITOR, L"1" }, - { IntegerSettingType, SETTING_NAME_ENABLE_GPU_MONITOR, L"1" }, - { IntegerSettingType, SETTING_NAME_ETWSYS_ALWAYS_ON_TOP, L"0" }, - { IntegerPairSettingType, SETTING_NAME_ETWSYS_WINDOW_POSITION, L"400,400" }, - { IntegerPairSettingType, SETTING_NAME_ETWSYS_WINDOW_SIZE, L"500,400" }, - { IntegerPairSettingType, SETTING_NAME_MEMORY_LISTS_WINDOW_POSITION, L"400,400" }, - { IntegerSettingType, SETTING_NAME_GPUSYS_ALWAYS_ON_TOP, L"0" }, - { IntegerPairSettingType, SETTING_NAME_GPUSYS_WINDOW_POSITION, L"400,400" }, - { IntegerPairSettingType, SETTING_NAME_GPUSYS_WINDOW_SIZE, L"500,500" } + { IntegerSettingType, SETTING_NAME_ENABLE_GPU_MONITOR, L"1" } }; PhAddSettings(settings, sizeof(settings) / sizeof(PH_SETTING_CREATE)); @@ -350,16 +343,6 @@ VOID NTAPI MenuItemCallback( switch (menuItem->Id) { - case ID_VIEW_DISKANDNETWORK: - { - EtShowEtwSystemDialog(); - } - break; - case ID_VIEW_MEMORYLISTS: - { - EtShowMemoryListsDialog(); - } - break; case ID_PROCESS_UNLOADEDMODULES: { EtShowUnloadedDllsDialog(PhMainWndHandle, menuItem->Context); @@ -405,13 +388,8 @@ VOID NTAPI MainWindowShowingCallback( __in_opt PVOID Context ) { - PhPluginAddMenuItem(PluginInstance, PH_MENU_ITEM_LOCATION_VIEW, L"System Information", ID_VIEW_MEMORYLISTS, L"Memory Lists", NULL); - if (EtEtwEnabled) { - // This will get inserted before GPU Information. - PhPluginAddMenuItem(PluginInstance, PH_MENU_ITEM_LOCATION_VIEW, L"System Information", ID_VIEW_DISKANDNETWORK, L"Disk and Network", NULL); - EtInitializeDiskTab(); } } @@ -560,6 +538,8 @@ VOID NTAPI SystemInformationInitializingCallback( { if (EtGpuEnabled) EtGpuSystemInformationInitializing(Parameter); + if (EtEtwEnabled) + EtEtwSystemInformationInitializing(Parameter); } static VOID NTAPI ProcessesUpdatedCallback( diff --git a/2.x/trunk/plugins/ExtendedTools/memlists.c b/2.x/trunk/plugins/ExtendedTools/memlists.c deleted file mode 100644 index 64c866ae4..000000000 --- a/2.x/trunk/plugins/ExtendedTools/memlists.c +++ /dev/null @@ -1,267 +0,0 @@ -/* - * Process Hacker Extended Tools - - * memory list information - * - * Copyright (C) 2010-2011 wj32 - * - * This file is part of Process Hacker. - * - * Process Hacker is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Process Hacker is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Process Hacker. If not, see . - */ - -#include "exttools.h" -#include "resource.h" - -#define MSG_UPDATE (WM_APP + 1) - -INT_PTR CALLBACK EtpMemoryListsDlgProc( - __in HWND hwndDlg, - __in UINT uMsg, - __in WPARAM wParam, - __in LPARAM lParam - ); - -HWND EtpMemoryListsWindowHandle = NULL; -static PH_CALLBACK_REGISTRATION ProcessesUpdatedRegistration; - -VOID EtShowMemoryListsDialog( - VOID - ) -{ - if (!EtpMemoryListsWindowHandle) - { - EtpMemoryListsWindowHandle = CreateDialog( - PluginInstance->DllBase, - MAKEINTRESOURCE(IDD_MEMLISTS), - PhMainWndHandle, - EtpMemoryListsDlgProc - ); - } - - if (!IsWindowVisible(EtpMemoryListsWindowHandle)) - ShowWindow(EtpMemoryListsWindowHandle, SW_SHOW); - else if (IsIconic(EtpMemoryListsWindowHandle)) - ShowWindow(EtpMemoryListsWindowHandle, SW_RESTORE); - else - SetForegroundWindow(EtpMemoryListsWindowHandle); -} - -VOID NTAPI EtpProcessesUpdatedCallback( - __in_opt PVOID Parameter, - __in_opt PVOID Context - ) -{ - PostMessage(EtpMemoryListsWindowHandle, MSG_UPDATE, 0, 0); -} - -static VOID EtpUpdateMemoryListInfo( - __in HWND hwndDlg - ) -{ - SYSTEM_MEMORY_LIST_INFORMATION memoryListInfo; - - if (NT_SUCCESS(NtQuerySystemInformation( - SystemMemoryListInformation, - &memoryListInfo, - sizeof(SYSTEM_MEMORY_LIST_INFORMATION), - NULL - ))) - { - ULONG_PTR standbyPageCount; - ULONG_PTR repurposedPageCount; - ULONG i; - - standbyPageCount = 0; - repurposedPageCount = 0; - - for (i = 0; i < 8; i++) - { - standbyPageCount += memoryListInfo.PageCountByPriority[i]; - repurposedPageCount += memoryListInfo.RepurposedPagesByPriority[i]; - } - - SetDlgItemText(hwndDlg, IDC_ZZEROED_V, PhaFormatSize((ULONG64)memoryListInfo.ZeroPageCount * PAGE_SIZE, -1)->Buffer); - SetDlgItemText(hwndDlg, IDC_ZFREE_V, PhaFormatSize((ULONG64)memoryListInfo.FreePageCount * PAGE_SIZE, -1)->Buffer); - SetDlgItemText(hwndDlg, IDC_ZMODIFIED_V, PhaFormatSize((ULONG64)memoryListInfo.ModifiedPageCount * PAGE_SIZE, -1)->Buffer); - SetDlgItemText(hwndDlg, IDC_ZMODIFIEDNOWRITE_V, PhaFormatSize((ULONG64)memoryListInfo.ModifiedNoWritePageCount * PAGE_SIZE, -1)->Buffer); - SetDlgItemText(hwndDlg, IDC_ZBAD_V, PhaFormatSize((ULONG64)memoryListInfo.BadPageCount * PAGE_SIZE, -1)->Buffer); - SetDlgItemText(hwndDlg, IDC_ZSTANDBY_V, PhaFormatSize((ULONG64)standbyPageCount * PAGE_SIZE, -1)->Buffer); - SetDlgItemText(hwndDlg, IDC_ZSTANDBY0_V, PhaFormatSize((ULONG64)memoryListInfo.PageCountByPriority[0] * PAGE_SIZE, -1)->Buffer); - SetDlgItemText(hwndDlg, IDC_ZSTANDBY1_V, PhaFormatSize((ULONG64)memoryListInfo.PageCountByPriority[1] * PAGE_SIZE, -1)->Buffer); - SetDlgItemText(hwndDlg, IDC_ZSTANDBY2_V, PhaFormatSize((ULONG64)memoryListInfo.PageCountByPriority[2] * PAGE_SIZE, -1)->Buffer); - SetDlgItemText(hwndDlg, IDC_ZSTANDBY3_V, PhaFormatSize((ULONG64)memoryListInfo.PageCountByPriority[3] * PAGE_SIZE, -1)->Buffer); - SetDlgItemText(hwndDlg, IDC_ZSTANDBY4_V, PhaFormatSize((ULONG64)memoryListInfo.PageCountByPriority[4] * PAGE_SIZE, -1)->Buffer); - SetDlgItemText(hwndDlg, IDC_ZSTANDBY5_V, PhaFormatSize((ULONG64)memoryListInfo.PageCountByPriority[5] * PAGE_SIZE, -1)->Buffer); - SetDlgItemText(hwndDlg, IDC_ZSTANDBY6_V, PhaFormatSize((ULONG64)memoryListInfo.PageCountByPriority[6] * PAGE_SIZE, -1)->Buffer); - SetDlgItemText(hwndDlg, IDC_ZSTANDBY7_V, PhaFormatSize((ULONG64)memoryListInfo.PageCountByPriority[7] * PAGE_SIZE, -1)->Buffer); - SetDlgItemText(hwndDlg, IDC_ZREPURPOSED_V, PhaFormatSize((ULONG64)repurposedPageCount * PAGE_SIZE, -1)->Buffer); - SetDlgItemText(hwndDlg, IDC_ZREPURPOSED0_V, PhaFormatSize((ULONG64)memoryListInfo.RepurposedPagesByPriority[0] * PAGE_SIZE, -1)->Buffer); - SetDlgItemText(hwndDlg, IDC_ZREPURPOSED1_V, PhaFormatSize((ULONG64)memoryListInfo.RepurposedPagesByPriority[1] * PAGE_SIZE, -1)->Buffer); - SetDlgItemText(hwndDlg, IDC_ZREPURPOSED2_V, PhaFormatSize((ULONG64)memoryListInfo.RepurposedPagesByPriority[2] * PAGE_SIZE, -1)->Buffer); - SetDlgItemText(hwndDlg, IDC_ZREPURPOSED3_V, PhaFormatSize((ULONG64)memoryListInfo.RepurposedPagesByPriority[3] * PAGE_SIZE, -1)->Buffer); - SetDlgItemText(hwndDlg, IDC_ZREPURPOSED4_V, PhaFormatSize((ULONG64)memoryListInfo.RepurposedPagesByPriority[4] * PAGE_SIZE, -1)->Buffer); - SetDlgItemText(hwndDlg, IDC_ZREPURPOSED5_V, PhaFormatSize((ULONG64)memoryListInfo.RepurposedPagesByPriority[5] * PAGE_SIZE, -1)->Buffer); - SetDlgItemText(hwndDlg, IDC_ZREPURPOSED6_V, PhaFormatSize((ULONG64)memoryListInfo.RepurposedPagesByPriority[6] * PAGE_SIZE, -1)->Buffer); - SetDlgItemText(hwndDlg, IDC_ZREPURPOSED7_V, PhaFormatSize((ULONG64)memoryListInfo.RepurposedPagesByPriority[7] * PAGE_SIZE, -1)->Buffer); - } - else - { - SetDlgItemText(hwndDlg, IDC_ZZEROED_V, L"Unknown"); - SetDlgItemText(hwndDlg, IDC_ZFREE_V, L"Unknown"); - SetDlgItemText(hwndDlg, IDC_ZMODIFIED_V, L"Unknown"); - SetDlgItemText(hwndDlg, IDC_ZMODIFIEDNOWRITE_V, L"Unknown"); - SetDlgItemText(hwndDlg, IDC_ZBAD_V, L"Unknown"); - SetDlgItemText(hwndDlg, IDC_ZSTANDBY_V, L"Unknown"); - SetDlgItemText(hwndDlg, IDC_ZSTANDBY0_V, L"Unknown"); - SetDlgItemText(hwndDlg, IDC_ZSTANDBY1_V, L"Unknown"); - SetDlgItemText(hwndDlg, IDC_ZSTANDBY2_V, L"Unknown"); - SetDlgItemText(hwndDlg, IDC_ZSTANDBY3_V, L"Unknown"); - SetDlgItemText(hwndDlg, IDC_ZSTANDBY4_V, L"Unknown"); - SetDlgItemText(hwndDlg, IDC_ZSTANDBY5_V, L"Unknown"); - SetDlgItemText(hwndDlg, IDC_ZSTANDBY6_V, L"Unknown"); - SetDlgItemText(hwndDlg, IDC_ZSTANDBY7_V, L"Unknown"); - SetDlgItemText(hwndDlg, IDC_ZREPURPOSED_V, L"Unknown"); - SetDlgItemText(hwndDlg, IDC_ZREPURPOSED0_V, L"Unknown"); - SetDlgItemText(hwndDlg, IDC_ZREPURPOSED1_V, L"Unknown"); - SetDlgItemText(hwndDlg, IDC_ZREPURPOSED2_V, L"Unknown"); - SetDlgItemText(hwndDlg, IDC_ZREPURPOSED3_V, L"Unknown"); - SetDlgItemText(hwndDlg, IDC_ZREPURPOSED4_V, L"Unknown"); - SetDlgItemText(hwndDlg, IDC_ZREPURPOSED5_V, L"Unknown"); - SetDlgItemText(hwndDlg, IDC_ZREPURPOSED6_V, L"Unknown"); - SetDlgItemText(hwndDlg, IDC_ZREPURPOSED7_V, L"Unknown"); - } -} - -INT_PTR CALLBACK EtpMemoryListsDlgProc( - __in HWND hwndDlg, - __in UINT uMsg, - __in WPARAM wParam, - __in LPARAM lParam - ) -{ - switch (uMsg) - { - case WM_INITDIALOG: - { - PhRegisterCallback(&PhProcessesUpdatedEvent, EtpProcessesUpdatedCallback, NULL, &ProcessesUpdatedRegistration); - EtpUpdateMemoryListInfo(hwndDlg); - - PhLoadWindowPlacementFromSetting(SETTING_NAME_MEMORY_LISTS_WINDOW_POSITION, NULL, hwndDlg); - PhRegisterDialog(hwndDlg); - } - break; - case WM_DESTROY: - { - PhUnregisterDialog(hwndDlg); - PhSaveWindowPlacementToSetting(SETTING_NAME_MEMORY_LISTS_WINDOW_POSITION, NULL, hwndDlg); - - PhUnregisterCallback(&PhProcessesUpdatedEvent, &ProcessesUpdatedRegistration); - - EtpMemoryListsWindowHandle = NULL; - } - break; - case WM_COMMAND: - { - switch (LOWORD(wParam)) - { - case IDCANCEL: - case IDOK: - DestroyWindow(hwndDlg); - break; - case IDC_EMPTY: - { - HMENU menu; - HMENU subMenu; - RECT buttonRect; - POINT point; - UINT selectedItem; - SYSTEM_MEMORY_LIST_COMMAND command = -1; - - menu = LoadMenu(PluginInstance->DllBase, MAKEINTRESOURCE(IDR_EMPTYMEMLISTS)); - subMenu = GetSubMenu(menu, 0); - - GetClientRect(GetDlgItem(hwndDlg, IDC_EMPTY), &buttonRect); - point.x = 0; - point.y = buttonRect.bottom; - - ClientToScreen(GetDlgItem(hwndDlg, IDC_EMPTY), &point); - selectedItem = PhShowContextMenu2( - hwndDlg, - GetDlgItem(hwndDlg, IDC_EMPTY), - subMenu, - point - ); - - switch (selectedItem) - { - case ID_EMPTY_EMPTYWORKINGSETS: - command = MemoryEmptyWorkingSets; - break; - case ID_EMPTY_EMPTYMODIFIEDPAGELIST: - command = MemoryFlushModifiedList; - break; - case ID_EMPTY_EMPTYSTANDBYLIST: - command = MemoryPurgeStandbyList; - break; - case ID_EMPTY_EMPTYPRIORITY0STANDBYLIST: - command = MemoryPurgeLowPriorityStandbyList; - break; - } - - if (command != -1) - { - NTSTATUS status; - PVOID returnedState; - ULONG privilege = SE_PROF_SINGLE_PROCESS_PRIVILEGE; - - if (NT_SUCCESS(status = RtlAcquirePrivilege( - &privilege, - 1, - 0, - &returnedState - ))) - { - status = NtSetSystemInformation( - SystemMemoryListInformation, - &command, - sizeof(SYSTEM_MEMORY_LIST_COMMAND) - ); - RtlReleasePrivilege(returnedState); - } - - if (status == STATUS_PRIVILEGE_NOT_HELD) - { - PhShowError(hwndDlg, L"Process Hacker must be elevated to execute this command."); - } - else if (!NT_SUCCESS(status)) - { - PhShowStatus(hwndDlg, L"Unable to execute the memory list command", status, 0); - } - } - - DestroyMenu(menu); - } - break; - } - } - break; - case MSG_UPDATE: - { - EtpUpdateMemoryListInfo(hwndDlg); - } - break; - } - - return FALSE; -} diff --git a/2.x/trunk/plugins/ExtendedTools/resource.h b/2.x/trunk/plugins/ExtendedTools/resource.h index 66ffde4ed..c4e61df54 100644 --- a/2.x/trunk/plugins/ExtendedTools/resource.h +++ b/2.x/trunk/plugins/ExtendedTools/resource.h @@ -15,10 +15,10 @@ #define IDD_DIALOG1 106 #define IDD_PROCDISKNET 106 #define IDC_NETWORK 106 -#define IDD_SYSDISKNET 107 #define ID_VIEW_DISKANDNETWORK 107 #define IDD_SYSDISKNET_PANEL 108 #define ID_PROCESS_WSWATCH 108 +#define IDD_SYSINFO_DISKPANEL 108 #define IDD_OPTIONS 109 #define IDC_GPU 109 #define IDD_WSWATCH 110 @@ -33,6 +33,9 @@ #define ID_VIEW_GPUINFORMATION 112 #define IDD_SYSINFO_GPUPANEL 112 #define IDD_PROCGPU 113 +#define IDD_SYSINFO_DISK 114 +#define IDD_SYSINFO_NETPANEL 116 +#define IDD_SYSINFO_NET 117 #define IDC_LIST 1001 #define IDC_REFRESH 1002 #define IDC_SEQUENCENUMBER 1003 @@ -67,9 +70,6 @@ #define IDC_ZSENDS_V 1032 #define IDC_ZSENDBYTES_V 1033 #define IDC_ZSENDBYTESDELTA_V 1034 -#define IDC_GROUPDISK 1035 -#define IDC_GROUPNETWORK 1036 -#define IDC_ALWAYSONTOP 1037 #define IDC_ENABLEETW 1038 #define IDC_ENABLEETWMONITOR 1038 #define IDC_ENABLE 1039 @@ -115,6 +115,10 @@ #define IDC_GPU_L 1079 #define IDC_DEDICATED_L 1080 #define IDC_SHARED_L 1081 +#define IDC_ZRECEIVESDELTA_V 1082 +#define IDC_ZSENDSDELTA_V 1083 +#define IDC_ZWRITESDELTA_V 1084 +#define IDC_ZREADSDELTA_V 1085 #define ID_EMPTY_EMPTYWORKINGSETS 40001 #define ID_EMPTY_EMPTYMODIFIEDPAGELIST 40002 #define ID_EMPTY_EMPTYSTANDBYLIST 40003 @@ -130,7 +134,7 @@ #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 113 #define _APS_NEXT_COMMAND_VALUE 40009 -#define _APS_NEXT_CONTROL_VALUE 1082 +#define _APS_NEXT_CONTROL_VALUE 1086 #define _APS_NEXT_SYMED_VALUE 113 #endif #endif