- We now tell WinDBG to load kernel symbols and WinDBG replies (!) with DbgKdGetVersi...
authorAlex Ionescu <aionescu@gmail.com>
Mon, 19 Feb 2007 15:02:39 +0000 (15:02 +0000)
committerAlex Ionescu <aionescu@gmail.com>
Mon, 19 Feb 2007 15:02:39 +0000 (15:02 +0000)
  - Implement KdpSetCommonState (except code to clear breakpoints).
  - Implement KdpSetContextState (for x86).
  - Implement KdpReportLoadSymbolsStateChange.
  - Implement skeleton of KdpSendWaitContinue, the main KD API Loop.
  - Add KCONTINUE_STATUS.
  - Redefine KdReceivePacket's return value to KDSTATUS and define possibile values.
  - Add DBGKD_ANY_CONTROL_SET and X86/IA64/AMD64 control sets.
  - Add DBGKD_MANIPULATE_STATE64 and all sub-structures (READ_MEMORY, WRITE_MEMORY, etc).
  - Fix definition of KdpSymbol.

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

reactos/include/ndk/ketypes.h
reactos/include/reactos/kddll.h
reactos/include/reactos/windbgkd.h
reactos/ntoskrnl/include/internal/kd.h
reactos/ntoskrnl/kd64/kdapi.c
reactos/ntoskrnl/kd64/kddata.c
reactos/ntoskrnl/kd64/kdprint.c
reactos/ntoskrnl/kd64/kdtrap.c

index 290c08a..8f0a5eb 100644 (file)
@@ -297,6 +297,17 @@ typedef enum _ADJUST_REASON
     AdjustBoost = 2
 } ADJUST_REASON;
 
+//
+// Continue Status
+//
+typedef enum _KCONTINUE_STATUS
+{
+    ContinueError = 0,
+    ContinueSuccess,
+    ContinueProcessorReselected,
+    ContinueNextProcessor
+} KCONTINUE_STATUS;
+
 //
 // Process States
 //
index b83bf20..4d90999 100644 (file)
@@ -1,6 +1,13 @@
 #ifndef _KDDLL_\r
 #define _KDDLL_\r
 \r
+typedef enum _KDSTATUS\r
+{\r
+    KdPacketReceived = 0,\r
+    KdPacketTimedOut,\r
+    KdPacketNeedsResend\r
+} KDSTATUS;\r
+\r
 NTSTATUS\r
 NTAPI\r
 KdDebuggerInitialize0(\r
@@ -13,7 +20,7 @@ KdDebuggerInitialize1(
     IN PLOADER_PARAMETER_BLOCK LoaderBlock\r
 );\r
 \r
-ULONG\r
+KDSTATUS\r
 NTAPI\r
 KdReceivePacket(\r
     IN ULONG PacketType,\r
index d4e1fbf..9ecb450 100644 (file)
@@ -1,6 +1,11 @@
 #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
@@ -135,6 +140,46 @@ typedef struct _KD_CONTEXT
     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
@@ -226,4 +271,193 @@ typedef struct _DBGKD_WAIT_STATE_CHANGE64
     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
index a065b35..856ed50 100644 (file)
@@ -120,8 +120,8 @@ KdpPrint(
 ULONG
 NTAPI
 KdpSymbol(
-    IN LPSTR DllPath,
-    IN ULONG DllBase,
+    IN PSTRING DllPath,
+    IN PKD_SYMBOLS_INFO DllBase,
     IN BOOLEAN Unload,
     IN KPROCESSOR_MODE PreviousMode,
     IN PCONTEXT ContextRecord,
@@ -135,6 +135,15 @@ KdpPollBreakInWithPortLock(
     VOID
 );
 
+BOOLEAN
+NTAPI
+KdpReportLoadSymbolsStateChange(
+    IN PSTRING PathName,
+    IN PKD_SYMBOLS_INFO SymbolInfo,
+    IN BOOLEAN Unload,
+    IN OUT PCONTEXT Context
+);
+
 extern DBGKD_GET_VERSION64 KdVersionBlock;
 extern KDDEBUGGER_DATA64 KdDebuggerDataBlock;
 extern LIST_ENTRY KdpDebuggerDataListHead;
@@ -167,3 +176,4 @@ extern LARGE_INTEGER KdTimerStop, KdTimerStart, KdTimerDifference;
 extern ULONG KdComponentTableSize;
 extern ULONG Kd_WIN2000_Mask;
 extern PULONG KdComponentTable[104];
+extern CHAR KdpMessageBuffer[4096], KdpPathBuffer[4096];
index cb7fbd9..ea161ed 100644 (file)
 \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
index 50daca0..e522653 100644 (file)
@@ -82,6 +82,12 @@ PKEVENT KdpTimeSlipEvent;
 KSPIN_LOCK KdpTimeSlipEventLock;\r
 LARGE_INTEGER KdTimerStop, KdTimerStart, KdTimerDifference;\r
 \r
+//\r
+// Buffers\r
+//\r
+CHAR KdpMessageBuffer[4096];\r
+CHAR KdpPathBuffer[4096];\r
+\r
 //\r
 // Debug Filter Masks\r
 //\r
index 9ec0c94..16e0f17 100644 (file)
@@ -12,8 +12,6 @@
 #define NDEBUG\r
 #include <debug.h>\r
 \r
-CHAR KdpMessageBuffer[4096];\r
-\r
 /* FUNCTIONS *****************************************************************/\r
 \r
 BOOLEAN\r
@@ -68,8 +66,8 @@ KdpCommandString(IN ULONG Length,
 \r
 ULONG\r
 NTAPI\r
-KdpSymbol(IN LPSTR DllPath,\r
-          IN ULONG DllBase,\r
+KdpSymbol(IN PSTRING DllPath,\r
+          IN PKD_SYMBOLS_INFO DllBase,\r
           IN BOOLEAN Unload,\r
           IN KPROCESSOR_MODE PreviousMode,\r
           IN PCONTEXT ContextRecord,\r
@@ -93,15 +91,11 @@ KdpSymbol(IN LPSTR DllPath,
                   sizeof(CONTEXT));\r
 \r
     /* Report the new state */\r
-#if 0\r
     Status = KdpReportLoadSymbolsStateChange(DllPath,\r
                                              DllBase,\r
                                              Unload,\r
                                              &Prcb->ProcessorState.\r
                                              ContextFrame);\r
-#else\r
-    Status = FALSE;\r
-#endif\r
 \r
     /* Now restore the processor state, manually again. */\r
     RtlCopyMemory(ContextRecord,\r
index a6f6c1b..368843f 100644 (file)
@@ -154,8 +154,8 @@ KdpTrap(IN PKTRAP_FRAME TrapFrame,
             case BREAKPOINT_LOAD_SYMBOLS:\r
 \r
                 /* Call the worker routine */\r
-                KdpSymbol(UlongToPtr(ExceptionRecord->ExceptionInformation[1]),\r
-                          (ULONG)ExceptionRecord->ExceptionInformation[2],\r
+                KdpSymbol((PVOID)ExceptionRecord->ExceptionInformation[1],\r
+                          (PVOID)ExceptionRecord->ExceptionInformation[2],\r
                           Unload,\r
                           PreviousMode,\r
                           ContextRecord,\r