+NTSTATUS STDCALL
+PsLookupProcessThreadByCid(IN PCLIENT_ID Cid,
+ OUT PEPROCESS *Process OPTIONAL,
+ OUT PETHREAD *Thread)
+{
+ KIRQL oldIrql;
+ PLIST_ENTRY current_entry;
+ PETHREAD current;
+
+ KeAcquireSpinLock(&PiThreadListLock, &oldIrql);
+
+ current_entry = PiThreadListHead.Flink;
+ while (current_entry != &PiThreadListHead)
+ {
+ current = CONTAINING_RECORD(current_entry,
+ ETHREAD,
+ Tcb.ThreadListEntry);
+ if (current->Cid.UniqueThread == Cid->UniqueThread &&
+ current->Cid.UniqueProcess == Cid->UniqueProcess)
+ {
+ if (Process != NULL)
+ *Process = current->ThreadsProcess;
+ *Thread = current;
+ KeReleaseSpinLock(&PiThreadListLock, oldIrql);
+ return(STATUS_SUCCESS);
+ }
+
+ current_entry = current_entry->Flink;
+ }
+
+ KeReleaseSpinLock(&PiThreadListLock, oldIrql);
+
+ return(STATUS_INVALID_PARAMETER);
+}
+
+
+NTSTATUS STDCALL
+PsLookupThreadByThreadId(IN PVOID ThreadId,
+ OUT PETHREAD *Thread)
+{
+ KIRQL oldIrql;
+ PLIST_ENTRY current_entry;
+ PETHREAD current;
+
+ KeAcquireSpinLock(&PiThreadListLock, &oldIrql);
+
+ current_entry = PiThreadListHead.Flink;
+ while (current_entry != &PiThreadListHead)
+ {
+ current = CONTAINING_RECORD(current_entry,
+ ETHREAD,
+ Tcb.ThreadListEntry);
+ if (current->Cid.UniqueThread == (HANDLE)ThreadId)
+ {
+ *Thread = current;
+ KeReleaseSpinLock(&PiThreadListLock, oldIrql);
+ return(STATUS_SUCCESS);
+ }
+
+ current_entry = current_entry->Flink;
+ }
+
+ KeReleaseSpinLock(&PiThreadListLock, oldIrql);
+
+ return(STATUS_INVALID_PARAMETER);
+}
+