Source code of Windows XP (NT5)
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.

781 lines
24 KiB

  1. //----------------------------------------------------------------------------
  2. //
  3. // Dump file support.
  4. //
  5. // Copyright (C) Microsoft Corporation, 1999-2001.
  6. //
  7. //----------------------------------------------------------------------------
  8. #ifndef __DUMP_HPP__
  9. #define __DUMP_HPP__
  10. #define MI_UNLOADED_DRIVERS 50
  11. #define IS_DUMP_TARGET() \
  12. (g_DumpType < DTYPE_COUNT)
  13. #define IS_USER_DUMP() \
  14. (g_DumpType >= DTYPE_USER_FULL32 && g_DumpType <= DTYPE_USER_MINI)
  15. #define IS_KERNEL_DUMP() \
  16. (g_DumpType >= DTYPE_KERNEL_SUMMARY32 && g_DumpType <= DTYPE_KERNEL_FULL64)
  17. #define IS_KERNEL_SUMMARY_DUMP() \
  18. (g_DumpType == DTYPE_KERNEL_SUMMARY32 || \
  19. g_DumpType == DTYPE_KERNEL_SUMMARY64)
  20. #define IS_KERNEL_TRIAGE_DUMP() \
  21. (g_DumpType == DTYPE_KERNEL_TRIAGE32 || \
  22. g_DumpType == DTYPE_KERNEL_TRIAGE64)
  23. #define IS_KERNEL_FULL_DUMP() \
  24. (g_DumpType == DTYPE_KERNEL_FULL32 || \
  25. g_DumpType == DTYPE_KERNEL_FULL64)
  26. #define IS_USER_FULL_DUMP() \
  27. (g_DumpType == DTYPE_USER_FULL32 || g_DumpType == DTYPE_USER_FULL64)
  28. #define IS_USER_MINI_DUMP() \
  29. (g_DumpType == DTYPE_USER_MINI_PARTIAL || \
  30. g_DumpType == DTYPE_USER_MINI_FULL)
  31. #define IS_DUMP_WITH_MAPPED_IMAGES() \
  32. (IS_KERNEL_TRIAGE_DUMP() || g_DumpType == DTYPE_USER_MINI_PARTIAL)
  33. enum DTYPE
  34. {
  35. DTYPE_KERNEL_SUMMARY32,
  36. DTYPE_KERNEL_SUMMARY64,
  37. DTYPE_KERNEL_TRIAGE32,
  38. DTYPE_KERNEL_TRIAGE64,
  39. // Kernel full dumps must come after summary and triage
  40. // dumps so that the more specific dumps are identified first.
  41. DTYPE_KERNEL_FULL32,
  42. DTYPE_KERNEL_FULL64,
  43. DTYPE_USER_FULL32,
  44. DTYPE_USER_FULL64,
  45. DTYPE_USER_MINI_PARTIAL,
  46. DTYPE_USER_MINI_FULL,
  47. DTYPE_COUNT
  48. };
  49. enum
  50. {
  51. // Actual dump file.
  52. DUMP_INFO_DUMP,
  53. // Paging file information.
  54. DUMP_INFO_PAGE_FILE,
  55. DUMP_INFO_COUNT
  56. };
  57. extern ULONG64 g_DumpKiProcessors[MAXIMUM_PROCESSORS];
  58. extern ULONG64 g_DumpKiPcrBaseAddress;
  59. extern BOOL g_TriageDumpHasDebuggerData;
  60. extern DTYPE g_DumpType;
  61. extern ULONG g_DumpFormatFlags;
  62. extern EXCEPTION_RECORD64 g_DumpException;
  63. extern ULONG g_DumpExceptionFirstChance;
  64. extern ULONG g_DumpCacheGranularity;
  65. HRESULT AddDumpInfoFile(PCSTR FileName, ULONG Index, ULONG InitialView);
  66. void CloseDumpInfoFile(ULONG Index);
  67. void CloseDumpInfoFiles(void);
  68. HRESULT DmpInitialize(LPCSTR FileName);
  69. void DmpUninitialize(void);
  70. void ParseDumpFileCommand(void);
  71. HRESULT WriteDumpFile(PCSTR DumpFile, ULONG Qualifier, ULONG FormatFlags,
  72. PCSTR Comment);
  73. //----------------------------------------------------------------------------
  74. //
  75. // DumpTargetInfo hierarchy.
  76. //
  77. // Each kind of dump has its own target for methods that are
  78. // specific to the kind of dump.
  79. //
  80. //----------------------------------------------------------------------------
  81. class DumpTargetInfo : public TargetInfo
  82. {
  83. public:
  84. // TargetInfo.
  85. virtual void Uninitialize(void);
  86. virtual HRESULT ReadVirtual(
  87. IN ULONG64 Offset,
  88. IN PVOID Buffer,
  89. IN ULONG BufferSize,
  90. OUT OPTIONAL PULONG BytesRead
  91. );
  92. virtual HRESULT WriteVirtual(
  93. IN ULONG64 Offset,
  94. IN PVOID Buffer,
  95. IN ULONG BufferSize,
  96. OUT OPTIONAL PULONG BytesWritten
  97. );
  98. virtual HRESULT WaitForEvent(ULONG Flags, ULONG Timeout);
  99. //
  100. // DumpTargetInfo.
  101. //
  102. virtual HRESULT IdentifyDump(PULONG64 BaseMapSize) = 0;
  103. virtual void DumpDebug(void) = 0;
  104. virtual ULONG64 VirtualToOffset(ULONG64 Virt,
  105. PULONG File, PULONG Avail) = 0;
  106. // Base implementation returns E_NOTIMPL.
  107. virtual HRESULT Write(HANDLE hFile, ULONG FormatFlags, PCSTR Comment);
  108. };
  109. class KernelDumpTargetInfo : public DumpTargetInfo
  110. {
  111. public:
  112. // TargetInfo.
  113. virtual void Uninitialize(void);
  114. virtual HRESULT ReadControl(
  115. IN ULONG Processor,
  116. IN ULONG64 Offset,
  117. OUT PVOID Buffer,
  118. IN ULONG BufferSize,
  119. OUT OPTIONAL PULONG BytesRead
  120. );
  121. virtual HRESULT GetThreadIdByProcessor(
  122. IN ULONG Processor,
  123. OUT PULONG Id
  124. );
  125. virtual HRESULT GetThreadInfoDataOffset(PTHREAD_INFO Thread,
  126. ULONG64 ThreadHandle,
  127. PULONG64 Offset);
  128. virtual HRESULT GetProcessInfoDataOffset(PTHREAD_INFO Thread,
  129. ULONG Processor,
  130. ULONG64 ThreadData,
  131. PULONG64 Offset);
  132. virtual HRESULT GetThreadInfoTeb(PTHREAD_INFO Thread,
  133. ULONG Processor,
  134. ULONG64 ThreadData,
  135. PULONG64 Offset);
  136. virtual HRESULT GetProcessInfoPeb(PTHREAD_INFO Thread,
  137. ULONG Processor,
  138. ULONG64 ThreadData,
  139. PULONG64 Offset);
  140. virtual ULONG64 GetCurrentTimeDateN(void);
  141. virtual ULONG64 GetCurrentSystemUpTimeN(void);
  142. // KernelDumpTargetInfo.
  143. PUCHAR m_HeaderContext;
  144. virtual ULONG GetCurrentProcessor(void) = 0;
  145. HRESULT InitGlobals32(PMEMORY_DUMP32 Dump);
  146. HRESULT InitGlobals64(PMEMORY_DUMP64 Dump);
  147. void DumpHeader32(PDUMP_HEADER32 Header);
  148. void DumpHeader64(PDUMP_HEADER64 Header);
  149. void InitDumpHeader32(PDUMP_HEADER32 Header, PCSTR Comment,
  150. ULONG BugCheckCodeModifier);
  151. void InitDumpHeader64(PDUMP_HEADER64 Header, PCSTR Comment,
  152. ULONG BugCheckCodeModifier);
  153. };
  154. class KernelFullSumDumpTargetInfo : public KernelDumpTargetInfo
  155. {
  156. public:
  157. // TargetInfo.
  158. virtual HRESULT Initialize(void);
  159. virtual HRESULT ReadPhysical(
  160. IN ULONG64 Offset,
  161. OUT PVOID Buffer,
  162. IN ULONG BufferSize,
  163. OUT OPTIONAL PULONG BytesRead
  164. );
  165. virtual HRESULT WritePhysical(
  166. IN ULONG64 Offset,
  167. IN PVOID Buffer,
  168. IN ULONG BufferSize,
  169. OUT OPTIONAL PULONG BytesWritten
  170. );
  171. virtual HRESULT GetProcessorId
  172. (ULONG Processor, PDEBUG_PROCESSOR_IDENTIFICATION_ALL Id);
  173. virtual HRESULT ReadPageFile(ULONG PfIndex, ULONG64 PfOffset,
  174. PVOID Buffer, ULONG Size);
  175. virtual HRESULT GetTargetContext(
  176. ULONG64 Thread,
  177. PVOID Context
  178. );
  179. virtual HRESULT GetSelDescriptor(class MachineInfo* Machine,
  180. ULONG64 Thread, ULONG Selector,
  181. PDESCRIPTOR64 Desc);
  182. // DumpTargetInfo.
  183. virtual void DumpDebug(void);
  184. virtual ULONG64 VirtualToOffset(ULONG64 Virt,
  185. PULONG File, PULONG Avail);
  186. // KernelDumpTargetInfo.
  187. virtual ULONG GetCurrentProcessor(void);
  188. // KernelFullSumDumpTargetInfo.
  189. virtual ULONG64 PhysicalToOffset(ULONG64 Phys, PULONG Avail) = 0;
  190. ULONG64 m_ProvokingVirtAddr;
  191. };
  192. class KernelSummaryDumpTargetInfo : public KernelFullSumDumpTargetInfo
  193. {
  194. public:
  195. // TargetInfo.
  196. virtual void Uninitialize(void);
  197. // KernelSummaryDumpTargetInfo.
  198. PULONG m_LocationCache;
  199. ULONG64 m_PageBitmapSize;
  200. RTL_BITMAP m_PageBitmap;
  201. void ConstructLocationCache(ULONG BitmapSize,
  202. ULONG SizeOfBitMap,
  203. IN PULONG Buffer);
  204. ULONG64 SumPhysicalToOffset(ULONG HeaderSize, ULONG64 Phys, PULONG Avail);
  205. };
  206. class KernelSummary32DumpTargetInfo : public KernelSummaryDumpTargetInfo
  207. {
  208. public:
  209. // TargetInfo.
  210. virtual HRESULT Initialize(void);
  211. virtual void Uninitialize(void);
  212. virtual HRESULT ReadBugCheckData(PULONG Code, ULONG64 Args[4]);
  213. // DumpTargetInfo.
  214. virtual HRESULT IdentifyDump(PULONG64 BaseMapSize);
  215. virtual void DumpDebug(void);
  216. // KernelFullSumDumpTargetInfo.
  217. virtual ULONG64 PhysicalToOffset(ULONG64 Phys, PULONG Avail);
  218. // KernelSummary32DumpTargetInfo.
  219. PMEMORY_DUMP32 m_Dump;
  220. };
  221. class KernelSummary64DumpTargetInfo : public KernelSummaryDumpTargetInfo
  222. {
  223. public:
  224. // TargetInfo.
  225. virtual HRESULT Initialize(void);
  226. virtual void Uninitialize(void);
  227. virtual HRESULT ReadBugCheckData(PULONG Code, ULONG64 Args[4]);
  228. // DumpTargetInfo.
  229. virtual HRESULT IdentifyDump(PULONG64 BaseMapSize);
  230. virtual void DumpDebug(void);
  231. // KernelFullSumDumpTargetInfo.
  232. virtual ULONG64 PhysicalToOffset(ULONG64 Phys, PULONG Avail);
  233. // KernelSummary64DumpTargetInfo.
  234. PMEMORY_DUMP64 m_Dump;
  235. };
  236. class KernelTriageDumpTargetInfo : public KernelDumpTargetInfo
  237. {
  238. public:
  239. // TargetInfo.
  240. virtual void Uninitialize(void);
  241. virtual void NearestDifferentlyValidOffsets(ULONG64 Offset,
  242. PULONG64 NextOffset,
  243. PULONG64 NextPage);
  244. virtual HRESULT ReadVirtual(
  245. IN ULONG64 Offset,
  246. OUT PVOID Buffer,
  247. IN ULONG BufferSize,
  248. OUT OPTIONAL PULONG BytesRead
  249. );
  250. virtual HRESULT GetProcessorSystemDataOffset(
  251. IN ULONG Processor,
  252. IN ULONG Index,
  253. OUT PULONG64 Offset
  254. );
  255. virtual HRESULT GetTargetContext(
  256. ULONG64 Thread,
  257. PVOID Context
  258. );
  259. virtual HRESULT GetSelDescriptor(class MachineInfo* Machine,
  260. ULONG64 Thread, ULONG Selector,
  261. PDESCRIPTOR64 Desc);
  262. // DumpTargetInfo.
  263. virtual ULONG64 VirtualToOffset(ULONG64 Virt,
  264. PULONG File, PULONG Avail);
  265. // KernelDumpTargetInfo.
  266. virtual ULONG GetCurrentProcessor(void);
  267. // KernelTriageDumpTargetInfo.
  268. ULONG m_PrcbOffset;
  269. HRESULT MapMemoryRegions(ULONG PrcbOffset,
  270. ULONG ThreadOffset,
  271. ULONG ProcessOffset,
  272. ULONG64 TopOfStack,
  273. ULONG SizeOfCallStack,
  274. ULONG CallStackOffset,
  275. ULONG64 BStoreLimit,
  276. ULONG SizeOfBStore,
  277. ULONG BStoreOffset,
  278. ULONG64 DataPageAddress,
  279. ULONG DataPageOffset,
  280. ULONG DataPageSize,
  281. ULONG64 DebuggerDataAddress,
  282. ULONG DebuggerDataOffset,
  283. ULONG DebuggerDataSize,
  284. ULONG MmDataOffset,
  285. ULONG DataBlocksOffset,
  286. ULONG DataBlocksCount);
  287. };
  288. class KernelTriage32DumpTargetInfo : public KernelTriageDumpTargetInfo
  289. {
  290. public:
  291. // TargetInfo.
  292. virtual HRESULT Initialize(void);
  293. virtual void Uninitialize(void);
  294. virtual HRESULT ReadBugCheckData(PULONG Code, ULONG64 Args[4]);
  295. virtual ModuleInfo* GetModuleInfo(BOOL UserMode);
  296. virtual UnloadedModuleInfo* GetUnloadedModuleInfo(void);
  297. // DumpTargetInfo.
  298. virtual HRESULT IdentifyDump(PULONG64 BaseMapSize);
  299. virtual void DumpDebug(void);
  300. virtual HRESULT Write(HANDLE hFile, ULONG FormatFlags, PCSTR Comment);
  301. // KernelTriage32DumpTargetInfo.
  302. PMEMORY_DUMP32 m_Dump;
  303. };
  304. class KernelTriage64DumpTargetInfo : public KernelTriageDumpTargetInfo
  305. {
  306. public:
  307. // TargetInfo.
  308. virtual HRESULT Initialize(void);
  309. virtual void Uninitialize(void);
  310. virtual HRESULT ReadBugCheckData(PULONG Code, ULONG64 Args[4]);
  311. virtual ModuleInfo* GetModuleInfo(BOOL UserMode);
  312. virtual UnloadedModuleInfo* GetUnloadedModuleInfo(void);
  313. // DumpTargetInfo.
  314. virtual HRESULT IdentifyDump(PULONG64 BaseMapSize);
  315. virtual void DumpDebug(void);
  316. virtual HRESULT Write(HANDLE hFile, ULONG FormatFlags, PCSTR Comment);
  317. // KernelTriage64DumpTargetInfo.
  318. PMEMORY_DUMP64 m_Dump;
  319. };
  320. class KernelFull32DumpTargetInfo : public KernelFullSumDumpTargetInfo
  321. {
  322. public:
  323. // TargetInfo.
  324. virtual HRESULT Initialize(void);
  325. virtual void Uninitialize(void);
  326. virtual HRESULT ReadBugCheckData(PULONG Code, ULONG64 Args[4]);
  327. // DumpTargetInfo.
  328. virtual HRESULT IdentifyDump(PULONG64 BaseMapSize);
  329. virtual void DumpDebug(void);
  330. virtual HRESULT Write(HANDLE hFile, ULONG FormatFlags, PCSTR Comment);
  331. // KernelFullSumDumpTargetInfo.
  332. virtual ULONG64 PhysicalToOffset(ULONG64 Phys, PULONG Avail);
  333. // KernelFull32DumpTargetInfo.
  334. PMEMORY_DUMP32 m_Dump;
  335. };
  336. class KernelFull64DumpTargetInfo : public KernelFullSumDumpTargetInfo
  337. {
  338. public:
  339. // TargetInfo.
  340. virtual HRESULT Initialize(void);
  341. virtual void Uninitialize(void);
  342. virtual HRESULT ReadBugCheckData(PULONG Code, ULONG64 Args[4]);
  343. // DumpTargetInfo.
  344. virtual HRESULT IdentifyDump(PULONG64 BaseMapSize);
  345. virtual void DumpDebug(void);
  346. virtual HRESULT Write(HANDLE hFile, ULONG FormatFlags, PCSTR Comment);
  347. // KernelFullSumDumpTargetInfo.
  348. virtual ULONG64 PhysicalToOffset(ULONG64 Phys, PULONG Avail);
  349. // KernelFull64DumpTargetInfo.
  350. PMEMORY_DUMP64 m_Dump;
  351. };
  352. class UserDumpTargetInfo : public DumpTargetInfo
  353. {
  354. public:
  355. // TargetInfo.
  356. virtual void Uninitialize(void);
  357. virtual HRESULT GetThreadInfoDataOffset(PTHREAD_INFO Thread,
  358. ULONG64 ThreadHandle,
  359. PULONG64 Offset);
  360. virtual HRESULT GetProcessInfoDataOffset(PTHREAD_INFO Thread,
  361. ULONG Processor,
  362. ULONG64 ThreadData,
  363. PULONG64 Offset);
  364. virtual HRESULT GetThreadInfoTeb(PTHREAD_INFO Thread,
  365. ULONG Processor,
  366. ULONG64 ThreadData,
  367. PULONG64 Offset);
  368. virtual HRESULT GetProcessInfoPeb(PTHREAD_INFO Thread,
  369. ULONG Processor,
  370. ULONG64 ThreadData,
  371. PULONG64 Offset);
  372. virtual HRESULT GetSelDescriptor(class MachineInfo* Machine,
  373. ULONG64 Thread, ULONG Selector,
  374. PDESCRIPTOR64 Desc);
  375. // UserDumpTargetInfo.
  376. ULONG m_HighestMemoryRegion32;
  377. ULONG m_EventProcess;
  378. ULONG m_EventThread;
  379. ULONG m_ThreadCount;
  380. virtual HRESULT GetThreadInfo(ULONG Index,
  381. PULONG Id, PULONG Suspend, PULONG64 Teb) = 0;
  382. };
  383. class UserFullDumpTargetInfo : public UserDumpTargetInfo
  384. {
  385. public:
  386. // TargetInfo.
  387. virtual void Uninitialize(void);
  388. // DumpTargetInfo.
  389. virtual HRESULT Write(HANDLE hFile, ULONG FormatFlags, PCSTR Comment);
  390. // UserFullDumpTargetInfo.
  391. HRESULT GetBuildAndPlatform(ULONG MajorVersion, ULONG MinorVersion,
  392. PULONG BuildNumber, PULONG PlatformId);
  393. };
  394. class UserFull32DumpTargetInfo : public UserFullDumpTargetInfo
  395. {
  396. public:
  397. // TargetInfo.
  398. virtual HRESULT Initialize(void);
  399. virtual void Uninitialize(void);
  400. virtual HRESULT GetTargetContext(
  401. ULONG64 Thread,
  402. PVOID Context
  403. );
  404. virtual HRESULT GetImageVersionInformation(PCSTR ImagePath,
  405. ULONG64 ImageBase,
  406. PCSTR Item,
  407. PVOID Buffer,
  408. ULONG BufferSize,
  409. PULONG VerInfoSize);
  410. virtual HRESULT QueryMemoryRegion(PULONG64 Handle,
  411. BOOL HandleIsOffset,
  412. PMEMORY_BASIC_INFORMATION64 Info);
  413. // DumpTargetInfo.
  414. virtual HRESULT IdentifyDump(PULONG64 BaseMapSize);
  415. virtual void DumpDebug(void);
  416. virtual ULONG64 VirtualToOffset(ULONG64 Virt,
  417. PULONG File, PULONG Avail);
  418. // UserDumpTargetInfo.
  419. virtual HRESULT GetThreadInfo(ULONG Index,
  420. PULONG Id, PULONG Suspend, PULONG64 Teb);
  421. // UserFull32DumpTargetInfo.
  422. PUSERMODE_CRASHDUMP_HEADER32 m_Header;
  423. PMEMORY_BASIC_INFORMATION32 m_Memory;
  424. BOOL m_IgnoreGuardPages;
  425. BOOL VerifyModules(void);
  426. };
  427. class UserFull64DumpTargetInfo : public UserFullDumpTargetInfo
  428. {
  429. public:
  430. // TargetInfo.
  431. virtual HRESULT Initialize(void);
  432. virtual void Uninitialize(void);
  433. virtual HRESULT GetTargetContext(
  434. ULONG64 Thread,
  435. PVOID Context
  436. );
  437. virtual HRESULT GetImageVersionInformation(PCSTR ImagePath,
  438. ULONG64 ImageBase,
  439. PCSTR Item,
  440. PVOID Buffer,
  441. ULONG BufferSize,
  442. PULONG VerInfoSize);
  443. virtual HRESULT QueryMemoryRegion(PULONG64 Handle,
  444. BOOL HandleIsOffset,
  445. PMEMORY_BASIC_INFORMATION64 Info);
  446. // DumpTargetInfo.
  447. virtual HRESULT IdentifyDump(PULONG64 BaseMapSize);
  448. virtual void DumpDebug(void);
  449. virtual ULONG64 VirtualToOffset(ULONG64 Virt,
  450. PULONG File, PULONG Avail);
  451. // UserDumpTargetInfo.
  452. virtual HRESULT GetThreadInfo(ULONG Index,
  453. PULONG Id, PULONG Suspend, PULONG64 Teb);
  454. // UserFull64DumpTargetInfo.
  455. PUSERMODE_CRASHDUMP_HEADER64 m_Header;
  456. PMEMORY_BASIC_INFORMATION64 m_Memory;
  457. };
  458. class UserMiniDumpTargetInfo : public UserDumpTargetInfo
  459. {
  460. public:
  461. // TargetInfo.
  462. virtual HRESULT Initialize(void);
  463. virtual void Uninitialize(void);
  464. virtual void NearestDifferentlyValidOffsets(ULONG64 Offset,
  465. PULONG64 NextOffset,
  466. PULONG64 NextPage);
  467. virtual HRESULT ReadHandleData(
  468. IN ULONG64 Handle,
  469. IN ULONG DataType,
  470. OUT OPTIONAL PVOID Buffer,
  471. IN ULONG BufferSize,
  472. OUT OPTIONAL PULONG DataSize
  473. );
  474. virtual HRESULT GetProcessorId
  475. (ULONG Processor, PDEBUG_PROCESSOR_IDENTIFICATION_ALL Id);
  476. virtual PVOID FindDynamicFunctionEntry(MachineInfo* Machine,
  477. ULONG64 Address);
  478. virtual ULONG64 GetDynamicFunctionTableBase(MachineInfo* Machine,
  479. ULONG64 Address);
  480. virtual HRESULT GetTargetContext(
  481. ULONG64 Thread,
  482. PVOID Context
  483. );
  484. virtual ModuleInfo* GetModuleInfo(BOOL UserMode);
  485. virtual HRESULT GetImageVersionInformation(PCSTR ImagePath,
  486. ULONG64 ImageBase,
  487. PCSTR Item,
  488. PVOID Buffer,
  489. ULONG BufferSize,
  490. PULONG VerInfoSize);
  491. virtual HRESULT GetExceptionContext(PCROSS_PLATFORM_CONTEXT Context);
  492. virtual ULONG64 GetCurrentTimeDateN(void);
  493. // DumpTargetInfo.
  494. virtual HRESULT IdentifyDump(PULONG64 BaseMapSize);
  495. virtual void DumpDebug(void);
  496. virtual HRESULT Write(HANDLE hFile, ULONG FormatFlags, PCSTR Comment);
  497. // UserDumpTargetInfo.
  498. virtual HRESULT GetThreadInfo(ULONG Index,
  499. PULONG Id, PULONG Suspend, PULONG64 Teb);
  500. // UserMiniDumpTargetInfo.
  501. HRESULT WriteNonProcess(HANDLE File, ULONG FormatFlags, PCSTR Comment);
  502. PVOID IndexRva(RVA Rva, ULONG Size, PCSTR Title);
  503. PVOID IndexDirectory(ULONG Index, MINIDUMP_DIRECTORY UNALIGNED *Dir,
  504. PVOID* Store);
  505. MINIDUMP_THREAD_EX UNALIGNED *IndexThreads(ULONG Index)
  506. {
  507. // Only a MINIDUMP_THREAD's worth of data may be valid
  508. // here if the dump only contains MINIDUMP_THREADs.
  509. // Check m_ThreadStructSize in any place that it matters.
  510. return (MINIDUMP_THREAD_EX UNALIGNED *)
  511. (m_Threads + Index * m_ThreadStructSize);
  512. }
  513. PMINIDUMP_HEADER m_Header;
  514. MINIDUMP_SYSTEM_INFO UNALIGNED * m_SysInfo;
  515. ULONG m_ActualThreadCount;
  516. ULONG m_ThreadStructSize;
  517. PUCHAR m_Threads;
  518. MINIDUMP_MEMORY_LIST UNALIGNED * m_Memory;
  519. MINIDUMP_MEMORY64_LIST UNALIGNED * m_Memory64;
  520. RVA64 m_Memory64DataBase;
  521. MINIDUMP_MODULE_LIST UNALIGNED * m_Modules;
  522. MINIDUMP_EXCEPTION_STREAM UNALIGNED * m_Exception;
  523. MINIDUMP_HANDLE_DATA_STREAM UNALIGNED *m_Handles;
  524. MINIDUMP_FUNCTION_TABLE_STREAM UNALIGNED* m_FunctionTables;
  525. ULONG m_ImageType;
  526. };
  527. class UserMiniPartialDumpTargetInfo : public UserMiniDumpTargetInfo
  528. {
  529. public:
  530. // TargetInfo.
  531. virtual HRESULT Initialize(void);
  532. virtual HRESULT ReadVirtual(
  533. IN ULONG64 Offset,
  534. OUT PVOID Buffer,
  535. IN ULONG BufferSize,
  536. OUT OPTIONAL PULONG BytesRead
  537. );
  538. virtual HRESULT QueryMemoryRegion(PULONG64 Handle,
  539. BOOL HandleIsOffset,
  540. PMEMORY_BASIC_INFORMATION64 Info);
  541. // DumpTargetInfo.
  542. virtual HRESULT IdentifyDump(PULONG64 BaseMapSize);
  543. virtual ULONG64 VirtualToOffset(ULONG64 Virt,
  544. PULONG File, PULONG Avail);
  545. };
  546. class UserMiniFullDumpTargetInfo : public UserMiniDumpTargetInfo
  547. {
  548. public:
  549. // TargetInfo.
  550. virtual HRESULT Initialize(void);
  551. virtual HRESULT QueryMemoryRegion(PULONG64 Handle,
  552. BOOL HandleIsOffset,
  553. PMEMORY_BASIC_INFORMATION64 Info);
  554. // DumpTargetInfo.
  555. virtual HRESULT IdentifyDump(PULONG64 BaseMapSize);
  556. virtual ULONG64 VirtualToOffset(ULONG64 Virt,
  557. PULONG File, PULONG Avail);
  558. };
  559. // Indexed by DTYPE.
  560. extern DumpTargetInfo* g_DumpTargets[];
  561. //----------------------------------------------------------------------------
  562. //
  563. // ModuleInfo implementations.
  564. //
  565. //----------------------------------------------------------------------------
  566. class KernelTriage32ModuleInfo : public NtModuleInfo
  567. {
  568. public:
  569. virtual HRESULT Initialize(void);
  570. virtual HRESULT GetEntry(PMODULE_INFO_ENTRY Entry);
  571. private:
  572. KernelTriage32DumpTargetInfo* m_Target;
  573. };
  574. extern KernelTriage32ModuleInfo g_KernelTriage32ModuleIterator;
  575. class KernelTriage64ModuleInfo : public NtModuleInfo
  576. {
  577. public:
  578. virtual HRESULT Initialize(void);
  579. virtual HRESULT GetEntry(PMODULE_INFO_ENTRY Entry);
  580. private:
  581. KernelTriage64DumpTargetInfo* m_Target;
  582. };
  583. extern KernelTriage64ModuleInfo g_KernelTriage64ModuleIterator;
  584. class UserMiniModuleInfo : public NtModuleInfo
  585. {
  586. public:
  587. virtual HRESULT Initialize(void);
  588. virtual HRESULT GetEntry(PMODULE_INFO_ENTRY Entry);
  589. private:
  590. UserMiniDumpTargetInfo* m_Target;
  591. };
  592. extern UserMiniModuleInfo g_UserMiniModuleIterator;
  593. class KernelTriage32UnloadedModuleInfo : public UnloadedModuleInfo
  594. {
  595. public:
  596. virtual HRESULT Initialize(void);
  597. virtual HRESULT GetEntry(PSTR Name, PDEBUG_MODULE_PARAMETERS Params);
  598. private:
  599. KernelTriage32DumpTargetInfo* m_Target;
  600. PDUMP_UNLOADED_DRIVERS32 m_Cur, m_End;
  601. };
  602. extern KernelTriage32UnloadedModuleInfo g_KernelTriage32UnloadedModuleIterator;
  603. class KernelTriage64UnloadedModuleInfo : public UnloadedModuleInfo
  604. {
  605. public:
  606. virtual HRESULT Initialize(void);
  607. virtual HRESULT GetEntry(PSTR Name, PDEBUG_MODULE_PARAMETERS Params);
  608. private:
  609. KernelTriage64DumpTargetInfo* m_Target;
  610. PDUMP_UNLOADED_DRIVERS64 m_Cur, m_End;
  611. };
  612. extern KernelTriage64UnloadedModuleInfo g_KernelTriage64UnloadedModuleIterator;
  613. //----------------------------------------------------------------------------
  614. //
  615. // Temporary class to generate kernel minidump class
  616. //
  617. //----------------------------------------------------------------------------
  618. class CCrashDumpWrapper32
  619. {
  620. public:
  621. void WriteDriverList(BYTE *pb, TRIAGE_DUMP32 *ptdh);
  622. void WriteUnloadedDrivers(BYTE *pb);
  623. void WriteMmTriageInformation(BYTE *pb);
  624. };
  625. class CCrashDumpWrapper64
  626. {
  627. public:
  628. void WriteDriverList(BYTE *pb, TRIAGE_DUMP64 *ptdh);
  629. void WriteUnloadedDrivers(BYTE *pb);
  630. void WriteMmTriageInformation(BYTE *pb);
  631. };
  632. #endif // #ifndef __DUMP_HPP__