| # The Module Information Stream | |
| (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: | |
| ```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`. |