=====================================\r
The Module Information Stream\r
=====================================\r
+\r
+.. contents::\r
+ :local:\r
+\r
+.. _modi_stream_intro:\r
+\r
+Introduction\r
+============\r
+\r
+The Module Info Stream (henceforth referred to as the Modi stream) contains\r
+information about a single module (object file, import library, etc that\r
+contributes to the binary this PDB contains debug information about. There\r
+is one modi stream for each module, and the mapping between modi stream index\r
+and module is contained in the :doc:`DBI Stream <DbiStream>`. The modi stream\r
+for a single module contains line information for the compiland, as well as\r
+all CodeView information for the symbols defined in the compiland. Finally,\r
+there is a "global refs" substream which is not well understood.\r
+\r
+.. _modi_stream_layout:\r
+\r
+Stream Layout\r
+=============\r
+\r
+A modi stream is laid out as follows:\r
+\r
+\r
+.. code-block:: c++\r
+\r
+ struct ModiStream {\r
+ uint32_t Signature;\r
+ uint8_t Symbols[SymbolSize-4];\r
+ uint8_t C11LineInfo[C11Size];\r
+ uint8_t C13LineInfo[C13Size];\r
+ \r
+ uint32_t GlobalRefsSize;\r
+ uint8_t GlobalRefs[GlobalRefsSize];\r
+ };\r
+\r
+- **Signature** - Unknown. In practice only the value of ``4`` has been\r
+ observed. It is hypothesized that this value corresponds to the set of\r
+ ``CV_SIGNATURE_xx`` defines in ``cvinfo.h``, with the value of ``4``\r
+ meaning that this module has C13 line information (as opposed to C11 line\r
+ information). A corollary of this is that we expect to only ever see\r
+ C13 line info, and that we do not understand the format of C11 line info.\r
+ \r
+- **Symbols** - The :ref:`CodeView Symbol Substream <modi_symbol_substream>`.\r
+ ``SymbolSize`` is equal to the value of ``SymByteSize`` for the\r
+ corresponding module's entry in the :ref:`Module Info Substream <dbi_mod_info_substream>`\r
+ of the :doc:`DBI Stream <DbiStream>`.\r
+\r
+- **C11LineInfo** - A block containing CodeView line information in C11\r
+ format. ``C11Size`` is equal to the value of ``C11ByteSize`` from the\r
+ :ref:`Module Info Substream <dbi_mod_info_substream>` of the\r
+ :doc:`DBI Stream <DbiStream>`. If this value is ``0``, then C11 line\r
+ information is not present. As mentioned previously, the format of\r
+ C11 line info is not understood and we assume all line in modern PDBs\r
+ to be in C13 format.\r
+ \r
+- **C13LineInfo** - A block containing CodeView line information in C13\r
+ format. ``C13Size`` is equal to the value of ``C13ByteSize`` from the\r
+ :ref:`Module Info Substream <dbi_mod_info_substream>` of the\r
+ :doc:`DBI Stream <DbiStream>`. If this value is ``0``, then C13 line\r
+ information is not present.\r
+ \r
+- **GlobalRefs** - The meaning of this substream is not understood.\r
+\r
+.. _modi_symbol_substream:\r
+\r
+The CodeView Symbol Substream\r
+=============================\r
+\r
+The CodeView Symbol Substream. This is an array of variable length\r
+records describing the functions, variables, inlining information,\r
+and other symbols defined in the compiland. The entire array consumes\r
+``SymbolSize-4`` bytes. The format of a CodeView Symbol Record (and\r
+thusly, an array of CodeView Symbol Records) is described in\r
+:doc:`CodeViewSymbols`.\r