- Check KdReceivePacket return for KdPacketReceived instead of 0 for correctness.
- Use KdpDprintf instead of setting CR2 for unhandled cases.
- Add more variables to KdDebuggerDataBlock.
svn path=/trunk/; revision=43291
// Fill Memory Flags
//
#define DBGKD_FILL_MEMORY_VIRTUAL 0x01
-#define DBGKD_FILL_MEMORY_PHYSICAL 0x002
+#define DBGKD_FILL_MEMORY_PHYSICAL 0x02
//
// Physical Memory Caching Flags
extern ULONG MmTotalNonPagedPoolQuota;
extern PHYSICAL_ADDRESS MmSharedDataPagePhysicalAddress;
extern ULONG MmNumberOfPhysicalPages;
+extern ULONG MmLowestPhysicalPage;
+extern ULONG MmHighestPhysicalPage;
extern PVOID MmPagedPoolBase;
extern ULONG MmPagedPoolSize;
extern PMEMORY_ALLOCATION_DESCRIPTOR MiFreeDescriptor;
extern MEMORY_ALLOCATION_DESCRIPTOR MiFreeDescriptorOrg;
-extern ULONG MmHighestPhysicalPage;
struct _KTRAP_FRAME;
struct _EPROCESS;
#if 0\r
if (!MmIsAddressValid((PVOID)(ULONG_PTR)State->u.ReadMemory.TargetBaseAddress))\r
{\r
- Ke386SetCr2(State->u.ReadMemory.TargetBaseAddress);\r
+ KdpDprintf("Tried to read invalid address %p\n",\r
+ (PVOID)(ULONG_PTR)State->u.ReadMemory.TargetBaseAddress);\r
while (TRUE);\r
}\r
#endif\r
else\r
{\r
/* SMP not yet handled */\r
+ KdpDprintf("SMP UNHANDLED\n");\r
ControlStart = NULL;\r
while (TRUE);\r
}\r
else\r
{\r
/* SMP not yet handled */\r
+ KdpDprintf("SMP UNHANDLED\n");\r
ControlStart = NULL;\r
while (TRUE);\r
}\r
case DbgKdWriteVirtualMemoryApi:\r
\r
/* FIXME: TODO */\r
- Ke386SetCr2(DbgKdWriteVirtualMemoryApi);\r
+ KdpDprintf("DbgKdWriteVirtualMemoryApi called\n");\r
while (TRUE);\r
break;\r
\r
case DbgKdReadIoSpaceApi:\r
\r
/* FIXME: TODO */\r
- Ke386SetCr2(DbgKdReadIoSpaceApi);\r
+ KdpDprintf("DbgKdReadIoSpaceApi called\n");\r
while (TRUE);\r
break;\r
\r
case DbgKdWriteIoSpaceApi:\r
\r
/* FIXME: TODO */\r
- Ke386SetCr2(DbgKdWriteIoSpaceApi);\r
+ KdpDprintf("DbgKdWriteIoSpaceApi called\n");\r
while (TRUE);\r
break;\r
\r
case DbgKdReadPhysicalMemoryApi:\r
\r
/* FIXME: TODO */\r
- goto fail;\r
- Ke386SetCr2(DbgKdReadPhysicalMemoryApi);\r
+ KdpDprintf("DbgKdReadPhysicalMemoryApi called for address %I64X\n",\r
+ ManipulateState.u.ReadMemory.TargetBaseAddress);\r
+ goto Hack;\r
while (TRUE);\r
break;\r
\r
case DbgKdWritePhysicalMemoryApi:\r
\r
/* FIXME: TODO */\r
- Ke386SetCr2(DbgKdWritePhysicalMemoryApi);\r
+ KdpDprintf("DbgKdWritePhysicalMemoryApi called\n");\r
while (TRUE);\r
break;\r
\r
case DbgKdQuerySpecialCallsApi:\r
\r
/* FIXME: TODO */\r
- Ke386SetCr2(DbgKdQuerySpecialCallsApi);\r
+ KdpDprintf("DbgKdQuerySpecialCallsApi called\n");\r
while (TRUE);\r
break;\r
\r
case DbgKdSetSpecialCallApi:\r
\r
/* FIXME: TODO */\r
- Ke386SetCr2(DbgKdSetSpecialCallApi);\r
+ KdpDprintf("DbgKdSetSpecialCallApi called\n");\r
while (TRUE);\r
break;\r
\r
case DbgKdClearSpecialCallsApi:\r
\r
/* FIXME: TODO */\r
- Ke386SetCr2(DbgKdClearSpecialCallsApi);\r
+ KdpDprintf("DbgKdClearSpecialCallsApi called\n");\r
while (TRUE);\r
break;\r
\r
case DbgKdSetInternalBreakPointApi:\r
\r
/* FIXME: TODO */\r
- Ke386SetCr2(DbgKdSetInternalBreakPointApi);\r
+ KdpDprintf("DbgKdSetInternalBreakPointApi called\n");\r
while (TRUE);\r
break;\r
\r
case DbgKdGetInternalBreakPointApi:\r
\r
/* FIXME: TODO */\r
- Ke386SetCr2(DbgKdGetInternalBreakPointApi);\r
+ KdpDprintf("DbgKdGetInternalBreakPointApi called\n");\r
while (TRUE);\r
break;\r
\r
case DbgKdReadIoSpaceExtendedApi:\r
\r
/* FIXME: TODO */\r
- Ke386SetCr2(DbgKdReadIoSpaceExtendedApi);\r
+ KdpDprintf("DbgKdReadIoSpaceExtendedApi called\n");\r
while (TRUE);\r
break;\r
\r
case DbgKdWriteIoSpaceExtendedApi:\r
\r
/* FIXME: TODO */\r
- Ke386SetCr2(DbgKdWriteIoSpaceExtendedApi);\r
+ KdpDprintf("DbgKdWriteIoSpaceExtendedApi called\n");\r
while (TRUE);\r
break;\r
\r
case DbgKdWriteBreakPointExApi:\r
\r
/* FIXME: TODO */\r
- Ke386SetCr2(DbgKdWriteBreakPointExApi);\r
+ KdpDprintf("DbgKdWriteBreakPointExApi called\n");\r
while (TRUE);\r
break;\r
\r
case DbgKdRestoreBreakPointExApi:\r
\r
/* FIXME: TODO */\r
- Ke386SetCr2(DbgKdRestoreBreakPointExApi);\r
+ KdpDprintf("DbgKdRestoreBreakPointExApi called\n");\r
while (TRUE);\r
break;\r
\r
case DbgKdSwitchProcessor:\r
\r
/* FIXME: TODO */\r
- Ke386SetCr2(DbgKdSwitchProcessor);\r
+ KdpDprintf("DbgKdSwitchProcessor called\n");\r
while (TRUE);\r
break;\r
\r
case DbgKdPageInApi:\r
\r
/* FIXME: TODO */\r
- Ke386SetCr2(DbgKdPageInApi);\r
+ KdpDprintf("DbgKdPageInApi called\n");\r
while (TRUE);\r
break;\r
\r
case DbgKdReadMachineSpecificRegister:\r
\r
/* FIXME: TODO */\r
- Ke386SetCr2(DbgKdReadMachineSpecificRegister);\r
+ KdpDprintf("DbgKdReadMachineSpecificRegister called\n");\r
while (TRUE);\r
break;\r
\r
case DbgKdWriteMachineSpecificRegister:\r
\r
/* FIXME: TODO */\r
- Ke386SetCr2(DbgKdWriteMachineSpecificRegister);\r
+ KdpDprintf("DbgKdWriteMachineSpecificRegister called\n");\r
while (TRUE);\r
break;\r
\r
case OldVlm1:\r
\r
/* FIXME: TODO */\r
- Ke386SetCr2(OldVlm1);\r
+ KdpDprintf("OldVlm1 called\n");\r
while (TRUE);\r
break;\r
\r
case OldVlm2:\r
\r
/* FIXME: TODO */\r
- Ke386SetCr2(OldVlm2);\r
+ KdpDprintf("OldVlm2 called\n");\r
while (TRUE);\r
break;\r
\r
case DbgKdSearchMemoryApi:\r
\r
/* FIXME: TODO */\r
- Ke386SetCr2(DbgKdSearchMemoryApi);\r
+ KdpDprintf("DbgKdSearchMemoryApi called\n");\r
while (TRUE);\r
break;\r
\r
case DbgKdGetBusDataApi:\r
\r
/* FIXME: TODO */\r
- Ke386SetCr2(DbgKdGetBusDataApi);\r
+ KdpDprintf("DbgKdGetBusDataApi called\n");\r
while (TRUE);\r
break;\r
\r
case DbgKdSetBusDataApi:\r
\r
/* FIXME: TODO */\r
- Ke386SetCr2(DbgKdSetBusDataApi);\r
+ KdpDprintf("DbgKdSetBusDataApi called\n");\r
while (TRUE);\r
break;\r
\r
case DbgKdCheckLowMemoryApi:\r
\r
/* FIXME: TODO */\r
- Ke386SetCr2(DbgKdCheckLowMemoryApi);\r
+ KdpDprintf("DbgKdCheckLowMemoryApi called\n");\r
while (TRUE);\r
break;\r
\r
case DbgKdFillMemoryApi:\r
\r
/* FIXME: TODO */\r
- Ke386SetCr2(DbgKdFillMemoryApi);\r
+ KdpDprintf("DbgKdFillMemoryApi called\n");\r
while (TRUE);\r
break;\r
\r
case DbgKdSwitchPartition:\r
\r
/* FIXME: TODO */\r
- Ke386SetCr2(DbgKdSwitchPartition);\r
+ KdpDprintf("DbgKdSwitchPartition called\n");\r
while (TRUE);\r
break;\r
\r
default:\r
\r
/* Setup an empty message, with failure */\r
+ KdpDprintf("Received unknown API Number %lx\n", ManipulateState.ApiNumber);\r
while (TRUE);\r
-fail:\r
+Hack:\r
Data.Length = 0;\r
ManipulateState.ReturnStatus = STATUS_UNSUCCESSFUL;\r
\r
KdEnableDebugger(VOID)\r
{\r
/* Use the internal routine */\r
+ KdpDprintf("KdEnableDebugger called\n");\r
while (TRUE);\r
return KdEnableDebuggerWithLock(TRUE);\r
}\r
/* INCLUDES ******************************************************************/\r
\r
#include <ntoskrnl.h>\r
+#include "../mm/arm3/miarm.h"\r
#define NDEBUG\r
#include <debug.h>\r
\r
#if defined(_M_IX86) || defined(_M_AMD64)\r
ULONG KdpBreakpointInstruction = 0xCC; // INT3\r
#else\r
-#error TODO\r
+#error Define the breakpoint instruction for this architecture\r
#endif\r
BOOLEAN KdpOweBreakpoint;\r
BOOLEAN BreakpointsSuspended;\r
{0}, // MmSystemCacheStart\r
{0}, // MmSystemCacheEnd\r
{0}, // MmSystemCacheWs\r
- {0}, // MmPfnDatabase\r
- {0}, // MmSystemPtesStart\r
- {0}, // MmSystemPtesEnd\r
+ {PtrToUlong(&MmPfnDatabase)},\r
+ {PtrToUlong(MmSystemPtesStart)},\r
+ {PtrToUlong(MmSystemPtesEnd)},\r
{0}, // MmSubsectionBase\r
{0}, // MmNumberOfPagingFiles\r
- {0}, // MmLowestPhysicalPage\r
- {0}, // MmHighestPhysicalPage\r
- {0}, // MmNumberOfPhysicalPages\r
- {0}, // MmMaximumNonPagedPoolInBytes\r
- {0}, // MmNonPagedSystemStart\r
- {0}, // MmNonPagedPoolStart\r
- {0}, // MmNonPagedPoolEnd\r
- {0}, // MmPagedPoolStart\r
- {0}, // MmPagedPoolEnd\r
- {0}, // MmPagedPoolInfo\r
+ {PtrToUlong(&MmLowestPhysicalPage)},\r
+ {PtrToUlong(&MmHighestPhysicalPage)},\r
+ {PtrToUlong(&MmNumberOfPhysicalPages)},\r
+ {PtrToUlong(&MmMaximumNonPagedPoolInBytes)},\r
+ {PtrToUlong(&MmNonPagedSystemStart)},\r
+ {PtrToUlong(&MmNonPagedPoolStart)},\r
+ {PtrToUlong(&MmNonPagedPoolEnd)},\r
+ {PtrToUlong(&MmPagedPoolStart)},\r
+ {PtrToUlong(&MmPagedPoolEnd)},\r
+ {PtrToUlong(&MmPagedPoolInfo)},\r
PAGE_SIZE,\r
- {0}, // MmSizeOfPagedPoolInBytes\r
+ {PtrToUlong(&MmSizeOfPagedPoolInBytes)},\r
{0}, // MmTotalCommitLimit\r
{0}, // MmTotalCommittedPages\r
{0}, // MmSharedCommit\r
{0}, // MmAvailablePages\r
{0}, // MmResidentAvailablePages\r
{0}, // PoolTrackTable\r
- {0}, // NonPagedPoolDescriptor\r
+ {PtrToUlong(&NonPagedPoolDescriptor)},\r
{PtrToUlong(&MmHighestUserAddress)},\r
{PtrToUlong(&MmSystemRangeStart)},\r
{PtrToUlong(&MmUserProbeAddress)},\r
{0}, // MmPeakCommitment\r
{0}, // MmtotalCommitLimitMaximum\r
{PtrToUlong(&CmNtCSDVersion)},\r
- {0}, // MmPhysicalMemoryBlock\r
- {0}, // MmSessionBase\r
- {0}, // MmSessionSize\r
+ {PtrToUlong(&MmPhysicalMemoryBlock)},\r
+ {PtrToUlong(&MmSessionBase)},\r
+ {PtrToUlong(&MmSessionSize)},\r
{0},\r
{0},\r
FIELD_OFFSET(KTHREAD, NextProcessor),\r
KGDT_TSS,\r
0,\r
0,\r
- {0}, // IopNumTriagDumpDataBlocks\r
+ {0}, // IopNumTriageDumpDataBlocks\r
{0}, // IopTriageDumpDataBlocks\r
};\r
else\r
{\r
/* Now get a packet */\r
- if (!KdReceivePacket(PACKET_TYPE_KD_POLL_BREAKIN,\r
+ if (KdReceivePacket(PACKET_TYPE_KD_POLL_BREAKIN,\r
NULL,\r
NULL,\r
NULL,\r
- NULL))\r
+ NULL) == KdPacketReceived)\r
{\r
/* Successful breakin */\r
DoBreak = TRUE;\r
if (KeTryToAcquireSpinLockAtDpcLevel(&KdpDebuggerLock))\r
{\r
/* Now get a packet */\r
- if (!KdReceivePacket(PACKET_TYPE_KD_POLL_BREAKIN,\r
+ if (KdReceivePacket(PACKET_TYPE_KD_POLL_BREAKIN,\r
NULL,\r
NULL,\r
NULL,\r
- NULL))\r
+ NULL) == KdPacketReceived)\r
{\r
/* Successful breakin */\r
DoBreak = TRUE;\r
IN PKEXCEPTION_FRAME ExceptionFrame)\r
{\r
/* FIXME */\r
+ KdpDprintf("KdpCommandString called\n");\r
while (TRUE);\r
}\r
\r
IN PKEXCEPTION_FRAME ExceptionFrame)\r
{\r
/* FIXME */\r
+ KdpDprintf("KdpPrompt called\n");\r
while (TRUE);\r
return FALSE;\r
}\r
/* Check if this is INT1 or 3, or if we're forced to handle it */\r
if ((ExceptionCode == STATUS_BREAKPOINT) ||\r
(ExceptionCode == STATUS_SINGLE_STEP) ||\r
- //(ExceptionCode == STATUS_ASSERTION_FAILURE) ||\r
+ (ExceptionCode == STATUS_ASSERTION_FAILURE) ||\r
(NtGlobalFlag & FLG_STOP_ON_EXCEPTION))\r
{\r
/* Check if we can't really handle this */\r
C_ASSERT(sizeof(POOL_HEADER) == 8);
C_ASSERT(sizeof(POOL_HEADER) == sizeof(LIST_ENTRY));
+extern POOL_DESCRIPTOR NonPagedPoolDescriptor;
+
//
// END FIXFIX
//
extern ULONG MmSizeOfNonPagedPoolInBytes;
extern ULONG MmMaximumNonPagedPoolInBytes;
+extern PVOID MmNonPagedSystemStart;
extern PVOID MmNonPagedPoolStart;
extern PVOID MmNonPagedPoolExpansionStart;
extern PVOID MmNonPagedPoolEnd;
+extern ULONG MmSizeOfPagedPoolInBytes;
+extern PVOID MmPagedPoolStart;
+extern PVOID MmPagedPoolEnd;
+extern PVOID MmSessionBase;
+extern ULONG MmSessionSize;
extern PMMPTE MmFirstReservedMappingPte, MmLastReservedMappingPte;
extern PMMPTE MiFirstReservedZeroingPte;
extern MI_PFN_CACHE_ATTRIBUTE MiPlatformCacheAttributes[2][MmMaximumCacheType];