From b2c7309806c6664db4e7a70752bc40eccf877b77 Mon Sep 17 00:00:00 2001 From: wj32 Date: Sun, 25 Jul 2010 06:20:30 +0000 Subject: [PATCH] * added plugins manager * added options to SbieSupport git-svn-id: svn://svn.code.sf.net/p/processhacker/code@3432 21ef857c-d57f-4fe0-8362-d861dc6d29cd --- 2.x/trunk/ProcessHacker/ProcessHacker.rc | 34 +++ 2.x/trunk/ProcessHacker/ProcessHacker.vcproj | 4 + 2.x/trunk/ProcessHacker/include/phapp.h | 17 ++ 2.x/trunk/ProcessHacker/include/phplug.h | 19 +- 2.x/trunk/ProcessHacker/include/settings.h | 2 + 2.x/trunk/ProcessHacker/mainwnd.c | 10 + 2.x/trunk/ProcessHacker/options.c | 2 + 2.x/trunk/ProcessHacker/plugin.c | 14 +- 2.x/trunk/ProcessHacker/plugman.c | 197 ++++++++++++++ 2.x/trunk/ProcessHacker/resource.h | 13 +- 2.x/trunk/ProcessHacker/sdk/phapppub.h | 42 +++ 2.x/trunk/ProcessHacker/settings.c | 72 ++++++ 2.x/trunk/plugins/SbieSupport/SbieSupport.rc | 37 +++ 2.x/trunk/plugins/SbieSupport/main.c | 255 ++++++++++++++++++- 2.x/trunk/plugins/SbieSupport/resource.h | 9 +- 2.x/trunk/plugins/SbieSupport/sbiedll.h | 8 +- 2.x/trunk/plugins/SecurityExplorer/main.c | 9 +- 17 files changed, 725 insertions(+), 19 deletions(-) create mode 100644 2.x/trunk/ProcessHacker/plugman.c 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),