if (KeIsExecutingDpc() && Process != KdbCurrentProcess)
{
KdbpPrint("Cannot attach to thread within another process while executing a DPC.\n");
+ ObDereferenceObject(Thread);
return FALSE;
}
KdbCurrentProcess = Process;
}
+ ObDereferenceObject(Thread);
return TRUE;
}
}
Entry = Process->ThreadListHead.Flink;
+ ObDereferenceObject(Process);
if (Entry == &KdbCurrentProcess->ThreadListHead)
{
KdbpPrint("No threads in process 0x%08x, cannot attach to process!\n", (ULONG)ProcessId);
PLIST_ENTRY Entry;
PETHREAD Thread = NULL;
PEPROCESS Process = NULL;
+ BOOLEAN ReferencedThread = FALSE, ReferencedProcess = FALSE;
PULONG Esp;
PULONG Ebp;
ULONG Eip;
KdbpPrint("thread: Invalid process id!\n");
return TRUE;
}
+
+ /* Remember our reference */
+ ReferencedProcess = TRUE;
}
Entry = Process->ThreadListHead.Flink;
KdbpPrint("No threads in process 0x%08x!\n", ul);
else
KdbpPrint("No threads in current process!\n");
+ if (ReferencedProcess) ObDereferenceObject(Process);
return TRUE;
}
Entry = Entry->Flink;
}
while (Entry != &Process->ThreadListHead);
+
+ /* Release our reference, if any */
+ if (ReferencedProcess) ObDereferenceObject(Process);
}
else if (Argc >= 2 && _stricmp(Argv[1], "attach") == 0)
{
KdbpPrint("thread: Invalid thread id!\n");
return TRUE;
}
+
+ /* Remember our reference */
+ ReferencedThread = TRUE;
}
if (Thread->Tcb.State < (DeferredReady + 1))
Thread->Tcb.TrapFrame,
NPX_STATE_TO_STRING(Thread->Tcb.NpxState), Thread->Tcb.NpxState);
+ /* Release our reference if we had one */
+ if (ReferencedThread) ObDereferenceObject(Thread);
}
return TRUE;
{
PLIST_ENTRY Entry;
PEPROCESS Process;
+ BOOLEAN ReferencedProcess = FALSE;
PCHAR State, pend, str1, str2;
ULONG ul;
extern LIST_ENTRY PsActiveProcessHead;
KdbpPrint("proc: Invalid process id!\n");
return TRUE;
}
+
+ /* Remember our reference */
+ ReferencedProcess = TRUE;
}
State = ((Process->Pcb.State == ProcessInMemory) ? "In Memory" :
Process->UniqueProcessId,
State, Process->Pcb.State,
Process->ImageFileName);
+
+ /* Release our reference, if any */
+ if (ReferencedProcess) ObDereferenceObject(Process);
}
return TRUE;