diff --git a/2.x/trunk/CHANGELOG.txt b/2.x/trunk/CHANGELOG.txt index 426f7e19f..a80efa424 100644 --- a/2.x/trunk/CHANGELOG.txt +++ b/2.x/trunk/CHANGELOG.txt @@ -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: diff --git a/2.x/trunk/ProcessHacker/include/providers.h b/2.x/trunk/ProcessHacker/include/providers.h index 36f4289de..581af3f15 100644 --- a/2.x/trunk/ProcessHacker/include/providers.h +++ b/2.x/trunk/ProcessHacker/include/providers.h @@ -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; diff --git a/2.x/trunk/ProcessHacker/include/uimodels.h b/2.x/trunk/ProcessHacker/include/uimodels.h index be3efda19..40827fd13 100644 --- a/2.x/trunk/ProcessHacker/include/uimodels.h +++ b/2.x/trunk/ProcessHacker/include/uimodels.h @@ -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( diff --git a/2.x/trunk/ProcessHacker/mainwnd.c b/2.x/trunk/ProcessHacker/mainwnd.c index b2d0e5cb0..0fab2b47d 100644 --- a/2.x/trunk/ProcessHacker/mainwnd.c +++ b/2.x/trunk/ProcessHacker/mainwnd.c @@ -3980,6 +3980,7 @@ VOID PhMainWndOnServiceAdded( } serviceNode = PhAddServiceNode(ServiceItem, RunId); + PhDereferenceObject(ServiceItem); } else { diff --git a/2.x/trunk/ProcessHacker/modlist.c b/2.x/trunk/ProcessHacker/modlist.c index c5f452491..4e7a1afcc 100644 --- a/2.x/trunk/ProcessHacker/modlist.c +++ b/2.x/trunk/ProcessHacker/modlist.c @@ -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; } diff --git a/2.x/trunk/ProcessHacker/modprv.c b/2.x/trunk/ProcessHacker/modprv.c index c5647c754..cb524c034 100644 --- a/2.x/trunk/ProcessHacker/modprv.c +++ b/2.x/trunk/ProcessHacker/modprv.c @@ -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); diff --git a/2.x/trunk/ProcessHacker/procprp.c b/2.x/trunk/ProcessHacker/procprp.c index 3a2bb4ead..a81a066d8 100644 --- a/2.x/trunk/ProcessHacker/procprp.c +++ b/2.x/trunk/ProcessHacker/procprp.c @@ -3337,6 +3337,7 @@ INT_PTR CALLBACK PhpProcessModulesDlgProc( } PhAddModuleNode(&modulesContext->ListContext, moduleItem, runId); + PhDereferenceObject(moduleItem); } break; case WM_PH_MODULE_REMOVED: diff --git a/2.x/trunk/phlib/guisup.c b/2.x/trunk/phlib/guisup.c index b4180341e..2eef18d3e 100644 --- a/2.x/trunk/phlib/guisup.c +++ b/2.x/trunk/phlib/guisup.c @@ -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"); diff --git a/2.x/trunk/phlib/include/ph.h b/2.x/trunk/phlib/include/ph.h index f5517f83a..665d34d8a 100644 --- a/2.x/trunk/phlib/include/ph.h +++ b/2.x/trunk/phlib/include/ph.h @@ -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; /** diff --git a/2.x/trunk/phlib/include/phgui.h b/2.x/trunk/phlib/include/phgui.h index 7a9fbbbe5..ee4d2cf51 100644 --- a/2.x/trunk/phlib/include/phgui.h +++ b/2.x/trunk/phlib/include/phgui.h @@ -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 diff --git a/2.x/trunk/phlib/include/phsup.h b/2.x/trunk/phlib/include/phsup.h index 60cfc0be1..93f75fdad 100644 --- a/2.x/trunk/phlib/include/phsup.h +++ b/2.x/trunk/phlib/include/phsup.h @@ -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 diff --git a/2.x/trunk/phlib/native.c b/2.x/trunk/phlib/native.c index f697bb497..5ed4d85cc 100644 --- a/2.x/trunk/phlib/native.c +++ b/2.x/trunk/phlib/native.c @@ -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,