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