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