zoukankan      html  css  js  c++  java
  • Dump文件数据存储格式(一)

    我们已经了解了什么是Dump文件,它保存了什么数据,有什么作用,但它是如何存储的,数据格式是怎样的呢。下面简单说一下。

    一、总体结构

    二、文件头

    首先文件的最开始的32个字节是Dump文件的文件头,这里包含了Dump文件标识、格式版本、校验和、时间戳和一些标志,数据结构如下

    typedef struct _MINIDUMP_HEADER {

      ULONG32 Signature;
      ULONG32 Version;
      ULONG32 NumberOfStreams;
      RVA     StreamDirectoryRva;
      ULONG32 CheckSum;
      union {
        ULONG32 Reserved;
        ULONG32 TimeDateStamp;
      };
      ULONG64 Flags;
    } MINIDUMP_HEADER, *PMINIDUMP_HEADER

    上面的结构包含了很多信息,总共32个字节,存放在文件的最开始的位置,下面分别说下各成员:

    • Signature---文件标识
      4个字节,存放内容是"MDMP"字符串的ASSIC码。可以简单的读取文件的头4个字节是否等于"MDMP"来判断一个文件是否是Dump文件。
    • Version---Dump格式的版本
      低两字节是MiniDump的版本号,高两字节是一个特定整形值
    • NumberofStreams----文件里内存数据流的计数
      也就是MiniDump目录表的元素个数。dump文件是以流的形式保存内存数据,各个流的类型不一样。
    • StreamDirectoryRVA
      流目录表的文件偏移地址,从文件最开始处也就是地址0开始,那么要寻址流目录:0+StreamDirectoryRva(字节)
    • CheckSum
      文件校验和,可以为0
    • TimeDataStamp
      时间戳,文件的修改时间
    • Flags
      一个或多个MINIDUMP_TYPE的枚举值组成的标志,说明本文件里包含了哪些信息。

    三、流目录

    文件头过后紧接着的是流目录。通过文件头里的StreamDirectoryRVA字段决定我们可以快速定位到流目录在文件里的位置。

    我们可以看到流目录紧挨着文件头的尾部。
    流目录记录内存数据的流的摘要数据组成的数组,方便解析器进行解析和数据定位。数组元素由如下结构填充:

    typedef struct _MINIDUMP_DIRECTORY {
      ULONG32                      StreamType;
      MINIDUMP_LOCATION_DESCRIPTOR Location;
    } MINIDUMP_DIRECTORY, *PMINIDUMP_DIRECTORY;
    • StreamType---流类型
      这是一个4字节的MINIDUMP_STREAM_TYPE枚举类型的数据
      typedef enum _MINIDUMP_STREAM_TYPE {
        UnusedStream,
        ReservedStream0,
        ReservedStream1,
        ThreadListStream,
        ModuleListStream,
        MemoryListStream,
        ExceptionStream,
        SystemInfoStream,
        ThreadExListStream,
        Memory64ListStream,
        CommentStreamA,
        CommentStreamW,
        HandleDataStream,
        FunctionTableStream,
        UnloadedModuleListStream,
        MiscInfoStream,
        MemoryInfoListStream,
        ThreadInfoListStream,
        HandleOperationListStream,
        TokenStream,
        JavaScriptDataStream,
        SystemMemoryInfoStream,
        ProcessVmCountersStream,
        IptTraceStream,
        ThreadNamesStream,
        ceStreamNull,
        ceStreamSystemInfo,
        ceStreamException,
        ceStreamModuleList,
        ceStreamProcessList,
        ceStreamThreadList,
        ceStreamThreadContextList,
        ceStreamThreadCallStackList,
        ceStreamMemoryVirtualList,
        ceStreamMemoryPhysicalList,
        ceStreamBucketParameters,
        ceStreamProcessModuleMap,
        ceStreamDiagnosisList,
        LastReservedStream
      } MINIDUMP_STREAM_TYPE;
    • Location---流数据的位置信息
      位置信息也是由一个结构MINIDUMP_LOCATION_DESCRIPTOR来描述的,包含流数据大小和文件偏移地址
      typedef struct _MINIDUMP_LOCATION_DESCRIPTOR {
        ULONG32 DataSize;
        RVA     Rva;
      } MINIDUMP_LOCATION_DESCRIPTOR;

    通过上面的相关结构,我们可以得出,一个流目录项总供有12个字节,那么有多少个项呢,由文件头里的字段NumberOfStreams给出,比如

    我们就可以知道,流目录的大小=sizeof(MINIDUMP_DIRECTORY)*MINIDUMP_HEADER::NumberOfStreams。这个文件里的流目录的大小=12*17=204B

    ----未完待续

  • 相关阅读:
    .net 下webservice 的WebMethod的属性
    做一个项目,平时都用到哪些工具提高效率(James Li)
    Android之解析Android Map地图返回的Json数据
    歌词文件LRC的解析,可用于音乐播放器实现歌词同步操作
    Android之创建程序快捷方式
    Android之Bitmap使用心得(持续更新)
    Socket编程之旅(服务器与客户端沟通)
    Android之应用自定义相机拍照并且对拍照文字(英文)进行识别
    android之App widget实际应用Demo
    Android之创建实时文件夹
  • 原文地址:https://www.cnblogs.com/yilang/p/11113041.html
Copyright © 2011-2022 走看看