DbgMiniDump.cpp 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. #include "DbgMiniDump.h"
  2. #include <DbgHelp.h>
  3. USING_NS_BF;
  4. enum DbgMiniDumpFlags
  5. {
  6. DbgMiniDumpFlag_MiniDumpNormal = 0x00000000,
  7. DbgMiniDumpFlag_MiniDumpWithDataSegs = 0x00000001,
  8. DbgMiniDumpFlag_MiniDumpWithFullMemory = 0x00000002,
  9. DbgMiniDumpFlag_MiniDumpWithHandleData = 0x00000004,
  10. DbgMiniDumpFlag_MiniDumpFilterMemory = 0x00000008,
  11. DbgMiniDumpFlag_MiniDumpScanMemory = 0x00000010,
  12. DbgMiniDumpFlag_MiniDumpWithUnloadedModules = 0x00000020,
  13. DbgMiniDumpFlag_MiniDumpWithIndirectlyReferencedMemory = 0x00000040,
  14. DbgMiniDumpFlag_MiniDumpFilterModulePaths = 0x00000080,
  15. DbgMiniDumpFlag_MiniDumpWithProcessThreadData = 0x00000100,
  16. DbgMiniDumpFlag_MiniDumpWithPrivateReadWriteMemory = 0x00000200,
  17. DbgMiniDumpFlag_MiniDumpWithoutOptionalData = 0x00000400,
  18. DbgMiniDumpFlag_MiniDumpWithFullMemoryInfo = 0x00000800,
  19. DbgMiniDumpFlag_MiniDumpWithThreadInfo = 0x00001000,
  20. DbgMiniDumpFlag_MiniDumpWithCodeSegs = 0x00002000,
  21. DbgMiniDumpFlag_MiniDumpWithoutAuxiliaryState = 0x00004000,
  22. DbgMiniDumpFlag_MiniDumpWithFullAuxiliaryState = 0x00008000,
  23. DbgMiniDumpFlag_MiniDumpWithPrivateWriteCopyMemory = 0x00010000,
  24. DbgMiniDumpFlag_MiniDumpIgnoreInaccessibleMemory = 0x00020000,
  25. DbgMiniDumpFlag_MiniDumpWithTokenInformation = 0x00040000,
  26. DbgMiniDumpFlag_MiniDumpWithModuleHeaders = 0x00080000,
  27. DbgMiniDumpFlag_MiniDumpFilterTriage = 0x00100000,
  28. DbgMiniDumpFlag_MiniDumpValidTypeFlags = 0x001fffff
  29. };
  30. bool DbgMiniDump::StartLoad(const StringImpl& path)
  31. {
  32. if (!mMF.Open(path))
  33. return false;
  34. struct _Header
  35. {
  36. uint32 mSignature;
  37. uint32 mVersion;
  38. uint32 mNumberOfStreams;
  39. uint32 mStreamDirectoryRVA;
  40. uint32 mCheckSum;
  41. uint32 TimeDateStamp;
  42. uint64 Flags;
  43. };
  44. _Header& header = *(_Header*)((uint8*)mMF.mData);
  45. if (header.mSignature != 'PMDM')
  46. return false;
  47. mDirectory.mVals = (StreamDirectoryEntry*)((uint8*)mMF.mData + header.mStreamDirectoryRVA);
  48. mDirectory.mSize = header.mNumberOfStreams;
  49. return true;
  50. }
  51. int DbgMiniDump::GetTargetBitCount()
  52. {
  53. for (auto& dirEntry : mDirectory)
  54. {
  55. if (dirEntry.mStreamType == DbgMiniDumpStreamType_SystemInfo)
  56. {
  57. MINIDUMP_SYSTEM_INFO& sysInfo = *(MINIDUMP_SYSTEM_INFO*)((uint8*)mMF.mData + dirEntry.mDataRVA);
  58. if ((sysInfo.ProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) || (sysInfo.ProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64))
  59. return 64;
  60. if (sysInfo.ProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL)
  61. return 32;
  62. return 0;
  63. }
  64. }
  65. return 0;
  66. }