diff --git a/2.x/trunk/ProcessHacker/ProcessHacker.rc b/2.x/trunk/ProcessHacker/ProcessHacker.rc
index 956e9eb3a..b4d8bbe96 100644
--- a/2.x/trunk/ProcessHacker/ProcessHacker.rc
+++ b/2.x/trunk/ProcessHacker/ProcessHacker.rc
@@ -74,6 +74,7 @@ BEGIN
MENUITEM "Save...\aCtrl+S", ID_HACKER_SAVE
MENUITEM "Find Handles or DLLs...\aCtrl+F", ID_HACKER_FINDHANDLESORDLLS
MENUITEM "Options...", ID_HACKER_OPTIONS
+ MENUITEM "Plugins...", ID_HACKER_PLUGINS
MENUITEM SEPARATOR
POPUP "Computer"
BEGIN
@@ -1090,6 +1091,7 @@ BEGIN
CONTROL "Enable process database",IDC_ENABLEPROCDB,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,141,95,96,10
EDITTEXT IDC_ICONPROCESSES,61,53,40,12,ES_AUTOHSCROLL
LTEXT "Icon Processes:",IDC_STATIC,7,55,52,8
+ CONTROL "Enable plugins",IDC_ENABLEPLUGINS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,141,107,61,10
END
IDD_OPTHIGHLIGHTING DIALOGEX 0, 0, 250, 174
@@ -1431,6 +1433,30 @@ BEGIN
LTEXT "Physical Memory",IDC_PHYSICAL_LAYOUT,73,103,33,13,NOT WS_VISIBLE | WS_BORDER
END
+IDD_PLUGINS DIALOGEX 0, 0, 291, 260
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Plugins"
+FONT 8, "MS Shell Dlg", 400, 0, 0x1
+BEGIN
+ DEFPUSHBUTTON "Close",IDOK,234,239,50,14
+ CONTROL "",IDC_LIST,"SysListView32",LVS_REPORT | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP,7,7,277,119
+ GROUPBOX "Plugin",IDC_STATIC,7,129,277,105
+ LTEXT "Name:",IDC_STATIC,15,141,22,8
+ EDITTEXT IDC_NAME,71,141,104,12,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER
+ LTEXT "Internal Name:",IDC_STATIC,15,152,49,8
+ EDITTEXT IDC_INTERNALNAME,71,152,203,12,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER
+ LTEXT "Author:",IDC_STATIC,15,163,26,8
+ EDITTEXT IDC_AUTHOR,71,163,203,12,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER
+ EDITTEXT IDC_DESCRIPTION,14,196,211,34,ES_MULTILINE | ES_AUTOHSCROLL | ES_READONLY
+ LTEXT "Description:",IDC_STATIC,15,185,39,8
+ PUSHBUTTON "Options...",IDC_OPTIONS,230,216,50,14
+ LTEXT "File name:",IDC_STATIC,15,174,34,8
+ EDITTEXT IDC_FILENAME,71,174,203,12,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER
+ LTEXT "Version:",IDC_STATIC,183,141,27,8
+ EDITTEXT IDC_VERSION,215,141,59,12,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER
+ PUSHBUTTON "Cleanup",IDC_CLEANUP,7,239,50,14
+END
+
/////////////////////////////////////////////////////////////////////////////
//
@@ -1847,6 +1873,14 @@ BEGIN
TOPMARGIN, 7
BOTTOMMARGIN, 123
END
+
+ IDD_PLUGINS, DIALOG
+ BEGIN
+ LEFTMARGIN, 7
+ RIGHTMARGIN, 284
+ TOPMARGIN, 7
+ BOTTOMMARGIN, 253
+ END
END
#endif // APSTUDIO_INVOKED
diff --git a/2.x/trunk/ProcessHacker/ProcessHacker.vcproj b/2.x/trunk/ProcessHacker/ProcessHacker.vcproj
index 0cf08bfdf..2298a2348 100644
--- a/2.x/trunk/ProcessHacker/ProcessHacker.vcproj
+++ b/2.x/trunk/ProcessHacker/ProcessHacker.vcproj
@@ -804,6 +804,10 @@
RelativePath=".\plugin.c"
>
+
+
diff --git a/2.x/trunk/ProcessHacker/include/phapp.h b/2.x/trunk/ProcessHacker/include/phapp.h
index cd2bfd3ed..8f914434b 100644
--- a/2.x/trunk/ProcessHacker/include/phapp.h
+++ b/2.x/trunk/ProcessHacker/include/phapp.h
@@ -232,6 +232,7 @@ PPH_PROCESS_NODE PhCreateProcessNode(
__in ULONG RunId
);
+PHAPPAPI
PPH_PROCESS_NODE PhFindProcessNode(
__in HANDLE ProcessId
);
@@ -240,6 +241,7 @@ VOID PhRemoveProcessNode(
__in PPH_PROCESS_NODE ProcessNode
);
+PHAPPAPI
VOID PhUpdateProcessNode(
__in PPH_PROCESS_NODE ProcessNode
);
@@ -248,17 +250,22 @@ VOID PhTickProcessNodes();
HICON PhGetStockAppIcon();
+PHAPPAPI
PPH_PROCESS_ITEM PhGetSelectedProcessItem();
+PHAPPAPI
VOID PhGetSelectedProcessItems(
__out PPH_PROCESS_ITEM **Processes,
__out PULONG NumberOfProcesses
);
+PHAPPAPI
VOID PhDeselectAllProcessNodes();
+PHAPPAPI
VOID PhInvalidateAllProcessNodes();
+PHAPPAPI
VOID PhSelectAndEnsureVisibleProcessNode(
__in PPH_PROCESS_NODE ProcessNode
);
@@ -548,6 +555,10 @@ VOID PhShowProcessContextMenu(
// plugins
+#ifndef PLUGINS_PRIVATE
+extern LIST_ENTRY PhPluginsListHead;
+#endif
+
VOID PhPluginsInitialization();
VOID PhLoadPlugins();
@@ -1249,6 +1260,12 @@ VOID PhShowPagefilesDialog(
__in HWND ParentWindowHandle
);
+// plugman
+
+VOID PhShowPluginsDialog(
+ __in HWND ParentWindowHandle
+ );
+
// runas
VOID PhShowRunAsDialog(
diff --git a/2.x/trunk/ProcessHacker/include/phplug.h b/2.x/trunk/ProcessHacker/include/phplug.h
index 3ee05fe05..a16e5aeec 100644
--- a/2.x/trunk/ProcessHacker/include/phplug.h
+++ b/2.x/trunk/ProcessHacker/include/phplug.h
@@ -5,9 +5,10 @@
typedef enum _PH_GENERAL_CALLBACK
{
- GeneralCallbackMainWindowShowing = 0, // INT ShowCommand
- GeneralCallbackGetProcessHighlightingColor = 1, // PPH_PLUGIN_GET_HIGHLIGHTING_COLOR Data
- GeneralCallbackGetProcessTooltipText = 2, // PPH_PLUGIN_GET_TOOLTIP_TEXT Data
+ GeneralCallbackMainWindowShowing = 0, // INT ShowCommand [main thread]
+ GeneralCallbackProcessesUpdated = 1, // [main thread]
+ GeneralCallbackGetProcessHighlightingColor = 2, // PPH_PLUGIN_GET_HIGHLIGHTING_COLOR Data [main thread]
+ GeneralCallbackGetProcessTooltipText = 3, // PPH_PLUGIN_GET_TOOLTIP_TEXT Data [main thread]
GeneralCallbackMaximum
} PH_GENERAL_CALLBACK, *PPH_GENERAL_CALLBACK;
@@ -34,10 +35,10 @@ typedef struct _PH_PLUGIN_GET_TOOLTIP_TEXT
typedef enum _PH_PLUGIN_CALLBACK
{
- PluginCallbackLoad = 0,
- PluginCallbackUnload = 1,
- PluginCallbackShowOptions = 2, // HWND ParentWindowHandle
- PluginCallbackMenuItem = 3, // PPH_PLUGIN_MENU_ITEM MenuItem
+ PluginCallbackLoad = 0, // [main thread]
+ PluginCallbackUnload = 1, // [main thread]
+ PluginCallbackShowOptions = 2, // HWND ParentWindowHandle [main thread]
+ PluginCallbackMenuItem = 3, // PPH_PLUGIN_MENU_ITEM MenuItem [main thread]
PluginCallbackMaximum
} PH_PLUGIN_CALLBACK, *PPH_PLUGIN_CALLBACK;
@@ -50,16 +51,20 @@ typedef struct _PH_PLUGIN
PWSTR Name;
PVOID DllBase;
+ PWSTR DisplayName;
PWSTR Author;
PWSTR Description;
+ BOOLEAN HasOptions;
PH_CALLBACK Callbacks[PluginCallbackMaximum];
} PH_PLUGIN, *PPH_PLUGIN;
typedef struct _PH_PLUGIN_INFORMATION
{
+ PWSTR DisplayName;
PWSTR Author;
PWSTR Description;
+ BOOLEAN HasOptions;
} PH_PLUGIN_INFORMATION, *PPH_PLUGIN_INFORMATION;
PHAPPAPI
diff --git a/2.x/trunk/ProcessHacker/include/settings.h b/2.x/trunk/ProcessHacker/include/settings.h
index ba54ec051..ea88a1c8a 100644
--- a/2.x/trunk/ProcessHacker/include/settings.h
+++ b/2.x/trunk/ProcessHacker/include/settings.h
@@ -60,6 +60,8 @@ __mayRaise VOID PhSetStringSetting2(
__in PPH_STRINGREF Value
);
+VOID PhClearIgnoredSettings();
+
NTSTATUS PhLoadSettings(
__in PWSTR FileName
);
diff --git a/2.x/trunk/ProcessHacker/mainwnd.c b/2.x/trunk/ProcessHacker/mainwnd.c
index fc9445e93..398842d62 100644
--- a/2.x/trunk/ProcessHacker/mainwnd.c
+++ b/2.x/trunk/ProcessHacker/mainwnd.c
@@ -651,6 +651,11 @@ LRESULT CALLBACK PhMainWndProc(
PhShowOptionsDialog(hWnd);
}
break;
+ case ID_HACKER_PLUGINS:
+ {
+ PhShowPluginsDialog(hWnd);
+ }
+ break;
case ID_COMPUTER_LOCK:
case ID_COMPUTER_LOGOFF:
case ID_COMPUTER_SLEEP:
@@ -3754,6 +3759,11 @@ VOID PhMainWndOnProcessesUpdated()
// We have to invalidate the text on each update.
PhTickProcessNodes();
+ if (PhPluginsEnabled)
+ {
+ PhInvokeCallback(PhGetGeneralCallback(GeneralCallbackProcessesUpdated), NULL);
+ }
+
if (ProcessesNeedsRedraw)
{
TreeList_SetRedraw(ProcessTreeListHandle, TRUE);
diff --git a/2.x/trunk/ProcessHacker/options.c b/2.x/trunk/ProcessHacker/options.c
index b187005b0..0f5769c71 100644
--- a/2.x/trunk/ProcessHacker/options.c
+++ b/2.x/trunk/ProcessHacker/options.c
@@ -274,6 +274,7 @@ INT_PTR CALLBACK PhpOptionsGeneralDlgProc(
SetDlgItemCheckForSetting(hwndDlg, IDC_COLLAPSESERVICES, L"CollapseServicesOnStart");
SetDlgItemCheckForSetting(hwndDlg, IDC_ICONSINGLECLICK, L"IconSingleClick");
SetDlgItemCheckForSetting(hwndDlg, IDC_ENABLEPROCDB, L"EnableProcDb");
+ SetDlgItemCheckForSetting(hwndDlg, IDC_ENABLEPLUGINS, L"EnablePlugins");
}
break;
case WM_NOTIFY:
@@ -295,6 +296,7 @@ INT_PTR CALLBACK PhpOptionsGeneralDlgProc(
SetSettingForDlgItemCheck(hwndDlg, IDC_COLLAPSESERVICES, L"CollapseServicesOnStart");
SetSettingForDlgItemCheck(hwndDlg, IDC_ICONSINGLECLICK, L"IconSingleClick");
SetSettingForDlgItemCheck(hwndDlg, IDC_ENABLEPROCDB, L"EnableProcDb");
+ SetSettingForDlgItemCheck(hwndDlg, IDC_ENABLEPLUGINS, L"EnablePlugins");
SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, PSNRET_NOERROR);
}
diff --git a/2.x/trunk/ProcessHacker/plugin.c b/2.x/trunk/ProcessHacker/plugin.c
index 77cf958b4..081ba3ff3 100644
--- a/2.x/trunk/ProcessHacker/plugin.c
+++ b/2.x/trunk/ProcessHacker/plugin.c
@@ -172,8 +172,10 @@ PPH_PLUGIN PhRegisterPlugin(
if (Information)
{
+ plugin->DisplayName = Information->DisplayName;
plugin->Author = Information->Author;
plugin->Description = Information->Description;
+ plugin->HasOptions = Information->HasOptions;
}
for (i = 0; i < PluginCallbackMaximum; i++)
@@ -216,10 +218,14 @@ BOOLEAN PhPluginAddMenuItem(
HMENU menu;
HMENU subMenu;
ULONG insertIndex;
+ ULONG insertAfterCount;
ULONG textCount;
WCHAR textBuffer[256];
MENUITEMINFO menuItemInfo = { sizeof(menuItemInfo) };
+ if (InsertAfter)
+ insertAfterCount = (ULONG)wcslen(InsertAfter);
+
textCount = (ULONG)wcslen(Text);
if (textCount > 128)
@@ -251,7 +257,7 @@ BOOLEAN PhPluginAddMenuItem(
{
if (GetMenuItemInfo(subMenu, insertIndex, TRUE, &menuItemInfo))
{
- if (wcsnicmp(InsertAfter, menuItemInfo.dwTypeData, textCount) == 0)
+ if (wcsnicmp(InsertAfter, menuItemInfo.dwTypeData, insertAfterCount) == 0)
{
insertIndex++;
break;
@@ -269,6 +275,12 @@ BOOLEAN PhPluginAddMenuItem(
menuItemInfo.dwItemData = (ULONG_PTR)menuItem;
menuItemInfo.dwTypeData = Text;
+ if (textCount == 1 && Text[0] == '-')
+ {
+ menuItemInfo.fMask = MIIM_ID;
+ menuItemInfo.fType = MFT_SEPARATOR;
+ }
+
InsertMenuItem(subMenu, insertIndex, TRUE, &menuItemInfo);
return TRUE;
diff --git a/2.x/trunk/ProcessHacker/plugman.c b/2.x/trunk/ProcessHacker/plugman.c
new file mode 100644
index 000000000..499f2b88f
--- /dev/null
+++ b/2.x/trunk/ProcessHacker/plugman.c
@@ -0,0 +1,197 @@
+/*
+ * Process Hacker -
+ * plugins
+ *
+ * Copyright (C) 2010 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
+#include
+#include
+
+static HWND PluginsLv;
+static PPH_PLUGIN SelectedPlugin;
+
+INT_PTR CALLBACK PhpPluginsDlgProc(
+ __in HWND hwndDlg,
+ __in UINT uMsg,
+ __in WPARAM wParam,
+ __in LPARAM lParam
+ );
+
+VOID PhShowPluginsDialog(
+ __in HWND ParentWindowHandle
+ )
+{
+ if (PhPluginsEnabled)
+ {
+ DialogBox(
+ PhInstanceHandle,
+ MAKEINTRESOURCE(IDD_PLUGINS),
+ ParentWindowHandle,
+ PhpPluginsDlgProc
+ );
+ }
+ else
+ {
+ PhShowInformation(ParentWindowHandle,
+ L"Plugins are not enabled. To use plugins enable them in Options and restart Process Hacker.");
+ }
+}
+
+VOID PhpRefreshPluginDetails(
+ __in HWND hwndDlg
+ )
+{
+ PLDR_DATA_TABLE_ENTRY loaderEntry;
+ PPH_STRING fileName;
+ PH_IMAGE_VERSION_INFO versionInfo;
+
+ if (SelectedPlugin && (loaderEntry = PhFindLoaderEntry(SelectedPlugin->DllBase)))
+ {
+ fileName = PhCreateStringEx(loaderEntry->FullDllName.Buffer, loaderEntry->FullDllName.Length);
+
+ SetDlgItemText(hwndDlg, IDC_NAME, SelectedPlugin->DisplayName ? SelectedPlugin->DisplayName : L"(unnamed)");
+ SetDlgItemText(hwndDlg, IDC_INTERNALNAME, SelectedPlugin->Name);
+ SetDlgItemText(hwndDlg, IDC_AUTHOR, SelectedPlugin->Author);
+ SetDlgItemText(hwndDlg, IDC_FILENAME, fileName->Buffer);
+ SetDlgItemText(hwndDlg, IDC_DESCRIPTION, SelectedPlugin->Description);
+
+ if (PhInitializeImageVersionInfo(&versionInfo, fileName->Buffer))
+ {
+ SetDlgItemText(hwndDlg, IDC_VERSION, versionInfo.FileVersion->Buffer);
+ PhDeleteImageVersionInfo(&versionInfo);
+ }
+ else
+ {
+ SetDlgItemText(hwndDlg, IDC_VERSION, L"Unknown");
+ }
+
+ PhDereferenceObject(fileName);
+
+ EnableWindow(GetDlgItem(hwndDlg, IDC_OPTIONS), SelectedPlugin->HasOptions);
+ }
+ else
+ {
+ SetDlgItemText(hwndDlg, IDC_NAME, L"N/A");
+ SetDlgItemText(hwndDlg, IDC_VERSION, L"N/A");
+ SetDlgItemText(hwndDlg, IDC_INTERNALNAME, L"N/A");
+ SetDlgItemText(hwndDlg, IDC_AUTHOR, L"N/A");
+ SetDlgItemText(hwndDlg, IDC_FILENAME, L"N/A");
+ SetDlgItemText(hwndDlg, IDC_DESCRIPTION, L"N/A");
+
+ EnableWindow(GetDlgItem(hwndDlg, IDC_OPTIONS), FALSE);
+ }
+}
+
+INT_PTR CALLBACK PhpPluginsDlgProc(
+ __in HWND hwndDlg,
+ __in UINT uMsg,
+ __in WPARAM wParam,
+ __in LPARAM lParam
+ )
+{
+ switch (uMsg)
+ {
+ case WM_INITDIALOG:
+ {
+ PLIST_ENTRY listEntry;
+
+ PluginsLv = GetDlgItem(hwndDlg, IDC_LIST);
+ PhSetListViewStyle(PluginsLv, FALSE, TRUE);
+ PhSetControlTheme(PluginsLv, L"explorer");
+ PhAddListViewColumn(PluginsLv, 0, 0, 0, LVCFMT_LEFT, 200, L"Name");
+ PhAddListViewColumn(PluginsLv, 1, 1, 1, LVCFMT_LEFT, 160, L"Author");
+ PhSetExtendedListView(PluginsLv);
+
+ listEntry = PhPluginsListHead.Flink;
+
+ while (listEntry != &PhPluginsListHead)
+ {
+ PPH_PLUGIN plugin = CONTAINING_RECORD(listEntry, PH_PLUGIN, ListEntry);
+ INT lvItemIndex;
+
+ lvItemIndex = PhAddListViewItem(PluginsLv, MAXINT,
+ plugin->DisplayName ? plugin->DisplayName : plugin->Name, plugin);
+
+ if (plugin->Author)
+ PhSetListViewSubItem(PluginsLv, lvItemIndex, 1, plugin->Author);
+
+ listEntry = listEntry->Flink;
+ }
+
+ ExtendedListView_SortItems(PluginsLv);
+
+ SelectedPlugin = NULL;
+ PhpRefreshPluginDetails(hwndDlg);
+ }
+ break;
+ case WM_COMMAND:
+ {
+ switch (LOWORD(wParam))
+ {
+ case IDCANCEL:
+ case IDOK:
+ EndDialog(hwndDlg, IDOK);
+ break;
+ case IDC_OPTIONS:
+ {
+ if (SelectedPlugin)
+ {
+ PhInvokeCallback(PhGetPluginCallback(SelectedPlugin, PluginCallbackShowOptions), hwndDlg);
+ }
+ }
+ break;
+ case IDC_CLEANUP:
+ {
+ if (PhShowMessage(hwndDlg, MB_ICONQUESTION | MB_YESNO,
+ L"Do you want to clean up unused plugin settings?") == IDYES)
+ {
+ PhClearIgnoredSettings();
+ }
+ }
+ break;
+ }
+ }
+ break;
+ case WM_NOTIFY:
+ {
+ LPNMHDR header = (LPNMHDR)lParam;
+
+ switch (header->code)
+ {
+ case LVN_ITEMCHANGED:
+ {
+ if (header->hwndFrom == PluginsLv)
+ {
+ if (ListView_GetSelectedCount(PluginsLv) == 1)
+ SelectedPlugin = PhGetSelectedListViewItemParam(PluginsLv);
+ else
+ SelectedPlugin = NULL;
+
+ PhpRefreshPluginDetails(hwndDlg);
+ }
+ }
+ break;
+ }
+ }
+ break;
+ }
+
+ return FALSE;
+}
diff --git a/2.x/trunk/ProcessHacker/resource.h b/2.x/trunk/ProcessHacker/resource.h
index df2e22e04..73cdbe32c 100644
--- a/2.x/trunk/ProcessHacker/resource.h
+++ b/2.x/trunk/ProcessHacker/resource.h
@@ -100,6 +100,7 @@
#define IDR_MEMFILTER 184
#define IDD_MEMSTRING 185
#define IDD_OPTGRAPHS 186
+#define IDD_PLUGINS 187
#define IDC_TERMINATE 1003
#define IDC_FILEICON 1005
#define IDC_FILE 1006
@@ -142,8 +143,10 @@
#define IDC_SERVICEDLL 1042
#define IDC_NAME 1044
#define IDC_REFERENCES 1045
+#define IDC_INTERNALNAME 1045
#define IDC_HANDLES 1046
#define IDC_PROCESSTYPELABEL 1046
+#define IDC_AUTHOR 1046
#define IDC_PAGED 1047
#define IDC_PROCESSTYPETEXT 1047
#define IDC_NONPAGED 1048
@@ -188,6 +191,7 @@
#define IDC_CHANGE 1079
#define IDC_CLEAR 1079
#define IDC_GOTO 1079
+#define IDC_OPTIONS 1079
#define IDC_EDITDEP 1080
#define IDC_VIEWPARENTPROCESS 1081
#define IDC_OPENFILENAME 1082
@@ -388,8 +392,10 @@
#define IDC_PHYSICAL_LAYOUT 1251
#define IDC_BUTTON2 1251
#define IDC_ENABLE 1251
+#define IDC_CLEANUP 1251
#define IDC_ENABLESTAGE2 1253
#define IDC_TOGGLEELEVATION 1254
+#define IDC_ENABLEPLUGINS 1258
#define ID_MAINWND_PROCESSTL 2001
#define ID_MAINWND_SERVICELV 2002
#define ID_MAINWND_NETWORKLV 2003
@@ -595,6 +601,7 @@
#define ID_TAB_PREV 40224
#define ID_MISCELLANEOUS_RUNAS 40229
#define ID_MISCELLANEOUS_RUNASTHISUSER 40230
+#define ID_HACKER_PLUGINS 40231
#define IDDYNAMIC 50000
#define IDPLUGINS 55000
#define IDPLUGINS_END 56000
@@ -603,9 +610,9 @@
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
-#define _APS_NEXT_RESOURCE_VALUE 186
-#define _APS_NEXT_COMMAND_VALUE 40231
-#define _APS_NEXT_CONTROL_VALUE 1255
+#define _APS_NEXT_RESOURCE_VALUE 188
+#define _APS_NEXT_COMMAND_VALUE 40232
+#define _APS_NEXT_CONTROL_VALUE 1260
#define _APS_NEXT_SYMED_VALUE 131
#endif
#endif
diff --git a/2.x/trunk/ProcessHacker/sdk/phapppub.h b/2.x/trunk/ProcessHacker/sdk/phapppub.h
index 261f71ee8..0e75f10d0 100644
--- a/2.x/trunk/ProcessHacker/sdk/phapppub.h
+++ b/2.x/trunk/ProcessHacker/sdk/phapppub.h
@@ -3,6 +3,8 @@
// Process Hacker application functions exposed to plugins
+// main
+
PHAPPAPI
VOID PhRegisterDialog(
__in HWND DialogWindowHandle
@@ -13,6 +15,8 @@ VOID PhUnregisterDialog(
__in HWND DialogWindowHandle
);
+// mainwnd
+
PHAPPAPI extern HWND PhMainWndHandle;
#define ProcessHacker_ShowProcessProperties(hWnd, ProcessItem) \
@@ -22,12 +26,50 @@ PHAPPAPI extern HWND PhMainWndHandle;
#define ProcessHacker_ToggleVisible(hWnd) \
SendMessage(hWnd, WM_PH_TOGGLE_VISIBLE, 0, 0)
+// proctree
+
+typedef struct _PH_PROCESS_NODE PH_PROCESS_NODE, *PPH_PROCESS_NODE;
+
+PHAPPAPI
+PPH_PROCESS_NODE PhFindProcessNode(
+ __in HANDLE ProcessId
+ );
+
+PHAPPAPI
+VOID PhUpdateProcessNode(
+ __in PPH_PROCESS_NODE ProcessNode
+ );
+
+PHAPPAPI
+PPH_PROCESS_ITEM PhGetSelectedProcessItem();
+
+PHAPPAPI
+VOID PhGetSelectedProcessItems(
+ __out PPH_PROCESS_ITEM **Processes,
+ __out PULONG NumberOfProcesses
+ );
+
+PHAPPAPI
+VOID PhDeselectAllProcessNodes();
+
+PHAPPAPI
+VOID PhInvalidateAllProcessNodes();
+
+PHAPPAPI
+VOID PhSelectAndEnsureVisibleProcessNode(
+ __in PPH_PROCESS_NODE ProcessNode
+ );
+
+// log
+
PHAPPAPI
VOID PhLogMessageEntry(
__in UCHAR Type,
__in PPH_STRING Message
);
+// actions
+
PHAPPAPI
BOOLEAN PhUiLockComputer(
__in HWND hWnd
diff --git a/2.x/trunk/ProcessHacker/settings.c b/2.x/trunk/ProcessHacker/settings.c
index 9183ead99..15e0168a6 100644
--- a/2.x/trunk/ProcessHacker/settings.c
+++ b/2.x/trunk/ProcessHacker/settings.c
@@ -28,6 +28,8 @@
PPH_HASHTABLE PhSettingsHashtable;
PH_QUEUED_LOCK PhSettingsLock;
+PPH_LIST PhIgnoredSettings;
+
VOID PhSettingsInitialization()
{
PhSettingsHashtable = PhCreateHashtable(
@@ -37,6 +39,7 @@ VOID PhSettingsInitialization()
128
);
PhInitializeQueuedLock(&PhSettingsLock);
+ PhIgnoredSettings = PhCreateList(4);
PhpAddIntegerSetting(L"AllowOnlyOneInstance", L"0");
PhpAddIntegerSetting(L"CollapseServicesOnStart", L"0");
@@ -588,6 +591,34 @@ __mayRaise VOID PhSetStringSetting2(
PhRaiseStatus(STATUS_NOT_FOUND);
}
+VOID PhpClearIgnoredSettings()
+{
+ ULONG i;
+
+ PhAcquireQueuedLockExclusive(&PhSettingsLock);
+
+ for (i = 0; i < PhIgnoredSettings->Count; i++)
+ {
+ PPH_SETTING setting = PhIgnoredSettings->Items[i];
+
+ PhFree(setting->Name);
+
+ if (setting->Value)
+ PhDereferenceObject(setting->Value);
+
+ PhFree(setting);
+ }
+
+ PhClearList(PhIgnoredSettings);
+
+ PhReleaseQueuedLockExclusive(&PhSettingsLock);
+}
+
+VOID PhClearIgnoredSettings()
+{
+ PhpClearIgnoredSettings();
+}
+
mxml_type_t PhpSettingsLoadCallback(
__in mxml_node_t *node
)
@@ -604,6 +635,8 @@ NTSTATUS PhLoadSettings(
mxml_node_t *topNode;
mxml_node_t *currentNode;
+ PhpClearIgnoredSettings();
+
status = PhCreateFileWin32(
&fileHandle,
FileName,
@@ -675,6 +708,15 @@ NTSTATUS PhLoadSettings(
);
}
}
+ else
+ {
+ setting = PhAllocate(sizeof(PH_SETTING));
+ setting->Name = PhAllocateCopy(settingName->Buffer, settingName->Length + sizeof(WCHAR));
+ PhReferenceObject(settingValue);
+ setting->Value = settingValue;
+
+ PhAddListItem(PhIgnoredSettings, setting);
+ }
}
PhReleaseQueuedLockExclusive(&PhSettingsLock);
@@ -754,6 +796,36 @@ NTSTATUS PhSaveSettings(
PhDereferenceObject(settingValueAnsi);
}
+ // Write the ignored settings.
+ {
+ ULONG i;
+
+ for (i = 0; i < PhIgnoredSettings->Count; i++)
+ {
+ PPH_SETTING setting = PhIgnoredSettings->Items[i];
+ mxml_node_t *settingNode;
+ mxml_node_t *textNode;
+ PPH_ANSI_STRING settingName;
+ PPH_STRING settingValue;
+ PPH_ANSI_STRING settingValueAnsi;
+
+ // Create the setting element.
+
+ settingNode = mxmlNewElement(topNode, "setting");
+
+ settingName = PhCreateAnsiStringFromUnicode(setting->Name);
+ mxmlElementSetAttr(settingNode, "name", settingName->Buffer);
+ PhDereferenceObject(settingName);
+
+ // Set the value.
+
+ settingValue = setting->Value;
+ settingValueAnsi = PhCreateAnsiStringFromUnicodeEx(settingValue->Buffer, settingValue->Length);
+ textNode = mxmlNewOpaque(settingNode, settingValueAnsi->Buffer);
+ PhDereferenceObject(settingValueAnsi);
+ }
+ }
+
PhReleaseQueuedLockShared(&PhSettingsLock);
// Create the directory if it does not exist.
diff --git a/2.x/trunk/plugins/SbieSupport/SbieSupport.rc b/2.x/trunk/plugins/SbieSupport/SbieSupport.rc
index ac845c57d..e9bbdeb8b 100644
--- a/2.x/trunk/plugins/SbieSupport/SbieSupport.rc
+++ b/2.x/trunk/plugins/SbieSupport/SbieSupport.rc
@@ -85,6 +85,43 @@ BEGIN
END
END
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog
+//
+
+IDD_OPTIONS DIALOGEX 0, 0, 268, 50
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Options"
+FONT 8, "MS Shell Dlg", 400, 0, 0x1
+BEGIN
+ DEFPUSHBUTTON "OK",IDOK,158,29,50,14
+ PUSHBUTTON "Cancel",IDCANCEL,211,29,50,14
+ LTEXT "SbieDll.dll path:",IDC_STATIC,7,9,50,8
+ EDITTEXT IDC_SBIEDLLPATH,63,8,143,12,ES_AUTOHSCROLL
+ PUSHBUTTON "Browse...",IDC_BROWSE,211,7,50,14
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// DESIGNINFO
+//
+
+#ifdef APSTUDIO_INVOKED
+GUIDELINES DESIGNINFO
+BEGIN
+ IDD_OPTIONS, DIALOG
+ BEGIN
+ LEFTMARGIN, 7
+ RIGHTMARGIN, 261
+ TOPMARGIN, 7
+ BOTTOMMARGIN, 43
+ END
+END
+#endif // APSTUDIO_INVOKED
+
#endif // English (Australia) resources
/////////////////////////////////////////////////////////////////////////////
diff --git a/2.x/trunk/plugins/SbieSupport/main.c b/2.x/trunk/plugins/SbieSupport/main.c
index 5db2d6c65..512f0a4da 100644
--- a/2.x/trunk/plugins/SbieSupport/main.c
+++ b/2.x/trunk/plugins/SbieSupport/main.c
@@ -1,4 +1,5 @@
#include
+#include "resource.h"
#include "sbiedll.h"
typedef struct _BOXED_PROCESS
@@ -12,6 +13,26 @@ VOID NTAPI LoadCallback(
__in PVOID Context
);
+VOID NTAPI ShowOptionsCallback(
+ __in PVOID Parameter,
+ __in PVOID Context
+ );
+
+VOID NTAPI MenuItemCallback(
+ __in PVOID Parameter,
+ __in PVOID Context
+ );
+
+VOID NTAPI MainWindowShowingCallback(
+ __in PVOID Parameter,
+ __in PVOID Context
+ );
+
+VOID NTAPI ProcessesUpdatedCallback(
+ __in PVOID Parameter,
+ __in PVOID Context
+ );
+
VOID NTAPI GetProcessHighlightingColorCallback(
__in PVOID Parameter,
__in PVOID Context
@@ -27,16 +48,29 @@ VOID NTAPI RefreshBoxedPids(
__in BOOLEAN TimerOrWaitFired
);
+INT_PTR CALLBACK OptionsDlgProc(
+ __in HWND hwndDlg,
+ __in UINT uMsg,
+ __in WPARAM wParam,
+ __in LPARAM lParam
+ );
+
PPH_PLUGIN PluginInstance;
PH_CALLBACK_REGISTRATION PluginLoadCallbackRegistration;
+PH_CALLBACK_REGISTRATION PluginShowOptionsCallbackRegistration;
+PH_CALLBACK_REGISTRATION PluginMenuItemCallbackRegistration;
+PH_CALLBACK_REGISTRATION MainWindowShowingCallbackRegistration;
+PH_CALLBACK_REGISTRATION ProcessesUpdatedCallbackRegistration;
PH_CALLBACK_REGISTRATION GetProcessHighlightingColorCallbackRegistration;
PH_CALLBACK_REGISTRATION GetProcessTooltipTextCallbackRegistration;
P_SbieApi_EnumBoxes SbieApi_EnumBoxes;
P_SbieApi_EnumProcessEx SbieApi_EnumProcessEx;
+P_SbieDll_KillAll SbieDll_KillAll;
PPH_HASHTABLE BoxedProcessesHashtable;
PH_QUEUED_LOCK BoxedProcessesLock = PH_QUEUED_LOCK_INIT;
+BOOLEAN BoxedProcessesUpdated = FALSE;
LOGICAL DllMain(
__in HINSTANCE Instance,
@@ -48,7 +82,14 @@ LOGICAL DllMain(
{
case DLL_PROCESS_ATTACH:
{
- PluginInstance = PhRegisterPlugin(L"ProcessHacker.SbieSupport", Instance, NULL);
+ PH_PLUGIN_INFORMATION info;
+
+ info.DisplayName = L"Sandboxie Support";
+ info.Author = L"wj32";
+ info.Description = L"Provides functionality for sandboxed processes.";
+ info.HasOptions = TRUE;
+
+ PluginInstance = PhRegisterPlugin(L"ProcessHacker.SbieSupport", Instance, &info);
PhRegisterCallback(
PhGetPluginCallback(PluginInstance, PluginCallbackLoad),
@@ -56,7 +97,31 @@ LOGICAL DllMain(
NULL,
&PluginLoadCallbackRegistration
);
+ PhRegisterCallback(
+ PhGetPluginCallback(PluginInstance, PluginCallbackShowOptions),
+ ShowOptionsCallback,
+ NULL,
+ &PluginShowOptionsCallbackRegistration
+ );
+ PhRegisterCallback(
+ PhGetPluginCallback(PluginInstance, PluginCallbackMenuItem),
+ MenuItemCallback,
+ NULL,
+ &PluginMenuItemCallbackRegistration
+ );
+ PhRegisterCallback(
+ PhGetGeneralCallback(GeneralCallbackMainWindowShowing),
+ MainWindowShowingCallback,
+ NULL,
+ &MainWindowShowingCallbackRegistration
+ );
+ PhRegisterCallback(
+ PhGetGeneralCallback(GeneralCallbackProcessesUpdated),
+ ProcessesUpdatedCallback,
+ NULL,
+ &ProcessesUpdatedCallbackRegistration
+ );
PhRegisterCallback(
PhGetGeneralCallback(GeneralCallbackGetProcessHighlightingColor),
GetProcessHighlightingColorCallback,
@@ -69,6 +134,15 @@ LOGICAL DllMain(
NULL,
&GetProcessTooltipTextCallbackRegistration
);
+
+ {
+ static PH_SETTING_CREATE settings[] =
+ {
+ { StringSettingType, L"ProcessHacker.SbieSupport.SbieDllPath", L"C:\\Program Files\\Sandboxie\\SbieDll.dll" }
+ };
+
+ PhAddSettings(settings, sizeof(settings) / sizeof(PH_SETTING_CREATE));
+ }
}
break;
}
@@ -96,6 +170,7 @@ VOID NTAPI LoadCallback(
__in PVOID Context
)
{
+ PPH_STRING sbieDllPath;
HMODULE module;
HANDLE timerQueueHandle;
HANDLE timerHandle;
@@ -107,13 +182,117 @@ VOID NTAPI LoadCallback(
32
);
- module = LoadLibrary(L"C:\\Program Files\\Sandboxie\\SbieDll.dll");
+ sbieDllPath = PhGetStringSetting(L"ProcessHacker.SbieSupport.SbieDllPath");
+ module = LoadLibrary(sbieDllPath->Buffer);
+ PhDereferenceObject(sbieDllPath);
+
SbieApi_EnumBoxes = (PVOID)GetProcAddress(module, "_SbieApi_EnumBoxes@8");
SbieApi_EnumProcessEx = (PVOID)GetProcAddress(module, "_SbieApi_EnumProcessEx@16");
+ SbieDll_KillAll = (PVOID)GetProcAddress(module, "_SbieDll_KillAll@8");
if (NT_SUCCESS(RtlCreateTimerQueue(&timerQueueHandle)))
{
- RtlCreateTimer(timerQueueHandle, &timerHandle, RefreshBoxedPids, NULL, 0, 2000, 0);
+ RtlCreateTimer(timerQueueHandle, &timerHandle, RefreshBoxedPids, NULL, 0, 5000, 0);
+ }
+}
+
+VOID NTAPI ShowOptionsCallback(
+ __in PVOID Parameter,
+ __in PVOID Context
+ )
+{
+ DialogBox(
+ PluginInstance->DllBase,
+ MAKEINTRESOURCE(IDD_OPTIONS),
+ (HWND)Parameter,
+ OptionsDlgProc
+ );
+}
+
+VOID NTAPI MenuItemCallback(
+ __in PVOID Parameter,
+ __in PVOID Context
+ )
+{
+ PPH_PLUGIN_MENU_ITEM menuItem = Parameter;
+
+ switch (menuItem->Id)
+ {
+ case 1:
+ {
+ if (PhShowConfirmMessage(
+ PhMainWndHandle,
+ L"terminate",
+ L"all sandboxed processes",
+ NULL,
+ FALSE
+ ))
+ {
+ PBOXED_PROCESS boxedProcess;
+ ULONG enumerationKey = 0;
+
+ // Make sure we have an update-to-date list.
+ RefreshBoxedPids(NULL, FALSE);
+
+ PhAcquireQueuedLockShared(&BoxedProcessesLock);
+
+ while (PhEnumHashtable(BoxedProcessesHashtable, &boxedProcess, &enumerationKey))
+ {
+ HANDLE processHandle;
+
+ if (NT_SUCCESS(PhOpenProcess(&processHandle, PROCESS_TERMINATE, boxedProcess->ProcessId)))
+ {
+ PhTerminateProcess(processHandle, STATUS_SUCCESS);
+ NtClose(processHandle);
+ }
+ }
+
+ PhReleaseQueuedLockShared(&BoxedProcessesLock);
+ }
+ }
+ break;
+ }
+}
+
+VOID NTAPI MainWindowShowingCallback(
+ __in PVOID Parameter,
+ __in PVOID Context
+ )
+{
+ PhPluginAddMenuItem(PluginInstance, PH_MENU_ITEM_LOCATION_TOOLS, L"$",
+ 0, L"-", NULL);
+ PhPluginAddMenuItem(PluginInstance, PH_MENU_ITEM_LOCATION_TOOLS, L"$",
+ 1, L"Terminate Sandboxed Processes", NULL);
+}
+
+VOID NTAPI ProcessesUpdatedCallback(
+ __in PVOID Parameter,
+ __in PVOID Context
+ )
+{
+ PBOXED_PROCESS boxedProcess;
+ ULONG enumerationKey = 0;
+
+ if (BoxedProcessesUpdated)
+ {
+ // Invalidate the nodes of boxed processes (so they use the correct highlighting color).
+
+ PhAcquireQueuedLockShared(&BoxedProcessesLock);
+
+ if (BoxedProcessesUpdated)
+ {
+ while (PhEnumHashtable(BoxedProcessesHashtable, &boxedProcess, &enumerationKey))
+ {
+ PPH_PROCESS_NODE processNode;
+
+ if (processNode = PhFindProcessNode(boxedProcess->ProcessId))
+ PhUpdateProcessNode(processNode);
+ }
+
+ BoxedProcessesUpdated = FALSE;
+ }
+
+ PhReleaseQueuedLockShared(&BoxedProcessesLock);
}
}
@@ -204,5 +383,75 @@ VOID NTAPI RefreshBoxedPids(
}
}
+ BoxedProcessesUpdated = TRUE;
+
PhReleaseQueuedLockExclusive(&BoxedProcessesLock);
}
+
+INT_PTR CALLBACK OptionsDlgProc(
+ __in HWND hwndDlg,
+ __in UINT uMsg,
+ __in WPARAM wParam,
+ __in LPARAM lParam
+ )
+{
+ switch (uMsg)
+ {
+ case WM_INITDIALOG:
+ {
+ PPH_STRING sbieDllPath;
+
+ sbieDllPath = PhGetStringSetting(L"ProcessHacker.SbieSupport.SbieDllPath");
+ SetDlgItemText(hwndDlg, IDC_SBIEDLLPATH, sbieDllPath->Buffer);
+ PhDereferenceObject(sbieDllPath);
+ }
+ break;
+ case WM_COMMAND:
+ {
+ switch (LOWORD(wParam))
+ {
+ case IDCANCEL:
+ EndDialog(hwndDlg, IDCANCEL);
+ break;
+ case IDOK:
+ {
+ PhSetStringSetting2(L"ProcessHacker.SbieSupport.SbieDllPath",
+ &PHA_GET_DLGITEM_TEXT(hwndDlg, IDC_SBIEDLLPATH)->sr);
+
+ EndDialog(hwndDlg, IDOK);
+ }
+ break;
+ case IDC_BROWSE:
+ {
+ static PH_FILETYPE_FILTER filters[] =
+ {
+ { L"SbieDll.dll", L"SbieDll.dll" },
+ { L"All files (*.*)", L"*.*" }
+ };
+ PVOID fileDialog;
+ PPH_STRING fileName;
+
+ fileDialog = PhCreateOpenFileDialog();
+ PhSetFileDialogFilter(fileDialog, filters, sizeof(filters) / sizeof(PH_FILETYPE_FILTER));
+
+ fileName = PhGetFileName(PHA_GET_DLGITEM_TEXT(hwndDlg, IDC_SBIEDLLPATH));
+ PhSetFileDialogFileName(fileDialog, fileName->Buffer);
+ PhDereferenceObject(fileName);
+
+ if (PhShowFileDialog(NULL, fileDialog))
+ {
+ fileName = PhGetFileDialogFileName(fileDialog);
+ SetDlgItemText(hwndDlg, IDC_SBIEDLLPATH, fileName->Buffer);
+ PhDereferenceObject(fileName);
+ }
+
+ PhFreeFileDialog(fileDialog);
+ }
+ break;
+ }
+ }
+ break;
+ }
+
+ return FALSE;
+}
diff --git a/2.x/trunk/plugins/SbieSupport/resource.h b/2.x/trunk/plugins/SbieSupport/resource.h
index 7c71619f0..609a9a2d4 100644
--- a/2.x/trunk/plugins/SbieSupport/resource.h
+++ b/2.x/trunk/plugins/SbieSupport/resource.h
@@ -1,14 +1,19 @@
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by SbieSupport.rc
+//
+#define IDD_OPTIONS 101
+#define IDC_SBIEDLLPATH 1001
+#define IDC_BUTTON1 1002
+#define IDC_BROWSE 1002
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
-#define _APS_NEXT_RESOURCE_VALUE 101
+#define _APS_NEXT_RESOURCE_VALUE 102
#define _APS_NEXT_COMMAND_VALUE 40001
-#define _APS_NEXT_CONTROL_VALUE 1001
+#define _APS_NEXT_CONTROL_VALUE 1003
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
diff --git a/2.x/trunk/plugins/SbieSupport/sbiedll.h b/2.x/trunk/plugins/SbieSupport/sbiedll.h
index bc8808786..fe42d553d 100644
--- a/2.x/trunk/plugins/SbieSupport/sbiedll.h
+++ b/2.x/trunk/plugins/SbieSupport/sbiedll.h
@@ -2,8 +2,8 @@
#define SBIEDLL_H
typedef LONG (__stdcall *P_SbieApi_EnumBoxes)(
- LONG index, // initialize to -1
- WCHAR *box_name); // pointer to WCHAR [34]
+ LONG index, // initialize to -1
+ WCHAR *box_name); // pointer to WCHAR [34]
typedef LONG (__stdcall *P_SbieApi_EnumProcessEx)(
const WCHAR *box_name, // pointer to WCHAR [34]
@@ -11,4 +11,8 @@ typedef LONG (__stdcall *P_SbieApi_EnumProcessEx)(
ULONG which_session,
ULONG *boxed_pids); // pointer to ULONG [512]
+typedef BOOLEAN (__stdcall *P_SbieDll_KillAll)(
+ ULONG session_id,
+ const WCHAR *box_name);
+
#endif
diff --git a/2.x/trunk/plugins/SecurityExplorer/main.c b/2.x/trunk/plugins/SecurityExplorer/main.c
index 8ad7ed4e7..b26133de0 100644
--- a/2.x/trunk/plugins/SecurityExplorer/main.c
+++ b/2.x/trunk/plugins/SecurityExplorer/main.c
@@ -31,7 +31,14 @@ LOGICAL DllMain(
{
case DLL_PROCESS_ATTACH:
{
- PluginInstance = PhRegisterPlugin(L"ProcessHacker.SecurityExplorer", Instance, NULL);
+ PH_PLUGIN_INFORMATION info;
+
+ info.DisplayName = L"Security Explorer";
+ info.Author = L"wj32";
+ info.Description = L"Manages LSA and SAM objects.";
+ info.HasOptions = FALSE;
+
+ PluginInstance = PhRegisterPlugin(L"ProcessHacker.SecurityExplorer", Instance, &info);
PhRegisterCallback(
PhGetPluginCallback(PluginInstance, PluginCallbackLoad),