Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

418 lines
7.4 KiB

4 years ago
  1. /*++
  2. Copyright (c) 1990 Microsoft Corporation
  3. Module Name:
  4. kdp.h
  5. Abstract:
  6. Private include file for the Kernel Debugger subcomponent
  7. of the NTOS project
  8. Author:
  9. Mike O'Leary (mikeol) 29-June-1989
  10. Revision History:
  11. --*/
  12. #include "ntos.h"
  13. #include "ki.h"
  14. #include "ntdbg.h"
  15. #include "string.h"
  16. #include "stdlib.h"
  17. #include "kdpcpu.h"
  18. //
  19. // Define constants.
  20. //
  21. //
  22. // Addresses above GLOBAL_BREAKPOINT_LIMIT are either in system space
  23. // or part of dynlink, so we treat them as global.
  24. //
  25. #define GLOBAL_BREAKPOINT_LIMIT 1610612736L // 1.5gigabytes
  26. //
  27. // Define breakpoint table entry structure.
  28. //
  29. #define KD_BREAKPOINT_IN_USE 0x00000001
  30. #define KD_BREAKPOINT_NEEDS_WRITE 0x00000002
  31. #define KD_BREAKPOINT_SUSPENDED 0x00000004
  32. //
  33. // status Constants for Packet waiting
  34. //
  35. #define KDP_PACKET_RECEIVED 0
  36. #define KDP_PACKET_TIMEOUT 1
  37. #define KDP_PACKET_RESEND 2
  38. typedef struct _BREAKPOINT_ENTRY {
  39. ULONG Flags;
  40. ULONG DirectoryTableBase;
  41. PVOID Address;
  42. KDP_BREAKPOINT_TYPE Content;
  43. } BREAKPOINT_ENTRY, *PBREAKPOINT_ENTRY;
  44. //
  45. // Define function prototypes.
  46. //
  47. VOID
  48. KdpReboot (
  49. VOID
  50. );
  51. BOOLEAN
  52. KdpPrintString (
  53. IN PSTRING Output
  54. );
  55. BOOLEAN
  56. KdpPromptString (
  57. IN PSTRING Output,
  58. IN OUT PSTRING Input
  59. );
  60. ULONG
  61. KdpAddBreakpoint (
  62. IN PVOID Address
  63. );
  64. BOOLEAN
  65. KdpDeleteBreakpoint (
  66. IN ULONG Handle
  67. );
  68. BOOLEAN
  69. KdpDeleteBreakpointRange (
  70. IN PVOID Lower,
  71. IN PVOID Upper
  72. );
  73. ULONG
  74. KdpMoveMemory (
  75. IN PCHAR Destination,
  76. IN PCHAR Source,
  77. IN ULONG Length
  78. );
  79. VOID
  80. KdpQuickMoveMemory (
  81. IN PCHAR Destination,
  82. IN PCHAR Source,
  83. IN ULONG Length
  84. );
  85. ULONG
  86. KdpReceivePacket (
  87. IN ULONG ExpectedPacketType,
  88. OUT PSTRING MessageHeader,
  89. OUT PSTRING MessageData,
  90. OUT PULONG DataLength
  91. );
  92. VOID
  93. KdpSetLoadState(
  94. IN PDBGKD_WAIT_STATE_CHANGE WaitStateChange,
  95. IN PCONTEXT ContextRecord
  96. );
  97. VOID
  98. KdpSetStateChange(
  99. IN PDBGKD_WAIT_STATE_CHANGE WaitStateChange,
  100. IN PEXCEPTION_RECORD ExceptionRecord,
  101. IN PCONTEXT ContextRecord,
  102. IN BOOLEAN SecondChance
  103. );
  104. VOID
  105. KdpGetStateChange(
  106. IN PDBGKD_MANIPULATE_STATE ManipulateState,
  107. IN PCONTEXT ContextRecord
  108. );
  109. VOID
  110. KdpSendPacket (
  111. IN ULONG PacketType,
  112. IN PSTRING MessageHeader,
  113. IN PSTRING MessageData OPTIONAL
  114. );
  115. BOOLEAN
  116. KdpStub (
  117. IN PKTRAP_FRAME TrapFrame,
  118. IN PKEXCEPTION_FRAME ExceptionFrame,
  119. IN PEXCEPTION_RECORD ExceptionRecord,
  120. IN PCONTEXT ContextRecord,
  121. IN KPROCESSOR_MODE PreviousMode,
  122. IN BOOLEAN SecondChance
  123. );
  124. BOOLEAN
  125. KdpTrap (
  126. IN PKTRAP_FRAME TrapFrame,
  127. IN PKEXCEPTION_FRAME ExceptionFrame,
  128. IN PEXCEPTION_RECORD ExceptionRecord,
  129. IN PCONTEXT ContextRecord,
  130. IN KPROCESSOR_MODE PreviousMode,
  131. IN BOOLEAN SecondChance
  132. );
  133. VOID
  134. KdpDisplayString (
  135. IN PCHAR Output
  136. );
  137. VOID
  138. KdpWriteComPacket (
  139. USHORT,
  140. USHORT,
  141. PVOID,
  142. PVOID,
  143. PVOID
  144. );
  145. BOOLEAN
  146. KdpReadComPacket (
  147. VOID
  148. );
  149. BOOLEAN
  150. KdpSwitchProcessor (
  151. IN PEXCEPTION_RECORD ExceptionRecord,
  152. IN OUT PCONTEXT ContextRecord,
  153. IN BOOLEAN SecondChance
  154. );
  155. BOOLEAN
  156. KdpReportExceptionStateChange (
  157. IN PEXCEPTION_RECORD ExceptionRecord,
  158. IN OUT PCONTEXT ContextRecord,
  159. IN BOOLEAN SecondChance
  160. );
  161. BOOLEAN
  162. KdpReportLoadSymbolsStateChange (
  163. IN PSTRING PathName,
  164. IN PKD_SYMBOLS_INFO SymbolInfo,
  165. IN BOOLEAN UnloadSymbols,
  166. IN OUT PCONTEXT ContextRecord
  167. );
  168. KCONTINUE_STATUS
  169. KdpSendWaitContinue(
  170. IN ULONG PacketType,
  171. IN PSTRING MessageHeader,
  172. IN PSTRING MessageData OPTIONAL,
  173. IN OUT PCONTEXT ContextRecord
  174. );
  175. VOID
  176. KdpReadVirtualMemory(
  177. IN PDBGKD_MANIPULATE_STATE m,
  178. IN PSTRING AdditionalData,
  179. IN PCONTEXT Context
  180. );
  181. VOID
  182. KdpWriteVirtualMemory(
  183. IN PDBGKD_MANIPULATE_STATE m,
  184. IN PSTRING AdditionalData,
  185. IN PCONTEXT Context
  186. );
  187. VOID
  188. KdpReadPhysicalMemory(
  189. IN PDBGKD_MANIPULATE_STATE m,
  190. IN PSTRING AdditionalData,
  191. IN PCONTEXT Context
  192. );
  193. VOID
  194. KdpWritePhysicalMemory(
  195. IN PDBGKD_MANIPULATE_STATE m,
  196. IN PSTRING AdditionalData,
  197. IN PCONTEXT Context
  198. );
  199. VOID
  200. KdpGetContext(
  201. IN PDBGKD_MANIPULATE_STATE m,
  202. IN PSTRING AdditionalData,
  203. IN PCONTEXT Context
  204. );
  205. VOID
  206. KdpSetContext(
  207. IN PDBGKD_MANIPULATE_STATE m,
  208. IN PSTRING AdditionalData,
  209. IN PCONTEXT Context
  210. );
  211. VOID
  212. KdpWriteBreakpoint(
  213. IN PDBGKD_MANIPULATE_STATE m,
  214. IN PSTRING AdditionalData,
  215. IN PCONTEXT Context
  216. );
  217. VOID
  218. KdpRestoreBreakpoint(
  219. IN PDBGKD_MANIPULATE_STATE m,
  220. IN PSTRING AdditionalData,
  221. IN PCONTEXT Context
  222. );
  223. VOID
  224. KdpReadControlSpace(
  225. IN PDBGKD_MANIPULATE_STATE m,
  226. IN PSTRING AdditionalData,
  227. IN PCONTEXT Context
  228. );
  229. VOID
  230. KdpWriteControlSpace(
  231. IN PDBGKD_MANIPULATE_STATE m,
  232. IN PSTRING AdditionalData,
  233. IN PCONTEXT Context
  234. );
  235. VOID
  236. KdpReadIoSpace(
  237. IN PDBGKD_MANIPULATE_STATE m,
  238. IN PSTRING AdditionalData,
  239. IN PCONTEXT Context
  240. );
  241. VOID
  242. KdpReadMachineSpecificRegister(
  243. IN PDBGKD_MANIPULATE_STATE m,
  244. IN PSTRING AdditionalData,
  245. IN PCONTEXT Context
  246. );
  247. VOID
  248. KdpWriteIoSpace(
  249. IN PDBGKD_MANIPULATE_STATE m,
  250. IN PSTRING AdditionalData,
  251. IN PCONTEXT Context
  252. );
  253. VOID
  254. KdpWriteMachineSpecificRegister(
  255. IN PDBGKD_MANIPULATE_STATE m,
  256. IN PSTRING AdditionalData,
  257. IN PCONTEXT Context
  258. );
  259. VOID
  260. KdpSuspendBreakpoint (
  261. ULONG Handle
  262. );
  263. VOID
  264. KdpSuspendAllBreakpoints (
  265. VOID
  266. );
  267. VOID
  268. KdpRestoreAllBreakpoints (
  269. VOID
  270. );
  271. //
  272. // Define external references.
  273. //
  274. #define KDP_MESSAGE_BUFFER_SIZE 4096
  275. extern BREAKPOINT_ENTRY KdpBreakpointTable[BREAKPOINT_TABLE_SIZE];
  276. extern BOOLEAN KdpControlCPending;
  277. extern KSPIN_LOCK KdpDebuggerLock;
  278. extern PKDEBUG_ROUTINE KiDebugRoutine;
  279. extern PKDEBUG_SWITCH_ROUTINE KiDebugSwitchRoutine;
  280. extern KDP_BREAKPOINT_TYPE KdpBreakpointInstruction;
  281. extern UCHAR KdpMessageBuffer[KDP_MESSAGE_BUFFER_SIZE];
  282. extern ULONG KdpOweBreakpoint;
  283. extern ULONG KdpNextPacketIdToSend;
  284. extern ULONG KdpPacketIdExpected;
  285. extern LARGE_INTEGER KdPerformanceCounterRate;
  286. extern LARGE_INTEGER KdTimerStart;
  287. extern LARGE_INTEGER KdTimerStop;
  288. extern LARGE_INTEGER KdTimerDifference;
  289. typedef struct {
  290. ULONG Addr; // pc address of breakpoint
  291. ULONG Flags; // Flags bits
  292. ULONG Calls; // # of times traced routine called
  293. ULONG CallsLastCheck; // # of calls at last periodic (1s) check
  294. ULONG MaxCallsPerPeriod;
  295. ULONG MinInstructions; // largest number of instructions for 1 call
  296. ULONG MaxInstructions; // smallest # of instructions for 1 call
  297. ULONG TotalInstructions; // total instructions for all calls
  298. ULONG Handle; // handle in (regular) bpt table
  299. PVOID Thread; // Thread that's skipping this BP
  300. ULONG ReturnAddress; // return address (if not COUNTONLY)
  301. } DBGKD_INTERNAL_BREAKPOINT, *PDBGKD_INTERNAL_BREAKPOINT;
  302. #define DBGKD_MAX_INTERNAL_BREAKPOINTS 20
  303. extern DBGKD_INTERNAL_BREAKPOINT KdpInternalBPs[DBGKD_MAX_INTERNAL_BREAKPOINTS];
  304. //
  305. // Private procedure prototypes
  306. //
  307. VOID
  308. KdpInitCom(
  309. VOID
  310. );
  311. VOID
  312. KdpPortLock(
  313. VOID
  314. );
  315. VOID
  316. KdpPortUnlock(
  317. VOID
  318. );
  319. BOOLEAN
  320. KdpPollBreakInWithPortLock(
  321. VOID
  322. );
  323. USHORT
  324. KdpReceivePacketLeader (
  325. IN ULONG PacketType,
  326. OUT PULONG PacketLeader
  327. );
  328. #if DBG
  329. #include <stdio.h>
  330. #define DPRINT(s) KdpDprintf s
  331. VOID
  332. KdpDprintf(
  333. IN PCHAR f,
  334. ...
  335. );
  336. #else
  337. #define DPRINT(s)
  338. #endif