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

245 lines
5.6 KiB
C

/*
* Process Hacker Extra Plugins -
* Pool Table Plugin
*
* Copyright (C) 2016 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 _PM_H_
#define _PM_H_
#define CINTERFACE
#define COBJMACROS
#include <phdk.h>
#include <phappresource.h>
#include <shlobj.h>
#include <symprv.h>
#include <windowsx.h>
#include <workqueue.h>
#include "resource.h"
#define PLUGIN_NAME L"dmex.PoolMonPlugin"
#define SETTING_NAME_WINDOW_POSITION (PLUGIN_NAME L".WindowPosition")
#define SETTING_NAME_WINDOW_SIZE (PLUGIN_NAME L".WindowSize")
#define SETTING_NAME_TREE_LIST_COLUMNS (PLUGIN_NAME L".TreeViewColumns")
#define SETTING_NAME_TREE_LIST_SORT (PLUGIN_NAME L".TreeViewSort")
#define POOL_TABLE_MENUITEM 1
#define POOL_TABLE_SHOWDIALOG (WM_APP + 1)
#define POOL_TABLE_SHOWCONTEXTMENU (WM_APP + 2)
extern PPH_PLUGIN PluginInstance;
typedef enum _POOLTAG_TREE_ITEM_TYPE
{
TPOOLTAG_TREE_ITEM_TYPE_NONE,
TPOOLTAG_TREE_ITEM_TYPE_OBJECT,
TPOOLTAG_TREE_ITEM_TYPE_DRIVER,
} POOLTAG_TREE_ITEM_TYPE;
typedef struct _POOL_TAG_LIST_ENTRY
{
LIST_ENTRY ListEntry;
union
{
UCHAR Tag[4];
ULONG TagUlong;
};
PPH_STRING BinaryNameString;
PPH_STRING DescriptionString;
} POOL_TAG_LIST_ENTRY, *PPOOL_TAG_LIST_ENTRY;
typedef struct _POOL_ITEM
{
ULONG TagUlong;
WCHAR TagString[5];
PPH_STRING BinaryNameString;
PPH_STRING DescriptionString;
POOLTAG_TREE_ITEM_TYPE Type;
PH_UINT64_DELTA PagedAllocsDelta;
PH_UINT64_DELTA PagedFreesDelta;
PH_UINT64_DELTA PagedCurrentDelta;
PH_UINT64_DELTA PagedTotalSizeDelta;
PH_UINT64_DELTA NonPagedAllocsDelta;
PH_UINT64_DELTA NonPagedFreesDelta;
PH_UINT64_DELTA NonPagedCurrentDelta;
PH_UINT64_DELTA NonPagedTotalSizeDelta;
} POOL_ITEM, *PPOOL_ITEM;
typedef enum _POOLTAG_TREE_COLUMN_ITEM_NAME
{
TREE_COLUMN_ITEM_TAG,
TREE_COLUMN_ITEM_DRIVER,
TREE_COLUMN_ITEM_DESCRIPTION,
TREE_COLUMN_ITEM_PAGEDALLOC,
TREE_COLUMN_ITEM_PAGEDFREE,
TREE_COLUMN_ITEM_PAGEDCURRENT,
TREE_COLUMN_ITEM_PAGEDTOTAL,
TREE_COLUMN_ITEM_NONPAGEDALLOC,
TREE_COLUMN_ITEM_NONPAGEDFREE,
TREE_COLUMN_ITEM_NONPAGEDCURRENT,
TREE_COLUMN_ITEM_NONPAGEDTOTAL,
TREE_COLUMN_ITEM_MAXIMUM
} POOLTAG_TREE_COLUMN_ITEM_NAME;
typedef struct _POOLTAG_ROOT_NODE
{
PH_TREENEW_NODE Node;
PH_STRINGREF TextCache[TREE_COLUMN_ITEM_MAXIMUM];
ULONG TagUlong;
PPOOL_ITEM PoolItem;
PPH_STRING PagedAllocsDeltaString;
PPH_STRING PagedFreesDeltaString;
PPH_STRING PagedLiveDeltaString;
PPH_STRING PagedCurrentDeltaString;
PPH_STRING PagedTotalSizeDeltaString;
PPH_STRING NonPagedAllocsDeltaString;
PPH_STRING NonPagedFreesDeltaString;
PPH_STRING NonPagedLiveDeltaString;
PPH_STRING NonPagedCurrentDeltaString;
PPH_STRING NonPagedTotalSizeDeltaString;
} POOLTAG_ROOT_NODE, *PPOOLTAG_ROOT_NODE;
typedef struct _POOLTAG_CONTEXT
{
HWND ParentWindowHandle;
HWND SearchboxHandle;
HWND TreeNewHandle;
PH_LAYOUT_MANAGER LayoutManager;
ULONG ProcessesUpdatedCount;
PH_CALLBACK_REGISTRATION ProcessesUpdatedCallbackRegistration;
PPH_STRING SearchboxText;
PH_TN_FILTER_SUPPORT FilterSupport;
PPH_TN_FILTER_ENTRY TreeFilterEntry;
PPH_LIST PoolTagDbList;
PPH_HASHTABLE PoolTagDbHashtable;
ULONG TreeNewSortColumn;
PH_SORT_ORDER TreeNewSortOrder;
PPH_HASHTABLE NodeHashtable;
PPH_LIST NodeList;
PPH_LIST NodeRootList;
} POOLTAG_CONTEXT, *PPOOLTAG_CONTEXT;
// dialog.c
VOID ShowPoolMonDialog(
VOID
);
typedef struct _BIGPOOLTAG_CONTEXT
{
HWND WindowHandle;
HWND ListviewHandle;
PH_LAYOUT_MANAGER LayoutManager;
union
{
UCHAR Tag[4];
ULONG TagUlong;
};
WCHAR TagString[5];
} BIGPOOLTAG_CONTEXT, *PBIGPOOLTAG_CONTEXT;
VOID ShowBigPoolDialog(
_In_ PPOOL_ITEM PoolItem
);
VOID PmLoadSettingsTreeList(
_Inout_ PPOOLTAG_CONTEXT Context
);
VOID PmSaveSettingsTreeList(
_Inout_ PPOOLTAG_CONTEXT Context
);
VOID PmInitializePoolTagTree(
_Inout_ PPOOLTAG_CONTEXT Context
);
VOID PmDeletePoolTagTree(
_In_ PPOOLTAG_CONTEXT Context
);
PPOOLTAG_ROOT_NODE PmFindPoolTagNode(
_In_ PPOOLTAG_CONTEXT Context,
_In_ ULONG PoolTag
);
PPOOLTAG_ROOT_NODE PmAddPoolTagNode(
_Inout_ PPOOLTAG_CONTEXT Context,
_In_ PPOOL_ITEM PoolItem
);
VOID PmUpdatePoolTagNode(
_In_ PPOOLTAG_CONTEXT Context,
_In_ PPOOLTAG_ROOT_NODE WindowNode
);
struct _PH_TN_FILTER_SUPPORT*
NTAPI
PmGetFilterSupportTreeList(
VOID
);
PPOOLTAG_ROOT_NODE PmGetSelectedPoolTagNode(
_In_ PPOOLTAG_CONTEXT Context
);
// pool.c
NTSTATUS EnumPoolTagTable(
_Out_ PVOID* Buffer
);
NTSTATUS EnumBigPoolTable(
_Out_ PVOID* Buffer
);
// db.c
VOID LoadPoolTagDatabase(
_In_ PPOOLTAG_CONTEXT Context
);
VOID FreePoolTagDatabase(
_In_ PPOOLTAG_CONTEXT Context
);
VOID UpdatePoolTagBinaryName(
_In_ PPOOLTAG_CONTEXT Context,
_In_ PPOOL_ITEM PoolEntry,
_In_ ULONG TagUlong
);
#endif _PM_H_