- Add a bunch of hacks to KdpReadVirtualMemory to make it work for now.
authorAlex Ionescu <aionescu@gmail.com>
Tue, 20 Feb 2007 01:13:22 +0000 (01:13 +0000)
committerAlex Ionescu <aionescu@gmail.com>
Tue, 20 Feb 2007 01:13:22 +0000 (01:13 +0000)
- Fix bugs in KdpGetVersion, KdpReadVirtualMemory.
- Implement KdpReadControlSpace.
- Fix setting kernel range address instead of kernel image load address.
- WinDBG is slowly trying to talk with us. Now it wants to restore breakpoints since it thinks this is the same machine I was debugging last night.

svn path=/branches/alex-kd-branch/; revision=25849

reactos/include/psdk/wdbgexts.h
reactos/ntoskrnl/kd64/kdapi.c
reactos/ntoskrnl/kd64/kddata.c
reactos/ntoskrnl/kd64/kdinit.c

index 0f474ef..e1948c4 100644 (file)
@@ -20,7 +20,7 @@ enum
 #define DBGKD_VERS_FLAG_HSS                             0x0010\r
 #define DBGKD_VERS_FLAG_PARTITIONS                      0x0020\r
 \r
-#define KDBG_TAG                                        TAG('G', 'B', 'D', 'K')\r
+#define KDBG_TAG                                        TAG('K', 'D', 'B', 'G')\r
 \r
 typedef struct _DBGKD_GET_VERSION64\r
 {\r
index 515f5ce..92a943c 100644 (file)
@@ -104,7 +104,7 @@ KdpGetVersion(IN PDBGKD_MANIPULATE_STATE64 State)
     STRING Header;\r
 \r
     /* Fill out the header */\r
-    Header.Length = sizeof(DBGKD_GET_VERSION64);\r
+    Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);\r
     Header.Buffer = (PCHAR)State;\r
 \r
     /* Get the version block */\r
@@ -121,6 +121,9 @@ KdpGetVersion(IN PDBGKD_MANIPULATE_STATE64 State)
                  &KdpContext);\r
 }\r
 \r
