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
)