#
tokens: 50087/50000 1/161 files (page 18/21)
lines: on (toggle) GitHub
raw markdown copy reset
This is page 18 of 21. Use http://codebase.md/wasdubya/x64dbgmcp?lines=true&page={x} to view the full context.

# Directory Structure

```
├── build
│   ├── MCPx64dbg.dp32
│   └── MCPx64dbg.dp64
├── CMakeLists.txt
├── deps
│   ├── pluginsdk
│   │   ├── _dbgfunctions.h
│   │   ├── _plugin_types.h
│   │   ├── _plugins.h
│   │   ├── _scriptapi_argument.h
│   │   ├── _scriptapi_assembler.h
│   │   ├── _scriptapi_bookmark.h
│   │   ├── _scriptapi_comment.h
│   │   ├── _scriptapi_debug.h
│   │   ├── _scriptapi_flag.h
│   │   ├── _scriptapi_function.h
│   │   ├── _scriptapi_gui.h
│   │   ├── _scriptapi_label.h
│   │   ├── _scriptapi_memory.h
│   │   ├── _scriptapi_misc.h
│   │   ├── _scriptapi_module.h
│   │   ├── _scriptapi_pattern.h
│   │   ├── _scriptapi_register.h
│   │   ├── _scriptapi_stack.h
│   │   ├── _scriptapi_symbol.h
│   │   ├── _scriptapi.h
│   │   ├── bridgegraph.h
│   │   ├── bridgelist.h
│   │   ├── bridgemain.h
│   │   ├── dbghelp
│   │   │   ├── dbghelp_x64.a
│   │   │   ├── dbghelp_x64.lib
│   │   │   ├── dbghelp_x86.a
│   │   │   ├── dbghelp_x86.lib
│   │   │   └── dbghelp.h
│   │   ├── DeviceNameResolver
│   │   │   ├── DeviceNameResolver_x64.a
│   │   │   ├── DeviceNameResolver_x64.lib
│   │   │   ├── DeviceNameResolver_x86.a
│   │   │   ├── DeviceNameResolver_x86.lib
│   │   │   └── DeviceNameResolver.h
│   │   ├── jansson
│   │   │   ├── jansson_config.h
│   │   │   ├── jansson_x64.a
│   │   │   ├── jansson_x64.lib
│   │   │   ├── jansson_x64dbg.h
│   │   │   ├── jansson_x86.a
│   │   │   ├── jansson_x86.lib
│   │   │   └── jansson.h
│   │   ├── lz4
│   │   │   ├── lz4_x64.a
│   │   │   ├── lz4_x64.lib
│   │   │   ├── lz4_x86.a
│   │   │   ├── lz4_x86.lib
│   │   │   ├── lz4.h
│   │   │   ├── lz4file.h
│   │   │   └── lz4hc.h
│   │   ├── nlohmann
│   │   │   ├── adl_serializer.hpp
│   │   │   ├── byte_container_with_subtype.hpp
│   │   │   ├── detail
│   │   │   │   ├── abi_macros.hpp
│   │   │   │   ├── conversions
│   │   │   │   │   ├── from_json.hpp
│   │   │   │   │   ├── to_chars.hpp
│   │   │   │   │   └── to_json.hpp
│   │   │   │   ├── exceptions.hpp
│   │   │   │   ├── hash.hpp
│   │   │   │   ├── input
│   │   │   │   │   ├── binary_reader.hpp
│   │   │   │   │   ├── input_adapters.hpp
│   │   │   │   │   ├── json_sax.hpp
│   │   │   │   │   ├── lexer.hpp
│   │   │   │   │   ├── parser.hpp
│   │   │   │   │   └── position_t.hpp
│   │   │   │   ├── iterators
│   │   │   │   │   ├── internal_iterator.hpp
│   │   │   │   │   ├── iter_impl.hpp
│   │   │   │   │   ├── iteration_proxy.hpp
│   │   │   │   │   ├── iterator_traits.hpp
│   │   │   │   │   ├── json_reverse_iterator.hpp
│   │   │   │   │   └── primitive_iterator.hpp
│   │   │   │   ├── json_custom_base_class.hpp
│   │   │   │   ├── json_pointer.hpp
│   │   │   │   ├── json_ref.hpp
│   │   │   │   ├── macro_scope.hpp
│   │   │   │   ├── macro_unscope.hpp
│   │   │   │   ├── meta
│   │   │   │   │   ├── call_std
│   │   │   │   │   │   ├── begin.hpp
│   │   │   │   │   │   └── end.hpp
│   │   │   │   │   ├── cpp_future.hpp
│   │   │   │   │   ├── detected.hpp
│   │   │   │   │   ├── identity_tag.hpp
│   │   │   │   │   ├── is_sax.hpp
│   │   │   │   │   ├── std_fs.hpp
│   │   │   │   │   ├── type_traits.hpp
│   │   │   │   │   └── void_t.hpp
│   │   │   │   ├── output
│   │   │   │   │   ├── binary_writer.hpp
│   │   │   │   │   ├── output_adapters.hpp
│   │   │   │   │   └── serializer.hpp
│   │   │   │   ├── string_concat.hpp
│   │   │   │   ├── string_escape.hpp
│   │   │   │   └── value_t.hpp
│   │   │   ├── json_fwd.hpp
│   │   │   ├── json.hpp
│   │   │   ├── ordered_map.hpp
│   │   │   └── thirdparty
│   │   │       └── hedley
│   │   │           ├── hedley_undef.hpp
│   │   │           └── hedley.hpp
│   │   ├── TitanEngine
│   │   │   ├── TitanEngine_x64.a
│   │   │   ├── TitanEngine_x64.lib
│   │   │   ├── TitanEngine_x86.a
│   │   │   ├── TitanEngine_x86.lib
│   │   │   └── TitanEngine.h
│   │   ├── x32bridge.lib
│   │   ├── x32dbg.lib
│   │   ├── x64bridge.lib
│   │   ├── x64dbg.lib
│   │   └── XEDParse
│   │       ├── XEDParse_x64.a
│   │       ├── XEDParse_x64.lib
│   │       ├── XEDParse_x86.a
│   │       ├── XEDParse_x86.lib
│   │       └── XEDParse.h
│   └── x64dbg_sdk
│       └── pluginsdk
│           ├── _dbgfunctions.h
│           ├── _plugin_types.h
│           ├── _plugins.h
│           ├── _scriptapi_argument.h
│           ├── _scriptapi_assembler.h
│           ├── _scriptapi_bookmark.h
│           ├── _scriptapi_comment.h
│           ├── _scriptapi_debug.h
│           ├── _scriptapi_flag.h
│           ├── _scriptapi_function.h
│           ├── _scriptapi_gui.h
│           ├── _scriptapi_label.h
│           ├── _scriptapi_memory.h
│           ├── _scriptapi_misc.h
│           ├── _scriptapi_module.h
│           ├── _scriptapi_pattern.h
│           ├── _scriptapi_register.h
│           ├── _scriptapi_stack.h
│           ├── _scriptapi_symbol.h
│           ├── _scriptapi.h
│           ├── bridgegraph.h
│           ├── bridgelist.h
│           ├── bridgemain.h
│           ├── dbghelp
│           │   ├── dbghelp_x64.a
│           │   ├── dbghelp_x64.lib
│           │   ├── dbghelp_x86.a
│           │   ├── dbghelp_x86.lib
│           │   └── dbghelp.h
│           ├── DeviceNameResolver
│           │   ├── DeviceNameResolver_x64.a
│           │   ├── DeviceNameResolver_x64.lib
│           │   ├── DeviceNameResolver_x86.a
│           │   ├── DeviceNameResolver_x86.lib
│           │   └── DeviceNameResolver.h
│           ├── jansson
│           │   ├── jansson_config.h
│           │   ├── jansson_x64.a
│           │   ├── jansson_x64.lib
│           │   ├── jansson_x64dbg.h
│           │   ├── jansson_x86.a
│           │   ├── jansson_x86.lib
│           │   └── jansson.h
│           ├── lz4
│           │   ├── lz4_x64.a
│           │   ├── lz4_x64.lib
│           │   ├── lz4_x86.a
│           │   ├── lz4_x86.lib
│           │   ├── lz4.h
│           │   ├── lz4file.h
│           │   └── lz4hc.h
│           ├── TitanEngine
│           │   ├── TitanEngine_x64.a
│           │   ├── TitanEngine_x64.lib
│           │   ├── TitanEngine_x86.a
│           │   ├── TitanEngine_x86.lib
│           │   └── TitanEngine.h
│           ├── TitanEngine_x64.a
│           ├── TitanEngine_x64.lib
│           ├── TitanEngine_x86.a
│           ├── TitanEngine_x86.lib
│           ├── TitanEngine.h
│           ├── x32bridge.lib
│           ├── x32dbg.lib
│           ├── x64bridge.lib
│           ├── x64dbg.lib
│           └── XEDParse
│               ├── XEDParse_x64.a
│               ├── XEDParse_x64.lib
│               ├── XEDParse_x86.a
│               ├── XEDParse_x86.lib
│               └── XEDParse.h
├── include
│   └── nlohmann
│       ├── adl_serializer.hpp
│       ├── byte_container_with_subtype.hpp
│       ├── detail
│       │   ├── abi_macros.hpp
│       │   ├── conversions
│       │   │   ├── from_json.hpp
│       │   │   ├── to_chars.hpp
│       │   │   └── to_json.hpp
│       │   ├── exceptions.hpp
│       │   ├── hash.hpp
│       │   ├── input
│       │   │   ├── binary_reader.hpp
│       │   │   ├── input_adapters.hpp
│       │   │   ├── json_sax.hpp
│       │   │   ├── lexer.hpp
│       │   │   ├── parser.hpp
│       │   │   └── position_t.hpp
│       │   ├── iterators
│       │   │   ├── internal_iterator.hpp
│       │   │   ├── iter_impl.hpp
│       │   │   ├── iteration_proxy.hpp
│       │   │   ├── iterator_traits.hpp
│       │   │   ├── json_reverse_iterator.hpp
│       │   │   └── primitive_iterator.hpp
│       │   ├── json_custom_base_class.hpp
│       │   ├── json_pointer.hpp
│       │   ├── json_ref.hpp
│       │   ├── macro_scope.hpp
│       │   ├── macro_unscope.hpp
│       │   ├── meta
│       │   │   ├── call_std
│       │   │   │   ├── begin.hpp
│       │   │   │   └── end.hpp
│       │   │   ├── cpp_future.hpp
│       │   │   ├── detected.hpp
│       │   │   ├── identity_tag.hpp
│       │   │   ├── is_sax.hpp
│       │   │   ├── std_fs.hpp
│       │   │   ├── type_traits.hpp
│       │   │   └── void_t.hpp
│       │   ├── output
│       │   │   ├── binary_writer.hpp
│       │   │   ├── output_adapters.hpp
│       │   │   └── serializer.hpp
│       │   ├── string_concat.hpp
│       │   ├── string_escape.hpp
│       │   └── value_t.hpp
│       ├── json_fwd.hpp
│       ├── json.hpp
│       ├── ordered_map.hpp
│       └── thirdparty
│           └── hedley
│               ├── hedley_undef.hpp
│               └── hedley.hpp
├── README.md
├── Showcase.gif
├── side profile of a voxel spider walking.jpg
└── src
    ├── MCPx64dbg.cpp
    └── x64dbg.py
```

# Files

--------------------------------------------------------------------------------
/deps/pluginsdk/dbghelp/dbghelp.h:
--------------------------------------------------------------------------------