+\r
+BOOLEAN VirtCalled = FALSE;\r
+\r
 VOID\r
 NTAPI\r
 KdpReadVirtualMemory(IN PDBGKD_MANIPULATE_STATE64 State,\r
@@ -129,6 +132,7 @@ KdpReadVirtualMemory(IN PDBGKD_MANIPULATE_STATE64 State,
 {\r
     STRING Header;\r
     ULONG Length = State->u.ReadMemory.TransferCount;\r
+    NTSTATUS Status = STATUS_SUCCESS;\r
 \r
     /* Validate length */\r
     if (Length > (PACKET_MAX_SIZE - sizeof(DBGKD_MANIPULATE_STATE64)))\r
@@ -137,18 +141,38 @@ KdpReadVirtualMemory(IN PDBGKD_MANIPULATE_STATE64 State,
         Length = PACKET_MAX_SIZE - sizeof(DBGKD_MANIPULATE_STATE64);\r
     }\r
 \r
-    /* Copy data */\r
-    RtlCopyMemory(Data->Buffer,\r
-                  (PVOID)(ULONG_PTR)State->u.ReadMemory.TargetBaseAddress,\r
-                  Length);\r
-    Data->Length = Length;\r
+#if 0\r
+    if (!MmIsAddressValid((PVOID)(ULONG_PTR)State->u.ReadMemory.TargetBaseAddress))\r
+    {\r
+        Ke386SetCr2(State->u.ReadMemory.TargetBaseAddress);\r
+        while (TRUE);\r
+    }\r
+#endif\r
+\r
+    if ((ULONG_PTR)State->u.ReadMemory.TargetBaseAddress < KSEG0_BASE)\r
+    {\r
+        Length = 0;\r
+        Status = STATUS_UNSUCCESSFUL;\r
+    }\r
+    else if ((ULONG_PTR)State->u.ReadMemory.TargetBaseAddress >= (ULONG_PTR)SharedUserData)\r
+    {\r
+        Length = 0;\r
+        Status = STATUS_UNSUCCESSFUL;\r
+    }\r
+    else\r
+    {\r
+        RtlCopyMemory(Data->Buffer,\r
+                      (PVOID)(ULONG_PTR)State->u.ReadMemory.TargetBaseAddress,\r
+                      Length);\r
+    }\r
 \r
     /* Fill out the header */\r
-    Header.Length = sizeof(DBGKD_GET_VERSION64);\r
+    Data->Length = Length;\r
+    Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);\r
     Header.Buffer = (PCHAR)State;\r
 \r
     /* Fill out the state */\r
-    State->ReturnStatus = STATUS_SUCCESS;\r
+    State->ReturnStatus = Status;\r
     State->u.ReadMemory.ActualBytesRead = Length;\r
 \r
     /* Send the packet */\r
@@ -158,6 +182,66 @@ KdpReadVirtualMemory(IN PDBGKD_MANIPULATE_STATE64 State,
                  &KdpContext);\r
 }\r
 \r
+VOID\r
+NTAPI\r
+KdpReadControlSpace(IN PDBGKD_MANIPULATE_STATE64 State,\r
+                    IN PSTRING Data,\r
+                    IN PCONTEXT Context)\r
+{\r
+    PDBGKD_READ_MEMORY64 ReadMemory = &State->u.ReadMemory;\r
+    STRING Header;\r
+    ULONG Length, RealLength;\r
+    PVOID ControlStart;\r
+\r
+    /* Setup the header */\r
+    Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);\r
+    Header.Buffer = (PCHAR)State;\r
+    ASSERT(Data->Length == 0);\r
+\r
+    /* Check the length requested */\r
+    Length = ReadMemory->TransferCount;\r
+    if (Length > (PACKET_MAX_SIZE - sizeof(DBGKD_MANIPULATE_STATE64)))\r
+    {\r
+        /* Use maximum allowed */\r
+        Length = PACKET_MAX_SIZE - sizeof(DBGKD_MANIPULATE_STATE64);\r
+    }\r
+\r
+    /* Make sure that this is a valid request */\r
+    if (((ULONG)ReadMemory->TargetBaseAddress < sizeof(KPROCESSOR_STATE)) &&\r
+        (State->Processor < KeNumberProcessors))\r
+    {\r
+        /* Get the actual length */\r
+        RealLength = sizeof(KPROCESSOR_STATE) -\r
+                     (ULONG_PTR)ReadMemory->TargetBaseAddress;\r
+        if (RealLength < Length) Length = RealLength;\r
+\r
+        /* Set the proper address */\r
+        ControlStart = (PVOID)((ULONG_PTR)ReadMemory->TargetBaseAddress +\r
+                               (ULONG_PTR)&KiProcessorBlock[State->Processor]->\r
+                                           ProcessorState);\r
+\r
+        /* Copy the memory */\r
+        RtlCopyMemory(Data->Buffer, ControlStart, Length);\r
+        Data->Length = Length;\r
+\r
+        /* Finish up */\r
+        State->ReturnStatus = STATUS_SUCCESS;\r
+        ReadMemory->ActualBytesRead = Data->Length;\r
+    }\r
+    else\r
+    {\r
+        /* Invalid request */\r
+        Data->Length = 0;\r
+        State->ReturnStatus = STATUS_UNSUCCESSFUL;\r
+        ReadMemory->ActualBytesRead = 0;\r
+    }\r
+\r
+    /* Send the reply */\r
+    KdSendPacket(PACKET_TYPE_KD_STATE_MANIPULATE,\r
+                 &Header,\r
+                 Data,\r
+                 &KdpContext);\r
+}\r
 \r
 KCONTINUE_STATUS\r
 NTAPI\r
@@ -209,6 +293,7 @@ SendPacket:
 \r
                 /* Read virtual memory */\r
                 KdpReadVirtualMemory(&ManipulateState, &Data, Context);\r
