https://git.reactos.org/?p=reactos.git;a=commitdiff;h=baa47fa5e06948b7e76ba820f7a342547eaf0cde

commit baa47fa5e06948b7e76ba820f7a342547eaf0cde
Author:     Hervé Poussineau <hpous...@reactos.org>
AuthorDate: Wed Apr 8 23:08:57 2020 +0200
Commit:     Hervé Poussineau <hpous...@reactos.org>
CommitDate: Mon Nov 16 08:55:03 2020 +0100

    [NTOS:KD] Use a PCONTEXT instead of a PKTRAP_FRAME in KDBG
---
 ntoskrnl/kd/kdmain.c          |   8 +-
 ntoskrnl/kdbg/i386/kdb_help.S |   8 +-
 ntoskrnl/kdbg/kdb.c           | 225 +++++++++++++++++-------------------------
 ntoskrnl/kdbg/kdb.h           |  26 +++--
 ntoskrnl/kdbg/kdb_cli.c       | 137 ++++++++-----------------
 ntoskrnl/kdbg/kdb_expr.c      |  48 +++++----
 ntoskrnl/kdbg/kdb_symbols.c   |   2 +-
 7 files changed, 170 insertions(+), 284 deletions(-)

diff --git a/ntoskrnl/kd/kdmain.c b/ntoskrnl/kd/kdmain.c
index 9ae8552758c..dde2e1d67e7 100644
--- a/ntoskrnl/kd/kdmain.c
+++ b/ntoskrnl/kd/kdmain.c
@@ -29,12 +29,17 @@ KdpReportExceptionStateChange(IN PEXCEPTION_RECORD 
ExceptionRecord,
 {
     KD_CONTINUE_TYPE Return = kdHandleException;
 #ifdef KDBG
+    EXCEPTION_RECORD64 ExceptionRecord64;
+
     /* Check if this is an assertion failure */
     if (ExceptionRecord->ExceptionCode == STATUS_ASSERTION_FAILURE)
     {
         /* Bump EIP to the instruction following the int 2C */
         ContextRecord->Eip += 2;
     }
+
+    ExceptionRecord32To64((PEXCEPTION_RECORD32)ExceptionRecord,
+                          &ExceptionRecord64);
 #endif
 
     /* Get out of here if the Debugger isn't connected */
@@ -42,10 +47,9 @@ KdpReportExceptionStateChange(IN PEXCEPTION_RECORD 
ExceptionRecord,
 
 #ifdef KDBG
     /* Call KDBG if available */
-    Return = KdbEnterDebuggerException(ExceptionRecord,
+    Return = KdbEnterDebuggerException(&ExceptionRecord64,
                                        PreviousMode,
                                        ContextRecord,
-                                       TrapFrame,
                                        !SecondChanceException);
 #else /* not KDBG */
     /* We'll manually dump the stack for the user... */
diff --git a/ntoskrnl/kdbg/i386/kdb_help.S b/ntoskrnl/kdbg/i386/kdb_help.S
index 9884c66e1c5..47564a43b45 100644
--- a/ntoskrnl/kdbg/i386/kdb_help.S
+++ b/ntoskrnl/kdbg/i386/kdb_help.S
@@ -2,7 +2,7 @@
 #include <asm.inc>
 #include <ks386.inc>
 
-EXTERN _KdbEnterDebuggerException:PROC
+EXTERN _KdbEnterDebuggerFirstChanceException:PROC
 
 .code
 
@@ -61,12 +61,8 @@ _KdbEnter:
      * Call KDB
      */
     mov eax, esp
-    push 1                  /* FirstChance */
     push eax                /* Push a pointer to the trap frame */
-    push 0                  /* Context */
-    push 0                  /* PreviousMode (KernelMode) */
-    push 0                  /* ExceptionRecord */
-    call _KdbEnterDebuggerException
+    call _KdbEnterDebuggerFirstChanceException
 
     /*
      * Pop the arguments and unused portions of the trap frame:
diff --git a/ntoskrnl/kdbg/kdb.c b/ntoskrnl/kdbg/kdb.c
index 2698190ccce..f9a3b8792bb 100644
--- a/ntoskrnl/kdbg/kdb.c
+++ b/ntoskrnl/kdbg/kdb.c
@@ -49,8 +49,8 @@ PEPROCESS KdbOriginalProcess = NULL; /* The process in whichs 
context KDB was in
 PETHREAD KdbCurrentThread = NULL;  /* The current thread context in which KDB 
runs */
 PETHREAD KdbOriginalThread = NULL; /* The thread in whichs context KDB was 
entered */
 PKDB_KTRAP_FRAME KdbCurrentTrapFrame = NULL; /* Pointer to the current 
trapframe */
-static KDB_KTRAP_FRAME KdbTrapFrame = { { 0 } };  /* The trapframe which was 
passed to KdbEnterDebuggerException */
-static KDB_KTRAP_FRAME KdbThreadTrapFrame = { { 0 } }; /* The trapframe of the 
current thread (KdbCurrentThread) */
+static KDB_KTRAP_FRAME KdbTrapFrame = { 0 };  /* The trapframe which was 
passed to KdbEnterDebuggerException */
+static KDB_KTRAP_FRAME KdbThreadTrapFrame = { 0 }; /* The trapframe of the 
current thread (KdbCurrentThread) */
 static KAPC_STATE KdbApcState;
 extern BOOLEAN KdbpBugCheckRequested;
 
@@ -108,68 +108,8 @@ static const CHAR *ExceptionNrToString[] =
     "Assertion Failure"
 };
 
-ULONG
-NTAPI
-KiSsFromTrapFrame(
-    IN PKTRAP_FRAME TrapFrame);
-
-ULONG
-NTAPI
-KiEspFromTrapFrame(
-    IN PKTRAP_FRAME TrapFrame);
-
-VOID
-NTAPI
-KiSsToTrapFrame(
-    IN PKTRAP_FRAME TrapFrame,
-    IN ULONG Ss);
-
-VOID
-NTAPI
-KiEspToTrapFrame(
-    IN PKTRAP_FRAME TrapFrame,
-    IN ULONG Esp);
-
 /* FUNCTIONS *****************************************************************/
 
-static VOID
-KdbpTrapFrameToKdbTrapFrame(
-    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 */
-}
-
-static VOID
-KdbpKdbTrapFrameToTrapFrame(
-    PKDB_KTRAP_FRAME KdbTrapFrame,
-    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 */
-}
-
 static VOID
 KdbpKdbTrapFrameFromKernelStack(
     PVOID KernelStack,
@@ -180,17 +120,17 @@ KdbpKdbTrapFrameFromKernelStack(
     RtlZeroMemory(KdbTrapFrame, sizeof(KDB_KTRAP_FRAME));
     StackPtr = (ULONG_PTR *) KernelStack;
 #ifdef _M_IX86
-    KdbTrapFrame->Tf.Ebp = StackPtr[3];
-    KdbTrapFrame->Tf.Edi = StackPtr[4];
-    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.SegCs = KGDT_R0_CODE;
-    KdbTrapFrame->Tf.SegDs = KGDT_R0_DATA;
-    KdbTrapFrame->Tf.SegEs = KGDT_R0_DATA;
-    KdbTrapFrame->Tf.SegGs = KGDT_R0_DATA;
+    KdbTrapFrame->Ebp = StackPtr[3];
+    KdbTrapFrame->Edi = StackPtr[4];
+    KdbTrapFrame->Esi = StackPtr[5];
+    KdbTrapFrame->Ebx = StackPtr[6];
+    KdbTrapFrame->Eip = StackPtr[7];
+    KdbTrapFrame->Esp = (ULONG) (StackPtr + 8);
+    KdbTrapFrame->SegSs = KGDT_R0_DATA;
+    KdbTrapFrame->SegCs = KGDT_R0_CODE;
+    KdbTrapFrame->SegDs = KGDT_R0_DATA;
+    KdbTrapFrame->SegEs = KGDT_R0_DATA;
+    KdbTrapFrame->SegGs = KGDT_R0_DATA;
 #endif
 
     /* FIXME: what about the other registers??? */
@@ -374,7 +314,7 @@ KdbpStepIntoInstruction(
         IntVect = 3;
     else if (Mem[0] == 0xcd)
         IntVect = Mem[1];
-    else if (Mem[0] == 0xce && KdbCurrentTrapFrame->Tf.EFlags & (1<<11)) /* 1 
<< 11 is the overflow flag */
+    else if (Mem[0] == 0xce && KdbCurrentTrapFrame->EFlags & (1<<11)) /* 1 << 
11 is the overflow flag */
         IntVect = 4;
     else
         return FALSE;
@@ -703,14 +643,14 @@ KdbpDeleteBreakPoint(
 static LONG
 KdbpIsBreakPointOurs(
     IN NTSTATUS ExceptionCode,
-    IN PKTRAP_FRAME TrapFrame)
+    IN PCONTEXT Context)
 {
     ULONG i;
     ASSERT(ExceptionCode == STATUS_SINGLE_STEP || ExceptionCode == 
STATUS_BREAKPOINT);
 
     if (ExceptionCode == STATUS_BREAKPOINT) /* Software interrupt */
     {
-        ULONG_PTR BpEip = (ULONG_PTR)TrapFrame->Eip - 1; /* Get EIP of INT3 
instruction */
+        ULONG_PTR BpEip = (ULONG_PTR)Context->Eip - 1; /* Get EIP of INT3 
instruction */
         for (i = 0; i < KdbSwBreakPointCount; i++)
         {
             ASSERT((KdbSwBreakPoints[i]->Type == KdbBreakPointSoftware ||
@@ -733,7 +673,7 @@ KdbpIsBreakPointOurs(
                    KdbHwBreakPoints[i]->Enabled);
             DebugReg = KdbHwBreakPoints[i]->Data.Hw.DebugReg;
 
-            if ((TrapFrame->Dr6 & (1 << DebugReg)) != 0)
+            if ((Context->Dr6 & (1 << DebugReg)) != 0)
             {
                 return KdbHwBreakPoints[i] - KdbBreakPoints;
             }
@@ -832,7 +772,7 @@ KdbpEnableBreakPoint(
         ASSERT(KDB_MAXIMUM_HW_BREAKPOINT_COUNT == 4);
         for (i = 0; i < KDB_MAXIMUM_HW_BREAKPOINT_COUNT; i++)
         {
-            if ((KdbTrapFrame.Tf.Dr7 & (0x3 << (i * 2))) == 0)
+            if ((KdbTrapFrame.Dr7 & (0x3 << (i * 2))) == 0)
                 break;
         }
 
@@ -842,27 +782,27 @@ KdbpEnableBreakPoint(
         switch (i)
         {
             case 0:
-                KdbTrapFrame.Tf.Dr0 = BreakPoint->Address;
+                KdbTrapFrame.Dr0 = BreakPoint->Address;
                 break;
             case 1:
-                KdbTrapFrame.Tf.Dr1 = BreakPoint->Address;
+                KdbTrapFrame.Dr1 = BreakPoint->Address;
                 break;
             case 2:
-                KdbTrapFrame.Tf.Dr2 = BreakPoint->Address;
+                KdbTrapFrame.Dr2 = BreakPoint->Address;
                 break;
             case 3:
-                KdbTrapFrame.Tf.Dr3 = BreakPoint->Address;
+                KdbTrapFrame.Dr3 = BreakPoint->Address;
                 break;
         }
 
         /* Enable the global breakpoint */
-        KdbTrapFrame.Tf.Dr7 |= (0x2 << (i * 2));
+        KdbTrapFrame.Dr7 |= (0x2 << (i * 2));
 
         /* Enable the exact match bits. */
-        KdbTrapFrame.Tf.Dr7 |= 0x00000300;
+        KdbTrapFrame.Dr7 |= 0x00000300;
 
         /* Clear existing state. */
-        KdbTrapFrame.Tf.Dr7 &= ~(0xF << (16 + (i * 4)));
+        KdbTrapFrame.Dr7 &= ~(0xF << (16 + (i * 4)));
 
         /* Set the breakpoint type. */
         switch (BreakPoint->Data.Hw.AccessType)
@@ -883,20 +823,20 @@ KdbpEnableBreakPoint(
                 break;
         }
 
-        KdbTrapFrame.Tf.Dr7 |= (ul << (16 + (i * 4)));
+        KdbTrapFrame.Dr7 |= (ul << (16 + (i * 4)));
 
         /* Set the breakpoint length. */
-        KdbTrapFrame.Tf.Dr7 |= ((BreakPoint->Data.Hw.Size - 1) << (18 + (i * 
4)));
+        KdbTrapFrame.Dr7 |= ((BreakPoint->Data.Hw.Size - 1) << (18 + (i * 4)));
 
         /* Update KdbCurrentTrapFrame - values are taken from there by the CLI 
*/
         if (&KdbTrapFrame != KdbCurrentTrapFrame)
         {
-            KdbCurrentTrapFrame->Tf.Dr0 = KdbTrapFrame.Tf.Dr0;
-            KdbCurrentTrapFrame->Tf.Dr1 = KdbTrapFrame.Tf.Dr1;
-            KdbCurrentTrapFrame->Tf.Dr2 = KdbTrapFrame.Tf.Dr2;
-            KdbCurrentTrapFrame->Tf.Dr3 = KdbTrapFrame.Tf.Dr3;
-            KdbCurrentTrapFrame->Tf.Dr6 = KdbTrapFrame.Tf.Dr6;
-            KdbCurrentTrapFrame->Tf.Dr7 = KdbTrapFrame.Tf.Dr7;
+            KdbCurrentTrapFrame->Dr0 = KdbTrapFrame.Dr0;
+            KdbCurrentTrapFrame->Dr1 = KdbTrapFrame.Dr1;
+            KdbCurrentTrapFrame->Dr2 = KdbTrapFrame.Dr2;
+            KdbCurrentTrapFrame->Dr3 = KdbTrapFrame.Dr3;
+            KdbCurrentTrapFrame->Dr6 = KdbTrapFrame.Dr6;
+            KdbCurrentTrapFrame->Dr7 = KdbTrapFrame.Dr7;
         }
 
         BreakPoint->Data.Hw.DebugReg = i;
@@ -988,11 +928,11 @@ KdbpDisableBreakPoint(
         ASSERT(BreakPoint->Type == KdbBreakPointHardware);
 
         /* Clear the breakpoint. */
-        KdbTrapFrame.Tf.Dr7 &= ~(0x3 << (BreakPoint->Data.Hw.DebugReg * 2));
-        if ((KdbTrapFrame.Tf.Dr7 & 0xFF) == 0)
+        KdbTrapFrame.Dr7 &= ~(0x3 << (BreakPoint->Data.Hw.DebugReg * 2));
+        if ((KdbTrapFrame.Dr7 & 0xFF) == 0)
         {
             /* If no breakpoints are enabled then clear the exact match flags. 
*/
-            KdbTrapFrame.Tf.Dr7 &= 0xFFFFFCFF;
+            KdbTrapFrame.Dr7 &= 0xFFFFFCFF;
         }
 
         for (i = 0; i < KdbHwBreakPointCount; i++)
@@ -1316,10 +1256,9 @@ KdbpGetExceptionNumberFromStatus(
  */
 KD_CONTINUE_TYPE
 KdbEnterDebuggerException(
-    IN PEXCEPTION_RECORD ExceptionRecord  OPTIONAL,
+    IN PEXCEPTION_RECORD64 ExceptionRecord,
     IN KPROCESSOR_MODE PreviousMode,
     IN PCONTEXT Context,
-    IN OUT PKTRAP_FRAME TrapFrame,
     IN BOOLEAN FirstChance)
 {
     KDB_ENTER_CONDITION EnterCondition;
@@ -1361,7 +1300,7 @@ KdbEnterDebuggerException(
     KdbEnteredOnSingleStep = FALSE;
 
     if (FirstChance && (ExceptionCode == STATUS_SINGLE_STEP || ExceptionCode 
== STATUS_BREAKPOINT) &&
-        (KdbLastBreakPointNr = KdbpIsBreakPointOurs(ExceptionCode, TrapFrame)) 
>= 0)
+        (KdbLastBreakPointNr = KdbpIsBreakPointOurs(ExceptionCode, Context)) 
>= 0)
     {
         BreakPoint = KdbBreakPoints + KdbLastBreakPointNr;
 
@@ -1382,7 +1321,7 @@ KdbEnterDebuggerException(
                KiDispatchException accounts for that. Whatever we do here with
                the TrapFrame does not matter anyway, since KiDispatchException
                will overwrite it with the values from the Context! */
-            TrapFrame->Eip--;
+            Context->Eip--;
         }
 
         if ((BreakPoint->Type == KdbBreakPointHardware) &&
@@ -1399,15 +1338,15 @@ KdbEnterDebuggerException(
         else if (BreakPoint->Type == KdbBreakPointTemporary &&
                  BreakPoint->Process == KdbCurrentProcess)
         {
-            ASSERT((TrapFrame->EFlags & EFLAGS_TF) == 0);
+            ASSERT((Context->EFlags & EFLAGS_TF) == 0);
 
             /* Delete the temporary breakpoint which was used to step over or 
into the instruction */
             KdbpDeleteBreakPoint(-1, BreakPoint);
 
             if (--KdbNumSingleSteps > 0)
             {
-                if ((KdbSingleStepOver && 
!KdbpStepOverInstruction(TrapFrame->Eip)) ||
-                    (!KdbSingleStepOver && 
!KdbpStepIntoInstruction(TrapFrame->Eip)))
+                if ((KdbSingleStepOver && 
!KdbpStepOverInstruction(Context->Eip)) ||
+                    (!KdbSingleStepOver && 
!KdbpStepIntoInstruction(Context->Eip)))
                 {
                     Context->EFlags |= EFLAGS_TF;
                 }
@@ -1440,7 +1379,7 @@ KdbEnterDebuggerException(
         if (BreakPoint->Condition)
         {
             /* Setup the KDB trap frame */
-            KdbpTrapFrameToKdbTrapFrame(TrapFrame, &KdbTrapFrame);
+            KdbTrapFrame = *Context;
 
             ull = 0;
             if (!KdbpRpnEvaluateParsedExpression(BreakPoint->Condition, 
&KdbTrapFrame, &ull, NULL, NULL))
@@ -1456,7 +1395,7 @@ KdbEnterDebuggerException(
         if (BreakPoint->Type == KdbBreakPointSoftware)
         {
             KdbpPrint("\nEntered debugger on breakpoint #%d: EXEC 
0x%04x:0x%08x\n",
-                      KdbLastBreakPointNr, TrapFrame->SegCs & 0xffff, 
TrapFrame->Eip);
+                      KdbLastBreakPointNr, Context->SegCs & 0xffff, 
Context->Eip);
         }
         else if (BreakPoint->Type == KdbBreakPointHardware)
         {
@@ -1471,7 +1410,7 @@ KdbEnterDebuggerException(
     else if (ExceptionCode == STATUS_SINGLE_STEP)
     {
         /* Silently ignore a debugger initiated single step. */
-        if ((TrapFrame->Dr6 & 0xf) == 0 && KdbBreakPointToReenable)
+        if ((Context->Dr6 & 0xf) == 0 && KdbBreakPointToReenable)
         {
             /* FIXME: Make sure that the breakpoint was really hit (check 
bp->Address vs. tf->Eip) */
             BreakPoint = KdbBreakPointToReenable;
@@ -1504,13 +1443,13 @@ KdbEnterDebuggerException(
         KdbpEvenThoughWeHaveABreakPointToReenableWeAlsoHaveARealSingleStep = 
FALSE;
 
         /* Check if we expect a single step */
-        if ((TrapFrame->Dr6 & 0xf) == 0 && KdbNumSingleSteps > 0)
+        if ((Context->Dr6 & 0xf) == 0 && KdbNumSingleSteps > 0)
         {
             /*ASSERT((Context->Eflags & EFLAGS_TF) != 0);*/
             if (--KdbNumSingleSteps > 0)
             {
-                if ((KdbSingleStepOver && 
KdbpStepOverInstruction(TrapFrame->Eip)) ||
-                    (!KdbSingleStepOver && 
KdbpStepIntoInstruction(TrapFrame->Eip)))
+                if ((KdbSingleStepOver && 
KdbpStepOverInstruction(Context->Eip)) ||
+                    (!KdbSingleStepOver && 
KdbpStepIntoInstruction(Context->Eip)))
                 {
                     Context->EFlags &= ~EFLAGS_TF;
                 }
@@ -1550,7 +1489,7 @@ KdbEnterDebuggerException(
         }
 
         KdbpPrint("\nEntered debugger on embedded INT3 at 0x%04x:0x%08x.\n",
-                  TrapFrame->SegCs & 0xffff, TrapFrame->Eip - 1);
+                  Context->SegCs & 0xffff, Context->Eip - 1);
     }
     else
     {
@@ -1569,26 +1508,11 @@ KdbEnterDebuggerException(
         if (ExceptionCode == STATUS_ACCESS_VIOLATION &&
             ExceptionRecord && ExceptionRecord->NumberParameters != 0)
         {
-            /* FIXME: Add noexec memory stuff */
             ULONG_PTR TrapCr2;
-            ULONG Err;
 
             TrapCr2 = __readcr2();
 
-            Err = TrapFrame->ErrCode;
-            KdbpPrint("Memory at 0x%p could not be %s: ", TrapCr2, (Err & (1 
<< 1)) ? "written" : "read");
-
-            if ((Err & (1 << 0)) == 0)
-            {
-                KdbpPrint("Page not present.\n");
-            }
-            else
-            {
-                if ((Err & (1 << 3)) != 0)
-                    KdbpPrint("Reserved bits in page directory set.\n");
-                else
-                    KdbpPrint("Page protection violation.\n");
-            }
+            KdbpPrint("Memory at 0x%p could not be accessed\n", TrapCr2);
         }
     }
 
@@ -1601,7 +1525,7 @@ KdbEnterDebuggerException(
     KdbCurrentTrapFrame = &KdbTrapFrame;
 
     /* Setup the KDB trap frame */
-    KdbpTrapFrameToKdbTrapFrame(TrapFrame, &KdbTrapFrame);
+    KdbTrapFrame = *Context;
 
     /* Enter critical section */
     OldEflags = __readeflags();
@@ -1628,15 +1552,15 @@ KdbEnterDebuggerException(
         /* Variable explains itself! */
         KdbpEvenThoughWeHaveABreakPointToReenableWeAlsoHaveARealSingleStep = 
TRUE;
 
-        if ((KdbSingleStepOver && 
KdbpStepOverInstruction(KdbCurrentTrapFrame->Tf.Eip)) ||
-            (!KdbSingleStepOver && 
KdbpStepIntoInstruction(KdbCurrentTrapFrame->Tf.Eip)))
+        if ((KdbSingleStepOver && 
KdbpStepOverInstruction(KdbCurrentTrapFrame->Eip)) ||
+            (!KdbSingleStepOver && 
KdbpStepIntoInstruction(KdbCurrentTrapFrame->Eip)))
         {
-            ASSERT((KdbCurrentTrapFrame->Tf.EFlags & EFLAGS_TF) == 0);
-            /*KdbCurrentTrapFrame->Tf.EFlags &= ~EFLAGS_TF;*/
+            ASSERT((KdbCurrentTrapFrame->EFlags & EFLAGS_TF) == 0);
+            /*KdbCurrentTrapFrame->EFlags &= ~EFLAGS_TF;*/
         }
         else
         {
-            Context->EFlags |= EFLAGS_TF;
+            KdbTrapFrame.EFlags |= EFLAGS_TF;
         }
     }
 
@@ -1648,8 +1572,8 @@ KdbEnterDebuggerException(
         KeUnstackDetachProcess(&KdbApcState);
     }
 
-    /* Update the exception TrapFrame */
-    KdbpKdbTrapFrameToTrapFrame(&KdbTrapFrame, TrapFrame);
+    /* Update the exception Context */
+    *Context = KdbTrapFrame;
 
     /* Decrement the entry count */
     InterlockedDecrement(&KdbEntryCount);
@@ -1675,11 +1599,11 @@ continue_execution:
         /* Set the RF flag so we don't trigger the same breakpoint again. */
         if (Resume)
         {
-            TrapFrame->EFlags |= EFLAGS_RF;
+            Context->EFlags |= EFLAGS_RF;
         }
 
         /* Clear dr6 status flags. */
-        TrapFrame->Dr6 &= ~0x0000e00f;
+        Context->Dr6 &= ~0x0000e00f;
 
         if (!(KdbEnteredOnSingleStep && KdbSingleStepOver))
         {
@@ -1691,6 +1615,35 @@ continue_execution:
     return ContinueType;
 }
 
+KD_CONTINUE_TYPE
+KdbEnterDebuggerFirstChanceException(
+    IN OUT PKTRAP_FRAME TrapFrame)
+{
+    EXCEPTION_RECORD64 ExceptionRecord;
+    KD_CONTINUE_TYPE Return;
+    CONTEXT Context;
+
+    /* Copy TrapFrame to Context */
+    RtlZeroMemory(&Context, sizeof(CONTEXT));
+    Context.ContextFlags = CONTEXT_CONTROL | CONTEXT_INTEGER | 
CONTEXT_SEGMENTS | CONTEXT_EXTENDED_REGISTERS | CONTEXT_FLOATING_POINT | 
CONTEXT_DEBUG_REGISTERS;
+    KeTrapFrameToContext(TrapFrame, NULL, &Context);
+
+    /* Create ExceptionRecord (assume breakpoint) */
+    RtlZeroMemory(&ExceptionRecord, sizeof(EXCEPTION_RECORD64));
+    ExceptionRecord.ExceptionCode = STATUS_BREAKPOINT;
+
+    /* Call real function */
+    Return = KdbEnterDebuggerException(&ExceptionRecord,
+                                       KernelMode,
+                                       &Context,
+                                       TRUE);
+
+    /* Copy back Context to TrapFrame */
+    KeContextToTrapFrame(&Context, NULL, TrapFrame, Context.ContextFlags, 
KernelMode);
+
+    return Return;
+}
+
 VOID
 NTAPI
 KdbpGetCommandLineSettings(
diff --git a/ntoskrnl/kdbg/kdb.h b/ntoskrnl/kdbg/kdb.h
index 85c980b8250..a496cc4a7b5 100644
--- a/ntoskrnl/kdbg/kdb.h
+++ b/ntoskrnl/kdbg/kdb.h
@@ -10,15 +10,7 @@
 /* TYPES *********************************************************************/
 
 /* from kdb.c */
-typedef struct _KDB_KTRAP_FRAME
-{
-   KTRAP_FRAME  Tf;
-   ULONG        Cr0;
-   ULONG        Cr1; /* reserved/unused */
-   ULONG        Cr2;
-   ULONG        Cr3;
-   ULONG        Cr4;
-} KDB_KTRAP_FRAME, *PKDB_KTRAP_FRAME;
+typedef CONTEXT KDB_KTRAP_FRAME, *PKDB_KTRAP_FRAME;
 
 typedef enum _KDB_BREAKPOINT_TYPE
 {
@@ -163,7 +155,7 @@ KdbpSymFindModule(
 BOOLEAN
 KdbSymPrintAddress(
     IN PVOID Address,
-    IN PKTRAP_FRAME Context
+    IN PCONTEXT Context
 );
 
 VOID
@@ -247,11 +239,15 @@ NTAPI
 KdbpGetCommandLineSettings(PCHAR p1);
 
 KD_CONTINUE_TYPE
-KdbEnterDebuggerException(PEXCEPTION_RECORD ExceptionRecord,
-                           KPROCESSOR_MODE PreviousMode,
-                           PCONTEXT Context,
-                           PKTRAP_FRAME TrapFrame,
-                           BOOLEAN FirstChance);
+KdbEnterDebuggerException(IN PEXCEPTION_RECORD64 ExceptionRecord,
+                          IN KPROCESSOR_MODE PreviousMode,
+                          IN OUT PCONTEXT Context,
+                          IN BOOLEAN FirstChance);
+
+KD_CONTINUE_TYPE
+KdbEnterDebuggerFirstChanceException(
+    IN OUT PKTRAP_FRAME TrapFrame);
+
 /* other functions */
 
 NTSTATUS
diff --git a/ntoskrnl/kdbg/kdb_cli.c b/ntoskrnl/kdbg/kdb_cli.c
index bcb30f84e7e..50805fe9f66 100644
--- a/ntoskrnl/kdbg/kdb_cli.c
+++ b/ntoskrnl/kdbg/kdb_cli.c
@@ -345,7 +345,6 @@ static const struct
     { "disasm", "disasm [address] [L count]", "Disassemble count instructions 
at address.", KdbpCmdDisassembleX },
     { "x", "x [address] [L count]", "Display count dwords, starting at 
address.", KdbpCmdDisassembleX },
     { "regs", "regs", "Display general purpose registers.", KdbpCmdRegs },
-    { "cregs", "cregs", "Display control, descriptor table and task segment 
registers.", KdbpCmdRegs },
     { "sregs", "sregs", "Display status registers.", KdbpCmdRegs },
     { "dregs", "dregs", "Display debug registers.", KdbpCmdRegs },
     { "bt", "bt [*frameaddr|thread id]", "Prints current backtrace or from 
given frame address.", KdbpCmdBackTrace },
@@ -794,7 +793,7 @@ KdbpCmdDisassembleX(
     ULONG ul;
     INT i;
     ULONGLONG Result = 0;
-    ULONG_PTR Address = KdbCurrentTrapFrame->Tf.Eip;
+    ULONG_PTR Address = KdbCurrentTrapFrame->Eip;
     LONG InstLen;
 
     if (Argv[0][0] == 'x') /* display memory */
@@ -911,7 +910,7 @@ KdbpCmdRegs(
     ULONG Argc,
     PCHAR Argv[])
 {
-    PKTRAP_FRAME Tf = &KdbCurrentTrapFrame->Tf;
+    PCONTEXT Context = KdbCurrentTrapFrame;
     INT i;
     static const PCHAR EflagsBits[32] = { " CF", NULL, " PF", " BIT3", " AF", 
" BIT5",
                                           " ZF", " SF", " TF", " IF", " DF", " 
OF",
@@ -929,109 +928,51 @@ KdbpCmdRegs(
                   "   ECX  0x%08x   EDX  0x%08x\n"
                   "   ESI  0x%08x   EDI  0x%08x\n"
                   "   EBP  0x%08x\n",
-                  Tf->SegCs & 0xFFFF, Tf->Eip,
-                  Tf->HardwareSegSs, Tf->HardwareEsp,
-                  Tf->Eax, Tf->Ebx,
-                  Tf->Ecx, Tf->Edx,
-                  Tf->Esi, Tf->Edi,
-                  Tf->Ebp);
+                  Context->SegCs & 0xFFFF, Context->Eip,
+                  Context->SegSs, Context->Esp,
+                  Context->Eax, Context->Ebx,
+                  Context->Ecx, Context->Edx,
+                  Context->Esi, Context->Edi,
+                  Context->Ebp);
 
         /* Display the EFlags */
-        KdbpPrint("EFLAGS  0x%08x ", Tf->EFlags);
+        KdbpPrint("EFLAGS  0x%08x ", Context->EFlags);
         for (i = 0; i < 32; i++)
         {
             if (i == 1)
             {
-                if ((Tf->EFlags & (1 << 1)) == 0)
+                if ((Context->EFlags & (1 << 1)) == 0)
                     KdbpPrint(" !BIT1");
             }
             else if (i == 12)
             {
-                KdbpPrint(" IOPL%d", (Tf->EFlags >> 12) & 3);
+                KdbpPrint(" IOPL%d", (Context->EFlags >> 12) & 3);
             }
             else if (i == 13)
             {
             }
-            else if ((Tf->EFlags & (1 << i)) != 0)
+            else if ((Context->EFlags & (1 << i)) != 0)
             {
                 KdbpPrint(EflagsBits[i]);
             }
         }
         KdbpPrint("\n");
     }
-    else if (Argv[0][0] == 'c') /* cregs */
-    {
-        ULONG Cr0, Cr2, Cr3, Cr4;
-        KDESCRIPTOR Gdtr = {0, 0, 0}, Idtr = {0, 0, 0};
-        USHORT Ldtr, Tr;
-        static const PCHAR Cr0Bits[32] = { " PE", " MP", " EM", " TS", " ET", 
" NE", NULL, NULL,
-                                           NULL, NULL, NULL, NULL, NULL, NULL, 
NULL, NULL,
-                                           " WP", NULL, " AM", NULL, NULL, 
NULL, NULL, NULL,
-                                           NULL, NULL, NULL, NULL, NULL, " 
NW", " CD", " PG" };
-        static const PCHAR Cr4Bits[32] = { " VME", " PVI", " TSD", " DE", " 
PSE", " PAE", " MCE", " PGE",
-                                           " PCE", " OSFXSR", " OSXMMEXCPT", 
NULL, NULL, NULL, NULL, NULL,
-                                           NULL, NULL, NULL, NULL, NULL, NULL, 
NULL, NULL,
-                                           NULL, NULL, NULL, NULL, NULL, NULL, 
NULL, NULL };
-
-        /* Retrieve the control registers */
-        Cr0 = KdbCurrentTrapFrame->Cr0;
-        Cr2 = KdbCurrentTrapFrame->Cr2;
-        Cr3 = KdbCurrentTrapFrame->Cr3;
-        Cr4 = KdbCurrentTrapFrame->Cr4;
-
-        /* Retrieve the descriptor table and task segment registers */
-        Ke386GetGlobalDescriptorTable(&Gdtr.Limit);
-        Ldtr = Ke386GetLocalDescriptorTable();
-        __sidt(&Idtr.Limit);
-        Tr = Ke386GetTr();
-
-        /* Display the control registers */
-        KdbpPrint("CR0  0x%08x ", Cr0);
-        for (i = 0; i < 32; i++)
-        {
-            if (!Cr0Bits[i])
-                continue;
-
-            if ((Cr0 & (1 << i)) != 0)
-                KdbpPrint(Cr0Bits[i]);
-        }
-        KdbpPrint("\n");
-
-        KdbpPrint("CR2  0x%08x\n", Cr2);
-        KdbpPrint("CR3  0x%08x  Pagedir-Base 0x%08x %s%s\n", Cr3, (Cr3 & 
0xfffff000),
-                  (Cr3 & (1 << 3)) ? " PWT" : "", (Cr3 & (1 << 4)) ? " PCD" : 
"" );
-        KdbpPrint("CR4  0x%08x ", Cr4);
-        for (i = 0; i < 32; i++)
-        {
-            if (!Cr4Bits[i])
-                continue;
-
-            if ((Cr4 & (1 << i)) != 0)
-                KdbpPrint(Cr4Bits[i]);
-        }
-        KdbpPrint("\n");
-
-        /* Display the descriptor table and task segment registers */
-        KdbpPrint("GDTR Base 0x%08x  Size 0x%04x\n", Gdtr.Base, Gdtr.Limit);
-        KdbpPrint("LDTR 0x%04x\n", Ldtr);
-        KdbpPrint("IDTR Base 0x%08x  Size 0x%04x\n", Idtr.Base, Idtr.Limit);
-        KdbpPrint("TR   0x%04x\n", Tr);
-    }
     else if (Argv[0][0] == 's') /* sregs */
     {
         KdbpPrint("CS  0x%04x  Index 0x%04x  %cDT RPL%d\n",
-                  Tf->SegCs & 0xffff, (Tf->SegCs & 0xffff) >> 3,
-                  (Tf->SegCs & (1 << 2)) ? 'L' : 'G', Tf->SegCs & 3);
+                  Context->SegCs & 0xffff, (Context->SegCs & 0xffff) >> 3,
+                  (Context->SegCs & (1 << 2)) ? 'L' : 'G', Context->SegCs & 3);
         KdbpPrint("DS  0x%04x  Index 0x%04x  %cDT RPL%d\n",
-                  Tf->SegDs, Tf->SegDs >> 3, (Tf->SegDs & (1 << 2)) ? 'L' : 
'G', Tf->SegDs & 3);
+                  Context->SegDs, Context->SegDs >> 3, (Context->SegDs & (1 << 
2)) ? 'L' : 'G', Context->SegDs & 3);
         KdbpPrint("ES  0x%04x  Index 0x%04x  %cDT RPL%d\n",
-                  Tf->SegEs, Tf->SegEs >> 3, (Tf->SegEs & (1 << 2)) ? 'L' : 
'G', Tf->SegEs & 3);
+                  Context->SegEs, Context->SegEs >> 3, (Context->SegEs & (1 << 
2)) ? 'L' : 'G', Context->SegEs & 3);
         KdbpPrint("FS  0x%04x  Index 0x%04x  %cDT RPL%d\n",
-                  Tf->SegFs, Tf->SegFs >> 3, (Tf->SegFs & (1 << 2)) ? 'L' : 
'G', Tf->SegFs & 3);
+                  Context->SegFs, Context->SegFs >> 3, (Context->SegFs & (1 << 
2)) ? 'L' : 'G', Context->SegFs & 3);
         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);
+                  Context->SegGs, Context->SegGs >> 3, (Context->SegGs & (1 << 
2)) ? 'L' : 'G', Context->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);
+                  Context->SegSs, Context->SegSs >> 3, (Context->SegSs & (1 << 
2)) ? 'L' : 'G', Context->SegSs & 3);
     }
     else /* dregs */
     {
@@ -1042,8 +983,8 @@ KdbpCmdRegs(
                   "DR3  0x%08x\n"
                   "DR6  0x%08x\n"
                   "DR7  0x%08x\n",
-                  Tf->Dr0, Tf->Dr1, Tf->Dr2, Tf->Dr3,
-                  Tf->Dr6, Tf->Dr7);
+                  Context->Dr0, Context->Dr1, Context->Dr2, Context->Dr3,
+                  Context->Dr6, Context->Dr7);
     }
 
     return TRUE;
@@ -1117,8 +1058,8 @@ KdbpIsNestedTss(
 }
 
 static BOOLEAN
-KdbpTrapFrameFromPrevTss(
-    IN OUT PKTRAP_FRAME TrapFrame,
+KdbpContextFromPrevTss(
+    IN OUT PCONTEXT Context,
     OUT PUSHORT TssSelector,
     IN OUT PKTSS* pTss,
     IN PKDESCRIPTOR pGdtr)
@@ -1157,8 +1098,8 @@ KdbpTrapFrameFromPrevTss(
     /* Return the parent TSS and its trap frame */
     *TssSelector = Backlink;
     *pTss = Tss;
-    TrapFrame->Eip = Eip;
-    TrapFrame->Ebp = Ebp;
+    Context->Eip = Eip;
+    Context->Ebp = Ebp;
     return TRUE;
 }
 
@@ -1171,8 +1112,8 @@ KdbpCmdBackTrace(
 {
     ULONG ul;
     ULONGLONG Result = 0;
-    KTRAP_FRAME TrapFrame = KdbCurrentTrapFrame->Tf;
-    ULONG_PTR Frame = TrapFrame.Ebp;
+    CONTEXT Context = *KdbCurrentTrapFrame;
+    ULONG_PTR Frame = Context.Ebp;
     ULONG_PTR Address;
     KDESCRIPTOR Gdtr;
     USHORT TssSelector;
@@ -1247,8 +1188,8 @@ KdbpCmdBackTrace(
     if (Argc <= 1)
     {
         KdbpPrint("Eip:\n");
-        if (!KdbSymPrintAddress((PVOID)TrapFrame.Eip, &TrapFrame))
-            KdbpPrint("<%08x>\n", TrapFrame.Eip);
+        if (!KdbSymPrintAddress((PVOID)Context.Eip, &Context))
+            KdbpPrint("<%08x>\n", Context.Eip);
         else
             KdbpPrint("\n");
     }
@@ -1274,12 +1215,12 @@ KdbpCmdBackTrace(
 
         GotNextFrame = NT_SUCCESS(KdbpSafeReadMemory(&Frame, (PVOID)Frame, 
sizeof(ULONG_PTR)));
         if (GotNextFrame)
-            TrapFrame.Ebp = Frame;
+            Context.Ebp = Frame;
         // else
             // Frame = 0;
 
         /* Print the location of the call instruction (assumed 5 bytes length) 
*/
-        if (!KdbSymPrintAddress((PVOID)(Address - 5), &TrapFrame))
+        if (!KdbSymPrintAddress((PVOID)(Address - 5), &Context))
             KdbpPrint("<%08x>\n", Address);
         else
             KdbpPrint("\n");
@@ -1304,18 +1245,18 @@ CheckForParentTSS:
         if (!KdbpIsNestedTss(TssSelector, Tss))
             break; // The TSS is not nested, we stop there.
 
-        GotNextFrame = KdbpTrapFrameFromPrevTss(&TrapFrame, &TssSelector, 
&Tss, &Gdtr);
+        GotNextFrame = KdbpContextFromPrevTss(&Context, &TssSelector, &Tss, 
&Gdtr);
         if (!GotNextFrame)
         {
             KdbpPrint("Couldn't access parent TSS 0x%04x\n", Tss->Backlink);
             break; // Cannot retrieve the parent TSS, we stop there.
         }
-        Address = TrapFrame.Eip;
-        Frame = TrapFrame.Ebp;
+        Address = Context.Eip;
+        Frame = Context.Ebp;
 
         KdbpPrint("[Parent TSS 0x%04x @ 0x%p]\n", TssSelector, Tss);
 
-        if (!KdbSymPrintAddress((PVOID)Address, &TrapFrame))
+        if (!KdbSymPrintAddress((PVOID)Address, &Context))
             KdbpPrint("<%08x>\n", Address);
         else
             KdbpPrint("\n");
@@ -3672,13 +3613,13 @@ KdbpCliMainLoop(
 
     if (EnteredOnSingleStep)
     {
-        if (!KdbSymPrintAddress((PVOID)KdbCurrentTrapFrame->Tf.Eip, 
&KdbCurrentTrapFrame->Tf))
+        if (!KdbSymPrintAddress((PVOID)KdbCurrentTrapFrame->Eip, 
KdbCurrentTrapFrame))
         {
-            KdbpPrint("<%08x>", KdbCurrentTrapFrame->Tf.Eip);
+            KdbpPrint("<%08x>", KdbCurrentTrapFrame->Eip);
         }
 
         KdbpPrint(": ");
-        if (KdbpDisassemble(KdbCurrentTrapFrame->Tf.Eip, KdbUseIntelSyntax) < 
0)
+        if (KdbpDisassemble(KdbCurrentTrapFrame->Eip, KdbUseIntelSyntax) < 0)
         {
             KdbpPrint("<INVALID>");
         }
@@ -3862,7 +3803,7 @@ KdbpCliInit(VOID)
 
     /* Interpret the init file... */
     KdbInitFileBuffer = FileBuffer;
-    KdbEnter();
+    //KdbEnter(); // FIXME
     KdbInitFileBuffer = NULL;
 
     /* Leave critical section */
diff --git a/ntoskrnl/kdbg/kdb_expr.c b/ntoskrnl/kdbg/kdb_expr.c
index de856536e08..9a1924852b6 100644
--- a/ntoskrnl/kdbg/kdb_expr.c
+++ b/ntoskrnl/kdbg/kdb_expr.c
@@ -111,32 +111,28 @@ static const struct
 }
 RegisterToTrapFrame[] =
 {
-    {"eip",     FIELD_OFFSET(KDB_KTRAP_FRAME, Tf.Eip),     
RTL_FIELD_SIZE(KDB_KTRAP_FRAME, Tf.Eip)},
-    {"eflags",  FIELD_OFFSET(KDB_KTRAP_FRAME, Tf.EFlags),  
RTL_FIELD_SIZE(KDB_KTRAP_FRAME, Tf.EFlags)},
-    {"eax",     FIELD_OFFSET(KDB_KTRAP_FRAME, Tf.Eax),     
RTL_FIELD_SIZE(KDB_KTRAP_FRAME, Tf.Eax)},
-    {"ebx",     FIELD_OFFSET(KDB_KTRAP_FRAME, Tf.Ebx),     
RTL_FIELD_SIZE(KDB_KTRAP_FRAME, Tf.Ebx)},
-    {"ecx",     FIELD_OFFSET(KDB_KTRAP_FRAME, Tf.Ecx),     
RTL_FIELD_SIZE(KDB_KTRAP_FRAME, Tf.Ecx)},
-    {"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)},
-    {"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)},
-    {"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)},
-    {"dr3",     FIELD_OFFSET(KDB_KTRAP_FRAME, Tf.Dr3),     
RTL_FIELD_SIZE(KDB_KTRAP_FRAME, Tf.Dr3)},
-    {"dr6",     FIELD_OFFSET(KDB_KTRAP_FRAME, Tf.Dr6),     
RTL_FIELD_SIZE(KDB_KTRAP_FRAME, Tf.Dr6)},
-    {"dr7",     FIELD_OFFSET(KDB_KTRAP_FRAME, Tf.Dr7),     
RTL_FIELD_SIZE(KDB_KTRAP_FRAME, Tf.Dr7)},
-    {"cr0",     FIELD_OFFSET(KDB_KTRAP_FRAME, Cr0),        
RTL_FIELD_SIZE(KDB_KTRAP_FRAME, Cr0)},
-    {"cr2",     FIELD_OFFSET(KDB_KTRAP_FRAME, Cr2),        
RTL_FIELD_SIZE(KDB_KTRAP_FRAME, Cr2)},
-    {"cr3",     FIELD_OFFSET(KDB_KTRAP_FRAME, Cr3),        
RTL_FIELD_SIZE(KDB_KTRAP_FRAME, Cr3)},
-    {"cr4",     FIELD_OFFSET(KDB_KTRAP_FRAME, Cr4),        
RTL_FIELD_SIZE(KDB_KTRAP_FRAME, Cr4)}
+    {"eip",     FIELD_OFFSET(KDB_KTRAP_FRAME, Eip),     
RTL_FIELD_SIZE(KDB_KTRAP_FRAME, Eip)},
+    {"eflags",  FIELD_OFFSET(KDB_KTRAP_FRAME, EFlags),  
RTL_FIELD_SIZE(KDB_KTRAP_FRAME, EFlags)},
+    {"eax",     FIELD_OFFSET(KDB_KTRAP_FRAME, Eax),     
RTL_FIELD_SIZE(KDB_KTRAP_FRAME, Eax)},
+    {"ebx",     FIELD_OFFSET(KDB_KTRAP_FRAME, Ebx),     
RTL_FIELD_SIZE(KDB_KTRAP_FRAME, Ebx)},
+    {"ecx",     FIELD_OFFSET(KDB_KTRAP_FRAME, Ecx),     
RTL_FIELD_SIZE(KDB_KTRAP_FRAME, Ecx)},
+    {"edx",     FIELD_OFFSET(KDB_KTRAP_FRAME, Edx),     
RTL_FIELD_SIZE(KDB_KTRAP_FRAME, Edx)},
+    {"esi",     FIELD_OFFSET(KDB_KTRAP_FRAME, Esi),     
RTL_FIELD_SIZE(KDB_KTRAP_FRAME, Esi)},
+    {"edi",     FIELD_OFFSET(KDB_KTRAP_FRAME, Edi),     
RTL_FIELD_SIZE(KDB_KTRAP_FRAME, Edi)},
+    {"esp",     FIELD_OFFSET(KDB_KTRAP_FRAME, Esp),     
RTL_FIELD_SIZE(KDB_KTRAP_FRAME, Esp)},
+    {"ebp",     FIELD_OFFSET(KDB_KTRAP_FRAME, Ebp),     
RTL_FIELD_SIZE(KDB_KTRAP_FRAME, Ebp)},
+    {"cs",      FIELD_OFFSET(KDB_KTRAP_FRAME, SegCs),      2 }, /* Use only 
the lower 2 bytes */
+    {"ds",      FIELD_OFFSET(KDB_KTRAP_FRAME, SegDs),      
RTL_FIELD_SIZE(KDB_KTRAP_FRAME, SegDs)},
+    {"es",      FIELD_OFFSET(KDB_KTRAP_FRAME, SegEs),      
RTL_FIELD_SIZE(KDB_KTRAP_FRAME, SegEs)},
+    {"fs",      FIELD_OFFSET(KDB_KTRAP_FRAME, SegFs),      
RTL_FIELD_SIZE(KDB_KTRAP_FRAME, SegFs)},
+    {"gs",      FIELD_OFFSET(KDB_KTRAP_FRAME, SegGs),      
RTL_FIELD_SIZE(KDB_KTRAP_FRAME, SegGs)},
+    {"ss",      FIELD_OFFSET(KDB_KTRAP_FRAME, SegSs),      
RTL_FIELD_SIZE(KDB_KTRAP_FRAME, SegSs)},
+    {"dr0",     FIELD_OFFSET(KDB_KTRAP_FRAME, Dr0),     
RTL_FIELD_SIZE(KDB_KTRAP_FRAME, Dr0)},
+    {"dr1",     FIELD_OFFSET(KDB_KTRAP_FRAME, Dr1),     
RTL_FIELD_SIZE(KDB_KTRAP_FRAME, Dr1)},
+    {"dr2",     FIELD_OFFSET(KDB_KTRAP_FRAME, Dr2),     
RTL_FIELD_SIZE(KDB_KTRAP_FRAME, Dr2)},
+    {"dr3",     FIELD_OFFSET(KDB_KTRAP_FRAME, Dr3),     
RTL_FIELD_SIZE(KDB_KTRAP_FRAME, Dr3)},
+    {"dr6",     FIELD_OFFSET(KDB_KTRAP_FRAME, Dr6),     
RTL_FIELD_SIZE(KDB_KTRAP_FRAME, Dr6)},
+    {"dr7",     FIELD_OFFSET(KDB_KTRAP_FRAME, Dr7),     
RTL_FIELD_SIZE(KDB_KTRAP_FRAME, Dr7)}
 };
 static const INT RegisterToTrapFrameCount = sizeof (RegisterToTrapFrame) / 
sizeof (RegisterToTrapFrame[0]);
 
diff --git a/ntoskrnl/kdbg/kdb_symbols.c b/ntoskrnl/kdbg/kdb_symbols.c
index 7dae01e780f..ea2afc00c16 100644
--- a/ntoskrnl/kdbg/kdb_symbols.c
+++ b/ntoskrnl/kdbg/kdb_symbols.c
@@ -155,7 +155,7 @@ KdbpSymUnicodeToAnsi(IN PUNICODE_STRING Unicode,
 BOOLEAN
 KdbSymPrintAddress(
     IN PVOID Address,
-    IN PKTRAP_FRAME Context)
+    IN PCONTEXT Context)
 {
     PLDR_DATA_TABLE_ENTRY LdrEntry;
     ULONG_PTR RelativeAddress;

Reply via email to