&KdpContext);\r
}\r
\r
+VOID\r
+NTAPI\r
+KdpWriteControlSpace(IN PDBGKD_MANIPULATE_STATE64 State,\r
+ IN PSTRING Data,\r
+ IN PCONTEXT Context)\r
+{\r
+ PDBGKD_WRITE_MEMORY64 WriteMemory = &State->u.WriteMemory;\r
+ STRING Header;\r
+ ULONG Length;\r
+ PVOID ControlStart;\r
+\r
+ /* Setup the header */\r
+ Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);\r
+ Header.Buffer = (PCHAR)State;\r
+\r
+ /* Make sure that this is a valid request */\r
+ Length = WriteMemory->TransferCount;\r
+ if ((((ULONG)WriteMemory->TargetBaseAddress + Length) <=\r
+ sizeof(KPROCESSOR_STATE)) &&\r
+ (State->Processor < KeNumberProcessors))\r
+ {\r
+ /* Set the proper address */\r
+ ControlStart = (PVOID)((ULONG_PTR)WriteMemory->TargetBaseAddress +\r
+ (ULONG_PTR)&KiProcessorBlock[State->Processor]->\r
+ ProcessorState);\r
+\r
+ /* Copy the memory */\r
+ RtlCopyMemory(ControlStart, Data->Buffer, Data->Length);\r
+ Length = Data->Length;\r
+\r
+ /* Finish up */\r
+ State->ReturnStatus = STATUS_SUCCESS;\r
+ WriteMemory->ActualBytesWritten = Length;\r
+ }\r
+ else\r
+ {\r
+ /* Invalid request */\r
+ Data->Length = 0;\r
+ State->ReturnStatus = STATUS_UNSUCCESSFUL;\r
+ WriteMemory->ActualBytesWritten = 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
/* Setup the header */\r
Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);\r
Header.Buffer = (PCHAR)State;\r
- ASSERT(Data->Length == 0);\r
+ ASSERT(Data->Length == sizeof(CONTEXT));\r
\r
/* Make sure that this is a valid request */\r
if (State->Processor < KeNumberProcessors)\r
case DbgKdWriteControlSpaceApi:\r
\r
/* FIXME: TODO */\r
- Ke386SetCr2(DbgKdWriteControlSpaceApi);\r
- while (TRUE);\r
+ KdpWriteControlSpace(&ManipulateState, &Data, Context);\r
break;\r
\r
case DbgKdReadIoSpaceApi:\r
ULONG DebugMask = KeGetCurrentThread()->DispatcherHeader.DebugActive;
/* Check if debugging is enabled */
- if (DebugMask & DR_ACTIVE_MASK)
+ if (DebugMask & DR_MASK(DR7_OVERRIDE_V))
{
/* Sanity checks */
ASSERT((DebugMask & DR_REG_MASK) != 0);
Result = FALSE;
/* Check the DR mask */
- NewMask &= 0x7F;
+ NewMask &= ~(DR_MASK(7));
if (NewMask & DR_REG_MASK)
{
/* Set the active mask */
- NewMask |= DR_ACTIVE_MASK;
+ NewMask |= DR_MASK(DR7_OVERRIDE_V);
/* Set DR7 override */
*DrMask = DR7_OVERRIDE_MASK;
Result = NewMask ? TRUE: FALSE;
/* Update the mask to disable debugging */
- NewMask &= ~DR_ACTIVE_MASK;
- NewMask |= 0x80;
+ NewMask &= ~(DR_MASK(DR7_OVERRIDE_V));
+ NewMask |= DR_MASK(7);
}
/* Check if caller wants the new mask */