Identify the process in ThreadExtraInfo
Modified: trunk/reactos/ntoskrnl/kd/wrappers/gdbstub.c
_____
Modified: trunk/reactos/ntoskrnl/kd/wrappers/gdbstub.c
--- trunk/reactos/ntoskrnl/kd/wrappers/gdbstub.c 2005-10-14
09:44:48 UTC (rev 18440)
+++ trunk/reactos/ntoskrnl/kd/wrappers/gdbstub.c 2005-10-14
13:00:18 UTC (rev 18441)
@@ -128,28 +128,26 @@
BOOLEAN SetInContext;
} CPU_REGISTER, *PCPU_REGISTER;
-#define KTRAP_FRAME_X86 KTRAP_FRAME
-
#define EIP_REGNO 8
static CPU_REGISTER GspRegisters[NUMREGS] =
{
- { 4, FIELD_OFFSET (KTRAP_FRAME_X86, Eax), FIELD_OFFSET (CONTEXT,
Eax), TRUE },
- { 4, FIELD_OFFSET (KTRAP_FRAME_X86, Ecx), FIELD_OFFSET (CONTEXT,
Ecx), TRUE },
- { 4, FIELD_OFFSET (KTRAP_FRAME_X86, Edx), FIELD_OFFSET (CONTEXT,
Edx), FALSE },
- { 4, FIELD_OFFSET (KTRAP_FRAME_X86, Ebx), FIELD_OFFSET (CONTEXT,
Ebx), TRUE },
- { 4, FIELD_OFFSET (KTRAP_FRAME_X86, Esp), FIELD_OFFSET (CONTEXT,
Esp), TRUE },
- { 4, FIELD_OFFSET (KTRAP_FRAME_X86, Ebp), FIELD_OFFSET (CONTEXT,
Ebp), TRUE },
- { 4, FIELD_OFFSET (KTRAP_FRAME_X86, Esi), FIELD_OFFSET (CONTEXT,
Esi), TRUE },
- { 4, FIELD_OFFSET (KTRAP_FRAME_X86, Edi), FIELD_OFFSET (CONTEXT,
Edi), TRUE },
- { 4, FIELD_OFFSET (KTRAP_FRAME_X86, Eip), FIELD_OFFSET (CONTEXT,
Eip), TRUE },
- { 4, FIELD_OFFSET (KTRAP_FRAME_X86, Eflags), FIELD_OFFSET (CONTEXT,
EFlags), TRUE },
- { 4, FIELD_OFFSET (KTRAP_FRAME_X86, Cs), FIELD_OFFSET (CONTEXT,
SegCs), TRUE },
- { 4, FIELD_OFFSET (KTRAP_FRAME_X86, Ss), FIELD_OFFSET (CONTEXT,
SegSs), TRUE },
- { 4, FIELD_OFFSET (KTRAP_FRAME_X86, Ds), FIELD_OFFSET (CONTEXT,
SegDs), TRUE },
- { 4, FIELD_OFFSET (KTRAP_FRAME_X86, Es), FIELD_OFFSET (CONTEXT,
SegEs), TRUE },
- { 4, FIELD_OFFSET (KTRAP_FRAME_X86, Fs), FIELD_OFFSET (CONTEXT,
SegFs), TRUE },
- { 4, FIELD_OFFSET (KTRAP_FRAME_X86, Gs), FIELD_OFFSET (CONTEXT,
SegGs), TRUE }
+ { 4, FIELD_OFFSET (KTRAP_FRAME, Eax), FIELD_OFFSET (CONTEXT, Eax),
TRUE },
+ { 4, FIELD_OFFSET (KTRAP_FRAME, Ecx), FIELD_OFFSET (CONTEXT, Ecx),
TRUE },
+ { 4, FIELD_OFFSET (KTRAP_FRAME, Edx), FIELD_OFFSET (CONTEXT, Edx),
FALSE },
+ { 4, FIELD_OFFSET (KTRAP_FRAME, Ebx), FIELD_OFFSET (CONTEXT, Ebx),
TRUE },
+ { 4, FIELD_OFFSET (KTRAP_FRAME, Esp), FIELD_OFFSET (CONTEXT, Esp),
TRUE },
+ { 4, FIELD_OFFSET (KTRAP_FRAME, DebugEbp), FIELD_OFFSET (CONTEXT,
Ebp), TRUE },
+ { 4, FIELD_OFFSET (KTRAP_FRAME, Esi), FIELD_OFFSET (CONTEXT, Esi),
TRUE },
+ { 4, FIELD_OFFSET (KTRAP_FRAME, Edi), FIELD_OFFSET (CONTEXT, Edi),
TRUE },
+ { 4, FIELD_OFFSET (KTRAP_FRAME, DebugEip), FIELD_OFFSET (CONTEXT,
Eip), TRUE },
+ { 4, FIELD_OFFSET (KTRAP_FRAME, Eflags), FIELD_OFFSET (CONTEXT,
EFlags), TRUE },
+ { 4, FIELD_OFFSET (KTRAP_FRAME, Cs), FIELD_OFFSET (CONTEXT, SegCs),
TRUE },
+ { 4, FIELD_OFFSET (KTRAP_FRAME, Ss), FIELD_OFFSET (CONTEXT, SegSs),
TRUE },
+ { 4, FIELD_OFFSET (KTRAP_FRAME, Ds), FIELD_OFFSET (CONTEXT, SegDs),
TRUE },
+ { 4, FIELD_OFFSET (KTRAP_FRAME, Es), FIELD_OFFSET (CONTEXT, SegEs),
TRUE },
+ { 4, FIELD_OFFSET (KTRAP_FRAME, Fs), FIELD_OFFSET (CONTEXT, SegFs),
TRUE },
+ { 4, FIELD_OFFSET (KTRAP_FRAME, Gs), FIELD_OFFSET (CONTEXT, SegGs),
TRUE }
};
static PCHAR GspThreadStates[DeferredReady+1] =
@@ -696,11 +694,9 @@
VOID
GspQuery(PCHAR Request)
{
- PCHAR Command;
ULONG Value;
- Command = strtok (Request, ",");
- if (strncmp (Command, "C", 1) == 0)
+ if (strncmp(Request, "C", 1) == 0)
{
PCHAR ptr = &GspOutBuffer[2];
@@ -717,7 +713,7 @@
}
GspLong2Hex (&ptr, Value);
}
- else if (strncmp (Command, "fThreadInfo", 11) == 0)
+ else if (strncmp (Request, "fThreadInfo", 11) == 0)
{
PEPROCESS Process;
PLIST_ENTRY AThread, AProcess;
@@ -751,7 +747,7 @@
/* GspOutBuffer[0] = 'l'; */
}
}
- else if (strncmp (Command, "sThreadInfo", 11) == 0)
+ else if (strncmp (Request, "sThreadInfo", 11) == 0)
{
PEPROCESS Process;
PLIST_ENTRY AThread, AProcess;
@@ -803,67 +799,34 @@
GspOutBuffer[0] = 'l';
}
}
- else if (strncmp (Command, "ThreadExtraInfo", 15) == 0)
+ else if (strncmp (Request, "ThreadExtraInfo", 15) == 0)
{
PETHREAD ThreadInfo;
- PCHAR ptr = &Command[15];
/* Get thread information */
- if (GspFindThread (ptr, &ThreadInfo))
- {
- PCHAR String = GspThreadStates[ThreadInfo->Tcb.State];
+ if (GspFindThread(Request + 16, &ThreadInfo))
+ {
+ char Buffer[64];
+ PEPROCESS Proc;
- ObDereferenceObject(ThreadInfo);
+ Proc = (PEPROCESS) ThreadInfo->Tcb.ApcState.Process;
- GspMem2Hex (String, &GspOutBuffer[0], strlen (String),
FALSE);
- }
- }
-#if 0
- else if (strncmp (Command, "L", 1) == 0)
- {
- PLIST_ENTRY CurrentEntry;
- PETHREAD Current;
- ULONG MaxThreads = 0;
- ULONG ThreadId = 0;
- ULONG ThreadCount = 0;
-
- /* List threads */
- GspHex2Mem (&Request[1], (PCHAR) &MaxThreads, 2, TRUE);
- GspHex2Mem (&Request[3], (PCHAR) &Value, 4, TRUE);
- GspHex2Mem (&Request[11], (PCHAR) &ThreadId, 4, TRUE);
-
- GspOutBuffer[0] = 'q';
- GspOutBuffer[1] = 'M';
- Value = 0;
- GspMem2Hex ((PCHAR) &Value, &GspOutBuffer[5], 4, TRUE);
- GspMem2Hex ((PCHAR) &ThreadId, &GspOutBuffer[13], 4, TRUE);
-
- CurrentEntry = PiThreadListHead.Flink;
- while ((CurrentEntry != &PiThreadListHead) && (ThreadCount <
MaxThreads))
+ Buffer[0] = '\0';
+ if (NULL != Proc )
{
- Current = CONTAINING_RECORD (CurrentEntry, ETHREAD,
Tcb.ThreadListEntry);
- Value = 0;
- GspMem2Hex ((PCHAR) &Value, &GspOutBuffer[21+ThreadCount*16],
4, TRUE);
- Value = (ULONG) Current->Cid.UniqueThread;
- GspMem2Hex ((PCHAR) &Value, &GspOutBuffer[21+ThreadCount*16+8],
4, TRUE);
- CurrentEntry = CurrentEntry->Flink;
- ThreadCount++;
+ sprintf(Buffer, "%s [%d:0x%x], ", Proc->ImageFileName,
+ (int) Proc->UniqueProcessId,
+ (int) ThreadInfo->Cid.UniqueThread);
}
+ strcpy(Buffer + strlen(Buffer),
GspThreadStates[ThreadInfo->Tcb.State]);
- if (CurrentEntry != &PiThreadListHead)
- {
- GspOutBuffer[4] = '0';
- }
- else
- {
- GspOutBuffer[4] = '1';
- }
+ ObDereferenceObject(ThreadInfo);
- GspMem2Hex ((PCHAR) &ThreadCount, &GspOutBuffer[2], 1, TRUE);
+ GspMem2Hex(Buffer, &GspOutBuffer[0], strlen(Buffer), FALSE);
+ }
}
-#endif
#if 0
- else if (strncmp (Command, "Offsets", 7) == 0)
+ else if (strncmp (Request, "Offsets", 7) == 0)
{
strcpy (GspOutBuffer, "Text=0;Data=0;Bss=0");
}