shithub: duke3d

Download patch

ref: e1647ba1c02f2d66a3086cc191c594800bf0be22
parent: 2a5e75b44909c515c24197955aa9c2a0f3584f48
author: Tanguy Fautre <tanguy@fautre.com>
date: Fri Feb 14 18:44:35 EST 2020

Added CMake based build system.
Removed a few unused source files.

diff: cannot open b/cmake//null: file does not exist: 'b/cmake//null'
--- a/.gitignore
+++ b/.gitignore
@@ -1,42 +1,9 @@
 .vs
-*.sdf
-*.suo
 _ReSharper.Caches
-_UpgradeReport_Files
-UpgradeLog.*
-DerivedData
-.xcuserstate
-*.xcuserdatad
-.DS_Store
-xcshareddata
-SDL-1.2.9
-*.opensdf
-DebugVC7
+
 bin
 build
-x64
-*/ReleaseVC7
-*vcxproj.user
-DUKE3D.GRP
+lib
 
-# Linux
-*.o
-*.a
-*~
-chocolate-duke3d
 duke3d.cfg
 duke3d.grp
-
-# GNU automake
-.deps
-/aclocal.m4
-/autom4te.cache
-/build-aux
-Makefile
-Makefile.in
-/config.h
-/config.h.in
-/config.log
-/config.status
-/configure
-/stamp-h1
--- /dev/null
+++ b/CMakeLists.txt
@@ -1,0 +1,64 @@
+cmake_minimum_required(VERSION 3.10)
+
+project(BelgianChocolateDuke3D)
+
+# On Linux, default to Release if not specified.
+if (UNIX AND NOT CMAKE_BUILD_TYPE)
+	set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Specifies the build type on single-configuration generators" FORCE)
+endif ()
+
+# Output everything into bin/ and lib/
+set(CMAKE_DEBUG_POSTFIX d)
+set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin)
+set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin)
+set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/lib)
+
+# Ignore the Configuration sub-directory on Visual Studio.
+foreach (OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES})
+    string(TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG)
+    set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_SOURCE_DIR}/bin)
+    set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_SOURCE_DIR}/bin)
+    set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_SOURCE_DIR}/lib)
+endforeach()
+
+# CMake extensions
+set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/")
+
+if (WIN32)
+
+	add_definitions(-DWIN32_LEAN_AND_MEAN)
+	add_definitions(-D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE)
+	
+	# Statically link against the multithreaded runtime.
+	foreach (flag_var CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
+		if (${flag_var} MATCHES "/MD")
+			string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
+		endif()
+	endforeach()
+	
+	# Compile files in parallel
+	add_compile_options("/MP")
+	
+endif()
+
+if (UNIX)
+		
+	add_definitions(-DUNIX)
+	add_compile_options("-Wall")
+
+endif ()
+
+if(CMAKE_SIZEOF_VOID_P EQUAL 8)
+	set(project_suffix ".64")
+elseif(CMAKE_SIZEOF_VOID_P EQUAL 4)
+    set(project_suffix ".32")
+endif()
+
+find_package(ENet REQUIRED)
+find_path(SDL2_INCLUDE_DIR SDL2/SDL.h)
+find_package(SDL2 CONFIG REQUIRED) 
+find_package(SDL2-mixer CONFIG REQUIRED)
+
+add_subdirectory(Engine)
+add_subdirectory(Game)
+set_property (DIRECTORY PROPERTY VS_STARTUP_PROJECT Game)
--- /dev/null
+++ b/Engine/CMakeLists.txt
@@ -1,0 +1,40 @@
+
+set(project_name "Engine")
+
+add_definitions(-DUDP_NETWORKING)
+
+set(src_files
+	src/build.h
+	src/cache.c
+	src/cache.h
+	src/display.c
+	src/display.h
+	src/draw.c
+	src/draw.h
+	src/dummy_multi.c
+	src/engine.c
+	src/engine.h
+	src/filesystem.c
+	src/filesystem.h
+	src/fixedPoint_math.c
+	src/fixedPoint_math.h
+	src/icon.h
+	src/macos_compat.h
+	src/mmulti.c
+	src/mmulti_stable.cpp
+	src/mmulti_stable.h
+	src/mmulti_unstable.h
+	src/network.c
+	src/network.h
+	src/platform.h
+	src/sdl_util.h
+	src/tiles.c
+	src/tiles.h
+	src/unix_compat.h
+	src/win32_compat.h
+)
+
+include_directories(${SDL2_INCLUDE_DIR})
+add_library(${project_name} STATIC ${src_files})
+#set_target_properties(${project_name} PROPERTIES DEBUG_POSTFIX ${CMAKE_DEBUG_POSTFIX})
+set_target_properties(${project_name} PROPERTIES OUTPUT_NAME "Engine${project_suffix}")
--- /dev/null
+++ b/Game/CMakeLists.txt
@@ -1,0 +1,132 @@
+
+set(project_name "Game")
+set(exe_name "ChocoDuke3D${project_suffix}")
+
+add_definitions(-DCHECK_XDUKE_REV)
+
+set(src_files_audiolib_headers
+	src/audiolib/_multivc.h
+	src/audiolib/debugio.h
+	src/audiolib/dma.h
+	src/audiolib/dpmi.h
+	src/audiolib/dsl.h
+	src/audiolib/interrup.h
+	src/audiolib/fx_man.h
+	src/audiolib/linklist.h
+	src/audiolib/ll_man.h
+	src/audiolib/multivoc.h
+	src/audiolib/pitch.h
+	src/audiolib/sndcards.h
+	src/audiolib/user.h
+	src/audiolib/usrhooks.h
+	src/audiolib/util.h
+)
+
+set(src_files_audiolib
+	src/audiolib/dsl.c
+	src/audiolib/fx_man.c
+	src/audiolib/ll_man.c
+	src/audiolib/multivoc.c
+	src/audiolib/mv_mix.c
+	src/audiolib/mvreverb.c
+	src/audiolib/nodpmi.c
+	src/audiolib/pitch.c
+	src/audiolib/user.c
+	# TODO source contains loads of files that are not used (only DOS). Delete them?
+)
+
+set(src_files_console_headers
+	src/_functio.h
+	src/console.h
+	src/cvar_defs.h
+	src/cvars.h
+)
+
+set(src_files_console
+	src/console.c
+	src/cvar_defs.c
+	src/cvars.c
+)
+
+set(src_files_midi
+	src/midi/sdl_midi.c
+)
+
+set(src_files_headers
+	src/_rts.h
+	src/animlib.h
+	src/config.h
+	src/control.h
+	src/develop.h
+	src/duke3d.h
+	src/dukeunix.h
+	src/dukewin.h
+	src/file_lib.h
+	src/funct.h
+	src/function.h
+	src/game.h
+	src/gamedefs.h
+	src/global.h
+	src/joystick.h
+	src/keyboard.h
+	src/mouse.h
+	src/names.h
+	src/premap.h
+	src/rts.h
+	src/scriplib.h
+	src/sounddebugdefs.h
+	src/soundefs.h
+	src/sounds.h
+	src/types.h
+	src/util_lib.h
+)
+
+set(src_files
+	src/actors.c
+	src/animlib.c
+	src/config.c
+	src/control.c
+	src/game.c
+	src/gamedef.c
+	src/global.c
+	src/keyboard.c
+	src/menues.c
+	src/player.c
+	src/premap.c
+	src/rts.c
+	src/scriplib.c
+	src/sector.c
+	src/sounds.c
+)
+
+if (WIN32)
+	set (resource_files chocolateDukeResources.rc)
+endif()
+
+source_group("AudioLib Header Files" FILES ${src_files_audiolib_headers})
+source_group("AudioLib Source Files" FILES ${src_files_audiolib})
+source_group("Console Header Files" FILES ${src_files_console_headers})
+source_group("Console Source Files" FILES ${src_files_console})
+source_group("Main Header Files" FILES ${src_files_headers})
+source_group("Main Source Files" FILES ${src_files})
+source_group("Midi Source Files" FILES ${src_files_midi})
+source_group("Resources" FILES ${resource_files})
+
+include_directories(../Engine/src)
+include_directories(${SDL2_INCLUDE_DIR})
+
+add_executable(${project_name} 
+	${src_files_audiolib_headers}
+	${src_files_audiolib}
+	${src_files_console_headers} 
+	${src_files_console} 
+	${src_files_midi} 
+	${src_files_headers} 
+	${src_files}
+	${resource_files}
+)
+
+set_target_properties(${project_name} PROPERTIES DEBUG_POSTFIX ${CMAKE_DEBUG_POSTFIX})
+target_link_libraries(${project_name} PRIVATE Engine ${ENET_LIBRARIES} SDL2::SDL2main SDL2::SDL2-static SDL2::SDL2_mixer)
+set_target_properties(${project_name} PROPERTIES OUTPUT_NAME "ChocoDuke3D${project_suffix}")
+set_target_properties(${project_name} PROPERTIES VS_DEBUGGER_WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}/bin")
--- a/Game/src/DbgHelp.h
+++ /dev/null
@@ -1,2437 +1,0 @@
-/*++ BUILD Version: 0001     Increment this if a change has global effects
-
-Copyright (c) Microsoft Corporation. All rights reserved.
-
-Module Name:
-
-    dbghelp.h
-
-Abstract:
-
-    This module defines the prototypes and constants required for the image
-    help routines.
-
-    Contains debugging support routines that are redistributable.
-
-Revision History:
-
---*/
-
-#ifndef _DBGHELP_
-#define _DBGHELP_
-
-#if _MSC_VER > 1020
-#pragma once
-#endif
-
-
-// As a general principal always call the 64 bit version
-// of every API, if a choice exists.  The 64 bit version
-// works great on 32 bit platforms, and is forward
-// compatible to 64 bit platforms.
-
-#ifdef _WIN64
-#ifndef _IMAGEHLP64
-#define _IMAGEHLP64
-#endif
-#endif
-
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#ifdef _IMAGEHLP_SOURCE_
-#define IMAGEAPI __stdcall
-#define DBHLP_DEPRECIATED
-#else
-#define IMAGEAPI DECLSPEC_IMPORT __stdcall
-#define DBHLP_DEPRECIATED DECLSPEC_DEPRECATED
-#endif
-#define DBHLPAPI IMAGEAPI
-
-#define IMAGE_SEPARATION (64*1024)
-
-typedef struct _LOADED_IMAGE {
-    PSTR                  ModuleName;
-    HANDLE                hFile;
-    PUCHAR                MappedAddress;
-#ifdef _IMAGEHLP64
-    PIMAGE_NT_HEADERS64   FileHeader;
-#else
-    PIMAGE_NT_HEADERS32   FileHeader;
-#endif
-    PIMAGE_SECTION_HEADER LastRvaSection;
-    Uint32_t                 NumberOfSections;
-    PIMAGE_SECTION_HEADER Sections;
-    Uint32_t                 Characteristics;
-    BOOLEAN               fSystemImage;
-    BOOLEAN               fDOSImage;
-    LIST_ENTRY            Links;
-    Uint32_t                 SizeOfImage;
-} LOADED_IMAGE, *PLOADED_IMAGE;
-
-
-
-HANDLE
-IMAGEAPI
-FindDebugInfoFile (
-    PSTR FileName,
-    PSTR SymbolPath,
-    PSTR DebugFilePath
-    );
-
-typedef BOOL
-(CALLBACK *PFIND_DEBUG_FILE_CALLBACK)(
-    HANDLE FileHandle,
-    PSTR FileName,
-    PVOID CallerData
-    );
-
-HANDLE
-IMAGEAPI
-FindDebugInfoFileEx (
-    PSTR FileName,
-    PSTR SymbolPath,
-    PSTR DebugFilePath,
-    PFIND_DEBUG_FILE_CALLBACK Callback,
-    PVOID CallerData
-    );
-
-typedef BOOL
-(CALLBACK *PFINDFILEINPATHCALLBACK)(
-    PSTR  filename,
-    PVOID context
-    );
-
-BOOL
-IMAGEAPI
-SymFindFileInPath(
-    HANDLE hprocess,
-    LPSTR  SearchPath,
-    LPSTR  FileName,
-    PVOID  id,
-    DWORD  two,
-    DWORD  three,
-    DWORD  flags,
-    LPSTR  FilePath,
-    PFINDFILEINPATHCALLBACK callback,
-    PVOID  context
-    );
-
-HANDLE
-IMAGEAPI
-FindExecutableImage(
-    PSTR FileName,
-    PSTR SymbolPath,
-    PSTR ImageFilePath
-    );
-
-typedef BOOL
-(CALLBACK *PFIND_EXE_FILE_CALLBACK)(
-    HANDLE FileHandle,
-    PSTR FileName,
-    PVOID CallerData
-    );
-
-HANDLE
-IMAGEAPI
-FindExecutableImageEx(
-    PSTR FileName,
-    PSTR SymbolPath,
-    PSTR ImageFilePath,
-    PFIND_EXE_FILE_CALLBACK Callback,
-    PVOID CallerData
-    );
-
-PIMAGE_NT_HEADERS
-IMAGEAPI
-ImageNtHeader (
-    IN PVOID Base
-    );
-
-PVOID
-IMAGEAPI
-ImageDirectoryEntryToDataEx (
-    IN PVOID Base,
-    IN BOOLEAN MappedAsImage,
-    IN USHORT DirectoryEntry,
-    OUT PUint32_t Size,
-    OUT PIMAGE_SECTION_HEADER *FoundHeader OPTIONAL
-    );
-
-PVOID
-IMAGEAPI
-ImageDirectoryEntryToData (
-    IN PVOID Base,
-    IN BOOLEAN MappedAsImage,
-    IN USHORT DirectoryEntry,
-    OUT PUint32_t Size
-    );
-
-PIMAGE_SECTION_HEADER
-IMAGEAPI
-ImageRvaToSection(
-    IN PIMAGE_NT_HEADERS NtHeaders,
-    IN PVOID Base,
-    IN Uint32_t Rva
-    );
-
-PVOID
-IMAGEAPI
-ImageRvaToVa(
-    IN PIMAGE_NT_HEADERS NtHeaders,
-    IN PVOID Base,
-    IN Uint32_t Rva,
-    IN OUT PIMAGE_SECTION_HEADER *LastRvaSection
-    );
-
-// Symbol server exports
-
-typedef BOOL (*PSYMBOLSERVERPROC)(LPCSTR, LPCSTR, PVOID, DWORD, DWORD, LPSTR);
-typedef BOOL (*PSYMBOLSERVEROPENPROC)(VOID);
-typedef BOOL (*PSYMBOLSERVERCLOSEPROC)(VOID);
-typedef BOOL (*PSYMBOLSERVERSETOPTIONSPROC)(UINT_PTR, ULONG64);
-typedef BOOL (CALLBACK *PSYMBOLSERVERCALLBACKPROC)(UINT_PTR action, ULONG64 data, ULONG64 context);
-typedef UINT_PTR (*PSYMBOLSERVERGETOPTIONSPROC)();
-
-#define SSRVOPT_CALLBACK    0x01
-#define SSRVOPT_DWORD       0x02
-#define SSRVOPT_DWORDPTR    0x04
-#define SSRVOPT_GUIDPTR     0x08
-#define SSRVOPT_OLDGUIDPTR  0x10
-#define SSRVOPT_UNATTENDED  0x20
-#define SSRVOPT_RESET    ((ULONG_PTR)-1)
-
-#define SSRVACTION_TRACE 1
-
-
-#ifndef _WIN64
-// This api won't be ported to Win64 - Fix your code.
-
-typedef struct _IMAGE_DEBUG_INFORMATION {
-    LIST_ENTRY List;
-    DWORD ReservedSize;
-    PVOID ReservedMappedBase;
-    USHORT ReservedMachine;
-    USHORT ReservedCharacteristics;
-    DWORD ReservedCheckSum;
-    DWORD ImageBase;
-    DWORD SizeOfImage;
-
-    DWORD ReservedNumberOfSections;
-    PIMAGE_SECTION_HEADER ReservedSections;
-
-    DWORD ReservedExportedNamesSize;
-    PSTR ReservedExportedNames;
-
-    DWORD ReservedNumberOfFunctionTableEntries;
-    PIMAGE_FUNCTION_ENTRY ReservedFunctionTableEntries;
-    DWORD ReservedLowestFunctionStartingAddress;
-    DWORD ReservedHighestFunctionEndingAddress;
-
-    DWORD ReservedNumberOfFpoTableEntries;
-    PFPO_DATA ReservedFpoTableEntries;
-
-    DWORD SizeOfCoffSymbols;
-    PIMAGE_COFF_SYMBOLS_HEADER CoffSymbols;
-
-    DWORD ReservedSizeOfCodeViewSymbols;
-    PVOID ReservedCodeViewSymbols;
-
-    PSTR ImageFilePath;
-    PSTR ImageFileName;
-    PSTR ReservedDebugFilePath;
-
-    DWORD ReservedTimeDateStamp;
-
-    BOOL  ReservedRomImage;
-    PIMAGE_DEBUG_DIRECTORY ReservedDebugDirectory;
-    DWORD ReservedNumberOfDebugDirectories;
-
-    DWORD ReservedOriginalFunctionTableBaseAddress;
-
-    DWORD Reserved[ 2 ];
-
-} IMAGE_DEBUG_INFORMATION, *PIMAGE_DEBUG_INFORMATION;
-
-
-PIMAGE_DEBUG_INFORMATION
-IMAGEAPI
-MapDebugInformation(
-    HANDLE FileHandle,
-    PSTR FileName,
-    PSTR SymbolPath,
-    DWORD ImageBase
-    );
-
-BOOL
-IMAGEAPI
-UnmapDebugInformation(
-    PIMAGE_DEBUG_INFORMATION DebugInfo
-    );
-
-#endif
-
-BOOL
-IMAGEAPI
-SearchTreeForFile(
-    PSTR RootPath,
-    PSTR InputPathName,
-    PSTR OutputPathBuffer
-    );
-
-BOOL
-IMAGEAPI
-MakeSureDirectoryPathExists(
-    PCSTR DirPath
-    );
-
-//
-// UnDecorateSymbolName Flags
-//
-
-#define UNDNAME_COMPLETE                 (0x0000)  // Enable full undecoration
-#define UNDNAME_NO_LEADING_UNDERSCORES   (0x0001)  // Remove leading underscores from MS extended keywords
-#define UNDNAME_NO_MS_KEYWORDS           (0x0002)  // Disable expansion of MS extended keywords
-#define UNDNAME_NO_FUNCTION_RETURNS      (0x0004)  // Disable expansion of return type for primary declaration
-#define UNDNAME_NO_ALLOCATION_MODEL      (0x0008)  // Disable expansion of the declaration model
-#define UNDNAME_NO_ALLOCATION_LANGUAGE   (0x0010)  // Disable expansion of the declaration language specifier
-#define UNDNAME_NO_MS_THISTYPE           (0x0020)  // NYI Disable expansion of MS keywords on the 'this' type for primary declaration
-#define UNDNAME_NO_CV_THISTYPE           (0x0040)  // NYI Disable expansion of CV modifiers on the 'this' type for primary declaration
-#define UNDNAME_NO_THISTYPE              (0x0060)  // Disable all modifiers on the 'this' type
-#define UNDNAME_NO_ACCESS_SPECIFIERS     (0x0080)  // Disable expansion of access specifiers for members
-#define UNDNAME_NO_THROW_SIGNATURES      (0x0100)  // Disable expansion of 'throw-signatures' for functions and pointers to functions
-#define UNDNAME_NO_MEMBER_TYPE           (0x0200)  // Disable expansion of 'static' or 'virtual'ness of members
-#define UNDNAME_NO_RETURN_UDT_MODEL      (0x0400)  // Disable expansion of MS model for UDT returns
-#define UNDNAME_32_BIT_DECODE            (0x0800)  // Undecorate 32-bit decorated names
-#define UNDNAME_NAME_ONLY                (0x1000)  // Crack only the name for primary declaration;
-                                                                                                   //  return just [scope::]name.  Does expand template params
-#define UNDNAME_NO_ARGUMENTS             (0x2000)  // Don't undecorate arguments to function
-#define UNDNAME_NO_SPECIAL_SYMS          (0x4000)  // Don't undecorate special names (v-table, vcall, vector xxx, metatype, etc)
-
-DWORD
-IMAGEAPI
-WINAPI
-UnDecorateSymbolName(
-    PCSTR   DecoratedName,         // Name to undecorate
-    PSTR    UnDecoratedName,       // If NULL, it will be allocated
-    DWORD    UndecoratedLength,     // The maximym length
-    DWORD    Flags                  // See above.
-    );
-
-
-//
-// these values are used for synthesized file types
-// that can be passed in as image headers instead of
-// the standard ones from ntimage.h
-//
-
-#define DBHHEADER_DEBUGDIRS     0x1
-
-typedef struct _DBGHELP_MODLOAD_DATA {
-    DWORD   ssize;                  // size of this struct
-    DWORD   ssig;                   // signature identifying the passed data
-    PVOID   data;                   // pointer to passed data
-    DWORD   size;                   // size of passed data
-    DWORD   flags;                  // options
-} MODLOAD_DATA, *PMODLOAD_DATA;
-
-//
-// StackWalking API
-//
-
-typedef enum {
-    AddrMode1616,
-    AddrMode1632,
-    AddrModeReal,
-    AddrModeFlat
-} ADDRESS_MODE;
-
-typedef struct _tagADDRESS64 {
-    DWORD64       Offset;
-    WORD          Segment;
-    ADDRESS_MODE  Mode;
-} ADDRESS64, *LPADDRESS64;
-
-#if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
-#define ADDRESS ADDRESS64
-#define LPADDRESS LPADDRESS64
-#else
-typedef struct _tagADDRESS {
-    DWORD         Offset;
-    WORD          Segment;
-    ADDRESS_MODE  Mode;
-} ADDRESS, *LPADDRESS;
-
-__inline
-void
-Address32To64(
-    LPADDRESS a32,
-    LPADDRESS64 a64
-    )
-{
-    a64->Offset = (ULONG64)(LONG64)(int32_t)a32->Offset;
-    a64->Segment = a32->Segment;
-    a64->Mode = a32->Mode;
-}
-
-__inline
-void
-Address64To32(
-    LPADDRESS64 a64,
-    LPADDRESS a32
-    )
-{
-    a32->Offset = (ULONG)a64->Offset;
-    a32->Segment = a64->Segment;
-    a32->Mode = a64->Mode;
-}
-#endif
-
-//
-// This structure is included in the STACKFRAME structure,
-// and is used to trace through usermode callbacks in a thread's
-// kernel stack.  The values must be copied by the kernel debugger
-// from the DBGKD_GET_VERSION and WAIT_STATE_CHANGE packets.
-//
-
-//
-// New KDHELP structure for 64 bit system support.
-// This structure is preferred in new code.
-//
-typedef struct _KDHELP64 {
-
-    //
-    // address of kernel thread object, as provided in the
-    // WAIT_STATE_CHANGE packet.
-    //
-    DWORD64   Thread;
-
-    //
-    // offset in thread object to pointer to the current callback frame
-    // in kernel stack.
-    //
-    DWORD   ThCallbackStack;
-
-    //
-    // offset in thread object to pointer to the current callback backing
-    // store frame in kernel stack.
-    //
-    DWORD   ThCallbackBStore;
-
-    //
-    // offsets to values in frame:
-    //
-    // address of next callback frame
-    DWORD   NextCallback;
-
-    // address of saved frame pointer (if applicable)
-    DWORD   FramePointer;
-
-
-    //
-    // Address of the kernel function that calls out to user mode
-    //
-    DWORD64   KiCallUserMode;
-
-    //
-    // Address of the user mode dispatcher function
-    //
-    DWORD64   KeUserCallbackDispatcher;
-
-    //
-    // Lowest kernel mode address
-    //
-    DWORD64   SystemRangeStart;
-
-    DWORD64  Reserved[8];
-
-} KDHELP64, *PKDHELP64;
-
-#if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
-#define KDHELP KDHELP64
-#define PKDHELP PKDHELP64
-#else
-typedef struct _KDHELP {
-
-    //
-    // address of kernel thread object, as provided in the
-    // WAIT_STATE_CHANGE packet.
-    //
-    DWORD   Thread;
-
-    //
-    // offset in thread object to pointer to the current callback frame
-    // in kernel stack.
-    //
-    DWORD   ThCallbackStack;
-
-    //
-    // offsets to values in frame:
-    //
-    // address of next callback frame
-    DWORD   NextCallback;
-
-    // address of saved frame pointer (if applicable)
-    DWORD   FramePointer;
-
-    //
-    // Address of the kernel function that calls out to user mode
-    //
-    DWORD   KiCallUserMode;
-
-    //
-    // Address of the user mode dispatcher function
-    //
-    DWORD   KeUserCallbackDispatcher;
-
-    //
-    // Lowest kernel mode address
-    //
-    DWORD   SystemRangeStart;
-
-    //
-    // offset in thread object to pointer to the current callback backing
-    // store frame in kernel stack.
-    //
-    DWORD   ThCallbackBStore;
-
-    DWORD  Reserved[8];
-
-} KDHELP, *PKDHELP;
-
-__inline
-void
-KdHelp32To64(
-    PKDHELP p32,
-    PKDHELP64 p64
-    )
-{
-    p64->Thread = p32->Thread;
-    p64->ThCallbackStack = p32->ThCallbackStack;
-    p64->NextCallback = p32->NextCallback;
-    p64->FramePointer = p32->FramePointer;
-    p64->KiCallUserMode = p32->KiCallUserMode;
-    p64->KeUserCallbackDispatcher = p32->KeUserCallbackDispatcher;
-    p64->SystemRangeStart = p32->SystemRangeStart;
-}
-#endif
-
-typedef struct _tagSTACKFRAME64 {
-    ADDRESS64   AddrPC;               // program counter
-    ADDRESS64   AddrReturn;           // return address
-    ADDRESS64   AddrFrame;            // frame pointer
-    ADDRESS64   AddrStack;            // stack pointer
-    ADDRESS64   AddrBStore;           // backing store pointer
-    PVOID       FuncTableEntry;       // pointer to pdata/fpo or NULL
-    DWORD64     Params[4];            // possible arguments to the function
-    BOOL        Far;                  // WOW far call
-    BOOL        Virtual;              // is this a virtual frame?
-    DWORD64     Reserved[3];
-    KDHELP64    KdHelp;
-} STACKFRAME64, *LPSTACKFRAME64;
-
-#if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
-#define STACKFRAME STACKFRAME64
-#define LPSTACKFRAME LPSTACKFRAME64
-#else
-typedef struct _tagSTACKFRAME {
-    ADDRESS     AddrPC;               // program counter
-    ADDRESS     AddrReturn;           // return address
-    ADDRESS     AddrFrame;            // frame pointer
-    ADDRESS     AddrStack;            // stack pointer
-    PVOID       FuncTableEntry;       // pointer to pdata/fpo or NULL
-    DWORD       Params[4];            // possible arguments to the function
-    BOOL        Far;                  // WOW far call
-    BOOL        Virtual;              // is this a virtual frame?
-    DWORD       Reserved[3];
-    KDHELP      KdHelp;
-    ADDRESS     AddrBStore;           // backing store pointer
-} STACKFRAME, *LPSTACKFRAME;
-#endif
-
-
-typedef
-BOOL
-(__stdcall *PREAD_PROCESS_MEMORY_ROUTINE64)(
-    HANDLE      hProcess,
-    DWORD64     qwBaseAddress,
-    PVOID       lpBuffer,
-    DWORD       nSize,
-    LPDWORD     lpNumberOfBytesRead
-    );
-
-typedef
-PVOID
-(__stdcall *PFUNCTION_TABLE_ACCESS_ROUTINE64)(
-    HANDLE  hProcess,
-    DWORD64 AddrBase
-    );
-
-typedef
-DWORD64
-(__stdcall *PGET_MODULE_BASE_ROUTINE64)(
-    HANDLE  hProcess,
-    DWORD64 Address
-    );
-
-typedef
-DWORD64
-(__stdcall *PTRANSLATE_ADDRESS_ROUTINE64)(
-    HANDLE    hProcess,
-    HANDLE    hThread,
-    LPADDRESS64 lpaddr
-    );
-
-BOOL
-IMAGEAPI
-StackWalk64(
-    DWORD                             MachineType,
-    HANDLE                            hProcess,
-    HANDLE                            hThread,
-    LPSTACKFRAME64                    StackFrame,
-    PVOID                             ContextRecord,
-    PREAD_PROCESS_MEMORY_ROUTINE64    ReadMemoryRoutine,
-    PFUNCTION_TABLE_ACCESS_ROUTINE64  FunctionTableAccessRoutine,
-    PGET_MODULE_BASE_ROUTINE64        GetModuleBaseRoutine,
-    PTRANSLATE_ADDRESS_ROUTINE64      TranslateAddress
-    );
-
-#if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
-
-#define PREAD_PROCESS_MEMORY_ROUTINE PREAD_PROCESS_MEMORY_ROUTINE64
-#define PFUNCTION_TABLE_ACCESS_ROUTINE PFUNCTION_TABLE_ACCESS_ROUTINE64
-#define PGET_MODULE_BASE_ROUTINE PGET_MODULE_BASE_ROUTINE64
-#define PTRANSLATE_ADDRESS_ROUTINE PTRANSLATE_ADDRESS_ROUTINE64
-
-#define StackWalk StackWalk64
-
-#else
-
-typedef
-BOOL
-(__stdcall *PREAD_PROCESS_MEMORY_ROUTINE)(
-    HANDLE  hProcess,
-    DWORD   lpBaseAddress,
-    PVOID   lpBuffer,
-    DWORD   nSize,
-    PDWORD  lpNumberOfBytesRead
-    );
-
-typedef
-PVOID
-(__stdcall *PFUNCTION_TABLE_ACCESS_ROUTINE)(
-    HANDLE  hProcess,
-    DWORD   AddrBase
-    );
-
-typedef
-DWORD
-(__stdcall *PGET_MODULE_BASE_ROUTINE)(
-    HANDLE  hProcess,
-    DWORD   Address
-    );
-
-typedef
-DWORD
-(__stdcall *PTRANSLATE_ADDRESS_ROUTINE)(
-    HANDLE    hProcess,
-    HANDLE    hThread,
-    LPADDRESS lpaddr
-    );
-
-BOOL
-IMAGEAPI
-StackWalk(
-    DWORD                             MachineType,
-    HANDLE                            hProcess,
-    HANDLE                            hThread,
-    LPSTACKFRAME                      StackFrame,
-    PVOID                             ContextRecord,
-    PREAD_PROCESS_MEMORY_ROUTINE      ReadMemoryRoutine,
-    PFUNCTION_TABLE_ACCESS_ROUTINE    FunctionTableAccessRoutine,
-    PGET_MODULE_BASE_ROUTINE          GetModuleBaseRoutine,
-    PTRANSLATE_ADDRESS_ROUTINE        TranslateAddress
-    );
-
-#endif
-
-
-#define API_VERSION_NUMBER 9
-
-typedef struct API_VERSION {
-    USHORT  MajorVersion;
-    USHORT  MinorVersion;
-    USHORT  Revision;
-    USHORT  Reserved;
-} API_VERSION, *LPAPI_VERSION;
-
-LPAPI_VERSION
-IMAGEAPI
-ImagehlpApiVersion(
-    VOID
-    );
-
-LPAPI_VERSION
-IMAGEAPI
-ImagehlpApiVersionEx(
-    LPAPI_VERSION AppVersion
-    );
-
-DWORD
-IMAGEAPI
-GetTimestampForLoadedLibrary(
-    HMODULE Module
-    );
-
-//
-// typedefs for function pointers
-//
-typedef BOOL
-(CALLBACK *PSYM_ENUMMODULES_CALLBACK64)(
-    PSTR ModuleName,
-    DWORD64 BaseOfDll,
-    PVOID UserContext
-    );
-
-typedef BOOL
-(CALLBACK *PSYM_ENUMSYMBOLS_CALLBACK64)(
-    PSTR SymbolName,
-    DWORD64 SymbolAddress,
-    Uint32_t SymbolSize,
-    PVOID UserContext
-    );
-
-typedef BOOL
-(CALLBACK *PSYM_ENUMSYMBOLS_CALLBACK64W)(
-    PWSTR SymbolName,
-    DWORD64 SymbolAddress,
-    Uint32_t SymbolSize,
-    PVOID UserContext
-    );
-
-typedef BOOL
-(CALLBACK *PENUMLOADED_MODULES_CALLBACK64)(
-    PSTR ModuleName,
-    DWORD64 ModuleBase,
-    Uint32_t ModuleSize,
-    PVOID UserContext
-    );
-
-typedef BOOL
-(CALLBACK *PSYMBOL_REGISTERED_CALLBACK64)(
-    HANDLE  hProcess,
-    Uint32_t   ActionCode,
-    ULONG64 CallbackData,
-    ULONG64 UserContext
-    );
-
-typedef
-PVOID
-(CALLBACK *PSYMBOL_FUNCENTRY_CALLBACK)(
-    HANDLE  hProcess,
-    DWORD   AddrBase,
-    PVOID   UserContext
-    );
-
-typedef
-PVOID
-(CALLBACK *PSYMBOL_FUNCENTRY_CALLBACK64)(
-    HANDLE  hProcess,
-    ULONG64 AddrBase,
-    ULONG64 UserContext
-    );
-
-#if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
-
-#define PSYM_ENUMMODULES_CALLBACK PSYM_ENUMMODULES_CALLBACK64
-#define PSYM_ENUMSYMBOLS_CALLBACK PSYM_ENUMSYMBOLS_CALLBACK64
-#define PSYM_ENUMSYMBOLS_CALLBACKW PSYM_ENUMSYMBOLS_CALLBACK64W
-#define PENUMLOADED_MODULES_CALLBACK PENUMLOADED_MODULES_CALLBACK64
-#define PSYMBOL_REGISTERED_CALLBACK PSYMBOL_REGISTERED_CALLBACK64
-#define PSYMBOL_FUNCENTRY_CALLBACK PSYMBOL_FUNCENTRY_CALLBACK64
-
-#else
-
-typedef BOOL
-(CALLBACK *PSYM_ENUMMODULES_CALLBACK)(
-    PSTR  ModuleName,
-    Uint32_t BaseOfDll,
-    PVOID UserContext
-    );
-
-typedef BOOL
-(CALLBACK *PSYM_ENUMSYMBOLS_CALLBACK)(
-    PSTR  SymbolName,
-    Uint32_t SymbolAddress,
-    Uint32_t SymbolSize,
-    PVOID UserContext
-    );
-
-typedef BOOL
-(CALLBACK *PSYM_ENUMSYMBOLS_CALLBACKW)(
-    PWSTR  SymbolName,
-    Uint32_t SymbolAddress,
-    Uint32_t SymbolSize,
-    PVOID UserContext
-    );
-
-typedef BOOL
-(CALLBACK *PENUMLOADED_MODULES_CALLBACK)(
-    PSTR  ModuleName,
-    Uint32_t ModuleBase,
-    Uint32_t ModuleSize,
-    PVOID UserContext
-    );
-
-typedef BOOL
-(CALLBACK *PSYMBOL_REGISTERED_CALLBACK)(
-    HANDLE  hProcess,
-    Uint32_t   ActionCode,
-    PVOID   CallbackData,
-    PVOID   UserContext
-    );
-
-#endif
-
-
-//
-// symbol flags
-//
-
-#define SYMF_OMAP_GENERATED   0x00000001
-#define SYMF_OMAP_MODIFIED    0x00000002
-#ifndef _DBGHELP_USER_GENERATED_SYMBOLS_NOTSUPPORTED
- #define SYMF_USER_GENERATED   0x00000004
-#endif // !_DBGHELP_USER_GENERATED_SYMBOLS_NOTSUPPORTED
-#define SYMF_REGISTER         0x00000008
-#define SYMF_REGREL           0x00000010
-#define SYMF_FRAMEREL         0x00000020
-#define SYMF_PARAMETER        0x00000040
-#define SYMF_LOCAL            0x00000080
-#define SYMF_CONSTANT         0x00000100
-#define SYMF_EXPORT           0x00000200
-#define SYMF_FORWARDER        0x00000400
-#define SYMF_FUNCTION         0x00000800
-//
-// symbol type enumeration
-//
-typedef enum {
-    SymNone = 0,
-    SymCoff,
-    SymCv,
-    SymPdb,
-    SymExport,
-    SymDeferred,
-    SymSym,       // .sym file
-    SymDia,
-    NumSymTypes
-} SYM_TYPE;
-
-//
-// symbol data structure
-//
-
-typedef struct _IMAGEHLP_SYMBOL64 {
-    DWORD                       SizeOfStruct;           // set to sizeof(IMAGEHLP_SYMBOL64)
-    DWORD64                     Address;                // virtual address including dll base address
-    DWORD                       Size;                   // estimated size of symbol, can be zero
-    DWORD                       Flags;                  // info about the symbols, see the SYMF defines
-    DWORD                       MaxNameLength;          // maximum size of symbol name in 'Name'
-    CHAR                        Name[1];                // symbol name (null terminated string)
-} IMAGEHLP_SYMBOL64, *PIMAGEHLP_SYMBOL64;
-
-#if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
-#define IMAGEHLP_SYMBOL IMAGEHLP_SYMBOL64
-#define PIMAGEHLP_SYMBOL PIMAGEHLP_SYMBOL64
-#else
-typedef struct _IMAGEHLP_SYMBOL {
-    DWORD                       SizeOfStruct;           // set to sizeof(IMAGEHLP_SYMBOL)
-    DWORD                       Address;                // virtual address including dll base address
-    DWORD                       Size;                   // estimated size of symbol, can be zero
-    DWORD                       Flags;                  // info about the symbols, see the SYMF defines
-    DWORD                       MaxNameLength;          // maximum size of symbol name in 'Name'
-    CHAR                        Name[1];                // symbol name (null terminated string)
-} IMAGEHLP_SYMBOL, *PIMAGEHLP_SYMBOL;
-#endif
-
-//
-// module data structure
-//
-
-typedef struct _IMAGEHLP_MODULE64 {
-    DWORD                       SizeOfStruct;           // set to sizeof(IMAGEHLP_MODULE64)
-    DWORD64                     BaseOfImage;            // base load address of module
-    DWORD                       ImageSize;              // virtual size of the loaded module
-    DWORD                       TimeDateStamp;          // date/time stamp from pe header
-    DWORD                       CheckSum;               // checksum from the pe header
-    DWORD                       NumSyms;                // number of symbols in the symbol table
-    SYM_TYPE                    SymType;                // type of symbols loaded
-    CHAR                        ModuleName[32];         // module name
-    CHAR                        ImageName[256];         // image name
-    CHAR                        LoadedImageName[256];   // symbol file name
-} IMAGEHLP_MODULE64, *PIMAGEHLP_MODULE64;
-
-typedef struct _IMAGEHLP_MODULE64W {
-    DWORD                       SizeOfStruct;           // set to sizeof(IMAGEHLP_MODULE64)
-    DWORD64                     BaseOfImage;            // base load address of module
-    DWORD                       ImageSize;              // virtual size of the loaded module
-    DWORD                       TimeDateStamp;          // date/time stamp from pe header
-    DWORD                       CheckSum;               // checksum from the pe header
-    DWORD                       NumSyms;                // number of symbols in the symbol table
-    SYM_TYPE                    SymType;                // type of symbols loaded
-    WCHAR                       ModuleName[32];         // module name
-    WCHAR                       ImageName[256];         // image name
-    WCHAR                       LoadedImageName[256];   // symbol file name
-} IMAGEHLP_MODULEW64, *PIMAGEHLP_MODULEW64;
-
-#if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
-#define IMAGEHLP_MODULE IMAGEHLP_MODULE64
-#define PIMAGEHLP_MODULE PIMAGEHLP_MODULE64
-#define IMAGEHLP_MODULEW IMAGEHLP_MODULEW64
-#define PIMAGEHLP_MODULEW PIMAGEHLP_MODULEW64
-#else
-typedef struct _IMAGEHLP_MODULE {
-    DWORD                       SizeOfStruct;           // set to sizeof(IMAGEHLP_MODULE)
-    DWORD                       BaseOfImage;            // base load address of module
-    DWORD                       ImageSize;              // virtual size of the loaded module
-    DWORD                       TimeDateStamp;          // date/time stamp from pe header
-    DWORD                       CheckSum;               // checksum from the pe header
-    DWORD                       NumSyms;                // number of symbols in the symbol table
-    SYM_TYPE                    SymType;                // type of symbols loaded
-    CHAR                        ModuleName[32];         // module name
-    CHAR                        ImageName[256];         // image name
-    CHAR                        LoadedImageName[256];   // symbol file name
-} IMAGEHLP_MODULE, *PIMAGEHLP_MODULE;
-
-typedef struct _IMAGEHLP_MODULEW {
-    DWORD                       SizeOfStruct;           // set to sizeof(IMAGEHLP_MODULE)
-    DWORD                       BaseOfImage;            // base load address of module
-    DWORD                       ImageSize;              // virtual size of the loaded module
-    DWORD                       TimeDateStamp;          // date/time stamp from pe header
-    DWORD                       CheckSum;               // checksum from the pe header
-    DWORD                       NumSyms;                // number of symbols in the symbol table
-    SYM_TYPE                    SymType;                // type of symbols loaded
-    WCHAR                       ModuleName[32];         // module name
-    WCHAR                       ImageName[256];         // image name
-    WCHAR                       LoadedImageName[256];   // symbol file name
-} IMAGEHLP_MODULEW, *PIMAGEHLP_MODULEW;
-#endif
-
-//
-// source file line data structure
-//
-
-typedef struct _IMAGEHLP_LINE64 {
-    DWORD                       SizeOfStruct;           // set to sizeof(IMAGEHLP_LINE64)
-    PVOID                       Key;                    // internal
-    DWORD                       LineNumber;             // line number in file
-    PCHAR                       FileName;               // full filename
-    DWORD64                     Address;                // first instruction of line
-} IMAGEHLP_LINE64, *PIMAGEHLP_LINE64;
-
-#if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
-#define IMAGEHLP_LINE IMAGEHLP_LINE64
-#define PIMAGEHLP_LINE PIMAGEHLP_LINE64
-#else
-typedef struct _IMAGEHLP_LINE {
-    DWORD                       SizeOfStruct;           // set to sizeof(IMAGEHLP_LINE)
-    PVOID                       Key;                    // internal
-    DWORD                       LineNumber;             // line number in file
-    PCHAR                       FileName;               // full filename
-    DWORD                       Address;                // first instruction of line
-} IMAGEHLP_LINE, *PIMAGEHLP_LINE;
-#endif
-
-//
-// source file structure
-//
-
-typedef struct _SOURCEFILE {
-    DWORD64                     ModBase;                // base address of loaded module
-    PCHAR                       FileName;               // full filename of source
-} SOURCEFILE, *PSOURCEFILE;
-
-//
-// data structures used for registered symbol callbacks
-//
-
-#define CBA_DEFERRED_SYMBOL_LOAD_START          0x00000001
-#define CBA_DEFERRED_SYMBOL_LOAD_COMPLETE       0x00000002
-#define CBA_DEFERRED_SYMBOL_LOAD_FAILURE        0x00000003
-#define CBA_SYMBOLS_UNLOADED                    0x00000004
-#define CBA_DUPLICATE_SYMBOL                    0x00000005
-#define CBA_READ_MEMORY                         0x00000006
-#define CBA_DEFERRED_SYMBOL_LOAD_CANCEL         0x00000007
-#define CBA_SET_OPTIONS                         0x00000008
-#define CBA_EVENT                               0x00000010
-#define CBA_DEBUG_INFO                          0x10000000
-
-typedef struct _IMAGEHLP_CBA_READ_MEMORY {
-    DWORD64   addr;                                     // address to read from
-    PVOID     buf;                                      // buffer to read to
-    DWORD     bytes;                                    // amount of bytes to read
-    DWORD    *bytesread;                                // pointer to store amount of bytes read
-} IMAGEHLP_CBA_READ_MEMORY, *PIMAGEHLP_CBA_READ_MEMORY;
-
-enum {
-    sevInfo = 0,
-    sevProblem,
-    sevAttn,
-    sevFatal,
-    sevMax  // unused
-};
-
-typedef struct _IMAGEHLP_CBA_EVENT {
-    DWORD severity;                                     // values from sevInfo to sevFatal
-    DWORD code;                                         // numerical code IDs the error
-    PCHAR desc;                                         // may contain a text description of the error
-    PVOID object;                                       // value dependant upon the error code
-} IMAGEHLP_CBA_EVENT, *PIMAGEHLP_CBA_EVENT;
-
-typedef struct _IMAGEHLP_DEFERRED_SYMBOL_LOAD64 {
-    DWORD                       SizeOfStruct;           // set to sizeof(IMAGEHLP_DEFERRED_SYMBOL_LOAD64)
-    DWORD64                     BaseOfImage;            // base load address of module
-    DWORD                       CheckSum;               // checksum from the pe header
-    DWORD                       TimeDateStamp;          // date/time stamp from pe header
-    CHAR                        FileName[MAX_PATH];     // symbols file or image name
-    BOOLEAN                     Reparse;                // load failure reparse
-} IMAGEHLP_DEFERRED_SYMBOL_LOAD64, *PIMAGEHLP_DEFERRED_SYMBOL_LOAD64;
-
-#if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
-#define IMAGEHLP_DEFERRED_SYMBOL_LOAD IMAGEHLP_DEFERRED_SYMBOL_LOAD64
-#define PIMAGEHLP_DEFERRED_SYMBOL_LOAD PIMAGEHLP_DEFERRED_SYMBOL_LOAD64
-#else
-typedef struct _IMAGEHLP_DEFERRED_SYMBOL_LOAD {
-    DWORD                       SizeOfStruct;           // set to sizeof(IMAGEHLP_DEFERRED_SYMBOL_LOAD)
-    DWORD                       BaseOfImage;            // base load address of module
-    DWORD                       CheckSum;               // checksum from the pe header
-    DWORD                       TimeDateStamp;          // date/time stamp from pe header
-    CHAR                        FileName[MAX_PATH];     // symbols file or image name
-    BOOLEAN                     Reparse;                // load failure reparse
-} IMAGEHLP_DEFERRED_SYMBOL_LOAD, *PIMAGEHLP_DEFERRED_SYMBOL_LOAD;
-#endif
-
-typedef struct _IMAGEHLP_DUPLICATE_SYMBOL64 {
-    DWORD                       SizeOfStruct;           // set to sizeof(IMAGEHLP_DUPLICATE_SYMBOL64)
-    DWORD                       NumberOfDups;           // number of duplicates in the Symbol array
-    PIMAGEHLP_SYMBOL64          Symbol;                 // array of duplicate symbols
-    DWORD                       SelectedSymbol;         // symbol selected (-1 to start)
-} IMAGEHLP_DUPLICATE_SYMBOL64, *PIMAGEHLP_DUPLICATE_SYMBOL64;
-
-#if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
-#define IMAGEHLP_DUPLICATE_SYMBOL IMAGEHLP_DUPLICATE_SYMBOL64
-#define PIMAGEHLP_DUPLICATE_SYMBOL PIMAGEHLP_DUPLICATE_SYMBOL64
-#else
-typedef struct _IMAGEHLP_DUPLICATE_SYMBOL {
-    DWORD                       SizeOfStruct;           // set to sizeof(IMAGEHLP_DUPLICATE_SYMBOL)
-    DWORD                       NumberOfDups;           // number of duplicates in the Symbol array
-    PIMAGEHLP_SYMBOL            Symbol;                 // array of duplicate symbols
-    DWORD                       SelectedSymbol;         // symbol selected (-1 to start)
-} IMAGEHLP_DUPLICATE_SYMBOL, *PIMAGEHLP_DUPLICATE_SYMBOL;
-#endif
-
-
-//
-// options that are set/returned by SymSetOptions() & SymGetOptions()
-// these are used as a mask
-//
-#define SYMOPT_CASE_INSENSITIVE         0x00000001
-#define SYMOPT_UNDNAME                  0x00000002
-#define SYMOPT_DEFERRED_LOADS           0x00000004
-#define SYMOPT_NO_CPP                   0x00000008
-#define SYMOPT_LOAD_LINES               0x00000010
-#define SYMOPT_OMAP_FIND_NEAREST        0x00000020
-#define SYMOPT_LOAD_ANYTHING            0x00000040
-#define SYMOPT_IGNORE_CVREC             0x00000080
-#define SYMOPT_NO_UNQUALIFIED_LOADS     0x00000100
-#define SYMOPT_FAIL_CRITICAL_ERRORS     0x00000200
-#define SYMOPT_EXACT_SYMBOLS            0x00000400
-#define SYMOPT_WILD_UNDERSCORE          0x00000800
-#define SYMOPT_USE_DEFAULTS             0x00001000
-#define SYMOPT_INCLUDE_32BIT_MODULES    0x00002000
-
-#define SYMOPT_DEBUG                    0x80000000
-
-DWORD
-IMAGEAPI
-SymSetOptions(
-    IN DWORD   SymOptions
-    );
-
-DWORD
-IMAGEAPI
-SymGetOptions(
-    VOID
-    );
-
-BOOL
-IMAGEAPI
-SymCleanup(
-    IN HANDLE hProcess
-    );
-
-BOOL
-IMAGEAPI
-SymMatchString(
-    IN LPSTR string,
-    IN LPSTR expression,
-    IN BOOL  fCase
-    );
-
-typedef BOOL
-(CALLBACK *PSYM_ENUMSOURCFILES_CALLBACK)(
-    PSOURCEFILE pSourceFile,
-    PVOID       UserContext
-    );
-
-BOOL
-IMAGEAPI
-SymEnumSourceFiles(
-    IN HANDLE  hProcess,
-    IN ULONG64 ModBase,
-    IN LPSTR   Mask,
-    IN PSYM_ENUMSOURCFILES_CALLBACK cbSrcFiles,
-    IN PVOID   UserContext
-    );
-
-BOOL
-IMAGEAPI
-SymEnumerateModules64(
-    IN HANDLE                       hProcess,
-    IN PSYM_ENUMMODULES_CALLBACK64  EnumModulesCallback,
-    IN PVOID                        UserContext
-    );
-
-#if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
-#define SymEnumerateModules SymEnumerateModules64
-#else
-BOOL
-IMAGEAPI
-SymEnumerateModules(
-    IN HANDLE                     hProcess,
-    IN PSYM_ENUMMODULES_CALLBACK  EnumModulesCallback,
-    IN PVOID                      UserContext
-    );
-#endif
-
-BOOL
-IMAGEAPI
-SymEnumerateSymbols64(
-    IN HANDLE                       hProcess,
-    IN DWORD64                      BaseOfDll,
-    IN PSYM_ENUMSYMBOLS_CALLBACK64  EnumSymbolsCallback,
-    IN PVOID                        UserContext
-    );
-
-BOOL
-IMAGEAPI
-SymEnumerateSymbolsW64(
-    IN HANDLE                       hProcess,
-    IN DWORD64                      BaseOfDll,
-    IN PSYM_ENUMSYMBOLS_CALLBACK64W EnumSymbolsCallback,
-    IN PVOID                        UserContext
-    );
-
-#if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
-#define SymEnumerateSymbols SymEnumerateSymbols64
-#define SymEnumerateSymbolsW SymEnumerateSymbolsW64
-#else
-BOOL
-IMAGEAPI
-SymEnumerateSymbols(
-    IN HANDLE                     hProcess,
-    IN DWORD                      BaseOfDll,
-    IN PSYM_ENUMSYMBOLS_CALLBACK  EnumSymbolsCallback,
-    IN PVOID                      UserContext
-    );
-
-BOOL
-IMAGEAPI
-SymEnumerateSymbolsW(
-    IN HANDLE                       hProcess,
-    IN DWORD                        BaseOfDll,
-    IN PSYM_ENUMSYMBOLS_CALLBACKW   EnumSymbolsCallback,
-    IN PVOID                        UserContext
-    );
-#endif
-
-BOOL
-IMAGEAPI
-EnumerateLoadedModules64(
-    IN HANDLE                           hProcess,
-    IN PENUMLOADED_MODULES_CALLBACK64   EnumLoadedModulesCallback,
-    IN PVOID                            UserContext
-    );
-
-#if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
-#define EnumerateLoadedModules EnumerateLoadedModules64
-#else
-BOOL
-IMAGEAPI
-EnumerateLoadedModules(
-    IN HANDLE                         hProcess,
-    IN PENUMLOADED_MODULES_CALLBACK   EnumLoadedModulesCallback,
-    IN PVOID                          UserContext
-    );
-#endif
-
-PVOID
-IMAGEAPI
-SymFunctionTableAccess64(
-    HANDLE  hProcess,
-    DWORD64 AddrBase
-    );
-
-#if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
-#define SymFunctionTableAccess SymFunctionTableAccess64
-#else
-PVOID
-IMAGEAPI
-SymFunctionTableAccess(
-    HANDLE  hProcess,
-    DWORD   AddrBase
-    );
-#endif
-
-BOOL
-IMAGEAPI
-SymGetModuleInfo64(
-    IN  HANDLE                  hProcess,
-    IN  DWORD64                 qwAddr,
-    OUT PIMAGEHLP_MODULE64      ModuleInfo
-    );
-
-BOOL
-IMAGEAPI
-SymGetModuleInfoW64(
-    IN  HANDLE                  hProcess,
-    IN  DWORD64                 qwAddr,
-    OUT PIMAGEHLP_MODULEW64     ModuleInfo
-    );
-
-#if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
-#define SymGetModuleInfo   SymGetModuleInfo64
-#define SymGetModuleInfoW  SymGetModuleInfoW64
-#else
-BOOL
-IMAGEAPI
-SymGetModuleInfo(
-    IN  HANDLE              hProcess,
-    IN  DWORD               dwAddr,
-    OUT PIMAGEHLP_MODULE  ModuleInfo
-    );
-
-BOOL
-IMAGEAPI
-SymGetModuleInfoW(
-    IN  HANDLE              hProcess,
-    IN  DWORD               dwAddr,
-    OUT PIMAGEHLP_MODULEW  ModuleInfo
-    );
-#endif
-
-DWORD64
-IMAGEAPI
-SymGetModuleBase64(
-    IN  HANDLE              hProcess,
-    IN  DWORD64             qwAddr
-    );
-
-#if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
-#define SymGetModuleBase SymGetModuleBase64
-#else
-DWORD
-IMAGEAPI
-SymGetModuleBase(
-    IN  HANDLE              hProcess,
-    IN  DWORD               dwAddr
-    );
-#endif
-
-BOOL
-IMAGEAPI
-SymGetSymNext64(
-    IN     HANDLE              hProcess,
-    IN OUT PIMAGEHLP_SYMBOL64  Symbol
-    );
-
-#if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
-#define SymGetSymNext SymGetSymNext64
-#else
-BOOL
-IMAGEAPI
-SymGetSymNext(
-    IN     HANDLE            hProcess,
-    IN OUT PIMAGEHLP_SYMBOL  Symbol
-    );
-#endif
-
-BOOL
-IMAGEAPI
-SymGetSymPrev64(
-    IN     HANDLE              hProcess,
-    IN OUT PIMAGEHLP_SYMBOL64  Symbol
-    );
-
-#if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
-#define SymGetSymPrev SymGetSymPrev64
-#else
-BOOL
-IMAGEAPI
-SymGetSymPrev(
-    IN     HANDLE            hProcess,
-    IN OUT PIMAGEHLP_SYMBOL  Symbol
-    );
-#endif
-
-BOOL
-IMAGEAPI
-SymGetLineFromAddr64(
-    IN  HANDLE                  hProcess,
-    IN  DWORD64                 qwAddr,
-    OUT PDWORD                  pdwDisplacement,
-    OUT PIMAGEHLP_LINE64        Line
-    );
-
-#if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
-#define SymGetLineFromAddr SymGetLineFromAddr64
-#else
-BOOL
-IMAGEAPI
-SymGetLineFromAddr(
-    IN  HANDLE                hProcess,
-    IN  DWORD                 dwAddr,
-    OUT PDWORD                pdwDisplacement,
-    OUT PIMAGEHLP_LINE        Line
-    );
-#endif
-
-BOOL
-IMAGEAPI
-SymGetLineFromName64(
-    IN     HANDLE               hProcess,
-    IN     PSTR                 ModuleName,
-    IN     PSTR                 FileName,
-    IN     DWORD                dwLineNumber,
-       OUT Pint32_t                plDisplacement,
-    IN OUT PIMAGEHLP_LINE64     Line
-    );
-
-#if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
-#define SymGetLineFromName SymGetLineFromName64
-#else
-BOOL
-IMAGEAPI
-SymGetLineFromName(
-    IN     HANDLE             hProcess,
-    IN     PSTR               ModuleName,
-    IN     PSTR               FileName,
-    IN     DWORD              dwLineNumber,
-       OUT Pint32_t              plDisplacement,
-    IN OUT PIMAGEHLP_LINE     Line
-    );
-#endif
-
-BOOL
-IMAGEAPI
-SymGetLineNext64(
-    IN     HANDLE               hProcess,
-    IN OUT PIMAGEHLP_LINE64     Line
-    );
-
-#if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
-#define SymGetLineNext SymGetLineNext64
-#else
-BOOL
-IMAGEAPI
-SymGetLineNext(
-    IN     HANDLE             hProcess,
-    IN OUT PIMAGEHLP_LINE     Line
-    );
-#endif
-
-BOOL
-IMAGEAPI
-SymGetLinePrev64(
-    IN     HANDLE               hProcess,
-    IN OUT PIMAGEHLP_LINE64     Line
-    );
-
-#if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
-#define SymGetLinePrev SymGetLinePrev64
-#else
-BOOL
-IMAGEAPI
-SymGetLinePrev(
-    IN     HANDLE             hProcess,
-    IN OUT PIMAGEHLP_LINE     Line
-    );
-#endif
-
-BOOL
-IMAGEAPI
-SymMatchFileName(
-    IN  PSTR  FileName,
-    IN  PSTR  Match,
-    OUT PSTR *FileNameStop,
-    OUT PSTR *MatchStop
-    );
-
-BOOL
-IMAGEAPI
-SymInitialize(
-    IN HANDLE   hProcess,
-    IN PSTR     UserSearchPath,
-    IN BOOL     fInvadeProcess
-    );
-
-BOOL
-IMAGEAPI
-SymGetSearchPath(
-    IN  HANDLE          hProcess,
-    OUT PSTR            SearchPath,
-    IN  DWORD           SearchPathLength
-    );
-
-BOOL
-IMAGEAPI
-SymSetSearchPath(
-    IN HANDLE           hProcess,
-    IN PSTR             SearchPath
-    );
-
-DWORD64
-IMAGEAPI
-SymLoadModule64(
-    IN  HANDLE          hProcess,
-    IN  HANDLE          hFile,
-    IN  PSTR            ImageName,
-    IN  PSTR            ModuleName,
-    IN  DWORD64         BaseOfDll,
-    IN  DWORD           SizeOfDll
-    );
-
-DWORD64
-IMAGEAPI
-SymLoadModuleEx(
-    IN  HANDLE         hProcess,
-    IN  HANDLE         hFile,
-    IN  PSTR           ImageName,
-    IN  PSTR           ModuleName,
-    IN  DWORD64        BaseOfDll,
-    IN  DWORD          DllSize,
-    IN  PMODLOAD_DATA  Data,
-    IN  DWORD          Flags
-    );
-
-#if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
-#define SymLoadModule SymLoadModule64
-#else
-DWORD
-IMAGEAPI
-SymLoadModule(
-    IN  HANDLE          hProcess,
-    IN  HANDLE          hFile,
-    IN  PSTR            ImageName,
-    IN  PSTR            ModuleName,
-    IN  DWORD           BaseOfDll,
-    IN  DWORD           SizeOfDll
-    );
-#endif
-
-BOOL
-IMAGEAPI
-SymUnloadModule64(
-    IN  HANDLE          hProcess,
-    IN  DWORD64         BaseOfDll
-    );
-
-#if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
-#define SymUnloadModule SymUnloadModule64
-#else
-BOOL
-IMAGEAPI
-SymUnloadModule(
-    IN  HANDLE          hProcess,
-    IN  DWORD           BaseOfDll
-    );
-#endif
-
-BOOL
-IMAGEAPI
-SymUnDName64(
-    IN  PIMAGEHLP_SYMBOL64 sym,               // Symbol to undecorate
-    OUT PSTR               UnDecName,         // Buffer to store undecorated name in
-    IN  DWORD              UnDecNameLength    // Size of the buffer
-    );
-
-#if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
-#define SymUnDName SymUnDName64
-#else
-BOOL
-IMAGEAPI
-SymUnDName(
-    IN  PIMAGEHLP_SYMBOL sym,               // Symbol to undecorate
-    OUT PSTR             UnDecName,         // Buffer to store undecorated name in
-    IN  DWORD            UnDecNameLength    // Size of the buffer
-    );
-#endif
-
-BOOL
-IMAGEAPI
-SymRegisterCallback64(
-    IN HANDLE                        hProcess,
-    IN PSYMBOL_REGISTERED_CALLBACK64 CallbackFunction,
-    IN ULONG64                       UserContext
-    );
-
-BOOL
-IMAGEAPI
-SymRegisterFunctionEntryCallback64(
-    IN HANDLE                       hProcess,
-    IN PSYMBOL_FUNCENTRY_CALLBACK64 CallbackFunction,
-    IN ULONG64                      UserContext
-    );
-
-#if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
-#define SymRegisterCallback SymRegisterCallback64
-#define SymRegisterFunctionEntryCallback SymRegisterFunctionEntryCallback64
-#else
-BOOL
-IMAGEAPI
-SymRegisterCallback(
-    IN HANDLE                      hProcess,
-    IN PSYMBOL_REGISTERED_CALLBACK CallbackFunction,
-    IN PVOID                       UserContext
-    );
-
-BOOL
-IMAGEAPI
-SymRegisterFunctionEntryCallback(
-    IN HANDLE                     hProcess,
-    IN PSYMBOL_FUNCENTRY_CALLBACK CallbackFunction,
-    IN PVOID                      UserContext
-    );
-#endif
-
-
-typedef struct _IMAGEHLP_SYMBOL_SRC {
-    DWORD sizeofstruct;
-    DWORD type;
-    uint8_t   file[MAX_PATH];
-} IMAGEHLP_SYMBOL_SRC, *PIMAGEHLP_SYMBOL_SRC;
-
-typedef struct _MODULE_TYPE_INFO { // AKA TYPTYP
-    USHORT      dataLength;
-    USHORT      leaf;
-    BYTE        data[1];
-} MODULE_TYPE_INFO, *PMODULE_TYPE_INFO;
-
-#define IMAGEHLP_SYMBOL_INFO_VALUEPRESENT          1
-#define IMAGEHLP_SYMBOL_INFO_REGISTER              SYMF_REGISTER        //  0x08
-#define IMAGEHLP_SYMBOL_INFO_REGRELATIVE           SYMF_REGREL          //  0x10
-#define IMAGEHLP_SYMBOL_INFO_FRAMERELATIVE         SYMF_FRAMEREL        //  0x20
-#define IMAGEHLP_SYMBOL_INFO_PARAMETER             SYMF_PARAMETER       //  0x40
-#define IMAGEHLP_SYMBOL_INFO_LOCAL                 SYMF_LOCAL           //  0x80
-#define IMAGEHLP_SYMBOL_INFO_CONSTANT              SYMF_CONSTANT        // 0x100
-#define IMAGEHLP_SYMBOL_FUNCTION                   SYMF_FUNCTION        // 0x800
-
-typedef struct _SYMBOL_INFO {
-    Uint32_t       SizeOfStruct;
-    Uint32_t       TypeIndex;        // Type Index of symbol
-    ULONG64     Reserved[2];
-    Uint32_t       Reserved2;
-    Uint32_t       Size;
-    ULONG64     ModBase;          // Base Address of module comtaining this symbol
-    Uint32_t       Flags;
-    ULONG64     Value;            // Value of symbol, ValuePresent should be 1
-    ULONG64     Address;          // Address of symbol including base address of module
-    Uint32_t       Register;         // register holding value or pointer to value
-    Uint32_t       Scope;            // scope of the symbol
-    Uint32_t       Tag;              // pdb classification
-    Uint32_t       NameLen;          // Actual length of name
-    Uint32_t       MaxNameLen;
-    CHAR        Name[1];          // Name of symbol
-} SYMBOL_INFO, *PSYMBOL_INFO;
-
-typedef struct _IMAGEHLP_STACK_FRAME
-{
-    ULONG64 InstructionOffset;
-    ULONG64 ReturnOffset;
-    ULONG64 FrameOffset;
-    ULONG64 StackOffset;
-    ULONG64 BackingStoreOffset;
-    ULONG64 FuncTableEntry;
-    ULONG64 Params[4];
-    ULONG64 Reserved[5];
-    BOOL    Virtual;
-    Uint32_t   Reserved2;
-} IMAGEHLP_STACK_FRAME, *PIMAGEHLP_STACK_FRAME;
-
-typedef VOID IMAGEHLP_CONTEXT, *PIMAGEHLP_CONTEXT;
-
-
-ULONG
-IMAGEAPI
-SymSetContext(
-    HANDLE hProcess,
-    PIMAGEHLP_STACK_FRAME StackFrame,
-    PIMAGEHLP_CONTEXT Context
-    );
-
-BOOL
-IMAGEAPI
-SymFromAddr(
-    IN  HANDLE              hProcess,
-    IN  DWORD64             Address,
-    OUT PDWORD64            Displacement,
-    IN OUT PSYMBOL_INFO     Symbol
-    );
-
-// While SymFromName will provide a symbol from a name,
-// SymEnumSymbols can provide the same matching information
-// for ALL symbols with a matching name, even regular
-// expressions.  That way you can search across modules
-// and differentiate between identically named symbols.
-
-BOOL
-IMAGEAPI
-SymFromName(
-    IN  HANDLE              hProcess,
-    IN  LPSTR               Name,
-    OUT PSYMBOL_INFO        Symbol
-    );
-
-typedef BOOL
-(CALLBACK *PSYM_ENUMERATESYMBOLS_CALLBACK)(
-    PSYMBOL_INFO  pSymInfo,
-    Uint32_t         SymbolSize,
-    PVOID         UserContext
-    );
-
-BOOL
-IMAGEAPI
-SymEnumSymbols(
-    IN HANDLE                       hProcess,
-    IN ULONG64                      BaseOfDll,
-    IN PCSTR                        Mask,
-    IN PSYM_ENUMERATESYMBOLS_CALLBACK    EnumSymbolsCallback,
-    IN PVOID                        UserContext
-    );
-
-typedef enum _IMAGEHLP_SYMBOL_TYPE_INFO {
-    TI_GET_SYMTAG,
-    TI_GET_SYMNAME,
-    TI_GET_LENGTH,
-    TI_GET_TYPE,
-    TI_GET_TYPEID,
-    TI_GET_BASETYPE,
-    TI_GET_ARRAYINDEXTYPEID,
-    TI_FINDCHILDREN,
-    TI_GET_DATAKIND,
-    TI_GET_ADDRESSOFFSET,
-    TI_GET_OFFSET,
-    TI_GET_VALUE,
-    TI_GET_COUNT,
-    TI_GET_CHILDRENCOUNT,
-    TI_GET_BITPOSITION,
-    TI_GET_VIRTUALBASECLASS,
-    TI_GET_VIRTUALTABLESHAPEID,
-    TI_GET_VIRTUALBASEPOINTEROFFSET,
-    TI_GET_CLASSPARENTID,
-    TI_GET_NESTED,
-    TI_GET_SYMINDEX,
-    TI_GET_LEXICALPARENT,
-    TI_GET_ADDRESS,
-    TI_GET_THISADJUST,
-} IMAGEHLP_SYMBOL_TYPE_INFO;
-
-typedef struct _TI_FINDCHILDREN_PARAMS {
-    Uint32_t Count;
-    Uint32_t Start;
-    Uint32_t ChildId[1];
-} TI_FINDCHILDREN_PARAMS;
-
-BOOL
-IMAGEAPI
-SymGetTypeInfo(
-    IN  HANDLE          hProcess,
-    IN  DWORD64         ModBase,
-    IN  Uint32_t           TypeId,
-    IN  IMAGEHLP_SYMBOL_TYPE_INFO GetType,
-    OUT PVOID           pInfo
-    );
-
-BOOL
-IMAGEAPI
-SymEnumTypes(
-    IN HANDLE                       hProcess,
-    IN ULONG64                      BaseOfDll,
-    IN PSYM_ENUMERATESYMBOLS_CALLBACK    EnumSymbolsCallback,
-    IN PVOID                        UserContext
-    );
-
-BOOL
-IMAGEAPI
-SymGetTypeFromName(
-    IN  HANDLE              hProcess,
-    IN  ULONG64             BaseOfDll,
-    IN  LPSTR               Name,
-    OUT PSYMBOL_INFO        Symbol
-    );
-
-//
-// Full user-mode dump creation.
-//
-
-typedef BOOL (WINAPI *PDBGHELP_CREATE_USER_DUMP_CALLBACK)(
-    DWORD       DataType,
-    PVOID*      Data,
-    LPDWORD     DataLength,
-    PVOID       UserData
-    );
-
-BOOL
-WINAPI
-DbgHelpCreateUserDump(
-    IN LPSTR                              FileName,
-    IN PDBGHELP_CREATE_USER_DUMP_CALLBACK Callback,
-    IN PVOID                              UserData
-    );
-
-BOOL
-WINAPI
-DbgHelpCreateUserDumpW(
-    IN LPWSTR                             FileName,
-    IN PDBGHELP_CREATE_USER_DUMP_CALLBACK Callback,
-    IN PVOID                              UserData
-    );
-
-// -----------------------------------------------------------------
-// The following 4 legacy APIs are fully supported, but newer
-// ones are recommended.  SymFromName and SymFromAddr provide
-// much more detailed info on the returned symbol.
-
-BOOL
-IMAGEAPI
-SymGetSymFromAddr64(
-    IN  HANDLE              hProcess,
-    IN  DWORD64             qwAddr,
-    OUT PDWORD64            pdwDisplacement,
-    OUT PIMAGEHLP_SYMBOL64  Symbol
-    );
-
-#if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
-#define SymGetSymFromAddr SymGetSymFromAddr64
-#else
-BOOL
-IMAGEAPI
-SymGetSymFromAddr(
-    IN  HANDLE            hProcess,
-    IN  DWORD             dwAddr,
-    OUT PDWORD            pdwDisplacement,
-    OUT PIMAGEHLP_SYMBOL  Symbol
-    );
-#endif
-
-// While following two APIs will provide a symbol from a name,
-// SymEnumSymbols can provide the same matching information
-// for ALL symbols with a matching name, even regular
-// expressions.  That way you can search across modules
-// and differentiate between identically named symbols.
-
-BOOL
-IMAGEAPI
-SymGetSymFromName64(
-    IN  HANDLE              hProcess,
-    IN  PSTR                Name,
-    OUT PIMAGEHLP_SYMBOL64  Symbol
-    );
-
-#if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
-#define SymGetSymFromName SymGetSymFromName64
-#else
-BOOL
-IMAGEAPI
-SymGetSymFromName(
-    IN  HANDLE            hProcess,
-    IN  PSTR              Name,
-    OUT PIMAGEHLP_SYMBOL  Symbol
-    );
-#endif
-
-
-// -----------------------------------------------------------------
-// The following APIs exist only for backwards compatibility
-// with a pre-release version documented in an MSDN release.
-
-// You should use SymFindFileInPath if you want to maintain
-// future compatibility.
-
-DBHLP_DEPRECIATED
-BOOL
-IMAGEAPI
-FindFileInPath(
-    HANDLE hprocess,
-    LPSTR  SearchPath,
-    LPSTR  FileName,
-    PVOID  id,
-    DWORD  two,
-    DWORD  three,
-    DWORD  flags,
-    LPSTR  FilePath
-    );
-
-// You should use SymFindFileInPath if you want to maintain
-// future compatibility.
-
-DBHLP_DEPRECIATED
-BOOL
-IMAGEAPI
-FindFileInSearchPath(
-    HANDLE hprocess,
-    LPSTR  SearchPath,
-    LPSTR  FileName,
-    DWORD  one,
-    DWORD  two,
-    DWORD  three,
-    LPSTR  FilePath
-    );
-
-DBHLP_DEPRECIATED
-BOOL
-IMAGEAPI
-SymEnumSym(
-    IN HANDLE                       hProcess,
-    IN ULONG64                      BaseOfDll,
-    IN PSYM_ENUMERATESYMBOLS_CALLBACK    EnumSymbolsCallback,
-    IN PVOID                        UserContext
-    );
-
-
-#include <pshpack4.h>
-
-#pragma warning(disable:4200) // Zero length array
-
-
-#define MINIDUMP_SIGNATURE ('PMDM')
-#define MINIDUMP_VERSION   (42899)
-typedef DWORD RVA;
-typedef ULONG64 RVA64;
-
-typedef struct _MINIDUMP_LOCATION_DESCRIPTOR {
-    ULONG32 DataSize;
-    RVA Rva;
-} MINIDUMP_LOCATION_DESCRIPTOR;
-
-typedef struct _MINIDUMP_LOCATION_DESCRIPTOR64 {
-    ULONG64 DataSize;
-    RVA64 Rva;
-} MINIDUMP_LOCATION_DESCRIPTOR64;
-
-
-typedef struct _MINIDUMP_MEMORY_DESCRIPTOR {
-    ULONG64 StartOfMemoryRange;
-    MINIDUMP_LOCATION_DESCRIPTOR Memory;
-} MINIDUMP_MEMORY_DESCRIPTOR, *PMINIDUMP_MEMORY_DESCRIPTOR;
-
-// DESCRIPTOR64 is used for full-memory minidumps where
-// all of the raw memory is laid out sequentially at the
-// end of the dump.  There is no need for individual RVAs
-// as the RVA is the base RVA plus the sum of the preceeding
-// data blocks.
-typedef struct _MINIDUMP_MEMORY_DESCRIPTOR64 {
-    ULONG64 StartOfMemoryRange;
-    ULONG64 DataSize;
-} MINIDUMP_MEMORY_DESCRIPTOR64, *PMINIDUMP_MEMORY_DESCRIPTOR64;
-
-
-typedef struct _MINIDUMP_HEADER {
-    ULONG32 Signature;
-    ULONG32 Version;
-    ULONG32 NumberOfStreams;
-    RVA StreamDirectoryRva;
-    ULONG32 CheckSum;
-    union {
-        ULONG32 Reserved;
-        ULONG32 TimeDateStamp;
-    };
-    ULONG64 Flags;
-} MINIDUMP_HEADER, *PMINIDUMP_HEADER;
-
-//
-// The MINIDUMP_HEADER field StreamDirectoryRva points to 
-// an array of MINIDUMP_DIRECTORY structures.
-//
-
-typedef struct _MINIDUMP_DIRECTORY {
-    ULONG32 StreamType;
-    MINIDUMP_LOCATION_DESCRIPTOR Location;
-} MINIDUMP_DIRECTORY, *PMINIDUMP_DIRECTORY;
-
-
-typedef struct _MINIDUMP_STRING {
-    ULONG32 Length;         // Length in bytes of the string
-    WCHAR   Buffer [0];     // Variable size buffer
-} MINIDUMP_STRING, *PMINIDUMP_STRING;
-
-
-
-//
-// The MINIDUMP_DIRECTORY field StreamType may be one of the following types.
-// Types will be added in the future, so if a program reading the minidump
-// header encounters a stream type it does not understand it should ignore
-// the data altogether. Any tag above LastReservedStream will not be used by
-// the system and is reserved for program-specific information.
-//
-
-typedef enum _MINIDUMP_STREAM_TYPE {
-
-    UnusedStream                = 0,
-    ReservedStream0             = 1,
-    ReservedStream1             = 2,
-    ThreadListStream            = 3,
-    ModuleListStream            = 4,
-    MemoryListStream            = 5,
-    ExceptionStream             = 6,
-    SystemInfoStream            = 7,
-    ThreadExListStream          = 8,
-    Memory64ListStream          = 9,
-    CommentStreamA              = 10,
-    CommentStreamW              = 11,
-    HandleDataStream            = 12,
-    FunctionTableStream         = 13,
-
-    LastReservedStream          = 0xffff
-
-} MINIDUMP_STREAM_TYPE;
-
-
-//
-// The minidump system information contains processor and
-// Operating System specific information.
-// 
-    
-typedef struct _MINIDUMP_SYSTEM_INFO {
-
-    //
-    // ProcessorArchitecture, ProcessorLevel and ProcessorRevision are all
-    // taken from the SYSTEM_INFO structure obtained by GetSystemInfo( ).
-    //
-    
-    USHORT ProcessorArchitecture;
-    USHORT ProcessorLevel;
-    USHORT ProcessorRevision;
-
-    USHORT Reserved0;              // Reserved for future use. Must be zero.
-
-    //
-    // MajorVersion, MinorVersion, BuildNumber, PlatformId and
-    // CSDVersion are all taken from the OSVERSIONINFO structure
-    // returned by GetVersionEx( ).
-    //
-    
-    ULONG32 MajorVersion;
-    ULONG32 MinorVersion;
-    ULONG32 BuildNumber;
-    ULONG32 PlatformId;
-
-    //
-    // RVA to a CSDVersion string in the string table.
-    //
-    
-    RVA CSDVersionRva;
-
-    ULONG32 Reserved1;             // Reserved for future use.
-
-    //
-    // CPU information is obtained from one of two places.
-    //
-    //  1) On x86 computers, CPU_INFORMATION is obtained from the CPUID
-    //     instruction. You must use the X86 portion of the union for X86
-    //     computers.
-    //
-    //  2) On non-x86 architectures, CPU_INFORMATION is obtained by calling
-    //     IsProcessorFeatureSupported().
-    //
-    
-    union _CPU_INFORMATION {
-
-        //
-        // X86 platforms use CPUID function to obtain processor information.
-        //
-        
-        struct {
-
-            //
-            // CPUID Subfunction 0, register EAX (VendorId [0]),
-            // EBX (VendorId [1]) and ECX (VendorId [2]).
-            //
-            
-            ULONG32 VendorId [ 3 ];
-            
-            //
-            // CPUID Subfunction 1, register EAX
-            //
-            
-            ULONG32 VersionInformation;
-
-            //
-            // CPUID Subfunction 1, register EDX
-            //
-            
-            ULONG32 FeatureInformation;
-            
-
-            //
-            // CPUID, Subfunction 80000001, register EBX. This will only
-            // be obtained if the vendor id is "AuthenticAMD".
-            //
-            
-            ULONG32 AMDExtendedCpuFeatures;
-    
-        } X86CpuInfo;
-
-        //
-        // Non-x86 platforms use processor feature flags.
-        //
-        
-        struct {
-
-            ULONG64 ProcessorFeatures [ 2 ];
-            
-        } OtherCpuInfo;
-        
-    } Cpu;
-
-} MINIDUMP_SYSTEM_INFO, *PMINIDUMP_SYSTEM_INFO;
-
-typedef union _CPU_INFORMATION CPU_INFORMATION, *PCPU_INFORMATION;
-
-
-//
-// The minidump thread contains standard thread
-// information plus an RVA to the memory for this 
-// thread and an RVA to the CONTEXT structure for
-// this thread.
-//
-
-
-//
-// ThreadId must be 4 bytes on all architectures.
-//
-
-C_ASSERT (sizeof ( ((PPROCESS_INFORMATION)0)->dwThreadId ) == 4);
-
-typedef struct _MINIDUMP_THREAD {
-    ULONG32 ThreadId;
-    ULONG32 SuspendCount;
-    ULONG32 PriorityClass;
-    ULONG32 Priority;
-    ULONG64 Teb;
-    MINIDUMP_MEMORY_DESCRIPTOR Stack;
-    MINIDUMP_LOCATION_DESCRIPTOR ThreadContext;
-} MINIDUMP_THREAD, *PMINIDUMP_THREAD;
-
-//
-// The thread list is a container of threads.
-//
-
-typedef struct _MINIDUMP_THREAD_LIST {
-    ULONG32 NumberOfThreads;
-    MINIDUMP_THREAD Threads [0];
-} MINIDUMP_THREAD_LIST, *PMINIDUMP_THREAD_LIST;
-
-
-typedef struct _MINIDUMP_THREAD_EX {
-    ULONG32 ThreadId;
-    ULONG32 SuspendCount;
-    ULONG32 PriorityClass;
-    ULONG32 Priority;
-    ULONG64 Teb;
-    MINIDUMP_MEMORY_DESCRIPTOR Stack;
-    MINIDUMP_LOCATION_DESCRIPTOR ThreadContext;
-    MINIDUMP_MEMORY_DESCRIPTOR BackingStore;
-} MINIDUMP_THREAD_EX, *PMINIDUMP_THREAD_EX;
-
-//
-// The thread list is a container of threads.
-//
-
-typedef struct _MINIDUMP_THREAD_EX_LIST {
-    ULONG32 NumberOfThreads;
-    MINIDUMP_THREAD_EX Threads [0];
-} MINIDUMP_THREAD_EX_LIST, *PMINIDUMP_THREAD_EX_LIST;
-
-
-//
-// The MINIDUMP_EXCEPTION is the same as EXCEPTION on Win64.
-//
-
-typedef struct _MINIDUMP_EXCEPTION  {
-    ULONG32 ExceptionCode;
-    ULONG32 ExceptionFlags;
-    ULONG64 ExceptionRecord;
-    ULONG64 ExceptionAddress;
-    ULONG32 NumberParameters;
-    ULONG32 __unusedAlignment;
-    ULONG64 ExceptionInformation [ EXCEPTION_MAXIMUM_PARAMETERS ];
-} MINIDUMP_EXCEPTION, *PMINIDUMP_EXCEPTION;
-
-
-//
-// The exception information stream contains the id of the thread that caused
-// the exception (ThreadId), the exception record for the exception
-// (ExceptionRecord) and an RVA to the thread context where the exception
-// occured.
-//
-
-typedef struct MINIDUMP_EXCEPTION_STREAM {
-    ULONG32 ThreadId;
-    ULONG32  __alignment;
-    MINIDUMP_EXCEPTION ExceptionRecord;
-    MINIDUMP_LOCATION_DESCRIPTOR ThreadContext;
-} MINIDUMP_EXCEPTION_STREAM, *PMINIDUMP_EXCEPTION_STREAM;
-
-
-//
-// The MINIDUMP_MODULE contains information about a
-// a specific module. It includes the CheckSum and
-// the TimeDateStamp for the module so the module
-// can be reloaded during the analysis phase.
-//
-
-typedef struct _MINIDUMP_MODULE {
-    ULONG64 BaseOfImage;
-    ULONG32 SizeOfImage;
-    ULONG32 CheckSum;
-    ULONG32 TimeDateStamp;
-    RVA ModuleNameRva;
-    VS_FIXEDFILEINFO VersionInfo;
-    MINIDUMP_LOCATION_DESCRIPTOR CvRecord;
-    MINIDUMP_LOCATION_DESCRIPTOR MiscRecord;
-    ULONG64 Reserved0;                          // Reserved for future use.
-    ULONG64 Reserved1;                          // Reserved for future use.
-} MINIDUMP_MODULE, *PMINIDUMP_MODULE;   
-
-
-//
-// The minidump module list is a container for modules.
-//
-
-typedef struct _MINIDUMP_MODULE_LIST {
-    ULONG32 NumberOfModules;
-    MINIDUMP_MODULE Modules [ 0 ];
-} MINIDUMP_MODULE_LIST, *PMINIDUMP_MODULE_LIST;
-
-
-//
-// Memory Ranges
-//
-
-typedef struct _MINIDUMP_MEMORY_LIST {
-    ULONG32 NumberOfMemoryRanges;
-    MINIDUMP_MEMORY_DESCRIPTOR MemoryRanges [0];
-} MINIDUMP_MEMORY_LIST, *PMINIDUMP_MEMORY_LIST;
-
-typedef struct _MINIDUMP_MEMORY64_LIST {
-    ULONG64 NumberOfMemoryRanges;
-    RVA64 BaseRva;
-    MINIDUMP_MEMORY_DESCRIPTOR64 MemoryRanges [0];
-} MINIDUMP_MEMORY64_LIST, *PMINIDUMP_MEMORY64_LIST;
-
-
-//
-// Support for user supplied exception information.
-//
-
-typedef struct _MINIDUMP_EXCEPTION_INFORMATION {
-    DWORD ThreadId;
-    PEXCEPTION_POINTERS ExceptionPointers;
-    BOOL ClientPointers;
-} MINIDUMP_EXCEPTION_INFORMATION, *PMINIDUMP_EXCEPTION_INFORMATION;
-
-
-//
-// Support for capturing system handle state at the time of the dump.
-//
-
-typedef struct _MINIDUMP_HANDLE_DESCRIPTOR {
-    ULONG64 Handle;
-    RVA TypeNameRva;
-    RVA ObjectNameRva;
-    ULONG32 Attributes;
-    ULONG32 GrantedAccess;
-    ULONG32 HandleCount;
-    ULONG32 PointerCount;
-} MINIDUMP_HANDLE_DESCRIPTOR, *PMINIDUMP_HANDLE_DESCRIPTOR;
-
-typedef struct _MINIDUMP_HANDLE_DATA_STREAM {
-    ULONG32 SizeOfHeader;
-    ULONG32 SizeOfDescriptor;
-    ULONG32 NumberOfDescriptors;
-    ULONG32 Reserved;
-} MINIDUMP_HANDLE_DATA_STREAM, *PMINIDUMP_HANDLE_DATA_STREAM;
-
-
-//
-// Support for capturing dynamic function table state at the time of the dump.
-//
-
-typedef struct _MINIDUMP_FUNCTION_TABLE_DESCRIPTOR {
-    ULONG64 MinimumAddress;
-    ULONG64 MaximumAddress;
-    ULONG64 BaseAddress;
-    ULONG32 EntryCount;
-    ULONG32 SizeOfAlignPad;
-} MINIDUMP_FUNCTION_TABLE_DESCRIPTOR, *PMINIDUMP_FUNCTION_TABLE_DESCRIPTOR;
-
-typedef struct _MINIDUMP_FUNCTION_TABLE_STREAM {
-    ULONG32 SizeOfHeader;
-    ULONG32 SizeOfDescriptor;
-    ULONG32 SizeOfNativeDescriptor;
-    ULONG32 SizeOfFunctionEntry;
-    ULONG32 NumberOfDescriptors;
-    ULONG32 SizeOfAlignPad;
-} MINIDUMP_FUNCTION_TABLE_STREAM, *PMINIDUMP_FUNCTION_TABLE_STREAM;
-
-
-//
-// Support for arbitrary user-defined information.
-//
-
-typedef struct _MINIDUMP_USER_RECORD {
-    ULONG32 Type;
-    MINIDUMP_LOCATION_DESCRIPTOR Memory;
-} MINIDUMP_USER_RECORD, *PMINIDUMP_USER_RECORD;
-
-
-typedef struct _MINIDUMP_USER_STREAM {
-    ULONG32 Type;
-    Uint32_t BufferSize;
-    PVOID Buffer;
-
-} MINIDUMP_USER_STREAM, *PMINIDUMP_USER_STREAM;
-
-
-typedef struct _MINIDUMP_USER_STREAM_INFORMATION {
-    Uint32_t UserStreamCount;
-    PMINIDUMP_USER_STREAM UserStreamArray;
-} MINIDUMP_USER_STREAM_INFORMATION, *PMINIDUMP_USER_STREAM_INFORMATION;
-
-//
-// Callback support.
-//
-
-typedef enum _MINIDUMP_CALLBACK_TYPE {
-    ModuleCallback,
-    ThreadCallback,
-    ThreadExCallback,
-    IncludeThreadCallback,
-    IncludeModuleCallback,
-} MINIDUMP_CALLBACK_TYPE;
-
-
-typedef struct _MINIDUMP_THREAD_CALLBACK {
-    Uint32_t ThreadId;
-    HANDLE ThreadHandle;
-    CONTEXT Context;
-    Uint32_t SizeOfContext;
-    ULONG64 StackBase;
-    ULONG64 StackEnd;
-} MINIDUMP_THREAD_CALLBACK, *PMINIDUMP_THREAD_CALLBACK;
-
-
-typedef struct _MINIDUMP_THREAD_EX_CALLBACK {
-    Uint32_t ThreadId;
-    HANDLE ThreadHandle;
-    CONTEXT Context;
-    Uint32_t SizeOfContext;
-    ULONG64 StackBase;
-    ULONG64 StackEnd;
-    ULONG64 BackingStoreBase;
-    ULONG64 BackingStoreEnd;
-} MINIDUMP_THREAD_EX_CALLBACK, *PMINIDUMP_THREAD_EX_CALLBACK;
-
-
-typedef struct _MINIDUMP_INCLUDE_THREAD_CALLBACK {
-    Uint32_t ThreadId;
-} MINIDUMP_INCLUDE_THREAD_CALLBACK, *PMINIDUMP_INCLUDE_THREAD_CALLBACK;
-
-
-typedef enum _THREAD_WRITE_FLAGS {
-    ThreadWriteThread            = 0x0001,
-    ThreadWriteStack             = 0x0002,
-    ThreadWriteContext           = 0x0004,
-    ThreadWriteBackingStore      = 0x0008,
-    ThreadWriteInstructionWindow = 0x0010
-} THREAD_WRITE_FLAGS;
-
-typedef struct _MINIDUMP_MODULE_CALLBACK {
-    PWCHAR FullPath;
-    ULONG64 BaseOfImage;
-    Uint32_t SizeOfImage;
-    Uint32_t CheckSum;
-    Uint32_t TimeDateStamp;
-    VS_FIXEDFILEINFO VersionInfo;
-    PVOID CvRecord; 
-    Uint32_t SizeOfCvRecord;
-    PVOID MiscRecord;
-    Uint32_t SizeOfMiscRecord;
-} MINIDUMP_MODULE_CALLBACK, *PMINIDUMP_MODULE_CALLBACK;
-
-
-typedef struct _MINIDUMP_INCLUDE_MODULE_CALLBACK {
-    ULONG64 BaseOfImage;
-} MINIDUMP_INCLUDE_MODULE_CALLBACK, *PMINIDUMP_INCLUDE_MODULE_CALLBACK;
-
-
-typedef enum _MODULE_WRITE_FLAGS {
-    ModuleWriteModule        = 0x0001,
-    ModuleWriteDataSeg       = 0x0002,
-    ModuleWriteMiscRecord    = 0x0004,
-    ModuleWriteCvRecord      = 0x0008,
-    ModuleReferencedByMemory = 0x0010
-} MODULE_WRITE_FLAGS;
-
-
-typedef struct _MINIDUMP_CALLBACK_INPUT {
-    Uint32_t ProcessId;
-    HANDLE ProcessHandle;
-    Uint32_t CallbackType;
-    union {
-        MINIDUMP_THREAD_CALLBACK Thread;
-        MINIDUMP_THREAD_EX_CALLBACK ThreadEx;
-        MINIDUMP_MODULE_CALLBACK Module;
-        MINIDUMP_INCLUDE_THREAD_CALLBACK IncludeThread;
-        MINIDUMP_INCLUDE_MODULE_CALLBACK IncludeModule;
-    };
-} MINIDUMP_CALLBACK_INPUT, *PMINIDUMP_CALLBACK_INPUT;
-
-typedef struct _MINIDUMP_CALLBACK_OUTPUT {
-    union {
-        Uint32_t ModuleWriteFlags;
-        Uint32_t ThreadWriteFlags;
-    };
-} MINIDUMP_CALLBACK_OUTPUT, *PMINIDUMP_CALLBACK_OUTPUT;
-
-        
-//
-// A normal minidump contains just the information
-// necessary to capture stack traces for all of the
-// existing threads in a process.
-//
-// A minidump with data segments includes all of the data
-// sections from loaded modules in order to capture
-// global variable contents.  This can make the dump much
-// larger if many modules have global data.
-//
-// A minidump with full memory includes all of the accessible
-// memory in the process and can be very large.  A minidump
-// with full memory always has the raw memory data at the end
-// of the dump so that the initial structures in the dump can
-// be mapped directly without having to include the raw
-// memory information.
-//
-// Stack and backing store memory can be filtered to remove
-// data unnecessary for stack walking.  This can improve
-// compression of stacks and also deletes data that may
-// be private and should not be stored in a dump.
-// Memory can also be scanned to see what modules are
-// referenced by stack and backing store memory to allow
-// omission of other modules to reduce dump size.
-// In either of these modes the ModuleReferencedByMemory flag
-// is set for all modules referenced before the base
-// module callbacks occur.
-//
-
-typedef enum _MINIDUMP_TYPE {
-    MiniDumpNormal         = 0x0000,
-    MiniDumpWithDataSegs   = 0x0001,
-    MiniDumpWithFullMemory = 0x0002,
-    MiniDumpWithHandleData = 0x0004,
-    MiniDumpFilterMemory   = 0x0008,
-    MiniDumpScanMemory     = 0x0010,
-} MINIDUMP_TYPE;
-
-
-//
-// The minidump callback should modify the FieldsToWrite parameter to reflect
-// what portions of the specified thread or module should be written to the
-// file.
-//
-
-typedef
-BOOL
-(WINAPI * MINIDUMP_CALLBACK_ROUTINE) (
-    IN PVOID CallbackParam,
-    IN CONST PMINIDUMP_CALLBACK_INPUT CallbackInput,
-    IN OUT PMINIDUMP_CALLBACK_OUTPUT CallbackOutput
-    );
-
-typedef struct _MINIDUMP_CALLBACK_INFORMATION {
-    MINIDUMP_CALLBACK_ROUTINE CallbackRoutine;
-    PVOID CallbackParam;
-} MINIDUMP_CALLBACK_INFORMATION, *PMINIDUMP_CALLBACK_INFORMATION;
-
-
-
-//++
-//
-// PVOID
-// RVA_TO_ADDR(
-//     PVOID Mapping,
-//     Uint32_t Rva
-//     )
-//
-// Routine Description:
-//
-//     Map an RVA that is contained within a mapped file to it's associated
-//     flat address.
-//
-// Arguments:
-//
-//     Mapping - Base address of mapped file containing the RVA.
-//
-//     Rva - An Rva to fixup.
-//
-// Return Values:
-//
-//     A pointer to the desired data.
-//
-//--
-
-#define RVA_TO_ADDR(Mapping,Rva) ((PVOID)(((ULONG_PTR) (Mapping)) + (Rva)))
-
-BOOL
-WINAPI
-MiniDumpWriteDump(
-    IN HANDLE hProcess,
-    IN DWORD ProcessId,
-    IN HANDLE hFile,
-    IN MINIDUMP_TYPE DumpType,
-    IN CONST PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, OPTIONAL
-    IN CONST PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, OPTIONAL
-    IN CONST PMINIDUMP_CALLBACK_INFORMATION CallbackParam OPTIONAL
-    );
-
-BOOL
-WINAPI
-MiniDumpReadDumpStream(
-    IN PVOID BaseOfDump,
-    IN Uint32_t StreamNumber,
-    OUT PMINIDUMP_DIRECTORY * Dir, OPTIONAL
-    OUT PVOID * StreamPointer, OPTIONAL
-    OUT Uint32_t * StreamSize OPTIONAL
-    );
-
-#include <poppack.h>
-
-#ifdef __cplusplus
-}
-#endif
-
-
-#endif // _DBGHELP_
--- a/Game/src/audiolib/assert.h
+++ /dev/null
@@ -1,49 +1,0 @@
-/*
-Copyright (C) 1994-1995 Apogee Software, Ltd.
-
-This program is free software; you can redistribute it and/or
-modify it under the terms of the GNU General Public License
-as published by the Free Software Foundation; either version 2
-of the License, or (at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-
-See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-
-*/
-#if (HAVE_ASSERT_H != 1)
-
-#ifndef    __ASSERT_H
-
-    #define    __ASSERT_H
-
-    #ifdef NDEBUG
-
-        #define ASSERT(f)
-
-    #else
-
-        #pragma aux _Assert aborts;          /* _Assert will not return */
-        extern void _Assert( char *strFile, unsigned  uLine ); /*prototype */
-
-        #define ASSERT(f)          \
-            if (f)                 \
-                ;                  \
-            else                   \
-                _Assert( __FILE__, __LINE__ )
-
-    #endif
-
-#else
-
-    #error Multiple definition of ASSERT()
-
-#endif
-
-#endif //HAVE_ASSERT_H
--- a/Game/src/dummy_audiolib.c
+++ /dev/null
@@ -1,215 +1,0 @@
-//
-//  dummy_audiolib.c
-//  Duke3D
-//
-//  Created by fabien sanglard on 12-12-12.
-//  Copyright (c) 2012 fabien sanglard. All rights reserved.
-//
-
-#include "audiolib/fx_man.h"
-#include <inttypes.h>
-#include <stdio.h>
-//#include "engine_protos.h"
-#include "audiolib/music.h"
-
-//Dummy sound system for when a system has no sound system yet.
-/*
-uint8_t  *FX_ErrorString( int ErrorNumber ){
-   static uint8_t  nope = '\0';
-    return &nope;
-}
-
-int   FX_SetupCard( int SoundCard, fx_device *device ){return 1;}
-int   FX_GetBlasterSettings( fx_blaster_config *blaster ){return 1;}
-int   FX_SetupSoundBlaster( fx_blaster_config blaster, int *MaxVoices, int *MaxSampleBits, int *MaxChannels ){return 1;}
-int   FX_Init( int SoundCard, int numvoices, int numchannels, int samplebits, unsigned mixrate ){return FX_Ok;}
-int   FX_Shutdown( void ){return 1;}
-int   FX_SetCallBack( void ( *function )( uint32_t ) ){return FX_Ok;}
-void  FX_SetVolume( int volume ){}
-int   FX_GetVolume( void ){return 1;}
-
-void  FX_SetReverseStereo( int setting ){}
-int   FX_GetReverseStereo( void ){return 1;}
-void  FX_SetReverb( int reverb ){}
-void  FX_SetFastReverb( int reverb ){}
-int   FX_GetMaxReverbDelay( void ){return 0;}
-int   FX_GetReverbDelay( void ){return 1;}
-void  FX_SetReverbDelay( int delay ){}
-
-int FX_VoiceAvailable( int priority ){return 1;}
-int FX_EndLooping( int handle ){return 1;}
-int FX_SetPan( int handle, int vol, int left, int right ){return 1;}
-int FX_SetPitch( int handle, int pitchoffset ){return 1;}
-int FX_SetFrequency( int handle, int frequency ){return 1;}
-
-int FX_PlayVOC( char  *ptr, int pitchoffset, int vol, int left, int right,
-               int priority, uint32_t callbackval ){return FX_Ok;}
-int FX_PlayLoopedVOC( uint8_t  *ptr, int32_t loopstart, int32_t loopend,
-                     int pitchoffset, int vol, int left, int right, int priority,
-                     uint32_t callbackval ){return FX_Ok;}
-int FX_PlayWAV( uint8_t  *ptr, int pitchoffset, int vol, int left, int right,
-               int priority, uint32_t callbackval ){return FX_Ok;}
-int FX_PlayLoopedWAV( uint8_t  *ptr, int32_t loopstart, int32_t loopend,
-                     int pitchoffset, int vol, int left, int right, int priority,
-                     uint32_t callbackval ){return FX_Ok;}
-int FX_PlayVOC3D( uint8_t  *ptr, int pitchoffset, int angle, int distance,
-                 int priority, uint32_t callbackval ){return FX_Ok;}
-int FX_PlayWAV3D( uint8_t  *ptr, int pitchoffset, int angle, int distance,
-                 int priority, uint32_t callbackval ){return FX_Ok;}
-int FX_PlayRaw( uint8_t  *ptr, uint32_t length, unsigned rate,
-               int pitchoffset, int vol, int left, int right, int priority,
-               uint32_t callbackval ){return FX_Ok;}
-int FX_PlayLoopedRaw( uint8_t  *ptr, uint32_t length, uint8_t  *loopstart,
-                     uint8_t  *loopend, unsigned rate, int pitchoffset, int vol, int left,
-                     int right, int priority, uint32_t callbackval ){return FX_Ok;}
-int FX_Pan3D( int handle, int angle, int distance ){return FX_Ok;}
-int FX_SoundActive( int handle ){return 1;}
-int FX_SoundsPlaying( void ){return 0;}
-int FX_StopSound( int handle ){return 1;}
-int FX_StopAllSounds( void ){return 1;}
-int FX_StartDemandFeedPlayback( void ( *function )( uint8_t  **ptr, uint32_t *length ),
-                               int rate, int pitchoffset, int vol, int left, int right,
-                               int priority, uint32_t callbackval ){return 1;}
-int  FX_StartRecording( int MixRate, void ( *function )( char  *ptr, int length ) ){return 1;}
-void FX_StopRecord( void ){}
-
- */
-
-
-//Dummy music for when a system has no music system yet. 
-
-/*
-char  *MUSIC_ErrorString(int ErrorNumber)
-{
-	return "";
-}
-
-int MUSIC_Init(int SoundCard, int Address)
-{
-	return 0;
-}
-
-int MUSIC_Shutdown(void)
-{
-	return 0;
-}
-
-void MUSIC_SetMaxFMMidiChannel(int channel)
-{
-}
-
-void MUSIC_SetVolume(int volume)
-{
-}
-
-void MUSIC_SetMidiChannelVolume(int channel, int volume)
-{
-}
-
-void MUSIC_ResetMidiChannelVolumes(void)
-{
-}
-
-int MUSIC_GetVolume(void)
-{
-	return 0;
-}
-
-void MUSIC_SetLoopFlag(int loopflag)
-{
-}
-
-int MUSIC_SongPlaying(void)
-{
-	return 0;
-}
-
-void MUSIC_Continue(void)
-{
-}
-
-void MUSIC_Pause(void)
-{
-}
-
-int MUSIC_StopSong(void)
-{
-	return 0;
-}
-
-int MUSIC_PlaySong(uint8_t  *song, int loopflag)
-{
-	return 0;
-}
-
-
-void MUSIC_SetContext(int context)
-{
-}
-
-int MUSIC_GetContext(void)
-{
-	return 0;
-}
-
-void MUSIC_SetSongTick(uint32_t PositionInTicks)
-{
-}
-
-void MUSIC_SetSongTime(uint32_t milliseconds)
-{
-}
-
-void MUSIC_SetSongPosition(int measure, int beat, int tick)
-{
-}
-
-void MUSIC_GetSongPosition(songposition *pos)
-{
-}
-
-void MUSIC_GetSongLength(songposition *pos)
-{
-}
-
-int MUSIC_FadeVolume(int tovolume, int milliseconds)
-{
-	return 0;
-}
-
-int MUSIC_FadeActive(void)
-{
-	return 0;
-}
-
-void MUSIC_StopFade(void)
-{
-}
-
-void MUSIC_RerouteMidiChannel(int channel, int cdecl function( int event, int c1, int c2 ))
-{
-}
-
-void MUSIC_RegisterTimbreBank(uint8_t  *timbres)
-{
-}
-
-void PlayMusic(char* filename)
-{
-    char magicNumber[5];
-    printf("Play music '%s'.\n",filename);
-    int32_t fd = kopen4load(filename,1);
-    if (fd > 0)
-        printf("Found the music size='%d'!\n",kfilelength(fd));
-    
-    kread(fd, magicNumber, 4);
-    magicNumber[4] = 0;
-    
-    //If midi this should be 'MThd' !
-    printf("Magic number='%s'!\n",magicNumber);
-    
-    
-    kclose(fd);
-}
-*/
-
--- a/Game/src/global.h
+++ b/Game/src/global.h
@@ -9,6 +9,8 @@
 #ifndef Duke3D_global_h
 #define Duke3D_global_h
 
