- Add kdbreak.c with the following APIs: KdpLowWriteContent, KdpLowRestoreBreakpoint...
[reactos.git] / reactos / ntoskrnl / kd64 / kdapi.c
index ea161ed..99546b8 100644 (file)
@@ -89,12 +89,199 @@ KdpSetContextState(IN PDBGKD_WAIT_STATE_CHANGE64 WaitStateChange,
     }\r
 }\r
 \r
-BOOLEAN\r
+VOID\r
+NTAPI\r
+KdpSysGetVersion(IN PDBGKD_GET_VERSION64 Version)\r
+{\r
+    /* Copy the version block */\r
+    RtlCopyMemory(Version, &KdVersionBlock, sizeof(DBGKD_GET_VERSION64));\r
+}\r
+\r
+VOID\r
+NTAPI\r
+KdpGetVersion(IN PDBGKD_MANIPULATE_STATE64 State)\r
+{\r
+    STRING Header;\r
+\r
+    /* Fill out the header */\r
+    Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);\r
+    Header.Buffer = (PCHAR)State;\r
+\r
+    /* Get the version block */\r
+    KdpSysGetVersion(&State->u.GetVersion64);\r
+\r
+    /* Fill out the state */\r
+    State->ApiNumber = DbgKdGetVersionApi;\r
+    State->ReturnStatus = STATUS_SUCCESS;\r
+\r
+    /* Send the packet */\r
+    KdSendPacket(PACKET_TYPE_KD_STATE_MANIPULATE,\r
+                 &Header,\r
+                 NULL,\r
+                 &KdpContext);\r
+}\r
+\r
+\r
+BOOLEAN VirtCalled = FALSE;\r
+\r
+VOID\r
+NTAPI\r
+KdpReadVirtualMemory(IN PDBGKD_MANIPULATE_STATE64 State,\r
+                     IN PSTRING Data,\r
+                     IN PCONTEXT Context)\r
+{\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
+    {\r
+        /* Overflow, set it to maximum possible */\r
+        Length = PACKET_MAX_SIZE - sizeof(DBGKD_MANIPULATE_STATE64);\r
+    }\r
+\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
+    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;\r
+    State->u.ReadMemory.ActualBytesRead = Length;\r
+\r
+    /* Send the packet */\r
+    KdSendPacket(PACKET_TYPE_KD_STATE_MANIPULATE,\r
+                 &Header,\r
+                 Data,\r
+                 &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
+VOID\r
+NTAPI\r
+KdpRestoreBreakpoint(IN PDBGKD_MANIPULATE_STATE64 State,\r
+                     IN PSTRING Data,\r
+                     IN PCONTEXT Context)\r
+{\r
+    PDBGKD_RESTORE_BREAKPOINT RestoreBp = &State->u.RestoreBreakPoint;\r
+    STRING Header;\r
+\r
+    /* Fill out the header */\r
+    Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);\r
+    Header.Buffer = (PCHAR)State;\r
+    ASSERT(Data->Length == 0);\r
+\r
+    /* Get the version block */\r
+    if (KdpDeleteBreakpoint(RestoreBp->BreakPointHandle))\r
+    {\r
+        /* We're all good */\r
+        State->ReturnStatus = STATUS_SUCCESS;\r
+    }\r
+    else\r
+    {\r
+        /* We failed */\r
+        State->ReturnStatus = STATUS_UNSUCCESSFUL;\r
+    }\r
+\r
+    /* Send the packet */\r
+    KdSendPacket(PACKET_TYPE_KD_STATE_MANIPULATE,\r
+                 &Header,\r
+                 NULL,\r
+                 &KdpContext);\r
+}\r
+\r
+KCONTINUE_STATUS\r
 NTAPI\r
 KdpSendWaitContinue(IN ULONG PacketType,\r
                     IN PSTRING SendHeader,\r
                     IN PSTRING SendData OPTIONAL,\r
-                    IN OUT PCONTEXT ContextRecord)\r
+                    IN OUT PCONTEXT Context)\r
 {\r
     STRING Data, Header;\r
     DBGKD_MANIPULATE_STATE64 ManipulateState;\r
@@ -113,7 +300,7 @@ SendPacket:
     KdSendPacket(PacketType, SendHeader, SendData, &KdpContext);\r
 \r
     /* If the debugger isn't present anymore, just return success */\r
-    if (KdDebuggerNotPresent) return TRUE;\r
+    if (KdDebuggerNotPresent) return ContinueSuccess;\r
 \r
     /* Main processing Loop */\r
     for (;;)\r
@@ -122,7 +309,6 @@ SendPacket:
         do\r
         {\r
             /* Wait to get a reply to our packet */\r
-            ManipulateState.ApiNumber = 0xFFFFFFFF;\r
             RecvCode = KdReceivePacket(PACKET_TYPE_KD_STATE_MANIPULATE,\r
                                        &Header,\r
                                        &Data,\r
@@ -138,9 +324,9 @@ SendPacket:
         {\r
             case DbgKdReadVirtualMemoryApi:\r
 \r
-                /* FIXME: TODO */\r
-                Ke386SetCr2(DbgKdReadVirtualMemoryApi);\r
-                while (TRUE);\r
+                /* Read virtual memory */\r
+                KdpReadVirtualMemory(&ManipulateState, &Data, Context);\r
+                VirtCalled = TRUE;\r
                 break;\r
 \r
             case DbgKdWriteVirtualMemoryApi:\r
@@ -174,8 +360,7 @@ SendPacket:
             case DbgKdRestoreBreakPointApi:\r
 \r
                 /* FIXME: TODO */\r
-                Ke386SetCr2(DbgKdRestoreBreakPointApi);\r
-                while (TRUE);\r
+                KdpRestoreBreakpoint(&ManipulateState, &Data, Context);\r
                 break;\r
 \r
             case DbgKdContinueApi:\r
@@ -187,9 +372,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
@@ -292,9 +476,8 @@ SendPacket:
 \r
             case DbgKdGetVersionApi:\r
 \r
-                /* FIXME: TODO */\r
-                Ke386SetCr2(DbgKdGetVersionApi);\r
-                while (TRUE);\r
+                /* Get version data */\r
+                KdpGetVersion(&ManipulateState);\r
                 break;\r
 \r
             case DbgKdWriteBreakPointExApi:\r
@@ -711,7 +894,7 @@ KdEnableDebuggerWithLock(BOOLEAN NeedLock)
         {\r
             /* Reinitialize the Debugger */\r
             KdInitSystem(0, NULL) ;\r
-            //KdpRestoreAllBreakpoints();\r
+            KdpRestoreAllBreakpoints();\r
         }\r
     }\r
 \r