From 56f0fd30c0930693d7a596b4239b43bf0fbcd229 Mon Sep 17 00:00:00 2001 From: wj32 Date: Sun, 28 Mar 2010 07:58:25 +0000 Subject: [PATCH] * added PhCreateProcessWin32 * added PE Viewer integration git-svn-id: svn://svn.code.sf.net/p/processhacker/code@2993 21ef857c-d57f-4fe0-8362-d861dc6d29cd --- 2.x/trunk/ProcessHacker/ProcessHacker.rc | 1 + 2.x/trunk/ProcessHacker/actions.c | 29 ++------ 2.x/trunk/ProcessHacker/include/phapp.h | 7 ++ 2.x/trunk/ProcessHacker/procprp.c | 24 +++++++ 2.x/trunk/ProcessHacker/resource.h | 3 +- 2.x/trunk/ProcessHacker/settings.c | 3 +- 2.x/trunk/ProcessHacker/support.c | 54 ++++++++++++--- 2.x/trunk/phlib/include/ph.h | 15 +++++ 2.x/trunk/phlib/support.c | 85 ++++++++++++++++++++++++ 2.x/trunk/tools/peview/main.c | 4 +- 2.x/trunk/tools/peview/peprp.c | 2 +- 11 files changed, 189 insertions(+), 38 deletions(-) diff --git a/2.x/trunk/ProcessHacker/ProcessHacker.rc b/2.x/trunk/ProcessHacker/ProcessHacker.rc index 23bd91b9d..46d9472e1 100644 --- a/2.x/trunk/ProcessHacker/ProcessHacker.rc +++ b/2.x/trunk/ProcessHacker/ProcessHacker.rc @@ -167,6 +167,7 @@ BEGIN BEGIN MENUITEM "Unload", ID_MODULE_UNLOAD MENUITEM SEPARATOR + MENUITEM "Inspect", ID_MODULE_INSPECT MENUITEM "Search Online", ID_MODULE_SEARCHONLINE MENUITEM "Open Containing Folder", ID_MODULE_OPENCONTAININGFOLDER MENUITEM "Properties", ID_MODULE_PROPERTIES diff --git a/2.x/trunk/ProcessHacker/actions.c b/2.x/trunk/ProcessHacker/actions.c index 4f9d06a0d..2b1c1c384 100644 --- a/2.x/trunk/ProcessHacker/actions.c +++ b/2.x/trunk/ProcessHacker/actions.c @@ -380,14 +380,11 @@ BOOLEAN PhUiRestartProcess( ) { NTSTATUS status; - ULONG win32Result = 0; BOOLEAN cont = FALSE; HANDLE processHandle = NULL; BOOLEAN isPosix; PPH_STRING commandLine; PPH_STRING currentDirectory; - STARTUPINFO startupInfo; - PROCESS_INFORMATION processInformation; if (PhGetIntegerSetting(L"EnableWarnings")) { @@ -467,36 +464,24 @@ BOOLEAN PhUiRestartProcess( // Start the process. - memset(&startupInfo, 0, sizeof(STARTUPINFO)); - startupInfo.cb = sizeof(STARTUPINFO); - - if (!CreateProcess( + status = PhCreateProcessWin32( PhGetString(Process->FileName), // we didn't wait for S1 processing commandLine->Buffer, // string may be modified, but it's OK in this case NULL, - NULL, - FALSE, + currentDirectory->Buffer, 0, NULL, - currentDirectory->Buffer, - &startupInfo, - &processInformation - )) - { - win32Result = GetLastError(); - goto ErrorExit; - } - - NtClose(processInformation.hProcess); - NtClose(processInformation.hThread); + NULL, + NULL + ); ErrorExit: if (processHandle) NtClose(processHandle); - if (!NT_SUCCESS(status) || win32Result) + if (!NT_SUCCESS(status)) { - PhpShowErrorProcess(hWnd, L"restart", Process, status, win32Result); + PhpShowErrorProcess(hWnd, L"restart", Process, status, 0); return FALSE; } diff --git a/2.x/trunk/ProcessHacker/include/phapp.h b/2.x/trunk/ProcessHacker/include/phapp.h index 71e28a692..8b1a1da5d 100644 --- a/2.x/trunk/ProcessHacker/include/phapp.h +++ b/2.x/trunk/ProcessHacker/include/phapp.h @@ -124,6 +124,13 @@ VOID PhSearchOnlineString( __in PWSTR String ); +VOID PhShellExecuteUserString( + __in HWND hWnd, + __in PWSTR Setting, + __in PWSTR String, + __in BOOLEAN UseShellExecute + ); + FORCEINLINE PVOID PhpGenericPropertyPageHeader( __in HWND hwndDlg, __in UINT uMsg, diff --git a/2.x/trunk/ProcessHacker/procprp.c b/2.x/trunk/ProcessHacker/procprp.c index 1576a92a9..d59c97b72 100644 --- a/2.x/trunk/ProcessHacker/procprp.c +++ b/2.x/trunk/ProcessHacker/procprp.c @@ -1836,6 +1836,15 @@ VOID PhpInitializeModuleMenu( __in ULONG NumberOfModules ) { + PPH_STRING inspectExecutables; + + inspectExecutables = PhGetStringSetting(L"ProgramInspectExecutables"); + + if (inspectExecutables->Length == 0) + DeleteMenu(Menu, ID_MODULE_INSPECT, 0); + + PhDereferenceObject(inspectExecutables); + if (NumberOfModules == 0) { PhEnableAllMenuItems(Menu, FALSE); @@ -2074,6 +2083,21 @@ INT_PTR CALLBACK PhpProcessModulesDlgProc( } } break; + case ID_MODULE_INSPECT: + { + PPH_MODULE_ITEM moduleItem = PhGetSelectedListViewItemParam(lvHandle); + + if (moduleItem) + { + PhShellExecuteUserString( + hwndDlg, + L"ProgramInspectExecutables", + moduleItem->FileName->Buffer, + FALSE + ); + } + } + break; case ID_MODULE_SEARCHONLINE: { PPH_MODULE_ITEM moduleItem = PhGetSelectedListViewItemParam(lvHandle); diff --git a/2.x/trunk/ProcessHacker/resource.h b/2.x/trunk/ProcessHacker/resource.h index d682eccdb..abd5e9ab7 100644 --- a/2.x/trunk/ProcessHacker/resource.h +++ b/2.x/trunk/ProcessHacker/resource.h @@ -311,6 +311,7 @@ #define ID_USER_SENDMESSAGE 40129 #define ID_USER_PROPERTIES 40130 #define ID_USERS_DUMMY 40131 +#define ID_MODULE_INSPECT 40132 #define IDDYNAMIC 50000 // Next default values for new objects @@ -318,7 +319,7 @@ #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 154 -#define _APS_NEXT_COMMAND_VALUE 40132 +#define _APS_NEXT_COMMAND_VALUE 40133 #define _APS_NEXT_CONTROL_VALUE 1115 #define _APS_NEXT_SYMED_VALUE 111 #endif diff --git a/2.x/trunk/ProcessHacker/settings.c b/2.x/trunk/ProcessHacker/settings.c index 6522f0dcc..4facabf8f 100644 --- a/2.x/trunk/ProcessHacker/settings.c +++ b/2.x/trunk/ProcessHacker/settings.c @@ -47,7 +47,8 @@ VOID PhSettingsInitialization() PhpAddStringSetting(L"DbgHelpPath", L"dbghelp.dll"); PhpAddStringSetting(L"DbgHelpSearchPath", L""); PhpAddIntegerSetting(L"DbgHelpUndecorate", L"1"); - PhpAddStringSetting(L"SearchEngine", L"http://www.google.com/search?q=%s"); + PhpAddStringSetting(L"SearchEngine", L"http://www.google.com/search?q=\"%s\""); + PhpAddStringSetting(L"ProgramInspectExecutables", L"peview.exe \"%s\""); PhpAddIntegerPairSetting(L"ProcPropPosition", L"200,200"); PhpAddIntegerPairSetting(L"ProcPropSize", L"460,580"); PhpAddStringSetting(L"ProcPropPage", L"General"); diff --git a/2.x/trunk/ProcessHacker/support.c b/2.x/trunk/ProcessHacker/support.c index ba415fa37..193d930eb 100644 --- a/2.x/trunk/ProcessHacker/support.c +++ b/2.x/trunk/ProcessHacker/support.c @@ -262,22 +262,41 @@ VOID PhSearchOnlineString( __in PWSTR String ) { - PPH_STRING searchEngine = PhGetStringSetting(L"SearchEngine"); - ULONG indexOfReplacement = PhStringIndexOfString(searchEngine, 0, L"%s"); + PhShellExecuteUserString(hWnd, L"SearchEngine", String, TRUE); +} + +VOID PhShellExecuteUserString( + __in HWND hWnd, + __in PWSTR Setting, + __in PWSTR String, + __in BOOLEAN UseShellExecute + ) +{ + PPH_STRING executeString = PhGetStringSetting(Setting); + ULONG indexOfReplacement; + PPH_STRING stringBefore; + PPH_STRING stringAfter; + PPH_STRING newString; + + // Make sure the user executable string is absolute. + if (PhStringIndexOfChar(executeString, 0, L':') == -1) + { + newString = PhConcatStrings2(PhApplicationDirectory->Buffer, executeString->Buffer); + PhDereferenceObject(executeString); + executeString = newString; + } + + indexOfReplacement = PhStringIndexOfString(executeString, 0, L"%s"); if (indexOfReplacement != -1) { - PPH_STRING stringBefore; - PPH_STRING stringAfter; - PPH_STRING newString; - // Replace "%s" with the string. - stringBefore = PhSubstring(searchEngine, 0, indexOfReplacement); + stringBefore = PhSubstring(executeString, 0, indexOfReplacement); stringAfter = PhSubstring( - searchEngine, + executeString, indexOfReplacement + 2, - searchEngine->Length / 2 - indexOfReplacement - 2 + executeString->Length / 2 - indexOfReplacement - 2 ); newString = PhConcatStrings( @@ -286,12 +305,25 @@ VOID PhSearchOnlineString( String, stringAfter->Buffer ); - PhShellExecute(hWnd, newString->Buffer, NULL); + + if (UseShellExecute) + { + PhShellExecute(hWnd, newString->Buffer, NULL); + } + else + { + NTSTATUS status; + + status = PhCreateProcessWin32(NULL, newString->Buffer, NULL, NULL, 0, NULL, NULL, NULL); + + if (!NT_SUCCESS(status)) + PhShowStatus(hWnd, L"Unable to execute the command", status, 0); + } PhDereferenceObject(newString); PhDereferenceObject(stringAfter); PhDereferenceObject(stringBefore); } - PhDereferenceObject(searchEngine); + PhDereferenceObject(executeString); } diff --git a/2.x/trunk/phlib/include/ph.h b/2.x/trunk/phlib/include/ph.h index 6ac58a42d..8381ef58d 100644 --- a/2.x/trunk/phlib/include/ph.h +++ b/2.x/trunk/phlib/include/ph.h @@ -1674,6 +1674,21 @@ NTSTATUS PhWaitForMultipleObjectsAndPump( __in ULONG Timeout ); +#define PH_CREATE_PROCESS_INHERIT_HANDLES 0x1 +#define PH_CREATE_PROCESS_UNICODE_ENVIRONMENT 0x2 +#define PH_CREATE_PROCESS_SUSPENDED 0x4 + +NTSTATUS PhCreateProcessWin32( + __in_opt PWSTR FileName, + __in_opt PWSTR CommandLine, + __in_opt PVOID Environment, + __in_opt PWSTR CurrentDirectory, + __in ULONG Flags, + __in_opt HANDLE TokenHandle, + __out_opt PHANDLE ProcessHandle, + __out_opt PHANDLE ThreadHandle + ); + VOID PhShellExecute( __in HWND hWnd, __in PWSTR FileName, diff --git a/2.x/trunk/phlib/support.c b/2.x/trunk/phlib/support.c index b4cbc1eed..6aa1d4a8a 100644 --- a/2.x/trunk/phlib/support.c +++ b/2.x/trunk/phlib/support.c @@ -1245,6 +1245,91 @@ NTSTATUS PhWaitForMultipleObjectsAndPump( } } +NTSTATUS PhCreateProcessWin32( + __in_opt PWSTR FileName, + __in_opt PWSTR CommandLine, + __in_opt PVOID Environment, + __in_opt PWSTR CurrentDirectory, + __in ULONG Flags, + __in_opt HANDLE TokenHandle, + __out_opt PHANDLE ProcessHandle, + __out_opt PHANDLE ThreadHandle + ) +{ + static PH_FLAG_MAPPING mappings[] = + { + { PH_CREATE_PROCESS_UNICODE_ENVIRONMENT, CREATE_UNICODE_ENVIRONMENT }, + { PH_CREATE_PROCESS_SUSPENDED, CREATE_SUSPENDED } + }; + NTSTATUS status; + PPH_STRING commandLine = NULL; + STARTUPINFO startupInfo = { sizeof(startupInfo) }; + PROCESS_INFORMATION processInfo; + ULONG newFlags; + + if (CommandLine) + commandLine = PhCreateString(CommandLine); + + newFlags = 0; + PhMapFlags1(&newFlags, Flags, &mappings, sizeof(mappings) / sizeof(PH_FLAG_MAPPING)); + + if (!TokenHandle) + { + if (CreateProcess( + FileName, + PhGetString(commandLine), + NULL, + NULL, + !!(Flags & PH_CREATE_PROCESS_INHERIT_HANDLES), + newFlags, + Environment, + CurrentDirectory, + &startupInfo, + &processInfo + )) + status = STATUS_SUCCESS; + else + status = NTSTATUS_FROM_WIN32(GetLastError()); + } + else + { + if (CreateProcessAsUser( + TokenHandle, + FileName, + PhGetString(commandLine), + NULL, + NULL, + !!(Flags & PH_CREATE_PROCESS_INHERIT_HANDLES), + newFlags, + Environment, + CurrentDirectory, + &startupInfo, + &processInfo + )) + status = STATUS_SUCCESS; + else + status = NTSTATUS_FROM_WIN32(GetLastError()); + } + + if (commandLine) + PhDereferenceObject(commandLine); + + if (NT_SUCCESS(status)) + { + if (ProcessHandle) + *ProcessHandle = processInfo.hProcess; + else + NtClose(processInfo.hProcess); + + if (ThreadHandle) + *ThreadHandle = processInfo.hThread; + else + NtClose(processInfo.hThread); + } + + return status; +} + VOID PhShellExecute( __in HWND hWnd, __in PWSTR FileName, diff --git a/2.x/trunk/tools/peview/main.c b/2.x/trunk/tools/peview/main.c index 9605a5f04..5725da9e9 100644 --- a/2.x/trunk/tools/peview/main.c +++ b/2.x/trunk/tools/peview/main.c @@ -55,8 +55,6 @@ INT WINAPI WinMain( PhGuiSupportInitialization(); - CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); - PhApplicationName = L"PE Viewer"; commandLine.us = NtCurrentPeb()->ProcessParameters->CommandLine; @@ -79,6 +77,8 @@ INT WINAPI WinMain( }; PVOID fileDialog; + CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); + fileDialog = PhCreateOpenFileDialog(); PhSetFileDialogFilter(fileDialog, filters, sizeof(filters) / sizeof(PH_FILETYPE_FILTER)); diff --git a/2.x/trunk/tools/peview/peprp.c b/2.x/trunk/tools/peview/peprp.c index 20c8f4675..3acc47003 100644 --- a/2.x/trunk/tools/peview/peprp.c +++ b/2.x/trunk/tools/peview/peprp.c @@ -209,7 +209,7 @@ INT_PTR CALLBACK PvpPeGeneralDlgProc( lvHandle = GetDlgItem(hwndDlg, IDC_LIST); PhSetListViewStyle(lvHandle, FALSE, TRUE); PhSetControlTheme(lvHandle, L"explorer"); - PhAddListViewColumn(lvHandle, 0, 0, 0, LVCFMT_LEFT, 60, L"Name"); + PhAddListViewColumn(lvHandle, 0, 0, 0, LVCFMT_LEFT, 80, L"Name"); PhAddListViewColumn(lvHandle, 1, 1, 1, LVCFMT_LEFT, 80, L"VA"); PhAddListViewColumn(lvHandle, 2, 2, 2, LVCFMT_LEFT, 80, L"Size");