00001
00002
00003
00004
00005
00006 #ifndef __CSUTIL_DEBGHELPAPI_H__
00007 #define __CSUTIL_DEBGHELPAPI_H__
00008
00009 enum ADDRESS_MODE
00010 {
00011 AddrMode1616,
00012 AddrMode1632,
00013 AddrModeReal,
00014 AddrModeFlat
00015 };
00016
00017 struct ADDRESS64
00018 {
00019 uint64 Offset;
00020 WORD Segment;
00021 ADDRESS_MODE Mode;
00022 };
00023 typedef ADDRESS64* LPADDRESS64;
00024
00025 struct KDHELP64
00026 {
00027 uint64 Thread;
00028 DWORD ThCallbackStack;
00029 DWORD ThCallbackBStore;
00030 DWORD NextCallback;
00031 DWORD FramePointer;
00032 uint64 KiCallUserMode;
00033 uint64 KeUserCallbackDispatcher;
00034 uint64 SystemRangeStart;
00035 uint64 Reserved[8];
00036 };
00037 typedef KDHELP64* PKDHELP64;
00038
00039 struct STACKFRAME64
00040 {
00041 ADDRESS64 AddrPC;
00042 ADDRESS64 AddrReturn;
00043 ADDRESS64 AddrFrame;
00044 ADDRESS64 AddrStack;
00045 ADDRESS64 AddrBStore;
00046 PVOID FuncTableEntry;
00047 uint64 Params[4];
00048 BOOL Far;
00049 BOOL Virtual;
00050 uint64 Reserved[3];
00051 KDHELP64 KdHelp;
00052 };
00053 typedef STACKFRAME64* LPSTACKFRAME64;
00054
00055 typedef BOOL (WINAPI* PREAD_PROCESS_MEMORY_ROUTINE64) (HANDLE hProcess,
00056 uint64 qwBaseAddress, PVOID lpBuffer, DWORD nSize, LPDWORD lpNumberOfBytesRead);
00057 typedef PVOID (WINAPI* PFUNCTION_TABLE_ACCESS_ROUTINE64) (HANDLE hProcess,
00058 uint64 AddrBase);
00059 typedef uint64 (WINAPI* PGET_MODULE_BASE_ROUTINE64) (HANDLE hProcess,
00060 uint64 Address);
00061 typedef uint64 (WINAPI* PTRANSLATE_ADDRESS_ROUTINE64) (HANDLE hProcess,
00062 HANDLE hThread, LPADDRESS64 lpaddr);
00063
00064 struct SYMBOL_INFO
00065 {
00066 ULONG SizeOfStruct;
00067 ULONG TypeIndex;
00068 uint64 Reserved[2];
00069 ULONG Reserved2;
00070 ULONG Size;
00071 uint64 ModBase;
00072 ULONG Flags;
00073 uint64 Value;
00074 uint64 Address;
00075 ULONG Register;
00076 ULONG Scope;
00077 ULONG Tag;
00078 ULONG NameLen;
00079 ULONG MaxNameLen;
00080 CHAR Name[1];
00081 };
00082 typedef SYMBOL_INFO* PSYMBOL_INFO;
00083
00084 struct SYMBOL_INFOW
00085 {
00086 ULONG SizeOfStruct;
00087 ULONG TypeIndex;
00088 uint64 Reserved[2];
00089 ULONG Reserved2;
00090 ULONG Size;
00091 uint64 ModBase;
00092 ULONG Flags;
00093 uint64 Value;
00094 uint64 Address;
00095 ULONG Register;
00096 ULONG Scope;
00097 ULONG Tag;
00098 ULONG NameLen;
00099 ULONG MaxNameLen;
00100 WCHAR Name[1];
00101 };
00102 typedef SYMBOL_INFOW* PSYMBOL_INFOW;
00103
00104 #define SYMFLAG_PARAMETER 0x00000040
00105
00106 #define SYMOPT_UNDNAME 0x00000002
00107 #define SYMOPT_DEFERRED_LOADS 0x00000004
00108 #define SYMOPT_LOAD_LINES 0x00000010
00109 #define SYMOPT_FAIL_CRITICAL_ERRORS 0x00000200
00110
00111 enum SYM_TYPE
00112 {
00113 SymNone = 0,
00114 SymCoff,
00115 SymCv,
00116 SymPdb,
00117 SymExport,
00118 SymDeferred,
00119 SymSym,
00120 SymDia,
00121 SymVirtual,
00122 NumSymTypes
00123 };
00124
00125 struct IMAGEHLP_MODULE64
00126 {
00127 DWORD SizeOfStruct;
00128 uint64 BaseOfImage;
00129 DWORD ImageSize;
00130 DWORD TimeDateStamp;
00131 DWORD CheckSum;
00132 DWORD NumSyms;
00133 SYM_TYPE SymType;
00134 CHAR ModuleName[32];
00135 CHAR ImageName[256];
00136 CHAR LoadedImageName[256];
00137
00138
00139
00140
00141 CHAR LoadedPdbName[256];
00142 DWORD CVSig;
00143 CHAR CVData[MAX_PATH*3];
00144 DWORD PdbSig;
00145 GUID PdbSig70;
00146 DWORD PdbAge;
00147 BOOL PdbUnmatched;
00148 BOOL DbgUnmatched;
00149 BOOL LineNumbers;
00150 BOOL GlobalSymbols;
00151 BOOL TypeInfo;
00152 };
00153 typedef IMAGEHLP_MODULE64* PIMAGEHLP_MODULE64;
00154
00155 struct IMAGEHLP_MODULEW64
00156 {
00157 DWORD SizeOfStruct;
00158 uint64 BaseOfImage;
00159 DWORD ImageSize;
00160 DWORD TimeDateStamp;
00161 DWORD CheckSum;
00162 DWORD NumSyms;
00163 SYM_TYPE SymType;
00164 WCHAR ModuleName[32];
00165 WCHAR ImageName[256];
00166 WCHAR LoadedImageName[256];
00167 WCHAR LoadedPdbName[256];
00168 DWORD CVSig;
00169 WCHAR CVData[MAX_PATH*3];
00170 DWORD PdbSig;
00171 GUID PdbSig70;
00172 DWORD PdbAge;
00173 BOOL PdbUnmatched;
00174 BOOL DbgUnmatched;
00175 BOOL LineNumbers;
00176 BOOL GlobalSymbols;
00177 BOOL TypeInfo;
00178 };
00179 typedef IMAGEHLP_MODULEW64* PIMAGEHLP_MODULEW64;
00180
00181 struct IMAGEHLP_LINE64
00182 {
00183 DWORD SizeOfStruct;
00184 PVOID Key;
00185 DWORD LineNumber;
00186 PCHAR FileName;
00187 uint64 Address;
00188 };
00189 typedef IMAGEHLP_LINE64* PIMAGEHLP_LINE64;
00190
00191 struct IMAGEHLP_LINEW64
00192 {
00193 DWORD SizeOfStruct;
00194 PVOID Key;
00195 DWORD LineNumber;
00196 PWCHAR FileName;
00197 uint64 Address;
00198 };
00199 typedef IMAGEHLP_LINEW64* PIMAGEHLP_LINEW64;
00200
00201 typedef BOOL (CALLBACK* PSYM_ENUMERATESYMBOLS_CALLBACK) (PSYMBOL_INFO pSymInfo,
00202 ULONG SymbolSize, PVOID UserContext);
00203 typedef BOOL (CALLBACK* PSYM_ENUMERATESYMBOLS_CALLBACKW) (PSYMBOL_INFOW pSymInfo,
00204 ULONG SymbolSize, PVOID UserContext);
00205 typedef BOOL (CALLBACK* PSYM_ENUMMODULES_CALLBACK64) (PSTR ModuleName,
00206 uint64 BaseOfDll, PVOID UserContext);
00207 typedef BOOL (CALLBACK* PSYM_ENUMMODULES_CALLBACKW64) (PWSTR ModuleName,
00208 uint64 BaseOfDll, PVOID UserContext);
00209
00210 struct IMAGEHLP_STACK_FRAME
00211 {
00212 uint64 InstructionOffset;
00213 uint64 ReturnOffset;
00214 uint64 FrameOffset;
00215 uint64 StackOffset;
00216 uint64 BackingStoreOffset;
00217 uint64 FuncTableEntry;
00218 uint64 Params[4];
00219 uint64 Reserved[5];
00220 BOOL Virtual;
00221 ULONG Reserved2;
00222 };
00223 typedef IMAGEHLP_STACK_FRAME* PIMAGEHLP_STACK_FRAME;
00224 typedef void* PIMAGEHLP_CONTEXT;
00225
00226 struct MINIDUMP_EXCEPTION_INFORMATION
00227 {
00228 DWORD ThreadId;
00229 PEXCEPTION_POINTERS ExceptionPointers;
00230 BOOL ClientPointers;
00231 };
00232 typedef MINIDUMP_EXCEPTION_INFORMATION* PMINIDUMP_EXCEPTION_INFORMATION;
00233
00234 struct MINIDUMP_USER_STREAM
00235 {
00236 ULONG32 Type;
00237 ULONG BufferSize;
00238 PVOID Buffer;
00239 };
00240 typedef MINIDUMP_USER_STREAM* PMINIDUMP_USER_STREAM;
00241
00242 struct MINIDUMP_USER_STREAM_INFORMATION
00243 {
00244 ULONG UserStreamCount;
00245 PMINIDUMP_USER_STREAM UserStreamArray;
00246 };
00247 typedef MINIDUMP_USER_STREAM_INFORMATION* PMINIDUMP_USER_STREAM_INFORMATION;
00248
00249 enum MINIDUMP_CALLBACK_TYPE
00250 {
00251 ModuleCallback,
00252 ThreadCallback,
00253 ThreadExCallback,
00254 IncludeThreadCallback,
00255 IncludeModuleCallback
00256 };
00257
00258 struct MINIDUMP_THREAD_CALLBACK
00259 {
00260 ULONG ThreadId;
00261 HANDLE ThreadHandle;
00262 CONTEXT Context;
00263 ULONG SizeOfContext;
00264 ULONG64 StackBase;
00265 ULONG64 StackEnd;
00266 };
00267 typedef MINIDUMP_THREAD_CALLBACK* PMINIDUMP_THREAD_CALLBACK;
00268
00269 struct MINIDUMP_THREAD_EX_CALLBACK
00270 {
00271 ULONG ThreadId;
00272 HANDLE ThreadHandle;
00273 CONTEXT Context;
00274 ULONG SizeOfContext;
00275 ULONG64 StackBase;
00276 ULONG64 StackEnd;
00277 ULONG64 BackingStoreBase;
00278 ULONG64 BackingStoreEnd;
00279 };
00280 typedef MINIDUMP_THREAD_EX_CALLBACK* PMINIDUMP_THREAD_EX_CALLBACK;
00281
00282 #include <winver.h>
00283 #include "sanity.inc"
00284
00285 struct MINIDUMP_MODULE_CALLBACK
00286 {
00287 PWCHAR FullPath;
00288 ULONG64 BaseOfImage;
00289 ULONG SizeOfImage;
00290 ULONG CheckSum;
00291 ULONG TimeDateStamp;
00292 VS_FIXEDFILEINFO VersionInfo;
00293 PVOID CvRecord;
00294 ULONG SizeOfCvRecord;
00295 PVOID MiscRecord;
00296 ULONG SizeOfMiscRecord;
00297 };
00298 typedef MINIDUMP_MODULE_CALLBACK* PMINIDUMP_MODULE_CALLBACK;
00299
00300 struct MINIDUMP_INCLUDE_THREAD_CALLBACK
00301 {
00302 ULONG ThreadId;
00303 };
00304 typedef MINIDUMP_INCLUDE_THREAD_CALLBACK* PMINIDUMP_INCLUDE_THREAD_CALLBACK;
00305
00306 struct MINIDUMP_INCLUDE_MODULE_CALLBACK
00307 {
00308 ULONG64 BaseOfImage;
00309 };
00310 typedef MINIDUMP_INCLUDE_MODULE_CALLBACK* PMINIDUMP_INCLUDE_MODULE_CALLBACK;
00311
00312
00313 struct MINIDUMP_CALLBACK_INPUT
00314 {
00315 ULONG ProcessId;
00316 HANDLE ProcessHandle;
00317 ULONG CallbackType;
00318 union
00319 {
00320 MINIDUMP_THREAD_CALLBACK Thread;
00321 MINIDUMP_THREAD_EX_CALLBACK ThreadEx;
00322 MINIDUMP_MODULE_CALLBACK Module;
00323 MINIDUMP_INCLUDE_THREAD_CALLBACK IncludeThread;
00324 MINIDUMP_INCLUDE_MODULE_CALLBACK IncludeModule;
00325 };
00326 };
00327 typedef MINIDUMP_CALLBACK_INPUT* PMINIDUMP_CALLBACK_INPUT;
00328
00329 enum MODULE_WRITE_FLAGS
00330 {
00331 ModuleWriteModule = 0x0001,
00332 ModuleWriteDataSeg = 0x0002,
00333 ModuleWriteMiscRecord = 0x0004,
00334 ModuleWriteCvRecord = 0x0008,
00335 ModuleReferencedByMemory = 0x0010
00336 };
00337
00338 enum THREAD_WRITE_FLAGS
00339 {
00340 ThreadWriteThread = 0x0001,
00341 ThreadWriteStack = 0x0002,
00342 ThreadWriteContext = 0x0004,
00343 ThreadWriteBackingStore = 0x0008,
00344 ThreadWriteInstructionWindow = 0x0010,
00345 ThreadWriteThreadData = 0x0020
00346 };
00347
00348 struct MINIDUMP_CALLBACK_OUTPUT
00349 {
00350 union
00351 {
00352 ULONG ModuleWriteFlags;
00353 ULONG ThreadWriteFlags;
00354 };
00355 };
00356 typedef MINIDUMP_CALLBACK_OUTPUT* PMINIDUMP_CALLBACK_OUTPUT;
00357
00358
00359 typedef BOOL (CALLBACK* MINIDUMP_CALLBACK_ROUTINE) (PVOID CallbackParam,
00360 const PMINIDUMP_CALLBACK_INPUT CallbackInput,
00361 PMINIDUMP_CALLBACK_OUTPUT CallbackOutput);
00362
00363 struct MINIDUMP_CALLBACK_INFORMATION
00364 {
00365 MINIDUMP_CALLBACK_ROUTINE CallbackRoutine;
00366 PVOID CallbackParam;
00367 };
00368 typedef MINIDUMP_CALLBACK_INFORMATION* PMINIDUMP_CALLBACK_INFORMATION;
00369
00370 enum MINIDUMP_TYPE
00371 {
00372 MiniDumpNormal = 0x0000,
00373 MiniDumpWithDataSegs = 0x0001,
00374 MiniDumpWithFullMemory = 0x0002,
00375 MiniDumpWithHandleData = 0x0004,
00376 MiniDumpFilterMemory = 0x0008,
00377 MiniDumpScanMemory = 0x0010,
00378 MiniDumpWithUnloadedModules = 0x0020,
00379 MiniDumpWithIndirectlyReferencedMemory = 0x0040,
00380 MiniDumpFilterModulePaths = 0x0080,
00381 MiniDumpWithProcessThreadData = 0x0100,
00382 MiniDumpWithPrivateReadWriteMemory = 0x0200
00383 };
00384
00385 enum MINIDUMP_STREAM_TYPE
00386 {
00387 UnusedStream = 0,
00388 ReservedStream0 = 1,
00389 ReservedStream1 = 2,
00390 ThreadListStream = 3,
00391 ModuleListStream = 4,
00392 MemoryListStream = 5,
00393 ExceptionStream = 6,
00394 SystemInfoStream = 7,
00395 ThreadExListStream = 8,
00396 Memory64ListStream = 9,
00397 CommentStreamA = 10,
00398 CommentStreamW = 11,
00399 HandleDataStream = 12,
00400 FunctionTableStream = 13,
00401 UnloadedModuleListStream = 14,
00402 MiscInfoStream = 15,
00403 LastReservedStream = 0xffff
00404 };
00405
00406 struct MINIDUMP_LOCATION_DESCRIPTOR
00407 {
00408 uint32 DataSize;
00409 uint32 Rva;
00410 };
00411
00412 struct MINIDUMP_MEMORY_DESCRIPTOR
00413 {
00414 uint64 StartOfMemoryRange;
00415 MINIDUMP_LOCATION_DESCRIPTOR Memory;
00416 };
00417 typedef MINIDUMP_MEMORY_DESCRIPTOR* PMINIDUMP_MEMORY_DESCRIPTOR;
00418
00419 struct MINIDUMP_MEMORY_LIST
00420 {
00421 ULONG32 NumberOfMemoryRanges;
00422
00423 };
00424 typedef MINIDUMP_MEMORY_LIST* PMINIDUMP_MEMORY_LIST;
00425
00426 struct MINIDUMP_HEADER
00427 {
00428 ULONG32 Signature;
00429 ULONG32 Version;
00430 ULONG32 NumberOfStreams;
00431 uint32 StreamDirectoryRva;
00432 ULONG32 CheckSum;
00433 union
00434 {
00435 ULONG32 Reserved;
00436 ULONG32 TimeDateStamp;
00437 };
00438 uint64 Flags;
00439 };
00440 typedef MINIDUMP_HEADER* PMINIDUMP_HEADER;
00441
00442 struct MINIDUMP_DIRECTORY
00443 {
00444 ULONG32 StreamType;
00445 MINIDUMP_LOCATION_DESCRIPTOR Location;
00446 };
00447 typedef MINIDUMP_DIRECTORY* PMINIDUMP_DIRECTORY;
00448
00449 #define CS_API_NAME DbgHelp
00450 #define CS_API_FUNCTIONS "csutil/win32/DbgHelpAPI.fun"
00451
00452 #include "APIdeclare.inc"
00453
00454 #endif //__CSUTIL_DEBGHELPAPI_H__