```
   1 | #ifndef _DBGHELP_
   2 | #define _DBGHELP_
   3 | 
   4 | 
   5 | // As a general principal always call the 64 bit version
   6 | // of every API, if a choice exists.  The 64 bit version
   7 | // works great on 32 bit platforms, and is forward
   8 | // compatible to 64 bit platforms.
   9 | 
  10 | #ifdef _WIN64
  11 | #ifndef _IMAGEHLP64
  12 | #define _IMAGEHLP64
  13 | #endif
  14 | #endif
  15 | 
  16 | #pragma pack(push,8)
  17 | 
  18 | // For those without specstrings.h
  19 | // Since there are different versions of this header, I need to
  20 | // individually test each item and define it if it is not around.
  21 | 
  22 | #ifndef __in
  23 | #define __in
  24 | #endif
  25 | #ifndef __out
  26 | #define __out
  27 | #endif
  28 | #ifndef __inout
  29 | #define __inout
  30 | #endif
  31 | #ifndef __in_opt
  32 | #define __in_opt
  33 | #endif
  34 | #ifndef __out_opt
  35 | #define __out_opt
  36 | #endif
  37 | #ifndef __inout_opt
  38 | #define __inout_opt
  39 | #endif
  40 | #ifndef __in_ecount
  41 | #define __in_ecount(x)
  42 | #endif
  43 | #ifndef __out_ecount
  44 | #define __out_ecount(x)
  45 | #endif
  46 | #ifndef __inout_ecount
  47 | #define __inout_ecount(x)
  48 | #endif
  49 | #ifndef __in_bcount
  50 | #define __in_bcount(x)
  51 | #endif
  52 | #ifndef __out_bcount
  53 | #define __out_bcount(x)
  54 | #endif
  55 | #ifndef __inout_bcount
  56 | #define __inout_bcount(x)
  57 | #endif
  58 | #ifndef __out_xcount
  59 | #define __out_xcount(x)
  60 | #endif
  61 | #ifndef __deref_opt_out
  62 | #define __deref_opt_out
  63 | #endif
  64 | #ifndef __deref_out
  65 | #define __deref_out
  66 | #endif
  67 | #ifndef __out_ecount_opt
  68 | #define __out_ecount_opt(x)
  69 | #endif
  70 | #ifndef __in_bcount_opt
  71 | #define __in_bcount_opt(x)
  72 | #endif
  73 | #ifndef __out_bcount_opt
  74 | #define __out_bcount_opt(x)
  75 | #endif
  76 | #ifndef __deref_out_opt
  77 | #define __deref_out_opt
  78 | #endif
  79 | 
  80 | 
  81 | #ifdef __cplusplus
  82 | extern "C" {
  83 | #endif
  84 | 
  85 | #ifdef _IMAGEHLP_SOURCE_
  86 | #define IMAGEAPI __stdcall
  87 | #define DBHLP_DEPRECIATED
  88 | #else
  89 | #define IMAGEAPI DECLSPEC_IMPORT __stdcall
  90 | #if (_MSC_VER >= 1300) && !defined(MIDL_PASS)
  91 | #define DBHLP_DEPRECIATED   __declspec(deprecated)
  92 | #else
  93 | #define DBHLP_DEPRECIATED
  94 | #endif
  95 | #endif
  96 | 
  97 | #define DBHLPAPI IMAGEAPI
  98 | 
  99 | #define IMAGE_SEPARATION (64*1024)
 100 | 
 101 | // Observant readers may notice that 2 new fields,
 102 | // 'fReadOnly' and 'Version' have been added to
 103 | // the LOADED_IMAGE structure after 'fDOSImage'.
 104 | // This does not change the size of the structure
 105 | // from previous headers.  That is because while
 106 | // 'fDOSImage' is a byte, it is padded by the
 107 | // compiler to 4 bytes.  So the 2 new fields are
 108 | // slipped into the extra space.
 109 | 
 110 | typedef struct _LOADED_IMAGE
 111 | {
 112 |     PSTR                  ModuleName;
 113 |     HANDLE                hFile;
 114 |     PUCHAR                MappedAddress;
 115 | #ifdef _IMAGEHLP64
 116 |     PIMAGE_NT_HEADERS64   FileHeader;
 117 | #else
 118 |     PIMAGE_NT_HEADERS32   FileHeader;
 119 | #endif
 120 |     PIMAGE_SECTION_HEADER LastRvaSection;
 121 |     ULONG                 NumberOfSections;
 122 |     PIMAGE_SECTION_HEADER Sections;
 123 |     ULONG                 Characteristics;
 124 |     BOOLEAN               fSystemImage;
 125 |     BOOLEAN               fDOSImage;
 126 |     BOOLEAN               fReadOnly;
 127 |     UCHAR                 Version;
 128 |     LIST_ENTRY            Links;
 129 |     ULONG                 SizeOfImage;
 130 | } LOADED_IMAGE, *PLOADED_IMAGE;
 131 | 
 132 | #define MAX_SYM_NAME            2000
 133 | 
 134 | 
 135 | // Error codes set by dbghelp functions.  Call GetLastError
 136 | // to see them.
 137 | // Dbghelp also sets error codes found in winerror.h
 138 | 
 139 | #define ERROR_IMAGE_NOT_STRIPPED    0x8800  // the image is not stripped.  No dbg file available.
 140 | #define ERROR_NO_DBG_POINTER        0x8801  // image is stripped but there is no pointer to a dbg file
 141 | #define ERROR_NO_PDB_POINTER        0x8802  // image does not point to a pdb file
 142 | 
 143 | typedef BOOL
 144 | (CALLBACK* PFIND_DEBUG_FILE_CALLBACK)(
 145 |     __in HANDLE FileHandle,
 146 |     __in PCSTR FileName,
 147 |     __in PVOID CallerData
 148 | );
 149 | 
 150 | HANDLE
 151 | IMAGEAPI
 152 | SymFindDebugInfoFile(
 153 |     __in HANDLE hProcess,
 154 |     __in PCSTR FileName,
 155 |     __out_ecount(MAX_PATH + 1) PSTR DebugFilePath,
 156 |     __in_opt PFIND_DEBUG_FILE_CALLBACK Callback,
 157 |     __in_opt PVOID CallerData
 158 | );
 159 | 
 160 | typedef BOOL
 161 | (CALLBACK* PFIND_DEBUG_FILE_CALLBACKW)(
 162 |     __in HANDLE FileHandle,
 163 |     __in PCWSTR FileName,
 164 |     __in PVOID  CallerData
 165 | );
 166 | 
 167 | HANDLE
 168 | IMAGEAPI
 169 | SymFindDebugInfoFileW(
 170 |     __in HANDLE hProcess,
 171 |     __in PCWSTR FileName,
 172 |     __out_ecount(MAX_PATH + 1) PWSTR DebugFilePath,
 173 |     __in_opt PFIND_DEBUG_FILE_CALLBACKW Callback,
 174 |     __in_opt PVOID CallerData
 175 | );
 176 | 
 177 | HANDLE
 178 | IMAGEAPI
 179 | FindDebugInfoFile(
 180 |     __in PCSTR FileName,
 181 |     __in PCSTR SymbolPath,
 182 |     __out_ecount(MAX_PATH + 1) PSTR DebugFilePath
 183 | );
 184 | 
 185 | HANDLE
 186 | IMAGEAPI
 187 | FindDebugInfoFileEx(
 188 |     __in PCSTR FileName,
 189 |     __in PCSTR SymbolPath,
 190 |     __out_ecount(MAX_PATH + 1) PSTR  DebugFilePath,
 191 |     __in_opt PFIND_DEBUG_FILE_CALLBACK Callback,
 192 |     __in_opt PVOID CallerData
 193 | );
 194 | 
 195 | HANDLE
 196 | IMAGEAPI
 197 | FindDebugInfoFileExW(
 198 |     __in PCWSTR FileName,
 199 |     __in PCWSTR SymbolPath,
 200 |     __out_ecount(MAX_PATH + 1) PWSTR DebugFilePath,
 201 |     __in_opt PFIND_DEBUG_FILE_CALLBACKW Callback,
 202 |     __in_opt PVOID CallerData
 203 | );
 204 | 
 205 | typedef BOOL
 206 | (CALLBACK* PFINDFILEINPATHCALLBACK)(
 207 |     __in PCSTR filename,
 208 |     __in PVOID context
 209 | );
 210 | 
 211 | BOOL
 212 | IMAGEAPI
 213 | SymFindFileInPath(
 214 |     __in HANDLE hprocess,
 215 |     __in_opt PCSTR SearchPath,
 216 |     __in PCSTR FileName,
 217 |     __in_opt PVOID id,
 218 |     __in DWORD two,
 219 |     __in DWORD three,
 220 |     __in DWORD flags,
 221 |     __out_ecount(MAX_PATH + 1) PSTR FoundFile,
 222 |     __in_opt PFINDFILEINPATHCALLBACK callback,
 223 |     __in_opt PVOID context
 224 | );
 225 | 
 226 | typedef BOOL
 227 | (CALLBACK* PFINDFILEINPATHCALLBACKW)(
 228 |     __in PCWSTR filename,
 229 |     __in PVOID context
 230 | );
 231 | 
 232 | BOOL
 233 | IMAGEAPI
 234 | SymFindFileInPathW(
 235 |     __in HANDLE hprocess,
 236 |     __in_opt PCWSTR SearchPath,
 237 |     __in PCWSTR FileName,
 238 |     __in_opt PVOID id,
 239 |     __in DWORD two,
 240 |     __in DWORD three,
 241 |     __in DWORD flags,
 242 |     __out_ecount(MAX_PATH + 1) PWSTR FoundFile,
 243 |     __in_opt PFINDFILEINPATHCALLBACKW callback,
 244 |     __in_opt PVOID context
 245 | );
 246 | 
 247 | typedef BOOL
 248 | (CALLBACK* PFIND_EXE_FILE_CALLBACK)(
 249 |     __in HANDLE FileHandle,
 250 |     __in PCSTR FileName,
 251 |     __in_opt PVOID CallerData
 252 | );
 253 | 
 254 | HANDLE
 255 | IMAGEAPI
 256 | SymFindExecutableImage(
 257 |     __in HANDLE hProcess,
 258 |     __in PCSTR FileName,
 259 |     __out_ecount(MAX_PATH + 1) PSTR ImageFilePath,
 260 |     __in PFIND_EXE_FILE_CALLBACK Callback,
 261 |     __in PVOID CallerData
 262 | );
 263 | 
 264 | typedef BOOL
 265 | (CALLBACK* PFIND_EXE_FILE_CALLBACKW)(
 266 |     __in HANDLE FileHandle,
 267 |     __in PCWSTR FileName,
 268 |     __in_opt PVOID CallerData
 269 | );
 270 | 
 271 | HANDLE
 272 | IMAGEAPI
 273 | SymFindExecutableImageW(
 274 |     __in HANDLE hProcess,
 275 |     __in PCWSTR FileName,
 276 |     __out_ecount(MAX_PATH + 1) PWSTR ImageFilePath,
 277 |     __in PFIND_EXE_FILE_CALLBACKW Callback,
 278 |     __in PVOID CallerData
 279 | );
 280 | 
 281 | HANDLE
 282 | IMAGEAPI
 283 | FindExecutableImage(
 284 |     __in PCSTR FileName,
 285 |     __in PCSTR SymbolPath,
 286 |     __out_ecount(MAX_PATH + 1) PSTR ImageFilePath
 287 | );
 288 | 
 289 | HANDLE
 290 | IMAGEAPI
 291 | FindExecutableImageEx(
 292 |     __in PCSTR FileName,
 293 |     __in PCSTR SymbolPath,
 294 |     __out_ecount(MAX_PATH + 1) PSTR ImageFilePath,
 295 |     __in_opt PFIND_EXE_FILE_CALLBACK Callback,
 296 |     __in_opt PVOID CallerData
 297 | );
 298 | 
 299 | HANDLE
 300 | IMAGEAPI
 301 | FindExecutableImageExW(
 302 |     __in PCWSTR FileName,
 303 |     __in PCWSTR SymbolPath,
 304 |     __out_ecount(MAX_PATH + 1) PWSTR ImageFilePath,
 305 |     __in_opt PFIND_EXE_FILE_CALLBACKW Callback,
 306 |     __in PVOID CallerData
 307 | );
 308 | 
 309 | PIMAGE_NT_HEADERS
 310 | IMAGEAPI
 311 | ImageNtHeader(
 312 |     __in PVOID Base
 313 | );
 314 | 
 315 | PVOID
 316 | IMAGEAPI
 317 | ImageDirectoryEntryToDataEx(
 318 |     __in PVOID Base,
 319 |     __in BOOLEAN MappedAsImage,
 320 |     __in USHORT DirectoryEntry,
 321 |     __out PULONG Size,
 322 |     __out_opt PIMAGE_SECTION_HEADER* FoundHeader
 323 | );
 324 | 
 325 | PVOID
 326 | IMAGEAPI
 327 | ImageDirectoryEntryToData(
 328 |     __in PVOID Base,
 329 |     __in BOOLEAN MappedAsImage,
 330 |     __in USHORT DirectoryEntry,
 331 |     __out PULONG Size
 332 | );
 333 | 
 334 | PIMAGE_SECTION_HEADER
 335 | IMAGEAPI
 336 | ImageRvaToSection(
 337 |     __in PIMAGE_NT_HEADERS NtHeaders,
 338 |     __in PVOID Base,
 339 |     __in ULONG Rva
 340 | );
 341 | 
 342 | PVOID
 343 | IMAGEAPI
 344 | ImageRvaToVa(
 345 |     __in PIMAGE_NT_HEADERS NtHeaders,
 346 |     __in PVOID Base,
 347 |     __in ULONG Rva,
 348 |     __in_opt OUT PIMAGE_SECTION_HEADER* LastRvaSection
 349 | );
 350 | 
 351 | #ifndef _WIN64
 352 | // This api won't be ported to Win64 - Fix your code.
 353 | 
 354 | typedef struct _IMAGE_DEBUG_INFORMATION
 355 | {
 356 |     LIST_ENTRY List;
 357 |     DWORD ReservedSize;
 358 |     PVOID ReservedMappedBase;
 359 |     USHORT ReservedMachine;
 360 |     USHORT ReservedCharacteristics;
 361 |     DWORD ReservedCheckSum;
 362 |     DWORD ImageBase;
 363 |     DWORD SizeOfImage;
 364 | 
 365 |     DWORD ReservedNumberOfSections;
 366 |     PIMAGE_SECTION_HEADER ReservedSections;
 367 | 
 368 |     DWORD ReservedExportedNamesSize;
 369 |     PSTR ReservedExportedNames;
 370 | 
 371 |     DWORD ReservedNumberOfFunctionTableEntries;
 372 |     PIMAGE_FUNCTION_ENTRY ReservedFunctionTableEntries;
 373 |     DWORD ReservedLowestFunctionStartingAddress;
 374 |     DWORD ReservedHighestFunctionEndingAddress;
 375 | 
 376 |     DWORD ReservedNumberOfFpoTableEntries;
 377 |     PFPO_DATA ReservedFpoTableEntries;
 378 | 
 379 |     DWORD SizeOfCoffSymbols;
 380 |     PIMAGE_COFF_SYMBOLS_HEADER CoffSymbols;
 381 | 
 382 |     DWORD ReservedSizeOfCodeViewSymbols;
 383 |     PVOID ReservedCodeViewSymbols;
 384 | 
 385 |     PSTR ImageFilePath;
 386 |     PSTR ImageFileName;
 387 |     PSTR ReservedDebugFilePath;
 388 | 
 389 |     DWORD ReservedTimeDateStamp;
 390 | 
 391 |     BOOL  ReservedRomImage;
 392 |     PIMAGE_DEBUG_DIRECTORY ReservedDebugDirectory;
 393 |     DWORD ReservedNumberOfDebugDirectories;
 394 | 
 395 |     DWORD ReservedOriginalFunctionTableBaseAddress;
 396 | 
 397 |     DWORD Reserved[ 2 ];
 398 | 
 399 | } IMAGE_DEBUG_INFORMATION, *PIMAGE_DEBUG_INFORMATION;
 400 | 
 401 | 
 402 | PIMAGE_DEBUG_INFORMATION
 403 | IMAGEAPI
 404 | MapDebugInformation(
 405 |     __in_opt HANDLE FileHandle,
 406 |     __in PCSTR FileName,
 407 |     __in_opt PCSTR SymbolPath,
 408 |     __in ULONG ImageBase
 409 | );
 410 | 
 411 | BOOL
 412 | IMAGEAPI
 413 | UnmapDebugInformation(
 414 |     __out_xcount(unknown) PIMAGE_DEBUG_INFORMATION DebugInfo
 415 | );
 416 | 
 417 | #endif
 418 | 
 419 | BOOL
 420 | IMAGEAPI
 421 | SearchTreeForFile(
 422 |     __in PCSTR RootPath,
 423 |     __in PCSTR InputPathName,
 424 |     __out_ecount(MAX_PATH + 1) PSTR OutputPathBuffer
 425 | );
 426 | 
 427 | BOOL
 428 | IMAGEAPI
 429 | SearchTreeForFileW(
 430 |     __in PCWSTR RootPath,
 431 |     __in PCWSTR InputPathName,
 432 |     __out_ecount(MAX_PATH + 1) PWSTR OutputPathBuffer
 433 | );
 434 | 
 435 | typedef BOOL
 436 | (CALLBACK* PENUMDIRTREE_CALLBACK)(
 437 |     __in PCSTR FilePath,
 438 |     __in_opt PVOID CallerData
 439 | );
 440 | 
 441 | BOOL
 442 | IMAGEAPI
 443 | EnumDirTree(
 444 |     __in_opt HANDLE hProcess,
 445 |     __in PCSTR RootPath,
 446 |     __in PCSTR InputPathName,
 447 |     __out_ecount_opt(MAX_PATH + 1) PSTR OutputPathBuffer,
 448 |     __in_opt PENUMDIRTREE_CALLBACK cb,
 449 |     __in_opt PVOID data
 450 | );
 451 | 
 452 | typedef BOOL
 453 | (CALLBACK* PENUMDIRTREE_CALLBACKW)(
 454 |     __in PCWSTR FilePath,
 455 |     __in_opt PVOID CallerData
 456 | );
 457 | 
 458 | BOOL
 459 | IMAGEAPI
 460 | EnumDirTreeW(
 461 |     __in_opt HANDLE hProcess,
 462 |     __in PCWSTR RootPath,
 463 |     __in PCWSTR InputPathName,
 464 |     __out_ecount_opt(MAX_PATH + 1) PWSTR OutputPathBuffer,
 465 |     __in_opt PENUMDIRTREE_CALLBACKW cb,
 466 |     __in_opt PVOID data
 467 | );
 468 | 
 469 | BOOL
 470 | IMAGEAPI
 471 | MakeSureDirectoryPathExists(
 472 |     __in PCSTR DirPath
 473 | );
 474 | 
 475 | //
 476 | // UnDecorateSymbolName Flags
 477 | //
 478 | 
 479 | #define UNDNAME_COMPLETE                 (0x0000)  // Enable full undecoration
 480 | #define UNDNAME_NO_LEADING_UNDERSCORES   (0x0001)  // Remove leading underscores from MS extended keywords
 481 | #define UNDNAME_NO_MS_KEYWORDS           (0x0002)  // Disable expansion of MS extended keywords
 482 | #define UNDNAME_NO_FUNCTION_RETURNS      (0x0004)  // Disable expansion of return type for primary declaration
 483 | #define UNDNAME_NO_ALLOCATION_MODEL      (0x0008)  // Disable expansion of the declaration model
 484 | #define UNDNAME_NO_ALLOCATION_LANGUAGE   (0x0010)  // Disable expansion of the declaration language specifier
 485 | #define UNDNAME_NO_MS_THISTYPE           (0x0020)  // NYI Disable expansion of MS keywords on the 'this' type for primary declaration
 486 | #define UNDNAME_NO_CV_THISTYPE           (0x0040)  // NYI Disable expansion of CV modifiers on the 'this' type for primary declaration
 487 | #define UNDNAME_NO_THISTYPE              (0x0060)  // Disable all modifiers on the 'this' type
 488 | #define UNDNAME_NO_ACCESS_SPECIFIERS     (0x0080)  // Disable expansion of access specifiers for members
 489 | #define UNDNAME_NO_THROW_SIGNATURES      (0x0100)  // Disable expansion of 'throw-signatures' for functions and pointers to functions
 490 | #define UNDNAME_NO_MEMBER_TYPE           (0x0200)  // Disable expansion of 'static' or 'virtual'ness of members
 491 | #define UNDNAME_NO_RETURN_UDT_MODEL      (0x0400)  // Disable expansion of MS model for UDT returns
 492 | #define UNDNAME_32_BIT_DECODE            (0x0800)  // Undecorate 32-bit decorated names
 493 | #define UNDNAME_NAME_ONLY                (0x1000)  // Crack only the name for primary declaration;
 494 | //  return just [scope::]name.  Does expand template params
 495 | #define UNDNAME_NO_ARGUMENTS             (0x2000)  // Don't undecorate arguments to function
 496 | #define UNDNAME_NO_SPECIAL_SYMS          (0x4000)  // Don't undecorate special names (v-table, vcall, vector xxx, metatype, etc)
 497 | 
 498 | DWORD
 499 | IMAGEAPI
 500 | WINAPI
 501 | UnDecorateSymbolName(
 502 |     __in PCSTR name,
 503 |     __out_ecount(maxStringLength) PSTR outputString,
 504 |     __in DWORD maxStringLength,
 505 |     __in DWORD flags
 506 | );
 507 | 
 508 | DWORD
 509 | IMAGEAPI
 510 | WINAPI
 511 | UnDecorateSymbolNameW(
 512 |     __in PCWSTR name,
 513 |     __out_ecount(maxStringLength) PWSTR outputString,
 514 |     __in DWORD maxStringLength,
 515 |     __in DWORD flags
 516 | );
 517 | 
 518 | //
 519 | // these values are used for synthesized file types
 520 | // that can be passed in as image headers instead of
 521 | // the standard ones from ntimage.h
 522 | //
 523 | 
 524 | #define DBHHEADER_DEBUGDIRS     0x1
 525 | #define DBHHEADER_CVMISC        0x2
 526 | #define DBHHEADER_PDBGUID       0x3
 527 | typedef struct _MODLOAD_DATA
 528 | {
 529 |     DWORD   ssize;                  // size of this struct
 530 |     DWORD   ssig;                   // signature identifying the passed data
 531 |     PVOID   data;                   // pointer to passed data
 532 |     DWORD   size;                   // size of passed data
 533 |     DWORD   flags;                  // options
 534 | } MODLOAD_DATA, *PMODLOAD_DATA;
 535 | 
 536 | typedef struct _MODLOAD_CVMISC
 537 | {
 538 |     DWORD   oCV;                    // ofset to the codeview record
 539 |     size_t  cCV;                    // size of the codeview record
 540 |     DWORD   oMisc;                  // offset to the misc record
 541 |     size_t  cMisc;                  // size of the misc record
 542 |     DWORD   dtImage;                // datetime stamp of the image
 543 |     DWORD   cImage;                 // size of the image
 544 | } MODLOAD_CVMISC, *PMODLOAD_CVMISC;
 545 | 
 546 | typedef struct _MODLOAD_PDBGUID_PDBAGE
 547 | {
 548 |     GUID    PdbGuid;                // Pdb Guid
 549 |     DWORD   PdbAge;                 // Pdb Age
 550 | } MODLOAD_PDBGUID_PDBAGE, *PMODLOAD_PDBGUID_PDBAGE;
 551 | 
 552 | //
 553 | // StackWalking API
 554 | //
 555 | 
 556 | typedef enum
 557 | {
 558 |     AddrMode1616,
 559 |     AddrMode1632,
 560 |     AddrModeReal,
 561 |     AddrModeFlat
 562 | } ADDRESS_MODE;
 563 | 
 564 | typedef struct _tagADDRESS64
 565 | {
 566 |     DWORD64       Offset;
 567 |     WORD          Segment;
 568 |     ADDRESS_MODE  Mode;
 569 | } ADDRESS64, *LPADDRESS64;
 570 | 
 571 | #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
 572 | #define ADDRESS ADDRESS64
 573 | #define LPADDRESS LPADDRESS64
 574 | #else
 575 | typedef struct _tagADDRESS
 576 | {
 577 |     DWORD         Offset;
 578 |     WORD          Segment;
 579 |     ADDRESS_MODE  Mode;
 580 | } ADDRESS, *LPADDRESS;
 581 | 
 582 | __inline
 583 | void
 584 | Address32To64(
 585 |     __in LPADDRESS a32,
 586 |     __out LPADDRESS64 a64
 587 | )
 588 | {
 589 |     a64->Offset = (ULONG64)(LONG64)(LONG)a32->Offset;
 590 |     a64->Segment = a32->Segment;
 591 |     a64->Mode = a32->Mode;
 592 | }
 593 | 
 594 | __inline
 595 | void
 596 | Address64To32(
 597 |     __in LPADDRESS64 a64,
 598 |     __out LPADDRESS a32
 599 | )
 600 | {
 601 |     a32->Offset = (ULONG)a64->Offset;
 602 |     a32->Segment = a64->Segment;
 603 |     a32->Mode = a64->Mode;
 604 | }
 605 | #endif
 606 | 
 607 | //
 608 | // This structure is included in the STACKFRAME structure,
 609 | // and is used to trace through usermode callbacks in a thread's
 610 | // kernel stack.  The values must be copied by the kernel debugger
 611 | // from the DBGKD_GET_VERSION and WAIT_STATE_CHANGE packets.
 612 | //
 613 | 
 614 | //
 615 | // New KDHELP structure for 64 bit system support.
 616 | // This structure is preferred in new code.
 617 | //
 618 | typedef struct _KDHELP64
 619 | {
 620 | 
 621 |     //
 622 |     // address of kernel thread object, as provided in the
 623 |     // WAIT_STATE_CHANGE packet.
 624 |     //
 625 |     DWORD64   Thread;
 626 | 
 627 |     //
 628 |     // offset in thread object to pointer to the current callback frame
 629 |     // in kernel stack.
 630 |     //
 631 |     DWORD   ThCallbackStack;
 632 | 
 633 |     //
 634 |     // offset in thread object to pointer to the current callback backing
 635 |     // store frame in kernel stack.
 636 |     //
 637 |     DWORD   ThCallbackBStore;
 638 | 
 639 |     //
 640 |     // offsets to values in frame:
 641 |     //
 642 |     // address of next callback frame
 643 |     DWORD   NextCallback;
 644 | 
 645 |     // address of saved frame pointer (if applicable)
 646 |     DWORD   FramePointer;
 647 | 
 648 | 
 649 |     //
 650 |     // Address of the kernel function that calls out to user mode
 651 |     //
 652 |     DWORD64   KiCallUserMode;
 653 | 
 654 |     //
 655 |     // Address of the user mode dispatcher function
 656 |     //
 657 |     DWORD64   KeUserCallbackDispatcher;
 658 | 
 659 |     //
 660 |     // Lowest kernel mode address
 661 |     //
 662 |     DWORD64   SystemRangeStart;
 663 | 
 664 |     //
 665 |     // Address of the user mode exception dispatcher function.
 666 |     // Added in API version 10.
 667 |     //
 668 |     DWORD64   KiUserExceptionDispatcher;
 669 | 
 670 |     //
 671 |     // Stack bounds, added in API version 11.
 672 |     //
 673 |     DWORD64   StackBase;
 674 |     DWORD64   StackLimit;
 675 | 
 676 |     DWORD64   Reserved[5];
 677 | 
 678 | } KDHELP64, *PKDHELP64;
 679 | 
 680 | #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
 681 | #define KDHELP KDHELP64
 682 | #define PKDHELP PKDHELP64
 683 | #else
 684 | typedef struct _KDHELP
 685 | {
 686 | 
 687 |     //
 688 |     // address of kernel thread object, as provided in the
 689 |     // WAIT_STATE_CHANGE packet.
 690 |     //
 691 |     DWORD   Thread;
 692 | 
 693 |     //
 694 |     // offset in thread object to pointer to the current callback frame
 695 |     // in kernel stack.
 696 |     //
 697 |     DWORD   ThCallbackStack;
 698 | 
 699 |     //
 700 |     // offsets to values in frame:
 701 |     //
 702 |     // address of next callback frame
 703 |     DWORD   NextCallback;
 704 | 
 705 |     // address of saved frame pointer (if applicable)
 706 |     DWORD   FramePointer;
 707 | 
 708 |     //
 709 |     // Address of the kernel function that calls out to user mode
 710 |     //
 711 |     DWORD   KiCallUserMode;
 712 | 
 713 |     //
 714 |     // Address of the user mode dispatcher function
 715 |     //
 716 |     DWORD   KeUserCallbackDispatcher;
 717 | 
 718 |     //
 719 |     // Lowest kernel mode address
 720 |     //
 721 |     DWORD   SystemRangeStart;
 722 | 
 723 |     //
 724 |     // offset in thread object to pointer to the current callback backing
 725 |     // store frame in kernel stack.
 726 |     //
 727 |     DWORD   ThCallbackBStore;
 728 | 
 729 |     //
 730 |     // Address of the user mode exception dispatcher function.
 731 |     // Added in API version 10.
 732 |     //
 733 |     DWORD   KiUserExceptionDispatcher;
 734 | 
 735 |     //
 736 |     // Stack bounds, added in API version 11.
 737 |     //
 738 |     DWORD   StackBase;
 739 |     DWORD   StackLimit;
 740 | 
 741 |     DWORD   Reserved[5];
 742 | 
 743 | } KDHELP, *PKDHELP;
 744 | 
 745 | __inline
 746 | void
 747 | KdHelp32To64(
 748 |     __in PKDHELP p32,
 749 |     __out PKDHELP64 p64
 750 | )
 751 | {
 752 |     p64->Thread = p32->Thread;
 753 |     p64->ThCallbackStack = p32->ThCallbackStack;
 754 |     p64->NextCallback = p32->NextCallback;
 755 |     p64->FramePointer = p32->FramePointer;
 756 |     p64->KiCallUserMode = p32->KiCallUserMode;
 757 |     p64->KeUserCallbackDispatcher = p32->KeUserCallbackDispatcher;
 758 |     p64->SystemRangeStart = p32->SystemRangeStart;
 759 |     p64->KiUserExceptionDispatcher = p32->KiUserExceptionDispatcher;
 760 |     p64->StackBase = p32->StackBase;
 761 |     p64->StackLimit = p32->StackLimit;
 762 | }
 763 | #endif
 764 | 
 765 | typedef struct _tagSTACKFRAME64
 766 | {
 767 |     ADDRESS64   AddrPC;               // program counter
 768 |     ADDRESS64   AddrReturn;           // return address
 769 |     ADDRESS64   AddrFrame;            // frame pointer
 770 |     ADDRESS64   AddrStack;            // stack pointer
 771 |     ADDRESS64   AddrBStore;           // backing store pointer
 772 |     PVOID       FuncTableEntry;       // pointer to pdata/fpo or NULL
 773 |     DWORD64     Params[4];            // possible arguments to the function
 774 |     BOOL        Far;                  // WOW far call
 775 |     BOOL        Virtual;              // is this a virtual frame?
 776 |     DWORD64     Reserved[3];
 777 |     KDHELP64    KdHelp;
 778 | } STACKFRAME64, *LPSTACKFRAME64;
 779 | 
 780 | #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
 781 | #define STACKFRAME STACKFRAME64
 782 | #define LPSTACKFRAME LPSTACKFRAME64
 783 | #else
 784 | typedef struct _tagSTACKFRAME
 785 | {
 786 |     ADDRESS     AddrPC;               // program counter
 787 |     ADDRESS     AddrReturn;           // return address
 788 |     ADDRESS     AddrFrame;            // frame pointer
 789 |     ADDRESS     AddrStack;            // stack pointer
 790 |     PVOID       FuncTableEntry;       // pointer to pdata/fpo or NULL
 791 |     DWORD       Params[4];            // possible arguments to the function
 792 |     BOOL        Far;                  // WOW far call
 793 |     BOOL        Virtual;              // is this a virtual frame?
 794 |     DWORD       Reserved[3];
 795 |     KDHELP      KdHelp;
 796 |     ADDRESS     AddrBStore;           // backing store pointer
 797 | } STACKFRAME, *LPSTACKFRAME;
 798 | #endif
 799 | 
 800 | 
 801 | typedef
 802 | BOOL
 803 | (__stdcall* PREAD_PROCESS_MEMORY_ROUTINE64)(
 804 |     __in HANDLE hProcess,
 805 |     __in DWORD64 qwBaseAddress,
 806 |     __out_bcount(nSize) PVOID lpBuffer,
 807 |     __in DWORD nSize,
 808 |     __out LPDWORD lpNumberOfBytesRead
 809 | );
 810 | 
 811 | typedef
 812 | PVOID
 813 | (__stdcall* PFUNCTION_TABLE_ACCESS_ROUTINE64)(
 814 |     __in HANDLE ahProcess,
 815 |     __in DWORD64 AddrBase
 816 | );
 817 | 
 818 | typedef
 819 | DWORD64
 820 | (__stdcall* PGET_MODULE_BASE_ROUTINE64)(
 821 |     __in HANDLE hProcess,
 822 |     __in DWORD64 Address
 823 | );
 824 | 
 825 | typedef
 826 | DWORD64
 827 | (__stdcall* PTRANSLATE_ADDRESS_ROUTINE64)(
 828 |     __in HANDLE hProcess,
 829 |     __in HANDLE hThread,
 830 |     __in LPADDRESS64 lpaddr
 831 | );
 832 | 
 833 | BOOL
 834 | IMAGEAPI
 835 | StackWalk64(
 836 |     __in DWORD MachineType,
 837 |     __in HANDLE hProcess,
 838 |     __in HANDLE hThread,
 839 |     __inout LPSTACKFRAME64 StackFrame,
 840 |     __inout PVOID ContextRecord,
 841 |     __in_opt PREAD_PROCESS_MEMORY_ROUTINE64 ReadMemoryRoutine,
 842 |     __in_opt PFUNCTION_TABLE_ACCESS_ROUTINE64 FunctionTableAccessRoutine,
 843 |     __in_opt PGET_MODULE_BASE_ROUTINE64 GetModuleBaseRoutine,
 844 |     __in_opt PTRANSLATE_ADDRESS_ROUTINE64 TranslateAddress
 845 | );
 846 | 
 847 | #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
 848 | 
 849 | #define PREAD_PROCESS_MEMORY_ROUTINE PREAD_PROCESS_MEMORY_ROUTINE64
 850 | #define PFUNCTION_TABLE_ACCESS_ROUTINE PFUNCTION_TABLE_ACCESS_ROUTINE64
 851 | #define PGET_MODULE_BASE_ROUTINE PGET_MODULE_BASE_ROUTINE64
 852 | #define PTRANSLATE_ADDRESS_ROUTINE PTRANSLATE_ADDRESS_ROUTINE64
 853 | 
 854 | #define StackWalk StackWalk64
 855 | 
 856 | #else
 857 | 
 858 | typedef
 859 | BOOL
 860 | (__stdcall* PREAD_PROCESS_MEMORY_ROUTINE)(
 861 |     __in HANDLE hProcess,
 862 |     __in DWORD lpBaseAddress,
 863 |     __out_bcount(nSize) PVOID lpBuffer,
 864 |     __in DWORD nSize,
 865 |     __out PDWORD lpNumberOfBytesRead
 866 | );
 867 | 
 868 | typedef
 869 | PVOID
 870 | (__stdcall* PFUNCTION_TABLE_ACCESS_ROUTINE)(
 871 |     __in HANDLE hProcess,
 872 |     __in DWORD AddrBase
 873 | );
 874 | 
 875 | typedef
 876 | DWORD
 877 | (__stdcall* PGET_MODULE_BASE_ROUTINE)(
 878 |     __in HANDLE hProcess,
 879 |     __in DWORD Address
 880 | );
 881 | 
 882 | typedef
 883 | DWORD
 884 | (__stdcall* PTRANSLATE_ADDRESS_ROUTINE)(
 885 |     __in HANDLE hProcess,
 886 |     __in HANDLE hThread,
 887 |     __out LPADDRESS lpaddr
 888 | );
 889 | 
 890 | BOOL
 891 | IMAGEAPI
 892 | StackWalk(
 893 |     DWORD MachineType,
 894 |     __in HANDLE hProcess,
 895 |     __in HANDLE hThread,
 896 |     __inout LPSTACKFRAME StackFrame,
 897 |     __inout PVOID ContextRecord,
 898 |     __in_opt PREAD_PROCESS_MEMORY_ROUTINE ReadMemoryRoutine,
 899 |     __in_opt PFUNCTION_TABLE_ACCESS_ROUTINE FunctionTableAccessRoutine,
 900 |     __in_opt PGET_MODULE_BASE_ROUTINE GetModuleBaseRoutine,
 901 |     __in_opt PTRANSLATE_ADDRESS_ROUTINE TranslateAddress
 902 | );
 903 | 
 904 | #endif
 905 | 
 906 | 
 907 | #define API_VERSION_NUMBER 11
 908 | 
 909 | typedef struct API_VERSION
 910 | {
 911 |     USHORT  MajorVersion;
 912 |     USHORT  MinorVersion;
 913 |     USHORT  Revision;
 914 |     USHORT  Reserved;
 915 | } API_VERSION, *LPAPI_VERSION;
 916 | 
 917 | LPAPI_VERSION
 918 | IMAGEAPI
 919 | ImagehlpApiVersion(
 920 |     VOID
 921 | );
 922 | 
 923 | LPAPI_VERSION
 924 | IMAGEAPI
 925 | ImagehlpApiVersionEx(
 926 |     __in LPAPI_VERSION AppVersion
 927 | );
 928 | 
 929 | DWORD
 930 | IMAGEAPI
 931 | GetTimestampForLoadedLibrary(
 932 |     __in HMODULE Module
 933 | );
 934 | 
 935 | //
 936 | // typedefs for function pointers
 937 | //
 938 | typedef BOOL
 939 | (CALLBACK* PSYM_ENUMMODULES_CALLBACK64)(
 940 |     __in PCSTR ModuleName,
 941 |     __in DWORD64 BaseOfDll,
 942 |     __in_opt PVOID UserContext
 943 | );
 944 | 
 945 | typedef BOOL
 946 | (CALLBACK* PSYM_ENUMMODULES_CALLBACKW64)(
 947 |     __in PCWSTR ModuleName,
 948 |     __in DWORD64 BaseOfDll,
 949 |     __in_opt PVOID UserContext
 950 | );
 951 | 
 952 | typedef BOOL
 953 | (CALLBACK* PENUMLOADED_MODULES_CALLBACK64)(
 954 |     __in PCSTR ModuleName,
 955 |     __in DWORD64 ModuleBase,
 956 |     __in ULONG ModuleSize,
 957 |     __in_opt PVOID UserContext
 958 | );
 959 | 
 960 | typedef BOOL
 961 | (CALLBACK* PENUMLOADED_MODULES_CALLBACKW64)(
 962 |     __in PCWSTR ModuleName,
 963 |     __in DWORD64 ModuleBase,
 964 |     __in ULONG ModuleSize,
 965 |     __in_opt PVOID UserContext
 966 | );
 967 | 
 968 | typedef BOOL
 969 | (CALLBACK* PSYM_ENUMSYMBOLS_CALLBACK64)(
 970 |     __in PCSTR SymbolName,
 971 |     __in DWORD64 SymbolAddress,
 972 |     __in ULONG SymbolSize,
 973 |     __in_opt PVOID UserContext
 974 | );
 975 | 
 976 | typedef BOOL
 977 | (CALLBACK* PSYM_ENUMSYMBOLS_CALLBACK64W)(
 978 |     __in PCWSTR SymbolName,
 979 |     __in DWORD64 SymbolAddress,
 980 |     __in ULONG SymbolSize,
 981 |     __in_opt PVOID UserContext
 982 | );
 983 | 
 984 | typedef BOOL
 985 | (CALLBACK* PSYMBOL_REGISTERED_CALLBACK64)(
 986 |     __in HANDLE hProcess,
 987 |     __in ULONG ActionCode,
 988 |     __in_opt ULONG64 CallbackData,
 989 |     __in_opt ULONG64 UserContext
 990 | );
 991 | 
 992 | typedef
 993 | PVOID
 994 | (CALLBACK* PSYMBOL_FUNCENTRY_CALLBACK)(
 995 |     __in HANDLE hProcess,
 996 |     __in DWORD AddrBase,
 997 |     __in_opt PVOID UserContext
 998 | );
 999 | 
1000 | typedef
1001 | PVOID
1002 | (CALLBACK* PSYMBOL_FUNCENTRY_CALLBACK64)(
1003 |     __in HANDLE hProcess,
1004 |     __in ULONG64 AddrBase,
1005 |     __in ULONG64 UserContext
1006 | );
1007 | 
1008 | #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
1009 | 
1010 | #define PSYM_ENUMMODULES_CALLBACK PSYM_ENUMMODULES_CALLBACK64
1011 | #define PSYM_ENUMSYMBOLS_CALLBACK PSYM_ENUMSYMBOLS_CALLBACK64
1012 | #define PSYM_ENUMSYMBOLS_CALLBACKW PSYM_ENUMSYMBOLS_CALLBACK64W
1013 | #define PENUMLOADED_MODULES_CALLBACK PENUMLOADED_MODULES_CALLBACK64
1014 | #define PSYMBOL_REGISTERED_CALLBACK PSYMBOL_REGISTERED_CALLBACK64
1015 | #define PSYMBOL_FUNCENTRY_CALLBACK PSYMBOL_FUNCENTRY_CALLBACK64
1016 | 
1017 | #else
1018 | 
1019 | typedef BOOL
1020 | (CALLBACK* PSYM_ENUMMODULES_CALLBACK)(
1021 |     __in PCSTR ModuleName,
1022 |     __in ULONG BaseOfDll,
1023 |     __in_opt PVOID UserContext
1024 | );
1025 | 
1026 | typedef BOOL
1027 | (CALLBACK* PSYM_ENUMSYMBOLS_CALLBACK)(
1028 |     __in PCSTR SymbolName,
1029 |     __in ULONG SymbolAddress,
1030 |     __in ULONG SymbolSize,
1031 |     __in_opt PVOID UserContext
1032 | );
1033 | 
1034 | typedef BOOL
1035 | (CALLBACK* PSYM_ENUMSYMBOLS_CALLBACKW)(
1036 |     __in PCWSTR SymbolName,
1037 |     __in ULONG SymbolAddress,
1038 |     __in ULONG SymbolSize,
1039 |     __in_opt PVOID UserContext
1040 | );
1041 | 
1042 | typedef BOOL
1043 | (CALLBACK* PENUMLOADED_MODULES_CALLBACK)(
1044 |     __in PCSTR ModuleName,
1045 |     __in ULONG ModuleBase,
1046 |     __in ULONG ModuleSize,
1047 |     __in_opt PVOID UserContext
1048 | );
1049 | 
1050 | typedef BOOL
1051 | (CALLBACK* PSYMBOL_REGISTERED_CALLBACK)(
1052 |     __in HANDLE hProcess,
1053 |     __in ULONG ActionCode,
1054 |     __in_opt PVOID CallbackData,
1055 |     __in_opt PVOID UserContext
1056 | );
1057 | 
1058 | #endif
1059 | 
1060 | 
1061 | // values found in SYMBOL_INFO.Tag
1062 | //
1063 | // This was taken from cvconst.h and should
1064 | // not override any values found there.
1065 | //
1066 | // #define _NO_CVCONST_H_ if you don't
1067 | // have access to that file...
1068 | 
1069 | #ifdef _NO_CVCONST_H
1070 | 
1071 | // DIA enums
1072 | 
1073 | enum SymTagEnum
1074 | {
1075 |     SymTagNull,
1076 |     SymTagExe,
1077 |     SymTagCompiland,
1078 |     SymTagCompilandDetails,
1079 |     SymTagCompilandEnv,
1080 |     SymTagFunction,
1081 |     SymTagBlock,
1082 |     SymTagData,
1083 |     SymTagAnnotation,
1084 |     SymTagLabel,
1085 |     SymTagPublicSymbol,
1086 |     SymTagUDT,
1087 |     SymTagEnum,
1088 |     SymTagFunctionType,
1089 |     SymTagPointerType,
1090 |     SymTagArrayType,
1091 |     SymTagBaseType,
1092 |     SymTagTypedef,
1093 |     SymTagBaseClass,
1094 |     SymTagFriend,
1095 |     SymTagFunctionArgType,
1096 |     SymTagFuncDebugStart,
1097 |     SymTagFuncDebugEnd,
1098 |     SymTagUsingNamespace,
1099 |     SymTagVTableShape,
1100 |     SymTagVTable,
1101 |     SymTagCustom,
1102 |     SymTagThunk,
1103 |     SymTagCustomType,
1104 |     SymTagManagedType,
1105 |     SymTagDimension,
1106 |     SymTagMax
1107 | };
1108 | 
1109 | #endif
1110 | 
1111 | //
1112 | // flags found in SYMBOL_INFO.Flags
1113 | //
1114 | 
1115 | #define SYMFLAG_VALUEPRESENT     0x00000001
1116 | #define SYMFLAG_REGISTER         0x00000008
1117 | #define SYMFLAG_REGREL           0x00000010
1118 | #define SYMFLAG_FRAMEREL         0x00000020
1119 | #define SYMFLAG_PARAMETER        0x00000040
1120 | #define SYMFLAG_LOCAL            0x00000080
1121 | #define SYMFLAG_CONSTANT         0x00000100
1122 | #define SYMFLAG_EXPORT           0x00000200
1123 | #define SYMFLAG_FORWARDER        0x00000400
1124 | #define SYMFLAG_FUNCTION         0x00000800
1125 | #define SYMFLAG_VIRTUAL          0x00001000
1126 | #define SYMFLAG_THUNK            0x00002000
1127 | #define SYMFLAG_TLSREL           0x00004000
1128 | #define SYMFLAG_SLOT             0x00008000
1129 | #define SYMFLAG_ILREL            0x00010000
1130 | #define SYMFLAG_METADATA         0x00020000
1131 | #define SYMFLAG_CLR_TOKEN        0x00040000
1132 | 
1133 | // this resets SymNext/Prev to the beginning
1134 | // of the module passed in the address field
1135 | 
1136 | #define SYMFLAG_RESET            0x80000000
1137 | 
1138 | //
1139 | // symbol type enumeration
1140 | //
1141 | typedef enum
1142 | {
1143 |     SymNone = 0,
1144 |     SymCoff,
1145 |     SymCv,
1146 |     SymPdb,
1147 |     SymExport,
1148 |     SymDeferred,
1149 |     SymSym,       // .sym file
1150 |     SymDia,
1151 |     SymVirtual,
1152 |     NumSymTypes
1153 | } SYM_TYPE;
1154 | 
1155 | //
1156 | // symbol data structure
1157 | //
1158 | 
1159 | typedef struct _IMAGEHLP_SYMBOL64
1160 | {
1161 |     DWORD   SizeOfStruct;           // set to sizeof(IMAGEHLP_SYMBOL64)
1162 |     DWORD64 Address;                // virtual address including dll base address
1163 |     DWORD   Size;                   // estimated size of symbol, can be zero
1164 |     DWORD   Flags;                  // info about the symbols, see the SYMF defines
1165 |     DWORD   MaxNameLength;          // maximum size of symbol name in 'Name'
1166 |     CHAR    Name[1];                // symbol name (null terminated string)
1167 | } IMAGEHLP_SYMBOL64, *PIMAGEHLP_SYMBOL64;
1168 | 
1169 | typedef struct _IMAGEHLP_SYMBOL64_PACKAGE
1170 | {
1171 |     IMAGEHLP_SYMBOL64 sym;
1172 |     CHAR              name[MAX_SYM_NAME + 1];
1173 | } IMAGEHLP_SYMBOL64_PACKAGE, *PIMAGEHLP_SYMBOL64_PACKAGE;
1174 | 
1175 | typedef struct _IMAGEHLP_SYMBOLW64
1176 | {
1177 |     DWORD   SizeOfStruct;           // set to sizeof(IMAGEHLP_SYMBOLW64)
1178 |     DWORD64 Address;                // virtual address including dll base address
1179 |     DWORD   Size;                   // estimated size of symbol, can be zero
1180 |     DWORD   Flags;                  // info about the symbols, see the SYMF defines
1181 |     DWORD   MaxNameLength;          // maximum size of symbol name in 'Name'
1182 |     WCHAR   Name[1];                // symbol name (null terminated string)
1183 | } IMAGEHLP_SYMBOLW64, *PIMAGEHLP_SYMBOLW64;
1184 | 
1185 | typedef struct _IMAGEHLP_SYMBOLW64_PACKAGE
1186 | {
1187 |     IMAGEHLP_SYMBOLW64 sym;
1188 |     WCHAR              name[MAX_SYM_NAME + 1];
1189 | } IMAGEHLP_SYMBOLW64_PACKAGE, *PIMAGEHLP_SYMBOLW64_PACKAGE;
1190 | 
1191 | #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
1192 | 
1193 | #define IMAGEHLP_SYMBOL IMAGEHLP_SYMBOL64
1194 | #define PIMAGEHLP_SYMBOL PIMAGEHLP_SYMBOL64
1195 | #define IMAGEHLP_SYMBOL_PACKAGE IMAGEHLP_SYMBOL64_PACKAGE
1196 | #define PIMAGEHLP_SYMBOL_PACKAGE PIMAGEHLP_SYMBOL64_PACKAGE
1197 | #define IMAGEHLP_SYMBOLW IMAGEHLP_SYMBOLW64
1198 | #define PIMAGEHLP_SYMBOLW PIMAGEHLP_SYMBOLW64
1199 | #define IMAGEHLP_SYMBOLW_PACKAGE IMAGEHLP_SYMBOLW64_PACKAGE
1200 | #define PIMAGEHLP_SYMBOLW_PACKAGE PIMAGEHLP_SYMBOLW64_PACKAGE
1201 | 
1202 | #else
1203 | 
1204 | typedef struct _IMAGEHLP_SYMBOL
1205 | {
1206 |     DWORD SizeOfStruct;           // set to sizeof(IMAGEHLP_SYMBOL)
1207 |     DWORD Address;                // virtual address including dll base address
1208 |     DWORD Size;                   // estimated size of symbol, can be zero
1209 |     DWORD Flags;                  // info about the symbols, see the SYMF defines
1210 |     DWORD                       MaxNameLength;          // maximum size of symbol name in 'Name'
1211 |     CHAR                        Name[1];                // symbol name (null terminated string)
1212 | } IMAGEHLP_SYMBOL, *PIMAGEHLP_SYMBOL;
1213 | 
1214 | typedef struct _IMAGEHLP_SYMBOL_PACKAGE
1215 | {
1216 |     IMAGEHLP_SYMBOL sym;
1217 |     CHAR            name[MAX_SYM_NAME + 1];
1218 | } IMAGEHLP_SYMBOL_PACKAGE, *PIMAGEHLP_SYMBOL_PACKAGE;
1219 | 
1220 | typedef struct _IMAGEHLP_SYMBOLW
1221 | {
1222 |     DWORD SizeOfStruct;           // set to sizeof(IMAGEHLP_SYMBOLW)
1223 |     DWORD Address;                // virtual address including dll base address
1224 |     DWORD Size;                   // estimated size of symbol, can be zero
1225 |     DWORD Flags;                  // info about the symbols, see the SYMF defines
1226 |     DWORD                       MaxNameLength;          // maximum size of symbol name in 'Name'
1227 |     WCHAR                       Name[1];                // symbol name (null terminated string)
1228 | } IMAGEHLP_SYMBOLW, *PIMAGEHLP_SYMBOLW;
1229 | 
1230 | typedef struct _IMAGEHLP_SYMBOLW_PACKAGE
1231 | {
1232 |     IMAGEHLP_SYMBOLW sym;
1233 |     WCHAR            name[MAX_SYM_NAME + 1];
1234 | } IMAGEHLP_SYMBOLW_PACKAGE, *PIMAGEHLP_SYMBOLW_PACKAGE;
1235 | 
1236 | #endif
1237 | 
1238 | //
1239 | // module data structure
1240 | //
1241 | 
1242 | typedef struct _IMAGEHLP_MODULE64
1243 | {
1244 |     DWORD    SizeOfStruct;           // set to sizeof(IMAGEHLP_MODULE64)
1245 |     DWORD64  BaseOfImage;            // base load address of module
1246 |     DWORD    ImageSize;              // virtual size of the loaded module
1247 |     DWORD    TimeDateStamp;          // date/time stamp from pe header
1248 |     DWORD    CheckSum;               // checksum from the pe header
1249 |     DWORD    NumSyms;                // number of symbols in the symbol table
1250 |     SYM_TYPE SymType;                // type of symbols loaded
1251 |     CHAR     ModuleName[32];         // module name
1252 |     CHAR     ImageName[256];         // image name
1253 |     CHAR     LoadedImageName[256];   // symbol file name
1254 |     // new elements: 07-Jun-2002
1255 |     CHAR     LoadedPdbName[256];     // pdb file name
1256 |     DWORD    CVSig;                  // Signature of the CV record in the debug directories
1257 |     CHAR     CVData[MAX_PATH * 3];   // Contents of the CV record
1258 |     DWORD    PdbSig;                 // Signature of PDB
1259 |     GUID     PdbSig70;               // Signature of PDB (VC 7 and up)
1260 |     DWORD    PdbAge;                 // DBI age of pdb
1261 |     BOOL     PdbUnmatched;           // loaded an unmatched pdb
1262 |     BOOL     DbgUnmatched;           // loaded an unmatched dbg
1263 |     BOOL     LineNumbers;            // we have line number information
1264 |     BOOL     GlobalSymbols;          // we have internal symbol information
1265 |     BOOL     TypeInfo;               // we have type information
1266 |     // new elements: 17-Dec-2003
1267 |     BOOL     SourceIndexed;          // pdb supports source server
1268 |     BOOL     Publics;                // contains public symbols
1269 | } IMAGEHLP_MODULE64, *PIMAGEHLP_MODULE64;
1270 | 
1271 | typedef struct _IMAGEHLP_MODULEW64
1272 | {
1273 |     DWORD    SizeOfStruct;           // set to sizeof(IMAGEHLP_MODULE64)
1274 |     DWORD64  BaseOfImage;            // base load address of module
1275 |     DWORD    ImageSize;              // virtual size of the loaded module
1276 |     DWORD    TimeDateStamp;          // date/time stamp from pe header
1277 |     DWORD    CheckSum;               // checksum from the pe header
1278 |     DWORD    NumSyms;                // number of symbols in the symbol table
1279 |     SYM_TYPE SymType;                // type of symbols loaded
1280 |     WCHAR    ModuleName[32];         // module name
1281 |     WCHAR    ImageName[256];         // image name
1282 |     // new elements: 07-Jun-2002
1283 |     WCHAR    LoadedImageName[256];   // symbol file name
1284 |     WCHAR    LoadedPdbName[256];     // pdb file name
1285 |     DWORD    CVSig;                  // Signature of the CV record in the debug directories
1286 |     WCHAR        CVData[MAX_PATH * 3];   // Contents of the CV record
1287 |     DWORD    PdbSig;                 // Signature of PDB
1288 |     GUID     PdbSig70;               // Signature of PDB (VC 7 and up)
1289 |     DWORD    PdbAge;                 // DBI age of pdb
1290 |     BOOL     PdbUnmatched;           // loaded an unmatched pdb
1291 |     BOOL     DbgUnmatched;           // loaded an unmatched dbg
1292 |     BOOL     LineNumbers;            // we have line number information
1293 |     BOOL     GlobalSymbols;          // we have internal symbol information
1294 |     BOOL     TypeInfo;               // we have type information
1295 |     // new elements: 17-Dec-2003
1296 |     BOOL     SourceIndexed;          // pdb supports source server
1297 |     BOOL     Publics;                // contains public symbols
1298 | } IMAGEHLP_MODULEW64, *PIMAGEHLP_MODULEW64;
1299 | 
1300 | #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
1301 | #define IMAGEHLP_MODULE IMAGEHLP_MODULE64
1302 | #define PIMAGEHLP_MODULE PIMAGEHLP_MODULE64
1303 | #define IMAGEHLP_MODULEW IMAGEHLP_MODULEW64
1304 | #define PIMAGEHLP_MODULEW PIMAGEHLP_MODULEW64
1305 | #else
1306 | typedef struct _IMAGEHLP_MODULE
1307 | {
1308 |     DWORD    SizeOfStruct;           // set to sizeof(IMAGEHLP_MODULE)
1309 |     DWORD    BaseOfImage;            // base load address of module
1310 |     DWORD    ImageSize;              // virtual size of the loaded module
1311 |     DWORD    TimeDateStamp;          // date/time stamp from pe header
1312 |     DWORD    CheckSum;               // checksum from the pe header
1313 |     DWORD    NumSyms;                // number of symbols in the symbol table
1314 |     SYM_TYPE SymType;                // type of symbols loaded
1315 |     CHAR     ModuleName[32];         // module name
1316 |     CHAR     ImageName[256];         // image name
1317 |     CHAR     LoadedImageName[256];   // symbol file name
1318 | } IMAGEHLP_MODULE, *PIMAGEHLP_MODULE;
1319 | 
1320 | typedef struct _IMAGEHLP_MODULEW
1321 | {
1322 |     DWORD    SizeOfStruct;           // set to sizeof(IMAGEHLP_MODULE)
1323 |     DWORD    BaseOfImage;            // base load address of module
1324 |     DWORD    ImageSize;              // virtual size of the loaded module
1325 |     DWORD    TimeDateStamp;          // date/time stamp from pe header
1326 |     DWORD    CheckSum;               // checksum from the pe header
1327 |     DWORD    NumSyms;                // number of symbols in the symbol table
1328 |     SYM_TYPE SymType;                // type of symbols loaded
1329 |     WCHAR    ModuleName[32];         // module name
1330 |     WCHAR    ImageName[256];         // image name
1331 |     WCHAR    LoadedImageName[256];   // symbol file name
1332 | } IMAGEHLP_MODULEW, *PIMAGEHLP_MODULEW;
1333 | #endif
1334 | 
1335 | //
1336 | // source file line data structure
1337 | //
1338 | 
1339 | typedef struct _IMAGEHLP_LINE64
1340 | {
1341 |     DWORD    SizeOfStruct;           // set to sizeof(IMAGEHLP_LINE64)
1342 |     PVOID    Key;                    // internal
1343 |     DWORD    LineNumber;             // line number in file
1344 |     PCHAR    FileName;               // full filename
1345 |     DWORD64  Address;                // first instruction of line
1346 | } IMAGEHLP_LINE64, *PIMAGEHLP_LINE64;
1347 | 
1348 | typedef struct _IMAGEHLP_LINEW64
1349 | {
1350 |     DWORD    SizeOfStruct;           // set to sizeof(IMAGEHLP_LINE64)
1351 |     PVOID    Key;                    // internal
1352 |     DWORD    LineNumber;             // line number in file
1353 |     PWSTR    FileName;               // full filename
1354 |     DWORD64  Address;                // first instruction of line
1355 | } IMAGEHLP_LINEW64, *PIMAGEHLP_LINEW64;
1356 | 
1357 | #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
1358 | #define IMAGEHLP_LINE IMAGEHLP_LINE64
1359 | #define PIMAGEHLP_LINE PIMAGEHLP_LINE64
1360 | #else
1361 | typedef struct _IMAGEHLP_LINE
1362 | {
1363 |     DWORD    SizeOfStruct;           // set to sizeof(IMAGEHLP_LINE)
1364 |     PVOID    Key;                    // internal
1365 |     DWORD    LineNumber;             // line number in file
1366 |     PCHAR    FileName;               // full filename
1367 |     DWORD    Address;                // first instruction of line
1368 | } IMAGEHLP_LINE, *PIMAGEHLP_LINE;
1369 | 
1370 | typedef struct _IMAGEHLP_LINEW
1371 | {
1372 |     DWORD    SizeOfStruct;           // set to sizeof(IMAGEHLP_LINE64)
1373 |     PVOID    Key;                    // internal
1374 |     DWORD    LineNumber;             // line number in file
1375 |     PCHAR    FileName;               // full filename
1376 |     DWORD64  Address;                // first instruction of line
1377 | } IMAGEHLP_LINEW, *PIMAGEHLP_LINEW;
1378 | #endif
1379 | 
1380 | //
1381 | // source file structure
1382 | //
1383 | 
1384 | typedef struct _SOURCEFILE
1385 | {
1386 |     DWORD64  ModBase;                // base address of loaded module
1387 |     PCHAR    FileName;               // full filename of source
1388 | } SOURCEFILE, *PSOURCEFILE;
1389 | 
1390 | typedef struct _SOURCEFILEW
1391 | {
1392 |     DWORD64  ModBase;                // base address of loaded module
1393 |     PWSTR    FileName;               // full filename of source
1394 | } SOURCEFILEW, *PSOURCEFILEW;
1395 | 
1396 | //
1397 | // data structures used for registered symbol callbacks
1398 | //
1399 | 
1400 | #define CBA_DEFERRED_SYMBOL_LOAD_START          0x00000001
1401 | #define CBA_DEFERRED_SYMBOL_LOAD_COMPLETE       0x00000002
1402 | #define CBA_DEFERRED_SYMBOL_LOAD_FAILURE        0x00000003
1403 | #define CBA_SYMBOLS_UNLOADED                    0x00000004
1404 | #define CBA_DUPLICATE_SYMBOL                    0x00000005
1405 | #define CBA_READ_MEMORY                         0x00000006
1406 | #define CBA_DEFERRED_SYMBOL_LOAD_CANCEL         0x00000007
1407 | #define CBA_SET_OPTIONS                         0x00000008
1408 | #define CBA_EVENT                               0x00000010
1409 | #define CBA_DEFERRED_SYMBOL_LOAD_PARTIAL        0x00000020
1410 | #define CBA_DEBUG_INFO                          0x10000000
1411 | #define CBA_SRCSRV_INFO                         0x20000000
1412 | #define CBA_SRCSRV_EVENT                        0x40000000
1413 | 
1414 | typedef struct _IMAGEHLP_CBA_READ_MEMORY
1415 | {
1416 |     DWORD64   addr;                                     // address to read from
1417 |     PVOID     buf;                                      // buffer to read to
1418 |     DWORD     bytes;                                    // amount of bytes to read
1419 |     DWORD*    bytesread;                                // pointer to store amount of bytes read
1420 | } IMAGEHLP_CBA_READ_MEMORY, *PIMAGEHLP_CBA_READ_MEMORY;
1421 | 
1422 | enum
1423 | {
1424 |     sevInfo = 0,
1425 |     sevProblem,
1426 |     sevAttn,
1427 |     sevFatal,
1428 |     sevMax  // unused
1429 | };
1430 | 
1431 | #define EVENT_SRCSPEW_START 100
1432 | #define EVENT_SRCSPEW       100
1433 | #define EVENT_SRCSPEW_END   199
1434 | 
1435 | typedef struct _IMAGEHLP_CBA_EVENT
1436 | {
1437 |     DWORD severity;                                     // values from sevInfo to sevFatal
1438 |     DWORD code;                                         // numerical code IDs the error
1439 |     PCHAR desc;                                         // may contain a text description of the error
1440 |     PVOID object;                                       // value dependant upon the error code
1441 | } IMAGEHLP_CBA_EVENT, *PIMAGEHLP_CBA_EVENT;
1442 | 
1443 | typedef struct _IMAGEHLP_CBA_EVENTW
1444 | {
1445 |     DWORD  severity;                                     // values from sevInfo to sevFatal
1446 |     DWORD  code;                                         // numerical code IDs the error
1447 |     PCWSTR desc;                                         // may contain a text description of the error
1448 |     PVOID  object;                                       // value dependant upon the error code
1449 | } IMAGEHLP_CBA_EVENTW, *PIMAGEHLP_CBA_EVENTW;
1450 | 
1451 | typedef struct _IMAGEHLP_DEFERRED_SYMBOL_LOAD64
1452 | {
1453 |     DWORD    SizeOfStruct;           // set to sizeof(IMAGEHLP_DEFERRED_SYMBOL_LOAD64)
1454 |     DWORD64  BaseOfImage;            // base load address of module
1455 |     DWORD    CheckSum;               // checksum from the pe header
1456 |     DWORD    TimeDateStamp;          // date/time stamp from pe header
1457 |     CHAR     FileName[MAX_PATH];     // symbols file or image name
1458 |     BOOLEAN  Reparse;                // load failure reparse
1459 |     HANDLE   hFile;                  // file handle, if passed
1460 |     DWORD    Flags;                     //
1461 | } IMAGEHLP_DEFERRED_SYMBOL_LOAD64, *PIMAGEHLP_DEFERRED_SYMBOL_LOAD64;
1462 | 
1463 | typedef struct _IMAGEHLP_DEFERRED_SYMBOL_LOADW64
1464 | {
1465 |     DWORD    SizeOfStruct;           // set to sizeof(IMAGEHLP_DEFERRED_SYMBOL_LOADW64)
1466 |     DWORD64  BaseOfImage;            // base load address of module
1467 |     DWORD    CheckSum;               // checksum from the pe header
1468 |     DWORD    TimeDateStamp;          // date/time stamp from pe header
1469 |     WCHAR    FileName[MAX_PATH + 1]; // symbols file or image name
1470 |     BOOLEAN  Reparse;                // load failure reparse
1471 |     HANDLE   hFile;                  // file handle, if passed
1472 |     DWORD    Flags;         //
1473 | } IMAGEHLP_DEFERRED_SYMBOL_LOADW64, *PIMAGEHLP_DEFERRED_SYMBOL_LOADW64;
1474 | 
1475 | #define DSLFLAG_MISMATCHED_PDB  0x1
1476 | #define DSLFLAG_MISMATCHED_DBG  0x2
1477 | 
1478 | #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
1479 | #define IMAGEHLP_DEFERRED_SYMBOL_LOAD IMAGEHLP_DEFERRED_SYMBOL_LOAD64
1480 | #define PIMAGEHLP_DEFERRED_SYMBOL_LOAD PIMAGEHLP_DEFERRED_SYMBOL_LOAD64
1481 | #else
1482 | typedef struct _IMAGEHLP_DEFERRED_SYMBOL_LOAD
1483 | {
1484 |     DWORD    SizeOfStruct;           // set to sizeof(IMAGEHLP_DEFERRED_SYMBOL_LOAD)
1485 |     DWORD    BaseOfImage;            // base load address of module
1486 |     DWORD    CheckSum;               // checksum from the pe header
1487 |     DWORD    TimeDateStamp;          // date/time stamp from pe header
1488 |     CHAR     FileName[MAX_PATH];     // symbols file or image name
1489 |     BOOLEAN  Reparse;                // load failure reparse
1490 |     HANDLE   hFile;                  // file handle, if passed
1491 | } IMAGEHLP_DEFERRED_SYMBOL_LOAD, *PIMAGEHLP_DEFERRED_SYMBOL_LOAD;
1492 | #endif
1493 | 
1494 | typedef struct _IMAGEHLP_DUPLICATE_SYMBOL64
1495 | {
1496 |     DWORD              SizeOfStruct;           // set to sizeof(IMAGEHLP_DUPLICATE_SYMBOL64)
1497 |     DWORD              NumberOfDups;           // number of duplicates in the Symbol array
1498 |     PIMAGEHLP_SYMBOL64 Symbol;                 // array of duplicate symbols
1499 |     DWORD              SelectedSymbol;         // symbol selected (-1 to start)
1500 | } IMAGEHLP_DUPLICATE_SYMBOL64, *PIMAGEHLP_DUPLICATE_SYMBOL64;
1501 | 
1502 | #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
1503 | #define IMAGEHLP_DUPLICATE_SYMBOL IMAGEHLP_DUPLICATE_SYMBOL64
1504 | #define PIMAGEHLP_DUPLICATE_SYMBOL PIMAGEHLP_DUPLICATE_SYMBOL64
1505 | #else
1506 | typedef struct _IMAGEHLP_DUPLICATE_SYMBOL
1507 | {
1508 |     DWORD            SizeOfStruct;           // set to sizeof(IMAGEHLP_DUPLICATE_SYMBOL)
1509 |     DWORD            NumberOfDups;           // number of duplicates in the Symbol array
1510 |     PIMAGEHLP_SYMBOL Symbol;                 // array of duplicate symbols
1511 |     DWORD            SelectedSymbol;         // symbol selected (-1 to start)
1512 | } IMAGEHLP_DUPLICATE_SYMBOL, *PIMAGEHLP_DUPLICATE_SYMBOL;
1513 | #endif
1514 | 
1515 | // If dbghelp ever needs to display graphical UI, it will use this as the parent window.
1516 | 
1517 | BOOL
1518 | IMAGEAPI
1519 | SymSetParentWindow(
1520 |     __in HWND hwnd
1521 | );
1522 | 
1523 | PCHAR
1524 | IMAGEAPI
1525 | SymSetHomeDirectory(
1526 |     __in_opt HANDLE hProcess,
1527 |     __in_opt PCSTR dir
1528 | );
1529 | 
1530 | PWSTR
1531 | IMAGEAPI
1532 | SymSetHomeDirectoryW(
1533 |     __in_opt HANDLE hProcess,
1534 |     __in_opt PCWSTR dir
1535 | );
1536 | 
1537 | PCHAR
1538 | IMAGEAPI
1539 | SymGetHomeDirectory(
1540 |     __in DWORD type,
1541 |     __out_ecount(size) PSTR dir,
1542 |     __in size_t size
1543 | );
1544 | 
1545 | PWSTR
1546 | IMAGEAPI
1547 | SymGetHomeDirectoryW(
1548 |     __in DWORD type,
1549 |     __out_ecount(size) PWSTR dir,
1550 |     __in size_t size
1551 | );
1552 | 
1553 | enum
1554 | {
1555 |     hdBase = 0, // root directory for dbghelp
1556 |     hdSym,      // where symbols are stored
1557 |     hdSrc,      // where source is stored
1558 |     hdMax       // end marker
1559 | };
1560 | 
1561 | typedef struct _OMAP
1562 | {
1563 |     ULONG  rva;
1564 |     ULONG  rvaTo;
1565 | } OMAP, *POMAP;
1566 | 
1567 | BOOL
1568 | IMAGEAPI
1569 | SymGetOmaps(
1570 |     __in HANDLE hProcess,
1571 |     __in DWORD64 BaseOfDll,
1572 |     __out POMAP* OmapTo,
1573 |     __out PDWORD64 cOmapTo,
1574 |     __out POMAP* OmapFrom,
1575 |     __out PDWORD64 cOmapFrom
1576 | );
1577 | 
1578 | //
1579 | // options that are set/returned by SymSetOptions() & SymGetOptions()
1580 | // these are used as a mask
1581 | //
1582 | #define SYMOPT_CASE_INSENSITIVE          0x00000001
1583 | #define SYMOPT_UNDNAME                   0x00000002
1584 | #define SYMOPT_DEFERRED_LOADS            0x00000004
1585 | #define SYMOPT_NO_CPP                    0x00000008
1586 | #define SYMOPT_LOAD_LINES                0x00000010
1587 | #define SYMOPT_OMAP_FIND_NEAREST         0x00000020
1588 | #define SYMOPT_LOAD_ANYTHING             0x00000040
1589 | #define SYMOPT_IGNORE_CVREC              0x00000080
1590 | #define SYMOPT_NO_UNQUALIFIED_LOADS      0x00000100
1591 | #define SYMOPT_FAIL_CRITICAL_ERRORS      0x00000200
1592 | #define SYMOPT_EXACT_SYMBOLS             0x00000400
1593 | #define SYMOPT_ALLOW_ABSOLUTE_SYMBOLS    0x00000800
1594 | #define SYMOPT_IGNORE_NT_SYMPATH         0x00001000
1595 | #define SYMOPT_INCLUDE_32BIT_MODULES     0x00002000
1596 | #define SYMOPT_PUBLICS_ONLY              0x00004000
1597 | #define SYMOPT_NO_PUBLICS                0x00008000
1598 | #define SYMOPT_AUTO_PUBLICS              0x00010000
1599 | #define SYMOPT_NO_IMAGE_SEARCH           0x00020000
1600 | #define SYMOPT_SECURE                    0x00040000
1601 | #define SYMOPT_NO_PROMPTS                0x00080000
1602 | #define SYMOPT_OVERWRITE                 0x00100000
1603 | #define SYMOPT_IGNORE_IMAGEDIR           0x00200000
1604 | #define SYMOPT_FLAT_DIRECTORY            0x00400000
1605 | #define SYMOPT_FAVOR_COMPRESSED          0x00800000
1606 | #define SYMOPT_ALLOW_ZERO_ADDRESS        0x01000000
1607 | #define SYMOPT_DISABLE_SYMSRV_AUTODETECT 0x02000000
1608 | 
1609 | #define SYMOPT_DEBUG                     0x80000000
1610 | 
1611 | DWORD
1612 | IMAGEAPI
1613 | SymSetOptions(
1614 |     __in DWORD   SymOptions
1615 | );
1616 | 
1617 | DWORD
1618 | IMAGEAPI
1619 | SymGetOptions(
1620 |     VOID
1621 | );
1622 | 
1623 | BOOL
1624 | IMAGEAPI
1625 | SymCleanup(
1626 |     __in HANDLE hProcess
1627 | );
1628 | 
1629 | BOOL
1630 | IMAGEAPI
1631 | SymMatchString(
1632 |     __in PCSTR string,
1633 |     __in PCSTR expression,
1634 |     __in BOOL fCase
1635 | );
1636 | 
1637 | BOOL
1638 | IMAGEAPI
1639 | SymMatchStringA(
1640 |     __in PCSTR string,
1641 |     __in PCSTR expression,
1642 |     __in BOOL fCase
1643 | );
1644 | 
1645 | BOOL
1646 | IMAGEAPI
1647 | SymMatchStringW(
1648 |     __in PCWSTR string,
1649 |     __in PCWSTR expression,
1650 |     __in BOOL fCase
1651 | );
1652 | 
1653 | typedef BOOL
1654 | (CALLBACK* PSYM_ENUMSOURCEFILES_CALLBACK)(
1655 |     __in PSOURCEFILE pSourceFile,
1656 |     __in_opt PVOID UserContext
1657 | );
1658 | 
1659 | // for backwards compatibility - don't use this
1660 | #define PSYM_ENUMSOURCFILES_CALLBACK PSYM_ENUMSOURCEFILES_CALLBACK
1661 | 
1662 | BOOL
1663 | IMAGEAPI
1664 | SymEnumSourceFiles(
1665 |     __in HANDLE hProcess,
1666 |     __in ULONG64 ModBase,
1667 |     __in_opt PCSTR Mask,
1668 |     __in PSYM_ENUMSOURCEFILES_CALLBACK cbSrcFiles,
1669 |     __in_opt PVOID UserContext
1670 | );
1671 | 
1672 | typedef BOOL
1673 | (CALLBACK* PSYM_ENUMSOURCEFILES_CALLBACKW)(
1674 |     __in PSOURCEFILEW pSourceFile,
1675 |     __in_opt PVOID UserContext
1676 | );
1677 | 
1678 | BOOL
1679 | IMAGEAPI
1680 | SymEnumSourceFilesW(
1681 |     __in HANDLE hProcess,
1682 |     __in ULONG64 ModBase,
1683 |     __in_opt PCWSTR Mask,
1684 |     __in PSYM_ENUMSOURCEFILES_CALLBACKW cbSrcFiles,
1685 |     __in_opt PVOID UserContext
1686 | );
1687 | 
1688 | BOOL
1689 | IMAGEAPI
1690 | SymEnumerateModules64(
1691 |     __in HANDLE hProcess,
1692 |     __in PSYM_ENUMMODULES_CALLBACK64 EnumModulesCallback,
1693 |     __in_opt PVOID UserContext
1694 | );
1695 | 
1696 | BOOL
1697 | IMAGEAPI
1698 | SymEnumerateModulesW64(
1699 |     __in HANDLE hProcess,
1700 |     __in PSYM_ENUMMODULES_CALLBACKW64 EnumModulesCallback,
1701 |     __in_opt PVOID UserContext
1702 | );
1703 | 
1704 | #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
1705 | #define SymEnumerateModules SymEnumerateModules64
1706 | #else
1707 | BOOL
1708 | IMAGEAPI
1709 | SymEnumerateModules(
1710 |     __in HANDLE hProcess,
1711 |     __in PSYM_ENUMMODULES_CALLBACK EnumModulesCallback,
1712 |     __in_opt PVOID UserContext
1713 | );
1714 | #endif
1715 | 
1716 | BOOL
1717 | IMAGEAPI
1718 | EnumerateLoadedModulesEx(
1719 |     __in HANDLE hProcess,
1720 |     __in PENUMLOADED_MODULES_CALLBACK64 EnumLoadedModulesCallback,
1721 |     __in_opt PVOID UserContext
1722 | );
1723 | 
1724 | BOOL
1725 | IMAGEAPI
1726 | EnumerateLoadedModulesExW(
1727 |     __in HANDLE hProcess,
1728 |     __in PENUMLOADED_MODULES_CALLBACKW64 EnumLoadedModulesCallback,
1729 |     __in_opt PVOID UserContext
1730 | );
1731 | 
1732 | BOOL
1733 | IMAGEAPI
1734 | EnumerateLoadedModules64(
1735 |     __in HANDLE hProcess,
1736 |     __in PENUMLOADED_MODULES_CALLBACK64 EnumLoadedModulesCallback,
1737 |     __in_opt PVOID UserContext
1738 | );
1739 | 
1740 | BOOL
1741 | IMAGEAPI
1742 | EnumerateLoadedModulesW64(
1743 |     __in HANDLE hProcess,
1744 |     __in PENUMLOADED_MODULES_CALLBACKW64 EnumLoadedModulesCallback,
1745 |     __in_opt PVOID UserContext
1746 | );
1747 | 
1748 | #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
1749 | #define EnumerateLoadedModules EnumerateLoadedModules64
1750 | #else
1751 | BOOL
1752 | IMAGEAPI
1753 | EnumerateLoadedModules(
1754 |     __in HANDLE hProcess,
1755 |     __in PENUMLOADED_MODULES_CALLBACK EnumLoadedModulesCallback,
1756 |     __in_opt PVOID UserContext
1757 | );
1758 | #endif
1759 | 
1760 | PVOID
1761 | IMAGEAPI
1762 | SymFunctionTableAccess64(
1763 |     __in HANDLE hProcess,
1764 |     __in DWORD64 AddrBase
1765 | );
1766 | 
1767 | #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
1768 | #define SymFunctionTableAccess SymFunctionTableAccess64
1769 | #else
1770 | PVOID
1771 | IMAGEAPI
1772 | SymFunctionTableAccess(
1773 |     __in HANDLE hProcess,
1774 |     __in DWORD AddrBase
1775 | );
1776 | #endif
1777 | 
1778 | BOOL
1779 | IMAGEAPI
1780 | SymGetUnwindInfo(
1781 |     __in HANDLE hProcess,
1782 |     __in DWORD64 Address,
1783 |     __out_bcount_opt(*Size) PVOID Buffer,
1784 |     __inout PULONG Size
1785 | );
1786 | 
1787 | BOOL
1788 | IMAGEAPI
1789 | SymGetModuleInfo64(
1790 |     __in HANDLE hProcess,
1791 |     __in DWORD64 qwAddr,
1792 |     __out PIMAGEHLP_MODULE64 ModuleInfo
1793 | );
1794 | 
1795 | BOOL
1796 | IMAGEAPI
1797 | SymGetModuleInfoW64(
1798 |     __in HANDLE hProcess,
1799 |     __in DWORD64 qwAddr,
1800 |     __out PIMAGEHLP_MODULEW64 ModuleInfo
1801 | );
1802 | 
1803 | #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
1804 | #define SymGetModuleInfo   SymGetModuleInfo64
1805 | #define SymGetModuleInfoW  SymGetModuleInfoW64
1806 | #else
1807 | BOOL
1808 | IMAGEAPI
1809 | SymGetModuleInfo(
1810 |     __in HANDLE hProcess,
1811 |     __in DWORD dwAddr,
1812 |     __out PIMAGEHLP_MODULE ModuleInfo
1813 | );
1814 | 
1815 | BOOL
1816 | IMAGEAPI
1817 | SymGetModuleInfoW(
1818 |     __in HANDLE hProcess,
1819 |     __in DWORD dwAddr,
1820 |     __out PIMAGEHLP_MODULEW ModuleInfo
1821 | );
1822 | #endif
1823 | 
1824 | DWORD64
1825 | IMAGEAPI
1826 | SymGetModuleBase64(
1827 |     __in HANDLE hProcess,
1828 |     __in DWORD64 qwAddr
1829 | );
1830 | 
1831 | #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
1832 | #define SymGetModuleBase SymGetModuleBase64
1833 | #else
1834 | DWORD
1835 | IMAGEAPI
1836 | SymGetModuleBase(
1837 |     __in HANDLE hProcess,
1838 |     __in DWORD dwAddr
1839 | );
1840 | #endif
1841 | 
1842 | typedef struct _SRCCODEINFO
1843 | {
1844 |     DWORD   SizeOfStruct;           // set to sizeof(SRCCODEINFO)
1845 |     PVOID   Key;                    // not used
1846 |     DWORD64 ModBase;                // base address of module this applies to
1847 |     CHAR    Obj[MAX_PATH + 1];      // the object file within the module
1848 |     CHAR    FileName[MAX_PATH + 1]; // full filename
1849 |     DWORD   LineNumber;             // line number in file
1850 |     DWORD64 Address;                // first instruction of line
1851 | } SRCCODEINFO, *PSRCCODEINFO;
1852 | 
1853 | typedef struct _SRCCODEINFOW
1854 | {
1855 |     DWORD   SizeOfStruct;           // set to sizeof(SRCCODEINFO)
1856 |     PVOID   Key;                    // not used
1857 |     DWORD64 ModBase;                // base address of module this applies to
1858 |     WCHAR   Obj[MAX_PATH + 1];      // the object file within the module
1859 |     WCHAR   FileName[MAX_PATH + 1]; // full filename
1860 |     DWORD   LineNumber;             // line number in file
1861 |     DWORD64 Address;                // first instruction of line
1862 | } SRCCODEINFOW, *PSRCCODEINFOW;
1863 | 
1864 | typedef BOOL
1865 | (CALLBACK* PSYM_ENUMLINES_CALLBACK)(
1866 |     __in PSRCCODEINFO LineInfo,
1867 |     __in_opt PVOID UserContext
1868 | );
1869 | 
1870 | BOOL
1871 | IMAGEAPI
1872 | SymEnumLines(
1873 |     __in HANDLE hProcess,
1874 |     __in ULONG64 Base,
1875 |     __in_opt PCSTR Obj,
1876 |     __in_opt PCSTR File,
1877 |     __in PSYM_ENUMLINES_CALLBACK EnumLinesCallback,
1878 |     __in_opt PVOID UserContext
1879 | );
1880 | 
1881 | typedef BOOL
1882 | (CALLBACK* PSYM_ENUMLINES_CALLBACKW)(
1883 |     __in PSRCCODEINFOW LineInfo,
1884 |     __in_opt PVOID UserContext
1885 | );
1886 | 
1887 | BOOL
1888 | IMAGEAPI
1889 | SymEnumLinesW(
1890 |     __in HANDLE hProcess,
1891 |     __in ULONG64 Base,
1892 |     __in_opt PCWSTR Obj,
1893 |     __in_opt PCWSTR File,
1894 |     __in PSYM_ENUMLINES_CALLBACKW EnumLinesCallback,
1895 |     __in_opt PVOID UserContext
1896 | );
1897 | 
1898 | BOOL
1899 | IMAGEAPI
1900 | SymGetLineFromAddr64(
1901 |     __in HANDLE hProcess,
1902 |     __in DWORD64 qwAddr,
1903 |     __out PDWORD pdwDisplacement,
1904 |     __out PIMAGEHLP_LINE64 Line64
1905 | );
1906 | 
1907 | BOOL
1908 | IMAGEAPI
1909 | SymGetLineFromAddrW64(
1910 |     __in HANDLE hProcess,
1911 |     __in DWORD64 dwAddr,
1912 |     __out PDWORD pdwDisplacement,
1913 |     __out PIMAGEHLP_LINEW64 Line
1914 | );
1915 | 
1916 | BOOL
1917 | IMAGEAPI
1918 | SymEnumSourceLines(
1919 |     __in HANDLE hProcess,
1920 |     __in ULONG64 Base,
1921 |     __in_opt PCSTR Obj,
1922 |     __in_opt PCSTR File,
1923 |     __in_opt DWORD Line,
1924 |     __in DWORD Flags,
1925 |     __in PSYM_ENUMLINES_CALLBACK EnumLinesCallback,
1926 |     __in_opt PVOID UserContext
1927 | );
1928 | 
1929 | BOOL
1930 | IMAGEAPI
1931 | SymEnumSourceLinesW(
1932 |     __in HANDLE hProcess,
1933 |     __in ULONG64 Base,
1934 |     __in_opt PCWSTR Obj,
1935 |     __in_opt PCWSTR File,
1936 |     __in_opt DWORD Line,
1937 |     __in DWORD Flags,
1938 |     __in PSYM_ENUMLINES_CALLBACKW EnumLinesCallback,
1939 |     __in_opt PVOID UserContext
1940 | );
1941 | 
1942 | // flags for SymEnumSourceLines
1943 | 
1944 | #define ESLFLAG_FULLPATH        0x1
1945 | #define ESLFLAG_NEAREST         0x2
1946 | #define ESLFLAG_PREV            0x4
1947 | #define ESLFLAG_NEXT            0x8
1948 | 
1949 | #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
1950 | #define SymGetLineFromAddr SymGetLineFromAddr64
1951 | #define SymGetLineFromAddrW SymGetLineFromAddrW64
1952 | #else
1953 | BOOL
1954 | IMAGEAPI
1955 | SymGetLineFromAddr(
1956 |     __in HANDLE hProcess,
1957 |     __in DWORD dwAddr,
1958 |     __out PDWORD pdwDisplacement,
1959 |     __out PIMAGEHLP_LINE Line
1960 | );
1961 | 
1962 | BOOL
1963 | IMAGEAPI
1964 | SymGetLineFromAddrW(
1965 |     __in HANDLE hProcess,
1966 |     __in DWORD dwAddr,
1967 |     __out PDWORD pdwDisplacement,
1968 |     __out PIMAGEHLP_LINEW Line
1969 | );
1970 | #endif
1971 | 
1972 | BOOL
1973 | IMAGEAPI
1974 | SymGetLineFromName64(
1975 |     __in HANDLE hProcess,
1976 |     __in_opt PCSTR ModuleName,
1977 |     __in_opt PCSTR FileName,
1978 |     __in DWORD dwLineNumber,
1979 |     __out PLONG plDisplacement,
1980 |     __inout PIMAGEHLP_LINE64 Line
1981 | );
1982 | 
1983 | BOOL
1984 | IMAGEAPI
1985 | SymGetLineFromNameW64(
1986 |     __in HANDLE hProcess,
1987 |     __in_opt PCWSTR ModuleName,
1988 |     __in_opt PCWSTR FileName,
1989 |     __in DWORD dwLineNumber,
1990 |     __out PLONG plDisplacement,
1991 |     __inout PIMAGEHLP_LINEW64 Line
1992 | );
1993 | 
1994 | #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
1995 | #define SymGetLineFromName SymGetLineFromName64
1996 | #else
1997 | BOOL
1998 | IMAGEAPI
1999 | SymGetLineFromName(
2000 |     __in HANDLE hProcess,
2001 |     __in_opt PCSTR ModuleName,
2002 |     __in_opt PCSTR FileName,
2003 |     __in DWORD dwLineNumber,
2004 |     __out PLONG plDisplacement,
2005 |     __inout PIMAGEHLP_LINE Line
2006 | );
2007 | #endif
2008 | 
2009 | BOOL
2010 | IMAGEAPI
2011 | SymGetLineNext64(
2012 |     __in HANDLE hProcess,
2013 |     __inout PIMAGEHLP_LINE64 Line
2014 | );
2015 | 
2016 | BOOL
2017 | IMAGEAPI
2018 | SymGetLineNextW64(
2019 |     __in HANDLE hProcess,
2020 |     __inout PIMAGEHLP_LINEW64 Line
2021 | );
2022 | 
2023 | #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
2024 | #define SymGetLineNext SymGetLineNext64
2025 | #else
2026 | BOOL
2027 | IMAGEAPI
2028 | SymGetLineNext(
2029 |     __in HANDLE hProcess,
2030 |     __inout PIMAGEHLP_LINE Line
2031 | );
2032 | 
2033 | BOOL
2034 | IMAGEAPI
2035 | SymGetLineNextW(
2036 |     __in HANDLE hProcess,
2037 |     __inout PIMAGEHLP_LINEW Line
2038 | );
2039 | #endif
2040 | 
2041 | BOOL
2042 | IMAGEAPI
2043 | SymGetLinePrev64(
2044 |     __in HANDLE hProcess,
2045 |     __inout PIMAGEHLP_LINE64 Line
2046 | );
2047 | 
2048 | BOOL
2049 | IMAGEAPI
2050 | SymGetLinePrevW64(
2051 |     __in HANDLE hProcess,
2052 |     __inout PIMAGEHLP_LINEW64 Line
2053 | );
2054 | 
2055 | #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
2056 | #define SymGetLinePrev SymGetLinePrev64
2057 | #else
2058 | BOOL
2059 | IMAGEAPI
2060 | SymGetLinePrev(
2061 |     __in HANDLE hProcess,
2062 |     __inout PIMAGEHLP_LINE Line
2063 | );
2064 | 
2065 | BOOL
2066 | IMAGEAPI
2067 | SymGetLinePrevW(
2068 |     __in HANDLE hProcess,
2069 |     __inout PIMAGEHLP_LINEW Line
2070 | );
2071 | #endif
2072 | 
2073 | ULONG
2074 | IMAGEAPI
2075 | SymGetFileLineOffsets64(
2076 |     __in HANDLE hProcess,
2077 |     __in_opt PCSTR ModuleName,
2078 |     __in PCSTR FileName,
2079 |     __out_ecount(BufferLines) PDWORD64 Buffer,
2080 |     __in ULONG BufferLines
2081 | );
2082 | 
2083 | BOOL
2084 | IMAGEAPI
2085 | SymMatchFileName(
2086 |     __in PCSTR FileName,
2087 |     __in PCSTR Match,
2088 |     __deref_opt_out PSTR* FileNameStop,
2089 |     __deref_opt_out PSTR* MatchStop
2090 | );
2091 | 
2092 | BOOL
2093 | IMAGEAPI
2094 | SymMatchFileNameW(
2095 |     __in PCWSTR FileName,
2096 |     __in PCWSTR Match,
2097 |     __deref_opt_out PWSTR* FileNameStop,
2098 |     __deref_opt_out PWSTR* MatchStop
2099 | );
2100 | 
2101 | BOOL
2102 | IMAGEAPI
2103 | SymGetSourceFile(
2104 |     __in HANDLE hProcess,
2105 |     __in ULONG64 Base,
2106 |     __in_opt PCSTR Params,
2107 |     __in PCSTR FileSpec,
2108 |     __out_ecount(Size) PSTR FilePath,
2109 |     __in DWORD Size
2110 | );
2111 | 
2112 | BOOL
2113 | IMAGEAPI
2114 | SymGetSourceFileW(
2115 |     __in HANDLE hProcess,
2116 |     __in ULONG64 Base,
2117 |     __in_opt PCWSTR Params,
2118 |     __in PCWSTR FileSpec,
2119 |     __out_ecount(Size) PWSTR FilePath,
2120 |     __in DWORD Size
2121 | );
2122 | 
2123 | BOOL
2124 | IMAGEAPI
2125 | SymGetSourceFileToken(
2126 |     __in HANDLE hProcess,
2127 |     __in ULONG64 Base,
2128 |     __in PCSTR FileSpec,
2129 |     __deref_out PVOID* Token,
2130 |     __out DWORD* Size
2131 | );
2132 | 
2133 | BOOL
2134 | IMAGEAPI
2135 | SymGetSourceFileTokenW(
2136 |     __in HANDLE hProcess,
2137 |     __in ULONG64 Base,
2138 |     __in PCWSTR FileSpec,
2139 |     __deref_out PVOID* Token,
2140 |     __out DWORD* Size
2141 | );
2142 | 
2143 | BOOL
2144 | IMAGEAPI
2145 | SymGetSourceFileFromToken(
2146 |     __in HANDLE hProcess,
2147 |     __in PVOID Token,
2148 |     __in_opt PCSTR Params,
2149 |     __out_ecount(Size) PSTR FilePath,
2150 |     __in DWORD Size
2151 | );
2152 | 
2153 | BOOL
2154 | IMAGEAPI
2155 | SymGetSourceFileFromTokenW(
2156 |     __in HANDLE hProcess,
2157 |     __in PVOID Token,
2158 |     __in_opt PCWSTR Params,
2159 |     __out_ecount(Size) PWSTR FilePath,
2160 |     __in DWORD Size
2161 | );
2162 | 
2163 | BOOL
2164 | IMAGEAPI
2165 | SymGetSourceVarFromToken(
2166 |     __in HANDLE hProcess,
2167 |     __in PVOID Token,
2168 |     __in_opt PCSTR Params,
2169 |     __in PCSTR VarName,
2170 |     __out_ecount(Size) PSTR Value,
2171 |     __in DWORD Size
2172 | );
2173 | 
2174 | BOOL
2175 | IMAGEAPI
2176 | SymGetSourceVarFromTokenW(
2177 |     __in HANDLE hProcess,
2178 |     __in PVOID Token,
2179 |     __in_opt PCWSTR Params,
2180 |     __in PCWSTR VarName,
2181 |     __out_ecount(Size) PWSTR Value,
2182 |     __in DWORD Size
2183 | );
2184 | 
2185 | typedef BOOL (CALLBACK* PENUMSOURCEFILETOKENSCALLBACK)(__in PVOID token,  __in size_t size);
2186 | 
2187 | BOOL
2188 | IMAGEAPI
2189 | SymEnumSourceFileTokens(
2190 |     __in HANDLE hProcess,
2191 |     __in ULONG64 Base,
2192 |     __in PENUMSOURCEFILETOKENSCALLBACK Callback
2193 | );
2194 | 
2195 | BOOL
2196 | IMAGEAPI
2197 | SymInitialize(
2198 |     __in HANDLE hProcess,
2199 |     __in_opt PCSTR UserSearchPath,
2200 |     __in BOOL fInvadeProcess
2201 | );
2202 | 
2203 | BOOL
2204 | IMAGEAPI
2205 | SymInitializeW(
2206 |     __in HANDLE hProcess,
2207 |     __in_opt PCWSTR UserSearchPath,
2208 |     __in BOOL fInvadeProcess
2209 | );
2210 | 
2211 | BOOL
2212 | IMAGEAPI
2213 | SymGetSearchPath(
2214 |     __in HANDLE hProcess,
2215 |     __out_ecount(SearchPathLength) PSTR SearchPath,
2216 |     __in DWORD SearchPathLength
2217 | );
2218 | 
2219 | BOOL
2220 | IMAGEAPI
2221 | SymGetSearchPathW(
2222 |     __in HANDLE hProcess,
2223 |     __out_ecount(SearchPathLength) PWSTR SearchPath,
2224 |     __in DWORD SearchPathLength
2225 | );
2226 | 
2227 | BOOL
2228 | IMAGEAPI
2229 | SymSetSearchPath(
2230 |     __in HANDLE hProcess,
2231 |     __in_opt PCSTR SearchPath
2232 | );
2233 | 
2234 | BOOL
2235 | IMAGEAPI
2236 | SymSetSearchPathW(
2237 |     __in HANDLE hProcess,
2238 |     __in_opt PCWSTR SearchPath
2239 | );
2240 | 
2241 | #define SLMFLAG_VIRTUAL     0x1
2242 | #define SLMFLAG_ALT_INDEX   0x2
2243 | #define SLMFLAG_NO_SYMBOLS  0x4
2244 | 
2245 | DWORD64
2246 | IMAGEAPI
2247 | SymLoadModuleEx(
2248 |     __in HANDLE hProcess,
2249 |     __in_opt HANDLE hFile,
2250 |     __in_opt PCSTR ImageName,
2251 |     __in_opt PCSTR ModuleName,
2252 |     __in DWORD64 BaseOfDll,
2253 |     __in DWORD DllSize,
2254 |     __in_opt PMODLOAD_DATA Data,
2255 |     __in_opt DWORD Flags
2256 | );
2257 | 
2258 | DWORD64
2259 | IMAGEAPI
2260 | SymLoadModuleExW(
2261 |     __in HANDLE hProcess,
2262 |     __in_opt HANDLE hFile,
2263 |     __in_opt PCWSTR ImageName,
2264 |     __in_opt PCWSTR ModuleName,
2265 |     __in DWORD64 BaseOfDll,
2266 |     __in DWORD DllSize,
2267 |     __in_opt PMODLOAD_DATA Data,
2268 |     __in_opt DWORD Flags
2269 | );
2270 | 
2271 | BOOL
2272 | IMAGEAPI
2273 | SymUnloadModule64(
2274 |     __in HANDLE hProcess,
2275 |     __in DWORD64 BaseOfDll
2276 | );
2277 | 
2278 | #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
2279 | #define SymUnloadModule SymUnloadModule64
2280 | #else
2281 | BOOL
2282 | IMAGEAPI
2283 | SymUnloadModule(
2284 |     __in HANDLE hProcess,
2285 |     __in DWORD BaseOfDll
2286 | );
2287 | #endif
2288 | 
2289 | BOOL
2290 | IMAGEAPI
2291 | SymUnDName64(
2292 |     __in PIMAGEHLP_SYMBOL64 sym,            // Symbol to undecorate
2293 |     __out_ecount(UnDecNameLength) PSTR UnDecName,   // Buffer to store undecorated name in
2294 |     __in DWORD UnDecNameLength              // Size of the buffer
2295 | );
2296 | 
2297 | #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
2298 | #define SymUnDName SymUnDName64
2299 | #else
2300 | BOOL
2301 | IMAGEAPI
2302 | SymUnDName(
2303 |     __in PIMAGEHLP_SYMBOL sym,              // Symbol to undecorate
2304 |     __out_ecount(UnDecNameLength) PSTR UnDecName,   // Buffer to store undecorated name in
2305 |     __in DWORD UnDecNameLength              // Size of the buffer
2306 | );
2307 | #endif
2308 | 
2309 | BOOL
2310 | IMAGEAPI
2311 | SymRegisterCallback64(
2312 |     __in HANDLE hProcess,
2313 |     __in PSYMBOL_REGISTERED_CALLBACK64 CallbackFunction,
2314 |     __in ULONG64 UserContext
2315 | );
2316 | 
2317 | BOOL
2318 | IMAGEAPI
2319 | SymRegisterCallbackW64(
2320 |     __in HANDLE hProcess,
2321 |     __in PSYMBOL_REGISTERED_CALLBACK64 CallbackFunction,
2322 |     __in ULONG64 UserContext
2323 | );
2324 | 
2325 | BOOL
2326 | IMAGEAPI
2327 | SymRegisterFunctionEntryCallback64(
2328 |     __in HANDLE hProcess,
2329 |     __in PSYMBOL_FUNCENTRY_CALLBACK64 CallbackFunction,
2330 |     __in ULONG64 UserContext
2331 | );
2332 | 
2333 | #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
2334 | #define SymRegisterCallback SymRegisterCallback64
2335 | #define SymRegisterFunctionEntryCallback SymRegisterFunctionEntryCallback64
2336 | #else
2337 | BOOL
2338 | IMAGEAPI
2339 | SymRegisterCallback(
2340 |     __in HANDLE hProcess,
2341 |     __in PSYMBOL_REGISTERED_CALLBACK CallbackFunction,
2342 |     __in_opt PVOID UserContext
2343 | );
2344 | 
2345 | BOOL
2346 | IMAGEAPI
2347 | SymRegisterFunctionEntryCallback(
2348 |     __in HANDLE hProcess,
2349 |     __in PSYMBOL_FUNCENTRY_CALLBACK CallbackFunction,
2350 |     __in_opt PVOID UserContext
2351 | );
2352 | #endif
2353 | 
2354 | 
2355 | typedef struct _IMAGEHLP_SYMBOL_SRC
2356 | {
2357 |     DWORD sizeofstruct;
2358 |     DWORD type;
2359 |     char  file[MAX_PATH];
2360 | } IMAGEHLP_SYMBOL_SRC, *PIMAGEHLP_SYMBOL_SRC;
2361 | 
2362 | typedef struct _MODULE_TYPE_INFO   // AKA TYPTYP
2363 | {
2364 |     USHORT      dataLength;
2365 |     USHORT      leaf;
2366 |     BYTE        data[1];
2367 | } MODULE_TYPE_INFO, *PMODULE_TYPE_INFO;
2368 | 
2369 | typedef struct _SYMBOL_INFO
2370 | {
2371 |     ULONG       SizeOfStruct;
2372 |     ULONG       TypeIndex;        // Type Index of symbol
2373 |     ULONG64     Reserved[2];
2374 |     ULONG       Index;
2375 |     ULONG       Size;
2376 |     ULONG64     ModBase;          // Base Address of module comtaining this symbol
2377 |     ULONG       Flags;
2378 |     ULONG64     Value;            // Value of symbol, ValuePresent should be 1
2379 |     ULONG64     Address;          // Address of symbol including base address of module
2380 |     ULONG       Register;         // register holding value or pointer to value
2381 |     ULONG       Scope;            // scope of the symbol
2382 |     ULONG       Tag;              // pdb classification
2383 |     ULONG       NameLen;          // Actual length of name
2384 |     ULONG       MaxNameLen;
2385 |     CHAR        Name[1];          // Name of symbol
2386 | } SYMBOL_INFO, *PSYMBOL_INFO;
2387 | 
2388 | typedef struct _SYMBOL_INFO_PACKAGE
2389 | {
2390 |     SYMBOL_INFO si;
2391 |     CHAR        name[MAX_SYM_NAME + 1];
2392 | } SYMBOL_INFO_PACKAGE, *PSYMBOL_INFO_PACKAGE;
2393 | 
2394 | typedef struct _SYMBOL_INFOW
2395 | {
2396 |     ULONG       SizeOfStruct;
2397 |     ULONG       TypeIndex;        // Type Index of symbol
2398 |     ULONG64     Reserved[2];
2399 |     ULONG       Index;
2400 |     ULONG       Size;
2401 |     ULONG64     ModBase;          // Base Address of module comtaining this symbol
2402 |     ULONG       Flags;
2403 |     ULONG64     Value;            // Value of symbol, ValuePresent should be 1
2404 |     ULONG64     Address;          // Address of symbol including base address of module
2405 |     ULONG       Register;         // register holding value or pointer to value
2406 |     ULONG       Scope;            // scope of the symbol
2407 |     ULONG       Tag;              // pdb classification
2408 |     ULONG       NameLen;          // Actual length of name
2409 |     ULONG       MaxNameLen;
2410 |     WCHAR       Name[1];          // Name of symbol
2411 | } SYMBOL_INFOW, *PSYMBOL_INFOW;
2412 | 
2413 | typedef struct _SYMBOL_INFO_PACKAGEW
2414 | {
2415 |     SYMBOL_INFOW si;
2416 |     WCHAR        name[MAX_SYM_NAME + 1];
2417 | } SYMBOL_INFO_PACKAGEW, *PSYMBOL_INFO_PACKAGEW;
2418 | 
2419 | typedef struct _IMAGEHLP_STACK_FRAME
2420 | {
2421 |     ULONG64 InstructionOffset;
2422 |     ULONG64 ReturnOffset;
2423 |     ULONG64 FrameOffset;
2424 |     ULONG64 StackOffset;
2425 |     ULONG64 BackingStoreOffset;
2426 |     ULONG64 FuncTableEntry;
2427 |     ULONG64 Params[4];
2428 |     ULONG64 Reserved[5];
2429 |     BOOL    Virtual;
2430 |     ULONG   Reserved2;
2431 | } IMAGEHLP_STACK_FRAME, *PIMAGEHLP_STACK_FRAME;
2432 | 
2433 | typedef VOID IMAGEHLP_CONTEXT, *PIMAGEHLP_CONTEXT;
2434 | 
2435 | 
2436 | BOOL
2437 | IMAGEAPI
2438 | SymSetContext(
2439 |     __in HANDLE hProcess,
2440 |     __in PIMAGEHLP_STACK_FRAME StackFrame,
2441 |     __in_opt PIMAGEHLP_CONTEXT Context
2442 | );
2443 | 
2444 | BOOL
2445 | IMAGEAPI
2446 | SymSetScopeFromAddr(
2447 |     __in HANDLE hProcess,
2448 |     __in ULONG64 Address
2449 | );
2450 | 
2451 | BOOL
2452 | IMAGEAPI
2453 | SymSetScopeFromIndex(
2454 |     __in HANDLE hProcess,
2455 |     __in ULONG64 BaseOfDll,
2456 |     __in DWORD Index
2457 | );
2458 | 
2459 | typedef BOOL
2460 | (CALLBACK* PSYM_ENUMPROCESSES_CALLBACK)(
2461 |     __in HANDLE hProcess,
2462 |     __in PVOID UserContext
2463 | );
2464 | 
2465 | BOOL
2466 | IMAGEAPI
2467 | SymEnumProcesses(
2468 |     __in PSYM_ENUMPROCESSES_CALLBACK EnumProcessesCallback,
2469 |     __in PVOID UserContext
2470 | );
2471 | 
2472 | BOOL
2473 | IMAGEAPI
2474 | SymFromAddr(
2475 |     __in HANDLE hProcess,
2476 |     __in DWORD64 Address,
2477 |     __out_opt PDWORD64 Displacement,
2478 |     __inout PSYMBOL_INFO Symbol
2479 | );
2480 | 
2481 | BOOL
2482 | IMAGEAPI
2483 | SymFromAddrW(
2484 |     __in HANDLE hProcess,
2485 |     __in DWORD64 Address,
2486 |     __out_opt PDWORD64 Displacement,
2487 |     __inout PSYMBOL_INFOW Symbol
2488 | );
2489 | 
2490 | BOOL
2491 | IMAGEAPI
2492 | SymFromToken(
2493 |     __in HANDLE hProcess,
2494 |     __in DWORD64 Base,
2495 |     __in DWORD Token,
2496 |     __inout PSYMBOL_INFO Symbol
2497 | );
2498 | 
2499 | BOOL
2500 | IMAGEAPI
2501 | SymFromTokenW(
2502 |     __in HANDLE hProcess,
2503 |     __in DWORD64 Base,
2504 |     __in DWORD Token,
2505 |     __inout PSYMBOL_INFOW Symbol
2506 | );
2507 | 
2508 | BOOL
2509 | IMAGEAPI
2510 | SymNext(
2511 |     __in HANDLE hProcess,
2512 |     __inout PSYMBOL_INFO si
2513 | );
2514 | 
2515 | BOOL
2516 | IMAGEAPI
2517 | SymNextW(
2518 |     __in HANDLE hProcess,
2519 |     __inout PSYMBOL_INFOW siw
2520 | );
2521 | 
2522 | BOOL
2523 | IMAGEAPI
2524 | SymPrev(
2525 |     __in HANDLE hProcess,
2526 |     __inout PSYMBOL_INFO si
2527 | );
2528 | 
2529 | BOOL
2530 | IMAGEAPI
2531 | SymPrevW(
2532 |     __in HANDLE hProcess,
2533 |     __inout PSYMBOL_INFOW siw
2534 | );
2535 | 
2536 | // While SymFromName will provide a symbol from a name,
2537 | // SymEnumSymbols can provide the same matching information
2538 | // for ALL symbols with a matching name, even regular
2539 | // expressions.  That way you can search across modules
2540 | // and differentiate between identically named symbols.
2541 | 
2542 | BOOL
2543 | IMAGEAPI
2544 | SymFromName(
2545 |     __in HANDLE hProcess,
2546 |     __in PCSTR Name,
2547 |     __inout PSYMBOL_INFO Symbol
2548 | );
2549 | 
2550 | BOOL
2551 | IMAGEAPI
2552 | SymFromNameW(
2553 |     __in HANDLE hProcess,
2554 |     __in PCWSTR Name,
2555 |     __inout PSYMBOL_INFOW Symbol
2556 | );
2557 | 
2558 | typedef BOOL
2559 | (CALLBACK* PSYM_ENUMERATESYMBOLS_CALLBACK)(
2560 |     __in PSYMBOL_INFO pSymInfo,
2561 |     __in ULONG SymbolSize,
2562 |     __in_opt PVOID UserContext
2563 | );
2564 | 
2565 | BOOL
2566 | IMAGEAPI
2567 | SymEnumSymbols(
2568 |     __in HANDLE hProcess,
2569 |     __in ULONG64 BaseOfDll,
2570 |     __in_opt PCSTR Mask,
2571 |     __in PSYM_ENUMERATESYMBOLS_CALLBACK EnumSymbolsCallback,
2572 |     __in_opt PVOID UserContext
2573 | );
2574 | 
2575 | typedef BOOL
2576 | (CALLBACK* PSYM_ENUMERATESYMBOLS_CALLBACKW)(
2577 |     __in PSYMBOL_INFOW pSymInfo,
2578 |     __in ULONG SymbolSize,
2579 |     __in_opt PVOID UserContext
2580 | );
2581 | 
2582 | BOOL
2583 | IMAGEAPI
2584 | SymEnumSymbolsW(
2585 |     __in HANDLE hProcess,
2586 |     __in ULONG64 BaseOfDll,
2587 |     __in_opt PCWSTR Mask,
2588 |     __in PSYM_ENUMERATESYMBOLS_CALLBACKW EnumSymbolsCallback,
2589 |     __in_opt PVOID UserContext
2590 | );
2591 | 
2592 | BOOL
2593 | IMAGEAPI
2594 | SymEnumSymbolsForAddr(
2595 |     __in HANDLE hProcess,
2596 |     __in DWORD64 Address,
2597 |     __in PSYM_ENUMERATESYMBOLS_CALLBACK EnumSymbolsCallback,
2598 |     __in_opt PVOID UserContext
2599 | );
2600 | 
2601 | BOOL
2602 | IMAGEAPI
2603 | SymEnumSymbolsForAddrW(
2604 |     __in HANDLE hProcess,
2605 |     __in DWORD64 Address,
2606 |     __in PSYM_ENUMERATESYMBOLS_CALLBACKW EnumSymbolsCallback,
2607 |     __in_opt PVOID UserContext
2608 | );
2609 | 
2610 | #define SYMSEARCH_MASKOBJS      0x01    // used internally to implement other APIs
2611 | #define SYMSEARCH_RECURSE       0X02    // recurse scopes
2612 | #define SYMSEARCH_GLOBALSONLY   0X04    // search only for global symbols
2613 | #define SYMSEARCH_ALLITEMS      0X08    // search for everything in the pdb, not just normal scoped symbols
2614 | 
2615 | BOOL
2616 | IMAGEAPI
2617 | SymSearch(
2618 |     __in HANDLE hProcess,
2619 |     __in ULONG64 BaseOfDll,
2620 |     __in_opt DWORD Index,
2621 |     __in_opt DWORD SymTag,
2622 |     __in_opt PCSTR Mask,
2623 |     __in_opt DWORD64 Address,
2624 |     __in PSYM_ENUMERATESYMBOLS_CALLBACK EnumSymbolsCallback,
2625 |     __in_opt PVOID UserContext,
2626 |     __in DWORD Options
2627 | );
2628 | 
2629 | BOOL
2630 | IMAGEAPI
2631 | SymSearchW(
2632 |     __in HANDLE hProcess,
2633 |     __in ULONG64 BaseOfDll,
2634 |     __in_opt DWORD Index,
2635 |     __in_opt DWORD SymTag,
2636 |     __in_opt PCWSTR Mask,
2637 |     __in_opt DWORD64 Address,
2638 |     __in PSYM_ENUMERATESYMBOLS_CALLBACKW EnumSymbolsCallback,
2639 |     __in_opt PVOID UserContext,
2640 |     __in DWORD Options
2641 | );
2642 | 
2643 | BOOL
2644 | IMAGEAPI
2645 | SymGetScope(
2646 |     __in HANDLE hProcess,
2647 |     __in ULONG64 BaseOfDll,
2648 |     __in DWORD Index,
2649 |     __inout PSYMBOL_INFO Symbol
2650 | );
2651 | 
2652 | BOOL
2653 | IMAGEAPI
2654 | SymGetScopeW(
2655 |     __in HANDLE hProcess,
2656 |     __in ULONG64 BaseOfDll,
2657 |     __in DWORD Index,
2658 |     __inout PSYMBOL_INFOW Symbol
2659 | );
2660 | 
2661 | BOOL
2662 | IMAGEAPI
2663 | SymFromIndex(
2664 |     __in HANDLE hProcess,
2665 |     __in ULONG64 BaseOfDll,
2666 |     __in DWORD Index,
2667 |     __inout PSYMBOL_INFO Symbol
2668 | );
2669 | 
2670 | BOOL
2671 | IMAGEAPI
2672 | SymFromIndexW(
2673 |     __in HANDLE hProcess,
2674 |     __in ULONG64 BaseOfDll,
2675 |     __in DWORD Index,
2676 |     __inout PSYMBOL_INFOW Symbol
2677 | );
2678 | 
2679 | typedef enum _IMAGEHLP_SYMBOL_TYPE_INFO
2680 | {
2681 |     TI_GET_SYMTAG,
2682 |     TI_GET_SYMNAME,
2683 |     TI_GET_LENGTH,
2684 |     TI_GET_TYPE,
2685 |     TI_GET_TYPEID,
2686 |     TI_GET_BASETYPE,
2687 |     TI_GET_ARRAYINDEXTYPEID,
2688 |     TI_FINDCHILDREN,
2689 |     TI_GET_DATAKIND,
2690 |     TI_GET_ADDRESSOFFSET,
2691 |     TI_GET_OFFSET,
2692 |     TI_GET_VALUE,
2693 |     TI_GET_COUNT,
2694 |     TI_GET_CHILDRENCOUNT,
2695 |     TI_GET_BITPOSITION,
2696 |     TI_GET_VIRTUALBASECLASS,
2697 |     TI_GET_VIRTUALTABLESHAPEID,
2698 |     TI_GET_VIRTUALBASEPOINTEROFFSET,
2699 |     TI_GET_CLASSPARENTID,
2700 |     TI_GET_NESTED,
2701 |     TI_GET_SYMINDEX,
2702 |     TI_GET_LEXICALPARENT,
2703 |     TI_GET_ADDRESS,
2704 |     TI_GET_THISADJUST,
2705 |     TI_GET_UDTKIND,
2706 |     TI_IS_EQUIV_TO,
2707 |     TI_GET_CALLING_CONVENTION,
2708 |     TI_IS_CLOSE_EQUIV_TO,
2709 |     TI_GTIEX_REQS_VALID,
2710 |     TI_GET_VIRTUALBASEOFFSET,
2711 |     TI_GET_VIRTUALBASEDISPINDEX,
2712 |     TI_GET_IS_REFERENCE,
2713 |     TI_GET_INDIRECTVIRTUALBASECLASS,
2714 |     IMAGEHLP_SYMBOL_TYPE_INFO_MAX,
2715 | } IMAGEHLP_SYMBOL_TYPE_INFO;
2716 | 
2717 | typedef struct _TI_FINDCHILDREN_PARAMS
2718 | {
2719 |     ULONG Count;
2720 |     ULONG Start;
2721 |     ULONG ChildId[1];
2722 | } TI_FINDCHILDREN_PARAMS;
2723 | 
2724 | BOOL
2725 | IMAGEAPI
2726 | SymGetTypeInfo(
2727 |     __in HANDLE hProcess,
2728 |     __in DWORD64 ModBase,
2729 |     __in ULONG TypeId,
2730 |     __in IMAGEHLP_SYMBOL_TYPE_INFO GetType,
2731 |     __out PVOID pInfo
2732 | );
2733 | 
2734 | #define IMAGEHLP_GET_TYPE_INFO_UNCACHED 0x00000001
2735 | #define IMAGEHLP_GET_TYPE_INFO_CHILDREN 0x00000002
2736 | 
2737 | typedef struct _IMAGEHLP_GET_TYPE_INFO_PARAMS
2738 | {
2739 |     IN  ULONG    SizeOfStruct;
2740 |     IN  ULONG    Flags;
2741 |     IN  ULONG    NumIds;
2742 |     IN  PULONG   TypeIds;
2743 |     IN  ULONG64  TagFilter;
2744 |     IN  ULONG    NumReqs;
2745 |     IN  IMAGEHLP_SYMBOL_TYPE_INFO* ReqKinds;
2746 |     IN  PULONG_PTR ReqOffsets;
2747 |     IN  PULONG   ReqSizes;
2748 |     IN  ULONG_PTR ReqStride;
2749 |     IN  ULONG_PTR BufferSize;
2750 |     OUT PVOID    Buffer;
2751 |     OUT ULONG    EntriesMatched;
2752 |     OUT ULONG    EntriesFilled;
2753 |     OUT ULONG64  TagsFound;
2754 |     OUT ULONG64  AllReqsValid;
2755 |     IN  ULONG    NumReqsValid;
2756 |     OUT PULONG64 ReqsValid OPTIONAL;
2757 | } IMAGEHLP_GET_TYPE_INFO_PARAMS, *PIMAGEHLP_GET_TYPE_INFO_PARAMS;
2758 | 
2759 | BOOL
2760 | IMAGEAPI
2761 | SymGetTypeInfoEx(
2762 |     __in HANDLE hProcess,
2763 |     __in DWORD64 ModBase,
2764 |     __inout PIMAGEHLP_GET_TYPE_INFO_PARAMS Params
2765 | );
2766 | 
2767 | BOOL
2768 | IMAGEAPI
2769 | SymEnumTypes(
2770 |     __in HANDLE hProcess,
2771 |     __in ULONG64 BaseOfDll,
2772 |     __in PSYM_ENUMERATESYMBOLS_CALLBACK EnumSymbolsCallback,
2773 |     __in_opt PVOID UserContext
2774 | );
2775 | 
2776 | BOOL
2777 | IMAGEAPI
2778 | SymEnumTypesW(
2779 |     __in HANDLE hProcess,
2780 |     __in ULONG64 BaseOfDll,
2781 |     __in PSYM_ENUMERATESYMBOLS_CALLBACKW EnumSymbolsCallback,
2782 |     __in_opt PVOID UserContext
2783 | );
2784 | 
2785 | BOOL
2786 | IMAGEAPI
2787 | SymEnumTypesByName(
2788 |     __in HANDLE hProcess,
2789 |     __in ULONG64 BaseOfDll,
2790 |     __in_opt PCSTR mask,
2791 |     __in PSYM_ENUMERATESYMBOLS_CALLBACK EnumSymbolsCallback,
2792 |     __in_opt PVOID UserContext
2793 | );
2794 | 
2795 | BOOL
2796 | IMAGEAPI
2797 | SymEnumTypesByNameW(
2798 |     __in HANDLE hProcess,
2799 |     __in ULONG64 BaseOfDll,
2800 |     __in_opt PCWSTR mask,
2801 |     __in PSYM_ENUMERATESYMBOLS_CALLBACKW EnumSymbolsCallback,
2802 |     __in_opt PVOID UserContext
2803 | );
2804 | 
2805 | BOOL
2806 | IMAGEAPI
2807 | SymGetTypeFromName(
2808 |     __in HANDLE hProcess,
2809 |     __in ULONG64 BaseOfDll,
2810 |     __in PCSTR Name,
2811 |     __inout PSYMBOL_INFO Symbol
2812 | );
2813 | 
2814 | BOOL
2815 | IMAGEAPI
2816 | SymGetTypeFromNameW(
2817 |     __in HANDLE hProcess,
2818 |     __in ULONG64 BaseOfDll,
2819 |     __in PCWSTR Name,
2820 |     __inout PSYMBOL_INFOW Symbol
2821 | );
2822 | 
2823 | BOOL
2824 | IMAGEAPI
2825 | SymAddSymbol(
2826 |     __in HANDLE hProcess,
2827 |     __in ULONG64 BaseOfDll,
2828 |     __in PCSTR Name,
2829 |     __in DWORD64 Address,
2830 |     __in DWORD Size,
2831 |     __in DWORD Flags
2832 | );
2833 | 
2834 | BOOL
2835 | IMAGEAPI
2836 | SymAddSymbolW(
2837 |     __in HANDLE hProcess,
2838 |     __in ULONG64 BaseOfDll,
2839 |     __in PCWSTR Name,
2840 |     __in DWORD64 Address,
2841 |     __in DWORD Size,
2842 |     __in DWORD Flags
2843 | );
2844 | 
2845 | BOOL
2846 | IMAGEAPI
2847 | SymDeleteSymbol(
2848 |     __in HANDLE hProcess,
2849 |     __in ULONG64 BaseOfDll,
2850 |     __in_opt PCSTR Name,
2851 |     __in DWORD64 Address,
2852 |     __in DWORD Flags
2853 | );
2854 | 
2855 | BOOL
2856 | IMAGEAPI
2857 | SymDeleteSymbolW(
2858 |     __in HANDLE hProcess,
2859 |     __in ULONG64 BaseOfDll,
2860 |     __in_opt PCWSTR Name,
2861 |     __in DWORD64 Address,
2862 |     __in DWORD Flags
2863 | );
2864 | 
2865 | BOOL
2866 | IMAGEAPI
2867 | SymRefreshModuleList(
2868 |     __in HANDLE hProcess
2869 | );
2870 | 
2871 | BOOL
2872 | IMAGEAPI
2873 | SymAddSourceStream(
2874 |     __in HANDLE hProcess,
2875 |     __in ULONG64 Base,
2876 |     __in_opt PCSTR StreamFile,
2877 |     __in_bcount_opt(Size) PBYTE Buffer,
2878 |     __in size_t Size
2879 | );
2880 | 
2881 | typedef BOOL (WINAPI* SYMADDSOURCESTREAM)(HANDLE, ULONG64, PCSTR, PBYTE, size_t);
2882 | 
2883 | BOOL
2884 | IMAGEAPI
2885 | SymAddSourceStreamA(
2886 |     __in HANDLE hProcess,
2887 |     __in ULONG64 Base,
2888 |     __in_opt PCSTR StreamFile,
2889 |     __in_bcount_opt(Size) PBYTE Buffer,
2890 |     __in size_t Size
2891 | );
2892 | 
2893 | typedef BOOL (WINAPI* SYMADDSOURCESTREAMA)(HANDLE, ULONG64, PCSTR, PBYTE, size_t);
2894 | 
2895 | BOOL
2896 | IMAGEAPI
2897 | SymAddSourceStreamW(
2898 |     __in HANDLE hProcess,
2899 |     __in ULONG64 Base,
2900 |     __in_opt PCWSTR FileSpec,
2901 |     __in_bcount_opt(Size) PBYTE Buffer,
2902 |     __in size_t Size
2903 | );
2904 | 
2905 | BOOL
2906 | IMAGEAPI
2907 | SymSrvIsStoreW(
2908 |     __in_opt HANDLE hProcess,
2909 |     __in PCWSTR path
2910 | );
2911 | 
2912 | BOOL
2913 | IMAGEAPI
2914 | SymSrvIsStore(
2915 |     __in_opt HANDLE hProcess,
2916 |     __in PCSTR path
2917 | );
2918 | 
2919 | PCSTR
2920 | IMAGEAPI
2921 | SymSrvDeltaName(
2922 |     __in HANDLE hProcess,
2923 |     __in_opt PCSTR SymPath,
2924 |     __in PCSTR Type,
2925 |     __in PCSTR File1,
2926 |     __in PCSTR File2
2927 | );
2928 | 
2929 | PCWSTR
2930 | IMAGEAPI
2931 | SymSrvDeltaNameW(
2932 |     __in HANDLE hProcess,
2933 |     __in_opt PCWSTR SymPath,
2934 |     __in PCWSTR Type,
2935 |     __in PCWSTR File1,
2936 |     __in PCWSTR File2
2937 | );
2938 | 
2939 | PCSTR
2940 | IMAGEAPI
2941 | SymSrvGetSupplement(
2942 |     __in HANDLE hProcess,
2943 |     __in_opt PCSTR SymPath,
2944 |     __in PCSTR Node,
2945 |     __in PCSTR File
2946 | );
2947 | 
2948 | PCWSTR
2949 | IMAGEAPI
2950 | SymSrvGetSupplementW(
2951 |     __in HANDLE hProcess,
2952 |     __in_opt PCWSTR SymPath,
2953 |     __in PCWSTR Node,
2954 |     __in PCWSTR File
2955 | );
2956 | 
2957 | BOOL
2958 | IMAGEAPI
2959 | SymSrvGetFileIndexes(
2960 |     __in PCSTR File,
2961 |     __out GUID* Id,
2962 |     __out PDWORD Val1,
2963 |     __out_opt PDWORD Val2,
2964 |     __in DWORD Flags
2965 | );
2966 | 
2967 | BOOL
2968 | IMAGEAPI
2969 | SymSrvGetFileIndexesW(
2970 |     __in PCWSTR File,
2971 |     __out GUID* Id,
2972 |     __out PDWORD Val1,
2973 |     __out_opt PDWORD Val2,
2974 |     __in DWORD Flags
2975 | );
2976 | 
2977 | BOOL
2978 | IMAGEAPI
2979 | SymSrvGetFileIndexStringW(
2980 |     __in HANDLE hProcess,
2981 |     __in_opt PCWSTR SrvPath,
2982 |     __in PCWSTR File,
2983 |     __out_ecount(Size) PWSTR Index,
2984 |     __in size_t Size,
2985 |     __in DWORD Flags
2986 | );
2987 | 
2988 | BOOL
2989 | IMAGEAPI
2990 | SymSrvGetFileIndexString(
2991 |     __in HANDLE hProcess,
2992 |     __in_opt PCSTR SrvPath,
2993 |     __in PCSTR File,
2994 |     __out_ecount(Size) PSTR Index,
2995 |     __in size_t Size,
2996 |     __in DWORD Flags
2997 | );
2998 | 
2999 | typedef struct
3000 | {
3001 |     DWORD sizeofstruct;
3002 |     char file[MAX_PATH + 1];
3003 |     BOOL  stripped;
3004 |     DWORD timestamp;
3005 |     DWORD size;
3006 |     char dbgfile[MAX_PATH + 1];
3007 |     char pdbfile[MAX_PATH + 1];
3008 |     GUID  guid;
3009 |     DWORD sig;
3010 |     DWORD age;
3011 | } SYMSRV_INDEX_INFO, *PSYMSRV_INDEX_INFO;
3012 | 
3013 | typedef struct
3014 | {
3015 |     DWORD sizeofstruct;
3016 |     WCHAR file[MAX_PATH + 1];
3017 |     BOOL  stripped;
3018 |     DWORD timestamp;
3019 |     DWORD size;
3020 |     WCHAR dbgfile[MAX_PATH + 1];
3021 |     WCHAR pdbfile[MAX_PATH + 1];
3022 |     GUID  guid;
3023 |     DWORD sig;
3024 |     DWORD age;
3025 | } SYMSRV_INDEX_INFOW, *PSYMSRV_INDEX_INFOW;
3026 | 
3027 | BOOL
3028 | IMAGEAPI
3029 | SymSrvGetFileIndexInfo(
3030 |     __in PCSTR File,
3031 |     __out PSYMSRV_INDEX_INFO Info,
3032 |     __in DWORD Flags
3033 | );
3034 | 
3035 | BOOL
3036 | IMAGEAPI
3037 | SymSrvGetFileIndexInfoW(
3038 |     __in PCWSTR File,
3039 |     __out PSYMSRV_INDEX_INFOW Info,
3040 |     __in DWORD Flags
3041 | );
3042 | 
3043 | PCSTR
3044 | IMAGEAPI
3045 | SymSrvStoreSupplement(
3046 |     __in HANDLE hProcess,
3047 |     __in_opt PCSTR SrvPath,
3048 |     __in PCSTR Node,
3049 |     __in PCSTR File,
3050 |     __in DWORD Flags
3051 | );
3052 | 
3053 | PCWSTR
3054 | IMAGEAPI
3055 | SymSrvStoreSupplementW(
3056 |     __in HANDLE hProcess,
3057 |     __in_opt PCWSTR SymPath,
3058 |     __in PCWSTR Node,
3059 |     __in PCWSTR File,
3060 |     __in DWORD Flags
3061 | );
3062 | 
3063 | PCSTR
3064 | IMAGEAPI
3065 | SymSrvStoreFile(
3066 |     __in HANDLE hProcess,
3067 |     __in_opt PCSTR SrvPath,
3068 |     __in PCSTR File,
3069 |     __in DWORD Flags
3070 | );
3071 | 
3072 | PCWSTR
3073 | IMAGEAPI
3074 | SymSrvStoreFileW(
3075 |     __in HANDLE hProcess,
3076 |     __in_opt PCWSTR SrvPath,
3077 |     __in PCWSTR File,
3078 |     __in DWORD Flags
3079 | );
3080 | 
3081 | // used by SymGetSymbolFile's "Type" parameter
3082 | 
3083 | enum
3084 | {
3085 |     sfImage = 0,
3086 |     sfDbg,
3087 |     sfPdb,
3088 |     sfMpd,
3089 |     sfMax
3090 | };
3091 | 
3092 | BOOL
3093 | IMAGEAPI
3094 | SymGetSymbolFile(
3095 |     __in_opt HANDLE hProcess,
3096 |     __in_opt PCSTR SymPath,
3097 |     __in PCSTR ImageFile,
3098 |     __in DWORD Type,
3099 |     __out_ecount(cSymbolFile) PSTR SymbolFile,
3100 |     __in size_t cSymbolFile,
3101 |     __out_ecount(cDbgFile) PSTR DbgFile,
3102 |     __in size_t cDbgFile
3103 | );
3104 | 
3105 | BOOL
3106 | IMAGEAPI
3107 | SymGetSymbolFileW(
3108 |     __in_opt HANDLE hProcess,
3109 |     __in_opt PCWSTR SymPath,
3110 |     __in PCWSTR ImageFile,
3111 |     __in DWORD Type,
3112 |     __out_ecount(cSymbolFile) PWSTR SymbolFile,
3113 |     __in size_t cSymbolFile,
3114 |     __out_ecount(cDbgFile) PWSTR DbgFile,
3115 |     __in size_t cDbgFile
3116 | );
3117 | 
3118 | //
3119 | // Full user-mode dump creation.
3120 | //
3121 | 
3122 | typedef BOOL (WINAPI* PDBGHELP_CREATE_USER_DUMP_CALLBACK)(
3123 |     __in DWORD DataType,
3124 |     __in PVOID* Data,
3125 |     __out LPDWORD DataLength,
3126 |     __in_opt PVOID UserData
3127 | );
3128 | 
3129 | BOOL
3130 | WINAPI
3131 | DbgHelpCreateUserDump(
3132 |     __in_opt LPCSTR FileName,
3133 |     __in PDBGHELP_CREATE_USER_DUMP_CALLBACK Callback,
3134 |     __in_opt PVOID UserData
3135 | );
3136 | 
3137 | BOOL
3138 | WINAPI
3139 | DbgHelpCreateUserDumpW(
3140 |     __in_opt LPCWSTR FileName,
3141 |     __in PDBGHELP_CREATE_USER_DUMP_CALLBACK Callback,
3142 |     __in_opt PVOID UserData
3143 | );
3144 | 
3145 | // -----------------------------------------------------------------
3146 | // The following 4 legacy APIs are fully supported, but newer
3147 | // ones are recommended.  SymFromName and SymFromAddr provide
3148 | // much more detailed info on the returned symbol.
3149 | 
3150 | BOOL
3151 | IMAGEAPI
3152 | SymGetSymFromAddr64(
3153 |     __in HANDLE hProcess,
3154 |     __in DWORD64 qwAddr,
3155 |     __out_opt PDWORD64 pdwDisplacement,
3156 |     __inout PIMAGEHLP_SYMBOL64  Symbol
3157 | );
3158 | 
3159 | 
3160 | #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
3161 | #define SymGetSymFromAddr SymGetSymFromAddr64
3162 | #else
3163 | BOOL
3164 | IMAGEAPI
3165 | SymGetSymFromAddr(
3166 |     __in HANDLE hProcess,
3167 |     __in DWORD dwAddr,
3168 |     __out_opt PDWORD pdwDisplacement,
3169 |     __inout PIMAGEHLP_SYMBOL Symbol
3170 | );
3171 | #endif
3172 | 
3173 | // While following two APIs will provide a symbol from a name,
3174 | // SymEnumSymbols can provide the same matching information
3175 | // for ALL symbols with a matching name, even regular
3176 | // expressions.  That way you can search across modules
3177 | // and differentiate between identically named symbols.
3178 | 
3179 | BOOL
3180 | IMAGEAPI
3181 | SymGetSymFromName64(
3182 |     __in HANDLE hProcess,
3183 |     __in PCSTR Name,
3184 |     __inout PIMAGEHLP_SYMBOL64 Symbol
3185 | );
3186 | 
3187 | #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
3188 | #define SymGetSymFromName SymGetSymFromName64
3189 | #else
3190 | BOOL
3191 | IMAGEAPI
3192 | SymGetSymFromName(
3193 |     __in HANDLE hProcess,
3194 |     __in PCSTR Name,
3195 |     __inout PIMAGEHLP_SYMBOL Symbol
3196 | );
3197 | #endif
3198 | 
3199 | 
3200 | // Symbol server exports
3201 | 
3202 | typedef BOOL (WINAPI* PSYMBOLSERVERPROC)(PCSTR, PCSTR, PVOID, DWORD, DWORD, PSTR);
3203 | typedef BOOL (WINAPI* PSYMBOLSERVERPROCA)(PCSTR, PCSTR, PVOID, DWORD, DWORD, PSTR);
3204 | typedef BOOL (WINAPI* PSYMBOLSERVERPROCW)(PCWSTR, PCWSTR, PVOID, DWORD, DWORD, PWSTR);
3205 | typedef BOOL (WINAPI* PSYMBOLSERVERBYINDEXPROC)(PCSTR, PCSTR, PCSTR, PSTR);
3206 | typedef BOOL (WINAPI* PSYMBOLSERVERBYINDEXPROCA)(PCSTR, PCSTR, PCSTR, PSTR);
3207 | typedef BOOL (WINAPI* PSYMBOLSERVERBYINDEXPROCW)(PCWSTR, PCWSTR, PCWSTR, PWSTR);
3208 | typedef BOOL (WINAPI* PSYMBOLSERVEROPENPROC)(VOID);
3209 | typedef BOOL (WINAPI* PSYMBOLSERVERCLOSEPROC)(VOID);
3210 | typedef BOOL (WINAPI* PSYMBOLSERVERSETOPTIONSPROC)(UINT_PTR, ULONG64);
3211 | typedef BOOL (WINAPI* PSYMBOLSERVERSETOPTIONSWPROC)(UINT_PTR, ULONG64);
3212 | typedef BOOL (CALLBACK WINAPI* PSYMBOLSERVERCALLBACKPROC)(UINT_PTR action, ULONG64 data, ULONG64 context);
3213 | typedef UINT_PTR(WINAPI* PSYMBOLSERVERGETOPTIONSPROC)();
3214 | typedef BOOL (WINAPI* PSYMBOLSERVERPINGPROC)(PCSTR);
3215 | typedef BOOL (WINAPI* PSYMBOLSERVERPINGPROCA)(PCSTR);
3216 | typedef BOOL (WINAPI* PSYMBOLSERVERPINGPROCW)(PCWSTR);
3217 | typedef BOOL (WINAPI* PSYMBOLSERVERGETVERSION)(LPAPI_VERSION);
3218 | typedef BOOL (WINAPI* PSYMBOLSERVERDELTANAME)(PCSTR, PVOID, DWORD, DWORD, PVOID, DWORD, DWORD, PSTR, size_t);
3219 | typedef BOOL (WINAPI* PSYMBOLSERVERDELTANAMEW)(PCWSTR, PVOID, DWORD, DWORD, PVOID, DWORD, DWORD, PWSTR, size_t);
3220 | typedef BOOL (WINAPI* PSYMBOLSERVERGETSUPPLEMENT)(PCSTR, PCSTR, PCSTR, PSTR, size_t);
3221 | typedef BOOL (WINAPI* PSYMBOLSERVERGETSUPPLEMENTW)(PCWSTR, PCWSTR, PCWSTR, PWSTR, size_t);
3222 | typedef BOOL (WINAPI* PSYMBOLSERVERSTORESUPPLEMENT)(PCSTR, PCSTR, PCSTR, PSTR, size_t, DWORD);
3223 | typedef BOOL (WINAPI* PSYMBOLSERVERSTORESUPPLEMENTW)(PCWSTR, PCWSTR, PCWSTR, PWSTR, size_t, DWORD);
3224 | typedef BOOL (WINAPI* PSYMBOLSERVERGETINDEXSTRING)(PVOID, DWORD, DWORD, PSTR, size_t);
3225 | typedef BOOL (WINAPI* PSYMBOLSERVERGETINDEXSTRINGW)(PVOID, DWORD, DWORD, PWSTR, size_t);
3226 | typedef BOOL (WINAPI* PSYMBOLSERVERSTOREFILE)(PCSTR, PCSTR, PVOID, DWORD, DWORD, PSTR, size_t, DWORD);
3227 | typedef BOOL (WINAPI* PSYMBOLSERVERSTOREFILEW)(PCWSTR, PCWSTR, PVOID, DWORD, DWORD, PWSTR, size_t, DWORD);
3228 | typedef BOOL (WINAPI* PSYMBOLSERVERISSTORE)(PCSTR);
3229 | typedef BOOL (WINAPI* PSYMBOLSERVERISSTOREW)(PCWSTR);
3230 | typedef DWORD (WINAPI* PSYMBOLSERVERVERSION)();
3231 | typedef BOOL (CALLBACK WINAPI* PSYMBOLSERVERMESSAGEPROC)(UINT_PTR action, ULONG64 data, ULONG64 context);
3232 | 
3233 | #define SYMSRV_VERSION              2
3234 | 
3235 | #define SSRVOPT_CALLBACK            0x00000001
3236 | #define SSRVOPT_DWORD               0x00000002
3237 | #define SSRVOPT_DWORDPTR            0x00000004
3238 | #define SSRVOPT_GUIDPTR             0x00000008
3239 | #define SSRVOPT_OLDGUIDPTR          0x00000010
3240 | #define SSRVOPT_UNATTENDED          0x00000020
3241 | #define SSRVOPT_NOCOPY              0x00000040
3242 | #define SSRVOPT_GETPATH             0x00000040
3243 | #define SSRVOPT_PARENTWIN           0x00000080
3244 | #define SSRVOPT_PARAMTYPE           0x00000100
3245 | #define SSRVOPT_SECURE              0x00000200
3246 | #define SSRVOPT_TRACE               0x00000400
3247 | #define SSRVOPT_SETCONTEXT          0x00000800
3248 | #define SSRVOPT_PROXY               0x00001000
3249 | #define SSRVOPT_DOWNSTREAM_STORE    0x00002000
3250 | #define SSRVOPT_OVERWRITE           0x00004000
3251 | #define SSRVOPT_RESETTOU            0x00008000
3252 | #define SSRVOPT_CALLBACKW           0x00010000
3253 | #define SSRVOPT_FLAT_DEFAULT_STORE  0x00020000
3254 | #define SSRVOPT_PROXYW              0x00040000
3255 | #define SSRVOPT_MESSAGE             0x00080000
3256 | #define SSRVOPT_SERVICE             0x00100000   // deprecated
3257 | #define SSRVOPT_FAVOR_COMPRESSED    0x00200000
3258 | #define SSRVOPT_STRING              0x00400000
3259 | #define SSRVOPT_WINHTTP             0x00800000
3260 | #define SSRVOPT_WININET             0x01000000
3261 | 
3262 | #define SSRVOPT_MAX                 0x0100000
3263 | 
3264 | #define SSRVOPT_RESET               ((ULONG_PTR)-1)
3265 | 
3266 | 
3267 | #define NUM_SSRVOPTS                30
3268 | 
3269 | #define SSRVACTION_TRACE        1
3270 | #define SSRVACTION_QUERYCANCEL  2
3271 | #define SSRVACTION_EVENT        3
3272 | #define SSRVACTION_EVENTW       4
3273 | #define SSRVACTION_SIZE         5
3274 | 
3275 | #define SYMSTOREOPT_COMPRESS        0x01
3276 | #define SYMSTOREOPT_OVERWRITE       0x02
3277 | #define SYMSTOREOPT_RETURNINDEX     0x04
3278 | #define SYMSTOREOPT_POINTER         0x08
3279 | #define SYMSTOREOPT_ALT_INDEX       0x10
3280 | #define SYMSTOREOPT_UNICODE         0x20
3281 | #define SYMSTOREOPT_PASS_IF_EXISTS  0x40
3282 | 
3283 | #ifdef DBGHELP_TRANSLATE_TCHAR
3284 | #define SymInitialize                     SymInitializeW
3285 | #define SymAddSymbol                      SymAddSymbolW
3286 | #define SymDeleteSymbol                   SymDeleteSymbolW
3287 | #define SearchTreeForFile                 SearchTreeForFileW
3288 | #define UnDecorateSymbolName              UnDecorateSymbolNameW
3289 | #define SymGetLineFromName64              SymGetLineFromNameW64
3290 | #define SymGetLineFromAddr64              SymGetLineFromAddrW64
3291 | #define SymGetLineNext64                  SymGetLineNextW64
3292 | #define SymGetLinePrev64                  SymGetLinePrevW64
3293 | #define SymFromName                       SymFromNameW
3294 | #define SymFindExecutableImage            SymFindExecutableImageW
3295 | #define FindExecutableImageEx             FindExecutableImageExW
3296 | #define SymSearch                         SymSearchW
3297 | #define SymEnumLines                      SymEnumLinesW
3298 | #define SymEnumSourceLines                SymEnumSourceLinesW
3299 | #define SymGetTypeFromName                SymGetTypeFromNameW
3300 | #define SymEnumSymbolsForAddr             SymEnumSymbolsForAddrW
3301 | #define SymFromAddr                       SymFromAddrW
3302 | #define SymMatchString                    SymMatchStringW
3303 | #define SymEnumSourceFiles                SymEnumSourceFilesW
3304 | #define SymEnumSymbols                    SymEnumSymbolsW
3305 | #define SymLoadModuleEx                   SymLoadModuleExW
3306 | #define SymSetSearchPath                  SymSetSearchPathW
3307 | #define SymGetSearchPath                  SymGetSearchPathW
3308 | #define EnumDirTree                       EnumDirTreeW
3309 | #define SymFromToken                      SymFromTokenW
3310 | #define SymFromIndex                      SymFromIndexW
3311 | #define SymGetScope                       SymGetScopeW
3312 | #define SymNext                           SymNextW
3313 | #define SymPrev                           SymPrevW
3314 | #define SymEnumTypes                      SymEnumTypesW
3315 | #define SymEnumTypesByName                SymEnumTypesByNameW
3316 | #define SymRegisterCallback64             SymRegisterCallbackW64
3317 | #define SymFindDebugInfoFile              SymFindDebugInfoFileW
3318 | #define FindDebugInfoFileEx               FindDebugInfoFileExW
3319 | #define SymFindFileInPath                 SymFindFileInPathW
3320 | #define SymEnumerateModules64             SymEnumerateModulesW64
3321 | #define SymSetHomeDirectory               SymSetHomeDirectoryW
3322 | #define SymGetHomeDirectory               SymGetHomeDirectoryW
3323 | #define SymGetSourceFile                  SymGetSourceFileW
3324 | #define SymGetSourceFileToken             SymGetSourceFileTokenW
3325 | #define SymGetSourceFileFromToken         SymGetSourceFileFromTokenW
3326 | #define SymGetSourceVarFromToken          SymGetSourceVarFromTokenW
3327 | #define SymGetSourceFileToken             SymGetSourceFileTokenW
3328 | #define SymGetFileLineOffsets64           SymGetFileLineOffsetsW64
3329 | #define SymFindFileInPath                 SymFindFileInPathW
3330 | #define SymMatchFileName                  SymMatchFileNameW
3331 | #define SymGetSourceFileFromToken         SymGetSourceFileFromTokenW
3332 | #define SymGetSourceVarFromToken          SymGetSourceVarFromTokenW
3333 | #define SymGetModuleInfo64                SymGetModuleInfoW64
3334 | #define SymSrvIsStore                     SymSrvIsStoreW
3335 | #define SymSrvDeltaName                   SymSrvDeltaNameW
3336 | #define SymSrvGetSupplement               SymSrvGetSupplementW
3337 | #define SymSrvStoreSupplement             SymSrvStoreSupplementW
3338 | #define SymSrvGetFileIndexes              SymSrvGetFileIndexes
3339 | #define SymSrvGetFileIndexString          SymSrvGetFileIndexStringW
3340 | #define SymSrvStoreFile                   SymSrvStoreFileW
3341 | #define SymGetSymbolFile                  SymGetSymbolFileW
3342 | #define EnumerateLoadedModules64          EnumerateLoadedModulesW64
3343 | #define EnumerateLoadedModulesEx          EnumerateLoadedModulesExW
3344 | #define SymSrvGetFileIndexInfo            SymSrvGetFileIndexInfoW
3345 | 
3346 | #define IMAGEHLP_LINE64                   IMAGEHLP_LINEW64
3347 | #define PIMAGEHLP_LINE64                  PIMAGEHLP_LINEW64
3348 | #define SYMBOL_INFO                       SYMBOL_INFOW
3349 | #define PSYMBOL_INFO                      PSYMBOL_INFOW
3350 | #define SYMBOL_INFO_PACKAGE               SYMBOL_INFO_PACKAGEW
3351 | #define PSYMBOL_INFO_PACKAGE              PSYMBOL_INFO_PACKAGEW
3352 | #define FIND_EXE_FILE_CALLBACK            FIND_EXE_FILE_CALLBACKW
3353 | #define PFIND_EXE_FILE_CALLBACK           PFIND_EXE_FILE_CALLBACKW
3354 | #define SYM_ENUMERATESYMBOLS_CALLBACK     SYM_ENUMERATESYMBOLS_CALLBACKW
3355 | #define PSYM_ENUMERATESYMBOLS_CALLBACK    PSYM_ENUMERATESYMBOLS_CALLBACKW
3356 | #define SRCCODEINFO                       SRCCODEINFOW
3357 | #define PSRCCODEINFO                      PSRCCODEINFOW
3358 | #define SOURCEFILE                        SOURCEFILEW
3359 | #define PSOURCEFILE                       PSOURCEFILEW
3360 | #define SYM_ENUMSOURECFILES_CALLBACK      SYM_ENUMSOURCEFILES_CALLBACKW
3361 | #define PSYM_ENUMSOURCEFILES_CALLBACK     PSYM_ENUMSOURECFILES_CALLBACKW
3362 | #define IMAGEHLP_CBA_EVENT                IMAGEHLP_CBA_EVENTW
3363 | #define PIMAGEHLP_CBA_EVENT               PIMAGEHLP_CBA_EVENTW
3364 | #define PENUMDIRTREE_CALLBACK             PENUMDIRTREE_CALLBACKW
3365 | #define IMAGEHLP_DEFERRED_SYMBOL_LOAD64   IMAGEHLP_DEFERRED_SYMBOL_LOADW64
3366 | #define PIMAGEHLP_DEFERRED_SYMBOL_LOAD64  PIMAGEHLP_DEFERRED_SYMBOL_LOADW64
3367 | #define PFIND_DEBUG_FILE_CALLBACK         PFIND_DEBUG_FILE_CALLBACKW
3368 | #define PFINDFILEINPATHCALLBACK           PFINDFILEINPATHCALLBACKW
3369 | #define IMAGEHLP_MODULE64                 IMAGEHLP_MODULEW64
3370 | #define PIMAGEHLP_MODULE64                PIMAGEHLP_MODULEW64
3371 | #define SYMSRV_INDEX_INFO                 SYMSRV_INDEX_INFOW
3372 | #define PSYMSRV_INDEX_INFO                PSYMSRV_INDEX_INFOW
3373 | 
3374 | #define PSYMBOLSERVERPROC                 PSYMBOLSERVERPROCW
3375 | #define PSYMBOLSERVERPINGPROC             PSYMBOLSERVERPINGPROCW
3376 | #endif
3377 | 
3378 | // -----------------------------------------------------------------
3379 | // The following APIs exist only for backwards compatibility
3380 | // with a pre-release version documented in an MSDN release.
3381 | 
3382 | // You should use SymFindFileInPath if you want to maintain
3383 | // future compatibility.
3384 | 
3385 | DBHLP_DEPRECIATED
3386 | BOOL
3387 | IMAGEAPI
3388 | FindFileInPath(
3389 |     __in HANDLE hprocess,
3390 |     __in PCSTR SearchPath,
3391 |     __in PCSTR FileName,
3392 |     __in PVOID id,
3393 |     __in DWORD two,
3394 |     __in DWORD three,
3395 |     __in DWORD flags,
3396 |     __out_ecount(MAX_PATH + 1) PSTR FilePath
3397 | );
3398 | 
3399 | // You should use SymFindFileInPath if you want to maintain
3400 | // future compatibility.
3401 | 
3402 | DBHLP_DEPRECIATED
3403 | BOOL
3404 | IMAGEAPI
3405 | FindFileInSearchPath(
3406 |     __in HANDLE hprocess,
3407 |     __in PCSTR SearchPath,
3408 |     __in PCSTR FileName,
3409 |     __in DWORD one,
3410 |     __in DWORD two,
3411 |     __in DWORD three,
3412 |     __out_ecount(MAX_PATH + 1) PSTR FilePath
3413 | );
3414 | 
3415 | DBHLP_DEPRECIATED
3416 | BOOL
3417 | IMAGEAPI
3418 | SymEnumSym(
3419 |     __in HANDLE hProcess,
3420 |     __in ULONG64 BaseOfDll,
3421 |     __in PSYM_ENUMERATESYMBOLS_CALLBACK EnumSymbolsCallback,
3422 |     __in_opt PVOID UserContext
3423 | );
3424 | 
3425 | DBHLP_DEPRECIATED
3426 | BOOL
3427 | IMAGEAPI
3428 | SymEnumerateSymbols64(
3429 |     __in HANDLE hProcess,
3430 |     __in ULONG64 BaseOfDll,
3431 |     __in PSYM_ENUMSYMBOLS_CALLBACK64 EnumSymbolsCallback,
3432 |     __in_opt PVOID UserContext
3433 | );
3434 | 
3435 | DBHLP_DEPRECIATED
3436 | BOOL
3437 | IMAGEAPI
3438 | SymEnumerateSymbolsW64(
3439 |     __in HANDLE hProcess,
3440 |     __in ULONG64 BaseOfDll,
3441 |     __in PSYM_ENUMSYMBOLS_CALLBACK64W EnumSymbolsCallback,
3442 |     __in_opt PVOID UserContext
3443 | );
3444 | 
3445 | 
3446 | #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
3447 | #define SymEnumerateSymbols SymEnumerateSymbols64
3448 | #define SymEnumerateSymbolsW SymEnumerateSymbolsW64
3449 | #else
3450 | DBHLP_DEPRECIATED
3451 | BOOL
3452 | IMAGEAPI
3453 | SymEnumerateSymbols(
3454 |     __in HANDLE hProcess,
3455 |     __in ULONG BaseOfDll,
3456 |     __in PSYM_ENUMSYMBOLS_CALLBACK EnumSymbolsCallback,
3457 |     __in_opt PVOID UserContext
3458 | );
3459 | 
3460 | DBHLP_DEPRECIATED
3461 | BOOL
3462 | IMAGEAPI
3463 | SymEnumerateSymbolsW(
3464 |     __in HANDLE hProcess,
3465 |     __in ULONG BaseOfDll,
3466 |     __in PSYM_ENUMSYMBOLS_CALLBACKW EnumSymbolsCallback,
3467 |     __in_opt PVOID UserContext
3468 | );
3469 | #endif
3470 | 
3471 | // use SymLoadModuleEx
3472 | 
3473 | DWORD64
3474 | IMAGEAPI
3475 | SymLoadModule64(
3476 |     __in HANDLE hProcess,
3477 |     __in_opt HANDLE hFile,
3478 |     __in_opt PCSTR ImageName,
3479 |     __in_opt PCSTR ModuleName,
3480 |     __in DWORD64 BaseOfDll,
3481 |     __in DWORD SizeOfDll
3482 | );
3483 | 
3484 | #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
3485 | #define SymLoadModule SymLoadModule64
3486 | #else
3487 | DWORD
3488 | IMAGEAPI
3489 | SymLoadModule(
3490 |     __in HANDLE hProcess,
3491 |     __in_opt HANDLE hFile,
3492 |     __in_opt PCSTR ImageName,
3493 |     __in_opt PCSTR ModuleName,
3494 |     __in DWORD BaseOfDll,
3495 |     __in DWORD SizeOfDll
3496 | );
3497 | #endif
3498 | 
3499 | BOOL
3500 | IMAGEAPI
3501 | SymGetSymNext64(
3502 |     __in HANDLE hProcess,
3503 |     __inout PIMAGEHLP_SYMBOL64 Symbol
3504 | );
3505 | 
3506 | BOOL
3507 | IMAGEAPI
3508 | SymGetSymNextW64(
3509 |     __in HANDLE hProcess,
3510 |     __inout PIMAGEHLP_SYMBOLW64 Symbol
3511 | );
3512 | 
3513 | #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
3514 | #define SymGetSymNext SymGetSymNext64
3515 | #define SymGetSymNextW SymGetSymNextW64
3516 | #else
3517 | BOOL
3518 | IMAGEAPI
3519 | SymGetSymNext(
3520 |     __in HANDLE hProcess,
3521 |     __inout PIMAGEHLP_SYMBOL Symbol
3522 | );
3523 | 
3524 | BOOL
3525 | IMAGEAPI
3526 | SymGetSymNextW(
3527 |     __in HANDLE hProcess,
3528 |     __inout PIMAGEHLP_SYMBOLW Symbol
3529 | );
3530 | #endif
3531 | 
3532 | BOOL
3533 | IMAGEAPI
3534 | SymGetSymPrev64(
3535 |     __in HANDLE hProcess,
3536 |     __inout PIMAGEHLP_SYMBOL64 Symbol
3537 | );
3538 | 
3539 | BOOL
3540 | IMAGEAPI
3541 | SymGetSymPrevW64(
3542 |     __in HANDLE hProcess,
3543 |     __inout PIMAGEHLP_SYMBOLW64 Symbol
3544 | );
3545 | 
3546 | #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
3547 | #define SymGetSymPrev SymGetSymPrev64
3548 | #define SymGetSymPrevW SymGetSymPrevW64
3549 | #else
3550 | BOOL
3551 | IMAGEAPI
3552 | SymGetSymPrev(
3553 |     __in HANDLE hProcess,
3554 |     __inout PIMAGEHLP_SYMBOL Symbol
3555 | );
3556 | 
3557 | BOOL
3558 | IMAGEAPI
3559 | SymGetSymPrevW(
3560 |     __in HANDLE hProcess,
3561 |     __inout PIMAGEHLP_SYMBOLW Symbol
3562 | );
3563 | #endif
3564 | 
3565 | 
3566 | // These values should not be used.
3567 | // They have been replaced by SYMFLAG_ values.
3568 | 
3569 | #define SYMF_OMAP_GENERATED   0x00000001
3570 | #define SYMF_OMAP_MODIFIED    0x00000002
3571 | #define SYMF_REGISTER         0x00000008
3572 | #define SYMF_REGREL           0x00000010
3573 | #define SYMF_FRAMEREL         0x00000020
3574 | #define SYMF_PARAMETER        0x00000040
3575 | #define SYMF_LOCAL            0x00000080
3576 | #define SYMF_CONSTANT         0x00000100
3577 | #define SYMF_EXPORT           0x00000200
3578 | #define SYMF_FORWARDER        0x00000400
3579 | #define SYMF_FUNCTION         0x00000800
3580 | #define SYMF_VIRTUAL          0x00001000
3581 | #define SYMF_THUNK            0x00002000
3582 | #define SYMF_TLSREL           0x00004000
3583 | 
3584 | // These values should also not be used.
3585 | // They have been replaced by SYMFLAG_ values.
3586 | 
3587 | #define IMAGEHLP_SYMBOL_INFO_VALUEPRESENT          1
3588 | #define IMAGEHLP_SYMBOL_INFO_REGISTER              SYMF_REGISTER        // 0x0008
3589 | #define IMAGEHLP_SYMBOL_INFO_REGRELATIVE           SYMF_REGREL          // 0x0010
3590 | #define IMAGEHLP_SYMBOL_INFO_FRAMERELATIVE         SYMF_FRAMEREL        // 0x0020
3591 | #define IMAGEHLP_SYMBOL_INFO_PARAMETER             SYMF_PARAMETER       // 0x0040
3592 | #define IMAGEHLP_SYMBOL_INFO_LOCAL                 SYMF_LOCAL           // 0x0080
3593 | #define IMAGEHLP_SYMBOL_INFO_CONSTANT              SYMF_CONSTANT        // 0x0100
3594 | #define IMAGEHLP_SYMBOL_FUNCTION                   SYMF_FUNCTION        // 0x0800
3595 | #define IMAGEHLP_SYMBOL_VIRTUAL                    SYMF_VIRTUAL         // 0x1000
3596 | #define IMAGEHLP_SYMBOL_THUNK                      SYMF_THUNK           // 0x2000
3597 | #define IMAGEHLP_SYMBOL_INFO_TLSRELATIVE           SYMF_TLSREL          // 0x4000
3598 | 
3599 | #pragma pack(pop)
3600 | 
3601 | 
3602 | #pragma pack(push,4)
3603 | 
3604 | #define MINIDUMP_SIGNATURE ('PMDM')
3605 | #define MINIDUMP_VERSION   (42899)
3606 | typedef DWORD RVA;
3607 | typedef ULONG64 RVA64;
3608 | 
3609 | typedef struct _MINIDUMP_LOCATION_DESCRIPTOR
3610 | {
3611 |     ULONG32 DataSize;
3612 |     RVA Rva;
3613 | } MINIDUMP_LOCATION_DESCRIPTOR;
3614 | 
3615 | typedef struct _MINIDUMP_LOCATION_DESCRIPTOR64
3616 | {
3617 |     ULONG64 DataSize;
3618 |     RVA64 Rva;
3619 | } MINIDUMP_LOCATION_DESCRIPTOR64;
3620 | 
3621 | 
3622 | typedef struct _MINIDUMP_MEMORY_DESCRIPTOR
3623 | {
3624 |     ULONG64 StartOfMemoryRange;
3625 |     MINIDUMP_LOCATION_DESCRIPTOR Memory;
3626 | } MINIDUMP_MEMORY_DESCRIPTOR, *PMINIDUMP_MEMORY_DESCRIPTOR;
3627 | 
3628 | // DESCRIPTOR64 is used for full-memory minidumps where
3629 | // all of the raw memory is laid out sequentially at the
3630 | // end of the dump.  There is no need for individual RVAs
3631 | // as the RVA is the base RVA plus the sum of the preceeding
3632 | // data blocks.
3633 | typedef struct _MINIDUMP_MEMORY_DESCRIPTOR64
3634 | {
3635 |     ULONG64 StartOfMemoryRange;
3636 |     ULONG64 DataSize;
3637 | } MINIDUMP_MEMORY_DESCRIPTOR64, *PMINIDUMP_MEMORY_DESCRIPTOR64;
3638 | 
3639 | 
3640 | typedef struct _MINIDUMP_HEADER
3641 | {
3642 |     ULONG32 Signature;
3643 |     ULONG32 Version;
3644 |     ULONG32 NumberOfStreams;
3645 |     RVA StreamDirectoryRva;
3646 |     ULONG32 CheckSum;
3647 |     union
3648 |     {
3649 |         ULONG32 Reserved;
3650 |         ULONG32 TimeDateStamp;
3651 |     };
3652 |     ULONG64 Flags;
3653 | } MINIDUMP_HEADER, *PMINIDUMP_HEADER;
3654 | 
3655 | //
3656 | // The MINIDUMP_HEADER field StreamDirectoryRva points to
3657 | // an array of MINIDUMP_DIRECTORY structures.
3658 | //
3659 | 
3660 | typedef struct _MINIDUMP_DIRECTORY
3661 | {
3662 |     ULONG32 StreamType;
3663 |     MINIDUMP_LOCATION_DESCRIPTOR Location;
3664 | } MINIDUMP_DIRECTORY, *PMINIDUMP_DIRECTORY;
3665 | 
3666 | 
3667 | typedef struct _MINIDUMP_STRING
3668 | {
3669 |     ULONG32 Length;         // Length in bytes of the string
3670 |     WCHAR   Buffer [0];     // Variable size buffer
3671 | } MINIDUMP_STRING, *PMINIDUMP_STRING;
3672 | 
3673 | 
3674 | 
3675 | //
3676 | // The MINIDUMP_DIRECTORY field StreamType may be one of the following types.
3677 | // Types will be added in the future, so if a program reading the minidump
3678 | // header encounters a stream type it does not understand it should ignore
3679 | // the data altogether. Any tag above LastReservedStream will not be used by
3680 | // the system and is reserved for program-specific information.
3681 | //
3682 | 
3683 | typedef enum _MINIDUMP_STREAM_TYPE
3684 | {
3685 | 
3686 |     UnusedStream                = 0,
3687 |     ReservedStream0             = 1,
3688 |     ReservedStream1             = 2,
3689 |     ThreadListStream            = 3,
3690 |     ModuleListStream            = 4,
3691 |     MemoryListStream            = 5,
3692 |     ExceptionStream             = 6,
3693 |     SystemInfoStream            = 7,
3694 |     ThreadExListStream          = 8,
3695 |     Memory64ListStream          = 9,
3696 |     CommentStreamA              = 10,
3697 |     CommentStreamW              = 11,
3698 |     HandleDataStream            = 12,
3699 |     FunctionTableStream         = 13,
3700 |     UnloadedModuleListStream    = 14,
3701 |     MiscInfoStream              = 15,
3702 |     MemoryInfoListStream        = 16,
3703 |     ThreadInfoListStream        = 17,
3704 |     HandleOperationListStream   = 18,
3705 |     TokenStream                 = 19,
3706 | 
3707 |     ceStreamNull                = 0x8000,
3708 |     ceStreamSystemInfo          = 0x8001,
3709 |     ceStreamException           = 0x8002,
3710 |     ceStreamModuleList          = 0x8003,
3711 |     ceStreamProcessList         = 0x8004,
3712 |     ceStreamThreadList          = 0x8005,
3713 |     ceStreamThreadContextList   = 0x8006,
3714 |     ceStreamThreadCallStackList = 0x8007,
3715 |     ceStreamMemoryVirtualList   = 0x8008,
3716 |     ceStreamMemoryPhysicalList  = 0x8009,
3717 |     ceStreamBucketParameters    = 0x800A,
3718 |     ceStreamProcessModuleMap    = 0x800B,
3719 |     ceStreamDiagnosisList       = 0x800C,
3720 | 
3721 |     LastReservedStream          = 0xffff
3722 | 
3723 | } MINIDUMP_STREAM_TYPE;
3724 | 
3725 | 
3726 | //
3727 | // The minidump system information contains processor and
3728 | // Operating System specific information.
3729 | //
3730 | 
3731 | //
3732 | // CPU information is obtained from one of two places.
3733 | //
3734 | //  1) On x86 computers, CPU_INFORMATION is obtained from the CPUID
3735 | //     instruction. You must use the X86 portion of the union for X86
3736 | //     computers.
3737 | //
3738 | //  2) On non-x86 architectures, CPU_INFORMATION is obtained by calling
3739 | //     IsProcessorFeatureSupported().
3740 | //
3741 | 
3742 | typedef union _CPU_INFORMATION
3743 | {
3744 | 
3745 |     //
3746 |     // X86 platforms use CPUID function to obtain processor information.
3747 |     //
3748 | 
3749 |     struct
3750 |     {
3751 | 
3752 |         //
3753 |         // CPUID Subfunction 0, register EAX (VendorId [0]),
3754 |         // EBX (VendorId [1]) and ECX (VendorId [2]).
3755 |         //
3756 | 
3757 |         ULONG32 VendorId [ 3 ];
3758 | 
3759 |         //
3760 |         // CPUID Subfunction 1, register EAX
3761 |         //
3762 | 
3763 |         ULONG32 VersionInformation;
3764 | 
3765 |         //
3766 |         // CPUID Subfunction 1, register EDX
3767 |         //
3768 | 
3769 |         ULONG32 FeatureInformation;
3770 | 
3771 | 
3772 |         //
3773 |         // CPUID, Subfunction 80000001, register EBX. This will only
3774 |         // be obtained if the vendor id is "AuthenticAMD".
3775 |         //
3776 | 
3777 |         ULONG32 AMDExtendedCpuFeatures;
3778 | 
3779 |     } X86CpuInfo;
3780 | 
3781 |     //
3782 |     // Non-x86 platforms use processor feature flags.
3783 |     //
3784 | 
3785 |     struct
3786 |     {
3787 | 
3788 |         ULONG64 ProcessorFeatures [ 2 ];
3789 | 
3790 |     } OtherCpuInfo;
3791 | 
3792 | } CPU_INFORMATION, *PCPU_INFORMATION;
3793 | 
3794 | typedef struct _MINIDUMP_SYSTEM_INFO
3795 | {
3796 | 
3797 |     //
3798 |     // ProcessorArchitecture, ProcessorLevel and ProcessorRevision are all
3799 |     // taken from the SYSTEM_INFO structure obtained by GetSystemInfo( ).
3800 |     //
3801 | 
3802 |     USHORT ProcessorArchitecture;
3803 |     USHORT ProcessorLevel;
3804 |     USHORT ProcessorRevision;
3805 | 
3806 |     union
3807 |     {
3808 |         USHORT Reserved0;
3809 |         struct
3810 |         {
3811 |             UCHAR NumberOfProcessors;
3812 |             UCHAR ProductType;
3813 |         };
3814 |     };
3815 | 
3816 |     //
3817 |     // MajorVersion, MinorVersion, BuildNumber, PlatformId and
3818 |     // CSDVersion are all taken from the OSVERSIONINFO structure
3819 |     // returned by GetVersionEx( ).
3820 |     //
3821 | 
3822 |     ULONG32 MajorVersion;
3823 |     ULONG32 MinorVersion;
3824 |     ULONG32 BuildNumber;
3825 |     ULONG32 PlatformId;
3826 | 
3827 |     //
3828 |     // RVA to a CSDVersion string in the string table.
3829 |     //
3830 | 
3831 |     RVA CSDVersionRva;
3832 | 
3833 |     union
3834 |     {
3835 |         ULONG32 Reserved1;
3836 |         struct
3837 |         {
3838 |             USHORT SuiteMask;
3839 |             USHORT Reserved2;
3840 |         };
3841 |     };
3842 | 
3843 |     CPU_INFORMATION Cpu;
3844 | 
3845 | } MINIDUMP_SYSTEM_INFO, *PMINIDUMP_SYSTEM_INFO;
3846 | 
3847 | 
3848 | //
3849 | // The minidump thread contains standard thread
3850 | // information plus an RVA to the memory for this
3851 | // thread and an RVA to the CONTEXT structure for
3852 | // this thread.
3853 | //
3854 | 
3855 | 
3856 | //
3857 | // ThreadId must be 4 bytes on all architectures.
3858 | //
3859 | 
3860 | C_ASSERT(sizeof(((PPROCESS_INFORMATION)0)->dwThreadId) == 4);
3861 | 
3862 | typedef struct _MINIDUMP_THREAD
3863 | {
3864 |     ULONG32 ThreadId;
3865 |     ULONG32 SuspendCount;
3866 |     ULONG32 PriorityClass;
3867 |     ULONG32 Priority;
3868 |     ULONG64 Teb;
3869 |     MINIDUMP_MEMORY_DESCRIPTOR Stack;
3870 |     MINIDUMP_LOCATION_DESCRIPTOR ThreadContext;
3871 | } MINIDUMP_THREAD, *PMINIDUMP_THREAD;
3872 | 
3873 | //
3874 | // The thread list is a container of threads.
3875 | //
3876 | 
3877 | typedef struct _MINIDUMP_THREAD_LIST
3878 | {
3879 |     ULONG32 NumberOfThreads;
3880 |     MINIDUMP_THREAD Threads [0];
3881 | } MINIDUMP_THREAD_LIST, *PMINIDUMP_THREAD_LIST;
3882 | 
3883 | 
3884 | typedef struct _MINIDUMP_THREAD_EX
3885 | {
3886 |     ULONG32 ThreadId;
3887 |     ULONG32 SuspendCount;
3888 |     ULONG32 PriorityClass;
3889 |     ULONG32 Priority;
3890 |     ULONG64 Teb;
3891 |     MINIDUMP_MEMORY_DESCRIPTOR Stack;
3892 |     MINIDUMP_LOCATION_DESCRIPTOR ThreadContext;
3893 |     MINIDUMP_MEMORY_DESCRIPTOR BackingStore;
3894 | } MINIDUMP_THREAD_EX, *PMINIDUMP_THREAD_EX;
3895 | 
3896 | //
3897 | // The thread list is a container of threads.
3898 | //
3899 | 
3900 | typedef struct _MINIDUMP_THREAD_EX_LIST
3901 | {
3902 |     ULONG32 NumberOfThreads;
3903 |     MINIDUMP_THREAD_EX Threads [0];
3904 | } MINIDUMP_THREAD_EX_LIST, *PMINIDUMP_THREAD_EX_LIST;
3905 | 
3906 | 
3907 | //
3908 | // The MINIDUMP_EXCEPTION is the same as EXCEPTION on Win64.
3909 | //
3910 | 
3911 | typedef struct _MINIDUMP_EXCEPTION
3912 | {
3913 |     ULONG32 ExceptionCode;
3914 |     ULONG32 ExceptionFlags;
3915 |     ULONG64 ExceptionRecord;
3916 |     ULONG64 ExceptionAddress;
3917 |     ULONG32 NumberParameters;
3918 |     ULONG32 __unusedAlignment;
3919 |     ULONG64 ExceptionInformation [ EXCEPTION_MAXIMUM_PARAMETERS ];
3920 | } MINIDUMP_EXCEPTION, *PMINIDUMP_EXCEPTION;
3921 | 
3922 | 
3923 | //
3924 | // The exception information stream contains the id of the thread that caused
3925 | // the exception (ThreadId), the exception record for the exception
3926 | // (ExceptionRecord) and an RVA to the thread context where the exception
3927 | // occured.
3928 | //
3929 | 
3930 | typedef struct MINIDUMP_EXCEPTION_STREAM
3931 | {
3932 |     ULONG32 ThreadId;
3933 |     ULONG32  __alignment;
3934 |     MINIDUMP_EXCEPTION ExceptionRecord;
3935 |     MINIDUMP_LOCATION_DESCRIPTOR ThreadContext;
3936 | } MINIDUMP_EXCEPTION_STREAM, *PMINIDUMP_EXCEPTION_STREAM;
3937 | 
3938 | 
3939 | //
3940 | // The MINIDUMP_MODULE contains information about a
3941 | // a specific module. It includes the CheckSum and
3942 | // the TimeDateStamp for the module so the module
3943 | // can be reloaded during the analysis phase.
3944 | //
3945 | 
3946 | typedef struct _MINIDUMP_MODULE
3947 | {
3948 |     ULONG64 BaseOfImage;
3949 |     ULONG32 SizeOfImage;
3950 |     ULONG32 CheckSum;
3951 |     ULONG32 TimeDateStamp;
3952 |     RVA ModuleNameRva;
3953 |     VS_FIXEDFILEINFO VersionInfo;
3954 |     MINIDUMP_LOCATION_DESCRIPTOR CvRecord;
3955 |     MINIDUMP_LOCATION_DESCRIPTOR MiscRecord;
3956 |     ULONG64 Reserved0;                          // Reserved for future use.
3957 |     ULONG64 Reserved1;                          // Reserved for future use.
3958 | } MINIDUMP_MODULE, *PMINIDUMP_MODULE;
3959 | 
3960 | 
3961 | //
3962 | // The minidump module list is a container for modules.
3963 | //
3964 | 
3965 | typedef struct _MINIDUMP_MODULE_LIST
3966 | {
3967 |     ULONG32 NumberOfModules;
3968 |     MINIDUMP_MODULE Modules [ 0 ];
3969 | } MINIDUMP_MODULE_LIST, *PMINIDUMP_MODULE_LIST;
3970 | 
3971 | 
3972 | //
3973 | // Memory Ranges
3974 | //
3975 | 
3976 | typedef struct _MINIDUMP_MEMORY_LIST
3977 | {
3978 |     ULONG32 NumberOfMemoryRanges;
3979 |     MINIDUMP_MEMORY_DESCRIPTOR MemoryRanges [0];
3980 | } MINIDUMP_MEMORY_LIST, *PMINIDUMP_MEMORY_LIST;
3981 | 
3982 | typedef struct _MINIDUMP_MEMORY64_LIST
3983 | {
3984 |     ULONG64 NumberOfMemoryRanges;
3985 |     RVA64 BaseRva;
3986 |     MINIDUMP_MEMORY_DESCRIPTOR64 MemoryRanges [0];
3987 | } MINIDUMP_MEMORY64_LIST, *PMINIDUMP_MEMORY64_LIST;
3988 | 
3989 | 
3990 | //
3991 | // Support for user supplied exception information.
3992 | //
3993 | 
3994 | typedef struct _MINIDUMP_EXCEPTION_INFORMATION
3995 | {
3996 |     DWORD ThreadId;
3997 |     PEXCEPTION_POINTERS ExceptionPointers;
3998 |     BOOL ClientPointers;
3999 | } MINIDUMP_EXCEPTION_INFORMATION, *PMINIDUMP_EXCEPTION_INFORMATION;
4000 | 
4001 | typedef struct _MINIDUMP_EXCEPTION_INFORMATION64
4002 | {
4003 |     DWORD ThreadId;
4004 |     ULONG64 ExceptionRecord;
4005 |     ULONG64 ContextRecord;
4006 |     BOOL ClientPointers;
4007 | } MINIDUMP_EXCEPTION_INFORMATION64, *PMINIDUMP_EXCEPTION_INFORMATION64;
4008 | 
4009 | 
4010 | //
4011 | // Support for capturing system handle state at the time of the dump.
4012 | //
4013 | 
4014 | // Per-handle object information varies according to
4015 | // the OS, the OS version, the processor type and
4016 | // so on.  The minidump gives a minidump identifier
4017 | // to each possible data format for identification
4018 | // purposes but does not control nor describe the actual data.
4019 | typedef enum _MINIDUMP_HANDLE_OBJECT_INFORMATION_TYPE
4020 | {
4021 |     MiniHandleObjectInformationNone,
4022 |     MiniThreadInformation1,
4023 |     MiniMutantInformation1,
4024 |     MiniMutantInformation2,
4025 |     MiniProcessInformation1,
4026 |     MiniProcessInformation2,
4027 |     MiniHandleObjectInformationTypeMax
4028 | } MINIDUMP_HANDLE_OBJECT_INFORMATION_TYPE;
4029 | 
4030 | typedef struct _MINIDUMP_HANDLE_OBJECT_INFORMATION
4031 | {
4032 |     RVA NextInfoRva;
4033 |     ULONG32 InfoType;
4034 |     ULONG32 SizeOfInfo;
4035 |     // Raw information follows.
4036 | } MINIDUMP_HANDLE_OBJECT_INFORMATION;
4037 | 
4038 | typedef struct _MINIDUMP_HANDLE_DESCRIPTOR
4039 | {
4040 |     ULONG64 Handle;
4041 |     RVA TypeNameRva;
4042 |     RVA ObjectNameRva;
4043 |     ULONG32 Attributes;
4044 |     ULONG32 GrantedAccess;
4045 |     ULONG32 HandleCount;
4046 |     ULONG32 PointerCount;
4047 | } MINIDUMP_HANDLE_DESCRIPTOR, *PMINIDUMP_HANDLE_DESCRIPTOR;
4048 | 
4049 | typedef struct _MINIDUMP_HANDLE_DESCRIPTOR_2
4050 | {
4051 |     ULONG64 Handle;
4052 |     RVA TypeNameRva;
4053 |     RVA ObjectNameRva;
4054 |     ULONG32 Attributes;
4055 |     ULONG32 GrantedAccess;
4056 |     ULONG32 HandleCount;
4057 |     ULONG32 PointerCount;
4058 |     RVA ObjectInfoRva;
4059 |     ULONG32 Reserved0;
4060 | } MINIDUMP_HANDLE_DESCRIPTOR_2, *PMINIDUMP_HANDLE_DESCRIPTOR_2;
4061 | 
4062 | // The latest MINIDUMP_HANDLE_DESCRIPTOR definition.
4063 | typedef MINIDUMP_HANDLE_DESCRIPTOR_2 MINIDUMP_HANDLE_DESCRIPTOR_N;
4064 | typedef MINIDUMP_HANDLE_DESCRIPTOR_N* PMINIDUMP_HANDLE_DESCRIPTOR_N;
4065 | 
4066 | typedef struct _MINIDUMP_HANDLE_DATA_STREAM
4067 | {
4068 |     ULONG32 SizeOfHeader;
4069 |     ULONG32 SizeOfDescriptor;
4070 |     ULONG32 NumberOfDescriptors;
4071 |     ULONG32 Reserved;
4072 | } MINIDUMP_HANDLE_DATA_STREAM, *PMINIDUMP_HANDLE_DATA_STREAM;
4073 | 
4074 | // Some operating systems can track the last operations
4075 | // performed on a handle.  For example, Application Verifier
4076 | // can enable this for some versions of Windows.  The
4077 | // handle operation list collects handle operations
4078 | // known for the dump target.
4079 | // Each entry is an AVRF_HANDLE_OPERATION.
4080 | typedef struct _MINIDUMP_HANDLE_OPERATION_LIST
4081 | {
4082 |     ULONG32 SizeOfHeader;
4083 |     ULONG32 SizeOfEntry;
4084 |     ULONG32 NumberOfEntries;
4085 |     ULONG32 Reserved;
4086 | } MINIDUMP_HANDLE_OPERATION_LIST, *PMINIDUMP_HANDLE_OPERATION_LIST;
4087 | 
4088 | 
4089 | //
4090 | // Support for capturing dynamic function table state at the time of the dump.
4091 | //
4092 | 
4093 | typedef struct _MINIDUMP_FUNCTION_TABLE_DESCRIPTOR
4094 | {
4095 |     ULONG64 MinimumAddress;
4096 |     ULONG64 MaximumAddress;
4097 |     ULONG64 BaseAddress;
4098 |     ULONG32 EntryCount;
4099 |     ULONG32 SizeOfAlignPad;
4100 | } MINIDUMP_FUNCTION_TABLE_DESCRIPTOR, *PMINIDUMP_FUNCTION_TABLE_DESCRIPTOR;
4101 | 
4102 | typedef struct _MINIDUMP_FUNCTION_TABLE_STREAM
4103 | {
4104 |     ULONG32 SizeOfHeader;
4105 |     ULONG32 SizeOfDescriptor;
4106 |     ULONG32 SizeOfNativeDescriptor;
4107 |     ULONG32 SizeOfFunctionEntry;
4108 |     ULONG32 NumberOfDescriptors;
4109 |     ULONG32 SizeOfAlignPad;
4110 | } MINIDUMP_FUNCTION_TABLE_STREAM, *PMINIDUMP_FUNCTION_TABLE_STREAM;
4111 | 
4112 | 
4113 | //
4114 | // The MINIDUMP_UNLOADED_MODULE contains information about a
4115 | // a specific module that was previously loaded but no
4116 | // longer is.  This can help with diagnosing problems where
4117 | // callers attempt to call code that is no longer loaded.
4118 | //
4119 | 
4120 | typedef struct _MINIDUMP_UNLOADED_MODULE
4121 | {
4122 |     ULONG64 BaseOfImage;
4123 |     ULONG32 SizeOfImage;
4124 |     ULONG32 CheckSum;
4125 |     ULONG32 TimeDateStamp;
4126 |     RVA ModuleNameRva;
4127 | } MINIDUMP_UNLOADED_MODULE, *PMINIDUMP_UNLOADED_MODULE;
4128 | 
4129 | 
4130 | //
4131 | // The minidump unloaded module list is a container for unloaded modules.
4132 | //
4133 | 
4134 | typedef struct _MINIDUMP_UNLOADED_MODULE_LIST
4135 | {
4136 |     ULONG32 SizeOfHeader;
4137 |     ULONG32 SizeOfEntry;
4138 |     ULONG32 NumberOfEntries;
4139 | } MINIDUMP_UNLOADED_MODULE_LIST, *PMINIDUMP_UNLOADED_MODULE_LIST;
4140 | 
4141 | 
4142 | //
4143 | // The miscellaneous information stream contains a variety
4144 | // of small pieces of information.  A member is valid if
4145 | // it's within the available size and its corresponding
4146 | // bit is set.
4147 | //
4148 | 
4149 | #define MINIDUMP_MISC1_PROCESS_ID            0x00000001
4150 | #define MINIDUMP_MISC1_PROCESS_TIMES         0x00000002
4151 | #define MINIDUMP_MISC1_PROCESSOR_POWER_INFO  0x00000004
4152 | #define MINIDUMP_MISC3_PROCESS_INTEGRITY     0x00000010
4153 | #define MINIDUMP_MISC3_PROCESS_EXECUTE_FLAGS 0x00000020
4154 | #define MINIDUMP_MISC3_TIMEZONE              0x00000040
4155 | #define MINIDUMP_MISC3_PROTECTED_PROCESS     0x00000080
4156 | 
4157 | typedef struct _MINIDUMP_MISC_INFO
4158 | {
4159 |     ULONG32 SizeOfInfo;
4160 |     ULONG32 Flags1;
4161 |     ULONG32 ProcessId;
4162 |     ULONG32 ProcessCreateTime;
4163 |     ULONG32 ProcessUserTime;
4164 |     ULONG32 ProcessKernelTime;
4165 | } MINIDUMP_MISC_INFO, *PMINIDUMP_MISC_INFO;
4166 | 
4167 | typedef struct _MINIDUMP_MISC_INFO_2
4168 | {
4169 |     ULONG32 SizeOfInfo;
4170 |     ULONG32 Flags1;
4171 |     ULONG32 ProcessId;
4172 |     ULONG32 ProcessCreateTime;
4173 |     ULONG32 ProcessUserTime;
4174 |     ULONG32 ProcessKernelTime;
4175 |     ULONG32 ProcessorMaxMhz;
4176 |     ULONG32 ProcessorCurrentMhz;
4177 |     ULONG32 ProcessorMhzLimit;
4178 |     ULONG32 ProcessorMaxIdleState;
4179 |     ULONG32 ProcessorCurrentIdleState;
4180 | } MINIDUMP_MISC_INFO_2, *PMINIDUMP_MISC_INFO_2;
4181 | 
4182 | typedef struct _MINIDUMP_MISC_INFO_3
4183 | {
4184 |     ULONG32 SizeOfInfo;
4185 |     ULONG32 Flags1;
4186 |     ULONG32 ProcessId;
4187 |     ULONG32 ProcessCreateTime;
4188 |     ULONG32 ProcessUserTime;
4189 |     ULONG32 ProcessKernelTime;
4190 |     ULONG32 ProcessorMaxMhz;
4191 |     ULONG32 ProcessorCurrentMhz;
4192 |     ULONG32 ProcessorMhzLimit;
4193 |     ULONG32 ProcessorMaxIdleState;
4194 |     ULONG32 ProcessorCurrentIdleState;
4195 |     ULONG32 ProcessIntegrityLevel;
4196 |     ULONG32 ProcessExecuteFlags;
4197 |     ULONG32 ProtectedProcess;
4198 |     ULONG32 TimeZoneId;
4199 |     TIME_ZONE_INFORMATION TimeZone;
4200 | } MINIDUMP_MISC_INFO_3, *PMINIDUMP_MISC_INFO_3;
4201 | 
4202 | // The latest MINIDUMP_MISC_INFO definition.
4203 | typedef MINIDUMP_MISC_INFO_3 MINIDUMP_MISC_INFO_N;
4204 | typedef MINIDUMP_MISC_INFO_N* PMINIDUMP_MISC_INFO_N;
4205 | 
4206 | 
4207 | //
4208 | // The memory information stream contains memory region
4209 | // description information.  This stream corresponds to
4210 | // what VirtualQuery would return for the process the
4211 | // dump was created for.
4212 | //
4213 | 
4214 | typedef struct _MINIDUMP_MEMORY_INFO
4215 | {
4216 |     ULONG64 BaseAddress;
4217 |     ULONG64 AllocationBase;
4218 |     ULONG32 AllocationProtect;
4219 |     ULONG32 __alignment1;
4220 |     ULONG64 RegionSize;
4221 |     ULONG32 State;
4222 |     ULONG32 Protect;
4223 |     ULONG32 Type;
4224 |     ULONG32 __alignment2;
4225 | } MINIDUMP_MEMORY_INFO, *PMINIDUMP_MEMORY_INFO;
4226 | 
4227 | typedef struct _MINIDUMP_MEMORY_INFO_LIST
4228 | {
4229 |     ULONG SizeOfHeader;
4230 |     ULONG SizeOfEntry;
4231 |     ULONG64 NumberOfEntries;
4232 | } MINIDUMP_MEMORY_INFO_LIST, *PMINIDUMP_MEMORY_INFO_LIST;
4233 | 
4234 | 
4235 | //
4236 | // The memory information stream contains memory region
4237 | // description information.  This stream corresponds to
4238 | // what VirtualQuery would return for the process the
4239 | // dump was created for.
4240 | //
4241 | 
4242 | // Thread dump writer status flags.
4243 | #define MINIDUMP_THREAD_INFO_ERROR_THREAD    0x00000001
4244 | #define MINIDUMP_THREAD_INFO_WRITING_THREAD  0x00000002
4245 | #define MINIDUMP_THREAD_INFO_EXITED_THREAD   0x00000004
4246 | #define MINIDUMP_THREAD_INFO_INVALID_INFO    0x00000008
4247 | #define MINIDUMP_THREAD_INFO_INVALID_CONTEXT 0x00000010
4248 | #define MINIDUMP_THREAD_INFO_INVALID_TEB     0x00000020
4249 | 
4250 | typedef struct _MINIDUMP_THREAD_INFO
4251 | {
4252 |     ULONG32 ThreadId;
4253 |     ULONG32 DumpFlags;
4254 |     ULONG32 DumpError;
4255 |     ULONG32 ExitStatus;
4256 |     ULONG64 CreateTime;
4257 |     ULONG64 ExitTime;
4258 |     ULONG64 KernelTime;
4259 |     ULONG64 UserTime;
4260 |     ULONG64 StartAddress;
4261 |     ULONG64 Affinity;
4262 | } MINIDUMP_THREAD_INFO, *PMINIDUMP_THREAD_INFO;
4263 | 
4264 | typedef struct _MINIDUMP_THREAD_INFO_LIST
4265 | {
4266 |     ULONG SizeOfHeader;
4267 |     ULONG SizeOfEntry;
4268 |     ULONG NumberOfEntries;
4269 | } MINIDUMP_THREAD_INFO_LIST, *PMINIDUMP_THREAD_INFO_LIST;
4270 | 
4271 | //
4272 | // Support for token information.
4273 | //
4274 | typedef struct _MINIDUMP_TOKEN_INFO_HEADER
4275 | {
4276 |     ULONG   TokenSize;   // The size of the token structure.
4277 |     ULONG   TokenId;     // The PID in NtOpenProcessToken() call or TID in NtOpenThreadToken() call.
4278 |     ULONG64 TokenHandle; // The handle value returned.
4279 | } MINIDUMP_TOKEN_INFO_HEADER, *PMINIDUMP_TOKEN_INFO_HEADER;
4280 | 
4281 | typedef struct _MINIDUMP_TOKEN_INFO_LIST
4282 | {
4283 |     ULONG TokenListSize;
4284 |     ULONG TokenListEntries;
4285 |     ULONG ListHeaderSize;
4286 |     ULONG ElementHeaderSize;
4287 | } MINIDUMP_TOKEN_INFO_LIST, *PMINIDUMP_TOKEN_INFO_LIST;
4288 | 
4289 | //
4290 | // Support for arbitrary user-defined information.
4291 | //
4292 | 
4293 | typedef struct _MINIDUMP_USER_RECORD
4294 | {
4295 |     ULONG32 Type;
4296 |     MINIDUMP_LOCATION_DESCRIPTOR Memory;
4297 | } MINIDUMP_USER_RECORD, *PMINIDUMP_USER_RECORD;
4298 | 
4299 | 
4300 | typedef struct _MINIDUMP_USER_STREAM
4301 | {
4302 |     ULONG32 Type;
4303 |     ULONG BufferSize;
4304 |     PVOID Buffer;
4305 | 
4306 | } MINIDUMP_USER_STREAM, *PMINIDUMP_USER_STREAM;
4307 | 
4308 | 
4309 | typedef struct _MINIDUMP_USER_STREAM_INFORMATION
4310 | {
4311 |     ULONG UserStreamCount;
4312 |     PMINIDUMP_USER_STREAM UserStreamArray;
4313 | } MINIDUMP_USER_STREAM_INFORMATION, *PMINIDUMP_USER_STREAM_INFORMATION;
4314 | 
4315 | //
4316 | // Callback support.
4317 | //
4318 | 
4319 | typedef enum _MINIDUMP_CALLBACK_TYPE
4320 | {
4321 |     ModuleCallback,
4322 |     ThreadCallback,
4323 |     ThreadExCallback,
4324 |     IncludeThreadCallback,
4325 |     IncludeModuleCallback,
4326 |     MemoryCallback,
4327 |     CancelCallback,
4328 |     WriteKernelMinidumpCallback,
4329 |     KernelMinidumpStatusCallback,
4330 |     RemoveMemoryCallback,
4331 |     IncludeVmRegionCallback,
4332 |     IoStartCallback,
4333 |     IoWriteAllCallback,
4334 |     IoFinishCallback,
4335 |     ReadMemoryFailureCallback,
4336 |     SecondaryFlagsCallback,
4337 | } MINIDUMP_CALLBACK_TYPE;
4338 | 
4339 | 
4340 | typedef struct _MINIDUMP_THREAD_CALLBACK
4341 | {
4342 |     ULONG ThreadId;
4343 |     HANDLE ThreadHandle;
4344 |     CONTEXT Context;
4345 |     ULONG SizeOfContext;
4346 |     ULONG64 StackBase;
4347 |     ULONG64 StackEnd;
4348 | } MINIDUMP_THREAD_CALLBACK, *PMINIDUMP_THREAD_CALLBACK;
4349 | 
4350 | 
4351 | typedef struct _MINIDUMP_THREAD_EX_CALLBACK
4352 | {
4353 |     ULONG ThreadId;
4354 |     HANDLE ThreadHandle;
4355 |     CONTEXT Context;
4356 |     ULONG SizeOfContext;
4357 |     ULONG64 StackBase;
4358 |     ULONG64 StackEnd;
4359 |     ULONG64 BackingStoreBase;
4360 |     ULONG64 BackingStoreEnd;
4361 | } MINIDUMP_THREAD_EX_CALLBACK, *PMINIDUMP_THREAD_EX_CALLBACK;
4362 | 
4363 | 
4364 | typedef struct _MINIDUMP_INCLUDE_THREAD_CALLBACK
4365 | {
4366 |     ULONG ThreadId;
4367 | } MINIDUMP_INCLUDE_THREAD_CALLBACK, *PMINIDUMP_INCLUDE_THREAD_CALLBACK;
4368 | 
4369 | 
4370 | typedef enum _THREAD_WRITE_FLAGS
4371 | {
4372 |     ThreadWriteThread            = 0x0001,
4373 |     ThreadWriteStack             = 0x0002,
4374 |     ThreadWriteContext           = 0x0004,
4375 |     ThreadWriteBackingStore      = 0x0008,
4376 |     ThreadWriteInstructionWindow = 0x0010,
4377 |     ThreadWriteThreadData        = 0x0020,
4378 |     ThreadWriteThreadInfo        = 0x0040,
4379 | } THREAD_WRITE_FLAGS;
4380 | 
4381 | typedef struct _MINIDUMP_MODULE_CALLBACK
4382 | {
4383 |     PWCHAR FullPath;
4384 |     ULONG64 BaseOfImage;
4385 |     ULONG SizeOfImage;
4386 |     ULONG CheckSum;
4387 |     ULONG TimeDateStamp;
4388 |     VS_FIXEDFILEINFO VersionInfo;
4389 |     PVOID CvRecord;
4390 |     ULONG SizeOfCvRecord;
4391 |     PVOID MiscRecord;
4392 |     ULONG SizeOfMiscRecord;
4393 | } MINIDUMP_MODULE_CALLBACK, *PMINIDUMP_MODULE_CALLBACK;
4394 | 
4395 | 
4396 | typedef struct _MINIDUMP_INCLUDE_MODULE_CALLBACK
4397 | {
4398 |     ULONG64 BaseOfImage;
4399 | } MINIDUMP_INCLUDE_MODULE_CALLBACK, *PMINIDUMP_INCLUDE_MODULE_CALLBACK;
4400 | 
4401 | 
4402 | typedef enum _MODULE_WRITE_FLAGS
4403 | {
4404 |     ModuleWriteModule        = 0x0001,
4405 |     ModuleWriteDataSeg       = 0x0002,
4406 |     ModuleWriteMiscRecord    = 0x0004,
4407 |     ModuleWriteCvRecord      = 0x0008,
4408 |     ModuleReferencedByMemory = 0x0010,
4409 |     ModuleWriteTlsData       = 0x0020,
4410 |     ModuleWriteCodeSegs      = 0x0040,
4411 | } MODULE_WRITE_FLAGS;
4412 | 
4413 | 
4414 | typedef struct _MINIDUMP_IO_CALLBACK
4415 | {
4416 |     HANDLE Handle;
4417 |     ULONG64 Offset;
4418 |     PVOID Buffer;
4419 |     ULONG BufferBytes;
4420 | } MINIDUMP_IO_CALLBACK, *PMINIDUMP_IO_CALLBACK;
4421 | 
4422 | 
4423 | typedef struct _MINIDUMP_READ_MEMORY_FAILURE_CALLBACK
4424 | {
4425 |     ULONG64 Offset;
4426 |     ULONG Bytes;
4427 |     HRESULT FailureStatus;
4428 | } MINIDUMP_READ_MEMORY_FAILURE_CALLBACK,
4429 | *PMINIDUMP_READ_MEMORY_FAILURE_CALLBACK;
4430 | 
4431 | 
4432 | typedef struct _MINIDUMP_CALLBACK_INPUT
4433 | {
4434 |     ULONG ProcessId;
4435 |     HANDLE ProcessHandle;
4436 |     ULONG CallbackType;
4437 |     union
4438 |     {
4439 |         HRESULT Status;
4440 |         MINIDUMP_THREAD_CALLBACK Thread;
4441 |         MINIDUMP_THREAD_EX_CALLBACK ThreadEx;
4442 |         MINIDUMP_MODULE_CALLBACK Module;
4443 |         MINIDUMP_INCLUDE_THREAD_CALLBACK IncludeThread;
4444 |         MINIDUMP_INCLUDE_MODULE_CALLBACK IncludeModule;
4445 |         MINIDUMP_IO_CALLBACK Io;
4446 |         MINIDUMP_READ_MEMORY_FAILURE_CALLBACK ReadMemoryFailure;
4447 |         ULONG SecondaryFlags;
4448 |     };
4449 | } MINIDUMP_CALLBACK_INPUT, *PMINIDUMP_CALLBACK_INPUT;
4450 | 
4451 | typedef struct _MINIDUMP_CALLBACK_OUTPUT
4452 | {
4453 |     union
4454 |     {
4455 |         ULONG ModuleWriteFlags;
4456 |         ULONG ThreadWriteFlags;
4457 |         ULONG SecondaryFlags;
4458 |         struct
4459 |         {
4460 |             ULONG64 MemoryBase;
4461 |             ULONG MemorySize;
4462 |         };
4463 |         struct
4464 |         {
4465 |             BOOL CheckCancel;
4466 |             BOOL Cancel;
4467 |         };
4468 |         HANDLE Handle;
4469 |         struct
4470 |         {
4471 |             MINIDUMP_MEMORY_INFO VmRegion;
4472 |             BOOL Continue;
4473 |         };
4474 |         HRESULT Status;
4475 |     };
4476 | } MINIDUMP_CALLBACK_OUTPUT, *PMINIDUMP_CALLBACK_OUTPUT;
4477 | 
4478 | 
4479 | //
4480 | // A normal minidump contains just the information
4481 | // necessary to capture stack traces for all of the
4482 | // existing threads in a process.
4483 | //
4484 | // A minidump with data segments includes all of the data
4485 | // sections from loaded modules in order to capture
4486 | // global variable contents.  This can make the dump much
4487 | // larger if many modules have global data.
4488 | //
4489 | // A minidump with full memory includes all of the accessible
4490 | // memory in the process and can be very large.  A minidump
4491 | // with full memory always has the raw memory data at the end
4492 | // of the dump so that the initial structures in the dump can
4493 | // be mapped directly without having to include the raw
4494 | // memory information.
4495 | //
4496 | // Stack and backing store memory can be filtered to remove
4497 | // data unnecessary for stack walking.  This can improve
4498 | // compression of stacks and also deletes data that may
4499 | // be private and should not be stored in a dump.
4500 | // Memory can also be scanned to see what modules are
4501 | // referenced by stack and backing store memory to allow
4502 | // omission of other modules to reduce dump size.
4503 | // In either of these modes the ModuleReferencedByMemory flag
4504 | // is set for all modules referenced before the base
4505 | // module callbacks occur.
4506 | //
4507 | // On some operating systems a list of modules that were
4508 | // recently unloaded is kept in addition to the currently
4509 | // loaded module list.  This information can be saved in
4510 | // the dump if desired.
4511 | //
4512 | // Stack and backing store memory can be scanned for referenced
4513 | // pages in order to pick up data referenced by locals or other
4514 | // stack memory.  This can increase the size of a dump significantly.
4515 | //
4516 | // Module paths may contain undesired information such as user names
4517 | // or other important directory names so they can be stripped.  This
4518 | // option reduces the ability to locate the proper image later
4519 | // and should only be used in certain situations.
4520 | //
4521 | // Complete operating system per-process and per-thread information can
4522 | // be gathered and stored in the dump.
4523 | //
4524 | // The virtual address space can be scanned for various types
4525 | // of memory to be included in the dump.
4526 | //
4527 | // Code which is concerned with potentially private information
4528 | // getting into the minidump can set a flag that automatically
4529 | // modifies all existing and future flags to avoid placing
4530 | // unnecessary data in the dump.  Basic data, such as stack
4531 | // information, will still be included but optional data, such
4532 | // as indirect memory, will not.
4533 | //
4534 | // When doing a full memory dump it's possible to store all
4535 | // of the enumerated memory region descriptive information
4536 | // in a memory information stream.
4537 | //
4538 | // Additional thread information beyond the basic thread
4539 | // structure can be collected if desired.
4540 | //
4541 | // A minidump with code segments includes all of the code
4542 | // and code-related sections from loaded modules in order
4543 | // to capture executable content.
4544 | //
4545 | // MiniDumpWithoutAuxiliaryState turns off any secondary,
4546 | // auxiliary-supported memory gathering.
4547 | //
4548 | // MiniDumpWithFullAuxiliaryState asks any present auxiliary
4549 | // data providers to include all of their state in the dump.
4550 | // The exact set of what is provided depends on the auxiliary.
4551 | // This can be quite large.
4552 | //
4553 | 
4554 | typedef enum _MINIDUMP_TYPE
4555 | {
4556 |     MiniDumpNormal                         = 0x00000000,
4557 |     MiniDumpWithDataSegs                   = 0x00000001,
4558 |     MiniDumpWithFullMemory                 = 0x00000002,
4559 |     MiniDumpWithHandleData                 = 0x00000004,
4560 |     MiniDumpFilterMemory                   = 0x00000008,
4561 |     MiniDumpScanMemory                     = 0x00000010,
4562 |     MiniDumpWithUnloadedModules            = 0x00000020,
4563 |     MiniDumpWithIndirectlyReferencedMemory = 0x00000040,
4564 |     MiniDumpFilterModulePaths              = 0x00000080,
4565 |     MiniDumpWithProcessThreadData          = 0x00000100,
4566 |     MiniDumpWithPrivateReadWriteMemory     = 0x00000200,
4567 |     MiniDumpWithoutOptionalData            = 0x00000400,
4568 |     MiniDumpWithFullMemoryInfo             = 0x00000800,
4569 |     MiniDumpWithThreadInfo                 = 0x00001000,
4570 |     MiniDumpWithCodeSegs                   = 0x00002000,
4571 |     MiniDumpWithoutAuxiliaryState          = 0x00004000,
4572 |     MiniDumpWithFullAuxiliaryState         = 0x00008000,
4573 |     MiniDumpWithPrivateWriteCopyMemory     = 0x00010000,
4574 |     MiniDumpIgnoreInaccessibleMemory       = 0x00020000,
4575 |     MiniDumpWithTokenInformation           = 0x00040000,
4576 |     MiniDumpValidTypeFlags                 = 0x0007ffff,
4577 | } MINIDUMP_TYPE;
4578 | 
4579 | //
4580 | // In addition to the primary flags provided to
4581 | // MiniDumpWriteDump there are additional, less
4582 | // frequently used options queried via the secondary
4583 | // flags callback.
4584 | //
4585 | // MiniSecondaryWithoutPowerInfo suppresses the minidump
4586 | // query that retrieves processor power information for
4587 | // MINIDUMP_MISC_INFO.
4588 | //
4589 | 
4590 | typedef enum _MINIDUMP_SECONDARY_FLAGS
4591 | {
4592 |     MiniSecondaryWithoutPowerInfo = 0x00000001,
4593 | 
4594 |     MiniSecondaryValidFlags       = 0x00000001,
4595 | } MINIDUMP_SECONDARY_FLAGS;
4596 | 
4597 | 
4598 | //
4599 | // The minidump callback should modify the FieldsToWrite parameter to reflect
4600 | // what portions of the specified thread or module should be written to the
4601 | // file.
4602 | //
4603 | 
4604 | typedef
4605 | BOOL
4606 | (WINAPI* MINIDUMP_CALLBACK_ROUTINE)(
4607 |     __inout PVOID CallbackParam,
4608 |     __in    PMINIDUMP_CALLBACK_INPUT CallbackInput,
4609 |     __inout PMINIDUMP_CALLBACK_OUTPUT CallbackOutput
4610 | );
4611 | 
4612 | typedef struct _MINIDUMP_CALLBACK_INFORMATION
4613 | {
4614 |     MINIDUMP_CALLBACK_ROUTINE CallbackRoutine;
4615 |     PVOID CallbackParam;
4616 | } MINIDUMP_CALLBACK_INFORMATION, *PMINIDUMP_CALLBACK_INFORMATION;
4617 | 
4618 | 
4619 | 
4620 | //++
4621 | //
4622 | // PVOID
4623 | // RVA_TO_ADDR(
4624 | //     PVOID Mapping,
4625 | //     ULONG Rva
4626 | //     )
4627 | //
4628 | // Routine Description:
4629 | //
4630 | //     Map an RVA that is contained within a mapped file to it's associated
4631 | //     flat address.
4632 | //
4633 | // Arguments:
4634 | //
4635 | //     Mapping - Base address of mapped file containing the RVA.
4636 | //
4637 | //     Rva - An Rva to fixup.
4638 | //
4639 | // Return Values:
4640 | //
4641 | //     A pointer to the desired data.
4642 | //
4643 | //--
4644 | 
4645 | #define RVA_TO_ADDR(Mapping,Rva) ((PVOID)(((ULONG_PTR) (Mapping)) + (Rva)))
4646 | 
4647 | BOOL
4648 | WINAPI
4649 | MiniDumpWriteDump(
4650 |     __in HANDLE hProcess,
4651 |     __in DWORD ProcessId,
4652 |     __in HANDLE hFile,
4653 |     __in MINIDUMP_TYPE DumpType,
4654 |     __in_opt PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam,
4655 |     __in_opt PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam,
4656 |     __in_opt PMINIDUMP_CALLBACK_INFORMATION CallbackParam
4657 | );
4658 | 
4659 | BOOL
4660 | WINAPI
4661 | MiniDumpReadDumpStream(
4662 |     __in PVOID BaseOfDump,
4663 |     __in ULONG StreamNumber,
4664 |     __deref_out_opt PMINIDUMP_DIRECTORY* Dir,
4665 |     __deref_out_opt PVOID* StreamPointer,
4666 |     __out_opt ULONG* StreamSize
4667 | );
4668 | 
4669 | #pragma pack(pop)
4670 | 
4671 | #ifdef __cplusplus
4672 | }
4673 | #endif
4674 | 
4675 | 
4676 | #endif // _DBGHELP_
4677 | 
4678 | 
```
Page 18/21FirstPrevNextLast