13fa2d384SViktor Prutyanov /* 23fa2d384SViktor Prutyanov * Copyright (c) 2018 Virtuozzo International GmbH 33fa2d384SViktor Prutyanov * 43fa2d384SViktor Prutyanov * This work is licensed under the terms of the GNU GPL, version 2 or later. 53fa2d384SViktor Prutyanov * 63fa2d384SViktor Prutyanov */ 73fa2d384SViktor Prutyanov 83fa2d384SViktor Prutyanov #ifndef PDB_H 93fa2d384SViktor Prutyanov #define PDB_H 103fa2d384SViktor Prutyanov 113fa2d384SViktor Prutyanov 124591f4ceSViktor Prutyanov #ifndef _WIN32 133fa2d384SViktor Prutyanov typedef struct GUID { 143fa2d384SViktor Prutyanov unsigned int Data1; 153fa2d384SViktor Prutyanov unsigned short Data2; 163fa2d384SViktor Prutyanov unsigned short Data3; 173fa2d384SViktor Prutyanov unsigned char Data4[8]; 183fa2d384SViktor Prutyanov } GUID; 194591f4ceSViktor Prutyanov #endif 203fa2d384SViktor Prutyanov 213fa2d384SViktor Prutyanov struct PDB_FILE { 223fa2d384SViktor Prutyanov uint32_t size; 233fa2d384SViktor Prutyanov uint32_t unknown; 243fa2d384SViktor Prutyanov }; 253fa2d384SViktor Prutyanov 263fa2d384SViktor Prutyanov typedef struct PDB_DS_HEADER { 273fa2d384SViktor Prutyanov char signature[32]; 283fa2d384SViktor Prutyanov uint32_t block_size; 293fa2d384SViktor Prutyanov uint32_t unknown1; 303fa2d384SViktor Prutyanov uint32_t num_pages; 313fa2d384SViktor Prutyanov uint32_t toc_size; 323fa2d384SViktor Prutyanov uint32_t unknown2; 333fa2d384SViktor Prutyanov uint32_t toc_page; 343fa2d384SViktor Prutyanov } PDB_DS_HEADER; 353fa2d384SViktor Prutyanov 363fa2d384SViktor Prutyanov typedef struct PDB_DS_TOC { 373fa2d384SViktor Prutyanov uint32_t num_files; 383fa2d384SViktor Prutyanov uint32_t file_size[1]; 393fa2d384SViktor Prutyanov } PDB_DS_TOC; 403fa2d384SViktor Prutyanov 413fa2d384SViktor Prutyanov typedef struct PDB_DS_ROOT { 423fa2d384SViktor Prutyanov uint32_t Version; 433fa2d384SViktor Prutyanov uint32_t TimeDateStamp; 443fa2d384SViktor Prutyanov uint32_t Age; 453fa2d384SViktor Prutyanov GUID guid; 463fa2d384SViktor Prutyanov uint32_t cbNames; 473fa2d384SViktor Prutyanov char names[1]; 483fa2d384SViktor Prutyanov } PDB_DS_ROOT; 493fa2d384SViktor Prutyanov 503fa2d384SViktor Prutyanov typedef struct PDB_TYPES_OLD { 513fa2d384SViktor Prutyanov uint32_t version; 523fa2d384SViktor Prutyanov uint16_t first_index; 533fa2d384SViktor Prutyanov uint16_t last_index; 543fa2d384SViktor Prutyanov uint32_t type_size; 553fa2d384SViktor Prutyanov uint16_t file; 563fa2d384SViktor Prutyanov uint16_t pad; 573fa2d384SViktor Prutyanov } PDB_TYPES_OLD; 583fa2d384SViktor Prutyanov 593fa2d384SViktor Prutyanov typedef struct PDB_TYPES { 603fa2d384SViktor Prutyanov uint32_t version; 613fa2d384SViktor Prutyanov uint32_t type_offset; 623fa2d384SViktor Prutyanov uint32_t first_index; 633fa2d384SViktor Prutyanov uint32_t last_index; 643fa2d384SViktor Prutyanov uint32_t type_size; 653fa2d384SViktor Prutyanov uint16_t file; 663fa2d384SViktor Prutyanov uint16_t pad; 673fa2d384SViktor Prutyanov uint32_t hash_size; 683fa2d384SViktor Prutyanov uint32_t hash_base; 693fa2d384SViktor Prutyanov uint32_t hash_offset; 703fa2d384SViktor Prutyanov uint32_t hash_len; 713fa2d384SViktor Prutyanov uint32_t search_offset; 723fa2d384SViktor Prutyanov uint32_t search_len; 733fa2d384SViktor Prutyanov uint32_t unknown_offset; 743fa2d384SViktor Prutyanov uint32_t unknown_len; 753fa2d384SViktor Prutyanov } PDB_TYPES; 763fa2d384SViktor Prutyanov 773fa2d384SViktor Prutyanov typedef struct PDB_SYMBOL_RANGE { 783fa2d384SViktor Prutyanov uint16_t segment; 793fa2d384SViktor Prutyanov uint16_t pad1; 803fa2d384SViktor Prutyanov uint32_t offset; 813fa2d384SViktor Prutyanov uint32_t size; 823fa2d384SViktor Prutyanov uint32_t characteristics; 833fa2d384SViktor Prutyanov uint16_t index; 843fa2d384SViktor Prutyanov uint16_t pad2; 853fa2d384SViktor Prutyanov } PDB_SYMBOL_RANGE; 863fa2d384SViktor Prutyanov 873fa2d384SViktor Prutyanov typedef struct PDB_SYMBOL_RANGE_EX { 883fa2d384SViktor Prutyanov uint16_t segment; 893fa2d384SViktor Prutyanov uint16_t pad1; 903fa2d384SViktor Prutyanov uint32_t offset; 913fa2d384SViktor Prutyanov uint32_t size; 923fa2d384SViktor Prutyanov uint32_t characteristics; 933fa2d384SViktor Prutyanov uint16_t index; 943fa2d384SViktor Prutyanov uint16_t pad2; 953fa2d384SViktor Prutyanov uint32_t timestamp; 963fa2d384SViktor Prutyanov uint32_t unknown; 973fa2d384SViktor Prutyanov } PDB_SYMBOL_RANGE_EX; 983fa2d384SViktor Prutyanov 993fa2d384SViktor Prutyanov typedef struct PDB_SYMBOL_FILE { 1003fa2d384SViktor Prutyanov uint32_t unknown1; 1013fa2d384SViktor Prutyanov PDB_SYMBOL_RANGE range; 1023fa2d384SViktor Prutyanov uint16_t flag; 1033fa2d384SViktor Prutyanov uint16_t file; 1043fa2d384SViktor Prutyanov uint32_t symbol_size; 1053fa2d384SViktor Prutyanov uint32_t lineno_size; 1063fa2d384SViktor Prutyanov uint32_t unknown2; 1073fa2d384SViktor Prutyanov uint32_t nSrcFiles; 1083fa2d384SViktor Prutyanov uint32_t attribute; 1093fa2d384SViktor Prutyanov char filename[1]; 1103fa2d384SViktor Prutyanov } PDB_SYMBOL_FILE; 1113fa2d384SViktor Prutyanov 1123fa2d384SViktor Prutyanov typedef struct PDB_SYMBOL_FILE_EX { 1133fa2d384SViktor Prutyanov uint32_t unknown1; 1143fa2d384SViktor Prutyanov PDB_SYMBOL_RANGE_EX range; 1153fa2d384SViktor Prutyanov uint16_t flag; 1163fa2d384SViktor Prutyanov uint16_t file; 1173fa2d384SViktor Prutyanov uint32_t symbol_size; 1183fa2d384SViktor Prutyanov uint32_t lineno_size; 1193fa2d384SViktor Prutyanov uint32_t unknown2; 1203fa2d384SViktor Prutyanov uint32_t nSrcFiles; 1213fa2d384SViktor Prutyanov uint32_t attribute; 1223fa2d384SViktor Prutyanov uint32_t reserved[2]; 1233fa2d384SViktor Prutyanov char filename[1]; 1243fa2d384SViktor Prutyanov } PDB_SYMBOL_FILE_EX; 1253fa2d384SViktor Prutyanov 1263fa2d384SViktor Prutyanov typedef struct PDB_SYMBOL_SOURCE { 1273fa2d384SViktor Prutyanov uint16_t nModules; 1283fa2d384SViktor Prutyanov uint16_t nSrcFiles; 1293fa2d384SViktor Prutyanov uint16_t table[1]; 1303fa2d384SViktor Prutyanov } PDB_SYMBOL_SOURCE; 1313fa2d384SViktor Prutyanov 1323fa2d384SViktor Prutyanov typedef struct PDB_SYMBOL_IMPORT { 1333fa2d384SViktor Prutyanov uint32_t unknown1; 1343fa2d384SViktor Prutyanov uint32_t unknown2; 1353fa2d384SViktor Prutyanov uint32_t TimeDateStamp; 1363fa2d384SViktor Prutyanov uint32_t Age; 1373fa2d384SViktor Prutyanov char filename[1]; 1383fa2d384SViktor Prutyanov } PDB_SYMBOL_IMPORT; 1393fa2d384SViktor Prutyanov 1403fa2d384SViktor Prutyanov typedef struct PDB_SYMBOLS_OLD { 1413fa2d384SViktor Prutyanov uint16_t hash1_file; 1423fa2d384SViktor Prutyanov uint16_t hash2_file; 1433fa2d384SViktor Prutyanov uint16_t gsym_file; 1443fa2d384SViktor Prutyanov uint16_t pad; 1453fa2d384SViktor Prutyanov uint32_t module_size; 1463fa2d384SViktor Prutyanov uint32_t offset_size; 1473fa2d384SViktor Prutyanov uint32_t hash_size; 1483fa2d384SViktor Prutyanov uint32_t srcmodule_size; 1493fa2d384SViktor Prutyanov } PDB_SYMBOLS_OLD; 1503fa2d384SViktor Prutyanov 1513fa2d384SViktor Prutyanov typedef struct PDB_SYMBOLS { 1523fa2d384SViktor Prutyanov uint32_t signature; 1533fa2d384SViktor Prutyanov uint32_t version; 1543fa2d384SViktor Prutyanov uint32_t unknown; 1553fa2d384SViktor Prutyanov uint32_t hash1_file; 1563fa2d384SViktor Prutyanov uint32_t hash2_file; 1573fa2d384SViktor Prutyanov uint16_t gsym_file; 1583fa2d384SViktor Prutyanov uint16_t unknown1; 1593fa2d384SViktor Prutyanov uint32_t module_size; 1603fa2d384SViktor Prutyanov uint32_t offset_size; 1613fa2d384SViktor Prutyanov uint32_t hash_size; 1623fa2d384SViktor Prutyanov uint32_t srcmodule_size; 1633fa2d384SViktor Prutyanov uint32_t pdbimport_size; 1643fa2d384SViktor Prutyanov uint32_t resvd0; 1653fa2d384SViktor Prutyanov uint32_t stream_index_size; 1663fa2d384SViktor Prutyanov uint32_t unknown2_size; 1673fa2d384SViktor Prutyanov uint16_t resvd3; 1683fa2d384SViktor Prutyanov uint16_t machine; 1693fa2d384SViktor Prutyanov uint32_t resvd4; 1703fa2d384SViktor Prutyanov } PDB_SYMBOLS; 1713fa2d384SViktor Prutyanov 1723fa2d384SViktor Prutyanov typedef struct { 1733fa2d384SViktor Prutyanov uint16_t FPO; 1743fa2d384SViktor Prutyanov uint16_t unk0; 1753fa2d384SViktor Prutyanov uint16_t unk1; 1763fa2d384SViktor Prutyanov uint16_t unk2; 1773fa2d384SViktor Prutyanov uint16_t unk3; 1783fa2d384SViktor Prutyanov uint16_t segments; 1793fa2d384SViktor Prutyanov } PDB_STREAM_INDEXES_OLD; 1803fa2d384SViktor Prutyanov 1813fa2d384SViktor Prutyanov typedef struct { 1823fa2d384SViktor Prutyanov uint16_t FPO; 1833fa2d384SViktor Prutyanov uint16_t unk0; 1843fa2d384SViktor Prutyanov uint16_t unk1; 1853fa2d384SViktor Prutyanov uint16_t unk2; 1863fa2d384SViktor Prutyanov uint16_t unk3; 1873fa2d384SViktor Prutyanov uint16_t segments; 1883fa2d384SViktor Prutyanov uint16_t unk4; 1893fa2d384SViktor Prutyanov uint16_t unk5; 1903fa2d384SViktor Prutyanov uint16_t unk6; 1913fa2d384SViktor Prutyanov uint16_t FPO_EXT; 1923fa2d384SViktor Prutyanov uint16_t unk7; 1933fa2d384SViktor Prutyanov } PDB_STREAM_INDEXES; 1943fa2d384SViktor Prutyanov 1953fa2d384SViktor Prutyanov union codeview_symbol { 1963fa2d384SViktor Prutyanov struct { 1973fa2d384SViktor Prutyanov int16_t len; 1983fa2d384SViktor Prutyanov int16_t id; 1993fa2d384SViktor Prutyanov } generic; 2003fa2d384SViktor Prutyanov 2013fa2d384SViktor Prutyanov struct { 2023fa2d384SViktor Prutyanov int16_t len; 2033fa2d384SViktor Prutyanov int16_t id; 2043fa2d384SViktor Prutyanov uint32_t symtype; 2053fa2d384SViktor Prutyanov uint32_t offset; 2063fa2d384SViktor Prutyanov uint16_t segment; 2073fa2d384SViktor Prutyanov char name[1]; 2083fa2d384SViktor Prutyanov } public_v3; 2093fa2d384SViktor Prutyanov }; 2103fa2d384SViktor Prutyanov 2113fa2d384SViktor Prutyanov #define S_PUB_V3 0x110E 2123fa2d384SViktor Prutyanov 2133fa2d384SViktor Prutyanov typedef struct pdb_seg { 2143fa2d384SViktor Prutyanov uint32_t dword[8]; 2153fa2d384SViktor Prutyanov } __attribute__ ((packed)) pdb_seg; 2163fa2d384SViktor Prutyanov 2173fa2d384SViktor Prutyanov #define IMAGE_FILE_MACHINE_I386 0x014c 2183fa2d384SViktor Prutyanov #define IMAGE_FILE_MACHINE_AMD64 0x8664 2193fa2d384SViktor Prutyanov 2203fa2d384SViktor Prutyanov struct pdb_reader { 2214ea1a21dSViktor Prutyanov GMappedFile *gmf; 2223fa2d384SViktor Prutyanov size_t file_size; 2233fa2d384SViktor Prutyanov struct { 2243fa2d384SViktor Prutyanov PDB_DS_HEADER *header; 2253fa2d384SViktor Prutyanov PDB_DS_TOC *toc; 2263fa2d384SViktor Prutyanov PDB_DS_ROOT *root; 2273fa2d384SViktor Prutyanov } ds; 2283fa2d384SViktor Prutyanov uint32_t file_used[1024]; 2293fa2d384SViktor Prutyanov PDB_SYMBOLS *symbols; 230231f6a7dSViktor Prutyanov uint16_t segments; 2313fa2d384SViktor Prutyanov uint8_t *modimage; 2323fa2d384SViktor Prutyanov char *segs; 2333fa2d384SViktor Prutyanov size_t segs_size; 2343fa2d384SViktor Prutyanov }; 2353fa2d384SViktor Prutyanov 236*b1250455SAkihiko Odaki bool pdb_init_from_file(const char *name, struct pdb_reader *reader); 2373fa2d384SViktor Prutyanov void pdb_exit(struct pdb_reader *reader); 2383fa2d384SViktor Prutyanov uint64_t pdb_resolve(uint64_t img_base, struct pdb_reader *r, const char *name); 2393fa2d384SViktor Prutyanov uint64_t pdb_find_public_v3_symbol(struct pdb_reader *reader, const char *name); 2403fa2d384SViktor Prutyanov 2413fa2d384SViktor Prutyanov #endif /* PDB_H */ 242