#ifndef PHGUI_H #define PHGUI_H #include #include #include #define COBJMACROS #include #include #include #include "resource.h" #define KPH_ERROR_MESSAGE (L"KProcessHacker does not support your operating system " \ L"or could not be loaded. Make sure Process Hacker is running " \ L"on a 32-bit system and with administrative privileges.") // main INT WINAPI WinMain( __in HINSTANCE hInstance, __in HINSTANCE hPrevInstance, __in LPSTR lpCmdLine, __in INT nCmdShow ); INT PhMainMessageLoop(); VOID PhActivatePreviousInstance(); VOID PhInitializeCommonControls(); VOID PhInitializeFont( __in HWND hWnd ); VOID PhInitializeKph(); BOOLEAN PhInitializeSystem(); VOID PhInitializeSystemInformation(); ATOM PhRegisterWindowClass(); VOID PhInitializeWindowsVersion(); // guisup typedef BOOL (WINAPI *_ChangeWindowMessageFilter)( __in UINT message, __in DWORD dwFlag ); typedef HRESULT (WINAPI *_SetWindowTheme)( __in HWND hwnd, __in LPCWSTR pszSubAppName, __in LPCWSTR pszSubIdList ); typedef HRESULT (WINAPI *_TaskDialogIndirect)( __in const TASKDIALOGCONFIG *pTaskConfig, __in int *pnButton, __in int *pnRadioButton, __in BOOL *pfVerificationFlagChecked ); #ifndef GUISUP_PRIVATE extern _ChangeWindowMessageFilter ChangeWindowMessageFilter_I; extern _TaskDialogIndirect TaskDialogIndirect_I; #endif VOID PhGuiSupportInitialization(); VOID PhSetControlTheme( __in HWND Handle, __in PWSTR Theme ); HWND PhCreateListViewControl( __in HWND ParentHandle, __in INT_PTR Id ); INT PhAddListViewColumn( __in HWND ListViewHandle, __in INT Index, __in INT DisplayIndex, __in INT SubItemIndex, __in INT Format, __in INT Width, __in PWSTR Text ); INT PhAddListViewItem( __in HWND ListViewHandle, __in INT Index, __in PWSTR Text, __in PVOID Param ); INT PhFindListViewItemByFlags( __in HWND ListViewHandle, __in INT StartIndex, __in ULONG Flags ); INT PhFindListViewItemByParam( __in HWND ListViewHandle, __in INT StartIndex, __in PVOID Param ); LOGICAL PhGetListViewItemParam( __in HWND ListViewHandle, __in INT Index, __out PPVOID Param ); VOID PhRemoveListViewItem( __in HWND ListViewHandle, __in INT Index ); VOID PhSetListViewItemImageIndex( __in HWND ListViewHandle, __in INT Index, __in INT ImageIndex ); VOID PhSetListViewItemStateImage( __in HWND ListViewHandle, __in INT Index, __in INT StateImage ); VOID PhSetListViewSubItem( __in HWND ListViewHandle, __in INT Index, __in INT SubItemIndex, __in PWSTR Text ); HWND PhCreateTabControl( __in HWND ParentHandle ); INT PhAddTabControlTab( __in HWND TabControlHandle, __in INT Index, __in PWSTR Text ); PPH_STRING PhGetWindowText( __in HWND hwnd ); VOID PhShowContextMenu( __in HWND hwnd, __in HWND subHwnd, __in HMENU menu, __in POINT point ); VOID PhSetRadioCheckMenuItem( __in HMENU Menu, __in ULONG Id, __in BOOLEAN RadioCheck ); VOID PhEnableMenuItem( __in HMENU Menu, __in ULONG Id, __in BOOLEAN Enable ); VOID PhEnableAllMenuItems( __in HMENU Menu, __in BOOLEAN Enable ); PVOID PhGetSelectedListViewItemParam( __in HWND hWnd ); VOID PhGetSelectedListViewItemParams( __in HWND hWnd, __out PVOID **Items, __out PULONG NumberOfItems ); VOID PhSetImageListBitmap( __in HIMAGELIST ImageList, __in INT Index, __in HINSTANCE InstanceHandle, __in LPCWSTR BitmapName ); #define PH_ANCHOR_LEFT 0x1 #define PH_ANCHOR_TOP 0x2 #define PH_ANCHOR_RIGHT 0x4 #define PH_ANCHOR_BOTTOM 0x8 #define PH_ANCHOR_ALL 0xf #define PH_FORCE_INVALIDATE 0x1000 typedef struct _PH_LAYOUT_ITEM { HWND Handle; struct _PH_LAYOUT_ITEM *ParentItem; ULONG LayoutNumber; ULONG NumberOfChildren; HDWP DeferHandle; RECT Rect; RECT OrigRect; RECT Margin; ULONG Anchor; } PH_LAYOUT_ITEM, *PPH_LAYOUT_ITEM; typedef struct _PH_LAYOUT_MANAGER { PPH_LIST List; PH_LAYOUT_ITEM RootItem; ULONG LayoutNumber; } PH_LAYOUT_MANAGER, *PPH_LAYOUT_MANAGER; VOID PhInitializeLayoutManager( __out PPH_LAYOUT_MANAGER Manager, __in HWND RootWindowHandle ); VOID PhDeleteLayoutManager( __inout PPH_LAYOUT_MANAGER Manager ); PPH_LAYOUT_ITEM PhAddLayoutItem( __inout PPH_LAYOUT_MANAGER Manager, __in HWND Handle, __in PPH_LAYOUT_ITEM ParentItem, __in ULONG Anchor ); PPH_LAYOUT_ITEM PhAddLayoutItemEx( __inout PPH_LAYOUT_MANAGER Manager, __in HWND Handle, __in PPH_LAYOUT_ITEM ParentItem, __in ULONG Anchor, __in RECT Margin ); VOID PhLayoutManagerLayout( __inout PPH_LAYOUT_MANAGER Manager ); FORCEINLINE VOID PhResizingMinimumSize( __inout PRECT Rect, __in WPARAM Edge, __in LONG MinimumWidth, __in LONG MinimumHeight ) { if (Edge == WMSZ_BOTTOMRIGHT || Edge == WMSZ_RIGHT || Edge == WMSZ_TOPRIGHT) { if (Rect->right - Rect->left < MinimumWidth) Rect->right = Rect->left + MinimumWidth; } else if (Edge == WMSZ_BOTTOMLEFT || Edge == WMSZ_LEFT || Edge == WMSZ_TOPLEFT) { if (Rect->right - Rect->left < MinimumWidth) Rect->left = Rect->right - MinimumWidth; } if (Edge == WMSZ_BOTTOMRIGHT || Edge == WMSZ_BOTTOM || Edge == WMSZ_BOTTOMLEFT) { if (Rect->bottom - Rect->top < MinimumHeight) Rect->bottom = Rect->top + MinimumHeight; } else if (Edge == WMSZ_TOPRIGHT || Edge == WMSZ_TOP || Edge == WMSZ_TOPLEFT) { if (Rect->bottom - Rect->top < MinimumHeight) Rect->top = Rect->bottom - MinimumHeight; } } // mainwnd #ifndef MAINWND_PRIVATE extern HWND PhMainWndHandle; #endif #define WM_PH_ACTIVATE (WM_APP + 99) #define PH_ACTIVATE_REPLY 0x1119 #define WM_PH_PROCESS_ADDED (WM_APP + 101) #define WM_PH_PROCESS_MODIFIED (WM_APP + 102) #define WM_PH_PROCESS_REMOVED (WM_APP + 103) #define WM_PH_SERVICE_ADDED (WM_APP + 104) #define WM_PH_SERVICE_MODIFIED (WM_APP + 105) #define WM_PH_SERVICE_REMOVED (WM_APP + 106) BOOLEAN PhMainWndInitialization( __in INT ShowCommand ); LRESULT CALLBACK PhMainWndProc( __in HWND hWnd, __in UINT uMsg, __in WPARAM wParam, __in LPARAM lParam ); // procprp #define PH_PROCESS_PROPCONTEXT_MAXPAGES 20 typedef struct _DLGTEMPLATEEX { WORD dlgVer; WORD signature; DWORD helpID; DWORD exStyle; DWORD style; WORD cDlgItems; short x; short y; short cx; short cy; } DLGTEMPLATEEX, *PDLGTEMPLATEEX; typedef struct _PH_PROCESS_PROPCONTEXT { PPH_PROCESS_ITEM ProcessItem; HANDLE WindowHandle; PH_EVENT CreatedEvent; PPH_STRING Title; PROPSHEETHEADER PropSheetHeader; HPROPSHEETPAGE *PropSheetPages; } PH_PROCESS_PROPCONTEXT, *PPH_PROCESS_PROPCONTEXT; typedef struct _PH_PROCESS_PROPPAGECONTEXT { PPH_PROCESS_PROPCONTEXT PropContext; PVOID Context; PROPSHEETPAGE PropSheetPage; BOOLEAN LayoutInitialized; } PH_PROCESS_PROPPAGECONTEXT, *PPH_PROCESS_PROPPAGECONTEXT; BOOLEAN PhProcessPropInitialization(); PPH_PROCESS_PROPCONTEXT PhCreateProcessPropContext( __in HWND ParentWindowHandle, __in PPH_PROCESS_ITEM ProcessItem ); VOID PhRefreshProcessPropContext( __inout PPH_PROCESS_PROPCONTEXT PropContext ); BOOLEAN PhAddProcessPropPage( __inout PPH_PROCESS_PROPCONTEXT PropContext, __in PPH_PROCESS_PROPPAGECONTEXT PropPageContext ); PPH_PROCESS_PROPPAGECONTEXT PhCreateProcessPropPageContext( __in LPCWSTR Template, __in DLGPROC DlgProc, __in PVOID Context ); BOOLEAN PhShowProcessProperties( __in PPH_PROCESS_PROPCONTEXT Context ); // secedit typedef NTSTATUS (NTAPI *PPH_GET_OBJECT_SECURITY)( __out PSECURITY_DESCRIPTOR *SecurityDescriptor, __in SECURITY_INFORMATION SecurityInformation, __in PVOID Context ); typedef NTSTATUS (NTAPI *PPH_SET_OBJECT_SECURITY)( __in PSECURITY_DESCRIPTOR SecurityDescriptor, __in SECURITY_INFORMATION SecurityInformation, __in PVOID Context ); typedef struct _PH_ACCESS_ENTRY { PWSTR Name; ACCESS_MASK Access; BOOLEAN General; BOOLEAN Specific; } PH_ACCESS_ENTRY, *PPH_ACCESS_ENTRY; VOID PhSecurityEditorInitialization(); HPROPSHEETPAGE PhCreateSecurityPage( __in PWSTR ObjectName, __in PPH_GET_OBJECT_SECURITY GetObjectSecurity, __in PPH_SET_OBJECT_SECURITY SetObjectSecurity, __in PVOID Context, __in PPH_ACCESS_ENTRY AccessEntries, __in ULONG NumberOfAccessEntries ); VOID PhEditSecurity( __in HWND hWnd, __in PWSTR ObjectName, __in PPH_GET_OBJECT_SECURITY GetObjectSecurity, __in PPH_SET_OBJECT_SECURITY SetObjectSecurity, __in PVOID Context, __in PPH_ACCESS_ENTRY AccessEntries, __in ULONG NumberOfAccessEntries ); typedef NTSTATUS (NTAPI *PPH_OPEN_OBJECT)( __out PHANDLE Handle, __in ACCESS_MASK DesiredAccess, __in PVOID Context ); typedef struct _PH_STD_OBJECT_SECURITY { PPH_OPEN_OBJECT OpenObject; PWSTR ObjectType; PVOID Context; } PH_STD_OBJECT_SECURITY, *PPH_STD_OBJECT_SECURITY; FORCEINLINE ACCESS_MASK PhGetAccessForGetSecurity( __in SECURITY_INFORMATION SecurityInformation ) { return READ_CONTROL | ((SecurityInformation & SACL_SECURITY_INFORMATION) ? ACCESS_SYSTEM_SECURITY : 0); } FORCEINLINE ACCESS_MASK PhGetAccessForSetSecurity( __in SECURITY_INFORMATION SecurityInformation ) { return ((SecurityInformation & DACL_SECURITY_INFORMATION) ? WRITE_DAC : 0) | ((SecurityInformation & OWNER_SECURITY_INFORMATION) ? WRITE_OWNER : 0) | ((SecurityInformation & SACL_SECURITY_INFORMATION) ? ACCESS_SYSTEM_SECURITY : 0); } NTSTATUS PhStdGetObjectSecurity( __out PSECURITY_DESCRIPTOR *SecurityDescriptor, __in SECURITY_INFORMATION SecurityInformation, __in PVOID Context ); NTSTATUS PhStdSetObjectSecurity( __in PSECURITY_DESCRIPTOR SecurityDescriptor, __in SECURITY_INFORMATION SecurityInformation, __in PVOID Context ); NTSTATUS PhGetSeObjectSecurity( __in HANDLE Handle, __in SE_OBJECT_TYPE ObjectType, __in SECURITY_INFORMATION SecurityInformation, __out PSECURITY_DESCRIPTOR *SecurityDescriptor ); NTSTATUS PhSetSeObjectSecurity( __in HANDLE Handle, __in SE_OBJECT_TYPE ObjectType, __in SECURITY_INFORMATION SecurityInformation, __in PSECURITY_DESCRIPTOR SecurityDescriptor ); // secdata BOOLEAN PhGetAccessEntries( __in PWSTR Type, __out PPH_ACCESS_ENTRY *AccessEntries, __out PULONG NumberOfAccessEntries ); // actions BOOLEAN PhUiTerminateProcesses( __in HWND hWnd, __in PPH_PROCESS_ITEM *Processes, __in ULONG NumberOfProcesses ); BOOLEAN PhUiSuspendProcesses( __in HWND hWnd, __in PPH_PROCESS_ITEM *Processes, __in ULONG NumberOfProcesses ); BOOLEAN PhUiResumeProcesses( __in HWND hWnd, __in PPH_PROCESS_ITEM *Processes, __in ULONG NumberOfProcesses ); BOOLEAN PhUiRestartProcess( __in HWND hWnd, __in PPH_PROCESS_ITEM Process ); BOOLEAN PhUiReduceWorkingSetProcesses( __in HWND hWnd, __in PPH_PROCESS_ITEM *Processes, __in ULONG NumberOfProcesses ); BOOLEAN PhUiSetVirtualizationProcess( __in HWND hWnd, __in PPH_PROCESS_ITEM Process, __in BOOLEAN Enable ); BOOLEAN PhUiDetachFromDebuggerProcess( __in HWND hWnd, __in PPH_PROCESS_ITEM Process ); BOOLEAN PhUiInjectDllProcess( __in HWND hWnd, __in PPH_PROCESS_ITEM Process ); BOOLEAN PhUiSetIoPriorityProcess( __in HWND hWnd, __in PPH_PROCESS_ITEM Process, __in ULONG IoPriority ); BOOLEAN PhUiSetPriorityProcess( __in HWND hWnd, __in PPH_PROCESS_ITEM Process, __in ULONG PriorityClassWin32 ); BOOLEAN PhUiStartService( __in HWND hWnd, __in PPH_SERVICE_ITEM Service ); BOOLEAN PhUiContinueService( __in HWND hWnd, __in PPH_SERVICE_ITEM Service ); BOOLEAN PhUiPauseService( __in HWND hWnd, __in PPH_SERVICE_ITEM Service ); BOOLEAN PhUiStopService( __in HWND hWnd, __in PPH_SERVICE_ITEM Service ); BOOLEAN PhUiDeleteService( __in HWND hWnd, __in PPH_SERVICE_ITEM Service ); BOOLEAN PhUiTerminateThreads( __in HWND hWnd, __in PPH_THREAD_ITEM *Threads, __in ULONG NumberOfThreads ); BOOLEAN PhUiForceTerminateThreads( __in HWND hWnd, __in HANDLE ProcessId, __in PPH_THREAD_ITEM *Threads, __in ULONG NumberOfThreads ); BOOLEAN PhUiSuspendThreads( __in HWND hWnd, __in PPH_THREAD_ITEM *Threads, __in ULONG NumberOfThreads ); BOOLEAN PhUiResumeThreads( __in HWND hWnd, __in PPH_THREAD_ITEM *Threads, __in ULONG NumberOfThreads ); BOOLEAN PhUiSetPriorityThread( __in HWND hWnd, __in PPH_THREAD_ITEM Thread, __in ULONG ThreadPriorityWin32 ); BOOLEAN PhUiSetIoPriorityThread( __in HWND hWnd, __in PPH_THREAD_ITEM Thread, __in ULONG IoPriority ); BOOLEAN PhUiUnloadModule( __in HWND hWnd, __in HANDLE ProcessId, __in PPH_MODULE_ITEM Module ); BOOLEAN PhUiCloseHandles( __in HWND hWnd, __in HANDLE ProcessId, __in PPH_HANDLE_ITEM *Handles, __in ULONG NumberOfHandles, __in BOOLEAN Warn ); BOOLEAN PhUiSetAttributesHandle( __in HWND hWnd, __in HANDLE ProcessId, __in PPH_HANDLE_ITEM Handle, __in ULONG Attributes ); // about VOID PhShowAboutDialog( __in HWND ParentWindowHandle ); // hndlprp.c VOID PhShowHandleProperties( __in HWND ParentWindowHandle, __in HANDLE ProcessId, __in PPH_HANDLE_ITEM HandleItem ); // srvprp VOID PhShowServiceProperties( __in HWND ParentWindowHandle, __in PPH_SERVICE_ITEM ServiceItem ); // termator VOID PhShowProcessTerminatorDialog( __in HWND ParentWindowHandle, __in PPH_PROCESS_ITEM ProcessItem ); // thrdstk VOID PhShowThreadStackDialog( __in HWND ParentWindowHandle, __in HANDLE ProcessId, __in HANDLE ThreadId, __in PPH_SYMBOL_PROVIDER SymbolProvider ); #endif