[NTOS:KDBG] Use CONTEXT instead of KTRAP_FRAME
authorHervé Poussineau <hpoussin@reactos.org>
Thu, 23 May 2019 08:59:53 +0000 (10:59 +0200)
committerHervé Poussineau <hpoussin@reactos.org>
Thu, 23 May 2019 09:04:40 +0000 (11:04 +0200)
Change KdbpTrapFrameToKdbTrapFrame to prefer CONTEXT (if available) over
KTRAP_FRAME.

ntoskrnl/include/internal/kd.h
ntoskrnl/kdbg/kdb.c
ntoskrnl/kdbg/kdb.h
ntoskrnl/kdbg/kdb_cli.c
ntoskrnl/kdbg/kdb_expr.c
ntoskrnl/kdbg/kdb_symbols.c

index 162ece5..c336d3e 100644 (file)
@@ -59,7 +59,7 @@ KdbSymProcessSymbols(
 BOOLEAN
 KdbSymPrintAddress(
     IN PVOID Address,
 BOOLEAN
 KdbSymPrintAddress(
     IN PVOID Address,
-    IN PKTRAP_FRAME Context
+    IN PCONTEXT Context
 );
 
 NTSTATUS
 );
 
 NTSTATUS
index 6b9d469..5611de6 100644 (file)
@@ -134,40 +134,92 @@ KiEspToTrapFrame(
 
 static VOID
 KdbpTrapFrameToKdbTrapFrame(
 
 static VOID
 KdbpTrapFrameToKdbTrapFrame(
+    PCONTEXT Context,
     PKTRAP_FRAME TrapFrame,
     PKDB_KTRAP_FRAME KdbTrapFrame)
 {
     PKTRAP_FRAME TrapFrame,
     PKDB_KTRAP_FRAME KdbTrapFrame)
 {
-    /* Copy the TrapFrame only up to Eflags and zero the rest*/
-    RtlCopyMemory(&KdbTrapFrame->Tf, TrapFrame, FIELD_OFFSET(KTRAP_FRAME, HardwareEsp));
-    RtlZeroMemory((PVOID)((ULONG_PTR)&KdbTrapFrame->Tf + FIELD_OFFSET(KTRAP_FRAME, HardwareEsp)),
-                  sizeof(KTRAP_FRAME) - FIELD_OFFSET(KTRAP_FRAME, HardwareEsp));
-
-    KdbTrapFrame->Cr0 = __readcr0();
-    KdbTrapFrame->Cr2 = __readcr2();
-    KdbTrapFrame->Cr3 = __readcr3();
-    KdbTrapFrame->Cr4 = __readcr4();
-
-    KdbTrapFrame->Tf.HardwareEsp = KiEspFromTrapFrame(TrapFrame);
-    KdbTrapFrame->Tf.HardwareSegSs = (USHORT)(KiSsFromTrapFrame(TrapFrame) & 0xFFFF);
-
-
-    /* FIXME: copy v86 registers if TrapFrame is a V86 trapframe */
+    if (Context)
+    {
+        KdbTrapFrame->Tf = *Context;
+    }
+    else
+    {
+        ASSERT(TrapFrame);
+
+        RtlZeroMemory(KdbTrapFrame, sizeof(KDB_KTRAP_FRAME));
+        KdbTrapFrame->Tf.Dr0 = TrapFrame->Dr0;
+        KdbTrapFrame->Tf.Dr1 = TrapFrame->Dr1;
+        KdbTrapFrame->Tf.Dr2 = TrapFrame->Dr2;
+        KdbTrapFrame->Tf.Dr3 = TrapFrame->Dr3;
+        KdbTrapFrame->Tf.Dr6 = TrapFrame->Dr6;
+        KdbTrapFrame->Tf.Dr7 = TrapFrame->Dr7;
+        KdbTrapFrame->Tf.SegGs = TrapFrame->SegGs;
+        KdbTrapFrame->Tf.SegEs = TrapFrame->SegEs;
+        KdbTrapFrame->Tf.SegDs = TrapFrame->SegDs;
+        KdbTrapFrame->Tf.Edx = TrapFrame->Edx;
+        KdbTrapFrame->Tf.Ecx = TrapFrame->Ecx;
+        KdbTrapFrame->Tf.Eax = TrapFrame->Eax;
+        KdbTrapFrame->Tf.SegFs = TrapFrame->SegFs;
+        KdbTrapFrame->Tf.Edi = TrapFrame->Edi;
+        KdbTrapFrame->Tf.Esi = TrapFrame->Esi;
+        KdbTrapFrame->Tf.Ebx = TrapFrame->Ebx;
+        KdbTrapFrame->Tf.Ebp = TrapFrame->Ebp;
+        KdbTrapFrame->Tf.Eip = TrapFrame->Eip;
+        KdbTrapFrame->Tf.SegCs = TrapFrame->SegCs;
+        KdbTrapFrame->Tf.EFlags = TrapFrame->EFlags;
+        KdbTrapFrame->Tf.Esp = KiEspFromTrapFrame(TrapFrame);
+        KdbTrapFrame->Tf.SegSs = (USHORT)(KiSsFromTrapFrame(TrapFrame) & 0xFFFF);
+
+        KdbTrapFrame->Cr0 = __readcr0();
+        KdbTrapFrame->Cr2 = __readcr2();
+        KdbTrapFrame->Cr3 = __readcr3();
+        KdbTrapFrame->Cr4 = __readcr4();
+
+        /* FIXME: copy v86 registers if TrapFrame is a V86 trapframe */
+    }
 }
 
 static VOID
 KdbpKdbTrapFrameToTrapFrame(
     PKDB_KTRAP_FRAME KdbTrapFrame,
 }
 
 static VOID
 KdbpKdbTrapFrameToTrapFrame(
     PKDB_KTRAP_FRAME KdbTrapFrame,
+    PCONTEXT Context,
     PKTRAP_FRAME TrapFrame)
 {
     PKTRAP_FRAME TrapFrame)
 {
-    /* Copy the TrapFrame only up to Eflags and zero the rest*/
-    RtlCopyMemory(TrapFrame, &KdbTrapFrame->Tf, FIELD_OFFSET(KTRAP_FRAME, HardwareEsp));
-
-    /* FIXME: write cr0, cr2, cr3 and cr4 (not needed atm) */
-
-    KiSsToTrapFrame(TrapFrame, KdbTrapFrame->Tf.HardwareSegSs);
-    KiEspToTrapFrame(TrapFrame, KdbTrapFrame->Tf.HardwareEsp);
-
-    /* FIXME: copy v86 registers if TrapFrame is a V86 trapframe */
+    if (Context)
+    {
+        /* Update context */
+        *Context = KdbTrapFrame->Tf;
+    }
+
+    if (TrapFrame)
+    {
+        TrapFrame->Dr0 = KdbTrapFrame->Tf.Dr0;
+        TrapFrame->Dr1 = KdbTrapFrame->Tf.Dr1;
+        TrapFrame->Dr2 = KdbTrapFrame->Tf.Dr2;
+        TrapFrame->Dr3 = KdbTrapFrame->Tf.Dr3;
+        TrapFrame->Dr6 = KdbTrapFrame->Tf.Dr6;
+        TrapFrame->Dr7 = KdbTrapFrame->Tf.Dr7;
+        TrapFrame->SegGs = KdbTrapFrame->Tf.SegGs;
+        TrapFrame->SegEs = KdbTrapFrame->Tf.SegEs;
+        TrapFrame->SegDs = KdbTrapFrame->Tf.SegDs;
+        TrapFrame->Edx = KdbTrapFrame->Tf.Edx;
+        TrapFrame->Ecx = KdbTrapFrame->Tf.Ecx;
+        TrapFrame->Eax = KdbTrapFrame->Tf.Eax;
+        TrapFrame->SegFs = KdbTrapFrame->Tf.SegFs;
+        TrapFrame->Edi = KdbTrapFrame->Tf.Edi;
+        TrapFrame->Esi = KdbTrapFrame->Tf.Esi;
+        TrapFrame->Ebx = KdbTrapFrame->Tf.Ebx;
+        TrapFrame->Ebp = KdbTrapFrame->Tf.Ebp;
+        TrapFrame->Eip = KdbTrapFrame->Tf.Eip;
+        TrapFrame->SegCs = KdbTrapFrame->Tf.SegCs;
+        TrapFrame->EFlags = KdbTrapFrame->Tf.EFlags;
+        KiSsToTrapFrame(TrapFrame, KdbTrapFrame->Tf.SegSs);
+        KiEspToTrapFrame(TrapFrame, KdbTrapFrame->Tf.Esp);
+
+        /* FIXME: write cr0, cr2, cr3 and cr4 (not needed atm) */
+
+        /* FIXME: copy v86 registers if TrapFrame is a V86 trapframe */
+    }
 }
 
 static VOID
 }
 
 static VOID
@@ -185,8 +237,8 @@ KdbpKdbTrapFrameFromKernelStack(
     KdbTrapFrame->Tf.Esi = StackPtr[5];
     KdbTrapFrame->Tf.Ebx = StackPtr[6];
     KdbTrapFrame->Tf.Eip = StackPtr[7];
     KdbTrapFrame->Tf.Esi = StackPtr[5];
     KdbTrapFrame->Tf.Ebx = StackPtr[6];
     KdbTrapFrame->Tf.Eip = StackPtr[7];
-    KdbTrapFrame->Tf.HardwareEsp = (ULONG) (StackPtr + 8);
-    KdbTrapFrame->Tf.HardwareSegSs = KGDT_R0_DATA;
+    KdbTrapFrame->Tf.Esp = (ULONG) (StackPtr + 8);
+    KdbTrapFrame->Tf.SegSs = KGDT_R0_DATA;
     KdbTrapFrame->Tf.SegCs = KGDT_R0_CODE;
     KdbTrapFrame->Tf.SegDs = KGDT_R0_DATA;
     KdbTrapFrame->Tf.SegEs = KGDT_R0_DATA;
     KdbTrapFrame->Tf.SegCs = KGDT_R0_CODE;
     KdbTrapFrame->Tf.SegDs = KGDT_R0_DATA;
     KdbTrapFrame->Tf.SegEs = KGDT_R0_DATA;
@@ -1326,9 +1378,10 @@ KdbEnterDebuggerException(
     IN PEXCEPTION_RECORD ExceptionRecord  OPTIONAL,
     IN KPROCESSOR_MODE PreviousMode,
     IN PCONTEXT Context,
     IN PEXCEPTION_RECORD ExceptionRecord  OPTIONAL,
     IN KPROCESSOR_MODE PreviousMode,
     IN PCONTEXT Context,
-    IN OUT PKTRAP_FRAME TrapFrame,
+    IN OUT PKTRAP_FRAME InitialTrapFrame,
     IN BOOLEAN FirstChance)
 {
     IN BOOLEAN FirstChance)
 {
+    PKTRAP_FRAME TrapFrame = InitialTrapFrame;
     KDB_ENTER_CONDITION EnterCondition;
     KD_CONTINUE_TYPE ContinueType = kdHandleException;
     PKDB_BREAKPOINT BreakPoint;
     KDB_ENTER_CONDITION EnterCondition;
     KD_CONTINUE_TYPE ContinueType = kdHandleException;
     PKDB_BREAKPOINT BreakPoint;
@@ -1447,7 +1500,7 @@ KdbEnterDebuggerException(
         if (BreakPoint->Condition)
         {
             /* Setup the KDB trap frame */
         if (BreakPoint->Condition)
         {
             /* Setup the KDB trap frame */
-            KdbpTrapFrameToKdbTrapFrame(TrapFrame, &KdbTrapFrame);
+            KdbpTrapFrameToKdbTrapFrame(Context, InitialTrapFrame, &KdbTrapFrame);
 
             ull = 0;
             if (!KdbpRpnEvaluateParsedExpression(BreakPoint->Condition, &KdbTrapFrame, &ull, NULL, NULL))
 
             ull = 0;
             if (!KdbpRpnEvaluateParsedExpression(BreakPoint->Condition, &KdbTrapFrame, &ull, NULL, NULL))
@@ -1608,7 +1661,7 @@ KdbEnterDebuggerException(
     KdbCurrentTrapFrame = &KdbTrapFrame;
 
     /* Setup the KDB trap frame */
     KdbCurrentTrapFrame = &KdbTrapFrame;
 
     /* Setup the KDB trap frame */
-    KdbpTrapFrameToKdbTrapFrame(TrapFrame, &KdbTrapFrame);
+    KdbpTrapFrameToKdbTrapFrame(Context, InitialTrapFrame, &KdbTrapFrame);
 
     /* Enter critical section */
     OldEflags = __readeflags();
 
     /* Enter critical section */
     OldEflags = __readeflags();
@@ -1655,8 +1708,8 @@ KdbEnterDebuggerException(
         KeUnstackDetachProcess(&KdbApcState);
     }
 
         KeUnstackDetachProcess(&KdbApcState);
     }
 
-    /* Update the exception TrapFrame */
-    KdbpKdbTrapFrameToTrapFrame(&KdbTrapFrame, TrapFrame);
+    /* Update the exception Context/TrapFrame */
+    KdbpKdbTrapFrameToTrapFrame(&KdbTrapFrame, Context, InitialTrapFrame);
 
     /* Decrement the entry count */
     InterlockedDecrement(&KdbEntryCount);
 
     /* Decrement the entry count */
     InterlockedDecrement(&KdbEntryCount);
index b641907..f87381a 100644 (file)
 /* from kdb.c */
 typedef struct _KDB_KTRAP_FRAME
 {
 /* from kdb.c */
 typedef struct _KDB_KTRAP_FRAME
 {
-   KTRAP_FRAME  Tf;
-   ULONG        Cr0;
-   ULONG        Cr1; /* reserved/unused */
-   ULONG        Cr2;
-   ULONG        Cr3;
-   ULONG        Cr4;
+   CONTEXT Tf;
+   ULONG Cr0;
+   ULONG Cr2;
+   ULONG Cr3;
+   ULONG Cr4;
 } KDB_KTRAP_FRAME, *PKDB_KTRAP_FRAME;
 
 typedef enum _KDB_BREAKPOINT_TYPE
 } KDB_KTRAP_FRAME, *PKDB_KTRAP_FRAME;
 
 typedef enum _KDB_BREAKPOINT_TYPE
index 4009e0a..32d2fe5 100644 (file)
@@ -849,7 +849,7 @@ KdbpCmdRegs(
     ULONG Argc,
     PCHAR Argv[])
 {
     ULONG Argc,
     PCHAR Argv[])
 {
-    PKTRAP_FRAME Tf = &KdbCurrentTrapFrame->Tf;
+    PCONTEXT Tf = &KdbCurrentTrapFrame->Tf;
     INT i;
     static const PCHAR EflagsBits[32] = { " CF", NULL, " PF", " BIT3", " AF", " BIT5",
                                           " ZF", " SF", " TF", " IF", " DF", " OF",
     INT i;
     static const PCHAR EflagsBits[32] = { " CF", NULL, " PF", " BIT3", " AF", " BIT5",
                                           " ZF", " SF", " TF", " IF", " DF", " OF",
@@ -868,7 +868,7 @@ KdbpCmdRegs(
                   "   ESI  0x%08x   EDI  0x%08x\n"
                   "   EBP  0x%08x\n",
                   Tf->SegCs & 0xFFFF, Tf->Eip,
                   "   ESI  0x%08x   EDI  0x%08x\n"
                   "   EBP  0x%08x\n",
                   Tf->SegCs & 0xFFFF, Tf->Eip,
-                  Tf->HardwareSegSs, Tf->HardwareEsp,
+                  Tf->SegSs, Tf->Esp,
                   Tf->Eax, Tf->Ebx,
                   Tf->Ecx, Tf->Edx,
                   Tf->Esi, Tf->Edi,
                   Tf->Eax, Tf->Ebx,
                   Tf->Ecx, Tf->Edx,
                   Tf->Esi, Tf->Edi,
@@ -966,7 +966,7 @@ KdbpCmdRegs(
         KdbpPrint("GS  0x%04x  Index 0x%04x  %cDT RPL%d\n",
                   Tf->SegGs, Tf->SegGs >> 3, (Tf->SegGs & (1 << 2)) ? 'L' : 'G', Tf->SegGs & 3);
         KdbpPrint("SS  0x%04x  Index 0x%04x  %cDT RPL%d\n",
         KdbpPrint("GS  0x%04x  Index 0x%04x  %cDT RPL%d\n",
                   Tf->SegGs, Tf->SegGs >> 3, (Tf->SegGs & (1 << 2)) ? 'L' : 'G', Tf->SegGs & 3);
         KdbpPrint("SS  0x%04x  Index 0x%04x  %cDT RPL%d\n",
-                  Tf->HardwareSegSs, Tf->HardwareSegSs >> 3, (Tf->HardwareSegSs & (1 << 2)) ? 'L' : 'G', Tf->HardwareSegSs & 3);
+                  Tf->SegSs, Tf->SegSs >> 3, (Tf->SegSs & (1 << 2)) ? 'L' : 'G', Tf->SegSs & 3);
     }
     else /* dregs */
     {
     }
     else /* dregs */
     {
@@ -986,7 +986,7 @@ KdbpCmdRegs(
 
 static BOOLEAN
 KdbpTrapFrameFromPrevTss(
 
 static BOOLEAN
 KdbpTrapFrameFromPrevTss(
-    PKTRAP_FRAME TrapFrame)
+    PCONTEXT TrapFrame)
 {
     ULONG_PTR Eip, Ebp;
     KDESCRIPTOR Gdtr;
 {
     ULONG_PTR Eip, Ebp;
     KDESCRIPTOR Gdtr;
@@ -1075,7 +1075,7 @@ KdbpCmdBackTrace(
     ULONGLONG Result = 0;
     ULONG_PTR Frame = KdbCurrentTrapFrame->Tf.Ebp;
     ULONG_PTR Address;
     ULONGLONG Result = 0;
     ULONG_PTR Frame = KdbCurrentTrapFrame->Tf.Ebp;
     ULONG_PTR Address;
-    KTRAP_FRAME TrapFrame;
+    CONTEXT TrapFrame;
 
     if (Argc >= 2)
     {
 
     if (Argc >= 2)
     {
index de85653..9e3d15c 100644 (file)
@@ -106,7 +106,7 @@ RpnStack =
 static const struct
 {
     PCHAR Name;
 static const struct
 {
     PCHAR Name;
-    UCHAR Offset;
+    ULONG Offset;
     UCHAR Size;
 }
 RegisterToTrapFrame[] =
     UCHAR Size;
 }
 RegisterToTrapFrame[] =
@@ -119,14 +119,14 @@ RegisterToTrapFrame[] =
     {"edx",     FIELD_OFFSET(KDB_KTRAP_FRAME, Tf.Edx),     RTL_FIELD_SIZE(KDB_KTRAP_FRAME, Tf.Edx)},
     {"esi",     FIELD_OFFSET(KDB_KTRAP_FRAME, Tf.Esi),     RTL_FIELD_SIZE(KDB_KTRAP_FRAME, Tf.Esi)},
     {"edi",     FIELD_OFFSET(KDB_KTRAP_FRAME, Tf.Edi),     RTL_FIELD_SIZE(KDB_KTRAP_FRAME, Tf.Edi)},
     {"edx",     FIELD_OFFSET(KDB_KTRAP_FRAME, Tf.Edx),     RTL_FIELD_SIZE(KDB_KTRAP_FRAME, Tf.Edx)},
     {"esi",     FIELD_OFFSET(KDB_KTRAP_FRAME, Tf.Esi),     RTL_FIELD_SIZE(KDB_KTRAP_FRAME, Tf.Esi)},
     {"edi",     FIELD_OFFSET(KDB_KTRAP_FRAME, Tf.Edi),     RTL_FIELD_SIZE(KDB_KTRAP_FRAME, Tf.Edi)},
-    {"esp",     FIELD_OFFSET(KDB_KTRAP_FRAME, Tf.HardwareEsp),     RTL_FIELD_SIZE(KDB_KTRAP_FRAME, Tf.HardwareEsp)},
+    {"esp",     FIELD_OFFSET(KDB_KTRAP_FRAME, Tf.Esp),     RTL_FIELD_SIZE(KDB_KTRAP_FRAME, Tf.Esp)},
     {"ebp",     FIELD_OFFSET(KDB_KTRAP_FRAME, Tf.Ebp),     RTL_FIELD_SIZE(KDB_KTRAP_FRAME, Tf.Ebp)},
     {"cs",      FIELD_OFFSET(KDB_KTRAP_FRAME, Tf.SegCs),      2 }, /* Use only the lower 2 bytes */
     {"ds",      FIELD_OFFSET(KDB_KTRAP_FRAME, Tf.SegDs),      RTL_FIELD_SIZE(KDB_KTRAP_FRAME, Tf.SegDs)},
     {"es",      FIELD_OFFSET(KDB_KTRAP_FRAME, Tf.SegEs),      RTL_FIELD_SIZE(KDB_KTRAP_FRAME, Tf.SegEs)},
     {"fs",      FIELD_OFFSET(KDB_KTRAP_FRAME, Tf.SegFs),      RTL_FIELD_SIZE(KDB_KTRAP_FRAME, Tf.SegFs)},
     {"gs",      FIELD_OFFSET(KDB_KTRAP_FRAME, Tf.SegGs),      RTL_FIELD_SIZE(KDB_KTRAP_FRAME, Tf.SegGs)},
     {"ebp",     FIELD_OFFSET(KDB_KTRAP_FRAME, Tf.Ebp),     RTL_FIELD_SIZE(KDB_KTRAP_FRAME, Tf.Ebp)},
     {"cs",      FIELD_OFFSET(KDB_KTRAP_FRAME, Tf.SegCs),      2 }, /* Use only the lower 2 bytes */
     {"ds",      FIELD_OFFSET(KDB_KTRAP_FRAME, Tf.SegDs),      RTL_FIELD_SIZE(KDB_KTRAP_FRAME, Tf.SegDs)},
     {"es",      FIELD_OFFSET(KDB_KTRAP_FRAME, Tf.SegEs),      RTL_FIELD_SIZE(KDB_KTRAP_FRAME, Tf.SegEs)},
     {"fs",      FIELD_OFFSET(KDB_KTRAP_FRAME, Tf.SegFs),      RTL_FIELD_SIZE(KDB_KTRAP_FRAME, Tf.SegFs)},
     {"gs",      FIELD_OFFSET(KDB_KTRAP_FRAME, Tf.SegGs),      RTL_FIELD_SIZE(KDB_KTRAP_FRAME, Tf.SegGs)},
-    {"ss",      FIELD_OFFSET(KDB_KTRAP_FRAME, Tf.HardwareSegSs),      RTL_FIELD_SIZE(KDB_KTRAP_FRAME, Tf.HardwareSegSs)},
+    {"ss",      FIELD_OFFSET(KDB_KTRAP_FRAME, Tf.SegSs),      RTL_FIELD_SIZE(KDB_KTRAP_FRAME, Tf.SegSs)},
     {"dr0",     FIELD_OFFSET(KDB_KTRAP_FRAME, Tf.Dr0),     RTL_FIELD_SIZE(KDB_KTRAP_FRAME, Tf.Dr0)},
     {"dr1",     FIELD_OFFSET(KDB_KTRAP_FRAME, Tf.Dr1),     RTL_FIELD_SIZE(KDB_KTRAP_FRAME, Tf.Dr1)},
     {"dr2",     FIELD_OFFSET(KDB_KTRAP_FRAME, Tf.Dr2),     RTL_FIELD_SIZE(KDB_KTRAP_FRAME, Tf.Dr2)},
     {"dr0",     FIELD_OFFSET(KDB_KTRAP_FRAME, Tf.Dr0),     RTL_FIELD_SIZE(KDB_KTRAP_FRAME, Tf.Dr0)},
     {"dr1",     FIELD_OFFSET(KDB_KTRAP_FRAME, Tf.Dr1),     RTL_FIELD_SIZE(KDB_KTRAP_FRAME, Tf.Dr1)},
     {"dr2",     FIELD_OFFSET(KDB_KTRAP_FRAME, Tf.Dr2),     RTL_FIELD_SIZE(KDB_KTRAP_FRAME, Tf.Dr2)},
index 1b2d8f6..07f55eb 100644 (file)
@@ -147,7 +147,7 @@ KdbpSymUnicodeToAnsi(IN PUNICODE_STRING Unicode,
 BOOLEAN
 KdbSymPrintAddress(
     IN PVOID Address,
 BOOLEAN
 KdbSymPrintAddress(
     IN PVOID Address,
-    IN PKTRAP_FRAME Context)
+    IN PCONTEXT Context)
 {
     PLDR_DATA_TABLE_ENTRY LdrEntry;
     ULONG_PTR RelativeAddress;
 {
     PLDR_DATA_TABLE_ENTRY LdrEntry;
     ULONG_PTR RelativeAddress;