+#include <stdint.h>
+
 void FixFilePath(char  *filename);
 int FindDistance3D(int ix, int iy, int iz);
 void Shutdown(void);
@@ -58,8 +60,8 @@
 #define Swapint32_t IntelLong
 #endif
 
-//int32_t MotoLong (int32_t l);
-//int32_t IntelLong (int32_t l);
+int32_t MotoLong (int32_t l);
+int32_t IntelLong (int32_t l);
 
 void Error (int errorType, const char *error, ...);
 
--- /dev/null
+++ b/build_windows.bat
@@ -1,0 +1,2 @@
+build_windows_x86.bat || goto :error
+build_windows_x64.bat || goto :error
\ No newline at end of file
--- /dev/null
+++ b/build_windows_x64.bat
@@ -1,0 +1,14 @@
+cd build || goto :error
+mkdir windows.x64 || goto :error
+cd windows.x64 || goto :error
+cmake -D VCPKG_TARGET_TRIPLET=x64-windows-static -D CMAKE_TOOLCHAIN_FILE=../vcpkg.windows/scripts/buildsystems/vcpkg.cmake -G "Visual Studio 16 2019" -A "x64" ../.. || goto :error
+msbuild BelgianChocolateDuke3D.sln /t:Rebuild /p:Configuration=Release /p:Platform=x64 || goto :error
+cd ..
+cd ..
+
+exit /b
+
+
+:error
+echo Failed with error #%errorlevel%.
+exit /b %errorlevel%
\ No newline at end of file
--- /dev/null
+++ b/build_windows_x86.bat
@@ -1,0 +1,14 @@
+cd build || goto :error
+mkdir windows.x86 || goto :error
+cd windows.x86 || goto :error
+cmake -D VCPKG_TARGET_TRIPLET=x86-windows-static -D CMAKE_TOOLCHAIN_FILE=../vcpkg.windows/scripts/buildsystems/vcpkg.cmake -G "Visual Studio 16 2019" -A "Win32" ../.. || goto :error
+msbuild BelgianChocolateDuke3D.sln /t:Rebuild /p:Configuration=Release /p:Platform=Win32 || goto :error
+cd ..
+cd ..
+
+exit /b
+
+
+:error
+echo Failed with error #%errorlevel%.
+exit /b %errorlevel%
\ No newline at end of file
--- /dev/null
+++ b/cmake/FindENet.cmake
@@ -1,0 +1,48 @@
+# - Try to find enet
+# Once done this will define
+#
+#  ENET_FOUND - system has enet
+#  ENET_INCLUDE_DIRS - the enet include directory
+#  ENET_LIBRARIES - the libraries needed to use enet
+#
+# $ENETDIR is an environment variable used for finding enet.
+#
+#  Borrowed from The Mana World
+#  http://themanaworld.org/
+#
+# Several changes and additions by Fabian 'x3n' Landau
+# Lots of simplifications by Adrian Friedli
+#                 > www.orxonox.net <
+
+FIND_PATH(ENET_INCLUDE_DIRS enet/enet.h
+    PATHS
+    $ENV{ENETDIR}
+    /usr/local
+    /usr
+    PATH_SUFFIXES include
+)
+
+FIND_LIBRARY(ENET_LIBRARY
+    NAMES enet
+    PATHS
+    $ENV{ENETDIR}
+    /usr/local
+    /usr
+    PATH_SUFFIXES lib
+)
+
+# handle the QUIETLY and REQUIRED arguments and set ENET_FOUND to TRUE if
+# all listed variables are TRUE
+INCLUDE(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(ENet DEFAULT_MSG ENET_LIBRARY ENET_INCLUDE_DIRS)
+
+IF (ENET_FOUND)
+    IF(WIN32)
+        SET(WINDOWS_ENET_DEPENDENCIES "ws2_32;winmm")
+        SET(ENET_LIBRARIES ${ENET_LIBRARY} ${WINDOWS_ENET_DEPENDENCIES})
+    ELSE(WIN32)
+        SET(ENET_LIBRARIES ${ENET_LIBRARY})
+    ENDIF(WIN32)
+ENDIF (ENET_FOUND)
+
+MARK_AS_ADVANCED(ENET_LIBRARY ENET_LIBRARIES ENET_INCLUDE_DIRS)