| 1 | /* | 
|---|
| 2 | ** | 
|---|
| 3 | ** OMF.H - Object Module Format structures | 
|---|
| 4 | ** | 
|---|
| 5 | */ | 
|---|
| 6 |  | 
|---|
| 7 | struct exehdr_rec { | 
|---|
| 8 | BYTE     signature[2];              // Must be "MZ" | 
|---|
| 9 | USHORT   image_len;                 // Image Length | 
|---|
| 10 | USHORT   pages;                     // Pages | 
|---|
| 11 | USHORT   reloc_items;               // Relocation table items | 
|---|
| 12 | USHORT   min_paragraphs;            // Mininum 16-bytes paragraphs | 
|---|
| 13 | USHORT   max_paragraphs;            // Maximum 16-bytes paragraphs | 
|---|
| 14 | USHORT   stack_pos;                 // Stack position | 
|---|
| 15 | USHORT   offset_in_sp;              // Offset in SP | 
|---|
| 16 | USHORT   checksum;                  // Checksum | 
|---|
| 17 | USHORT   offset_in_ip;              // Offset in IP | 
|---|
| 18 | USHORT   code_pos;                  // Code segment pos. | 
|---|
| 19 | USHORT   reloc_item_pos;            // Position of first relocation item | 
|---|
| 20 | USHORT   overlay_number;            // Overlay number | 
|---|
| 21 | BYTE     unused[8];                 // Unused bytes | 
|---|
| 22 | USHORT   oem_id;                    // OEM Identifier | 
|---|
| 23 | BYTE     oem_info[24];              // OEM Info | 
|---|
| 24 | ULONG    lexe_offset;               // Offset to linear header | 
|---|
| 25 | }; | 
|---|
| 26 |  | 
|---|
| 27 | struct lexehdr_rec { | 
|---|
| 28 | BYTE     signature[2];              // Must be "LX" | 
|---|
| 29 | BYTE     b_ord;                     // Byte ordering | 
|---|
| 30 | BYTE     w_ord;                     // Word ordering | 
|---|
| 31 | ULONG    format_level;              // Format level | 
|---|
| 32 | USHORT   cpu_type;                  // CPU Type | 
|---|
| 33 | USHORT   os_type;                   // Operating system | 
|---|
| 34 | ULONG    module_version;            // Module version | 
|---|
| 35 | ULONG    mod_flags;                 // Module flags | 
|---|
| 36 | ULONG    mod_pages;                 // Module pages | 
|---|
| 37 | ULONG    EIP_object;                // EIP Object no. | 
|---|
| 38 | ULONG    EIP;                       // EIP Value | 
|---|
| 39 | ULONG    ESP_object;                // ESP Object no | 
|---|
| 40 | ULONG    ESP;                       // ESP Value | 
|---|
| 41 | ULONG    page_size;                 // Page size | 
|---|
| 42 | ULONG    page_ofs_shift;            // Page offset shift | 
|---|
| 43 | ULONG    fixup_sect_size;           // Fixup section size | 
|---|
| 44 | ULONG    fixup_sect_checksum;       // Fixup section checksum | 
|---|
| 45 | ULONG    loader_sect_size;          // Loader section size | 
|---|
| 46 | ULONG    loader_sect_checksum;      // Loader section checksum | 
|---|
| 47 | ULONG    obj_table_ofs;             // Object table offset | 
|---|
| 48 | ULONG    obj_count;                 // Object count | 
|---|
| 49 | ULONG    obj_page_tab_ofs;          // Object page table offset | 
|---|
| 50 | ULONG    obj_iter_page_ofs;         // Object iteration pages offset | 
|---|
| 51 | ULONG    res_tab_ofs;               // Resource table offset | 
|---|
| 52 | ULONG    res_table_entries;         // Resource table entries | 
|---|
| 53 | ULONG    res_name_tab_ofs;          // Resident name table offset; | 
|---|
| 54 | ULONG    ent_tab_ofs;               // Entry table offset | 
|---|
| 55 | ULONG    mod_dir_ofs;               // Module directives offset | 
|---|
| 56 | ULONG    mod_dir_count;             // Number of module directives | 
|---|
| 57 | ULONG    fixup_page_tab_ofs;        // Fixup page table offset | 
|---|
| 58 | ULONG    fixup_rec_tab_ofs;         // Fixup record table offset | 
|---|
| 59 | ULONG    imp_tab_ofs;               // Import module table offset | 
|---|
| 60 | ULONG    imp_mod_entries;           // Import module entries | 
|---|
| 61 | ULONG    imp_proc_tab_ofs;          // Import proc table offset | 
|---|
| 62 | ULONG    per_page_check_ofs;        // Per page checksum offset | 
|---|
| 63 | ULONG    data_page_offset;          // Data pages offset | 
|---|
| 64 | ULONG    preload_page_count;        // Preload pages count | 
|---|
| 65 | ULONG    nonres_tab_ofs;            // Nonresident name table offset | 
|---|
| 66 | ULONG    nonres_tab_len;            // Nonresident name table len | 
|---|
| 67 | ULONG    nonres_tab_check;          // Nonresident tables checksum | 
|---|
| 68 | ULONG    auto_ds_objectno;          // Auto DS object number | 
|---|
| 69 | ULONG    debug_info_ofs;            // Debug info offset | 
|---|
| 70 | ULONG    debug_info_len;            // Debug info length | 
|---|
| 71 | ULONG    inst_preload_count;        // Instance preload count | 
|---|
| 72 | ULONG    inst_demand_count;         // Instance demand count | 
|---|
| 73 | ULONG    heapsize;                  // Heap size | 
|---|
| 74 | ULONG    stacksize;                 // Stack size | 
|---|
| 75 | }; | 
|---|
| 76 |  | 
|---|
| 77 | struct debug_head_rec { | 
|---|
| 78 | BYTE signature[3];                  // Debug signature | 
|---|
| 79 | BYTE type;                          // Debug info type | 
|---|
| 80 | }; | 
|---|
| 81 |  | 
|---|
| 82 | struct dir_inf_rec { | 
|---|
| 83 | USHORT   dirstruct_size;            // Size of directory structure | 
|---|
| 84 | USHORT   number_of_entries;         // Number of dnt_rec's in the array | 
|---|
| 85 | USHORT   unknown;                   // Unknown data | 
|---|
| 86 | // Followed by an array of dnt_rec structures | 
|---|
| 87 | }; | 
|---|
| 88 |  | 
|---|
| 89 | struct dnt_rec { | 
|---|
| 90 | USHORT   subsect_type;              // sst Subsection type | 
|---|
| 91 | USHORT   mod_index;                 // Module index (1-based) | 
|---|
| 92 | ULONG    offset;                    // Offset of start of section | 
|---|
| 93 | ULONG    size;                      // Size of section | 
|---|
| 94 | }; | 
|---|
| 95 |  | 
|---|
| 96 | // Modules subsection | 
|---|
| 97 | struct modules_rec { | 
|---|
| 98 | USHORT   code_seg_base;             // Code segment base | 
|---|
| 99 | ULONG    code_seg_offset;           // Code segment offset | 
|---|
| 100 | ULONG    code_seg_len;              // Code segment length | 
|---|
| 101 | USHORT   overlay_no;                // Overlay number | 
|---|
| 102 | USHORT   lib_idx;                   // Index into library section or 0 | 
|---|
| 103 | BYTE     segments;                  // Number of segments | 
|---|
| 104 | BYTE     reserved; | 
|---|
| 105 | BYTE     debug_style[2];            // "HL" for HLL, "CV" or 0 for CodeView | 
|---|
| 106 | BYTE     debug_version[2];          // 00 01 or 00 03 for HLL, 00 00 for CV | 
|---|
| 107 | BYTE     name_len;                  // Length of name (which follows) | 
|---|
| 108 | }; | 
|---|
| 109 |  | 
|---|
| 110 | // Publics subsection | 
|---|
| 111 | struct publics_rec { | 
|---|
| 112 | ULONG    offset;                    // Offset | 
|---|
| 113 | USHORT   segment;                   // Segment | 
|---|
| 114 | USHORT   type;                      // Type index | 
|---|
| 115 | BYTE     name_len;                  // Length of name (wich follows) | 
|---|
| 116 | }; | 
|---|
| 117 |  | 
|---|
| 118 | #if 0 | 
|---|
| 119 | // Linenumbers header | 
|---|
| 120 | struct linhead_rec { | 
|---|
| 121 | BYTE     id;                        // 0x95 for flat mem, 32 bit progs | 
|---|
| 122 | USHORT   length;                    // Record length | 
|---|
| 123 | USHORT   base_group;                // Base group | 
|---|
| 124 | USHORT   base_segment;              // Base segment | 
|---|
| 125 | }; | 
|---|
| 126 | #endif | 
|---|
| 127 |  | 
|---|
| 128 | // First linenumber record | 
|---|
| 129 | struct linfirst_rec { | 
|---|
| 130 | USHORT   lineno;                    // Line number (0) | 
|---|
| 131 | BYTE     entry_type;                // Entry type | 
|---|
| 132 | BYTE     reserved;                  // Reserved | 
|---|
| 133 | USHORT   entries_count;             // Number of table entries | 
|---|
| 134 | USHORT   segment_no;                // Segment number | 
|---|
| 135 | ULONG    filename_tabsize;          // File names table size | 
|---|
| 136 | }; | 
|---|
| 137 |  | 
|---|
| 138 |  | 
|---|
| 139 | // Source line numbers | 
|---|
| 140 | struct linsource_rec { | 
|---|
| 141 | USHORT   source_line;               // Source file line number | 
|---|
| 142 | USHORT   source_idx;                // Source file index | 
|---|
| 143 | ULONG    offset;                    // Offset into segment | 
|---|
| 144 | }; | 
|---|
| 145 |  | 
|---|
| 146 |  | 
|---|
| 147 | // Listing statement numbers | 
|---|
| 148 | struct linlist_rec { | 
|---|
| 149 | ULONG    list_line;                 // Listing file linenumber | 
|---|
| 150 | ULONG    statement;                 // Listing file statement number | 
|---|
| 151 | ULONG    offset;                    // Offset into segment | 
|---|
| 152 | }; | 
|---|
| 153 |  | 
|---|
| 154 |  | 
|---|
| 155 | // Source and Listing statement numbers | 
|---|
| 156 | struct linsourcelist_rec { | 
|---|
| 157 | USHORT   source_line;               // Source file line number | 
|---|
| 158 | USHORT   source_idx;                // Source file index | 
|---|
| 159 | ULONG    list_line;                 // Listing file linenumber | 
|---|
| 160 | ULONG    statement;                 // Listing file statement number | 
|---|
| 161 | ULONG    offset;                    // Offset into segment | 
|---|
| 162 | }; | 
|---|
| 163 |  | 
|---|
| 164 |  | 
|---|
| 165 | // Path table | 
|---|
| 166 | struct pathtab_rec { | 
|---|
| 167 | ULONG    offset;                    // Offset into segment | 
|---|
| 168 | USHORT   path_code;                 // Path code | 
|---|
| 169 | USHORT   source_idx;                // Source file index | 
|---|
| 170 | }; | 
|---|
| 171 |  | 
|---|
| 172 |  | 
|---|
| 173 | // File names table | 
|---|
| 174 | struct filenam_rec { | 
|---|
| 175 | ULONG    first_char;                // First displayable char in list file | 
|---|
| 176 | ULONG    disp_chars;                // Number of displayable chars in list line | 
|---|
| 177 | ULONG    filecount;                 // Number of source/listing files | 
|---|
| 178 | }; | 
|---|
| 179 |  | 
|---|
| 180 |  | 
|---|
| 181 | // Symbol types | 
|---|
| 182 | #define SYM_BEGIN          0x00        // Begin block | 
|---|
| 183 | #define SYM_PROC           0x01        // Function | 
|---|
| 184 | #define SYM_END            0x02        // End block of function | 
|---|
| 185 | #define SYM_AUTO           0x04        // Auto variable | 
|---|
| 186 | #define SYM_STATIC         0x05        // Static variable | 
|---|
| 187 | #define SYM_LABEL          0x0B        // Label | 
|---|
| 188 | #define SYM_WITH           0x0C        // With start symbol (not used) | 
|---|
| 189 | #define SYM_REG            0x0D        // Register variable | 
|---|
| 190 | #define SYM_CONST          0x0E        // Constant | 
|---|
| 191 | #define SYM_ENTRY          0x0F        // Secondary entry (not in C) | 
|---|
| 192 | #define SYM_SKIP           0x10        // For incremental linking (not used) | 
|---|
| 193 | #define SYM_CHANGESEG      0x11        // Change segment (#pragma alloc_text) | 
|---|
| 194 | #define SYM_TYPEDEF        0x12        // Typedef variable | 
|---|
| 195 | #define SYM_PUBLIC         0x13        // Public reference | 
|---|
| 196 | #define SYM_MEMBER         0x14        // Member of minor or major structure | 
|---|
| 197 | #define SYM_BASED          0x15        // Based variable | 
|---|
| 198 | #define SYM_TAG            0x16        // Tag in struct, union, enum ... | 
|---|
| 199 | #define SYM_TABLE          0x17        // Table (used in RPG - not C) | 
|---|
| 200 | #define SYM_MAP            0x18        // Map variable (extern in C) | 
|---|
| 201 | #define SYM_CLASS          0x19        // Class symbol (C++) | 
|---|
| 202 | #define SYM_MEMFUNC        0x1A        // Member function | 
|---|
| 203 | #define SYM_AUTOSCOPE      0x1B        // Scoped auto for C++ (not used) | 
|---|
| 204 | #define SYM_STATICSCOPE    0x1C        // scoped static for C++ (not used) | 
|---|
| 205 | #define SYM_CPPPROC        0x1D        // C++ Proc | 
|---|
| 206 | #define SYM_CPPSTAT        0x1E        // C++ Static var | 
|---|
| 207 | #define SYM_COMP           0x40        // Compiler information | 
|---|
| 208 |  | 
|---|
| 209 |  | 
|---|
| 210 | // Symbolic begin record | 
|---|
| 211 | struct symbegin_rec { | 
|---|
| 212 | ULONG    offset;                    // Segment offset | 
|---|
| 213 | ULONG    length;                    // Length of block | 
|---|
| 214 | BYTE     name_len;                  // Length of block name | 
|---|
| 215 | // Block name follows | 
|---|
| 216 | }; | 
|---|
| 217 |  | 
|---|
| 218 |  | 
|---|
| 219 | // Symbolic auto var record | 
|---|
| 220 | struct symauto_rec { | 
|---|
| 221 | ULONG    stack_offset;              // Stack offset | 
|---|
| 222 | USHORT   type_idx;                  // Type index | 
|---|
| 223 | BYTE     name_len;                  // Length of name | 
|---|
| 224 | // Var name follows | 
|---|
| 225 | }; | 
|---|
| 226 |  | 
|---|
| 227 |  | 
|---|
| 228 | // Symbolic procedure record | 
|---|
| 229 | struct symproc_rec { | 
|---|
| 230 | ULONG    offset;                    // Segment offset | 
|---|
| 231 | USHORT   type_idx;                  // Type index | 
|---|
| 232 | ULONG    length;                    // Length of procedure | 
|---|
| 233 | USHORT   pro_len;                   // Length of prologue | 
|---|
| 234 | ULONG    pro_bodylen;               // Length of prologue + body | 
|---|
| 235 | USHORT   class_type;                // Class type | 
|---|
| 236 | BYTE     near_far;                  // Near or far | 
|---|
| 237 | BYTE     name_len;                  // Length of name | 
|---|
| 238 | // Function name follows | 
|---|
| 239 | }; | 
|---|
| 240 |  | 
|---|
| 241 |  | 
|---|
| 242 | // Symbolic static var record | 
|---|
| 243 | struct symstatic_rec { | 
|---|
| 244 | ULONG    offset;                    // Segment offset | 
|---|
| 245 | USHORT   segaddr;                   // Segment address | 
|---|
| 246 | USHORT   type_idx;                  // Type index | 
|---|
| 247 | BYTE     name_len;                  // Length of name | 
|---|
| 248 | // Var name follows | 
|---|
| 249 | }; | 
|---|
| 250 |  | 
|---|
| 251 |  | 
|---|
| 252 | // Symbolic label var record | 
|---|
| 253 | struct symlabel_rec { | 
|---|
| 254 | ULONG    offset;                    // Segment offset | 
|---|
| 255 | BYTE     near_far;                  // Near or far | 
|---|
| 256 | BYTE     name_len;                  // Length of name | 
|---|
| 257 | // Var name follows | 
|---|
| 258 | }; | 
|---|
| 259 |  | 
|---|
| 260 | // Symbolic register var record | 
|---|
| 261 | struct symreg_rec { | 
|---|
| 262 | USHORT   type_idx;                  // Type index | 
|---|
| 263 | BYTE     reg_no;                    // Register number | 
|---|
| 264 | BYTE     name_len;                  // Length of name | 
|---|
| 265 | // Var name follows | 
|---|
| 266 | }; | 
|---|
| 267 |  | 
|---|
| 268 | // Symbolic change-segment record | 
|---|
| 269 | struct symseg_rec { | 
|---|
| 270 | USHORT   seg_no;                    // Segment number | 
|---|
| 271 | }; | 
|---|
| 272 |  | 
|---|
| 273 | // Symbolic typedef record | 
|---|
| 274 | struct symtypedef_rec { | 
|---|
| 275 | USHORT   type_idx;                  // Type index | 
|---|
| 276 | BYTE     name_len;                  // Length of name | 
|---|
| 277 | // Name follows | 
|---|
| 278 | }; | 
|---|
| 279 |  | 
|---|
| 280 | // Symbolic public record | 
|---|
| 281 | struct sympublic_rec { | 
|---|
| 282 | ULONG    offset;                    // Segment offset | 
|---|
| 283 | USHORT   segaddr;                   // Segment address | 
|---|
| 284 | USHORT   type_idx;                  // Type index | 
|---|
| 285 | BYTE     name_len;                  // Length of name | 
|---|
| 286 | // Name follows | 
|---|
| 287 | }; | 
|---|
| 288 |  | 
|---|
| 289 | // Symbolic member record | 
|---|
| 290 | struct symmember_rec { | 
|---|
| 291 | ULONG    offset;                    // Offset to subrecord | 
|---|
| 292 | BYTE     name_len;                  // Length of name | 
|---|
| 293 | // Name follows | 
|---|
| 294 | }; | 
|---|
| 295 |  | 
|---|
| 296 | // Symbolic based record | 
|---|
| 297 | struct symbased_rec { | 
|---|
| 298 | ULONG    offset;                    // Offset to subrecord | 
|---|
| 299 | USHORT   type_idx;                  // Type index | 
|---|
| 300 | BYTE     name_len;                  // Length of name | 
|---|
| 301 | // Name follows | 
|---|
| 302 | }; | 
|---|
| 303 |  | 
|---|
| 304 | // Symbolic tag record | 
|---|
| 305 | struct symtag_rec { | 
|---|
| 306 | USHORT   type_idx;                  // Type index | 
|---|
| 307 | BYTE     name_len;                  // Length of name | 
|---|
| 308 | // Name follows | 
|---|
| 309 | }; | 
|---|
| 310 |  | 
|---|
| 311 |  | 
|---|
| 312 | // Symbolic table record | 
|---|
| 313 | struct symtable_rec { | 
|---|
| 314 | ULONG    offset;                    // Segment offset | 
|---|
| 315 | USHORT   segaddr;                   // Segment address | 
|---|
| 316 | USHORT   type_idx;                  // Type index | 
|---|
| 317 | ULONG    idx_ofs;                   // Index offset to subrecord | 
|---|
| 318 | BYTE     name_len;                  // Length of name | 
|---|
| 319 | // Name follows | 
|---|
| 320 | }; | 
|---|
| 321 |  | 
|---|
| 322 |  | 
|---|
| 323 | // Type record | 
|---|
| 324 | struct type_rec { | 
|---|
| 325 | USHORT   length;                    // Length of sub-record | 
|---|
| 326 | BYTE     type;                      // Sub-record type | 
|---|
| 327 | BYTE     type_qual;                 // Type qualifier | 
|---|
| 328 | }; | 
|---|
| 329 |  | 
|---|
| 330 |  | 
|---|
| 331 |  | 
|---|
| 332 | // Types | 
|---|
| 333 | #define TYPE_CLASS         0x40        // Class | 
|---|
| 334 | #define TYPE_BASECLASS     0x41        // Base class | 
|---|
| 335 | #define TYPE_FRIEND        0x42        // Friend | 
|---|
| 336 | #define TYPE_CLASSDEF      0x43        // Class definition | 
|---|
| 337 | #define TYPE_MEMBERFUNC    0x45        // Member function | 
|---|
| 338 | #define TYPE_CLASSMEMBER   0x46        // Class member | 
|---|
| 339 | #define TYPE_REF           0x48        // Reference | 
|---|
| 340 | #define TYPE_MEMBERPTR     0x49        // Member pointer | 
|---|
| 341 | #define TYPE_SCALARS       0x51        // Scalars | 
|---|
| 342 | #define TYPE_SET           0x52        // Set | 
|---|
| 343 | #define TYPE_ENTRY         0x53        // Entry | 
|---|
| 344 | #define TYPE_FUNCTION      0x54        // Function | 
|---|
| 345 | #define TYPE_AREA          0x55        // Area | 
|---|
| 346 | #define TYPE_LOGICAL       0x56        // Logical | 
|---|
| 347 | #define TYPE_STACK         0x57        // Stack | 
|---|
| 348 | #define TYPE_MACRO         0x59        // Macro | 
|---|
| 349 | #define TYPE_BITSTRING     0x5C        // Bit string | 
|---|
| 350 | #define TYPE_USERDEF       0x5D        // User defined | 
|---|
| 351 | #define TYPE_CHARSTR       0x60        // Character string | 
|---|
| 352 | #define TYPE_PICTURE       0x61        // Picture | 
|---|
| 353 | #define TYPE_GRAPHIC       0x62        // Graphic | 
|---|
| 354 | #define TYPE_FORMATLAB     0x65        // Format label | 
|---|
| 355 | #define TYPE_FILE          0x67        // File | 
|---|
| 356 | #define TYPE_SUBRANGE      0x6F        // Subrange | 
|---|
| 357 | #define TYPE_CODELABEL     0x72        // Code label | 
|---|
| 358 | #define TYPE_PROCEDURE     0x75        // Procedure | 
|---|
| 359 | #define TYPE_ARRAY         0x78        // Array | 
|---|
| 360 | #define TYPE_STRUCT        0x79        // Structure / Union / Record | 
|---|
| 361 | #define TYPE_POINTER       0x7A        // Pointer | 
|---|
| 362 | #define TYPE_ENUM          0x7B        // Enum | 
|---|
| 363 | #define TYPE_LIST          0x7F        // List | 
|---|
| 364 |  | 
|---|
| 365 |  | 
|---|
| 366 | // Type userdef | 
|---|
| 367 | struct type_userdefrec { | 
|---|
| 368 | BYTE     FID_index;                 // Field ID | 
|---|
| 369 | USHORT   type_index;                // Type index | 
|---|
| 370 | BYTE     FID_string;                // String ID | 
|---|
| 371 | BYTE     name_len;                  // Length of name which follows | 
|---|
| 372 | }; | 
|---|
| 373 |  | 
|---|
| 374 |  | 
|---|
| 375 | // Type function | 
|---|
| 376 | struct type_funcrec { | 
|---|
| 377 | USHORT   params; | 
|---|
| 378 | USHORT   max_params; | 
|---|
| 379 | BYTE     FID_index;                 // Field ID | 
|---|
| 380 | USHORT   type_index;                // Type index of return value | 
|---|
| 381 | BYTE     FID_index1;                // String ID | 
|---|
| 382 | USHORT   typelist_index;            // Index of list of params | 
|---|
| 383 | }; | 
|---|
| 384 |  | 
|---|
| 385 |  | 
|---|
| 386 | // Type struct | 
|---|
| 387 | struct type_structrec { | 
|---|
| 388 | ULONG    size;                      // Size of structure | 
|---|
| 389 | USHORT   field_count;               // Number of fields in structure | 
|---|
| 390 | BYTE     FID_index;                 // Field ID | 
|---|
| 391 | USHORT   type_list_idx;             // Index to type list | 
|---|
| 392 | BYTE     FID_index1;                // Field ID | 
|---|
| 393 | USHORT   type_name_idx;             // Index to names / offsets | 
|---|
| 394 | BYTE     dont_know;                 // Haven't a clue, but it seems to be needed | 
|---|
| 395 | BYTE     name_len;                  // Length of structure name which follows | 
|---|
| 396 | }; | 
|---|
| 397 |  | 
|---|
| 398 | // Type list, type qualifier 1: contains types for structures | 
|---|
| 399 | // This record is repeated for the number of items in the structure definition | 
|---|
| 400 | struct type_list1 { | 
|---|
| 401 | BYTE     FID_index;                 // Field identifier for index | 
|---|
| 402 | USHORT   type_index;                // Type index. | 
|---|
| 403 | }; | 
|---|
| 404 |  | 
|---|
| 405 | // Type list, type qualifier 2: contains names and offsets for structure items | 
|---|
| 406 | // This record is repeated for the number of items in the structure definition | 
|---|
| 407 | struct type_list2 { | 
|---|
| 408 | BYTE     FID_string;                // String identifier | 
|---|
| 409 | BYTE     name_len;                  // Length of name which follows | 
|---|
| 410 | }; | 
|---|
| 411 |  | 
|---|
| 412 | // Type list, subrecord to the above, contains offset of variable in the structure | 
|---|
| 413 | struct type_list2_1 { | 
|---|
| 414 | BYTE     FID_span;                  // Defines what type of variable follows | 
|---|
| 415 | union { | 
|---|
| 416 | BYTE   b_len; | 
|---|
| 417 | USHORT s_len; | 
|---|
| 418 | ULONG  l_len; | 
|---|
| 419 | } u; | 
|---|
| 420 | }; | 
|---|
| 421 |  | 
|---|
| 422 | // Type pointer | 
|---|
| 423 | struct type_pointerrec { | 
|---|
| 424 | BYTE     FID_index;                 // Index identifier | 
|---|
| 425 | USHORT   type_index;                // Type index | 
|---|
| 426 | BYTE     FID_string;                // String identifier | 
|---|
| 427 | BYTE     name_len;                  // Length of name which follows | 
|---|
| 428 | }; | 
|---|