}\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
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
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
{\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
case DbgKdRestoreBreakPointApi:\r
\r
/* FIXME: TODO */\r
- Ke386SetCr2(DbgKdRestoreBreakPointApi);\r
- while (TRUE);\r
+ KdpRestoreBreakpoint(&ManipulateState, &Data, Context);\r
break;\r
\r
case DbgKdContinueApi:\r
\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
\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
{\r
/* Reinitialize the Debugger */\r
KdInitSystem(0, NULL) ;\r
- //KdpRestoreAllBreakpoints();\r
+ KdpRestoreAllBreakpoints();\r
}\r
}\r
\r