mirror of
https://github.com/mirror/processhacker
synced 2026-06-08 16:03:24 +00:00
added more columns to modules list
git-svn-id: svn://svn.code.sf.net/p/processhacker/code@3844 21ef857c-d57f-4fe0-8362-d861dc6d29cd
This commit is contained in:
@@ -2,10 +2,12 @@ Process Hacker
|
||||
|
||||
2.9
|
||||
* NEW/IMPROVED:
|
||||
* Added column selection for modules list
|
||||
* Environment variables and current directory are
|
||||
now correctly shown for WOW64 processes
|
||||
* FIXED:
|
||||
* Network list bug
|
||||
* Memory leaks
|
||||
|
||||
2.8
|
||||
* NEW/IMPROVED:
|
||||
|
||||
@@ -459,6 +459,8 @@ typedef struct _PH_MODULE_ITEM
|
||||
ULONG Size;
|
||||
ULONG Flags;
|
||||
ULONG Type;
|
||||
USHORT Reserved;
|
||||
USHORT LoadCount;
|
||||
PPH_STRING Name;
|
||||
PPH_STRING FileName;
|
||||
PH_IMAGE_VERSION_INFO VersionInfo;
|
||||
|
||||
@@ -404,7 +404,14 @@ VOID PhWriteServiceList(
|
||||
#define PHMOTLC_SIZE 2
|
||||
#define PHMOTLC_DESCRIPTION 3
|
||||
|
||||
#define PHMOTLC_MAXIMUM 4
|
||||
#define PHMOTLC_COMPANYNAME 4
|
||||
#define PHMOTLC_VERSION 5
|
||||
#define PHMOTLC_FILENAME 6
|
||||
|
||||
#define PHMOTLC_TYPE 7
|
||||
#define PHMOTLC_LOADCOUNT 8
|
||||
|
||||
#define PHMOTLC_MAXIMUM 9
|
||||
|
||||
typedef struct _PH_MODULE_NODE
|
||||
{
|
||||
@@ -419,6 +426,8 @@ typedef struct _PH_MODULE_NODE
|
||||
ULONG ValidMask;
|
||||
|
||||
PPH_STRING TooltipText;
|
||||
|
||||
WCHAR LoadCountString[PH_INT32_STR_LEN_1];
|
||||
} PH_MODULE_NODE, *PPH_MODULE_NODE;
|
||||
|
||||
typedef struct _PH_MODULE_LIST_CONTEXT
|
||||
@@ -433,6 +442,8 @@ typedef struct _PH_MODULE_LIST_CONTEXT
|
||||
|
||||
BOOLEAN EnableStateHighlighting;
|
||||
PPH_POINTER_LIST NodeStateList;
|
||||
|
||||
HFONT BoldFont;
|
||||
} PH_MODULE_LIST_CONTEXT, *PPH_MODULE_LIST_CONTEXT;
|
||||
|
||||
VOID PhInitializeModuleList(
|
||||
|
||||
@@ -3980,6 +3980,7 @@ VOID PhMainWndOnServiceAdded(
|
||||
}
|
||||
|
||||
serviceNode = PhAddServiceNode(ServiceItem, RunId);
|
||||
PhDereferenceObject(ServiceItem);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -96,6 +96,13 @@ VOID PhInitializeModuleList(
|
||||
PhAddTreeListColumn(hwnd, PHMOTLC_SIZE, TRUE, L"Size", 60, PH_ALIGN_RIGHT, 2, DT_RIGHT);
|
||||
PhAddTreeListColumn(hwnd, PHMOTLC_DESCRIPTION, TRUE, L"Description", 160, PH_ALIGN_LEFT, 3, 0);
|
||||
|
||||
PhAddTreeListColumn(hwnd, PHMOTLC_COMPANYNAME, FALSE, L"Company Name", 180, PH_ALIGN_LEFT, -1, 0);
|
||||
PhAddTreeListColumn(hwnd, PHMOTLC_VERSION, FALSE, L"Version", 100, PH_ALIGN_LEFT, -1, 0);
|
||||
PhAddTreeListColumn(hwnd, PHMOTLC_FILENAME, FALSE, L"File Name", 180, PH_ALIGN_LEFT, -1, DT_PATH_ELLIPSIS);
|
||||
|
||||
PhAddTreeListColumn(hwnd, PHMOTLC_TYPE, FALSE, L"Type", 80, PH_ALIGN_LEFT, -1, 0);
|
||||
PhAddTreeListColumn(hwnd, PHMOTLC_LOADCOUNT, FALSE, L"Load Count", 40, PH_ALIGN_LEFT, -1, 0);
|
||||
|
||||
TreeList_SetTriState(hwnd, TRUE);
|
||||
TreeList_SetSort(hwnd, 0, NoSortOrder);
|
||||
}
|
||||
@@ -106,6 +113,9 @@ VOID PhDeleteModuleList(
|
||||
{
|
||||
ULONG i;
|
||||
|
||||
if (Context->BoldFont)
|
||||
DeleteObject(Context->BoldFont);
|
||||
|
||||
for (i = 0; i < Context->NodeList->Count; i++)
|
||||
PhpDestroyModuleNode(Context->NodeList->Items[i]);
|
||||
|
||||
@@ -345,6 +355,36 @@ BEGIN_SORT_FUNCTION(Description)
|
||||
}
|
||||
END_SORT_FUNCTION
|
||||
|
||||
BEGIN_SORT_FUNCTION(CompanyName)
|
||||
{
|
||||
sortResult = PhCompareStringWithNull(moduleItem1->VersionInfo.CompanyName, moduleItem2->VersionInfo.CompanyName, TRUE);
|
||||
}
|
||||
END_SORT_FUNCTION
|
||||
|
||||
BEGIN_SORT_FUNCTION(Version)
|
||||
{
|
||||
sortResult = PhCompareStringWithNull(moduleItem1->VersionInfo.FileVersion, moduleItem2->VersionInfo.FileVersion, TRUE);
|
||||
}
|
||||
END_SORT_FUNCTION
|
||||
|
||||
BEGIN_SORT_FUNCTION(FileName)
|
||||
{
|
||||
sortResult = PhCompareStringWithNull(moduleItem1->FileName, moduleItem2->FileName, TRUE);
|
||||
}
|
||||
END_SORT_FUNCTION
|
||||
|
||||
BEGIN_SORT_FUNCTION(Type)
|
||||
{
|
||||
sortResult = uintcmp(moduleItem1->Type, moduleItem2->Type);
|
||||
}
|
||||
END_SORT_FUNCTION
|
||||
|
||||
BEGIN_SORT_FUNCTION(LoadCount)
|
||||
{
|
||||
sortResult = uintcmp(moduleItem1->LoadCount, moduleItem2->LoadCount);
|
||||
}
|
||||
END_SORT_FUNCTION
|
||||
|
||||
BOOLEAN NTAPI PhpModuleTreeListCallback(
|
||||
__in HWND hwnd,
|
||||
__in PH_TREELIST_MESSAGE Message,
|
||||
@@ -371,7 +411,12 @@ BOOLEAN NTAPI PhpModuleTreeListCallback(
|
||||
SORT_FUNCTION(Name),
|
||||
SORT_FUNCTION(BaseAddress),
|
||||
SORT_FUNCTION(Size),
|
||||
SORT_FUNCTION(Description)
|
||||
SORT_FUNCTION(Description),
|
||||
SORT_FUNCTION(CompanyName),
|
||||
SORT_FUNCTION(Version),
|
||||
SORT_FUNCTION(FileName),
|
||||
SORT_FUNCTION(Type),
|
||||
SORT_FUNCTION(LoadCount)
|
||||
};
|
||||
int (__cdecl *sortFunction)(void *, const void *, const void *);
|
||||
|
||||
@@ -421,6 +466,59 @@ BOOLEAN NTAPI PhpModuleTreeListCallback(
|
||||
case PHMOTLC_DESCRIPTION:
|
||||
getNodeText->Text = PhGetStringRef(moduleItem->VersionInfo.FileDescription);
|
||||
break;
|
||||
case PHMOTLC_COMPANYNAME:
|
||||
getNodeText->Text = PhGetStringRef(moduleItem->VersionInfo.CompanyName);
|
||||
break;
|
||||
case PHMOTLC_VERSION:
|
||||
getNodeText->Text = PhGetStringRef(moduleItem->VersionInfo.FileVersion);
|
||||
break;
|
||||
case PHMOTLC_FILENAME:
|
||||
getNodeText->Text = PhGetStringRef(moduleItem->FileName);
|
||||
break;
|
||||
case PHMOTLC_TYPE:
|
||||
{
|
||||
PWSTR typeString;
|
||||
|
||||
switch (moduleItem->Type)
|
||||
{
|
||||
case PH_MODULE_TYPE_MODULE:
|
||||
typeString = L"DLL";
|
||||
break;
|
||||
case PH_MODULE_TYPE_MAPPED_FILE:
|
||||
typeString = L"Mapped File";
|
||||
break;
|
||||
case PH_MODULE_TYPE_WOW64_MODULE:
|
||||
typeString = L"WOW64 DLL";
|
||||
break;
|
||||
case PH_MODULE_TYPE_KERNEL_MODULE:
|
||||
typeString = L"Kernel Module";
|
||||
break;
|
||||
default:
|
||||
typeString = L"Unknown";
|
||||
break;
|
||||
}
|
||||
|
||||
PhInitializeStringRef(&getNodeText->Text, typeString);
|
||||
}
|
||||
break;
|
||||
case PHMOTLC_LOADCOUNT:
|
||||
if (moduleItem->Type != PH_MODULE_TYPE_MAPPED_FILE)
|
||||
{
|
||||
if (moduleItem->LoadCount != (USHORT)-1)
|
||||
{
|
||||
PhPrintInt32(node->LoadCountString, moduleItem->LoadCount);
|
||||
PhInitializeStringRef(&getNodeText->Text, node->LoadCountString);
|
||||
}
|
||||
else
|
||||
{
|
||||
PhInitializeStringRef(&getNodeText->Text, L"Static");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
PhInitializeEmptyStringRef(&getNodeText->Text);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
return FALSE;
|
||||
}
|
||||
@@ -455,7 +553,18 @@ BOOLEAN NTAPI PhpModuleTreeListCallback(
|
||||
// Make the executable file module item bold.
|
||||
if (node->ModuleItem->IsFirst)
|
||||
{
|
||||
getNodeFont->Font = PhBoldListViewFont;
|
||||
if (!context->BoldFont)
|
||||
{
|
||||
LOGFONT logFont;
|
||||
|
||||
if (GetObject((HFONT)SendMessage(hwnd, WM_GETFONT, 0, 0), sizeof(LOGFONT), &logFont))
|
||||
{
|
||||
logFont.lfWeight = FW_BOLD;
|
||||
context->BoldFont = CreateFontIndirect(&logFont);
|
||||
}
|
||||
}
|
||||
|
||||
getNodeFont->Font = context->BoldFont ? context->BoldFont : PhBoldListViewFont;
|
||||
getNodeFont->Flags = TLC_CACHE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -359,6 +359,8 @@ VOID PhModuleProviderUpdate(
|
||||
moduleItem->Size = module->Size;
|
||||
moduleItem->Flags = module->Flags;
|
||||
moduleItem->Type = module->Type;
|
||||
moduleItem->Reserved = 0;
|
||||
moduleItem->LoadCount = module->LoadCount;
|
||||
|
||||
moduleItem->Name = module->Name;
|
||||
PhReferenceObject(moduleItem->Name);
|
||||
|
||||
@@ -3337,6 +3337,7 @@ INT_PTR CALLBACK PhpProcessModulesDlgProc(
|
||||
}
|
||||
|
||||
PhAddModuleNode(&modulesContext->ListContext, moduleItem, runId);
|
||||
PhDereferenceObject(moduleItem);
|
||||
}
|
||||
break;
|
||||
case WM_PH_MODULE_REMOVED:
|
||||
|
||||
@@ -32,6 +32,7 @@ _IsThemeActive IsThemeActive_I;
|
||||
_OpenThemeData OpenThemeData_I;
|
||||
_CloseThemeData CloseThemeData_I;
|
||||
_DrawThemeBackground DrawThemeBackground_I;
|
||||
_DrawThemeText DrawThemeText_I;
|
||||
_SHAutoComplete SHAutoComplete_I;
|
||||
_SHCreateShellItem SHCreateShellItem_I;
|
||||
_SHOpenFolderAndSelectItems SHOpenFolderAndSelectItems_I;
|
||||
@@ -56,6 +57,7 @@ VOID PhGuiSupportInitialization()
|
||||
OpenThemeData_I = (PVOID)GetProcAddress(uxthemeHandle, "OpenThemeData");
|
||||
CloseThemeData_I = (PVOID)GetProcAddress(uxthemeHandle, "CloseThemeData");
|
||||
DrawThemeBackground_I = (PVOID)GetProcAddress(uxthemeHandle, "DrawThemeBackground");
|
||||
DrawThemeText_I = (PVOID)GetProcAddress(uxthemeHandle, "DrawThemeText");
|
||||
SHAutoComplete_I = (PVOID)GetProcAddress(shlwapiHandle, "SHAutoComplete");
|
||||
SHCreateShellItem_I = (PVOID)GetProcAddress(shell32Handle, "SHCreateShellItem");
|
||||
SHOpenFolderAndSelectItems_I = (PVOID)GetProcAddress(shell32Handle, "SHOpenFolderAndSelectItems");
|
||||
|
||||
@@ -1008,6 +1008,9 @@ typedef struct _PH_MODULE_INFO
|
||||
ULONG Flags;
|
||||
PPH_STRING Name;
|
||||
PPH_STRING FileName;
|
||||
|
||||
USHORT LoadOrderIndex; // -1 if N/A
|
||||
USHORT LoadCount; // -1 if N/A
|
||||
} PH_MODULE_INFO, *PPH_MODULE_INFO;
|
||||
|
||||
/**
|
||||
|
||||
@@ -72,6 +72,18 @@ typedef HRESULT (WINAPI *_DrawThemeBackground)(
|
||||
__in const RECT *pClipRect
|
||||
);
|
||||
|
||||
typedef HRESULT (WINAPI *_DrawThemeText)(
|
||||
__in HTHEME hTheme,
|
||||
__in HDC hdc,
|
||||
__in int iPartId,
|
||||
__in int iStateId,
|
||||
__in_ecount(cchText) LPCWSTR pszText,
|
||||
__in int cchText,
|
||||
__in DWORD dwTextFlags,
|
||||
__reserved DWORD dwTextFlags2,
|
||||
__in LPCRECT pRect
|
||||
);
|
||||
|
||||
typedef HRESULT (WINAPI *_SHAutoComplete)(
|
||||
__in HWND hwndEdit,
|
||||
__in DWORD dwFlags
|
||||
@@ -91,6 +103,7 @@ extern _IsThemeActive IsThemeActive_I;
|
||||
extern _OpenThemeData OpenThemeData_I;
|
||||
extern _CloseThemeData CloseThemeData_I;
|
||||
extern _DrawThemeBackground DrawThemeBackground_I;
|
||||
extern _DrawThemeText DrawThemeText_I;
|
||||
extern _SHAutoComplete SHAutoComplete_I;
|
||||
extern _TaskDialogIndirect TaskDialogIndirect_I;
|
||||
#endif
|
||||
|
||||
@@ -136,6 +136,38 @@ FORCEINLINE INT PhModifySort(
|
||||
\
|
||||
return 0
|
||||
|
||||
FORCEINLINE int charcmp(
|
||||
__in signed char value1,
|
||||
__in signed char value2
|
||||
)
|
||||
{
|
||||
return C_1sTo4(value1 - value2);
|
||||
}
|
||||
|
||||
FORCEINLINE int ucharcmp(
|
||||
__in unsigned char value1,
|
||||
__in unsigned char value2
|
||||
)
|
||||
{
|
||||
PH_BUILTIN_COMPARE(value1, value2);
|
||||
}
|
||||
|
||||
FORCEINLINE int shortcmp(
|
||||
__in signed short value1,
|
||||
__in signed short value2
|
||||
)
|
||||
{
|
||||
return C_2sTo4(value1 - value2);
|
||||
}
|
||||
|
||||
FORCEINLINE int ushortcmp(
|
||||
__in unsigned short value1,
|
||||
__in unsigned short value2
|
||||
)
|
||||
{
|
||||
PH_BUILTIN_COMPARE(value1, value2);
|
||||
}
|
||||
|
||||
FORCEINLINE int intcmp(
|
||||
__in int value1,
|
||||
__in int value2
|
||||
|
||||
@@ -6311,6 +6311,8 @@ typedef struct _ENUM_GENERIC_PROCESS_MODULES_CONTEXT
|
||||
PVOID Context;
|
||||
ULONG Type;
|
||||
PPH_LIST BaseAddressList;
|
||||
|
||||
ULONG LoadOrderIndex;
|
||||
} ENUM_GENERIC_PROCESS_MODULES_CONTEXT, *PENUM_GENERIC_PROCESS_MODULES_CONTEXT;
|
||||
|
||||
static BOOLEAN EnumGenericProcessModulesCallback(
|
||||
@@ -6350,6 +6352,8 @@ static BOOLEAN EnumGenericProcessModulesCallback(
|
||||
Module->BaseDllName.Length
|
||||
);
|
||||
moduleInfo.FileName = PhGetFileName(fileName);
|
||||
moduleInfo.LoadOrderIndex = (USHORT)(context->LoadOrderIndex++);
|
||||
moduleInfo.LoadCount = Module->LoadCount;
|
||||
|
||||
PhDereferenceObject(fileName);
|
||||
|
||||
@@ -6402,6 +6406,8 @@ VOID PhpRtlModulesToGenericModules(
|
||||
moduleInfo.Flags = module->Flags;
|
||||
moduleInfo.Name = PhCreateStringFromAnsi(&module->FullPathName[module->OffsetToFileName]);
|
||||
moduleInfo.FileName = PhGetFileName(fileName); // convert to DOS file name
|
||||
moduleInfo.LoadOrderIndex = module->LoadOrderIndex;
|
||||
moduleInfo.LoadCount = module->LoadCount;
|
||||
|
||||
PhDereferenceObject(fileName);
|
||||
|
||||
@@ -6455,6 +6461,8 @@ VOID PhpRtlModulesExToGenericModules(
|
||||
moduleInfo.Flags = module->ModuleInfo.Flags;
|
||||
moduleInfo.Name = PhCreateStringFromAnsi(&module->ModuleInfo.FullPathName[module->ModuleInfo.OffsetToFileName]);
|
||||
moduleInfo.FileName = PhGetFileName(fileName); // convert to DOS file name
|
||||
moduleInfo.LoadOrderIndex = module->ModuleInfo.LoadOrderIndex;
|
||||
moduleInfo.LoadCount = module->ModuleInfo.LoadCount;
|
||||
|
||||
PhDereferenceObject(fileName);
|
||||
|
||||
@@ -6527,6 +6535,8 @@ VOID PhpEnumGenericMappedFiles(
|
||||
moduleInfo.Flags = 0;
|
||||
moduleInfo.FileName = newFileName;
|
||||
moduleInfo.Name = PhGetBaseName(newFileName);
|
||||
moduleInfo.LoadOrderIndex = -1;
|
||||
moduleInfo.LoadCount = -1;
|
||||
|
||||
cont = Callback(&moduleInfo, Context);
|
||||
|
||||
@@ -6644,6 +6654,7 @@ NTSTATUS PhEnumGenericModules(
|
||||
context.Context = Context;
|
||||
context.Type = PH_MODULE_TYPE_MODULE;
|
||||
context.BaseAddressList = baseAddressList;
|
||||
context.LoadOrderIndex = 0;
|
||||
|
||||
status = PhEnumProcessModules(
|
||||
ProcessHandle,
|
||||
@@ -6673,6 +6684,7 @@ NTSTATUS PhEnumGenericModules(
|
||||
context.Context = Context;
|
||||
context.Type = PH_MODULE_TYPE_WOW64_MODULE;
|
||||
context.BaseAddressList = baseAddressList;
|
||||
context.LoadOrderIndex = 0;
|
||||
|
||||
status = PhEnumProcessModules32(
|
||||
ProcessHandle,
|
||||
|
||||
Reference in New Issue
Block a user