[KDGDB]
[reactos.git] / reactos / drivers / base / kdgdb / utils.c
diff --git a/reactos/drivers/base/kdgdb/utils.c b/reactos/drivers/base/kdgdb/utils.c
new file mode 100644 (file)
index 0000000..01dea3d
--- /dev/null
@@ -0,0 +1,71 @@
+/*
+ * COPYRIGHT:       GPL, see COPYING in the top level directory
+ * PROJECT:         ReactOS kernel
+ * FILE:            drivers/base/kddll/utils.c
+ * PURPOSE:         Misc helper functions.
+ */
+
+#include "kdgdb.h"
+
+/*
+ * We cannot use PsLookupProcessThreadByCid or alike as we could be running at any IRQL.
+ * So we have to loop over the process list.
+ */
+
+PEPROCESS
+find_process(
+    _In_ UINT_PTR Pid)
+{
+    HANDLE ProcessId = gdb_pid_to_handle(Pid);
+    LIST_ENTRY* ProcessEntry;
+    PEPROCESS Process;
+
+    /* Special case for idle process */
+    if (Pid == 1)
+        return TheIdleProcess;
+
+    for (ProcessEntry = ProcessListHead->Flink;
+            ProcessEntry != ProcessListHead;
+            ProcessEntry = ProcessEntry->Flink)
+    {
+        Process = CONTAINING_RECORD(ProcessEntry, EPROCESS, ActiveProcessLinks);
+
+        if (Process->UniqueProcessId == ProcessId)
+            return Process;
+    }
+
+    return NULL;
+}
+
+PETHREAD
+find_thread(
+    _In_ UINT_PTR Pid,
+    _In_ UINT_PTR Tid)
+{
+    HANDLE ThreadId = gdb_tid_to_handle(Tid);
+    PETHREAD Thread;
+    PEPROCESS Process;
+    LIST_ENTRY* ThreadEntry;
+
+    /* Special case for the idle thread */
+    if ((Pid == 1) && (Tid == 1))
+        return TheIdleThread;
+
+    Process = find_process(Pid);
+    if (!Process)
+        return NULL;
+
+    for (ThreadEntry = Process->ThreadListHead.Flink;
+            ThreadEntry != &Process->ThreadListHead;
+            ThreadEntry = ThreadEntry->Flink)
+    {
+        Thread = CONTAINING_RECORD(ThreadEntry, ETHREAD, ThreadListEntry);
+        /* For GDB, Tid == 0 means any thread */
+        if ((Thread->Cid.UniqueThread == ThreadId) || (Tid == 0))
+        {
+            return Thread;
+        }
+    }
+
+    return NULL;
+}