+                VirtCalled = TRUE;\r
                 break;\r
 \r
             case DbgKdWriteVirtualMemoryApi:\r
@@ -255,9 +340,8 @@ SendPacket:
 \r
             case DbgKdReadControlSpaceApi:\r
 \r
-                /* FIXME: TODO */\r
-                Ke386SetCr2(DbgKdReadControlSpaceApi);\r
-                while (TRUE);\r
+                /* Read control space */\r
+                KdpReadControlSpace(&ManipulateState, &Data, Context);\r
                 break;\r
 \r
             case DbgKdWriteControlSpaceApi:\r
index a7ca02a..1cdaf12 100644 (file)
@@ -16,27 +16,6 @@ VOID NTAPI RtlpBreakWithStatusInstruction(VOID);
 \r
 /* GLOBALS *******************************************************************/\r
 \r
-//\r
-// Debugger Version Block\r
-//\r
-DBGKD_GET_VERSION64 KdVersionBlock =\r
-{\r
-    0,\r
-    0,\r
-    DBGKD_64BIT_PROTOCOL_VERSION2,\r
-    KD_SECONDARY_VERSION_DEFAULT,\r
-    DBGKD_VERS_FLAG_DATA,\r
-    IMAGE_FILE_MACHINE_I386,\r
-    PACKET_TYPE_MAX,\r
-    0,\r
-    0,\r
-    DBGKD_SIMULATION_NONE,\r
-    {0},\r
-    0,\r
-    0,\r
-    0\r
-};\r
-\r
 //\r
 // Debugger State\r
 //\r
@@ -320,6 +299,27 @@ ULONG KdComponentTableSize = sizeof(KdComponentTable);
 //\r
 LIST_ENTRY KdpDebuggerDataListHead;\r
 KSPIN_LOCK KdpDataSpinLock;\r
+\r
+//\r
+// Debugger Version and Data Block\r
+//\r
+DBGKD_GET_VERSION64 KdVersionBlock =\r
+{\r
+    0,\r
+    0,\r
+    DBGKD_64BIT_PROTOCOL_VERSION2,\r
+    KD_SECONDARY_VERSION_DEFAULT,\r
+    DBGKD_VERS_FLAG_DATA,\r
+    IMAGE_FILE_MACHINE_I386,\r
+    PACKET_TYPE_MAX,\r
+    0,\r
+    0,\r
+    DBGKD_SIMULATION_NONE,\r
+    {0},\r
+    0,\r
+    0,\r
+    0\r
+};\r
 KDDEBUGGER_DATA64 KdDebuggerDataBlock =\r
 {\r
     {{0}},\r
index 7733baf..a672d29 100644 (file)
@@ -132,7 +132,8 @@ KdInitSystem(IN ULONG BootPhase,
                                      InLoadOrderLinks);\r
 \r
         /* Save the Kernel Base */\r
-        KdVersionBlock.KernBase =(ULONGLONG)(LONG_PTR)LdrEntry->DllBase;\r
+        LdrEntry->DllBase = (PVOID)PsNtosImageBase;\r
+        KdVersionBlock.KernBase = (ULONGLONG)(LONG_PTR)LdrEntry->DllBase;\r
 \r
         /* Check if we have a command line */\r
         CommandLine = LoaderBlock->LoadOptions;\r
@@ -179,7 +180,7 @@ KdInitSystem(IN ULONG BootPhase,
     }\r
 \r
     /* Set the Kernel Base in the Data Block */\r
-    KdDebuggerDataBlock.KernBase = (ULONG_PTR)PsNtosImageBase;\r
+    KdDebuggerDataBlock.KernBase = (ULONGLONG)(LONG_PTR)KdVersionBlock.KernBase;\r
 \r
     /* Initialize the debugger if requested */\r
     if ((EnableKd) && (NT_SUCCESS(KdDebuggerInitialize0(LoaderBlock))))\r