1 /* 2 * Copyright (c) 2018 Virtuozzo International GmbH 3 * 4 * This work is licensed under the terms of the GNU GPL, version 2 or later. 5 * 6 */ 7 8 #ifndef PDB_H 9 #define PDB_H 10 11 #include <stdint.h> 12 #include <stdlib.h> 13 14 typedef struct GUID { 15 unsigned int Data1; 16 unsigned short Data2; 17 unsigned short Data3; 18 unsigned char Data4[8]; 19 } GUID; 20 21 struct PDB_FILE { 22 uint32_t size; 23 uint32_t unknown; 24 }; 25 26 typedef struct PDB_DS_HEADER { 27 char signature[32]; 28 uint32_t block_size; 29 uint32_t unknown1; 30 uint32_t num_pages; 31 uint32_t toc_size; 32 uint32_t unknown2; 33 uint32_t toc_page; 34 } PDB_DS_HEADER; 35 36 typedef struct PDB_DS_TOC { 37 uint32_t num_files; 38 uint32_t file_size[1]; 39 } PDB_DS_TOC; 40 41 typedef struct PDB_DS_ROOT { 42 uint32_t Version; 43 uint32_t TimeDateStamp; 44 uint32_t Age; 45 GUID guid; 46 uint32_t cbNames; 47 char names[1]; 48 } PDB_DS_ROOT; 49 50 typedef struct PDB_TYPES_OLD { 51 uint32_t version; 52 uint16_t first_index; 53 uint16_t last_index; 54 uint32_t type_size; 55 uint16_t file; 56 uint16_t pad; 57 } PDB_TYPES_OLD; 58 59 typedef struct PDB_TYPES { 60 uint32_t version; 61 uint32_t type_offset; 62 uint32_t first_index; 63 uint32_t last_index; 64 uint32_t type_size; 65 uint16_t file; 66 uint16_t pad; 67 uint32_t hash_size; 68 uint32_t hash_base; 69 uint32_t hash_offset; 70 uint32_t hash_len; 71 uint32_t search_offset; 72 uint32_t search_len; 73 uint32_t unknown_offset; 74 uint32_t unknown_len; 75 } PDB_TYPES; 76 77 typedef struct PDB_SYMBOL_RANGE { 78 uint16_t segment; 79 uint16_t pad1; 80 uint32_t offset; 81 uint32_t size; 82 uint32_t characteristics; 83 uint16_t index; 84 uint16_t pad2; 85 } PDB_SYMBOL_RANGE; 86 87 typedef struct PDB_SYMBOL_RANGE_EX { 88 uint16_t segment; 89 uint16_t pad1; 90 uint32_t offset; 91 uint32_t size; 92 uint32_t characteristics; 93 uint16_t index; 94 uint16_t pad2; 95 uint32_t timestamp; 96 uint32_t unknown; 97 } PDB_SYMBOL_RANGE_EX; 98 99 typedef struct PDB_SYMBOL_FILE { 100 uint32_t unknown1; 101 PDB_SYMBOL_RANGE range; 102 uint16_t flag; 103 uint16_t file; 104 uint32_t symbol_size; 105 uint32_t lineno_size; 106 uint32_t unknown2; 107 uint32_t nSrcFiles; 108 uint32_t attribute; 109 char filename[1]; 110 } PDB_SYMBOL_FILE; 111 112 typedef struct PDB_SYMBOL_FILE_EX { 113 uint32_t unknown1; 114 PDB_SYMBOL_RANGE_EX range; 115 uint16_t flag; 116 uint16_t file; 117 uint32_t symbol_size; 118 uint32_t lineno_size; 119 uint32_t unknown2; 120 uint32_t nSrcFiles; 121 uint32_t attribute; 122 uint32_t reserved[2]; 123 char filename[1]; 124 } PDB_SYMBOL_FILE_EX; 125 126 typedef struct PDB_SYMBOL_SOURCE { 127 uint16_t nModules; 128 uint16_t nSrcFiles; 129 uint16_t table[1]; 130 } PDB_SYMBOL_SOURCE; 131 132 typedef struct PDB_SYMBOL_IMPORT { 133 uint32_t unknown1; 134 uint32_t unknown2; 135 uint32_t TimeDateStamp; 136 uint32_t Age; 137 char filename[1]; 138 } PDB_SYMBOL_IMPORT; 139 140 typedef struct PDB_SYMBOLS_OLD { 141 uint16_t hash1_file; 142 uint16_t hash2_file; 143 uint16_t gsym_file; 144 uint16_t pad; 145 uint32_t module_size; 146 uint32_t offset_size; 147 uint32_t hash_size; 148 uint32_t srcmodule_size; 149 } PDB_SYMBOLS_OLD; 150 151 typedef struct PDB_SYMBOLS { 152 uint32_t signature; 153 uint32_t version; 154 uint32_t unknown; 155 uint32_t hash1_file; 156 uint32_t hash2_file; 157 uint16_t gsym_file; 158 uint16_t unknown1; 159 uint32_t module_size; 160 uint32_t offset_size; 161 uint32_t hash_size; 162 uint32_t srcmodule_size; 163 uint32_t pdbimport_size; 164 uint32_t resvd0; 165 uint32_t stream_index_size; 166 uint32_t unknown2_size; 167 uint16_t resvd3; 168 uint16_t machine; 169 uint32_t resvd4; 170 } PDB_SYMBOLS; 171 172 typedef struct { 173 uint16_t FPO; 174 uint16_t unk0; 175 uint16_t unk1; 176 uint16_t unk2; 177 uint16_t unk3; 178 uint16_t segments; 179 } PDB_STREAM_INDEXES_OLD; 180 181 typedef struct { 182 uint16_t FPO; 183 uint16_t unk0; 184 uint16_t unk1; 185 uint16_t unk2; 186 uint16_t unk3; 187 uint16_t segments; 188 uint16_t unk4; 189 uint16_t unk5; 190 uint16_t unk6; 191 uint16_t FPO_EXT; 192 uint16_t unk7; 193 } PDB_STREAM_INDEXES; 194 195 union codeview_symbol { 196 struct { 197 int16_t len; 198 int16_t id; 199 } generic; 200 201 struct { 202 int16_t len; 203 int16_t id; 204 uint32_t symtype; 205 uint32_t offset; 206 uint16_t segment; 207 char name[1]; 208 } public_v3; 209 }; 210 211 #define S_PUB_V3 0x110E 212 213 typedef struct pdb_seg { 214 uint32_t dword[8]; 215 } __attribute__ ((packed)) pdb_seg; 216 217 #define IMAGE_FILE_MACHINE_I386 0x014c 218 #define IMAGE_FILE_MACHINE_AMD64 0x8664 219 220 struct pdb_reader { 221 int fd; 222 size_t file_size; 223 struct { 224 PDB_DS_HEADER *header; 225 PDB_DS_TOC *toc; 226 PDB_DS_ROOT *root; 227 } ds; 228 uint32_t file_used[1024]; 229 PDB_SYMBOLS *symbols; 230 PDB_STREAM_INDEXES sidx; 231 uint8_t *modimage; 232 char *segs; 233 size_t segs_size; 234 }; 235 236 int pdb_init_from_file(const char *name, struct pdb_reader *reader); 237 void pdb_exit(struct pdb_reader *reader); 238 uint64_t pdb_resolve(uint64_t img_base, struct pdb_reader *r, const char *name); 239 uint64_t pdb_find_public_v3_symbol(struct pdb_reader *reader, const char *name); 240 241 #endif /* PDB_H */ 242