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 }