2025-05-13 19:49:49 +03:00

418 lines
9.6 KiB
C

/*
* Process Hacker Extra Plugins -
* Plugin Manager
*
* Copyright (C) 2013 dmex
*
* 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/>.
*/
#ifndef _WCT_H_
#define _WCT_H_
#define CINTERFACE
#define COBJMACROS
#include <phdk.h>
#include <phappresource.h>
#include <mxml.h>
#include <verify.h>
#include <workqueue.h>
#include <shlobj.h>
#include <Shellapi.h>
#include <psapi.h>
#include <winhttp.h>
#include <windowsx.h>
#include <uxtheme.h>
#include "resource.h"
#include "json-c/json.h"
#define IDD_WCT_MENUITEM 1000
#define PH_UPDATEISERRORED (WM_APP + 501)
#define PH_UPDATEAVAILABLE (WM_APP + 502)
#define PH_UPDATEISCURRENT (WM_APP + 503)
#define PH_UPDATENEWER (WM_APP + 504)
#define PH_UPDATESUCCESS (WM_APP + 505)
#define PH_UPDATEFAILURE (WM_APP + 506)
#define WM_SHOWDIALOG (WM_APP + 550)
#define WM_ACTION (WM_APP + 1550)
#define ID_WCTSHOWCONTEXTMENU 19584
#define SETTING_PREFIX L"dmex.ExtraPlugins"
#define SETTING_NAME_TREE_LIST_COLUMNS (SETTING_PREFIX L".TreeListColumns")
#define SETTING_NAME_WINDOW_POSITION (SETTING_PREFIX L".WindowPosition")
#define SETTING_NAME_WINDOW_SIZE (SETTING_PREFIX L".WindowSize")
#define SETTING_NAME_LAST_CLEANUP (SETTING_PREFIX L".LastCleanupCheckTime")
#define ID_SEARCH_CLEAR (WM_APP + 8001)
#define ID_UPDATE_ADD (WM_APP + 8002)
#define ID_UPDATE_COUNT (WM_APP + 8003)
#define MAKE_VERSION_ULONGLONG(major, minor, build, revision) \
(((ULONGLONG)(major) << 48) | \
((ULONGLONG)(minor) << 32) | \
((ULONGLONG)(build) << 16) | \
((ULONGLONG)(revision) << 0))
#define ITEM_CHECKED (INDEXTOSTATEIMAGEMASK(2))
#define ITEM_UNCHECKED (INDEXTOSTATEIMAGEMASK(1))
extern PPH_PLUGIN PluginInstance;
typedef enum _TREE_PLUGIN_STATE
{
PLUGIN_STATE_LOCAL,
PLUGIN_STATE_RESTART,
PLUGIN_STATE_REMOTE,
PLUGIN_STATE_UPDATE,
} TREE_PLUGIN_STATE;
typedef enum _WCT_TREE_COLUMN_ITEM_NAME
{
TREE_COLUMN_ITEM_NAME,
TREE_COLUMN_ITEM_AUTHOR,
TREE_COLUMN_ITEM_VERSION,
TREE_COLUMN_ITEM_MAXIMUM
} WCT_TREE_COLUMN_ITEM_NAME;
typedef struct _PHAPP_PLUGIN
{
// Public
PH_AVL_LINKS Links;
PVOID Reserved;
PVOID DllBase;
// end
// Private
PPH_STRING FileName;
ULONG Flags;
PH_STRINGREF Name;
PH_PLUGIN_INFORMATION Information;
PH_CALLBACK Callbacks[PluginCallbackMaximum];
} PHAPP_PLUGIN, *PPHAPP_PLUGIN;
typedef struct _PLUGIN_NODE
{
PH_TREENEW_NODE Node;
HICON Icon;
TREE_PLUGIN_STATE State;
BOOLEAN PluginOptions;
PPHAPP_PLUGIN PluginInstance;
// Local
PPH_STRING FilePath;
PPH_STRING InternalName;
// Remote
PPH_STRING Id;
PPH_STRING Visible;
PPH_STRING Name;
PPH_STRING Version;
PPH_STRING Author;
PPH_STRING Description;
PPH_STRING IconUrl;
PPH_STRING Requirements;
PPH_STRING FeedbackUrl;
PPH_STRING Screenshots;
PPH_STRING AddedTime;
PPH_STRING UpdatedTime;
PPH_STRING Download_count;
PPH_STRING Download_link_32;
PPH_STRING Download_link_64;
PPH_STRING SHA2_32;
PPH_STRING SHA2_64;
PPH_STRING HASH_32;
PPH_STRING HASH_64;
PPH_STRING FileName;
PH_STRINGREF TextCache[TREE_COLUMN_ITEM_MAXIMUM];
} PLUGIN_NODE, *PPLUGIN_NODE;
typedef struct _WCT_TREE_CONTEXT
{
HWND ParentWindowHandle;
HWND TreeNewHandle;
ULONG TreeNewSortColumn;
PH_SORT_ORDER TreeNewSortOrder;
PPH_HASHTABLE NodeHashtable;
PPH_LIST NodeList;
HFONT TitleFontHandle;
HFONT NormalFontHandle;
HFONT BoldFontHandle;
} WCT_TREE_CONTEXT, *PWCT_TREE_CONTEXT;
// dialog.c
VOID ShowPluginManagerDialog(VOID);
// disabled.c
VOID ShowDisabledPluginsDialog(_In_ HWND Parent);
typedef struct _PLUGIN_DISABLED_CONTEXT
{
PH_QUEUED_LOCK ListLock;
HWND DialogHandle;
HWND ListViewHandle;
PH_LAYOUT_MANAGER LayoutManager;
} PLUGIN_DISABLED_CONTEXT, *PPLUGIN_DISABLED_CONTEXT;
ULONG PhDisabledPluginsCount(VOID);
// plugin.c
PWSTR PhGetPluginBaseName(_In_ PPHAPP_PLUGIN Plugin);
BOOLEAN PhIsPluginLoadedByBaseName(_In_ PPH_STRINGREF BaseName);
BOOLEAN PhIsPluginDisabled(_In_ PPH_STRINGREF BaseName);
VOID PhSetPluginDisabled(_In_ PPH_STRINGREF BaseName, _In_ BOOLEAN Disable);
VOID WtcInitializeWindowTree(
_In_ HWND ParentWindowHandle,
_In_ HWND TreeNewHandle,
_Out_ PWCT_TREE_CONTEXT Context
);
VOID WtcDeleteWindowTree(
_In_ PWCT_TREE_CONTEXT Context
);
struct _PH_TN_FILTER_SUPPORT* WtcGetTreeListFilterSupport(
VOID
);
VOID CloudAddChildWindowNode(
_In_ PWCT_TREE_CONTEXT Context,
_In_ PPLUGIN_NODE Entry
);
PPLUGIN_NODE WeAddWindowNode(
_Inout_ PWCT_TREE_CONTEXT Context
);
PPLUGIN_NODE FindTreeNode(
_In_ PWCT_TREE_CONTEXT Context,
_In_ TREE_PLUGIN_STATE Type,
_In_ PPH_STRING InternalName
);
VOID WeRemoveWindowNode(
_In_ PWCT_TREE_CONTEXT Context,
_In_ PPLUGIN_NODE WindowNode
);
VOID WeClearWindowTree(
_In_ PWCT_TREE_CONTEXT Context
);
PPLUGIN_NODE WeGetSelectedWindowNode(
_In_ PWCT_TREE_CONTEXT Context
);
VOID WeGetSelectedWindowNodes(
_In_ PWCT_TREE_CONTEXT Context,
_Out_ PPLUGIN_NODE **Windows,
_Out_ PULONG NumberOfWindows
);
typedef struct _WCT_CONTEXT
{
HWND DialogHandle;
HWND SearchHandle;
HWND TreeNewHandle;
PPH_STRING SearchboxText;
PPH_STRING TreeText;
HFONT NormalFontHandle;
HFONT BoldFontHandle;
TREE_PLUGIN_STATE Type;
HWND PluginMenuActive;
UINT PluginMenuActiveId;
WCT_TREE_CONTEXT TreeContext;
PPH_TN_FILTER_SUPPORT TreeFilter;
PH_LAYOUT_MANAGER LayoutManager;
} WCT_CONTEXT, *PWCT_CONTEXT;
NTSTATUS QueryPluginsCallbackThread(_In_ PVOID Parameter);
VOID EnumerateLoadedPlugins(_In_ PWCT_CONTEXT Context);
typedef enum _PLUGIN_ACTION
{
PLUGIN_ACTION_RESTORE,
PLUGIN_ACTION_INSTALL,
PLUGIN_ACTION_UNINSTALL,
PLUGIN_ACTION_RESTART
} PLUGIN_ACTION;
typedef struct _PH_UPDATER_CONTEXT
{
BOOLEAN FixedWindowStyles;
HWND DialogHandle;
HICON IconSmallHandle;
HICON IconLargeHandle;
PLUGIN_ACTION Action;
PPLUGIN_NODE Node;
PPH_STRING FileDownloadUrl;
PPH_STRING RevVersion;
PPH_STRING Size;
PPH_STRING SetupFilePath;
} PH_UPDATER_CONTEXT, *PPH_UPDATER_CONTEXT;
BOOLEAN ShowUpdateDialog(
_In_ HWND Parent,
_In_ PLUGIN_ACTION Action
);
BOOLEAN StartInitialCheck(
_In_ HWND Parent,
_In_ PPLUGIN_NODE Node,
_In_ PLUGIN_ACTION Action
);
VOID ShowAvailableDialog(_In_ PPH_UPDATER_CONTEXT Context);
VOID ShowCheckForUpdatesDialog(_In_ PPH_UPDATER_CONTEXT Context);
VOID ShowCheckingForUpdatesDialog(_In_ PPH_UPDATER_CONTEXT Context);
VOID TaskDialogLinkClicked(_In_ PPH_UPDATER_CONTEXT Context);
NTSTATUS UpdateDownloadThread(_In_ PVOID Parameter);
// page1.c
VOID ShowCheckForUpdatesDialog(_In_ PPH_UPDATER_CONTEXT Context);
// page2.c
VOID ShowCheckingForUpdatesDialog(_In_ PPH_UPDATER_CONTEXT Context);
// page3.c
VOID ShowAvailableDialog(_In_ PPH_UPDATER_CONTEXT Context);
// page4.c
VOID ShowProgressDialog(_In_ PPH_UPDATER_CONTEXT Context);
VOID ShowLatestVersionDialog(_In_ PPH_UPDATER_CONTEXT Context);
VOID ShowPluginUninstallDialog(_In_ PPH_UPDATER_CONTEXT Context);
VOID ShowUpdateFailedDialog(
_In_ PPH_UPDATER_CONTEXT Context,
_In_ BOOLEAN HashFailed,
_In_ BOOLEAN SignatureFailed
);
// page6.c
VOID ShowInstallRestartDialog(_In_ PPH_UPDATER_CONTEXT Context);
VOID ShowUninstallRestartDialog(_In_ PPH_UPDATER_CONTEXT Context);
NTSTATUS SetupExtractBuild(_In_ PVOID Parameter);
// verify.c
typedef struct _UPDATER_HASH_CONTEXT
{
BCRYPT_ALG_HANDLE SignAlgHandle;
BCRYPT_ALG_HANDLE HashAlgHandle;
BCRYPT_KEY_HANDLE KeyHandle;
BCRYPT_HASH_HANDLE HashHandle;
ULONG HashObjectSize;
ULONG HashSize;
PVOID HashObject;
PVOID Hash;
} UPDATER_HASH_CONTEXT, *PUPDATER_HASH_CONTEXT;
BOOLEAN UpdaterInitializeHash(
_Out_ PUPDATER_HASH_CONTEXT *Context
);
BOOLEAN UpdaterUpdateHash(
_Inout_ PUPDATER_HASH_CONTEXT Context,
_In_reads_bytes_(Length) PVOID Buffer,
_In_ ULONG Length
);
BOOLEAN UpdaterVerifyHash(
_Inout_ PUPDATER_HASH_CONTEXT Context,
_In_ PPH_STRING Sha2Hash
);
BOOLEAN UpdaterVerifySignature(
_Inout_ PUPDATER_HASH_CONTEXT Context,
_In_ PPH_STRING HexSignature
);
VOID UpdaterDestroyHash(
_Inout_ PUPDATER_HASH_CONTEXT Context
);
VOID CreateSearchControl(
_In_ HWND Parent,
_In_ HWND WindowHandle,
_In_ UINT CommandID
);
typedef struct _EDIT_CONTEXT
{
UINT CommandID;
union
{
ULONG Flags;
struct
{
ULONG Hot : 1;
ULONG Pushed : 1;
ULONG Spare : 30;
};
};
LONG CXWidth;
INT CXBorder;
INT ImageWidth;
INT ImageHeight;
HWND WindowHandle;
HFONT WindowFont;
HIMAGELIST ImageList;
HBITMAP BitmapActive;
HBITMAP BitmapInactive;
HBRUSH BrushNormal;
HBRUSH BrushPushed;
HBRUSH BrushHot;
} EDIT_CONTEXT, *PEDIT_CONTEXT;
HBITMAP LoadImageFromResources(
_In_ UINT Width,
_In_ UINT Height,
_In_ PCWSTR Name,
_In_ BOOLEAN RGBAImage
);
LRESULT SysButtonCustomDraw(
_In_ PWCT_CONTEXT Context,
_In_ LPARAM lParam
);
#endif