#ifndef _WINDBGKD_\r
#define _WINDBGKG_\r
\r
+//\r
+// Dependencies\r
+//\r
+#include "wdbgexts.h"\r
+\r
//\r
// Packet Size and Control Stream Size\r
//\r
BOOLEAN KdpControlCPending;\r
} KD_CONTEXT, *PKD_CONTEXT;\r
\r
+//\r
+// Control Sets for Supported Architectures\r
+//\r
+#include <pshpack4.h>\r
+typedef struct _X86_DBGKD_CONTROL_SET\r
+{\r
+ ULONG TraceFlag;\r
+ ULONG Dr7;\r
+ ULONG CurrentSymbolStart;\r
+ ULONG CurrentSymbolEnd;\r
+} X86_DBGKD_CONTROL_SET, *PX86_DBGKD_CONTROL_SET;\r
+\r
+typedef struct _IA64_DBGKD_CONTROL_SET\r
+{\r
+ ULONG Continue;\r
+ ULONG64 CurrentSymbolStart;\r
+ ULONG64 CurrentSymbolEnd;\r
+} IA64_DBGKD_CONTROL_SET, *PIA64_DBGKD_CONTROL_SET;\r
+\r
+typedef struct _AMD64_DBGKD_CONTROL_SET\r
+{\r
+ ULONG TraceFlag;\r
+ ULONG64 Dr7;\r
+ ULONG64 CurrentSymbolStart;\r
+ ULONG64 CurrentSymbolEnd;\r
+} AMD64_DBGKD_CONTROL_SET, *PAMD64_DBGKD_CONTROL_SET;\r
+\r
+typedef struct _DBGKD_ANY_CONTROL_SET\r
+{\r
+ union\r
+ {\r
+ X86_DBGKD_CONTROL_SET X86ControlSet;\r
+ IA64_DBGKD_CONTROL_SET IA64ControlSet;\r
+ AMD64_DBGKD_CONTROL_SET Amd64ControlSet;\r
+ };\r
+} DBGKD_ANY_CONTROL_SET, *PDBGKD_ANY_CONTROL_SET;\r
+#include <poppack.h>\r
+\r
+typedef X86_DBGKD_CONTROL_SET DBGKD_CONTROL_SET;\r
+\r
//\r
// DBGKM Structure for Exceptions\r
//\r
CONTEXT Context;\r
} DBGKD_WAIT_STATE_CHANGE64, *PDBGKD_WAIT_STATE_CHANGE64;\r
\r
+//\r
+// DBGKD Manipulate Structures\r
+//\r
+typedef struct _DBGKD_READ_MEMORY64\r
+{\r
+ ULONG64 TargetBaseAddress;\r
+ ULONG TransferCount;\r
+ ULONG ActualBytesRead;\r
+} DBGKD_READ_MEMORY64, *PDBGKD_READ_MEMORY64;\r
+\r
+typedef struct _DBGKD_WRITE_MEMORY64\r
+{\r
+ ULONG64 TargetBaseAddress;\r
+ ULONG TransferCount;\r
+ ULONG ActualBytesWritten;\r
+} DBGKD_WRITE_MEMORY64, *PDBGKD_WRITE_MEMORY64;\r
+\r
+typedef struct _DBGKD_GET_CONTEXT\r
+{\r
+ ULONG Unused;\r
+} DBGKD_GET_CONTEXT, *PDBGKD_GET_CONTEXT;\r
+\r
+typedef struct _DBGKD_SET_CONTEXT\r
+{\r
+ ULONG ContextFlags;\r
+} DBGKD_SET_CONTEXT, *PDBGKD_SET_CONTEXT;\r
+\r
+typedef struct _DBGKD_WRITE_BREAKPOINT64\r
+{\r
+ ULONG64 BreakPointAddress;\r
+ ULONG BreakPointHandle;\r
+} DBGKD_WRITE_BREAKPOINT64, *PDBGKD_WRITE_BREAKPOINT64;\r
+\r
+typedef struct _DBGKD_RESTORE_BREAKPOINT\r
+{\r
+ ULONG BreakPointHandle;\r
+} DBGKD_RESTORE_BREAKPOINT, *PDBGKD_RESTORE_BREAKPOINT;\r
+\r
+typedef struct _DBGKD_CONTINUE\r
+{\r
+ NTSTATUS ContinueStatus;\r
+} DBGKD_CONTINUE, *PDBGKD_CONTINUE;\r
+\r
+#include <pshpack4.h>\r
+typedef struct _DBGKD_CONTINUE2\r
+{\r
+ NTSTATUS ContinueStatus;\r
+ union\r
+ {\r
+ DBGKD_CONTROL_SET ControlSet;\r
+ DBGKD_ANY_CONTROL_SET AnyControlSet;\r
+ };\r
+} DBGKD_CONTINUE2, *PDBGKD_CONTINUE2;\r
+#include <poppack.h>\r
+\r
+typedef struct _DBGKD_READ_WRITE_IO64\r
+{\r
+ ULONG64 IoAddress;\r
+ ULONG DataSize;\r
+ ULONG DataValue;\r
+} DBGKD_READ_WRITE_IO64, *PDBGKD_READ_WRITE_IO64;\r
+\r
+typedef struct _DBGKD_READ_WRITE_IO_EXTENDED64\r
+{\r
+ ULONG DataSize;\r
+ ULONG InterfaceType;\r
+ ULONG BusNumber;\r
+ ULONG AddressSpace;\r
+ ULONG64 IoAddress;\r
+ ULONG DataValue;\r
+} DBGKD_READ_WRITE_IO_EXTENDED64, *PDBGKD_READ_WRITE_IO_EXTENDED64;\r
+\r
+typedef struct _DBGKD_READ_WRITE_MSR\r
+{\r
+ ULONG Msr;\r
+ ULONG DataValueLow;\r
+ ULONG DataValueHigh;\r
+} DBGKD_READ_WRITE_MSR, *PDBGKD_READ_WRITE_MSR;\r
+\r
+typedef struct _DBGKD_QUERY_SPECIAL_CALLS\r
+{\r
+ ULONG NumberOfSpecialCalls;\r
+} DBGKD_QUERY_SPECIAL_CALLS, *PDBGKD_QUERY_SPECIAL_CALLS;\r
+\r
+typedef struct _DBGKD_SET_SPECIAL_CALL64\r
+{\r
+ ULONG64 SpecialCall;\r
+} DBGKD_SET_SPECIAL_CALL64, *PDBGKD_SET_SPECIAL_CALL64;\r
+\r
+typedef struct _DBGKD_SET_INTERNAL_BREAKPOINT64\r
+{\r
+ ULONG64 BreakpointAddress;\r
+ ULONG Flags;\r
+} DBGKD_SET_INTERNAL_BREAKPOINT64, *PDBGKD_SET_INTERNAL_BREAKPOINT64;\r
+\r
+typedef struct _DBGKD_GET_INTERNAL_BREAKPOINT64\r
+{\r
+ ULONG64 BreakpointAddress;\r
+ ULONG Flags;\r
+ ULONG Calls;\r
+ ULONG MaxCallsPerPeriod;\r
+ ULONG MinInstructions;\r
+ ULONG MaxInstructions;\r
+ ULONG TotalInstructions;\r
+} DBGKD_GET_INTERNAL_BREAKPOINT64, *PDBGKD_GET_INTERNAL_BREAKPOINT64;\r
+\r
+typedef struct _DBGKD_BREAKPOINTEX\r
+{\r
+ ULONG BreakPointCount;\r
+ NTSTATUS ContinueStatus;\r
+} DBGKD_BREAKPOINTEX, *PDBGKD_BREAKPOINTEX;\r
+\r
+typedef struct _DBGKD_SEARCH_MEMORY\r
+{\r
+ union\r
+ {\r
+ ULONG64 SearchAddress;\r
+ ULONG64 FoundAddress;\r
+ };\r
+ ULONG64 SearchLength;\r
+ ULONG PatternLength;\r
+} DBGKD_SEARCH_MEMORY, *PDBGKD_SEARCH_MEMORY;\r
+\r
+typedef struct _DBGKD_GET_SET_BUS_DATA\r
+{\r
+ ULONG BusDataType;\r
+ ULONG BusNumber;\r
+ ULONG SlotNumber;\r
+ ULONG Offset;\r
+ ULONG Length;\r
+} DBGKD_GET_SET_BUS_DATA, *PDBGKD_GET_SET_BUS_DATA;\r
+\r
+typedef struct _DBGKD_FILL_MEMORY\r
+{\r
+ ULONG64 Address;\r
+ ULONG Length;\r
+ USHORT Flags;\r
+ USHORT PatternLength;\r
+} DBGKD_FILL_MEMORY, *PDBGKD_FILL_MEMORY;\r
+\r
+typedef struct _DBGKD_QUERY_MEMORY\r
+{\r
+ ULONG64 Address;\r
+ ULONG64 Reserved;\r
+ ULONG AddressSpace;\r
+ ULONG Flags;\r
+} DBGKD_QUERY_MEMORY, *PDBGKD_QUERY_MEMORY;\r
+\r
+typedef struct _DBGKD_SWITCH_PARTITION\r
+{\r
+ ULONG Partition;\r
+} DBGKD_SWITCH_PARTITION;\r
+\r
+//\r
+// DBGKD Structure for Manipulate\r
+//\r
+typedef struct _DBGKD_MANIPULATE_STATE64\r
+{\r
+ ULONG ApiNumber;\r
+ USHORT ProcessorLevel;\r
+ USHORT Processor;\r
+ NTSTATUS ReturnStatus;\r
+ union\r
+ {\r
+ DBGKD_READ_MEMORY64 ReadMemory;\r
+ DBGKD_WRITE_MEMORY64 WriteMemory;\r
+ DBGKD_GET_CONTEXT GetContext;\r
+ DBGKD_SET_CONTEXT SetContext;\r
+ DBGKD_WRITE_BREAKPOINT64 WriteBreakPoint;\r
+ DBGKD_RESTORE_BREAKPOINT RestoreBreakPoint;\r
+ DBGKD_CONTINUE Continue;\r
+ DBGKD_CONTINUE2 Continue2;\r
+ DBGKD_READ_WRITE_IO64 ReadWriteIo;\r
+ DBGKD_READ_WRITE_IO_EXTENDED64 ReadWriteIoExtended;\r
+ DBGKD_QUERY_SPECIAL_CALLS QuerySpecialCalls;\r
+ DBGKD_SET_SPECIAL_CALL64 SetSpecialCall;\r
+ DBGKD_SET_INTERNAL_BREAKPOINT64 SetInternalBreakpoint;\r
+ DBGKD_GET_INTERNAL_BREAKPOINT64 GetInternalBreakpoint;\r
+ DBGKD_GET_VERSION64 GetVersion64;\r
+ DBGKD_BREAKPOINTEX BreakPointEx;\r
+ DBGKD_READ_WRITE_MSR ReadWriteMsr;\r
+ DBGKD_SEARCH_MEMORY SearchMemory;\r
+ DBGKD_GET_SET_BUS_DATA GetSetBusData;\r
+ DBGKD_FILL_MEMORY FillMemory;\r
+ DBGKD_QUERY_MEMORY QueryMemory;\r
+ DBGKD_SWITCH_PARTITION SwitchPartition;\r
+ } u;\r
+} DBGKD_MANIPULATE_STATE64, *PDBGKD_MANIPULATE_STATE64;\r
+\r
#endif\r
\r
/* PRIVATE FUNCTIONS *********************************************************/\r
\r
+VOID\r
+NTAPI\r
+KdpSetCommonState(IN ULONG NewState,\r
+ IN PCONTEXT Context,\r
+ IN PDBGKD_WAIT_STATE_CHANGE64 WaitStateChange)\r
+{\r
+ USHORT InstructionCount;\r
+ BOOLEAN HadBreakpoints;\r
+\r
+ /* Setup common stuff available for all CPU architectures */\r
+ WaitStateChange->NewState = NewState;\r
+ WaitStateChange->ProcessorLevel = KeProcessorLevel;\r
+ WaitStateChange->Processor = (USHORT)KeGetCurrentPrcb()->Number;\r
+ WaitStateChange->NumberProcessors = (ULONG)KeNumberProcessors;\r
+ WaitStateChange->Thread = (ULONG)KeGetCurrentThread();\r
+ WaitStateChange->ProgramCounter = (ULONG64)Context->Eip;\r
+\r
+ /* Zero out the Control Report */\r
+ RtlZeroMemory(&WaitStateChange->ControlReport,\r
+ sizeof(DBGKD_CONTROL_REPORT));\r
+\r
+ /* Now copy the instruction stream and set the count */\r
+ RtlCopyMemory(&WaitStateChange->ControlReport.InstructionStream[0],\r
+ (PVOID)(ULONG_PTR)WaitStateChange->ProgramCounter,\r
+ DBGKD_MAXSTREAM);\r
+ InstructionCount = DBGKD_MAXSTREAM;\r
+ WaitStateChange->ControlReport.InstructionCount = InstructionCount;\r
+\r
+ /* Clear all the breakpoints in this region */\r
+ HadBreakpoints = FALSE;\r
+#if 0\r
+ KdpDeleteBreakpointRange((PVOID)WaitStateChange->ProgramCounter,\r
+ (PVOID)(WaitStateChange->ProgramCounter +\r
+ WaitStateChange->ControlReport.\r
+ InstructionCount - 1));\r
+#endif\r
+ if (HadBreakpoints)\r
+ {\r
+ /* Copy the instruction stream again, this time without breakpoints */\r
+ RtlCopyMemory(&WaitStateChange->ControlReport.InstructionStream[0],\r
+ (PVOID)(ULONG_PTR)WaitStateChange->ProgramCounter,\r
+ WaitStateChange->ControlReport.InstructionCount);\r
+ }\r
+}\r
+\r
+VOID\r
+NTAPI\r
+KdpSetContextState(IN PDBGKD_WAIT_STATE_CHANGE64 WaitStateChange,\r
+ IN PCONTEXT Context)\r
+{\r
+ PKPRCB Prcb = KeGetCurrentPrcb();\r
+\r
+ /* Copy i386 specific debug registers */\r
+ WaitStateChange->ControlReport.Dr6 = Prcb->ProcessorState.SpecialRegisters.\r
+ KernelDr6;\r
+ WaitStateChange->ControlReport.Dr7 = Prcb->ProcessorState.SpecialRegisters.\r
+ KernelDr7;\r
+\r
+ /* Copy i386 specific segments */\r
+ WaitStateChange->ControlReport.SegCs = (USHORT)Context->SegCs;\r
+ WaitStateChange->ControlReport.SegDs = (USHORT)Context->SegDs;\r
+ WaitStateChange->ControlReport.SegEs = (USHORT)Context->SegEs;\r
+ WaitStateChange->ControlReport.SegFs = (USHORT)Context->SegFs;\r
+\r
+ /* Copy EFlags */\r
+ WaitStateChange->ControlReport.EFlags = Context->EFlags;\r
+\r
+ /* Set Report Flags */\r
+ WaitStateChange->ControlReport.ReportFlags = REPORT_INCLUDES_SEGS;\r
+ if (WaitStateChange->ControlReport.SegCs == KGDT_R0_CODE)\r
+ {\r
+ WaitStateChange->ControlReport.ReportFlags = REPORT_INCLUDES_CS;\r
+ }\r
+}\r
+\r
+BOOLEAN\r
+NTAPI\r
+KdpSendWaitContinue(IN ULONG PacketType,\r
+ IN PSTRING SendHeader,\r
+ IN PSTRING SendData OPTIONAL,\r
+ IN OUT PCONTEXT ContextRecord)\r
+{\r
+ STRING Data, Header;\r
+ DBGKD_MANIPULATE_STATE64 ManipulateState;\r
+ ULONG Length;\r
+ KDSTATUS RecvCode;\r
+\r
+ /* Setup the Manipulate State structure */\r
+ Header.MaximumLength = sizeof(DBGKD_MANIPULATE_STATE64);\r
+ Header.Buffer = (PCHAR)&ManipulateState;\r
+ Data.MaximumLength = sizeof(KdpMessageBuffer);\r
+ Data.Buffer = KdpMessageBuffer;\r
+ //KdpContextSent = FALSE;\r
+\r
+SendPacket:\r
+ /* Send the Packet */\r
+ KdSendPacket(PacketType, SendHeader, SendData, &KdpContext);\r
+\r
+ /* If the debugger isn't present anymore, just return success */\r
+ if (KdDebuggerNotPresent) return TRUE;\r
+\r
+ /* Main processing Loop */\r
+ for (;;)\r
+ {\r
+ /* Receive Loop */\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
+ &Length,\r
+ &KdpContext);\r
+\r
+ /* If we got a resend request, do it */\r
+ if (RecvCode == KdPacketNeedsResend) goto SendPacket;\r
+ } while (RecvCode == KdPacketTimedOut);\r
+\r
+ /* Now check what API we got */\r
+ switch (ManipulateState.ApiNumber)\r
+ {\r
+ case DbgKdReadVirtualMemoryApi:\r
+\r
+ /* FIXME: TODO */\r
+ Ke386SetCr2(DbgKdReadVirtualMemoryApi);\r
+ while (TRUE);\r
+ break;\r
+\r
+ case DbgKdWriteVirtualMemoryApi:\r
+\r
+ /* FIXME: TODO */\r
+ Ke386SetCr2(DbgKdWriteVirtualMemoryApi);\r
+ while (TRUE);\r
+ break;\r
+\r
+ case DbgKdGetContextApi:\r
+\r
+ /* FIXME: TODO */\r
+ Ke386SetCr2(DbgKdGetContextApi);\r
+ while (TRUE);\r
+ break;\r
+\r
+ case DbgKdSetContextApi:\r
+\r
+ /* FIXME: TODO */\r
+ Ke386SetCr2(DbgKdSetContextApi);\r
+ while (TRUE);\r
+ break;\r
+\r
+ case DbgKdWriteBreakPointApi:\r
+\r
+ /* FIXME: TODO */\r
+ Ke386SetCr2(DbgKdWriteBreakPointApi);\r
+ while (TRUE);\r
+ break;\r
+\r
+ case DbgKdRestoreBreakPointApi:\r
+\r
+ /* FIXME: TODO */\r
+ Ke386SetCr2(DbgKdRestoreBreakPointApi);\r
+ while (TRUE);\r
+ break;\r
+\r
+ case DbgKdContinueApi:\r
+\r
+ /* FIXME: TODO */\r
+ Ke386SetCr2(DbgKdContinueApi);\r
+ while (TRUE);\r
+ break;\r
+\r
+ case DbgKdReadControlSpaceApi:\r
+\r
+ /* FIXME: TODO */\r
+ Ke386SetCr2(DbgKdReadControlSpaceApi);\r
+ while (TRUE);\r
+ break;\r
+\r
+ case DbgKdWriteControlSpaceApi:\r
+\r
+ /* FIXME: TODO */\r
+ Ke386SetCr2(DbgKdWriteControlSpaceApi);\r
+ while (TRUE);\r
+ break;\r
+\r
+ case DbgKdReadIoSpaceApi:\r
+\r
+ /* FIXME: TODO */\r
+ Ke386SetCr2(DbgKdReadIoSpaceApi);\r
+ while (TRUE);\r
+ break;\r
+\r
+ case DbgKdWriteIoSpaceApi:\r
+\r
+ /* FIXME: TODO */\r
+ Ke386SetCr2(DbgKdWriteIoSpaceApi);\r
+ while (TRUE);\r
+ break;\r
+\r
+ case DbgKdRebootApi:\r
+\r
+ /* FIXME: TODO */\r
+ Ke386SetCr2(DbgKdRebootApi);\r
+ while (TRUE);\r
+ break;\r
+\r
+ case DbgKdContinueApi2:\r
+\r
+ /* FIXME: TODO */\r
+ Ke386SetCr2(DbgKdContinueApi2);\r
+ while (TRUE);\r
+ break;\r
+\r
+ case DbgKdReadPhysicalMemoryApi:\r
+\r
+ /* FIXME: TODO */\r
+ Ke386SetCr2(DbgKdReadPhysicalMemoryApi);\r
+ while (TRUE);\r
+ break;\r
+\r
+ case DbgKdWritePhysicalMemoryApi:\r
+\r
+ /* FIXME: TODO */\r
+ Ke386SetCr2(DbgKdWritePhysicalMemoryApi);\r
+ while (TRUE);\r
+ break;\r
+\r
+ case DbgKdQuerySpecialCallsApi:\r
+\r
+ /* FIXME: TODO */\r
+ Ke386SetCr2(DbgKdQuerySpecialCallsApi);\r
+ while (TRUE);\r
+ break;\r
+\r
+ case DbgKdSetSpecialCallApi:\r
+\r
+ /* FIXME: TODO */\r
+ Ke386SetCr2(DbgKdSetSpecialCallApi);\r
+ while (TRUE);\r
+ break;\r
+\r
+ case DbgKdClearSpecialCallsApi:\r
+\r
+ /* FIXME: TODO */\r
+ Ke386SetCr2(DbgKdClearSpecialCallsApi);\r
+ while (TRUE);\r
+ break;\r
+\r
+ case DbgKdSetInternalBreakPointApi:\r
+\r
+ /* FIXME: TODO */\r
+ Ke386SetCr2(DbgKdSetInternalBreakPointApi);\r
+ while (TRUE);\r
+ break;\r
+\r
+ case DbgKdGetInternalBreakPointApi:\r
+\r
+ /* FIXME: TODO */\r
+ Ke386SetCr2(DbgKdGetInternalBreakPointApi);\r
+ while (TRUE);\r
+ break;\r
+\r
+ case DbgKdReadIoSpaceExtendedApi:\r
+\r
+ /* FIXME: TODO */\r
+ Ke386SetCr2(DbgKdReadIoSpaceExtendedApi);\r
+ while (TRUE);\r
+ break;\r
+\r
+ case DbgKdWriteIoSpaceExtendedApi:\r
+\r
+ /* FIXME: TODO */\r
+ Ke386SetCr2(DbgKdWriteIoSpaceExtendedApi);\r
+ while (TRUE);\r
+ break;\r
+\r
+ case DbgKdGetVersionApi:\r
+\r
+ /* FIXME: TODO */\r
+ Ke386SetCr2(DbgKdGetVersionApi);\r
+ while (TRUE);\r
+ break;\r
+\r
+ case DbgKdWriteBreakPointExApi:\r
+\r
+ /* FIXME: TODO */\r
+ Ke386SetCr2(DbgKdWriteBreakPointExApi);\r
+ while (TRUE);\r
+ break;\r
+\r
+ case DbgKdRestoreBreakPointExApi:\r
+\r
+ /* FIXME: TODO */\r
+ Ke386SetCr2(DbgKdRestoreBreakPointExApi);\r
+ while (TRUE);\r
+ break;\r
+\r
+ case DbgKdCauseBugCheckApi:\r
+\r
+ /* FIXME: TODO */\r
+ Ke386SetCr2(DbgKdCauseBugCheckApi);\r
+ while (TRUE);\r
+ break;\r
+\r
+ case DbgKdSwitchProcessor:\r
+\r
+ /* FIXME: TODO */\r
+ Ke386SetCr2(DbgKdSwitchProcessor);\r
+ while (TRUE);\r
+ break;\r
+\r
+ case DbgKdPageInApi:\r
+\r
+ /* FIXME: TODO */\r
+ Ke386SetCr2(DbgKdPageInApi);\r
+ while (TRUE);\r
+ break;\r
+\r
+ case DbgKdReadMachineSpecificRegister:\r
+\r
+ /* FIXME: TODO */\r
+ Ke386SetCr2(DbgKdReadMachineSpecificRegister);\r
+ while (TRUE);\r
+ break;\r
+\r
+ case DbgKdWriteMachineSpecificRegister:\r
+\r
+ /* FIXME: TODO */\r
+ Ke386SetCr2(DbgKdWriteMachineSpecificRegister);\r
+ while (TRUE);\r
+ break;\r
+\r
+ case OldVlm1:\r
+\r
+ /* FIXME: TODO */\r
+ Ke386SetCr2(OldVlm1);\r
+ while (TRUE);\r
+ break;\r
+\r
+ case OldVlm2:\r
+\r
+ /* FIXME: TODO */\r
+ Ke386SetCr2(OldVlm2);\r
+ while (TRUE);\r
+ break;\r
+\r
+ case DbgKdSearchMemoryApi:\r
+\r
+ /* FIXME: TODO */\r
+ Ke386SetCr2(DbgKdSearchMemoryApi);\r
+ while (TRUE);\r
+ break;\r
+\r
+ case DbgKdGetBusDataApi:\r
+\r
+ /* FIXME: TODO */\r
+ Ke386SetCr2(DbgKdGetBusDataApi);\r
+ while (TRUE);\r
+ break;\r
+\r
+ case DbgKdSetBusDataApi:\r
+\r
+ /* FIXME: TODO */\r
+ Ke386SetCr2(DbgKdSetBusDataApi);\r
+ while (TRUE);\r
+ break;\r
+\r
+ case DbgKdCheckLowMemoryApi:\r
+\r
+ /* FIXME: TODO */\r
+ Ke386SetCr2(DbgKdCheckLowMemoryApi);\r
+ while (TRUE);\r
+ break;\r
+\r
+ case DbgKdClearAllInternalBreakpointsApi:\r
+\r
+ /* FIXME: TODO */\r
+ Ke386SetCr2(DbgKdClearAllInternalBreakpointsApi);\r
+ while (TRUE);\r
+ break;\r
+\r
+ case DbgKdFillMemoryApi:\r
+\r
+ /* FIXME: TODO */\r
+ Ke386SetCr2(DbgKdFillMemoryApi);\r
+ while (TRUE);\r
+ break;\r
+\r
+ case DbgKdQueryMemoryApi:\r
+\r
+ /* FIXME: TODO */\r
+ Ke386SetCr2(DbgKdQueryMemoryApi);\r
+ while (TRUE);\r
+ break;\r
+\r
+ case DbgKdSwitchPartition:\r
+\r
+ /* FIXME: TODO */\r
+ Ke386SetCr2(DbgKdSwitchPartition);\r
+ while (TRUE);\r
+ break;\r
+\r
+ /* Unsupported Message */\r
+ default:\r
+\r
+ /* Setup an empty message, with failure */\r
+ while (TRUE);\r
+ Data.Length = 0;\r
+ ManipulateState.ReturnStatus = STATUS_UNSUCCESSFUL;\r
+\r
+ /* Send it */\r
+ KdSendPacket(PACKET_TYPE_KD_STATE_MANIPULATE,\r
+ &Header,\r
+ &Data,\r
+ &KdpContext);\r
+ break;\r
+ }\r
+ }\r
+}\r
+\r
+BOOLEAN\r
+NTAPI\r
+KdpReportLoadSymbolsStateChange(IN PSTRING PathName,\r
+ IN PKD_SYMBOLS_INFO SymbolInfo,\r
+ IN BOOLEAN Unload,\r
+ IN OUT PCONTEXT Context)\r
+{\r
+ PSTRING ExtraData;\r
+ STRING Data, Header;\r
+ DBGKD_WAIT_STATE_CHANGE64 WaitStateChange;\r
+ KCONTINUE_STATUS Status;\r
+\r
+ /* Start wait loop */\r
+ do\r
+ {\r
+ /* Build the architecture common parts of the message */\r
+ KdpSetCommonState(DbgKdLoadSymbolsStateChange,\r
+ Context,\r
+ &WaitStateChange);\r
+\r
+ /* Now finish creating the structure */\r
+ KdpSetContextState(&WaitStateChange, Context);\r
+\r
+ /* Fill out load data */\r
+ WaitStateChange.u.LoadSymbols.UnloadSymbols = Unload;\r
+ WaitStateChange.u.LoadSymbols.BaseOfDll = (ULONG)SymbolInfo->BaseOfDll;\r
+ WaitStateChange.u.LoadSymbols.ProcessId = SymbolInfo->ProcessId;\r
+ WaitStateChange.u.LoadSymbols.CheckSum = SymbolInfo->CheckSum;\r
+ WaitStateChange.u.LoadSymbols.SizeOfImage = SymbolInfo->SizeOfImage;\r
+\r
+ /* Check if we have a symbol name */\r
+ if (PathName)\r
+ {\r
+ /* Setup the information */\r
+ WaitStateChange.u.LoadSymbols.PathNameLength = PathName->Length;\r
+ Data.Buffer = KdpPathBuffer;\r
+ Data.Length = WaitStateChange.u.LoadSymbols.PathNameLength;\r
+ ExtraData = &Data;\r
+ }\r
+ else\r
+ {\r
+ /* No name */\r
+ WaitStateChange.u.LoadSymbols.PathNameLength = 0;\r
+ ExtraData = NULL;\r
+ }\r
+\r
+ /* Setup the header */\r
+ Header.Length = sizeof(DBGKD_WAIT_STATE_CHANGE64);\r
+ Header.Buffer = (PCHAR)&WaitStateChange;\r
+\r
+ /* Send the packet */\r
+ Status = KdpSendWaitContinue(PACKET_TYPE_KD_STATE_CHANGE64,\r
+ &Header,\r
+ ExtraData,\r
+ Context);\r
+ } while(Status == ContinueProcessorReselected);\r
+\r
+ /* Return status */\r
+ while (TRUE);\r
+ return Status;\r
+}\r
+\r
VOID\r
NTAPI\r
KdpTimeSlipDpcRoutine(IN PKDPC Dpc,\r