Annotation of mstools/samples/sdktools/image/symedit/cvexefmt.h, revision 1.1

1.1     ! root        1: /***    cvexefmt.h - format of CodeView information in exe
        !             2:  *
        !             3:  *      Structures, constants, etc. for reading CodeView information
        !             4:  *      from the executable.
        !             5:  *
        !             6:  */
        !             7: 
        !             8: 
        !             9: /***    The master copy of this file resides in the CodeView project.
        !            10:  *      All Microsoft projects are required to use the master copy without
        !            11:  *      modification.  Modification of the master version or a copy
        !            12:  *      without consultation with all parties concerned is extremely
        !            13:  *      risky.
        !            14:  *
        !            15:  */
        !            16: 
        !            17: 
        !            18: 
        !            19: 
        !            20: //  The following structures and constants describe the format of the
        !            21: //  CodeView Debug OMF for that will be accepted by CodeView 4.0 and
        !            22: //  later.  These are executables with signatures of NB05, NB06 and NB07.
        !            23: //  There is some confusion about the signatures NB03 and NB04 so none
        !            24: //  of the utilites will accept executables with these signatures.
        !            25: 
        !            26: //  All of the structures described below must start on a long word boundary
        !            27: //  to maintain natural alignment.  Pad space can be inserted during the
        !            28: //  write operation and the addresses adjusted without affecting the contents
        !            29: //  of the structures.
        !            30: 
        !            31: 
        !            32: //  Type of subsection entry.
        !            33: 
        !            34: #define sstModule           0x120
        !            35: #define sstTypes            0x121
        !            36: #define sstPublic           0x122
        !            37: #define sstPublicSym        0x123   // publics as symbol (waiting for link)
        !            38: #define sstSymbols          0x124
        !            39: #define sstAlignSym         0x125
        !            40: #define sstSrcLnSeg         0x126   // because link doesn't emit SrcModule
        !            41: #define sstSrcModule        0x127
        !            42: #define sstLibraries        0x128
        !            43: #define sstGlobalSym        0x129
        !            44: #define sstGlobalPub        0x12a
        !            45: #define sstGlobalTypes      0x12b
        !            46: #define sstMPC              0x12c
        !            47: #define sstSegMap           0x12d
        !            48: #define sstSegName          0x12e
        !            49: #define sstPreComp          0x12f   // precompiled types
        !            50: #define sstPreCompMap       0x130   // map precompiled types in global types
        !            51: #define sstOffsetMap16      0x131
        !            52: #define sstOffsetMap32      0x132
        !            53: #define sstFileIndex        0x133
        !            54: #define sstStaticSym        0x134
        !            55: 
        !            56: 
        !            57: 
        !            58: typedef enum OMFHash {
        !            59:     OMFHASH_NONE,           // no hashing
        !            60:     OMFHASH_SUMUC16,        // upper case sum of chars in 16 bit table
        !            61:     OMFHASH_SUMUC32,        // upper case sum of chars in 32 bit table
        !            62:     OMFHASH_ADDR16,         // sorted by increasing address in 16 bit table
        !            63:     OMFHASH_ADDR32          // sorted by increasing address in 32 bit table
        !            64: } OMFHASH;
        !            65: 
        !            66: //  CodeView Debug OMF signature.  The signature at the end of the file is
        !            67: //  a negative offset from the end of the file to another signature.  At
        !            68: //  the negative offset (base address) is another signature whose filepos
        !            69: //  field points to the first OMFDirHeader in a chain of directories.
        !            70: //  The NB05 signature is used by the link utility to indicated a completely
        !            71: //  unpacked file.  The NB06 signature is used by ilink to indicate that the
        !            72: //  executable has had CodeView information from an incremental link appended
        !            73: //  to the executable.  The NB07 signature is used by cvpack to indicate that
        !            74: //  the CodeView Debug OMF has been packed.  CodeView will only process
        !            75: //  executables with the NB07 signature.
        !            76: 
        !            77: 
        !            78: typedef struct OMFSignature {
        !            79:     char            Signature[4];   // "NB05", "NB06" or "NB07"
        !            80:     long            filepos;        // offset in file
        !            81: } OMFSignature;
        !            82: 
        !            83: 
        !            84: 
        !            85: //  directory information structure
        !            86: //  This structure contains the information describing the directory.
        !            87: //  It is pointed to by the signature at the base address or the directory
        !            88: //  link field of a preceeding directory.  The directory entries immediately
        !            89: //  follow this structure.
        !            90: 
        !            91: 
        !            92: typedef struct OMFDirHeader {
        !            93:     unsigned short  cbDirHeader;    // length of this structure
        !            94:     unsigned short  cbDirEntry;     // number of bytes in each directory entry
        !            95:     unsigned long   cDir;           // number of directorie entries
        !            96:     long            lfoNextDir;     // offset from base of next directory
        !            97:     unsigned long   flags;          // status flags
        !            98: } OMFDirHeader;
        !            99: 
        !           100: 
        !           101: 
        !           102: 
        !           103: //  directory structure
        !           104: //  The data in this structure is used to reference the data for each
        !           105: //  subsection of the CodeView Debug OMF information.  Tables that are
        !           106: //  not associated with a specific module will have a module index of
        !           107: //  oxffff.  These tables are the global types table, the global symbol
        !           108: //  table, the global public table and the library table.
        !           109: 
        !           110: 
        !           111: typedef struct OMFDirEntry {
        !           112:     unsigned short  SubSection;     // subsection type (sst...)
        !           113:     unsigned short  iMod;           // module index
        !           114:     long            lfo;            // large file offset of subsection
        !           115:     unsigned long   cb;             // number of bytes in subsection
        !           116: } OMFDirEntry;
        !           117: 
        !           118: 
        !           119: 
        !           120: //  information decribing each segment in a module
        !           121: 
        !           122: typedef struct OMFSegDesc {
        !           123:     unsigned short  Seg;            // segment index
        !           124:     unsigned short  pad;            // pad to maintain alignment
        !           125:     unsigned long   Off;            // offset of code in segment
        !           126:     unsigned long   cbSeg;          // number of bytes in segment
        !           127: } OMFSegDesc;
        !           128: 
        !           129: 
        !           130: 
        !           131: 
        !           132: //  per module information
        !           133: //  There is one of these subsection entries for each module
        !           134: //  in the executable.  The entry is generated by link/ilink.
        !           135: //  This table will probably require padding because of the
        !           136: //  variable length module name.
        !           137: 
        !           138: typedef struct OMFModule {
        !           139:     unsigned short  ovlNumber;      // overlay number
        !           140:     unsigned short  iLib;           // library that the module was linked from
        !           141:     unsigned short  cSeg;           // count of number of segments in module
        !           142:     char            Style[2];       // debugging style "CV"
        !           143:     OMFSegDesc      SegInfo[1];     // describes segments in module
        !           144:     char            Name[];         // length prefixed module name padded to
        !           145:                                     // long word boundary
        !           146: } OMFModule;
        !           147: 
        !           148: 
        !           149: 
        !           150: //  Symbol hash table format
        !           151: //  This structure immediately preceeds the global publics table
        !           152: //  and global symbol tables.
        !           153: 
        !           154: typedef struct  OMFSymHash {
        !           155:     unsigned short  symhash;        // symbol hash function index
        !           156:     unsigned short  addrhash;       // address hash function index
        !           157:     unsigned long   cbSymbol;       // length of symbol information
        !           158:     unsigned long   cbHSym;         // length of symbol hash data
        !           159:     unsigned long   cbHAddr;        // length of address hashdata
        !           160: } OMFSymHash;
        !           161: 
        !           162: 
        !           163: 
        !           164: //  Global types subsection format
        !           165: //  This structure immediately preceeds the global types table.
        !           166: //  The offsets in the typeOffset array are relative to the address
        !           167: //  of ctypes.  Each type entry following the typeOffset array must
        !           168: //  begin on a long word boundary.
        !           169: 
        !           170: typedef struct OMFTypeFlags {
        !           171:     unsigned long   sig     :8;
        !           172:     unsigned long   unused  :24;
        !           173: } OMFTypeFlags;
        !           174: 
        !           175: 
        !           176: typedef struct OMFGlobalTypes {
        !           177:     OMFTypeFlags    flags;
        !           178:     unsigned long   cTypes;         // number of types
        !           179:     unsigned long   typeOffset[];   // array of offsets to types
        !           180: } OMFGlobalTypes;
        !           181: 
        !           182: 
        !           183: 
        !           184: 
        !           185: //  Precompiled types mapping table
        !           186: //  This table should be ignored by all consumers except the incremental
        !           187: //  packer.
        !           188: 
        !           189: 
        !           190: typedef struct OMFPreCompMap {
        !           191:     unsigned short  FirstType;      // first precompiled type index
        !           192:     unsigned short  cTypes;         // number of precompiled types
        !           193:     unsigned long   signature;      // precompiled types signature
        !           194:     unsigned short  pad;
        !           195:     CV_typ_t        map[];          // mapping of precompiled types
        !           196: } OMFPreCompMap;
        !           197: 
        !           198: 
        !           199: 
        !           200: 
        !           201: //  Source line to address mapping table.
        !           202: //  This table is generated by the link/ilink utility from line number
        !           203: //  information contained in the object file OMF data.  This table contains
        !           204: //  only the code contribution for one segment from one source file.
        !           205: 
        !           206: 
        !           207: typedef struct OMFSourceLine {
        !           208:     unsigned short  Seg;            // linker segment index
        !           209:     unsigned short  cLnOff;         // count of line/offset pairs
        !           210:     unsigned long   offset[1];      // array of offsets in segment
        !           211:     unsigned short  lineNbr[1];     // array of line lumber in source
        !           212: } OMFSourceLine;
        !           213: 
        !           214: typedef OMFSourceLine FAR * LPSL;
        !           215: 
        !           216: 
        !           217: //  Source file description
        !           218: //  This table is generated by the linker
        !           219: 
        !           220: 
        !           221: typedef struct OMFSourceFile {
        !           222:     unsigned short  cSeg;           // number of segments from source file
        !           223:     unsigned short  reserved;       // reserved
        !           224:     unsigned long   baseSrcLn[1];   // base of OMFSourceLine tables
        !           225:                                     // this array is followed by array
        !           226:                                     // of segment start/end pairs followed by
        !           227:                                     // an array of linker indices
        !           228:                                     // for each segment in the file
        !           229:     unsigned short  cFName;         // length of source file name
        !           230:     char            Name;           // name of file padded to long boundary
        !           231: } OMFSourceFile;
        !           232: 
        !           233: typedef OMFSourceFile FAR * LPSF;
        !           234: 
        !           235: 
        !           236: //  Source line to address mapping header structure
        !           237: //  This structure describes the number and location of the
        !           238: //  OMFAddrLine tables for a module.  The offSrcLine entries are
        !           239: //  relative to the beginning of this structure.
        !           240: 
        !           241: 
        !           242: typedef struct OMFSourceModule {
        !           243:     unsigned short  cFile;          // number of OMFSourceTables
        !           244:     unsigned short  cSeg;           // number of segments in module
        !           245:     unsigned long   baseSrcFile[1]; // base of OMFSourceFile table
        !           246:                                     // this array is followed by array
        !           247:                                     // of segment start/end pairs followed
        !           248:                                     // by an array of linker indices
        !           249:                                     // for each segment in the module
        !           250: } OMFSourceModule;
        !           251: 
        !           252: typedef OMFSourceModule FAR * LPSM;
        !           253: 
        !           254: //  sstLibraries
        !           255: 
        !           256: typedef struct OMFLibrary {
        !           257:     unsigned char   cbLibs;     // count of library names
        !           258:     char            Libs[1];    // array of length prefixed lib names (first entry zero length)
        !           259: } OMFLibrary;
        !           260: 
        !           261: 
        !           262: //  Pcode support.  This subsection contains debug information generated
        !           263: //  by the MPC utility used to process Pcode executables.  Currently
        !           264: //  it contains a mapping table from segment index (zero based) to 
        !           265: //  frame paragraph.  MPC converts segmented exe's to non-segmented
        !           266: //  exe's for DOS support.  To avoid backpatching all CV info, this
        !           267: //  table is provided for the mapping.  Additional info may be provided
        !           268: //  in the future for profiler support.
        !           269: 
        !           270: typedef struct OMFMpcDebugInfo {
        !           271:     unsigned short  cSeg;       // number of segments in module
        !           272:     unsigned short  mpSegFrame[1];  // map seg (zero based) to frame 
        !           273: } OMFMpcDebugInfo;
        !           274: 
        !           275: //  The following structures and constants describe the format of the
        !           276: //  CodeView Debug OMF for linkers that emit executables with the NB02
        !           277: //  signature.  Current utilities with the exception of cvpack and cvdump
        !           278: //  will not accept or emit executables with the NB02 signature.  Cvdump
        !           279: //  will dump an unpacked executable with the NB02 signature.  Cvpack will
        !           280: //  read an executable with the NB02 signature but the packed executable
        !           281: //  will be written with the table format, contents and signature of NB07.
        !           282: 
        !           283: 
        !           284: 
        !           285: 
        !           286: 
        !           287: //  subsection type constants
        !           288: 
        !           289: #define SSTMODULE       0x101   // Basic info. about object module
        !           290: #define SSTPUBLIC       0x102   // Public symbols
        !           291: #define SSTTYPES        0x103   // Type information
        !           292: #define SSTSYMBOLS      0x104   // Symbol Data
        !           293: #define SSTSRCLINES     0x105   // Source line information
        !           294: #define SSTLIBRARIES    0x106   // Names of all library files used
        !           295: #define SSTIMPORTS      0x107   // Symbols for DLL fixups
        !           296: #define SSTCOMPACTED    0x108   // Compacted types section
        !           297: #define SSTSRCLNSEG     0x109   // Same as source lines, contains segment
        !           298: 
        !           299: 
        !           300: typedef struct DirEntry{
        !           301:     unsigned short  SubSectionType;
        !           302:     unsigned short  ModuleIndex;
        !           303:     long            lfoStart;
        !           304:     unsigned short  Size;
        !           305: } DirEntry;
        !           306: 
        !           307: 
        !           308: //  information decribing each segment in a module
        !           309: 
        !           310: typedef struct oldnsg {
        !           311:     unsigned short  Seg;            // segment index
        !           312:     unsigned short  Off;            // offset of code in segment
        !           313:     unsigned short  cbSeg;          // number of bytes in segment
        !           314: } oldnsg;
        !           315: 
        !           316: 
        !           317: //   old subsection module information
        !           318: 
        !           319: typedef struct oldsmd {
        !           320:     oldnsg          SegInfo;        // describes first segment in module
        !           321:     unsigned short  ovlNbr;         // overlay number
        !           322:     unsigned short  iLib;
        !           323:     unsigned char   cSeg;           // Number of segments in module
        !           324:     char            reserved;
        !           325:     unsigned char   cbName[1];      // length prefixed name of module
        !           326:     oldnsg          arnsg[];        // cSeg-1 structures exist for alloc text or comdat code
        !           327: } oldsmd;
        !           328: 
        !           329: typedef struct{
        !           330:     unsigned short  Seg;
        !           331:     unsigned long   Off;
        !           332:     unsigned long   cbSeg;
        !           333: } oldnsg32;
        !           334: 
        !           335: typedef struct {
        !           336:     oldnsg32        SegInfo;        // describes first segment in module
        !           337:     unsigned short  ovlNbr;         // overlay number
        !           338:     unsigned short  iLib;
        !           339:     unsigned char   cSeg;           // Number of segments in module
        !           340:     char            reserved;
        !           341:     unsigned char   cbName[1];      // length prefixed name of module
        !           342:     oldnsg32        arnsg[];        // cSeg-1 structures exist for alloc text or comdat code
        !           343: } oldsmd32;

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.