Sync with trunk r64222.
[reactos.git] / drivers / base / kdgdb / utils.c
1 /*
2 * COPYRIGHT: GPL, see COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: drivers/base/kddll/utils.c
5 * PURPOSE: Misc helper functions.
6 */
7
8 #include "kdgdb.h"
9
10 /*
11 * We cannot use PsLookupProcessThreadByCid or alike as we could be running at any IRQL.
12 * So we have to loop over the process list.
13 */
14
15 PEPROCESS
16 find_process(
17 _In_ UINT_PTR Pid)
18 {
19 HANDLE ProcessId = gdb_pid_to_handle(Pid);
20 LIST_ENTRY* ProcessEntry;
21 PEPROCESS Process;
22
23 /* Special case for idle process */
24 if (Pid == 1)
25 return TheIdleProcess;
26
27 for (ProcessEntry = ProcessListHead->Flink;
28 ProcessEntry != ProcessListHead;
29 ProcessEntry = ProcessEntry->Flink)
30 {
31 Process = CONTAINING_RECORD(ProcessEntry, EPROCESS, ActiveProcessLinks);
32
33 if (Process->UniqueProcessId == ProcessId)
34 return Process;
35 }
36
37 return NULL;
38 }
39
40 PETHREAD
41 find_thread(
42 _In_ UINT_PTR Pid,
43 _In_ UINT_PTR Tid)
44 {
45 HANDLE ThreadId = gdb_tid_to_handle(Tid);
46 PETHREAD Thread;
47 PEPROCESS Process;
48 LIST_ENTRY* ThreadEntry;
49
50 /* Special case for the idle thread */
51 if ((Pid == 1) && (Tid == 1))
52 return TheIdleThread;
53
54 Process = find_process(Pid);
55 if (!Process)
56 return NULL;
57
58 for (ThreadEntry = Process->ThreadListHead.Flink;
59 ThreadEntry != &Process->ThreadListHead;
60 ThreadEntry = ThreadEntry->Flink)
61 {
62 Thread = CONTAINING_RECORD(ThreadEntry, ETHREAD, ThreadListEntry);
63 /* For GDB, Tid == 0 means any thread */
64 if ((Thread->Cid.UniqueThread == ThreadId) || (Tid == 0))
65 {
66 return Thread;
67 }
68 }
69
70 return NULL;
71 }