1 /***********************************************************************\ 2 * imagehlp.d * 3 * * 4 * Windows API header module * 5 * * 6 * Translated from MinGW Windows headers * 7 * by Stewart Gordon * 8 * * 9 * Placed into public domain * 10 \***********************************************************************/ 11 module win32.imagehlp; 12 13 /* Comment from MinGW 14 NOTE: This strictly does not belong in the Win32 API since it's 15 really part of Platform SDK. However, GDB needs it and we might 16 as well provide it here. 17 */ 18 19 private import win32.winbase, win32.windef; 20 21 // FIXME: check types of constants 22 23 const API_VERSION_NUMBER = 7; 24 25 const BIND_NO_BOUND_IMPORTS = 1; 26 const BIND_NO_UPDATE = 2; 27 const BIND_ALL_IMAGES = 4; 28 const BIND_CACHE_IMPORT_DLLS = 8; 29 30 enum { 31 CBA_DEFERRED_SYMBOL_LOAD_START = 1, 32 CBA_DEFERRED_SYMBOL_LOAD_COMPLETE, 33 CBA_DEFERRED_SYMBOL_LOAD_FAILURE, 34 CBA_SYMBOLS_UNLOADED, 35 CBA_DUPLICATE_SYMBOL 36 } 37 38 const CERT_PE_IMAGE_DIGEST_DEBUG_INFO = 1; 39 const CERT_PE_IMAGE_DIGEST_RESOURCES = 2; 40 const CERT_PE_IMAGE_DIGEST_ALL_IMPORT_INFO = 4; 41 const CERT_PE_IMAGE_DIGEST_NON_PE_INFO = 8; 42 43 const CERT_SECTION_TYPE_ANY = 255; 44 45 enum { 46 CHECKSUM_SUCCESS = 0, 47 CHECKSUM_OPEN_FAILURE, 48 CHECKSUM_MAP_FAILURE, 49 CHECKSUM_MAPVIEW_FAILURE, 50 CHECKSUM_UNICODE_FAILURE 51 } 52 53 const IMAGE_SEPARATION = 65536; 54 55 const SPLITSYM_REMOVE_PRIVATE = 1; 56 const SPLITSYM_EXTRACT_ALL = 2; 57 const SPLITSYM_SYMBOLPATH_IS_SRC = 4; 58 59 const SYMF_OMAP_GENERATED = 1; 60 const SYMF_OMAP_MODIFIED = 2; 61 62 const SYMOPT_CASE_INSENSITIVE = 1; 63 const SYMOPT_UNDNAME = 2; 64 const SYMOPT_DEFERRED_LOADS = 4; 65 const SYMOPT_NO_CPP = 8; 66 const SYMOPT_LOAD_LINES = 16; 67 const SYMOPT_OMAP_FIND_NEAREST = 32; 68 69 const UNDNAME_COMPLETE = 0; 70 const UNDNAME_NO_LEADING_UNDERSCORES = 1; 71 const UNDNAME_NO_MS_KEYWORDS = 2; 72 const UNDNAME_NO_FUNCTION_RETURNS = 4; 73 const UNDNAME_NO_ALLOCATION_MODEL = 8; 74 const UNDNAME_NO_ALLOCATION_LANGUAGE = 16; 75 const UNDNAME_NO_MS_THISTYPE = 32; 76 const UNDNAME_NO_CV_THISTYPE = 64; 77 const UNDNAME_NO_THISTYPE = 96; 78 const UNDNAME_NO_ACCESS_SPECIFIERS = 128; 79 const UNDNAME_NO_THROW_SIGNATURES = 256; 80 const UNDNAME_NO_MEMBER_TYPE = 512; 81 const UNDNAME_NO_RETURN_UDT_MODEL = 1024; 82 const UNDNAME_32_BIT_DECODE = 2048; 83 const UNDNAME_NAME_ONLY = 4096; 84 const UNDNAME_NO_ARGUMENTS = 8192; 85 const UNDNAME_NO_SPECIAL_SYMS = 16384; 86 87 enum IMAGEHLP_STATUS_REASON { 88 BindOutOfMemory, 89 BindRvaToVaFailed, 90 BindNoRoomInImage, 91 BindImportModuleFailed, 92 BindImportProcedureFailed, 93 BindImportModule, 94 BindImportProcedure, 95 BindForwarder, 96 BindForwarderNOT, 97 BindImageModified, 98 BindExpandFileHeaders, 99 BindImageComplete, 100 BindMismatchedSymbols, 101 BindSymbolsNotUpdated 102 } 103 104 struct LOADED_IMAGE { 105 LPSTR ModuleName; 106 HANDLE hFile; 107 PUCHAR MappedAddress; 108 PIMAGE_NT_HEADERS FileHeader; 109 PIMAGE_SECTION_HEADER LastRvaSection; 110 ULONG NumberOfSections; 111 PIMAGE_SECTION_HEADER Sections; 112 ULONG Characteristics; 113 BOOLEAN fSystemImage; 114 BOOLEAN fDOSImage; 115 LIST_ENTRY Links; 116 ULONG SizeOfImage; 117 } 118 alias LOADED_IMAGE* PLOADED_IMAGE; 119 120 struct IMAGE_DEBUG_INFORMATION { 121 LIST_ENTRY List; 122 DWORD Size; 123 PVOID MappedBase; 124 USHORT Machine; 125 USHORT Characteristics; 126 DWORD CheckSum; 127 DWORD ImageBase; 128 DWORD SizeOfImage; 129 DWORD NumberOfSections; 130 PIMAGE_SECTION_HEADER Sections; 131 DWORD ExportedNamesSize; 132 LPSTR ExportedNames; 133 DWORD NumberOfFunctionTableEntries; 134 PIMAGE_FUNCTION_ENTRY FunctionTableEntries; 135 DWORD LowestFunctionStartingAddress; 136 DWORD HighestFunctionEndingAddress; 137 DWORD NumberOfFpoTableEntries; 138 PFPO_DATA FpoTableEntries; 139 DWORD SizeOfCoffSymbols; 140 PIMAGE_COFF_SYMBOLS_HEADER CoffSymbols; 141 DWORD SizeOfCodeViewSymbols; 142 PVOID CodeViewSymbols; 143 LPSTR ImageFilePath; 144 LPSTR ImageFileName; 145 LPSTR DebugFilePath; 146 DWORD TimeDateStamp; 147 BOOL RomImage; 148 PIMAGE_DEBUG_DIRECTORY DebugDirectory; 149 DWORD NumberOfDebugDirectories; 150 DWORD[3] Reserved; 151 } 152 alias IMAGE_DEBUG_INFORMATION* PIMAGE_DEBUG_INFORMATION; 153 154 enum ADDRESS_MODE { 155 AddrMode1616, 156 AddrMode1632, 157 AddrModeReal, 158 AddrModeFlat 159 } 160 161 struct ADDRESS { 162 DWORD Offset; 163 WORD Segment; 164 ADDRESS_MODE Mode; 165 } 166 alias ADDRESS* LPADDRESS; 167 168 struct KDHELP { 169 DWORD Thread; 170 DWORD ThCallbackStack; 171 DWORD NextCallback; 172 DWORD FramePointer; 173 DWORD KiCallUserMode; 174 DWORD KeUserCallbackDispatcher; 175 DWORD SystemRangeStart; 176 } 177 alias KDHELP* PKDHELP; 178 179 struct STACKFRAME { 180 ADDRESS AddrPC; 181 ADDRESS AddrReturn; 182 ADDRESS AddrFrame; 183 ADDRESS AddrStack; 184 LPVOID FuncTableEntry; 185 DWORD[4] Params; 186 BOOL Far; 187 BOOL Virtual; 188 DWORD[3] Reserved; 189 KDHELP KdHelp; 190 } 191 alias STACKFRAME* LPSTACKFRAME; 192 193 struct API_VERSION { 194 USHORT MajorVersion; 195 USHORT MinorVersion; 196 USHORT Revision; 197 USHORT Reserved; 198 } 199 alias API_VERSION* LPAPI_VERSION; 200 201 enum SYM_TYPE { 202 SymNone, 203 SymCoff, 204 SymCv, 205 SymPdb, 206 SymExport, 207 SymDeferred, 208 SymSym 209 } 210 211 struct IMAGEHLP_SYMBOL { 212 DWORD SizeOfStruct; 213 DWORD Address; 214 DWORD Size; 215 DWORD Flags; 216 DWORD MaxNameLength; 217 CHAR[1] Name; 218 } 219 alias IMAGEHLP_SYMBOL* PIMAGEHLP_SYMBOL; 220 221 struct IMAGEHLP_MODULE { 222 DWORD SizeOfStruct; 223 DWORD BaseOfImage; 224 DWORD ImageSize; 225 DWORD TimeDateStamp; 226 DWORD CheckSum; 227 DWORD NumSyms; 228 SYM_TYPE SymType; 229 CHAR[32] ModuleName; 230 CHAR[256] ImageName; 231 CHAR[256] LoadedImageName; 232 } 233 alias IMAGEHLP_MODULE* PIMAGEHLP_MODULE; 234 235 struct IMAGEHLP_LINE { 236 DWORD SizeOfStruct; 237 DWORD Key; 238 DWORD LineNumber; 239 PCHAR FileName; 240 DWORD Address; 241 } 242 alias IMAGEHLP_LINE* PIMAGEHLP_LINE; 243 244 struct IMAGEHLP_DEFERRED_SYMBOL_LOAD { 245 DWORD SizeOfStruct; 246 DWORD BaseOfImage; 247 DWORD CheckSum; 248 DWORD TimeDateStamp; 249 CHAR[MAX_PATH] FileName; 250 BOOLEAN Reparse; 251 } 252 alias IMAGEHLP_DEFERRED_SYMBOL_LOAD* PIMAGEHLP_DEFERRED_SYMBOL_LOAD; 253 254 struct IMAGEHLP_DUPLICATE_SYMBOL { 255 DWORD SizeOfStruct; 256 DWORD NumberOfDups; 257 PIMAGEHLP_SYMBOL Symbol; 258 ULONG SelectedSymbol; 259 } 260 alias IMAGEHLP_DUPLICATE_SYMBOL* PIMAGEHLP_DUPLICATE_SYMBOL; 261 262 alias HANDLE DIGEST_HANDLE; 263 264 extern (Windows) { 265 alias BOOL function(IMAGEHLP_STATUS_REASON, LPSTR, LPSTR, ULONG, ULONG) 266 PIMAGEHLP_STATUS_ROUTINE; 267 alias BOOL function(HANDLE , LPCVOID, LPVOID, DWORD, LPDWORD) 268 PREAD_PROCESS_MEMORY_ROUTINE; 269 alias LPVOID function(HANDLE, DWORD) PFUNCTION_TABLE_ACCESS_ROUTINE; 270 alias DWORD function(HANDLE, DWORD) PGET_MODULE_BASE_ROUTINE; 271 alias DWORD function(HANDLE, HANDLE, LPADDRESS) 272 PTRANSLATE_ADDRESS_ROUTINE; 273 alias BOOL function(LPSTR, ULONG, PVOID) PSYM_ENUMMODULES_CALLBACK; 274 alias BOOL function(LPSTR, ULONG, ULONG, PVOID) PSYM_ENUMSYMBOLS_CALLBACK; 275 alias BOOL function(LPSTR, ULONG, ULONG, PVOID) 276 PENUMLOADED_MODULES_CALLBACK; 277 alias BOOL function(HANDLE, ULONG, PVOID, PVOID) 278 PSYMBOL_REGISTERED_CALLBACK; 279 alias BOOL function(DIGEST_HANDLE refdata, PBYTE pData, DWORD dwLength) 280 DIGEST_FUNCTION; 281 282 PIMAGE_NT_HEADERS CheckSumMappedFile(LPVOID, DWORD, LPDWORD, LPDWORD); 283 DWORD MapFileAndCheckSumA(LPSTR, LPDWORD, LPDWORD); 284 DWORD MapFileAndCheckSumW(PWSTR, LPDWORD, LPDWORD); 285 BOOL TouchFileTimes(HANDLE, LPSYSTEMTIME); 286 BOOL SplitSymbols(LPSTR, LPSTR, LPSTR, DWORD); 287 HANDLE FindDebugInfoFile(LPSTR, LPSTR, LPSTR); 288 HANDLE FindExecutableImage(LPSTR, LPSTR, LPSTR); 289 BOOL UpdateDebugInfoFile(LPSTR, LPSTR, LPSTR, PIMAGE_NT_HEADERS); 290 BOOL UpdateDebugInfoFileEx(LPSTR, LPSTR, LPSTR, PIMAGE_NT_HEADERS, DWORD); 291 BOOL BindImage(LPSTR, LPSTR, LPSTR); 292 BOOL BindImageEx(DWORD, LPSTR, LPSTR, LPSTR, PIMAGEHLP_STATUS_ROUTINE); 293 BOOL ReBaseImage(LPSTR, LPSTR, BOOL, BOOL, BOOL, ULONG, ULONG*, ULONG*, 294 ULONG*, ULONG*, ULONG); 295 PLOADED_IMAGE ImageLoad(LPSTR, LPSTR); 296 BOOL ImageUnload(PLOADED_IMAGE); 297 PIMAGE_NT_HEADERS ImageNtHeader(PVOID); 298 PVOID ImageDirectoryEntryToData(PVOID, BOOLEAN, USHORT, PULONG); 299 PIMAGE_SECTION_HEADER ImageRvaToSection(PIMAGE_NT_HEADERS, PVOID, ULONG); 300 PVOID ImageRvaToVa(PIMAGE_NT_HEADERS, PVOID, ULONG, 301 PIMAGE_SECTION_HEADER*); 302 BOOL MapAndLoad(LPSTR, LPSTR, PLOADED_IMAGE, BOOL, BOOL); 303 BOOL GetImageConfigInformation(PLOADED_IMAGE, 304 PIMAGE_LOAD_CONFIG_DIRECTORY); 305 DWORD GetImageUnusedHeaderBytes(PLOADED_IMAGE, LPDWORD); 306 BOOL SetImageConfigInformation(PLOADED_IMAGE, 307 PIMAGE_LOAD_CONFIG_DIRECTORY); 308 BOOL UnMapAndLoad(PLOADED_IMAGE); 309 PIMAGE_DEBUG_INFORMATION MapDebugInformation(HANDLE, LPSTR, LPSTR, DWORD); 310 BOOL UnmapDebugInformation(PIMAGE_DEBUG_INFORMATION); 311 HANDLE FindExecutableImage(LPSTR, LPSTR, LPSTR); 312 BOOL SearchTreeForFile(LPSTR, LPSTR, LPSTR); 313 BOOL MakeSureDirectoryPathExists(LPCSTR); 314 DWORD UnDecorateSymbolName(LPCSTR, LPSTR, DWORD, DWORD); 315 BOOL StackWalk(DWORD, HANDLE, HANDLE, LPSTACKFRAME, LPVOID, 316 PREAD_PROCESS_MEMORY_ROUTINE, PFUNCTION_TABLE_ACCESS_ROUTINE, 317 PGET_MODULE_BASE_ROUTINE, PTRANSLATE_ADDRESS_ROUTINE); 318 LPAPI_VERSION ImagehlpApiVersion(); 319 LPAPI_VERSION ImagehlpApiVersionEx(LPAPI_VERSION); 320 DWORD GetTimestampForLoadedLibrary(HMODULE); 321 BOOL RemovePrivateCvSymbolic(PCHAR, PCHAR*, ULONG*); 322 VOID RemoveRelocations(PCHAR); 323 DWORD SymSetOptions(DWORD); 324 DWORD SymGetOptions(); 325 BOOL SymCleanup(HANDLE); 326 BOOL SymEnumerateModules(HANDLE, PSYM_ENUMMODULES_CALLBACK, PVOID); 327 BOOL SymEnumerateSymbols(HANDLE, DWORD, PSYM_ENUMSYMBOLS_CALLBACK, PVOID); 328 BOOL EnumerateLoadedModules(HANDLE, PENUMLOADED_MODULES_CALLBACK, PVOID); 329 LPVOID SymFunctionTableAccess(HANDLE, DWORD); 330 BOOL SymGetModuleInfo(HANDLE, DWORD, PIMAGEHLP_MODULE); 331 DWORD SymGetModuleBase(HANDLE, DWORD); 332 BOOL SymGetSymFromAddr(HANDLE, DWORD, PDWORD, PIMAGEHLP_SYMBOL); 333 BOOL SymGetSymFromName(HANDLE, LPSTR, PIMAGEHLP_SYMBOL); 334 BOOL SymGetSymNext(HANDLE, PIMAGEHLP_SYMBOL); 335 BOOL SymGetSymPrev(HANDLE, PIMAGEHLP_SYMBOL); 336 BOOL SymGetLineFromAddr(HANDLE, DWORD, PDWORD, PIMAGEHLP_LINE); 337 BOOL SymGetLineFromName(HANDLE, LPSTR, LPSTR, DWORD, PLONG, 338 PIMAGEHLP_LINE); 339 BOOL SymGetLineNext(HANDLE, PIMAGEHLP_LINE); 340 BOOL SymGetLinePrev(HANDLE, PIMAGEHLP_LINE); 341 BOOL SymMatchFileName(LPSTR, LPSTR, LPSTR*, LPSTR*); 342 BOOL SymInitialize(HANDLE, LPSTR, BOOL); 343 BOOL SymGetSearchPath(HANDLE, LPSTR, DWORD); 344 BOOL SymSetSearchPath(HANDLE, LPSTR); 345 BOOL SymLoadModule(HANDLE, HANDLE, PSTR, PSTR, DWORD, DWORD); 346 BOOL SymUnloadModule(HANDLE, DWORD); 347 BOOL SymUnDName(PIMAGEHLP_SYMBOL, LPSTR, DWORD); 348 BOOL SymRegisterCallback(HANDLE, PSYMBOL_REGISTERED_CALLBACK, PVOID); 349 BOOL ImageGetDigestStream(HANDLE, DWORD, DIGEST_FUNCTION, DIGEST_HANDLE); 350 BOOL ImageAddCertificate(HANDLE, LPWIN_CERTIFICATE, PDWORD); 351 BOOL ImageRemoveCertificate(HANDLE, DWORD); 352 BOOL ImageEnumerateCertificates(HANDLE, WORD, PDWORD, PDWORD, DWORD); 353 BOOL ImageGetCertificateData(HANDLE, DWORD, LPWIN_CERTIFICATE, PDWORD); 354 BOOL ImageGetCertificateHeader(HANDLE, DWORD, LPWIN_CERTIFICATE); 355 BOOL CopyPdb(CHAR*, CHAR*, BOOL); 356 BOOL RemovePrivateCvSymbolicEx(PCHAR, ULONG, PCHAR*, ULONG*); 357 } 358 359 version (Unicode) { 360 alias MapFileAndCheckSumW MapFileAndCheckSum; 361 } else { 362 alias MapFileAndCheckSumA MapFileAndCheckSum; 363 }