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