* added plugins manager

* added options to SbieSupport

git-svn-id: svn://svn.code.sf.net/p/processhacker/code@3432 21ef857c-d57f-4fe0-8362-d861dc6d29cd
This commit is contained in:
wj32
2010-07-25 06:20:30 +00:00
parent 2499c364cc
commit b2c7309806
17 changed files with 725 additions and 19 deletions
+34
View File
@@ -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
@@ -804,6 +804,10 @@
RelativePath=".\plugin.c"
>
</File>
<File
RelativePath=".\plugman.c"
>
</File>
<File
RelativePath=".\procdb.c"
>
+17
View File
@@ -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(
+12 -7
View File
@@ -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
@@ -60,6 +60,8 @@ __mayRaise VOID PhSetStringSetting2(
__in PPH_STRINGREF Value
);
VOID PhClearIgnoredSettings();
NTSTATUS PhLoadSettings(
__in PWSTR FileName
);
+10
View File
@@ -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);
+2
View File
@@ -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);
}
+13 -1
View File
@@ -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;
+197
View File
@@ -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 <http://www.gnu.org/licenses/>.
*/
#include <phapp.h>
#include <settings.h>
#include <phplug.h>
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;
}
+10 -3
View File
@@ -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
+42
View File
@@ -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
+72
View File
@@ -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.
@@ -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
/////////////////////////////////////////////////////////////////////////////
+252 -3
View File
@@ -1,4 +1,5 @@
#include <phdk.h>
#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;
}
+7 -2
View File
@@ -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
+6 -2
View File
@@ -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
+8 -1
View File
@@ -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),