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");
   }