From 1fda267dc5e72bc4d867f74efaeac610a9400b60 Mon Sep 17 00:00:00 2001 From: wj32 Date: Sun, 25 Oct 2009 11:30:46 +0000 Subject: [PATCH] process enumeration and list view items work git-svn-id: svn://svn.code.sf.net/p/processhacker/code@2315 21ef857c-d57f-4fe0-8362-d861dc6d29cd --- 2.x/trunk/ProcessHacker/ProcessHacker.vcproj | 4 ++ 2.x/trunk/ProcessHacker/guisup.c | 16 +++++ 2.x/trunk/ProcessHacker/include/ph.h | 11 ++++ 2.x/trunk/ProcessHacker/include/phgui.h | 6 ++ 2.x/trunk/ProcessHacker/mainwnd.c | 27 ++++++-- 2.x/trunk/ProcessHacker/ntimport.c | 2 + 2.x/trunk/ProcessHacker/process.c | 65 ++++++++++++++++++++ 2.x/trunk/ProcessHacker/support.c | 6 +- 8 files changed, 130 insertions(+), 7 deletions(-) create mode 100644 2.x/trunk/ProcessHacker/process.c diff --git a/2.x/trunk/ProcessHacker/ProcessHacker.vcproj b/2.x/trunk/ProcessHacker/ProcessHacker.vcproj index d5a66f708..39b8fafb1 100644 --- a/2.x/trunk/ProcessHacker/ProcessHacker.vcproj +++ b/2.x/trunk/ProcessHacker/ProcessHacker.vcproj @@ -362,6 +362,10 @@ RelativePath=".\ntimport.c" > + + diff --git a/2.x/trunk/ProcessHacker/guisup.c b/2.x/trunk/ProcessHacker/guisup.c index b280668b5..2942fda86 100644 --- a/2.x/trunk/ProcessHacker/guisup.c +++ b/2.x/trunk/ProcessHacker/guisup.c @@ -42,6 +42,22 @@ INT PhAddListViewColumn( return ListView_InsertColumn(ListViewHandle, Index, &column); } +INT PhAddListViewItem( + HWND ListViewHandle, + INT Index, + PWSTR Text + ) +{ + LVITEM item; + + item.mask = LVIF_TEXT; + item.iItem = Index; + item.iSubItem = 0; + item.pszText = Text; + + return ListView_InsertItem(ListViewHandle, &item); +} + HWND PhCreateTabControl( HWND ParentHandle ) diff --git a/2.x/trunk/ProcessHacker/include/ph.h b/2.x/trunk/ProcessHacker/include/ph.h index 13050cdc0..356388146 100644 --- a/2.x/trunk/ProcessHacker/include/ph.h +++ b/2.x/trunk/ProcessHacker/include/ph.h @@ -4,6 +4,17 @@ #include #include +// process + +typedef BOOLEAN (*PPH_ENUM_PROCESSES_CALLBACK)( + __in PSYSTEM_PROCESS_INFORMATION Process + ); + +NTSTATUS PhEnumProcesses( + __in PPH_ENUM_PROCESSES_CALLBACK Callback, + __out_opt PBOOLEAN Found + ); + // support PVOID PhAllocate( diff --git a/2.x/trunk/ProcessHacker/include/phgui.h b/2.x/trunk/ProcessHacker/include/phgui.h index b7b20347c..ab9737aad 100644 --- a/2.x/trunk/ProcessHacker/include/phgui.h +++ b/2.x/trunk/ProcessHacker/include/phgui.h @@ -65,6 +65,12 @@ INT PhAddListViewColumn( PWSTR Text ); +INT PhAddListViewItem( + HWND ListViewHandle, + INT Index, + PWSTR Text + ); + // Tab Controls HWND PhCreateTabControl( diff --git a/2.x/trunk/ProcessHacker/mainwnd.c b/2.x/trunk/ProcessHacker/mainwnd.c index cccb7e6ae..1036cf299 100644 --- a/2.x/trunk/ProcessHacker/mainwnd.c +++ b/2.x/trunk/ProcessHacker/mainwnd.c @@ -103,6 +103,24 @@ LRESULT CALLBACK PhMainWndProc( return 0; } +BOOLEAN ProcessEnumCallback(PSYSTEM_PROCESS_INFORMATION Process) +{ + PWSTR buffer; + + // LEAK + buffer = PhAllocate(Process->ImageName.Length + sizeof(WCHAR)); + memcpy(buffer, Process->ImageName.Buffer, Process->ImageName.Length); + buffer[Process->ImageName.Length / sizeof(WCHAR)] = 0; + + PhAddListViewItem( + ProcessListViewHandle, + MAXINT, + buffer + ); + + return FALSE; +} + VOID PhMainWndOnCreate() { TabControlHandle = PhCreateTabControl(PhMainWndHandle); @@ -111,11 +129,11 @@ VOID PhMainWndOnCreate() NetworkTabIndex = PhAddTabControlTab(TabControlHandle, 2, L"Network"); ProcessListViewHandle = PhCreateListViewControl(PhMainWndHandle, ID_MAINWND_PROCESSLV); - ListView_SetExtendedListViewStyleEx(ProcessListViewHandle, LVS_EX_DOUBLEBUFFER, LVS_EX_DOUBLEBUFFER); + ListView_SetExtendedListViewStyleEx(ProcessListViewHandle, LVS_EX_FULLROWSELECT | LVS_EX_DOUBLEBUFFER, -1); ServiceListViewHandle = PhCreateListViewControl(PhMainWndHandle, ID_MAINWND_SERVICELV); - ListView_SetExtendedListViewStyleEx(ServiceListViewHandle, LVS_EX_DOUBLEBUFFER, LVS_EX_DOUBLEBUFFER); + ListView_SetExtendedListViewStyleEx(ServiceListViewHandle, LVS_EX_FULLROWSELECT | LVS_EX_DOUBLEBUFFER, -1); NetworkListViewHandle = PhCreateListViewControl(PhMainWndHandle, ID_MAINWND_NETWORKLV); - ListView_SetExtendedListViewStyleEx(NetworkListViewHandle, LVS_EX_DOUBLEBUFFER, LVS_EX_DOUBLEBUFFER); + ListView_SetExtendedListViewStyleEx(NetworkListViewHandle, LVS_EX_FULLROWSELECT | LVS_EX_DOUBLEBUFFER, -1); PhAddListViewColumn( ProcessListViewHandle, @@ -144,12 +162,13 @@ VOID PhMainWndOnCreate() 100, L"Process Name" ); + + PhEnumProcesses(ProcessEnumCallback, NULL); } VOID PhMainWndOnLayout() { RECT rect; - INT selectedIndex; // Resize the tab control. GetClientRect(PhMainWndHandle, &rect); diff --git a/2.x/trunk/ProcessHacker/ntimport.c b/2.x/trunk/ProcessHacker/ntimport.c index 1017e059a..89e6c2b48 100644 --- a/2.x/trunk/ProcessHacker/ntimport.c +++ b/2.x/trunk/ProcessHacker/ntimport.c @@ -39,4 +39,6 @@ BOOLEAN PhInitializeImports() InitProcReq("ntdll.dll", NtSuspendThread); InitProcReq("ntdll.dll", NtTerminateProcess); InitProcReq("ntdll.dll", NtTerminateThread); + + return TRUE; } diff --git a/2.x/trunk/ProcessHacker/process.c b/2.x/trunk/ProcessHacker/process.c new file mode 100644 index 000000000..9d6f180ba --- /dev/null +++ b/2.x/trunk/ProcessHacker/process.c @@ -0,0 +1,65 @@ +#include + +NTSTATUS PhEnumProcesses( + __in PPH_ENUM_PROCESSES_CALLBACK Callback, + __out_opt PBOOLEAN Found + ) +{ + NTSTATUS status; + PVOID buffer; + ULONG bufferSize = 2048; + PSYSTEM_PROCESS_INFORMATION procInfo; + + buffer = PhAllocate(bufferSize); + + while (TRUE) + { + if (!buffer) + return STATUS_INSUFFICIENT_RESOURCES; + + status = NtQuerySystemInformation( + SystemProcessInformation, + buffer, + bufferSize, + &bufferSize + ); + + if (NT_SUCCESS(status)) + break; + + if (status == STATUS_BUFFER_TOO_SMALL || status == STATUS_INFO_LENGTH_MISMATCH) + { + PhFree(buffer); + buffer = PhAllocate(bufferSize); + } + else + { + return status; + } + } + + procInfo = (PSYSTEM_PROCESS_INFORMATION)buffer; + + while (TRUE) + { + if (Callback(procInfo)) + { + if (Found) + *Found = TRUE; + + return STATUS_SUCCESS; + } + + if (procInfo->NextEntryOffset == 0) + break; + + procInfo = (PSYSTEM_PROCESS_INFORMATION)((PCHAR)procInfo + procInfo->NextEntryOffset); + } + + PhFree(buffer); + + if (Found) + *Found = FALSE; + + return STATUS_SUCCESS; +} diff --git a/2.x/trunk/ProcessHacker/support.c b/2.x/trunk/ProcessHacker/support.c index adea65627..5c83e2680 100644 --- a/2.x/trunk/ProcessHacker/support.c +++ b/2.x/trunk/ProcessHacker/support.c @@ -1,21 +1,21 @@ #include #include -PVOID FORCEINLINE PhAllocate( +PVOID PhAllocate( __in SIZE_T Size ) { return HeapAlloc(PhHeapHandle, 0, Size); } -VOID FORCEINLINE PhFree( +VOID PhFree( __in PVOID Memory ) { HeapFree(PhHeapHandle, 0, Memory); } -PVOID FORCEINLINE PhReAlloc( +PVOID PhReAlloc( __in PVOID Memory, __in SIZE_T Size )