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