diff --git a/CHANGES.txt b/CHANGES.txt index 0a820a8a..83e622ed 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,8 +1,21 @@ -Visual Leak Detector (VLD) Version 2.5.1 +Visual Leak Detector (VLD) Version 2.5.3 Change Log / Release Notes +2.5.3 (20 March 2019) +---------------------------- + + More fixes + +2.5.2 (30 January 2018) +---------------------------- + Enhancements: + + VS2017 support added. + + Bugs Fixed: + + Fix #10586 VLD interferes with GetLastError(). + + Fix GitHub issue 38, Installation of 2.5.1 on 32-bit Windows 7 fails + 2.5.1 (30 January 2017) ---------------------------- Enhancements: diff --git a/README.md b/README.md index c116bb3f..762c0739 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ We encourage developers who've added their own features, or fixed bugs they've f * [Source code](https://github.com/KindDragon/vld) -Copyright © 2005-2017 VLD Team +Copyright © 2005-2018 VLD Team [1]: https://github.com/KindDragon/vld/wiki [2]: https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=N3QTYHP9LH6UY&lc=GB&item_name=Visual%20Leak%20Detector¤cy_code=USD&bn=PP%2dDonationsBF%3abtn_donate_SM%2egif%3aNonHosted diff --git a/appveyor.yml b/appveyor.yml index e1621f8c..edce052f 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -5,7 +5,7 @@ branches: except: - gh-pages -os: Visual Studio 2015 +os: Visual Studio 2017 environment: GTEST_REPEAT: 1 @@ -13,41 +13,47 @@ environment: matrix: - VldStackWalkMethod: safe Toolset: v90 - Solution: vld_vs14_wo_mfc.sln + Solution: vld_vs15_wo_mfc.sln GTEST_FILTER: -*.Mfc* - VldStackWalkMethod: safe Toolset: v100 - Solution: vld_vs14_wo_mfc.sln + Solution: vld_vs15_wo_mfc.sln GTEST_FILTER: -*.Mfc* - VldStackWalkMethod: safe Toolset: v110 - Solution: vld_vs14_wo_mfc.sln + Solution: vld_vs15_wo_mfc.sln GTEST_FILTER: -*.Mfc* - VldStackWalkMethod: safe Toolset: v120_xp - Solution: vld_vs14.sln + Solution: vld_vs15.sln - VldStackWalkMethod: safe Toolset: v140_xp - Solution: vld_vs14.sln + Solution: vld_vs15.sln + - VldStackWalkMethod: safe + Toolset: v150_xp + Solution: vld_vs15.sln - VldStackWalkMethod: fast Toolset: v90 - Solution: vld_vs14_wo_mfc.sln + Solution: vld_vs15_wo_mfc.sln GTEST_FILTER: -*.Mfc* - VldStackWalkMethod: fast Toolset: v100 - Solution: vld_vs14_wo_mfc.sln + Solution: vld_vs15_wo_mfc.sln GTEST_FILTER: -*.Mfc* - VldStackWalkMethod: fast Toolset: v110 - Solution: vld_vs14_wo_mfc.sln + Solution: vld_vs15_wo_mfc.sln GTEST_FILTER: -*.Mfc* - VldStackWalkMethod: fast Toolset: v120_xp - Solution: vld_vs14.sln + Solution: vld_vs15.sln - VldStackWalkMethod: fast Toolset: v140_xp - Solution: vld_vs14.sln + Solution: vld_vs15.sln + - VldStackWalkMethod: fast + Toolset: v150_xp + Solution: vld_vs15.sln platform: - Win32 diff --git a/lib/dbghelp/include/DbgHelp.h b/lib/dbghelp/include/DbgHelp.h index cfd863b7..fa0dd183 100644 --- a/lib/dbghelp/include/DbgHelp.h +++ b/lib/dbghelp/include/DbgHelp.h @@ -24,6 +24,11 @@ Revision History: #pragma once #endif +#include + +#pragma region Desktop Family or WER Package +#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_PKG_WER) + // As a general principal always call the 64 bit version // of every API, if a choice exists. The 64 bit version @@ -38,68 +43,6 @@ Revision History: #include -// For those without specstrings.h -// Since there are different versions of this header, I need to -// individually test each item and define it if it is not around. - -#ifndef __in - #define __in -#endif -#ifndef __out - #define __out -#endif -#ifndef __inout - #define __inout -#endif -#ifndef __in_opt - #define __in_opt -#endif -#ifndef __out_opt - #define __out_opt -#endif -#ifndef __inout_opt - #define __inout_opt -#endif -#ifndef __in_ecount - #define __in_ecount(x) -#endif -#ifndef __out_ecount - #define __out_ecount(x) -#endif -#ifndef __inout_ecount - #define __inout_ecount(x) -#endif -#ifndef __in_bcount - #define __in_bcount(x) -#endif -#ifndef __out_bcount - #define __out_bcount(x) -#endif -#ifndef __inout_bcount - #define __inout_bcount(x) -#endif -#ifndef __out_xcount - #define __out_xcount(x) -#endif -#ifndef __deref_opt_out - #define __deref_opt_out -#endif -#ifndef __deref_out - #define __deref_out -#endif -#ifndef __out_ecount_opt - #define __out_ecount_opt(x) -#endif -#ifndef __in_bcount_opt - #define __in_bcount_opt(x) -#endif -#ifndef __out_bcount_opt - #define __out_bcount_opt(x) -#endif -#ifndef __deref_out_opt - #define __deref_out_opt -#endif - #ifdef __cplusplus extern "C" { @@ -124,10 +67,10 @@ extern "C" { // Observant readers may notice that 2 new fields, // 'fReadOnly' and 'Version' have been added to // the LOADED_IMAGE structure after 'fDOSImage'. -// This does not change the size of the structure -// from previous headers. That is because while -// 'fDOSImage' is a byte, it is padded by the -// compiler to 4 bytes. So the 2 new fields are +// This does not change the size of the structure +// from previous headers. That is because while +// 'fDOSImage' is a byte, it is padded by the +// compiler to 4 bytes. So the 2 new fields are // slipped into the extra space. typedef struct _LOADED_IMAGE { @@ -164,210 +107,210 @@ typedef struct _LOADED_IMAGE { typedef BOOL (CALLBACK *PFIND_DEBUG_FILE_CALLBACK)( - __in HANDLE FileHandle, - __in PCSTR FileName, - __in PVOID CallerData + _In_ HANDLE FileHandle, + _In_ PCSTR FileName, + _In_ PVOID CallerData ); HANDLE IMAGEAPI SymFindDebugInfoFile( - __in HANDLE hProcess, - __in PCSTR FileName, - __out_ecount(MAX_PATH + 1) PSTR DebugFilePath, - __in_opt PFIND_DEBUG_FILE_CALLBACK Callback, - __in_opt PVOID CallerData + _In_ HANDLE hProcess, + _In_ PCSTR FileName, + _Out_writes_(MAX_PATH + 1) PSTR DebugFilePath, + _In_opt_ PFIND_DEBUG_FILE_CALLBACK Callback, + _In_opt_ PVOID CallerData ); typedef BOOL (CALLBACK *PFIND_DEBUG_FILE_CALLBACKW)( - __in HANDLE FileHandle, - __in PCWSTR FileName, - __in PVOID CallerData + _In_ HANDLE FileHandle, + _In_ PCWSTR FileName, + _In_ PVOID CallerData ); HANDLE IMAGEAPI SymFindDebugInfoFileW( - __in HANDLE hProcess, - __in PCWSTR FileName, - __out_ecount(MAX_PATH + 1) PWSTR DebugFilePath, - __in_opt PFIND_DEBUG_FILE_CALLBACKW Callback, - __in_opt PVOID CallerData + _In_ HANDLE hProcess, + _In_ PCWSTR FileName, + _Out_writes_(MAX_PATH + 1) PWSTR DebugFilePath, + _In_opt_ PFIND_DEBUG_FILE_CALLBACKW Callback, + _In_opt_ PVOID CallerData ); HANDLE IMAGEAPI FindDebugInfoFile ( - __in PCSTR FileName, - __in PCSTR SymbolPath, - __out_ecount(MAX_PATH + 1) PSTR DebugFilePath + _In_ PCSTR FileName, + _In_ PCSTR SymbolPath, + _Out_writes_(MAX_PATH + 1) PSTR DebugFilePath ); HANDLE IMAGEAPI FindDebugInfoFileEx ( - __in PCSTR FileName, - __in PCSTR SymbolPath, - __out_ecount(MAX_PATH + 1) PSTR DebugFilePath, - __in_opt PFIND_DEBUG_FILE_CALLBACK Callback, - __in_opt PVOID CallerData + _In_ PCSTR FileName, + _In_ PCSTR SymbolPath, + _Out_writes_(MAX_PATH + 1) PSTR DebugFilePath, + _In_opt_ PFIND_DEBUG_FILE_CALLBACK Callback, + _In_opt_ PVOID CallerData ); HANDLE IMAGEAPI FindDebugInfoFileExW ( - __in PCWSTR FileName, - __in PCWSTR SymbolPath, - __out_ecount(MAX_PATH + 1) PWSTR DebugFilePath, - __in_opt PFIND_DEBUG_FILE_CALLBACKW Callback, - __in_opt PVOID CallerData + _In_ PCWSTR FileName, + _In_ PCWSTR SymbolPath, + _Out_writes_(MAX_PATH + 1) PWSTR DebugFilePath, + _In_opt_ PFIND_DEBUG_FILE_CALLBACKW Callback, + _In_opt_ PVOID CallerData ); typedef BOOL (CALLBACK *PFINDFILEINPATHCALLBACK)( - __in PCSTR filename, - __in PVOID context + _In_ PCSTR filename, + _In_ PVOID context ); BOOL IMAGEAPI SymFindFileInPath( - __in HANDLE hprocess, - __in_opt PCSTR SearchPath, - __in PCSTR FileName, - __in_opt PVOID id, - __in DWORD two, - __in DWORD three, - __in DWORD flags, - __out_ecount(MAX_PATH + 1) PSTR FoundFile, - __in_opt PFINDFILEINPATHCALLBACK callback, - __in_opt PVOID context + _In_ HANDLE hprocess, + _In_opt_ PCSTR SearchPath, + _In_ PCSTR FileName, + _In_opt_ PVOID id, + _In_ DWORD two, + _In_ DWORD three, + _In_ DWORD flags, + _Out_writes_(MAX_PATH + 1) PSTR FoundFile, + _In_opt_ PFINDFILEINPATHCALLBACK callback, + _In_opt_ PVOID context ); typedef BOOL (CALLBACK *PFINDFILEINPATHCALLBACKW)( - __in PCWSTR filename, - __in PVOID context + _In_ PCWSTR filename, + _In_ PVOID context ); BOOL IMAGEAPI SymFindFileInPathW( - __in HANDLE hprocess, - __in_opt PCWSTR SearchPath, - __in PCWSTR FileName, - __in_opt PVOID id, - __in DWORD two, - __in DWORD three, - __in DWORD flags, - __out_ecount(MAX_PATH + 1) PWSTR FoundFile, - __in_opt PFINDFILEINPATHCALLBACKW callback, - __in_opt PVOID context + _In_ HANDLE hprocess, + _In_opt_ PCWSTR SearchPath, + _In_ PCWSTR FileName, + _In_opt_ PVOID id, + _In_ DWORD two, + _In_ DWORD three, + _In_ DWORD flags, + _Out_writes_(MAX_PATH + 1) PWSTR FoundFile, + _In_opt_ PFINDFILEINPATHCALLBACKW callback, + _In_opt_ PVOID context ); typedef BOOL (CALLBACK *PFIND_EXE_FILE_CALLBACK)( - __in HANDLE FileHandle, - __in PCSTR FileName, - __in_opt PVOID CallerData + _In_ HANDLE FileHandle, + _In_ PCSTR FileName, + _In_opt_ PVOID CallerData ); HANDLE IMAGEAPI SymFindExecutableImage( - __in HANDLE hProcess, - __in PCSTR FileName, - __out_ecount(MAX_PATH + 1) PSTR ImageFilePath, - __in PFIND_EXE_FILE_CALLBACK Callback, - __in PVOID CallerData + _In_ HANDLE hProcess, + _In_ PCSTR FileName, + _Out_writes_(MAX_PATH + 1) PSTR ImageFilePath, + _In_ PFIND_EXE_FILE_CALLBACK Callback, + _In_ PVOID CallerData ); typedef BOOL (CALLBACK *PFIND_EXE_FILE_CALLBACKW)( - __in HANDLE FileHandle, - __in PCWSTR FileName, - __in_opt PVOID CallerData + _In_ HANDLE FileHandle, + _In_ PCWSTR FileName, + _In_opt_ PVOID CallerData ); HANDLE IMAGEAPI SymFindExecutableImageW( - __in HANDLE hProcess, - __in PCWSTR FileName, - __out_ecount(MAX_PATH + 1) PWSTR ImageFilePath, - __in PFIND_EXE_FILE_CALLBACKW Callback, - __in PVOID CallerData + _In_ HANDLE hProcess, + _In_ PCWSTR FileName, + _Out_writes_(MAX_PATH + 1) PWSTR ImageFilePath, + _In_ PFIND_EXE_FILE_CALLBACKW Callback, + _In_ PVOID CallerData ); HANDLE IMAGEAPI FindExecutableImage( - __in PCSTR FileName, - __in PCSTR SymbolPath, - __out_ecount(MAX_PATH + 1) PSTR ImageFilePath + _In_ PCSTR FileName, + _In_ PCSTR SymbolPath, + _Out_writes_(MAX_PATH + 1) PSTR ImageFilePath ); HANDLE IMAGEAPI FindExecutableImageEx( - __in PCSTR FileName, - __in PCSTR SymbolPath, - __out_ecount(MAX_PATH + 1) PSTR ImageFilePath, - __in_opt PFIND_EXE_FILE_CALLBACK Callback, - __in_opt PVOID CallerData + _In_ PCSTR FileName, + _In_ PCSTR SymbolPath, + _Out_writes_(MAX_PATH + 1) PSTR ImageFilePath, + _In_opt_ PFIND_EXE_FILE_CALLBACK Callback, + _In_opt_ PVOID CallerData ); HANDLE IMAGEAPI FindExecutableImageExW( - __in PCWSTR FileName, - __in PCWSTR SymbolPath, - __out_ecount(MAX_PATH + 1) PWSTR ImageFilePath, - __in_opt PFIND_EXE_FILE_CALLBACKW Callback, - __in PVOID CallerData + _In_ PCWSTR FileName, + _In_ PCWSTR SymbolPath, + _Out_writes_(MAX_PATH + 1) PWSTR ImageFilePath, + _In_opt_ PFIND_EXE_FILE_CALLBACKW Callback, + _In_ PVOID CallerData ); PIMAGE_NT_HEADERS IMAGEAPI ImageNtHeader ( - __in PVOID Base + _In_ PVOID Base ); PVOID IMAGEAPI ImageDirectoryEntryToDataEx ( - __in PVOID Base, - __in BOOLEAN MappedAsImage, - __in USHORT DirectoryEntry, - __out PULONG Size, - __out_opt PIMAGE_SECTION_HEADER *FoundHeader + _In_ PVOID Base, + _In_ BOOLEAN MappedAsImage, + _In_ USHORT DirectoryEntry, + _Out_ PULONG Size, + _Out_opt_ PIMAGE_SECTION_HEADER *FoundHeader ); PVOID IMAGEAPI ImageDirectoryEntryToData ( - __in PVOID Base, - __in BOOLEAN MappedAsImage, - __in USHORT DirectoryEntry, - __out PULONG Size + _In_ PVOID Base, + _In_ BOOLEAN MappedAsImage, + _In_ USHORT DirectoryEntry, + _Out_ PULONG Size ); PIMAGE_SECTION_HEADER IMAGEAPI ImageRvaToSection( - __in PIMAGE_NT_HEADERS NtHeaders, - __in PVOID Base, - __in ULONG Rva + _In_ PIMAGE_NT_HEADERS NtHeaders, + _In_ PVOID Base, + _In_ ULONG Rva ); PVOID IMAGEAPI ImageRvaToVa( - __in PIMAGE_NT_HEADERS NtHeaders, - __in PVOID Base, - __in ULONG Rva, - __in_opt OUT PIMAGE_SECTION_HEADER *LastRvaSection + _In_ PIMAGE_NT_HEADERS NtHeaders, + _In_ PVOID Base, + _In_ ULONG Rva, + _In_opt_ OUT PIMAGE_SECTION_HEADER *LastRvaSection ); #ifndef _WIN64 @@ -423,16 +366,16 @@ typedef struct _IMAGE_DEBUG_INFORMATION { PIMAGE_DEBUG_INFORMATION IMAGEAPI MapDebugInformation( - __in_opt HANDLE FileHandle, - __in PCSTR FileName, - __in_opt PCSTR SymbolPath, - __in ULONG ImageBase + _In_opt_ HANDLE FileHandle, + _In_ PCSTR FileName, + _In_opt_ PCSTR SymbolPath, + _In_ ULONG ImageBase ); BOOL IMAGEAPI UnmapDebugInformation( - __out_xcount(unknown) PIMAGE_DEBUG_INFORMATION DebugInfo + _Out_writes_(_Inexpressible_(unknown)) PIMAGE_DEBUG_INFORMATION DebugInfo ); #endif @@ -440,57 +383,57 @@ UnmapDebugInformation( BOOL IMAGEAPI SearchTreeForFile( - __in PCSTR RootPath, - __in PCSTR InputPathName, - __out_ecount(MAX_PATH + 1) PSTR OutputPathBuffer + _In_ PCSTR RootPath, + _In_ PCSTR InputPathName, + _Out_writes_(MAX_PATH + 1) PSTR OutputPathBuffer ); BOOL IMAGEAPI SearchTreeForFileW( - __in PCWSTR RootPath, - __in PCWSTR InputPathName, - __out_ecount(MAX_PATH + 1) PWSTR OutputPathBuffer + _In_ PCWSTR RootPath, + _In_ PCWSTR InputPathName, + _Out_writes_(MAX_PATH + 1) PWSTR OutputPathBuffer ); typedef BOOL (CALLBACK *PENUMDIRTREE_CALLBACK)( - __in PCSTR FilePath, - __in_opt PVOID CallerData + _In_ PCSTR FilePath, + _In_opt_ PVOID CallerData ); BOOL IMAGEAPI EnumDirTree( - __in_opt HANDLE hProcess, - __in PCSTR RootPath, - __in PCSTR InputPathName, - __out_ecount_opt(MAX_PATH + 1) PSTR OutputPathBuffer, - __in_opt PENUMDIRTREE_CALLBACK cb, - __in_opt PVOID data + _In_opt_ HANDLE hProcess, + _In_ PCSTR RootPath, + _In_ PCSTR InputPathName, + _Out_writes_opt_(MAX_PATH + 1) PSTR OutputPathBuffer, + _In_opt_ PENUMDIRTREE_CALLBACK cb, + _In_opt_ PVOID data ); typedef BOOL (CALLBACK *PENUMDIRTREE_CALLBACKW)( - __in PCWSTR FilePath, - __in_opt PVOID CallerData + _In_ PCWSTR FilePath, + _In_opt_ PVOID CallerData ); BOOL IMAGEAPI EnumDirTreeW( - __in_opt HANDLE hProcess, - __in PCWSTR RootPath, - __in PCWSTR InputPathName, - __out_ecount_opt(MAX_PATH + 1) PWSTR OutputPathBuffer, - __in_opt PENUMDIRTREE_CALLBACKW cb, - __in_opt PVOID data + _In_opt_ HANDLE hProcess, + _In_ PCWSTR RootPath, + _In_ PCWSTR InputPathName, + _Out_writes_opt_(MAX_PATH + 1) PWSTR OutputPathBuffer, + _In_opt_ PENUMDIRTREE_CALLBACKW cb, + _In_opt_ PVOID data ); BOOL IMAGEAPI MakeSureDirectoryPathExists( - __in PCSTR DirPath + _In_ PCSTR DirPath ); // @@ -520,20 +463,20 @@ DWORD IMAGEAPI WINAPI UnDecorateSymbolName( - __in PCSTR name, - __out_ecount(maxStringLength) PSTR outputString, - __in DWORD maxStringLength, - __in DWORD flags + _In_ PCSTR name, + _Out_writes_(maxStringLength) PSTR outputString, + _In_ DWORD maxStringLength, + _In_ DWORD flags ); DWORD IMAGEAPI WINAPI UnDecorateSymbolNameW( - __in PCWSTR name, - __out_ecount(maxStringLength) PWSTR outputString, - __in DWORD maxStringLength, - __in DWORD flags + _In_ PCWSTR name, + _Out_writes_(maxStringLength) PWSTR outputString, + _In_ DWORD maxStringLength, + _In_ DWORD flags ); // @@ -563,8 +506,8 @@ typedef struct _MODLOAD_CVMISC { } MODLOAD_CVMISC, *PMODLOAD_CVMISC; typedef struct _MODLOAD_PDBGUID_PDBAGE { - GUID PdbGuid; // Pdb Guid - DWORD PdbAge; // Pdb Age + GUID PdbGuid; // Pdb Guid + DWORD PdbAge; // Pdb Age } MODLOAD_PDBGUID_PDBAGE, *PMODLOAD_PDBGUID_PDBAGE; // @@ -597,8 +540,8 @@ typedef struct _tagADDRESS { __inline void Address32To64( - __in LPADDRESS a32, - __out LPADDRESS64 a64 + _In_ LPADDRESS a32, + _Out_ LPADDRESS64 a64 ) { a64->Offset = (ULONG64)(LONG64)(LONG)a32->Offset; @@ -609,8 +552,8 @@ Address32To64( __inline void Address64To32( - __in LPADDRESS64 a64, - __out LPADDRESS a32 + _In_ LPADDRESS64 a64, + _Out_ LPADDRESS a32 ) { a32->Offset = (ULONG)a64->Offset; @@ -687,7 +630,12 @@ typedef struct _KDHELP64 { DWORD64 StackBase; DWORD64 StackLimit; - DWORD64 Reserved[5]; + // + // Target OS build number. Added in API version 12. + // + DWORD BuildVersion; + DWORD Reserved0; + DWORD64 Reserved1[4]; } KDHELP64, *PKDHELP64; @@ -758,8 +706,8 @@ typedef struct _KDHELP { __inline void KdHelp32To64( - __in PKDHELP p32, - __out PKDHELP64 p64 + _In_ PKDHELP p32, + _Out_ PKDHELP64 p64 ) { p64->Thread = p32->Thread; @@ -789,6 +737,28 @@ typedef struct _tagSTACKFRAME64 { KDHELP64 KdHelp; } STACKFRAME64, *LPSTACKFRAME64; +#define INLINE_FRAME_CONTEXT_INIT 0 +#define INLINE_FRAME_CONTEXT_IGNORE 0xFFFFFFFF + +typedef struct _tagSTACKFRAME_EX { + // First, STACKFRAME64 structure + 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; + + // Extended STACKFRAME fields + DWORD StackFrameSize; + DWORD InlineFrameContext; +} STACKFRAME_EX, *LPSTACKFRAME_EX; + #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64) #define STACKFRAME STACKFRAME64 #define LPSTACKFRAME LPSTACKFRAME64 @@ -808,51 +778,67 @@ typedef struct _tagSTACKFRAME { } STACKFRAME, *LPSTACKFRAME; #endif - typedef BOOL (__stdcall *PREAD_PROCESS_MEMORY_ROUTINE64)( - __in HANDLE hProcess, - __in DWORD64 qwBaseAddress, - __out_bcount(nSize) PVOID lpBuffer, - __in DWORD nSize, - __out LPDWORD lpNumberOfBytesRead + _In_ HANDLE hProcess, + _In_ DWORD64 qwBaseAddress, + _Out_writes_bytes_(nSize) PVOID lpBuffer, + _In_ DWORD nSize, + _Out_ LPDWORD lpNumberOfBytesRead ); typedef PVOID (__stdcall *PFUNCTION_TABLE_ACCESS_ROUTINE64)( - __in HANDLE ahProcess, - __in DWORD64 AddrBase + _In_ HANDLE ahProcess, + _In_ DWORD64 AddrBase ); typedef DWORD64 (__stdcall *PGET_MODULE_BASE_ROUTINE64)( - __in HANDLE hProcess, - __in DWORD64 Address + _In_ HANDLE hProcess, + _In_ DWORD64 Address ); typedef DWORD64 (__stdcall *PTRANSLATE_ADDRESS_ROUTINE64)( - __in HANDLE hProcess, - __in HANDLE hThread, - __in LPADDRESS64 lpaddr + _In_ HANDLE hProcess, + _In_ HANDLE hThread, + _In_ LPADDRESS64 lpaddr ); BOOL IMAGEAPI StackWalk64( - __in DWORD MachineType, - __in HANDLE hProcess, - __in HANDLE hThread, - __inout LPSTACKFRAME64 StackFrame, - __inout PVOID ContextRecord, - __in_opt PREAD_PROCESS_MEMORY_ROUTINE64 ReadMemoryRoutine, - __in_opt PFUNCTION_TABLE_ACCESS_ROUTINE64 FunctionTableAccessRoutine, - __in_opt PGET_MODULE_BASE_ROUTINE64 GetModuleBaseRoutine, - __in_opt PTRANSLATE_ADDRESS_ROUTINE64 TranslateAddress + _In_ DWORD MachineType, + _In_ HANDLE hProcess, + _In_ HANDLE hThread, + _Inout_ LPSTACKFRAME64 StackFrame, + _Inout_ PVOID ContextRecord, + _In_opt_ PREAD_PROCESS_MEMORY_ROUTINE64 ReadMemoryRoutine, + _In_opt_ PFUNCTION_TABLE_ACCESS_ROUTINE64 FunctionTableAccessRoutine, + _In_opt_ PGET_MODULE_BASE_ROUTINE64 GetModuleBaseRoutine, + _In_opt_ PTRANSLATE_ADDRESS_ROUTINE64 TranslateAddress + ); + +#define SYM_STKWALK_DEFAULT 0x00000000 +#define SYM_STKWALK_FORCE_FRAMEPTR 0x00000001 +BOOL +IMAGEAPI +StackWalkEx( + _In_ DWORD MachineType, + _In_ HANDLE hProcess, + _In_ HANDLE hThread, + _Inout_ LPSTACKFRAME_EX StackFrame, + _Inout_ PVOID ContextRecord, + _In_opt_ PREAD_PROCESS_MEMORY_ROUTINE64 ReadMemoryRoutine, + _In_opt_ PFUNCTION_TABLE_ACCESS_ROUTINE64 FunctionTableAccessRoutine, + _In_opt_ PGET_MODULE_BASE_ROUTINE64 GetModuleBaseRoutine, + _In_opt_ PTRANSLATE_ADDRESS_ROUTINE64 TranslateAddress, + _In_ DWORD Flags ); #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64) @@ -869,53 +855,53 @@ StackWalk64( typedef BOOL (__stdcall *PREAD_PROCESS_MEMORY_ROUTINE)( - __in HANDLE hProcess, - __in DWORD lpBaseAddress, - __out_bcount(nSize) PVOID lpBuffer, - __in DWORD nSize, - __out PDWORD lpNumberOfBytesRead + _In_ HANDLE hProcess, + _In_ DWORD lpBaseAddress, + _Out_writes_bytes_(nSize) PVOID lpBuffer, + _In_ DWORD nSize, + _Out_ PDWORD lpNumberOfBytesRead ); typedef PVOID (__stdcall *PFUNCTION_TABLE_ACCESS_ROUTINE)( - __in HANDLE hProcess, - __in DWORD AddrBase + _In_ HANDLE hProcess, + _In_ DWORD AddrBase ); typedef DWORD (__stdcall *PGET_MODULE_BASE_ROUTINE)( - __in HANDLE hProcess, - __in DWORD Address + _In_ HANDLE hProcess, + _In_ DWORD Address ); typedef DWORD (__stdcall *PTRANSLATE_ADDRESS_ROUTINE)( - __in HANDLE hProcess, - __in HANDLE hThread, - __out LPADDRESS lpaddr + _In_ HANDLE hProcess, + _In_ HANDLE hThread, + _Out_ LPADDRESS lpaddr ); BOOL IMAGEAPI StackWalk( DWORD MachineType, - __in HANDLE hProcess, - __in HANDLE hThread, - __inout LPSTACKFRAME StackFrame, - __inout PVOID ContextRecord, - __in_opt PREAD_PROCESS_MEMORY_ROUTINE ReadMemoryRoutine, - __in_opt PFUNCTION_TABLE_ACCESS_ROUTINE FunctionTableAccessRoutine, - __in_opt PGET_MODULE_BASE_ROUTINE GetModuleBaseRoutine, - __in_opt PTRANSLATE_ADDRESS_ROUTINE TranslateAddress + _In_ HANDLE hProcess, + _In_ HANDLE hThread, + _Inout_ LPSTACKFRAME StackFrame, + _Inout_ PVOID ContextRecord, + _In_opt_ PREAD_PROCESS_MEMORY_ROUTINE ReadMemoryRoutine, + _In_opt_ PFUNCTION_TABLE_ACCESS_ROUTINE FunctionTableAccessRoutine, + _In_opt_ PGET_MODULE_BASE_ROUTINE GetModuleBaseRoutine, + _In_opt_ PTRANSLATE_ADDRESS_ROUTINE TranslateAddress ); #endif -#define API_VERSION_NUMBER 11 +#define API_VERSION_NUMBER 12 typedef struct API_VERSION { USHORT MajorVersion; @@ -933,13 +919,13 @@ ImagehlpApiVersion( LPAPI_VERSION IMAGEAPI ImagehlpApiVersionEx( - __in LPAPI_VERSION AppVersion + _In_ LPAPI_VERSION AppVersion ); DWORD IMAGEAPI GetTimestampForLoadedLibrary( - __in HMODULE Module + _In_ HMODULE Module ); // @@ -947,72 +933,72 @@ GetTimestampForLoadedLibrary( // typedef BOOL (CALLBACK *PSYM_ENUMMODULES_CALLBACK64)( - __in PCSTR ModuleName, - __in DWORD64 BaseOfDll, - __in_opt PVOID UserContext + _In_ PCSTR ModuleName, + _In_ DWORD64 BaseOfDll, + _In_opt_ PVOID UserContext ); typedef BOOL (CALLBACK *PSYM_ENUMMODULES_CALLBACKW64)( - __in PCWSTR ModuleName, - __in DWORD64 BaseOfDll, - __in_opt PVOID UserContext + _In_ PCWSTR ModuleName, + _In_ DWORD64 BaseOfDll, + _In_opt_ PVOID UserContext ); typedef BOOL (CALLBACK *PENUMLOADED_MODULES_CALLBACK64)( - __in PCSTR ModuleName, - __in DWORD64 ModuleBase, - __in ULONG ModuleSize, - __in_opt PVOID UserContext + _In_ PCSTR ModuleName, + _In_ DWORD64 ModuleBase, + _In_ ULONG ModuleSize, + _In_opt_ PVOID UserContext ); typedef BOOL (CALLBACK *PENUMLOADED_MODULES_CALLBACKW64)( - __in PCWSTR ModuleName, - __in DWORD64 ModuleBase, - __in ULONG ModuleSize, - __in_opt PVOID UserContext + _In_ PCWSTR ModuleName, + _In_ DWORD64 ModuleBase, + _In_ ULONG ModuleSize, + _In_opt_ PVOID UserContext ); typedef BOOL (CALLBACK *PSYM_ENUMSYMBOLS_CALLBACK64)( - __in PCSTR SymbolName, - __in DWORD64 SymbolAddress, - __in ULONG SymbolSize, - __in_opt PVOID UserContext + _In_ PCSTR SymbolName, + _In_ DWORD64 SymbolAddress, + _In_ ULONG SymbolSize, + _In_opt_ PVOID UserContext ); typedef BOOL (CALLBACK *PSYM_ENUMSYMBOLS_CALLBACK64W)( - __in PCWSTR SymbolName, - __in DWORD64 SymbolAddress, - __in ULONG SymbolSize, - __in_opt PVOID UserContext + _In_ PCWSTR SymbolName, + _In_ DWORD64 SymbolAddress, + _In_ ULONG SymbolSize, + _In_opt_ PVOID UserContext ); typedef BOOL (CALLBACK *PSYMBOL_REGISTERED_CALLBACK64)( - __in HANDLE hProcess, - __in ULONG ActionCode, - __in_opt ULONG64 CallbackData, - __in_opt ULONG64 UserContext + _In_ HANDLE hProcess, + _In_ ULONG ActionCode, + _In_opt_ ULONG64 CallbackData, + _In_opt_ ULONG64 UserContext ); typedef PVOID (CALLBACK *PSYMBOL_FUNCENTRY_CALLBACK)( - __in HANDLE hProcess, - __in DWORD AddrBase, - __in_opt PVOID UserContext + _In_ HANDLE hProcess, + _In_ DWORD AddrBase, + _In_opt_ PVOID UserContext ); typedef PVOID (CALLBACK *PSYMBOL_FUNCENTRY_CALLBACK64)( - __in HANDLE hProcess, - __in ULONG64 AddrBase, - __in ULONG64 UserContext + _In_ HANDLE hProcess, + _In_ ULONG64 AddrBase, + _In_ ULONG64 UserContext ); #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64) @@ -1028,41 +1014,41 @@ PVOID typedef BOOL (CALLBACK *PSYM_ENUMMODULES_CALLBACK)( - __in PCSTR ModuleName, - __in ULONG BaseOfDll, - __in_opt PVOID UserContext + _In_ PCSTR ModuleName, + _In_ ULONG BaseOfDll, + _In_opt_ PVOID UserContext ); typedef BOOL (CALLBACK *PSYM_ENUMSYMBOLS_CALLBACK)( - __in PCSTR SymbolName, - __in ULONG SymbolAddress, - __in ULONG SymbolSize, - __in_opt PVOID UserContext + _In_ PCSTR SymbolName, + _In_ ULONG SymbolAddress, + _In_ ULONG SymbolSize, + _In_opt_ PVOID UserContext ); typedef BOOL (CALLBACK *PSYM_ENUMSYMBOLS_CALLBACKW)( - __in PCWSTR SymbolName, - __in ULONG SymbolAddress, - __in ULONG SymbolSize, - __in_opt PVOID UserContext + _In_ PCWSTR SymbolName, + _In_ ULONG SymbolAddress, + _In_ ULONG SymbolSize, + _In_opt_ PVOID UserContext ); typedef BOOL (CALLBACK *PENUMLOADED_MODULES_CALLBACK)( - __in PCSTR ModuleName, - __in ULONG ModuleBase, - __in ULONG ModuleSize, - __in_opt PVOID UserContext + _In_ PCSTR ModuleName, + _In_ ULONG ModuleBase, + _In_ ULONG ModuleSize, + _In_opt_ PVOID UserContext ); typedef BOOL (CALLBACK *PSYMBOL_REGISTERED_CALLBACK)( - __in HANDLE hProcess, - __in ULONG ActionCode, - __in_opt PVOID CallbackData, - __in_opt PVOID UserContext + _In_ HANDLE hProcess, + _In_ ULONG ActionCode, + _In_opt_ PVOID CallbackData, + _In_opt_ PVOID UserContext ); #endif @@ -1113,6 +1099,17 @@ enum SymTagEnum SymTagCustomType, SymTagManagedType, SymTagDimension, + SymTagCallSite, + SymTagInlineSite, + SymTagBaseInterface, + SymTagVectorType, + SymTagMatrixType, + SymTagHLSLType, + SymTagCaller, + SymTagCallee, + SymTagExport, + SymTagHeapAllocationSite, + SymTagCoffGroup, SymTagMax }; @@ -1122,23 +1119,27 @@ enum SymTagEnum // flags found in SYMBOL_INFO.Flags // -#define SYMFLAG_VALUEPRESENT 0x00000001 -#define SYMFLAG_REGISTER 0x00000008 -#define SYMFLAG_REGREL 0x00000010 -#define SYMFLAG_FRAMEREL 0x00000020 -#define SYMFLAG_PARAMETER 0x00000040 -#define SYMFLAG_LOCAL 0x00000080 -#define SYMFLAG_CONSTANT 0x00000100 -#define SYMFLAG_EXPORT 0x00000200 -#define SYMFLAG_FORWARDER 0x00000400 -#define SYMFLAG_FUNCTION 0x00000800 -#define SYMFLAG_VIRTUAL 0x00001000 -#define SYMFLAG_THUNK 0x00002000 -#define SYMFLAG_TLSREL 0x00004000 -#define SYMFLAG_SLOT 0x00008000 -#define SYMFLAG_ILREL 0x00010000 -#define SYMFLAG_METADATA 0x00020000 -#define SYMFLAG_CLR_TOKEN 0x00040000 +#define SYMFLAG_VALUEPRESENT 0x00000001 +#define SYMFLAG_REGISTER 0x00000008 +#define SYMFLAG_REGREL 0x00000010 +#define SYMFLAG_FRAMEREL 0x00000020 +#define SYMFLAG_PARAMETER 0x00000040 +#define SYMFLAG_LOCAL 0x00000080 +#define SYMFLAG_CONSTANT 0x00000100 +#define SYMFLAG_EXPORT 0x00000200 +#define SYMFLAG_FORWARDER 0x00000400 +#define SYMFLAG_FUNCTION 0x00000800 +#define SYMFLAG_VIRTUAL 0x00001000 +#define SYMFLAG_THUNK 0x00002000 +#define SYMFLAG_TLSREL 0x00004000 +#define SYMFLAG_SLOT 0x00008000 +#define SYMFLAG_ILREL 0x00010000 +#define SYMFLAG_METADATA 0x00020000 +#define SYMFLAG_CLR_TOKEN 0x00040000 +#define SYMFLAG_NULL 0x00080000 +#define SYMFLAG_FUNC_NO_RETURN 0x00100000 +#define SYMFLAG_SYNTHETIC_ZEROBASE 0x00200000 +#define SYMFLAG_PUBLIC_CODE 0x00400000 // this resets SymNext/Prev to the beginning // of the module passed in the address field @@ -1266,6 +1267,9 @@ typedef struct _IMAGEHLP_MODULE64 { // new elements: 17-Dec-2003 BOOL SourceIndexed; // pdb supports source server BOOL Publics; // contains public symbols + // new element: 15-Jul-2009 + DWORD MachineType; // IMAGE_FILE_MACHINE_XXX from ntimage.h and winnt.h + DWORD Reserved; // Padding - don't remove. } IMAGEHLP_MODULE64, *PIMAGEHLP_MODULE64; typedef struct _IMAGEHLP_MODULEW64 { @@ -1294,6 +1298,9 @@ typedef struct _IMAGEHLP_MODULEW64 { // new elements: 17-Dec-2003 BOOL SourceIndexed; // pdb supports source server BOOL Publics; // contains public symbols + // new element: 15-Jul-2009 + DWORD MachineType; // IMAGE_FILE_MACHINE_XXX from ntimage.h and winnt.h + DWORD Reserved; // Padding - don't remove. } IMAGEHLP_MODULEW64, *PIMAGEHLP_MODULEW64; #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64) @@ -1401,6 +1408,11 @@ typedef struct _SOURCEFILEW { #define CBA_DEBUG_INFO 0x10000000 #define CBA_SRCSRV_INFO 0x20000000 #define CBA_SRCSRV_EVENT 0x40000000 +#define CBA_UPDATE_STATUS_BAR 0x50000000 +#define CBA_ENGINE_PRESENT 0x60000000 +#define CBA_CHECK_ENGOPT_DISALLOW_NETWORK_PATHS 0x70000000 +#define CBA_CHECK_ARM_MACHINE_THUMB_TYPE_OVERRIDE 0x80000000 + typedef struct _IMAGEHLP_CBA_READ_MEMORY { DWORD64 addr; // address to read from @@ -1457,8 +1469,12 @@ typedef struct _IMAGEHLP_DEFERRED_SYMBOL_LOADW64 { DWORD Flags; // } IMAGEHLP_DEFERRED_SYMBOL_LOADW64, *PIMAGEHLP_DEFERRED_SYMBOL_LOADW64; -#define DSLFLAG_MISMATCHED_PDB 0x1 -#define DSLFLAG_MISMATCHED_DBG 0x2 +#define DSLFLAG_MISMATCHED_PDB 0x1 +#define DSLFLAG_MISMATCHED_DBG 0x2 +#define FLAG_ENGINE_PRESENT 0x4 +#define FLAG_ENGOPT_DISALLOW_NETWORK_PATHS 0x8 +#define FLAG_OVERRIDE_ARM_MACHINE_TYPE 0x10 + #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64) #define IMAGEHLP_DEFERRED_SYMBOL_LOAD IMAGEHLP_DEFERRED_SYMBOL_LOAD64 @@ -1499,37 +1515,37 @@ typedef struct _IMAGEHLP_DUPLICATE_SYMBOL { BOOL IMAGEAPI SymSetParentWindow( - __in HWND hwnd + _In_ HWND hwnd ); PCHAR IMAGEAPI SymSetHomeDirectory( - __in_opt HANDLE hProcess, - __in_opt PCSTR dir + _In_opt_ HANDLE hProcess, + _In_opt_ PCSTR dir ); PWSTR IMAGEAPI SymSetHomeDirectoryW( - __in_opt HANDLE hProcess, - __in_opt PCWSTR dir + _In_opt_ HANDLE hProcess, + _In_opt_ PCWSTR dir ); PCHAR IMAGEAPI SymGetHomeDirectory( - __in DWORD type, - __out_ecount(size) PSTR dir, - __in size_t size + _In_ DWORD type, + _Out_writes_(size) PSTR dir, + _In_ size_t size ); PWSTR IMAGEAPI SymGetHomeDirectoryW( - __in DWORD type, - __out_ecount(size) PWSTR dir, - __in size_t size + _In_ DWORD type, + _Out_writes_(size) PWSTR dir, + _In_ size_t size ); typedef enum { @@ -1537,7 +1553,7 @@ typedef enum { hdSym, // where symbols are stored hdSrc, // where source is stored hdMax // end marker -}; +} IMAGEHLP_HD_TYPE; typedef struct _OMAP { ULONG rva; @@ -1547,12 +1563,12 @@ typedef struct _OMAP { BOOL IMAGEAPI SymGetOmaps( - __in HANDLE hProcess, - __in DWORD64 BaseOfDll, - __out POMAP *OmapTo, - __out PDWORD64 cOmapTo, - __out POMAP *OmapFrom, - __out PDWORD64 cOmapFrom + _In_ HANDLE hProcess, + _In_ DWORD64 BaseOfDll, + _Out_ POMAP *OmapTo, + _Out_ PDWORD64 cOmapTo, + _Out_ POMAP *OmapFrom, + _Out_ PDWORD64 cOmapFrom ); // @@ -1585,13 +1601,22 @@ SymGetOmaps( #define SYMOPT_FAVOR_COMPRESSED 0x00800000 #define SYMOPT_ALLOW_ZERO_ADDRESS 0x01000000 #define SYMOPT_DISABLE_SYMSRV_AUTODETECT 0x02000000 - +#define SYMOPT_READONLY_CACHE 0x04000000 +#define SYMOPT_SYMPATH_LAST 0x08000000 +#define SYMOPT_DISABLE_FAST_SYMBOLS 0x10000000 +#define SYMOPT_DISABLE_SYMSRV_TIMEOUT 0x20000000 +#define SYMOPT_DISABLE_SRVSTAR_ON_STARTUP 0x40000000 #define SYMOPT_DEBUG 0x80000000 +typedef enum { + SYMOPT_EX_DISABLEACCESSTIMEUPDATE, // Disable File Last Access Time on Symbols + SYMOPT_EX_MAX // Unused +} IMAGEHLP_EXTENDED_OPTIONS; + DWORD IMAGEAPI SymSetOptions( - __in DWORD SymOptions + _In_ DWORD SymOptions ); DWORD @@ -1603,37 +1628,47 @@ SymGetOptions( BOOL IMAGEAPI SymCleanup( - __in HANDLE hProcess + _In_ HANDLE hProcess ); +// Returns the value of the extended option +BOOL +IMAGEAPI +SymGetExtendedOption(_In_ IMAGEHLP_EXTENDED_OPTIONS option); + +// Returns the previous value of the option +BOOL +IMAGEAPI +SymSetExtendedOption(_In_ IMAGEHLP_EXTENDED_OPTIONS option, _In_ BOOL value); + BOOL IMAGEAPI SymMatchString( - __in PCSTR string, - __in PCSTR expression, - __in BOOL fCase + _In_ PCSTR string, + _In_ PCSTR expression, + _In_ BOOL fCase ); BOOL IMAGEAPI SymMatchStringA( - __in PCSTR string, - __in PCSTR expression, - __in BOOL fCase + _In_ PCSTR string, + _In_ PCSTR expression, + _In_ BOOL fCase ); BOOL IMAGEAPI SymMatchStringW( - __in PCWSTR string, - __in PCWSTR expression, - __in BOOL fCase + _In_ PCWSTR string, + _In_ PCWSTR expression, + _In_ BOOL fCase ); typedef BOOL (CALLBACK *PSYM_ENUMSOURCEFILES_CALLBACK)( - __in PSOURCEFILE pSourceFile, - __in_opt PVOID UserContext + _In_ PSOURCEFILE pSourceFile, + _In_opt_ PVOID UserContext ); // for backwards compatibility - don't use this @@ -1642,43 +1677,43 @@ typedef BOOL BOOL IMAGEAPI SymEnumSourceFiles( - __in HANDLE hProcess, - __in ULONG64 ModBase, - __in_opt PCSTR Mask, - __in PSYM_ENUMSOURCEFILES_CALLBACK cbSrcFiles, - __in_opt PVOID UserContext + _In_ HANDLE hProcess, + _In_ ULONG64 ModBase, + _In_opt_ PCSTR Mask, + _In_ PSYM_ENUMSOURCEFILES_CALLBACK cbSrcFiles, + _In_opt_ PVOID UserContext ); typedef BOOL (CALLBACK *PSYM_ENUMSOURCEFILES_CALLBACKW)( - __in PSOURCEFILEW pSourceFile, - __in_opt PVOID UserContext + _In_ PSOURCEFILEW pSourceFile, + _In_opt_ PVOID UserContext ); BOOL IMAGEAPI SymEnumSourceFilesW( - __in HANDLE hProcess, - __in ULONG64 ModBase, - __in_opt PCWSTR Mask, - __in PSYM_ENUMSOURCEFILES_CALLBACKW cbSrcFiles, - __in_opt PVOID UserContext + _In_ HANDLE hProcess, + _In_ ULONG64 ModBase, + _In_opt_ PCWSTR Mask, + _In_ PSYM_ENUMSOURCEFILES_CALLBACKW cbSrcFiles, + _In_opt_ PVOID UserContext ); BOOL IMAGEAPI SymEnumerateModules64( - __in HANDLE hProcess, - __in PSYM_ENUMMODULES_CALLBACK64 EnumModulesCallback, - __in_opt PVOID UserContext + _In_ HANDLE hProcess, + _In_ PSYM_ENUMMODULES_CALLBACK64 EnumModulesCallback, + _In_opt_ PVOID UserContext ); BOOL IMAGEAPI SymEnumerateModulesW64( - __in HANDLE hProcess, - __in PSYM_ENUMMODULES_CALLBACKW64 EnumModulesCallback, - __in_opt PVOID UserContext + _In_ HANDLE hProcess, + _In_ PSYM_ENUMMODULES_CALLBACKW64 EnumModulesCallback, + _In_opt_ PVOID UserContext ); #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64) @@ -1687,42 +1722,42 @@ SymEnumerateModulesW64( BOOL IMAGEAPI SymEnumerateModules( - __in HANDLE hProcess, - __in PSYM_ENUMMODULES_CALLBACK EnumModulesCallback, - __in_opt PVOID UserContext + _In_ HANDLE hProcess, + _In_ PSYM_ENUMMODULES_CALLBACK EnumModulesCallback, + _In_opt_ PVOID UserContext ); #endif BOOL IMAGEAPI EnumerateLoadedModulesEx( - __in HANDLE hProcess, - __in PENUMLOADED_MODULES_CALLBACK64 EnumLoadedModulesCallback, - __in_opt PVOID UserContext + _In_ HANDLE hProcess, + _In_ PENUMLOADED_MODULES_CALLBACK64 EnumLoadedModulesCallback, + _In_opt_ PVOID UserContext ); - + BOOL IMAGEAPI EnumerateLoadedModulesExW( - __in HANDLE hProcess, - __in PENUMLOADED_MODULES_CALLBACKW64 EnumLoadedModulesCallback, - __in_opt PVOID UserContext + _In_ HANDLE hProcess, + _In_ PENUMLOADED_MODULES_CALLBACKW64 EnumLoadedModulesCallback, + _In_opt_ PVOID UserContext ); BOOL IMAGEAPI EnumerateLoadedModules64( - __in HANDLE hProcess, - __in PENUMLOADED_MODULES_CALLBACK64 EnumLoadedModulesCallback, - __in_opt PVOID UserContext + _In_ HANDLE hProcess, + _In_ PENUMLOADED_MODULES_CALLBACK64 EnumLoadedModulesCallback, + _In_opt_ PVOID UserContext ); BOOL IMAGEAPI EnumerateLoadedModulesW64( - __in HANDLE hProcess, - __in PENUMLOADED_MODULES_CALLBACKW64 EnumLoadedModulesCallback, - __in_opt PVOID UserContext + _In_ HANDLE hProcess, + _In_ PENUMLOADED_MODULES_CALLBACKW64 EnumLoadedModulesCallback, + _In_opt_ PVOID UserContext ); #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64) @@ -1731,17 +1766,26 @@ EnumerateLoadedModulesW64( BOOL IMAGEAPI EnumerateLoadedModules( - __in HANDLE hProcess, - __in PENUMLOADED_MODULES_CALLBACK EnumLoadedModulesCallback, - __in_opt PVOID UserContext + _In_ HANDLE hProcess, + _In_ PENUMLOADED_MODULES_CALLBACK EnumLoadedModulesCallback, + _In_opt_ PVOID UserContext ); #endif PVOID IMAGEAPI SymFunctionTableAccess64( - __in HANDLE hProcess, - __in DWORD64 AddrBase + _In_ HANDLE hProcess, + _In_ DWORD64 AddrBase + ); + +PVOID +IMAGEAPI +SymFunctionTableAccess64AccessRoutines( + _In_ HANDLE hProcess, + _In_ DWORD64 AddrBase, + _In_opt_ PREAD_PROCESS_MEMORY_ROUTINE64 ReadMemoryRoutine, + _In_opt_ PGET_MODULE_BASE_ROUTINE64 GetModuleBaseRoutine ); #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64) @@ -1750,34 +1794,34 @@ SymFunctionTableAccess64( PVOID IMAGEAPI SymFunctionTableAccess( - __in HANDLE hProcess, - __in DWORD AddrBase + _In_ HANDLE hProcess, + _In_ DWORD AddrBase ); #endif BOOL IMAGEAPI SymGetUnwindInfo( - __in HANDLE hProcess, - __in DWORD64 Address, - __out_bcount_opt(*Size) PVOID Buffer, - __inout PULONG Size + _In_ HANDLE hProcess, + _In_ DWORD64 Address, + _Out_writes_bytes_opt_(*Size) PVOID Buffer, + _Inout_ PULONG Size ); BOOL IMAGEAPI SymGetModuleInfo64( - __in HANDLE hProcess, - __in DWORD64 qwAddr, - __out PIMAGEHLP_MODULE64 ModuleInfo + _In_ HANDLE hProcess, + _In_ DWORD64 qwAddr, + _Out_ PIMAGEHLP_MODULE64 ModuleInfo ); BOOL IMAGEAPI SymGetModuleInfoW64( - __in HANDLE hProcess, - __in DWORD64 qwAddr, - __out PIMAGEHLP_MODULEW64 ModuleInfo + _In_ HANDLE hProcess, + _In_ DWORD64 qwAddr, + _Out_ PIMAGEHLP_MODULEW64 ModuleInfo ); #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64) @@ -1787,25 +1831,25 @@ SymGetModuleInfoW64( BOOL IMAGEAPI SymGetModuleInfo( - __in HANDLE hProcess, - __in DWORD dwAddr, - __out PIMAGEHLP_MODULE ModuleInfo + _In_ HANDLE hProcess, + _In_ DWORD dwAddr, + _Out_ PIMAGEHLP_MODULE ModuleInfo ); BOOL IMAGEAPI SymGetModuleInfoW( - __in HANDLE hProcess, - __in DWORD dwAddr, - __out PIMAGEHLP_MODULEW ModuleInfo + _In_ HANDLE hProcess, + _In_ DWORD dwAddr, + _Out_ PIMAGEHLP_MODULEW ModuleInfo ); #endif DWORD64 IMAGEAPI SymGetModuleBase64( - __in HANDLE hProcess, - __in DWORD64 qwAddr + _In_ HANDLE hProcess, + _In_ DWORD64 qwAddr ); #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64) @@ -1814,8 +1858,8 @@ SymGetModuleBase64( DWORD IMAGEAPI SymGetModuleBase( - __in HANDLE hProcess, - __in DWORD dwAddr + _In_ HANDLE hProcess, + _In_ DWORD dwAddr ); #endif @@ -1841,88 +1885,151 @@ typedef struct _SRCCODEINFOW { typedef BOOL (CALLBACK *PSYM_ENUMLINES_CALLBACK)( - __in PSRCCODEINFO LineInfo, - __in_opt PVOID UserContext + _In_ PSRCCODEINFO LineInfo, + _In_opt_ PVOID UserContext ); BOOL IMAGEAPI SymEnumLines( - __in HANDLE hProcess, - __in ULONG64 Base, - __in_opt PCSTR Obj, - __in_opt PCSTR File, - __in PSYM_ENUMLINES_CALLBACK EnumLinesCallback, - __in_opt PVOID UserContext + _In_ HANDLE hProcess, + _In_ ULONG64 Base, + _In_opt_ PCSTR Obj, + _In_opt_ PCSTR File, + _In_ PSYM_ENUMLINES_CALLBACK EnumLinesCallback, + _In_opt_ PVOID UserContext ); typedef BOOL (CALLBACK *PSYM_ENUMLINES_CALLBACKW)( - __in PSRCCODEINFOW LineInfo, - __in_opt PVOID UserContext + _In_ PSRCCODEINFOW LineInfo, + _In_opt_ PVOID UserContext ); BOOL IMAGEAPI SymEnumLinesW( - __in HANDLE hProcess, - __in ULONG64 Base, - __in_opt PCWSTR Obj, - __in_opt PCWSTR File, - __in PSYM_ENUMLINES_CALLBACKW EnumLinesCallback, - __in_opt PVOID UserContext + _In_ HANDLE hProcess, + _In_ ULONG64 Base, + _In_opt_ PCWSTR Obj, + _In_opt_ PCWSTR File, + _In_ PSYM_ENUMLINES_CALLBACKW EnumLinesCallback, + _In_opt_ PVOID UserContext ); BOOL IMAGEAPI SymGetLineFromAddr64( - __in HANDLE hProcess, - __in DWORD64 qwAddr, - __out PDWORD pdwDisplacement, - __out PIMAGEHLP_LINE64 Line64 + _In_ HANDLE hProcess, + _In_ DWORD64 qwAddr, + _Out_ PDWORD pdwDisplacement, + _Out_ PIMAGEHLP_LINE64 Line64 ); BOOL IMAGEAPI SymGetLineFromAddrW64( - __in HANDLE hProcess, - __in DWORD64 dwAddr, - __out PDWORD pdwDisplacement, - __out PIMAGEHLP_LINEW64 Line + _In_ HANDLE hProcess, + _In_ DWORD64 dwAddr, + _Out_ PDWORD pdwDisplacement, + _Out_ PIMAGEHLP_LINEW64 Line + ); + +BOOL +IMAGEAPI +SymGetLineFromInlineContext( + _In_ HANDLE hProcess, + _In_ DWORD64 qwAddr, + _In_ ULONG InlineContext, + _In_opt_ DWORD64 qwModuleBaseAddress, + _Out_ PDWORD pdwDisplacement, + _Out_ PIMAGEHLP_LINE64 Line64 + ); + +BOOL +IMAGEAPI +SymGetLineFromInlineContextW( + _In_ HANDLE hProcess, + _In_ DWORD64 dwAddr, + _In_ ULONG InlineContext, + _In_opt_ DWORD64 qwModuleBaseAddress, + _Out_ PDWORD pdwDisplacement, + _Out_ PIMAGEHLP_LINEW64 Line ); BOOL IMAGEAPI SymEnumSourceLines( - __in HANDLE hProcess, - __in ULONG64 Base, - __in_opt PCSTR Obj, - __in_opt PCSTR File, - __in_opt DWORD Line, - __in DWORD Flags, - __in PSYM_ENUMLINES_CALLBACK EnumLinesCallback, - __in_opt PVOID UserContext + _In_ HANDLE hProcess, + _In_ ULONG64 Base, + _In_opt_ PCSTR Obj, + _In_opt_ PCSTR File, + _In_opt_ DWORD Line, + _In_ DWORD Flags, + _In_ PSYM_ENUMLINES_CALLBACK EnumLinesCallback, + _In_opt_ PVOID UserContext ); BOOL IMAGEAPI SymEnumSourceLinesW( - __in HANDLE hProcess, - __in ULONG64 Base, - __in_opt PCWSTR Obj, - __in_opt PCWSTR File, - __in_opt DWORD Line, - __in DWORD Flags, - __in PSYM_ENUMLINES_CALLBACKW EnumLinesCallback, - __in_opt PVOID UserContext + _In_ HANDLE hProcess, + _In_ ULONG64 Base, + _In_opt_ PCWSTR Obj, + _In_opt_ PCWSTR File, + _In_opt_ DWORD Line, + _In_ DWORD Flags, + _In_ PSYM_ENUMLINES_CALLBACKW EnumLinesCallback, + _In_opt_ PVOID UserContext + ); + +// Check whether input Address includes "inline stack". +DWORD +IMAGEAPI +SymAddrIncludeInlineTrace( + _In_ HANDLE hProcess, + _In_ DWORD64 Address + ); + +#define SYM_INLINE_COMP_ERROR 0 +#define SYM_INLINE_COMP_IDENTICAL 1 +#define SYM_INLINE_COMP_STEPIN 2 +#define SYM_INLINE_COMP_STEPOUT 3 +#define SYM_INLINE_COMP_STEPOVER 4 +#define SYM_INLINE_COMP_DIFFERENT 5 + +// Compare the "inline stack" from the 2 input addresses and determine whether the difference is possibly from +// what execution control operation. The return value would be onr of the literals defined above. +DWORD +IMAGEAPI +SymCompareInlineTrace( + _In_ HANDLE hProcess, + _In_ DWORD64 Address1, + _In_ DWORD InlineContext1, + _In_ DWORD64 RetAddress1, + _In_ DWORD64 Address2, + _In_ DWORD64 RetAddress2 + ); + +BOOL +IMAGEAPI +SymQueryInlineTrace( + _In_ HANDLE hProcess, + _In_ DWORD64 StartAddress, + _In_ DWORD StartContext, + _In_ DWORD64 StartRetAddress, + _In_ DWORD64 CurAddress, + _Out_ LPDWORD CurContext, + _Out_ LPDWORD CurFrameIndex ); // flags for SymEnumSourceLines -#define ESLFLAG_FULLPATH 0x1 -#define ESLFLAG_NEAREST 0x2 -#define ESLFLAG_PREV 0x4 -#define ESLFLAG_NEXT 0x8 +#define ESLFLAG_FULLPATH 0x00000001 +#define ESLFLAG_NEAREST 0x00000002 +#define ESLFLAG_PREV 0x00000004 +#define ESLFLAG_NEXT 0x00000008 +#define ESLFLAG_INLINE_SITE 0x00000010 #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64) #define SymGetLineFromAddr SymGetLineFromAddr64 @@ -1931,42 +2038,42 @@ SymEnumSourceLinesW( BOOL IMAGEAPI SymGetLineFromAddr( - __in HANDLE hProcess, - __in DWORD dwAddr, - __out PDWORD pdwDisplacement, - __out PIMAGEHLP_LINE Line + _In_ HANDLE hProcess, + _In_ DWORD dwAddr, + _Out_ PDWORD pdwDisplacement, + _Out_ PIMAGEHLP_LINE Line ); BOOL IMAGEAPI SymGetLineFromAddrW( - __in HANDLE hProcess, - __in DWORD dwAddr, - __out PDWORD pdwDisplacement, - __out PIMAGEHLP_LINEW Line + _In_ HANDLE hProcess, + _In_ DWORD dwAddr, + _Out_ PDWORD pdwDisplacement, + _Out_ PIMAGEHLP_LINEW Line ); #endif BOOL IMAGEAPI SymGetLineFromName64( - __in HANDLE hProcess, - __in_opt PCSTR ModuleName, - __in_opt PCSTR FileName, - __in DWORD dwLineNumber, - __out PLONG plDisplacement, - __inout PIMAGEHLP_LINE64 Line + _In_ HANDLE hProcess, + _In_opt_ PCSTR ModuleName, + _In_opt_ PCSTR FileName, + _In_ DWORD dwLineNumber, + _Out_ PLONG plDisplacement, + _Inout_ PIMAGEHLP_LINE64 Line ); BOOL IMAGEAPI SymGetLineFromNameW64( - __in HANDLE hProcess, - __in_opt PCWSTR ModuleName, - __in_opt PCWSTR FileName, - __in DWORD dwLineNumber, - __out PLONG plDisplacement, - __inout PIMAGEHLP_LINEW64 Line + _In_ HANDLE hProcess, + _In_opt_ PCWSTR ModuleName, + _In_opt_ PCWSTR FileName, + _In_ DWORD dwLineNumber, + _Out_ PLONG plDisplacement, + _Inout_ PIMAGEHLP_LINEW64 Line ); #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64) @@ -1975,27 +2082,27 @@ SymGetLineFromNameW64( BOOL IMAGEAPI SymGetLineFromName( - __in HANDLE hProcess, - __in_opt PCSTR ModuleName, - __in_opt PCSTR FileName, - __in DWORD dwLineNumber, - __out PLONG plDisplacement, - __inout PIMAGEHLP_LINE Line + _In_ HANDLE hProcess, + _In_opt_ PCSTR ModuleName, + _In_opt_ PCSTR FileName, + _In_ DWORD dwLineNumber, + _Out_ PLONG plDisplacement, + _Inout_ PIMAGEHLP_LINE Line ); #endif BOOL IMAGEAPI SymGetLineNext64( - __in HANDLE hProcess, - __inout PIMAGEHLP_LINE64 Line + _In_ HANDLE hProcess, + _Inout_ PIMAGEHLP_LINE64 Line ); BOOL IMAGEAPI SymGetLineNextW64( - __in HANDLE hProcess, - __inout PIMAGEHLP_LINEW64 Line + _In_ HANDLE hProcess, + _Inout_ PIMAGEHLP_LINEW64 Line ); #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64) @@ -2004,30 +2111,30 @@ SymGetLineNextW64( BOOL IMAGEAPI SymGetLineNext( - __in HANDLE hProcess, - __inout PIMAGEHLP_LINE Line + _In_ HANDLE hProcess, + _Inout_ PIMAGEHLP_LINE Line ); BOOL IMAGEAPI SymGetLineNextW( - __in HANDLE hProcess, - __inout PIMAGEHLP_LINEW Line + _In_ HANDLE hProcess, + _Inout_ PIMAGEHLP_LINEW Line ); #endif BOOL IMAGEAPI SymGetLinePrev64( - __in HANDLE hProcess, - __inout PIMAGEHLP_LINE64 Line + _In_ HANDLE hProcess, + _Inout_ PIMAGEHLP_LINE64 Line ); BOOL IMAGEAPI SymGetLinePrevW64( - __in HANDLE hProcess, - __inout PIMAGEHLP_LINEW64 Line + _In_ HANDLE hProcess, + _Inout_ PIMAGEHLP_LINEW64 Line ); #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64) @@ -2036,184 +2143,208 @@ SymGetLinePrevW64( BOOL IMAGEAPI SymGetLinePrev( - __in HANDLE hProcess, - __inout PIMAGEHLP_LINE Line + _In_ HANDLE hProcess, + _Inout_ PIMAGEHLP_LINE Line ); BOOL IMAGEAPI SymGetLinePrevW( - __in HANDLE hProcess, - __inout PIMAGEHLP_LINEW Line + _In_ HANDLE hProcess, + _Inout_ PIMAGEHLP_LINEW Line ); #endif ULONG IMAGEAPI SymGetFileLineOffsets64( - __in HANDLE hProcess, - __in_opt PCSTR ModuleName, - __in PCSTR FileName, - __out_ecount(BufferLines) PDWORD64 Buffer, - __in ULONG BufferLines + _In_ HANDLE hProcess, + _In_opt_ PCSTR ModuleName, + _In_ PCSTR FileName, + _Out_writes_(BufferLines) PDWORD64 Buffer, + _In_ ULONG BufferLines ); BOOL IMAGEAPI SymMatchFileName( - __in PCSTR FileName, - __in PCSTR Match, - __deref_opt_out PSTR *FileNameStop, - __deref_opt_out PSTR *MatchStop + _In_ PCSTR FileName, + _In_ PCSTR Match, + _Outptr_opt_ PSTR *FileNameStop, + _Outptr_opt_ PSTR *MatchStop ); BOOL IMAGEAPI SymMatchFileNameW( - __in PCWSTR FileName, - __in PCWSTR Match, - __deref_opt_out PWSTR *FileNameStop, - __deref_opt_out PWSTR *MatchStop + _In_ PCWSTR FileName, + _In_ PCWSTR Match, + _Outptr_opt_ PWSTR *FileNameStop, + _Outptr_opt_ PWSTR *MatchStop ); BOOL IMAGEAPI SymGetSourceFile( - __in HANDLE hProcess, - __in ULONG64 Base, - __in_opt PCSTR Params, - __in PCSTR FileSpec, - __out_ecount(Size) PSTR FilePath, - __in DWORD Size + _In_ HANDLE hProcess, + _In_ ULONG64 Base, + _In_opt_ PCSTR Params, + _In_ PCSTR FileSpec, + _Out_writes_(Size) PSTR FilePath, + _In_ DWORD Size ); BOOL IMAGEAPI SymGetSourceFileW( - __in HANDLE hProcess, - __in ULONG64 Base, - __in_opt PCWSTR Params, - __in PCWSTR FileSpec, - __out_ecount(Size) PWSTR FilePath, - __in DWORD Size + _In_ HANDLE hProcess, + _In_ ULONG64 Base, + _In_opt_ PCWSTR Params, + _In_ PCWSTR FileSpec, + _Out_writes_(Size) PWSTR FilePath, + _In_ DWORD Size ); BOOL IMAGEAPI SymGetSourceFileToken( - __in HANDLE hProcess, - __in ULONG64 Base, - __in PCSTR FileSpec, - __deref_out PVOID *Token, - __out DWORD *Size + _In_ HANDLE hProcess, + _In_ ULONG64 Base, + _In_ PCSTR FileSpec, + _Outptr_ PVOID *Token, + _Out_ DWORD *Size + ); + +BOOL +IMAGEAPI +SymGetSourceFileChecksumW( + _In_ HANDLE hProcess, + _In_ ULONG64 Base, + _In_ PCWSTR FileSpec, + _Out_ DWORD *pCheckSumType, + _Out_writes_(checksumSize) BYTE *pChecksum, + _In_ DWORD checksumSize, + _Out_ DWORD *pActualBytesWritten + ); + +BOOL +IMAGEAPI +SymGetSourceFileChecksum( + _In_ HANDLE hProcess, + _In_ ULONG64 Base, + _In_ PCSTR FileSpec, + _Out_ DWORD *pCheckSumType, + _Out_writes_(checksumSize) BYTE *pChecksum, + _In_ DWORD checksumSize, + _Out_ DWORD *pActualBytesWritten ); BOOL IMAGEAPI SymGetSourceFileTokenW( - __in HANDLE hProcess, - __in ULONG64 Base, - __in PCWSTR FileSpec, - __deref_out PVOID *Token, - __out DWORD *Size + _In_ HANDLE hProcess, + _In_ ULONG64 Base, + _In_ PCWSTR FileSpec, + _Outptr_ PVOID *Token, + _Out_ DWORD *Size ); BOOL IMAGEAPI SymGetSourceFileFromToken( - __in HANDLE hProcess, - __in PVOID Token, - __in_opt PCSTR Params, - __out_ecount(Size) PSTR FilePath, - __in DWORD Size + _In_ HANDLE hProcess, + _In_ PVOID Token, + _In_opt_ PCSTR Params, + _Out_writes_(Size) PSTR FilePath, + _In_ DWORD Size ); BOOL IMAGEAPI SymGetSourceFileFromTokenW( - __in HANDLE hProcess, - __in PVOID Token, - __in_opt PCWSTR Params, - __out_ecount(Size) PWSTR FilePath, - __in DWORD Size + _In_ HANDLE hProcess, + _In_ PVOID Token, + _In_opt_ PCWSTR Params, + _Out_writes_(Size) PWSTR FilePath, + _In_ DWORD Size ); BOOL IMAGEAPI SymGetSourceVarFromToken( - __in HANDLE hProcess, - __in PVOID Token, - __in_opt PCSTR Params, - __in PCSTR VarName, - __out_ecount(Size) PSTR Value, - __in DWORD Size + _In_ HANDLE hProcess, + _In_ PVOID Token, + _In_opt_ PCSTR Params, + _In_ PCSTR VarName, + _Out_writes_(Size) PSTR Value, + _In_ DWORD Size ); BOOL IMAGEAPI SymGetSourceVarFromTokenW( - __in HANDLE hProcess, - __in PVOID Token, - __in_opt PCWSTR Params, - __in PCWSTR VarName, - __out_ecount(Size) PWSTR Value, - __in DWORD Size + _In_ HANDLE hProcess, + _In_ PVOID Token, + _In_opt_ PCWSTR Params, + _In_ PCWSTR VarName, + _Out_writes_(Size) PWSTR Value, + _In_ DWORD Size ); -typedef BOOL (CALLBACK *PENUMSOURCEFILETOKENSCALLBACK)(__in PVOID token, __in size_t size); +typedef BOOL (CALLBACK *PENUMSOURCEFILETOKENSCALLBACK)(_In_ PVOID token, _In_ size_t size); BOOL IMAGEAPI SymEnumSourceFileTokens( - __in HANDLE hProcess, - __in ULONG64 Base, - __in PENUMSOURCEFILETOKENSCALLBACK Callback + _In_ HANDLE hProcess, + _In_ ULONG64 Base, + _In_ PENUMSOURCEFILETOKENSCALLBACK Callback ); BOOL IMAGEAPI SymInitialize( - __in HANDLE hProcess, - __in_opt PCSTR UserSearchPath, - __in BOOL fInvadeProcess + _In_ HANDLE hProcess, + _In_opt_ PCSTR UserSearchPath, + _In_ BOOL fInvadeProcess ); BOOL IMAGEAPI SymInitializeW( - __in HANDLE hProcess, - __in_opt PCWSTR UserSearchPath, - __in BOOL fInvadeProcess + _In_ HANDLE hProcess, + _In_opt_ PCWSTR UserSearchPath, + _In_ BOOL fInvadeProcess ); BOOL IMAGEAPI SymGetSearchPath( - __in HANDLE hProcess, - __out_ecount(SearchPathLength) PSTR SearchPath, - __in DWORD SearchPathLength + _In_ HANDLE hProcess, + _Out_writes_(SearchPathLength) PSTR SearchPath, + _In_ DWORD SearchPathLength ); BOOL IMAGEAPI SymGetSearchPathW( - __in HANDLE hProcess, - __out_ecount(SearchPathLength) PWSTR SearchPath, - __in DWORD SearchPathLength + _In_ HANDLE hProcess, + _Out_writes_(SearchPathLength) PWSTR SearchPath, + _In_ DWORD SearchPathLength ); BOOL IMAGEAPI SymSetSearchPath( - __in HANDLE hProcess, - __in_opt PCSTR SearchPath + _In_ HANDLE hProcess, + _In_opt_ PCSTR SearchPath ); BOOL IMAGEAPI SymSetSearchPathW( - __in HANDLE hProcess, - __in_opt PCWSTR SearchPath + _In_ HANDLE hProcess, + _In_opt_ PCWSTR SearchPath ); #define SLMFLAG_VIRTUAL 0x1 @@ -2223,34 +2354,34 @@ SymSetSearchPathW( DWORD64 IMAGEAPI SymLoadModuleEx( - __in HANDLE hProcess, - __in_opt HANDLE hFile, - __in_opt PCSTR ImageName, - __in_opt PCSTR ModuleName, - __in DWORD64 BaseOfDll, - __in DWORD DllSize, - __in_opt PMODLOAD_DATA Data, - __in_opt DWORD Flags + _In_ HANDLE hProcess, + _In_opt_ HANDLE hFile, + _In_opt_ PCSTR ImageName, + _In_opt_ PCSTR ModuleName, + _In_ DWORD64 BaseOfDll, + _In_ DWORD DllSize, + _In_opt_ PMODLOAD_DATA Data, + _In_opt_ DWORD Flags ); DWORD64 IMAGEAPI SymLoadModuleExW( - __in HANDLE hProcess, - __in_opt HANDLE hFile, - __in_opt PCWSTR ImageName, - __in_opt PCWSTR ModuleName, - __in DWORD64 BaseOfDll, - __in DWORD DllSize, - __in_opt PMODLOAD_DATA Data, - __in_opt DWORD Flags + _In_ HANDLE hProcess, + _In_opt_ HANDLE hFile, + _In_opt_ PCWSTR ImageName, + _In_opt_ PCWSTR ModuleName, + _In_ DWORD64 BaseOfDll, + _In_ DWORD DllSize, + _In_opt_ PMODLOAD_DATA Data, + _In_opt_ DWORD Flags ); BOOL IMAGEAPI SymUnloadModule64( - __in HANDLE hProcess, - __in DWORD64 BaseOfDll + _In_ HANDLE hProcess, + _In_ DWORD64 BaseOfDll ); #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64) @@ -2259,17 +2390,17 @@ SymUnloadModule64( BOOL IMAGEAPI SymUnloadModule( - __in HANDLE hProcess, - __in DWORD BaseOfDll + _In_ HANDLE hProcess, + _In_ DWORD BaseOfDll ); #endif BOOL IMAGEAPI SymUnDName64( - __in PIMAGEHLP_SYMBOL64 sym, // Symbol to undecorate - __out_ecount(UnDecNameLength) PSTR UnDecName, // Buffer to store undecorated name in - __in DWORD UnDecNameLength // Size of the buffer + _In_ PIMAGEHLP_SYMBOL64 sym, // Symbol to undecorate + _Out_writes_(UnDecNameLength) PSTR UnDecName, // Buffer to store undecorated name in + _In_ DWORD UnDecNameLength // Size of the buffer ); #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64) @@ -2278,34 +2409,34 @@ SymUnDName64( BOOL IMAGEAPI SymUnDName( - __in PIMAGEHLP_SYMBOL sym, // Symbol to undecorate - __out_ecount(UnDecNameLength) PSTR UnDecName, // Buffer to store undecorated name in - __in DWORD UnDecNameLength // Size of the buffer + _In_ PIMAGEHLP_SYMBOL sym, // Symbol to undecorate + _Out_writes_(UnDecNameLength) 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 + _In_ HANDLE hProcess, + _In_ PSYMBOL_REGISTERED_CALLBACK64 CallbackFunction, + _In_ ULONG64 UserContext ); BOOL IMAGEAPI SymRegisterCallbackW64( - __in HANDLE hProcess, - __in PSYMBOL_REGISTERED_CALLBACK64 CallbackFunction, - __in ULONG64 UserContext + _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 + _In_ HANDLE hProcess, + _In_ PSYMBOL_FUNCENTRY_CALLBACK64 CallbackFunction, + _In_ ULONG64 UserContext ); #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64) @@ -2315,17 +2446,17 @@ SymRegisterFunctionEntryCallback64( BOOL IMAGEAPI SymRegisterCallback( - __in HANDLE hProcess, - __in PSYMBOL_REGISTERED_CALLBACK CallbackFunction, - __in_opt PVOID UserContext + _In_ HANDLE hProcess, + _In_ PSYMBOL_REGISTERED_CALLBACK CallbackFunction, + _In_opt_ PVOID UserContext ); BOOL IMAGEAPI SymRegisterFunctionEntryCallback( - __in HANDLE hProcess, - __in PSYMBOL_FUNCENTRY_CALLBACK CallbackFunction, - __in_opt PVOID UserContext + _In_ HANDLE hProcess, + _In_ PSYMBOL_FUNCENTRY_CALLBACK CallbackFunction, + _In_opt_ PVOID UserContext ); #endif @@ -2408,101 +2539,129 @@ typedef VOID IMAGEHLP_CONTEXT, *PIMAGEHLP_CONTEXT; BOOL IMAGEAPI SymSetContext( - __in HANDLE hProcess, - __in PIMAGEHLP_STACK_FRAME StackFrame, - __in_opt PIMAGEHLP_CONTEXT Context + _In_ HANDLE hProcess, + _In_ PIMAGEHLP_STACK_FRAME StackFrame, + _In_opt_ PIMAGEHLP_CONTEXT Context ); BOOL IMAGEAPI SymSetScopeFromAddr( - __in HANDLE hProcess, - __in ULONG64 Address + _In_ HANDLE hProcess, + _In_ ULONG64 Address + ); + +BOOL +IMAGEAPI +SymSetScopeFromInlineContext( + _In_ HANDLE hProcess, + _In_ ULONG64 Address, + _In_ ULONG InlineContext ); BOOL IMAGEAPI SymSetScopeFromIndex( - __in HANDLE hProcess, - __in ULONG64 BaseOfDll, - __in DWORD Index + _In_ HANDLE hProcess, + _In_ ULONG64 BaseOfDll, + _In_ DWORD Index ); typedef BOOL (CALLBACK *PSYM_ENUMPROCESSES_CALLBACK)( - __in HANDLE hProcess, - __in PVOID UserContext + _In_ HANDLE hProcess, + _In_ PVOID UserContext ); BOOL IMAGEAPI SymEnumProcesses( - __in PSYM_ENUMPROCESSES_CALLBACK EnumProcessesCallback, - __in PVOID UserContext + _In_ PSYM_ENUMPROCESSES_CALLBACK EnumProcessesCallback, + _In_ PVOID UserContext ); BOOL IMAGEAPI SymFromAddr( - __in HANDLE hProcess, - __in DWORD64 Address, - __out_opt PDWORD64 Displacement, - __inout PSYMBOL_INFO Symbol + _In_ HANDLE hProcess, + _In_ DWORD64 Address, + _Out_opt_ PDWORD64 Displacement, + _Inout_ PSYMBOL_INFO Symbol ); BOOL IMAGEAPI SymFromAddrW( - __in HANDLE hProcess, - __in DWORD64 Address, - __out_opt PDWORD64 Displacement, - __inout PSYMBOL_INFOW Symbol + _In_ HANDLE hProcess, + _In_ DWORD64 Address, + _Out_opt_ PDWORD64 Displacement, + _Inout_ PSYMBOL_INFOW Symbol + ); + +BOOL +IMAGEAPI +SymFromInlineContext( + _In_ HANDLE hProcess, + _In_ DWORD64 Address, + _In_ ULONG InlineContext, + _Out_opt_ PDWORD64 Displacement, + _Inout_ PSYMBOL_INFO Symbol + ); + +BOOL +IMAGEAPI +SymFromInlineContextW( + _In_ HANDLE hProcess, + _In_ DWORD64 Address, + _In_ ULONG InlineContext, + _Out_opt_ PDWORD64 Displacement, + _Inout_ PSYMBOL_INFOW Symbol ); BOOL IMAGEAPI SymFromToken( - __in HANDLE hProcess, - __in DWORD64 Base, - __in DWORD Token, - __inout PSYMBOL_INFO Symbol + _In_ HANDLE hProcess, + _In_ DWORD64 Base, + _In_ DWORD Token, + _Inout_ PSYMBOL_INFO Symbol ); BOOL IMAGEAPI SymFromTokenW( - __in HANDLE hProcess, - __in DWORD64 Base, - __in DWORD Token, - __inout PSYMBOL_INFOW Symbol + _In_ HANDLE hProcess, + _In_ DWORD64 Base, + _In_ DWORD Token, + _Inout_ PSYMBOL_INFOW Symbol ); BOOL IMAGEAPI SymNext( - __in HANDLE hProcess, - __inout PSYMBOL_INFO si + _In_ HANDLE hProcess, + _Inout_ PSYMBOL_INFO si ); BOOL IMAGEAPI SymNextW( - __in HANDLE hProcess, - __inout PSYMBOL_INFOW siw + _In_ HANDLE hProcess, + _Inout_ PSYMBOL_INFOW siw ); BOOL IMAGEAPI SymPrev( - __in HANDLE hProcess, - __inout PSYMBOL_INFO si + _In_ HANDLE hProcess, + _Inout_ PSYMBOL_INFO si ); BOOL IMAGEAPI SymPrevW( - __in HANDLE hProcess, - __inout PSYMBOL_INFOW siw + _In_ HANDLE hProcess, + _Inout_ PSYMBOL_INFOW siw ); // While SymFromName will provide a symbol from a name, @@ -2514,69 +2673,94 @@ SymPrevW( BOOL IMAGEAPI SymFromName( - __in HANDLE hProcess, - __in PCSTR Name, - __inout PSYMBOL_INFO Symbol + _In_ HANDLE hProcess, + _In_ PCSTR Name, + _Inout_ PSYMBOL_INFO Symbol ); BOOL IMAGEAPI SymFromNameW( - __in HANDLE hProcess, - __in PCWSTR Name, - __inout PSYMBOL_INFOW Symbol + _In_ HANDLE hProcess, + _In_ PCWSTR Name, + _Inout_ PSYMBOL_INFOW Symbol ); +#define SYMENUM_OPTIONS_DEFAULT 0x00000001 +#define SYMENUM_OPTIONS_INLINE 0x00000002 + typedef BOOL (CALLBACK *PSYM_ENUMERATESYMBOLS_CALLBACK)( - __in PSYMBOL_INFO pSymInfo, - __in ULONG SymbolSize, - __in_opt PVOID UserContext + _In_ PSYMBOL_INFO pSymInfo, + _In_ ULONG SymbolSize, + _In_opt_ PVOID UserContext ); BOOL IMAGEAPI SymEnumSymbols( - __in HANDLE hProcess, - __in ULONG64 BaseOfDll, - __in_opt PCSTR Mask, - __in PSYM_ENUMERATESYMBOLS_CALLBACK EnumSymbolsCallback, - __in_opt PVOID UserContext + _In_ HANDLE hProcess, + _In_ ULONG64 BaseOfDll, + _In_opt_ PCSTR Mask, + _In_ PSYM_ENUMERATESYMBOLS_CALLBACK EnumSymbolsCallback, + _In_opt_ PVOID UserContext + ); + +BOOL +IMAGEAPI +SymEnumSymbolsEx( + _In_ HANDLE hProcess, + _In_ ULONG64 BaseOfDll, + _In_opt_ PCSTR Mask, + _In_ PSYM_ENUMERATESYMBOLS_CALLBACK EnumSymbolsCallback, + _In_opt_ PVOID UserContext, + _In_ DWORD Options ); typedef BOOL (CALLBACK *PSYM_ENUMERATESYMBOLS_CALLBACKW)( - __in PSYMBOL_INFOW pSymInfo, - __in ULONG SymbolSize, - __in_opt PVOID UserContext + _In_ PSYMBOL_INFOW pSymInfo, + _In_ ULONG SymbolSize, + _In_opt_ PVOID UserContext ); BOOL IMAGEAPI SymEnumSymbolsW( - __in HANDLE hProcess, - __in ULONG64 BaseOfDll, - __in_opt PCWSTR Mask, - __in PSYM_ENUMERATESYMBOLS_CALLBACKW EnumSymbolsCallback, - __in_opt PVOID UserContext + _In_ HANDLE hProcess, + _In_ ULONG64 BaseOfDll, + _In_opt_ PCWSTR Mask, + _In_ PSYM_ENUMERATESYMBOLS_CALLBACKW EnumSymbolsCallback, + _In_opt_ PVOID UserContext + ); + +BOOL +IMAGEAPI +SymEnumSymbolsExW( + _In_ HANDLE hProcess, + _In_ ULONG64 BaseOfDll, + _In_opt_ PCWSTR Mask, + _In_ PSYM_ENUMERATESYMBOLS_CALLBACKW EnumSymbolsCallback, + _In_opt_ PVOID UserContext, + _In_ DWORD Options ); BOOL IMAGEAPI SymEnumSymbolsForAddr( - __in HANDLE hProcess, - __in DWORD64 Address, - __in PSYM_ENUMERATESYMBOLS_CALLBACK EnumSymbolsCallback, - __in_opt PVOID UserContext + _In_ HANDLE hProcess, + _In_ DWORD64 Address, + _In_ PSYM_ENUMERATESYMBOLS_CALLBACK EnumSymbolsCallback, + _In_opt_ PVOID UserContext ); BOOL IMAGEAPI SymEnumSymbolsForAddrW( - __in HANDLE hProcess, - __in DWORD64 Address, - __in PSYM_ENUMERATESYMBOLS_CALLBACKW EnumSymbolsCallback, - __in_opt PVOID UserContext + _In_ HANDLE hProcess, + _In_ DWORD64 Address, + _In_ PSYM_ENUMERATESYMBOLS_CALLBACKW EnumSymbolsCallback, + _In_opt_ PVOID UserContext ); #define SYMSEARCH_MASKOBJS 0x01 // used internally to implement other APIs @@ -2587,65 +2771,65 @@ SymEnumSymbolsForAddrW( BOOL IMAGEAPI SymSearch( - __in HANDLE hProcess, - __in ULONG64 BaseOfDll, - __in_opt DWORD Index, - __in_opt DWORD SymTag, - __in_opt PCSTR Mask, - __in_opt DWORD64 Address, - __in PSYM_ENUMERATESYMBOLS_CALLBACK EnumSymbolsCallback, - __in_opt PVOID UserContext, - __in DWORD Options + _In_ HANDLE hProcess, + _In_ ULONG64 BaseOfDll, + _In_opt_ DWORD Index, + _In_opt_ DWORD SymTag, + _In_opt_ PCSTR Mask, + _In_opt_ DWORD64 Address, + _In_ PSYM_ENUMERATESYMBOLS_CALLBACK EnumSymbolsCallback, + _In_opt_ PVOID UserContext, + _In_ DWORD Options ); BOOL IMAGEAPI SymSearchW( - __in HANDLE hProcess, - __in ULONG64 BaseOfDll, - __in_opt DWORD Index, - __in_opt DWORD SymTag, - __in_opt PCWSTR Mask, - __in_opt DWORD64 Address, - __in PSYM_ENUMERATESYMBOLS_CALLBACKW EnumSymbolsCallback, - __in_opt PVOID UserContext, - __in DWORD Options + _In_ HANDLE hProcess, + _In_ ULONG64 BaseOfDll, + _In_opt_ DWORD Index, + _In_opt_ DWORD SymTag, + _In_opt_ PCWSTR Mask, + _In_opt_ DWORD64 Address, + _In_ PSYM_ENUMERATESYMBOLS_CALLBACKW EnumSymbolsCallback, + _In_opt_ PVOID UserContext, + _In_ DWORD Options ); BOOL IMAGEAPI SymGetScope( - __in HANDLE hProcess, - __in ULONG64 BaseOfDll, - __in DWORD Index, - __inout PSYMBOL_INFO Symbol + _In_ HANDLE hProcess, + _In_ ULONG64 BaseOfDll, + _In_ DWORD Index, + _Inout_ PSYMBOL_INFO Symbol ); BOOL IMAGEAPI SymGetScopeW( - __in HANDLE hProcess, - __in ULONG64 BaseOfDll, - __in DWORD Index, - __inout PSYMBOL_INFOW Symbol + _In_ HANDLE hProcess, + _In_ ULONG64 BaseOfDll, + _In_ DWORD Index, + _Inout_ PSYMBOL_INFOW Symbol ); BOOL IMAGEAPI SymFromIndex( - __in HANDLE hProcess, - __in ULONG64 BaseOfDll, - __in DWORD Index, - __inout PSYMBOL_INFO Symbol + _In_ HANDLE hProcess, + _In_ ULONG64 BaseOfDll, + _In_ DWORD Index, + _Inout_ PSYMBOL_INFO Symbol ); BOOL IMAGEAPI SymFromIndexW( - __in HANDLE hProcess, - __in ULONG64 BaseOfDll, - __in DWORD Index, - __inout PSYMBOL_INFOW Symbol + _In_ HANDLE hProcess, + _In_ ULONG64 BaseOfDll, + _In_ DWORD Index, + _Inout_ PSYMBOL_INFOW Symbol ); typedef enum _IMAGEHLP_SYMBOL_TYPE_INFO { @@ -2682,6 +2866,7 @@ typedef enum _IMAGEHLP_SYMBOL_TYPE_INFO { TI_GET_VIRTUALBASEDISPINDEX, TI_GET_IS_REFERENCE, TI_GET_INDIRECTVIRTUALBASECLASS, + TI_GET_VIRTUALBASETABLETYPE, IMAGEHLP_SYMBOL_TYPE_INFO_MAX, } IMAGEHLP_SYMBOL_TYPE_INFO; @@ -2694,11 +2879,11 @@ typedef struct _TI_FINDCHILDREN_PARAMS { BOOL IMAGEAPI SymGetTypeInfo( - __in HANDLE hProcess, - __in DWORD64 ModBase, - __in ULONG TypeId, - __in IMAGEHLP_SYMBOL_TYPE_INFO GetType, - __out PVOID pInfo + _In_ HANDLE hProcess, + _In_ DWORD64 ModBase, + _In_ ULONG TypeId, + _In_ IMAGEHLP_SYMBOL_TYPE_INFO GetType, + _Out_ PVOID pInfo ); #define IMAGEHLP_GET_TYPE_INFO_UNCACHED 0x00000001 @@ -2728,123 +2913,123 @@ typedef struct _IMAGEHLP_GET_TYPE_INFO_PARAMS { BOOL IMAGEAPI SymGetTypeInfoEx( - __in HANDLE hProcess, - __in DWORD64 ModBase, - __inout PIMAGEHLP_GET_TYPE_INFO_PARAMS Params + _In_ HANDLE hProcess, + _In_ DWORD64 ModBase, + _Inout_ PIMAGEHLP_GET_TYPE_INFO_PARAMS Params ); BOOL IMAGEAPI SymEnumTypes( - __in HANDLE hProcess, - __in ULONG64 BaseOfDll, - __in PSYM_ENUMERATESYMBOLS_CALLBACK EnumSymbolsCallback, - __in_opt PVOID UserContext + _In_ HANDLE hProcess, + _In_ ULONG64 BaseOfDll, + _In_ PSYM_ENUMERATESYMBOLS_CALLBACK EnumSymbolsCallback, + _In_opt_ PVOID UserContext ); BOOL IMAGEAPI SymEnumTypesW( - __in HANDLE hProcess, - __in ULONG64 BaseOfDll, - __in PSYM_ENUMERATESYMBOLS_CALLBACKW EnumSymbolsCallback, - __in_opt PVOID UserContext + _In_ HANDLE hProcess, + _In_ ULONG64 BaseOfDll, + _In_ PSYM_ENUMERATESYMBOLS_CALLBACKW EnumSymbolsCallback, + _In_opt_ PVOID UserContext ); BOOL IMAGEAPI SymEnumTypesByName( - __in HANDLE hProcess, - __in ULONG64 BaseOfDll, - __in_opt PCSTR mask, - __in PSYM_ENUMERATESYMBOLS_CALLBACK EnumSymbolsCallback, - __in_opt PVOID UserContext + _In_ HANDLE hProcess, + _In_ ULONG64 BaseOfDll, + _In_opt_ PCSTR mask, + _In_ PSYM_ENUMERATESYMBOLS_CALLBACK EnumSymbolsCallback, + _In_opt_ PVOID UserContext ); BOOL IMAGEAPI SymEnumTypesByNameW( - __in HANDLE hProcess, - __in ULONG64 BaseOfDll, - __in_opt PCWSTR mask, - __in PSYM_ENUMERATESYMBOLS_CALLBACKW EnumSymbolsCallback, - __in_opt PVOID UserContext + _In_ HANDLE hProcess, + _In_ ULONG64 BaseOfDll, + _In_opt_ PCWSTR mask, + _In_ PSYM_ENUMERATESYMBOLS_CALLBACKW EnumSymbolsCallback, + _In_opt_ PVOID UserContext ); BOOL IMAGEAPI SymGetTypeFromName( - __in HANDLE hProcess, - __in ULONG64 BaseOfDll, - __in PCSTR Name, - __inout PSYMBOL_INFO Symbol + _In_ HANDLE hProcess, + _In_ ULONG64 BaseOfDll, + _In_ PCSTR Name, + _Inout_ PSYMBOL_INFO Symbol ); BOOL IMAGEAPI SymGetTypeFromNameW( - __in HANDLE hProcess, - __in ULONG64 BaseOfDll, - __in PCWSTR Name, - __inout PSYMBOL_INFOW Symbol + _In_ HANDLE hProcess, + _In_ ULONG64 BaseOfDll, + _In_ PCWSTR Name, + _Inout_ PSYMBOL_INFOW Symbol ); BOOL IMAGEAPI SymAddSymbol( - __in HANDLE hProcess, - __in ULONG64 BaseOfDll, - __in PCSTR Name, - __in DWORD64 Address, - __in DWORD Size, - __in DWORD Flags + _In_ HANDLE hProcess, + _In_ ULONG64 BaseOfDll, + _In_ PCSTR Name, + _In_ DWORD64 Address, + _In_ DWORD Size, + _In_ DWORD Flags ); BOOL IMAGEAPI SymAddSymbolW( - __in HANDLE hProcess, - __in ULONG64 BaseOfDll, - __in PCWSTR Name, - __in DWORD64 Address, - __in DWORD Size, - __in DWORD Flags + _In_ HANDLE hProcess, + _In_ ULONG64 BaseOfDll, + _In_ PCWSTR Name, + _In_ DWORD64 Address, + _In_ DWORD Size, + _In_ DWORD Flags ); BOOL IMAGEAPI SymDeleteSymbol( - __in HANDLE hProcess, - __in ULONG64 BaseOfDll, - __in_opt PCSTR Name, - __in DWORD64 Address, - __in DWORD Flags + _In_ HANDLE hProcess, + _In_ ULONG64 BaseOfDll, + _In_opt_ PCSTR Name, + _In_ DWORD64 Address, + _In_ DWORD Flags ); BOOL IMAGEAPI SymDeleteSymbolW( - __in HANDLE hProcess, - __in ULONG64 BaseOfDll, - __in_opt PCWSTR Name, - __in DWORD64 Address, - __in DWORD Flags + _In_ HANDLE hProcess, + _In_ ULONG64 BaseOfDll, + _In_opt_ PCWSTR Name, + _In_ DWORD64 Address, + _In_ DWORD Flags ); BOOL IMAGEAPI SymRefreshModuleList( - __in HANDLE hProcess + _In_ HANDLE hProcess ); BOOL IMAGEAPI SymAddSourceStream( - __in HANDLE hProcess, - __in ULONG64 Base, - __in_opt PCSTR StreamFile, - __in_bcount_opt(Size) PBYTE Buffer, - __in size_t Size + _In_ HANDLE hProcess, + _In_ ULONG64 Base, + _In_opt_ PCSTR StreamFile, + _In_reads_bytes_opt_(Size) PBYTE Buffer, + _In_ size_t Size ); typedef BOOL (WINAPI *SYMADDSOURCESTREAM)(HANDLE, ULONG64, PCSTR, PBYTE, size_t); @@ -2852,11 +3037,11 @@ typedef BOOL (WINAPI *SYMADDSOURCESTREAM)(HANDLE, ULONG64, PCSTR, PBYTE, size_t) BOOL IMAGEAPI SymAddSourceStreamA( - __in HANDLE hProcess, - __in ULONG64 Base, - __in_opt PCSTR StreamFile, - __in_bcount_opt(Size) PBYTE Buffer, - __in size_t Size + _In_ HANDLE hProcess, + _In_ ULONG64 Base, + _In_opt_ PCSTR StreamFile, + _In_reads_bytes_opt_(Size) PBYTE Buffer, + _In_ size_t Size ); typedef BOOL (WINAPI *SYMADDSOURCESTREAMA)(HANDLE, ULONG64, PCSTR, PBYTE, size_t); @@ -2864,105 +3049,105 @@ typedef BOOL (WINAPI *SYMADDSOURCESTREAMA)(HANDLE, ULONG64, PCSTR, PBYTE, size_t BOOL IMAGEAPI SymAddSourceStreamW( - __in HANDLE hProcess, - __in ULONG64 Base, - __in_opt PCWSTR FileSpec, - __in_bcount_opt(Size) PBYTE Buffer, - __in size_t Size + _In_ HANDLE hProcess, + _In_ ULONG64 Base, + _In_opt_ PCWSTR FileSpec, + _In_reads_bytes_opt_(Size) PBYTE Buffer, + _In_ size_t Size ); BOOL IMAGEAPI SymSrvIsStoreW( - __in_opt HANDLE hProcess, - __in PCWSTR path + _In_opt_ HANDLE hProcess, + _In_ PCWSTR path ); BOOL IMAGEAPI SymSrvIsStore( - __in_opt HANDLE hProcess, - __in PCSTR path + _In_opt_ HANDLE hProcess, + _In_ PCSTR path ); PCSTR IMAGEAPI SymSrvDeltaName( - __in HANDLE hProcess, - __in_opt PCSTR SymPath, - __in PCSTR Type, - __in PCSTR File1, - __in PCSTR File2 + _In_ HANDLE hProcess, + _In_opt_ PCSTR SymPath, + _In_ PCSTR Type, + _In_ PCSTR File1, + _In_ PCSTR File2 ); PCWSTR IMAGEAPI SymSrvDeltaNameW( - __in HANDLE hProcess, - __in_opt PCWSTR SymPath, - __in PCWSTR Type, - __in PCWSTR File1, - __in PCWSTR File2 + _In_ HANDLE hProcess, + _In_opt_ PCWSTR SymPath, + _In_ PCWSTR Type, + _In_ PCWSTR File1, + _In_ PCWSTR File2 ); PCSTR IMAGEAPI SymSrvGetSupplement( - __in HANDLE hProcess, - __in_opt PCSTR SymPath, - __in PCSTR Node, - __in PCSTR File + _In_ HANDLE hProcess, + _In_opt_ PCSTR SymPath, + _In_ PCSTR Node, + _In_ PCSTR File ); PCWSTR IMAGEAPI SymSrvGetSupplementW( - __in HANDLE hProcess, - __in_opt PCWSTR SymPath, - __in PCWSTR Node, - __in PCWSTR File + _In_ HANDLE hProcess, + _In_opt_ PCWSTR SymPath, + _In_ PCWSTR Node, + _In_ PCWSTR File ); BOOL IMAGEAPI SymSrvGetFileIndexes( - __in PCSTR File, - __out GUID *Id, - __out PDWORD Val1, - __out_opt PDWORD Val2, - __in DWORD Flags + _In_ PCSTR File, + _Out_ GUID *Id, + _Out_ PDWORD Val1, + _Out_opt_ PDWORD Val2, + _In_ DWORD Flags ); BOOL IMAGEAPI SymSrvGetFileIndexesW( - __in PCWSTR File, - __out GUID *Id, - __out PDWORD Val1, - __out_opt PDWORD Val2, - __in DWORD Flags + _In_ PCWSTR File, + _Out_ GUID *Id, + _Out_ PDWORD Val1, + _Out_opt_ PDWORD Val2, + _In_ DWORD Flags ); BOOL IMAGEAPI SymSrvGetFileIndexStringW( - __in HANDLE hProcess, - __in_opt PCWSTR SrvPath, - __in PCWSTR File, - __out_ecount(Size) PWSTR Index, - __in size_t Size, - __in DWORD Flags + _In_ HANDLE hProcess, + _In_opt_ PCWSTR SrvPath, + _In_ PCWSTR File, + _Out_writes_(Size) PWSTR Index, + _In_ size_t Size, + _In_ DWORD Flags ); BOOL IMAGEAPI SymSrvGetFileIndexString( - __in HANDLE hProcess, - __in_opt PCSTR SrvPath, - __in PCSTR File, - __out_ecount(Size) PSTR Index, - __in size_t Size, - __in DWORD Flags + _In_ HANDLE hProcess, + _In_opt_ PCSTR SrvPath, + _In_ PCSTR File, + _Out_writes_(Size) PSTR Index, + _In_ size_t Size, + _In_ DWORD Flags ); typedef struct { @@ -2994,55 +3179,55 @@ typedef struct { BOOL IMAGEAPI SymSrvGetFileIndexInfo( - __in PCSTR File, - __out PSYMSRV_INDEX_INFO Info, - __in DWORD Flags + _In_ PCSTR File, + _Out_ PSYMSRV_INDEX_INFO Info, + _In_ DWORD Flags ); BOOL IMAGEAPI SymSrvGetFileIndexInfoW( - __in PCWSTR File, - __out PSYMSRV_INDEX_INFOW Info, - __in DWORD Flags + _In_ PCWSTR File, + _Out_ PSYMSRV_INDEX_INFOW Info, + _In_ DWORD Flags ); PCSTR IMAGEAPI SymSrvStoreSupplement( - __in HANDLE hProcess, - __in_opt PCSTR SrvPath, - __in PCSTR Node, - __in PCSTR File, - __in DWORD Flags + _In_ HANDLE hProcess, + _In_opt_ PCSTR SrvPath, + _In_ PCSTR Node, + _In_ PCSTR File, + _In_ DWORD Flags ); PCWSTR IMAGEAPI SymSrvStoreSupplementW( - __in HANDLE hProcess, - __in_opt PCWSTR SymPath, - __in PCWSTR Node, - __in PCWSTR File, - __in DWORD Flags + _In_ HANDLE hProcess, + _In_opt_ PCWSTR SymPath, + _In_ PCWSTR Node, + _In_ PCWSTR File, + _In_ DWORD Flags ); PCSTR IMAGEAPI SymSrvStoreFile( - __in HANDLE hProcess, - __in_opt PCSTR SrvPath, - __in PCSTR File, - __in DWORD Flags + _In_ HANDLE hProcess, + _In_opt_ PCSTR SrvPath, + _In_ PCSTR File, + _In_ DWORD Flags ); PCWSTR IMAGEAPI SymSrvStoreFileW( - __in HANDLE hProcess, - __in_opt PCWSTR SrvPath, - __in PCWSTR File, - __in DWORD Flags + _In_ HANDLE hProcess, + _In_opt_ PCWSTR SrvPath, + _In_ PCWSTR File, + _In_ DWORD Flags ); // used by SymGetSymbolFile's "Type" parameter @@ -3053,32 +3238,32 @@ typedef enum { sfPdb, sfMpd, sfMax -}; +} IMAGEHLP_SF_TYPE; BOOL IMAGEAPI SymGetSymbolFile( - __in_opt HANDLE hProcess, - __in_opt PCSTR SymPath, - __in PCSTR ImageFile, - __in DWORD Type, - __out_ecount(cSymbolFile) PSTR SymbolFile, - __in size_t cSymbolFile, - __out_ecount(cDbgFile) PSTR DbgFile, - __in size_t cDbgFile + _In_opt_ HANDLE hProcess, + _In_opt_ PCSTR SymPath, + _In_ PCSTR ImageFile, + _In_ DWORD Type, + _Out_writes_(cSymbolFile) PSTR SymbolFile, + _In_ size_t cSymbolFile, + _Out_writes_(cDbgFile) PSTR DbgFile, + _In_ size_t cDbgFile ); BOOL IMAGEAPI SymGetSymbolFileW( - __in_opt HANDLE hProcess, - __in_opt PCWSTR SymPath, - __in PCWSTR ImageFile, - __in DWORD Type, - __out_ecount(cSymbolFile) PWSTR SymbolFile, - __in size_t cSymbolFile, - __out_ecount(cDbgFile) PWSTR DbgFile, - __in size_t cDbgFile + _In_opt_ HANDLE hProcess, + _In_opt_ PCWSTR SymPath, + _In_ PCWSTR ImageFile, + _In_ DWORD Type, + _Out_writes_(cSymbolFile) PWSTR SymbolFile, + _In_ size_t cSymbolFile, + _Out_writes_(cDbgFile) PWSTR DbgFile, + _In_ size_t cDbgFile ); // @@ -3086,26 +3271,26 @@ SymGetSymbolFileW( // typedef BOOL (WINAPI *PDBGHELP_CREATE_USER_DUMP_CALLBACK)( - __in DWORD DataType, - __in PVOID* Data, - __out LPDWORD DataLength, - __in_opt PVOID UserData + _In_ DWORD DataType, + _In_ PVOID* Data, + _Out_ LPDWORD DataLength, + _In_opt_ PVOID UserData ); BOOL WINAPI DbgHelpCreateUserDump( - __in_opt LPCSTR FileName, - __in PDBGHELP_CREATE_USER_DUMP_CALLBACK Callback, - __in_opt PVOID UserData + _In_opt_ LPCSTR FileName, + _In_ PDBGHELP_CREATE_USER_DUMP_CALLBACK Callback, + _In_opt_ PVOID UserData ); BOOL WINAPI DbgHelpCreateUserDumpW( - __in_opt LPCWSTR FileName, - __in PDBGHELP_CREATE_USER_DUMP_CALLBACK Callback, - __in_opt PVOID UserData + _In_opt_ LPCWSTR FileName, + _In_ PDBGHELP_CREATE_USER_DUMP_CALLBACK Callback, + _In_opt_ PVOID UserData ); // ----------------------------------------------------------------- @@ -3116,10 +3301,10 @@ DbgHelpCreateUserDumpW( BOOL IMAGEAPI SymGetSymFromAddr64( - __in HANDLE hProcess, - __in DWORD64 qwAddr, - __out_opt PDWORD64 pdwDisplacement, - __inout PIMAGEHLP_SYMBOL64 Symbol + _In_ HANDLE hProcess, + _In_ DWORD64 qwAddr, + _Out_opt_ PDWORD64 pdwDisplacement, + _Inout_ PIMAGEHLP_SYMBOL64 Symbol ); @@ -3129,10 +3314,10 @@ SymGetSymFromAddr64( BOOL IMAGEAPI SymGetSymFromAddr( - __in HANDLE hProcess, - __in DWORD dwAddr, - __out_opt PDWORD pdwDisplacement, - __inout PIMAGEHLP_SYMBOL Symbol + _In_ HANDLE hProcess, + _In_ DWORD dwAddr, + _Out_opt_ PDWORD pdwDisplacement, + _Inout_ PIMAGEHLP_SYMBOL Symbol ); #endif @@ -3145,9 +3330,9 @@ SymGetSymFromAddr( BOOL IMAGEAPI SymGetSymFromName64( - __in HANDLE hProcess, - __in PCSTR Name, - __inout PIMAGEHLP_SYMBOL64 Symbol + _In_ HANDLE hProcess, + _In_ PCSTR Name, + _Inout_ PIMAGEHLP_SYMBOL64 Symbol ); #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64) @@ -3156,15 +3341,26 @@ SymGetSymFromName64( BOOL IMAGEAPI SymGetSymFromName( - __in HANDLE hProcess, - __in PCSTR Name, - __inout PIMAGEHLP_SYMBOL Symbol + _In_ HANDLE hProcess, + _In_ PCSTR Name, + _Inout_ PIMAGEHLP_SYMBOL Symbol ); #endif // Symbol server exports +// This is the version of the SYMSRV_EXTENDED_OUTPUT_DATA structure. +#define EXT_OUTPUT_VER 1 + +// This structure indicates the Extended Symsrv.dll output data structure +typedef struct +{ + DWORD sizeOfStruct; // size of the structure + DWORD version; // version number (EXT_OUTPUT_VER) + WCHAR filePtrMsg[MAX_PATH + 1]; // File ptr message data buffer +} SYMSRV_EXTENDED_OUTPUT_DATA, *PSYMSRV_EXTENDED_OUTPUT_DATA; + typedef BOOL (WINAPI *PSYMBOLSERVERPROC)(PCSTR, PCSTR, PVOID, DWORD, DWORD, PSTR); typedef BOOL (WINAPI *PSYMBOLSERVERPROCA)(PCSTR, PCSTR, PVOID, DWORD, DWORD, PSTR); typedef BOOL (WINAPI *PSYMBOLSERVERPROCW)(PCWSTR, PCWSTR, PVOID, DWORD, DWORD, PWSTR); @@ -3195,6 +3391,10 @@ typedef BOOL (WINAPI *PSYMBOLSERVERISSTORE)(PCSTR); typedef BOOL (WINAPI *PSYMBOLSERVERISSTOREW)(PCWSTR); typedef DWORD (WINAPI *PSYMBOLSERVERVERSION)(); typedef BOOL (CALLBACK WINAPI *PSYMBOLSERVERMESSAGEPROC)(UINT_PTR action, ULONG64 data, ULONG64 context); +typedef BOOL (WINAPI *PSYMBOLSERVERWEXPROC)(PCWSTR, PCWSTR, PVOID, DWORD, DWORD, PWSTR, PSYMSRV_EXTENDED_OUTPUT_DATA); +typedef BOOL (WINAPI *PSYMBOLSERVERPINGPROCWEX)(PCWSTR); +typedef BOOL (WINAPI *PSYMBOLSERVERGETOPTIONDATAPROC)(UINT_PTR, PULONG64); +typedef BOOL (WINAPI *PSYMBOLSERVERSETHTTPAUTHHEADER)(_In_ PCWSTR pszAuthHeader); #define SYMSRV_VERSION 2 @@ -3224,19 +3424,43 @@ typedef BOOL (CALLBACK WINAPI *PSYMBOLSERVERMESSAGEPROC)(UINT_PTR action, ULONG6 #define SSRVOPT_STRING 0x00400000 #define SSRVOPT_WINHTTP 0x00800000 #define SSRVOPT_WININET 0x01000000 +#define SSRVOPT_DONT_UNCOMPRESS 0x02000000 +#define SSRVOPT_DISABLE_PING_HOST 0x04000000 +#define SSRVOPT_DISABLE_TIMEOUT 0x08000000 +#define SSRVOPT_ENABLE_COMM_MSG 0x10000000 +#define SSRVOPT_URI_FILTER 0x20000000 +#define SSRVOPT_URI_TIERS 0x40000000 +#define SSRVOPT_RETRY_APP_HANG 0x80000000 -#define SSRVOPT_MAX 0x0100000 +#define SSRVOPT_MAX 0x80000000 #define SSRVOPT_RESET ((ULONG_PTR)-1) +#define NUM_SSRVOPTS 32 + +#define SSRVURI_HTTP_NORMAL 0x01 +#define SSRVURI_HTTP_COMPRESSED 0x02 +#define SSRVURI_HTTP_FILEPTR 0x04 + +#define SSRVURI_UNC_NORMAL 0x10 +#define SSRVURI_UNC_COMPRESSED 0x20 +#define SSRVURI_UNC_FILEPTR 0x40 -#define NUM_SSRVOPTS 30 +#define SSRVURI_HTTP_MASK 0x0F +#define SSRVURI_UNC_MASK 0xF0 +#define SSRVURI_ALL 0xFF + +// Legacy Names +#define SSRVURI_NORMAL SSRVURI_HTTP_NORMAL +#define SSRVURI_COMPRESSED SSRVURI_HTTP_COMPRESSED +#define SSRVURI_FILEPTR SSRVURI_HTTP_FILEPTR #define SSRVACTION_TRACE 1 #define SSRVACTION_QUERYCANCEL 2 #define SSRVACTION_EVENT 3 #define SSRVACTION_EVENTW 4 #define SSRVACTION_SIZE 5 +#define SSRVACTION_HTTPSTATUS 6 #define SYMSTOREOPT_COMPRESS 0x01 #define SYMSTOREOPT_OVERWRITE 0x02 @@ -3254,6 +3478,7 @@ typedef BOOL (CALLBACK WINAPI *PSYMBOLSERVERMESSAGEPROC)(UINT_PTR action, ULONG6 #define UnDecorateSymbolName UnDecorateSymbolNameW #define SymGetLineFromName64 SymGetLineFromNameW64 #define SymGetLineFromAddr64 SymGetLineFromAddrW64 + #define SymGetLineFromInlineContext SymGetLineFromInlineContextW #define SymGetLineNext64 SymGetLineNextW64 #define SymGetLinePrev64 SymGetLinePrevW64 #define SymFromName SymFromNameW @@ -3265,9 +3490,11 @@ typedef BOOL (CALLBACK WINAPI *PSYMBOLSERVERMESSAGEPROC)(UINT_PTR action, ULONG6 #define SymGetTypeFromName SymGetTypeFromNameW #define SymEnumSymbolsForAddr SymEnumSymbolsForAddrW #define SymFromAddr SymFromAddrW + #define SymFromInlineContext SymFromInlineContextW #define SymMatchString SymMatchStringW #define SymEnumSourceFiles SymEnumSourceFilesW #define SymEnumSymbols SymEnumSymbolsW + #define SymEnumSymbolsEx SymEnumSymbolsExW #define SymLoadModuleEx SymLoadModuleExW #define SymSetSearchPath SymSetSearchPathW #define SymGetSearchPath SymGetSearchPathW @@ -3297,6 +3524,7 @@ typedef BOOL (CALLBACK WINAPI *PSYMBOLSERVERMESSAGEPROC)(UINT_PTR action, ULONG6 #define SymGetSourceFileFromToken SymGetSourceFileFromTokenW #define SymGetSourceVarFromToken SymGetSourceVarFromTokenW #define SymGetModuleInfo64 SymGetModuleInfoW64 + #define SymAddSourceStream SymAddSourceStreamW #define SymSrvIsStore SymSrvIsStoreW #define SymSrvDeltaName SymSrvDeltaNameW #define SymSrvGetSupplement SymSrvGetSupplementW @@ -3352,14 +3580,14 @@ DBHLP_DEPRECIATED BOOL IMAGEAPI FindFileInPath( - __in HANDLE hprocess, - __in PCSTR SearchPath, - __in PCSTR FileName, - __in PVOID id, - __in DWORD two, - __in DWORD three, - __in DWORD flags, - __out_ecount(MAX_PATH + 1) PSTR FilePath + _In_ HANDLE hprocess, + _In_ PCSTR SearchPath, + _In_ PCSTR FileName, + _In_ PVOID id, + _In_ DWORD two, + _In_ DWORD three, + _In_ DWORD flags, + _Out_writes_(MAX_PATH + 1) PSTR FilePath ); // You should use SymFindFileInPath if you want to maintain @@ -3369,43 +3597,43 @@ DBHLP_DEPRECIATED BOOL IMAGEAPI FindFileInSearchPath( - __in HANDLE hprocess, - __in PCSTR SearchPath, - __in PCSTR FileName, - __in DWORD one, - __in DWORD two, - __in DWORD three, - __out_ecount(MAX_PATH + 1) PSTR FilePath + _In_ HANDLE hprocess, + _In_ PCSTR SearchPath, + _In_ PCSTR FileName, + _In_ DWORD one, + _In_ DWORD two, + _In_ DWORD three, + _Out_writes_(MAX_PATH + 1) PSTR FilePath ); DBHLP_DEPRECIATED BOOL IMAGEAPI SymEnumSym( - __in HANDLE hProcess, - __in ULONG64 BaseOfDll, - __in PSYM_ENUMERATESYMBOLS_CALLBACK EnumSymbolsCallback, - __in_opt PVOID UserContext + _In_ HANDLE hProcess, + _In_ ULONG64 BaseOfDll, + _In_ PSYM_ENUMERATESYMBOLS_CALLBACK EnumSymbolsCallback, + _In_opt_ PVOID UserContext ); DBHLP_DEPRECIATED BOOL IMAGEAPI SymEnumerateSymbols64( - __in HANDLE hProcess, - __in ULONG64 BaseOfDll, - __in PSYM_ENUMSYMBOLS_CALLBACK64 EnumSymbolsCallback, - __in_opt PVOID UserContext + _In_ HANDLE hProcess, + _In_ ULONG64 BaseOfDll, + _In_ PSYM_ENUMSYMBOLS_CALLBACK64 EnumSymbolsCallback, + _In_opt_ PVOID UserContext ); DBHLP_DEPRECIATED BOOL IMAGEAPI SymEnumerateSymbolsW64( - __in HANDLE hProcess, - __in ULONG64 BaseOfDll, - __in PSYM_ENUMSYMBOLS_CALLBACK64W EnumSymbolsCallback, - __in_opt PVOID UserContext + _In_ HANDLE hProcess, + _In_ ULONG64 BaseOfDll, + _In_ PSYM_ENUMSYMBOLS_CALLBACK64W EnumSymbolsCallback, + _In_opt_ PVOID UserContext ); @@ -3417,20 +3645,20 @@ DBHLP_DEPRECIATED BOOL IMAGEAPI SymEnumerateSymbols( - __in HANDLE hProcess, - __in ULONG BaseOfDll, - __in PSYM_ENUMSYMBOLS_CALLBACK EnumSymbolsCallback, - __in_opt PVOID UserContext + _In_ HANDLE hProcess, + _In_ ULONG BaseOfDll, + _In_ PSYM_ENUMSYMBOLS_CALLBACK EnumSymbolsCallback, + _In_opt_ PVOID UserContext ); DBHLP_DEPRECIATED BOOL IMAGEAPI SymEnumerateSymbolsW( - __in HANDLE hProcess, - __in ULONG BaseOfDll, - __in PSYM_ENUMSYMBOLS_CALLBACKW EnumSymbolsCallback, - __in_opt PVOID UserContext + _In_ HANDLE hProcess, + _In_ ULONG BaseOfDll, + _In_ PSYM_ENUMSYMBOLS_CALLBACKW EnumSymbolsCallback, + _In_opt_ PVOID UserContext ); #endif @@ -3439,12 +3667,12 @@ SymEnumerateSymbolsW( DWORD64 IMAGEAPI SymLoadModule64( - __in HANDLE hProcess, - __in_opt HANDLE hFile, - __in_opt PCSTR ImageName, - __in_opt PCSTR ModuleName, - __in DWORD64 BaseOfDll, - __in DWORD SizeOfDll + _In_ HANDLE hProcess, + _In_opt_ HANDLE hFile, + _In_opt_ PCSTR ImageName, + _In_opt_ PCSTR ModuleName, + _In_ DWORD64 BaseOfDll, + _In_ DWORD SizeOfDll ); #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64) @@ -3453,27 +3681,27 @@ SymLoadModule64( DWORD IMAGEAPI SymLoadModule( - __in HANDLE hProcess, - __in_opt HANDLE hFile, - __in_opt PCSTR ImageName, - __in_opt PCSTR ModuleName, - __in DWORD BaseOfDll, - __in DWORD SizeOfDll + _In_ HANDLE hProcess, + _In_opt_ HANDLE hFile, + _In_opt_ PCSTR ImageName, + _In_opt_ PCSTR ModuleName, + _In_ DWORD BaseOfDll, + _In_ DWORD SizeOfDll ); #endif BOOL IMAGEAPI SymGetSymNext64( - __in HANDLE hProcess, - __inout PIMAGEHLP_SYMBOL64 Symbol + _In_ HANDLE hProcess, + _Inout_ PIMAGEHLP_SYMBOL64 Symbol ); BOOL IMAGEAPI SymGetSymNextW64( - __in HANDLE hProcess, - __inout PIMAGEHLP_SYMBOLW64 Symbol + _In_ HANDLE hProcess, + _Inout_ PIMAGEHLP_SYMBOLW64 Symbol ); #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64) @@ -3483,30 +3711,30 @@ SymGetSymNextW64( BOOL IMAGEAPI SymGetSymNext( - __in HANDLE hProcess, - __inout PIMAGEHLP_SYMBOL Symbol + _In_ HANDLE hProcess, + _Inout_ PIMAGEHLP_SYMBOL Symbol ); BOOL IMAGEAPI SymGetSymNextW( - __in HANDLE hProcess, - __inout PIMAGEHLP_SYMBOLW Symbol + _In_ HANDLE hProcess, + _Inout_ PIMAGEHLP_SYMBOLW Symbol ); #endif BOOL IMAGEAPI SymGetSymPrev64( - __in HANDLE hProcess, - __inout PIMAGEHLP_SYMBOL64 Symbol + _In_ HANDLE hProcess, + _Inout_ PIMAGEHLP_SYMBOL64 Symbol ); BOOL IMAGEAPI SymGetSymPrevW64( - __in HANDLE hProcess, - __inout PIMAGEHLP_SYMBOLW64 Symbol + _In_ HANDLE hProcess, + _Inout_ PIMAGEHLP_SYMBOLW64 Symbol ); #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64) @@ -3516,19 +3744,67 @@ SymGetSymPrevW64( BOOL IMAGEAPI SymGetSymPrev( - __in HANDLE hProcess, - __inout PIMAGEHLP_SYMBOL Symbol + _In_ HANDLE hProcess, + _Inout_ PIMAGEHLP_SYMBOL Symbol ); BOOL IMAGEAPI SymGetSymPrevW( - __in HANDLE hProcess, - __inout PIMAGEHLP_SYMBOLW Symbol + _In_ HANDLE hProcess, + _Inout_ PIMAGEHLP_SYMBOLW Symbol ); #endif +// This type indicates the call back function type +typedef ULONG (__stdcall *LPCALL_BACK_USER_INTERRUPT_ROUTINE )(VOID); + +// Extra data to report for the symbol load summary +typedef struct +{ + PCWSTR pBinPathNonExist; + PCWSTR pSymbolPathNonExist; +}DBGHELP_DATA_REPORT_STRUCT, *PDBGHELP_DATA_REPORT_STRUCT; + +void +IMAGEAPI +SetCheckUserInterruptShared( + _In_ LPCALL_BACK_USER_INTERRUPT_ROUTINE lpStartAddress + ); + +LPCALL_BACK_USER_INTERRUPT_ROUTINE +IMAGEAPI +GetCheckUserInterruptShared( + void + ); + +DWORD +IMAGEAPI +GetSymLoadError( + void + ); + +void +IMAGEAPI +SetSymLoadError( + _In_ DWORD error + ); + +BOOL +IMAGEAPI +ReportSymbolLoadSummary( + _In_ HANDLE hProcess, + _In_opt_ PCWSTR pLoadModule, + _In_ PDBGHELP_DATA_REPORT_STRUCT pSymbolData + ); + +void +IMAGEAPI +RemoveInvalidModuleList( + _In_ HANDLE hProcess + ); + // These values should not be used. // They have been replaced by SYMFLAG_ values. @@ -3562,1033 +3838,77 @@ SymGetSymPrevW( #define IMAGEHLP_SYMBOL_THUNK SYMF_THUNK // 0x2000 #define IMAGEHLP_SYMBOL_INFO_TLSRELATIVE SYMF_TLSREL // 0x4000 -#include - - -#include - -#if defined(_MSC_VER) -#if _MSC_VER >= 800 -#if _MSC_VER >= 1200 -#pragma warning(push) -#endif -#pragma warning(disable:4200) /* Zero length array */ -#pragma warning(disable:4201) /* Nameless struct/union */ -#endif -#endif - -#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, - UnloadedModuleListStream = 14, - MiscInfoStream = 15, - MemoryInfoListStream = 16, - ThreadInfoListStream = 17, - HandleOperationListStream = 18, - TokenStream = 19, - - ceStreamNull = 0x8000, - ceStreamSystemInfo = 0x8001, - ceStreamException = 0x8002, - ceStreamModuleList = 0x8003, - ceStreamProcessList = 0x8004, - ceStreamThreadList = 0x8005, - ceStreamThreadContextList = 0x8006, - ceStreamThreadCallStackList = 0x8007, - ceStreamMemoryVirtualList = 0x8008, - ceStreamMemoryPhysicalList = 0x8009, - ceStreamBucketParameters = 0x800A, - ceStreamProcessModuleMap = 0x800B, - ceStreamDiagnosisList = 0x800C, - - LastReservedStream = 0xffff - -} MINIDUMP_STREAM_TYPE; - - -// -// The minidump system information contains processor and -// Operating System specific information. -// - -// -// 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(). -// - -typedef 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_INFORMATION, *PCPU_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; - - union { - USHORT Reserved0; - struct { - UCHAR NumberOfProcessors; - UCHAR ProductType; - }; - }; - - // - // 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; - - union { - ULONG32 Reserved1; - struct { - USHORT SuiteMask; - USHORT Reserved2; - }; - }; - - CPU_INFORMATION Cpu; - -} MINIDUMP_SYSTEM_INFO, *PMINIDUMP_SYSTEM_INFO; - - -// -// 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. +// RangeMap APIs. // +PVOID +IMAGEAPI +RangeMapCreate( + VOID + ); -typedef struct _MINIDUMP_EXCEPTION_INFORMATION { - DWORD ThreadId; - PEXCEPTION_POINTERS ExceptionPointers; - BOOL ClientPointers; -} MINIDUMP_EXCEPTION_INFORMATION, *PMINIDUMP_EXCEPTION_INFORMATION; - -typedef struct _MINIDUMP_EXCEPTION_INFORMATION64 { - DWORD ThreadId; - ULONG64 ExceptionRecord; - ULONG64 ContextRecord; - BOOL ClientPointers; -} MINIDUMP_EXCEPTION_INFORMATION64, *PMINIDUMP_EXCEPTION_INFORMATION64; - - -// -// Support for capturing system handle state at the time of the dump. -// - -// Per-handle object information varies according to -// the OS, the OS version, the processor type and -// so on. The minidump gives a minidump identifier -// to each possible data format for identification -// purposes but does not control nor describe the actual data. -typedef enum _MINIDUMP_HANDLE_OBJECT_INFORMATION_TYPE { - MiniHandleObjectInformationNone, - MiniThreadInformation1, - MiniMutantInformation1, - MiniMutantInformation2, - MiniProcessInformation1, - MiniProcessInformation2, - MiniHandleObjectInformationTypeMax -} MINIDUMP_HANDLE_OBJECT_INFORMATION_TYPE; - -typedef struct _MINIDUMP_HANDLE_OBJECT_INFORMATION { - RVA NextInfoRva; - ULONG32 InfoType; - ULONG32 SizeOfInfo; - // Raw information follows. -} MINIDUMP_HANDLE_OBJECT_INFORMATION; - -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_DESCRIPTOR_2 { - ULONG64 Handle; - RVA TypeNameRva; - RVA ObjectNameRva; - ULONG32 Attributes; - ULONG32 GrantedAccess; - ULONG32 HandleCount; - ULONG32 PointerCount; - RVA ObjectInfoRva; - ULONG32 Reserved0; -} MINIDUMP_HANDLE_DESCRIPTOR_2, *PMINIDUMP_HANDLE_DESCRIPTOR_2; - -// The latest MINIDUMP_HANDLE_DESCRIPTOR definition. -typedef MINIDUMP_HANDLE_DESCRIPTOR_2 MINIDUMP_HANDLE_DESCRIPTOR_N; -typedef MINIDUMP_HANDLE_DESCRIPTOR_N *PMINIDUMP_HANDLE_DESCRIPTOR_N; - -typedef struct _MINIDUMP_HANDLE_DATA_STREAM { - ULONG32 SizeOfHeader; - ULONG32 SizeOfDescriptor; - ULONG32 NumberOfDescriptors; - ULONG32 Reserved; -} MINIDUMP_HANDLE_DATA_STREAM, *PMINIDUMP_HANDLE_DATA_STREAM; - -// Some operating systems can track the last operations -// performed on a handle. For example, Application Verifier -// can enable this for some versions of Windows. The -// handle operation list collects handle operations -// known for the dump target. -// Each entry is an AVRF_HANDLE_OPERATION. -typedef struct _MINIDUMP_HANDLE_OPERATION_LIST { - ULONG32 SizeOfHeader; - ULONG32 SizeOfEntry; - ULONG32 NumberOfEntries; - ULONG32 Reserved; -} MINIDUMP_HANDLE_OPERATION_LIST, *PMINIDUMP_HANDLE_OPERATION_LIST; - - -// -// 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; - - -// -// The MINIDUMP_UNLOADED_MODULE contains information about a -// a specific module that was previously loaded but no -// longer is. This can help with diagnosing problems where -// callers attempt to call code that is no longer loaded. -// - -typedef struct _MINIDUMP_UNLOADED_MODULE { - ULONG64 BaseOfImage; - ULONG32 SizeOfImage; - ULONG32 CheckSum; - ULONG32 TimeDateStamp; - RVA ModuleNameRva; -} MINIDUMP_UNLOADED_MODULE, *PMINIDUMP_UNLOADED_MODULE; - - -// -// The minidump unloaded module list is a container for unloaded modules. -// - -typedef struct _MINIDUMP_UNLOADED_MODULE_LIST { - ULONG32 SizeOfHeader; - ULONG32 SizeOfEntry; - ULONG32 NumberOfEntries; -} MINIDUMP_UNLOADED_MODULE_LIST, *PMINIDUMP_UNLOADED_MODULE_LIST; - - -// -// The miscellaneous information stream contains a variety -// of small pieces of information. A member is valid if -// it's within the available size and its corresponding -// bit is set. -// - -#define MINIDUMP_MISC1_PROCESS_ID 0x00000001 -#define MINIDUMP_MISC1_PROCESS_TIMES 0x00000002 -#define MINIDUMP_MISC1_PROCESSOR_POWER_INFO 0x00000004 -#define MINIDUMP_MISC3_PROCESS_INTEGRITY 0x00000010 -#define MINIDUMP_MISC3_PROCESS_EXECUTE_FLAGS 0x00000020 -#define MINIDUMP_MISC3_TIMEZONE 0x00000040 -#define MINIDUMP_MISC3_PROTECTED_PROCESS 0x00000080 - -typedef struct _MINIDUMP_MISC_INFO { - ULONG32 SizeOfInfo; - ULONG32 Flags1; - ULONG32 ProcessId; - ULONG32 ProcessCreateTime; - ULONG32 ProcessUserTime; - ULONG32 ProcessKernelTime; -} MINIDUMP_MISC_INFO, *PMINIDUMP_MISC_INFO; - -typedef struct _MINIDUMP_MISC_INFO_2 { - ULONG32 SizeOfInfo; - ULONG32 Flags1; - ULONG32 ProcessId; - ULONG32 ProcessCreateTime; - ULONG32 ProcessUserTime; - ULONG32 ProcessKernelTime; - ULONG32 ProcessorMaxMhz; - ULONG32 ProcessorCurrentMhz; - ULONG32 ProcessorMhzLimit; - ULONG32 ProcessorMaxIdleState; - ULONG32 ProcessorCurrentIdleState; -} MINIDUMP_MISC_INFO_2, *PMINIDUMP_MISC_INFO_2; - -typedef struct _MINIDUMP_MISC_INFO_3 { - ULONG32 SizeOfInfo; - ULONG32 Flags1; - ULONG32 ProcessId; - ULONG32 ProcessCreateTime; - ULONG32 ProcessUserTime; - ULONG32 ProcessKernelTime; - ULONG32 ProcessorMaxMhz; - ULONG32 ProcessorCurrentMhz; - ULONG32 ProcessorMhzLimit; - ULONG32 ProcessorMaxIdleState; - ULONG32 ProcessorCurrentIdleState; - ULONG32 ProcessIntegrityLevel; - ULONG32 ProcessExecuteFlags; - ULONG32 ProtectedProcess; - ULONG32 TimeZoneId; - TIME_ZONE_INFORMATION TimeZone; -} MINIDUMP_MISC_INFO_3, *PMINIDUMP_MISC_INFO_3; - -// The latest MINIDUMP_MISC_INFO definition. -typedef MINIDUMP_MISC_INFO_3 MINIDUMP_MISC_INFO_N; -typedef MINIDUMP_MISC_INFO_N* PMINIDUMP_MISC_INFO_N; - - -// -// The memory information stream contains memory region -// description information. This stream corresponds to -// what VirtualQuery would return for the process the -// dump was created for. -// - -typedef struct _MINIDUMP_MEMORY_INFO { - ULONG64 BaseAddress; - ULONG64 AllocationBase; - ULONG32 AllocationProtect; - ULONG32 __alignment1; - ULONG64 RegionSize; - ULONG32 State; - ULONG32 Protect; - ULONG32 Type; - ULONG32 __alignment2; -} MINIDUMP_MEMORY_INFO, *PMINIDUMP_MEMORY_INFO; - -typedef struct _MINIDUMP_MEMORY_INFO_LIST { - ULONG SizeOfHeader; - ULONG SizeOfEntry; - ULONG64 NumberOfEntries; -} MINIDUMP_MEMORY_INFO_LIST, *PMINIDUMP_MEMORY_INFO_LIST; - - -// -// The memory information stream contains memory region -// description information. This stream corresponds to -// what VirtualQuery would return for the process the -// dump was created for. -// - -// Thread dump writer status flags. -#define MINIDUMP_THREAD_INFO_ERROR_THREAD 0x00000001 -#define MINIDUMP_THREAD_INFO_WRITING_THREAD 0x00000002 -#define MINIDUMP_THREAD_INFO_EXITED_THREAD 0x00000004 -#define MINIDUMP_THREAD_INFO_INVALID_INFO 0x00000008 -#define MINIDUMP_THREAD_INFO_INVALID_CONTEXT 0x00000010 -#define MINIDUMP_THREAD_INFO_INVALID_TEB 0x00000020 - -typedef struct _MINIDUMP_THREAD_INFO { - ULONG32 ThreadId; - ULONG32 DumpFlags; - ULONG32 DumpError; - ULONG32 ExitStatus; - ULONG64 CreateTime; - ULONG64 ExitTime; - ULONG64 KernelTime; - ULONG64 UserTime; - ULONG64 StartAddress; - ULONG64 Affinity; -} MINIDUMP_THREAD_INFO, *PMINIDUMP_THREAD_INFO; - -typedef struct _MINIDUMP_THREAD_INFO_LIST { - ULONG SizeOfHeader; - ULONG SizeOfEntry; - ULONG NumberOfEntries; -} MINIDUMP_THREAD_INFO_LIST, *PMINIDUMP_THREAD_INFO_LIST; - -// -// Support for token information. -// -typedef struct _MINIDUMP_TOKEN_INFO_HEADER { - ULONG TokenSize; // The size of the token structure. - ULONG TokenId; // The PID in NtOpenProcessToken() call or TID in NtOpenThreadToken() call. - ULONG64 TokenHandle; // The handle value returned. -} MINIDUMP_TOKEN_INFO_HEADER, *PMINIDUMP_TOKEN_INFO_HEADER; - -typedef struct _MINIDUMP_TOKEN_INFO_LIST { - ULONG TokenListSize; - ULONG TokenListEntries; - ULONG ListHeaderSize; - ULONG ElementHeaderSize; -} MINIDUMP_TOKEN_INFO_LIST, *PMINIDUMP_TOKEN_INFO_LIST; - -// -// 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; - ULONG BufferSize; - PVOID Buffer; - -} MINIDUMP_USER_STREAM, *PMINIDUMP_USER_STREAM; - - -typedef struct _MINIDUMP_USER_STREAM_INFORMATION { - ULONG 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, - MemoryCallback, - CancelCallback, - WriteKernelMinidumpCallback, - KernelMinidumpStatusCallback, - RemoveMemoryCallback, - IncludeVmRegionCallback, - IoStartCallback, - IoWriteAllCallback, - IoFinishCallback, - ReadMemoryFailureCallback, - SecondaryFlagsCallback, -} MINIDUMP_CALLBACK_TYPE; - - -typedef struct _MINIDUMP_THREAD_CALLBACK { - ULONG ThreadId; - HANDLE ThreadHandle; - CONTEXT Context; - ULONG SizeOfContext; - ULONG64 StackBase; - ULONG64 StackEnd; -} MINIDUMP_THREAD_CALLBACK, *PMINIDUMP_THREAD_CALLBACK; - - -typedef struct _MINIDUMP_THREAD_EX_CALLBACK { - ULONG ThreadId; - HANDLE ThreadHandle; - CONTEXT Context; - ULONG SizeOfContext; - ULONG64 StackBase; - ULONG64 StackEnd; - ULONG64 BackingStoreBase; - ULONG64 BackingStoreEnd; -} MINIDUMP_THREAD_EX_CALLBACK, *PMINIDUMP_THREAD_EX_CALLBACK; - - -typedef struct _MINIDUMP_INCLUDE_THREAD_CALLBACK { - ULONG ThreadId; -} MINIDUMP_INCLUDE_THREAD_CALLBACK, *PMINIDUMP_INCLUDE_THREAD_CALLBACK; - - -typedef enum _THREAD_WRITE_FLAGS { - ThreadWriteThread = 0x0001, - ThreadWriteStack = 0x0002, - ThreadWriteContext = 0x0004, - ThreadWriteBackingStore = 0x0008, - ThreadWriteInstructionWindow = 0x0010, - ThreadWriteThreadData = 0x0020, - ThreadWriteThreadInfo = 0x0040, -} THREAD_WRITE_FLAGS; - -typedef struct _MINIDUMP_MODULE_CALLBACK { - PWCHAR FullPath; - ULONG64 BaseOfImage; - ULONG SizeOfImage; - ULONG CheckSum; - ULONG TimeDateStamp; - VS_FIXEDFILEINFO VersionInfo; - PVOID CvRecord; - ULONG SizeOfCvRecord; - PVOID MiscRecord; - ULONG 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, - ModuleWriteTlsData = 0x0020, - ModuleWriteCodeSegs = 0x0040, -} MODULE_WRITE_FLAGS; - - -typedef struct _MINIDUMP_IO_CALLBACK { - HANDLE Handle; - ULONG64 Offset; - PVOID Buffer; - ULONG BufferBytes; -} MINIDUMP_IO_CALLBACK, *PMINIDUMP_IO_CALLBACK; - - -typedef struct _MINIDUMP_READ_MEMORY_FAILURE_CALLBACK -{ - ULONG64 Offset; - ULONG Bytes; - HRESULT FailureStatus; -} MINIDUMP_READ_MEMORY_FAILURE_CALLBACK, - *PMINIDUMP_READ_MEMORY_FAILURE_CALLBACK; - - -typedef struct _MINIDUMP_CALLBACK_INPUT { - ULONG ProcessId; - HANDLE ProcessHandle; - ULONG CallbackType; - union { - HRESULT Status; - MINIDUMP_THREAD_CALLBACK Thread; - MINIDUMP_THREAD_EX_CALLBACK ThreadEx; - MINIDUMP_MODULE_CALLBACK Module; - MINIDUMP_INCLUDE_THREAD_CALLBACK IncludeThread; - MINIDUMP_INCLUDE_MODULE_CALLBACK IncludeModule; - MINIDUMP_IO_CALLBACK Io; - MINIDUMP_READ_MEMORY_FAILURE_CALLBACK ReadMemoryFailure; - ULONG SecondaryFlags; - }; -} MINIDUMP_CALLBACK_INPUT, *PMINIDUMP_CALLBACK_INPUT; - -typedef struct _MINIDUMP_CALLBACK_OUTPUT { - union { - ULONG ModuleWriteFlags; - ULONG ThreadWriteFlags; - ULONG SecondaryFlags; - struct { - ULONG64 MemoryBase; - ULONG MemorySize; - }; - struct { - BOOL CheckCancel; - BOOL Cancel; - }; - HANDLE Handle; - struct { - MINIDUMP_MEMORY_INFO VmRegion; - BOOL Continue; - }; - HRESULT Status; - }; -} 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. -// -// On some operating systems a list of modules that were -// recently unloaded is kept in addition to the currently -// loaded module list. This information can be saved in -// the dump if desired. -// -// Stack and backing store memory can be scanned for referenced -// pages in order to pick up data referenced by locals or other -// stack memory. This can increase the size of a dump significantly. -// -// Module paths may contain undesired information such as user names -// or other important directory names so they can be stripped. This -// option reduces the ability to locate the proper image later -// and should only be used in certain situations. -// -// Complete operating system per-process and per-thread information can -// be gathered and stored in the dump. -// -// The virtual address space can be scanned for various types -// of memory to be included in the dump. -// -// Code which is concerned with potentially private information -// getting into the minidump can set a flag that automatically -// modifies all existing and future flags to avoid placing -// unnecessary data in the dump. Basic data, such as stack -// information, will still be included but optional data, such -// as indirect memory, will not. -// -// When doing a full memory dump it's possible to store all -// of the enumerated memory region descriptive information -// in a memory information stream. -// -// Additional thread information beyond the basic thread -// structure can be collected if desired. -// -// A minidump with code segments includes all of the code -// and code-related sections from loaded modules in order -// to capture executable content. -// -// MiniDumpWithoutAuxiliaryState turns off any secondary, -// auxiliary-supported memory gathering. -// -// MiniDumpWithFullAuxiliaryState asks any present auxiliary -// data providers to include all of their state in the dump. -// The exact set of what is provided depends on the auxiliary. -// This can be quite large. -// - -typedef enum _MINIDUMP_TYPE { - MiniDumpNormal = 0x00000000, - MiniDumpWithDataSegs = 0x00000001, - MiniDumpWithFullMemory = 0x00000002, - MiniDumpWithHandleData = 0x00000004, - MiniDumpFilterMemory = 0x00000008, - MiniDumpScanMemory = 0x00000010, - MiniDumpWithUnloadedModules = 0x00000020, - MiniDumpWithIndirectlyReferencedMemory = 0x00000040, - MiniDumpFilterModulePaths = 0x00000080, - MiniDumpWithProcessThreadData = 0x00000100, - MiniDumpWithPrivateReadWriteMemory = 0x00000200, - MiniDumpWithoutOptionalData = 0x00000400, - MiniDumpWithFullMemoryInfo = 0x00000800, - MiniDumpWithThreadInfo = 0x00001000, - MiniDumpWithCodeSegs = 0x00002000, - MiniDumpWithoutAuxiliaryState = 0x00004000, - MiniDumpWithFullAuxiliaryState = 0x00008000, - MiniDumpWithPrivateWriteCopyMemory = 0x00010000, - MiniDumpIgnoreInaccessibleMemory = 0x00020000, - MiniDumpWithTokenInformation = 0x00040000, - MiniDumpValidTypeFlags = 0x0007ffff, -} MINIDUMP_TYPE; - -// -// In addition to the primary flags provided to -// MiniDumpWriteDump there are additional, less -// frequently used options queried via the secondary -// flags callback. -// -// MiniSecondaryWithoutPowerInfo suppresses the minidump -// query that retrieves processor power information for -// MINIDUMP_MISC_INFO. -// - -typedef enum _MINIDUMP_SECONDARY_FLAGS { - MiniSecondaryWithoutPowerInfo = 0x00000001, - - MiniSecondaryValidFlags = 0x00000001, -} MINIDUMP_SECONDARY_FLAGS; +VOID +IMAGEAPI +RangeMapFree( + _In_opt_ PVOID RmapHandle + ); +#define IMAGEHLP_RMAP_MAPPED_FLAT 0x00000001 +#define IMAGEHLP_RMAP_BIG_ENDIAN 0x00000002 +#define IMAGEHLP_RMAP_IGNORE_MISCOMPARE 0x00000004 -// -// The minidump callback should modify the FieldsToWrite parameter to reflect -// what portions of the specified thread or module should be written to the -// file. -// +#define IMAGEHLP_RMAP_LOAD_RW_DATA_SECTIONS 0x20000000 +#define IMAGEHLP_RMAP_OMIT_SHARED_RW_DATA_SECTIONS 0x40000000 +#define IMAGEHLP_RMAP_FIXUP_IMAGEBASE 0x80000000 -typedef BOOL -(WINAPI * MINIDUMP_CALLBACK_ROUTINE) ( - __inout PVOID CallbackParam, - __in PMINIDUMP_CALLBACK_INPUT CallbackInput, - __inout PMINIDUMP_CALLBACK_OUTPUT CallbackOutput +IMAGEAPI +RangeMapAddPeImageSections( + _In_ PVOID RmapHandle, + _In_opt_ PCWSTR ImageName, + _In_reads_bytes_(MappingBytes) PVOID MappedImage, + _In_ DWORD MappingBytes, + _In_ DWORD64 ImageBase, + _In_ DWORD64 UserTag, + _In_ DWORD MappingFlags ); -typedef struct _MINIDUMP_CALLBACK_INFORMATION { - MINIDUMP_CALLBACK_ROUTINE CallbackRoutine; - PVOID CallbackParam; -} MINIDUMP_CALLBACK_INFORMATION, *PMINIDUMP_CALLBACK_INFORMATION; - - - -//++ -// -// PVOID -// RVA_TO_ADDR( -// PVOID Mapping, -// ULONG 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 +IMAGEAPI +RangeMapRemove( + _In_ PVOID RmapHandle, + _In_ DWORD64 UserTag + ); BOOL -WINAPI -MiniDumpWriteDump( - __in HANDLE hProcess, - __in DWORD ProcessId, - __in HANDLE hFile, - __in MINIDUMP_TYPE DumpType, - __in_opt PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, - __in_opt PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, - __in_opt PMINIDUMP_CALLBACK_INFORMATION CallbackParam +IMAGEAPI +RangeMapRead( + _In_ PVOID RmapHandle, + _In_ DWORD64 Offset, + _Out_writes_bytes_to_(RequestBytes, *DoneBytes) PVOID Buffer, + _In_ DWORD RequestBytes, + _In_ DWORD Flags, + _Out_opt_ PDWORD DoneBytes ); BOOL -WINAPI -MiniDumpReadDumpStream( - __in PVOID BaseOfDump, - __in ULONG StreamNumber, - __deref_out_opt PMINIDUMP_DIRECTORY * Dir, - __deref_out_opt PVOID * StreamPointer, - __out_opt ULONG * StreamSize - ); - -#if defined(_MSC_VER) -#if _MSC_VER >= 800 -#if _MSC_VER >= 1200 -#pragma warning(pop) -#else -#pragma warning(default:4200) /* Zero length array */ -#pragma warning(default:4201) /* Nameless struct/union */ -#endif -#endif -#endif +IMAGEAPI +RangeMapWrite( + _In_ PVOID RmapHandle, + _In_ DWORD64 Offset, + _In_reads_bytes_(RequestBytes) PVOID Buffer, + _In_ DWORD RequestBytes, + _In_ DWORD Flags, + _Out_opt_ PDWORD DoneBytes + ); #include -#ifdef __cplusplus -} -#endif +#include -#endif // _DBGHELP_ +#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_PKG_WER) */ +#pragma endregion + +#endif // _DBGHELP_ diff --git a/lib/dbghelp/include/minidumpapiset.h b/lib/dbghelp/include/minidumpapiset.h new file mode 100644 index 00000000..d6157805 --- /dev/null +++ b/lib/dbghelp/include/minidumpapiset.h @@ -0,0 +1,1397 @@ + +// Copyright (C) Microsoft Corporation. All rights reserved. + + +#if defined(_MSC_VER) +#pragma once +#endif + +#ifndef _MINIDUMP_H +#define _MINIDUMP_H + +#ifdef _CONTRACT_GEN +#include +#include +#include +#include +#endif +#include +#include + +/* APISET_NAME: api-ms-win-core-debug-minidump-l1 */ + +#if !defined(RC_INVOKED) + +#ifndef _APISET_MINIDUMP_VER +#ifdef _APISET_TARGET_VERSION +#if _APISET_TARGET_VERSION >= _APISET_TARGET_VERSION_WINTHRESHOLD +#define _APISET_MINIDUMP_VER 0x0100 +#endif +#endif +#endif + +#endif // !defined(RC_INVOKED) + + +#pragma region Desktop Family + +#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) + +// HEXTRACT: hide_line begin_dbghelp begin_imagehlp + +#include + + +#if defined(_MSC_VER) + +#if _MSC_VER >= 800 + +#if _MSC_VER >= 1200 +#pragma warning(push) +#endif +#pragma warning(disable:4200) /* Zero length array */ +#pragma warning(disable:4201) /* Nameless struct/union */ +#endif +#endif + +#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, + UnloadedModuleListStream = 14, + MiscInfoStream = 15, + MemoryInfoListStream = 16, + ThreadInfoListStream = 17, + HandleOperationListStream = 18, + TokenStream = 19, + JavaScriptDataStream = 20, + SystemMemoryInfoStream = 21, + ProcessVmCountersStream = 22, + IptTraceStream = 23, + ThreadNamesStream = 24, + + ceStreamNull = 0x8000, + ceStreamSystemInfo = 0x8001, + ceStreamException = 0x8002, + ceStreamModuleList = 0x8003, + ceStreamProcessList = 0x8004, + ceStreamThreadList = 0x8005, + ceStreamThreadContextList = 0x8006, + ceStreamThreadCallStackList = 0x8007, + ceStreamMemoryVirtualList = 0x8008, + ceStreamMemoryPhysicalList = 0x8009, + ceStreamBucketParameters = 0x800A, + ceStreamProcessModuleMap = 0x800B, + ceStreamDiagnosisList = 0x800C, + + LastReservedStream = 0xffff + +} MINIDUMP_STREAM_TYPE; + + +// +// The minidump system information contains processor and +// Operating System specific information. +// + +// +// 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(). +// + +typedef 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_INFORMATION, *PCPU_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; + + union { + USHORT Reserved0; + struct { + UCHAR NumberOfProcessors; + UCHAR ProductType; + }; + }; + + // + // 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; + + union { + ULONG32 Reserved1; + struct { + USHORT SuiteMask; + USHORT Reserved2; + }; + }; + + CPU_INFORMATION Cpu; + +} MINIDUMP_SYSTEM_INFO, *PMINIDUMP_SYSTEM_INFO; + + +// +// 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; + +typedef struct _MINIDUMP_EXCEPTION_INFORMATION64 { + DWORD ThreadId; + ULONG64 ExceptionRecord; + ULONG64 ContextRecord; + BOOL ClientPointers; +} MINIDUMP_EXCEPTION_INFORMATION64, *PMINIDUMP_EXCEPTION_INFORMATION64; + + +// +// Support for capturing system handle state at the time of the dump. +// + +// Per-handle object information varies according to +// the OS, the OS version, the processor type and +// so on. The minidump gives a minidump identifier +// to each possible data format for identification +// purposes but does not control nor describe the actual data. +typedef enum _MINIDUMP_HANDLE_OBJECT_INFORMATION_TYPE { + MiniHandleObjectInformationNone, + MiniThreadInformation1, + MiniMutantInformation1, + MiniMutantInformation2, + MiniProcessInformation1, + MiniProcessInformation2, + MiniEventInformation1, + MiniSectionInformation1, + MiniSemaphoreInformation1, + MiniHandleObjectInformationTypeMax +} MINIDUMP_HANDLE_OBJECT_INFORMATION_TYPE; + +typedef struct _MINIDUMP_HANDLE_OBJECT_INFORMATION { + RVA NextInfoRva; + ULONG32 InfoType; + ULONG32 SizeOfInfo; + // Raw information follows. +} MINIDUMP_HANDLE_OBJECT_INFORMATION; + +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_DESCRIPTOR_2 { + ULONG64 Handle; + RVA TypeNameRva; + RVA ObjectNameRva; + ULONG32 Attributes; + ULONG32 GrantedAccess; + ULONG32 HandleCount; + ULONG32 PointerCount; + RVA ObjectInfoRva; + ULONG32 Reserved0; +} MINIDUMP_HANDLE_DESCRIPTOR_2, *PMINIDUMP_HANDLE_DESCRIPTOR_2; + +// The latest MINIDUMP_HANDLE_DESCRIPTOR definition. +typedef MINIDUMP_HANDLE_DESCRIPTOR_2 MINIDUMP_HANDLE_DESCRIPTOR_N; +typedef MINIDUMP_HANDLE_DESCRIPTOR_N *PMINIDUMP_HANDLE_DESCRIPTOR_N; + +typedef struct _MINIDUMP_HANDLE_DATA_STREAM { + ULONG32 SizeOfHeader; + ULONG32 SizeOfDescriptor; + ULONG32 NumberOfDescriptors; + ULONG32 Reserved; +} MINIDUMP_HANDLE_DATA_STREAM, *PMINIDUMP_HANDLE_DATA_STREAM; + +// Some operating systems can track the last operations +// performed on a handle. For example, Application Verifier +// can enable this for some versions of Windows. The +// handle operation list collects handle operations +// known for the dump target. +// Each entry is an AVRF_HANDLE_OPERATION. +typedef struct _MINIDUMP_HANDLE_OPERATION_LIST { + ULONG32 SizeOfHeader; + ULONG32 SizeOfEntry; + ULONG32 NumberOfEntries; + ULONG32 Reserved; +} MINIDUMP_HANDLE_OPERATION_LIST, *PMINIDUMP_HANDLE_OPERATION_LIST; + + +// +// 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; + + +// +// The MINIDUMP_UNLOADED_MODULE contains information about a +// a specific module that was previously loaded but no +// longer is. This can help with diagnosing problems where +// callers attempt to call code that is no longer loaded. +// + +typedef struct _MINIDUMP_UNLOADED_MODULE { + ULONG64 BaseOfImage; + ULONG32 SizeOfImage; + ULONG32 CheckSum; + ULONG32 TimeDateStamp; + RVA ModuleNameRva; +} MINIDUMP_UNLOADED_MODULE, *PMINIDUMP_UNLOADED_MODULE; + + +// +// The minidump unloaded module list is a container for unloaded modules. +// + +typedef struct _MINIDUMP_UNLOADED_MODULE_LIST { + ULONG32 SizeOfHeader; + ULONG32 SizeOfEntry; + ULONG32 NumberOfEntries; +} MINIDUMP_UNLOADED_MODULE_LIST, *PMINIDUMP_UNLOADED_MODULE_LIST; + +// +// The XSTATE_CONFIG_FEATURE_MSC_INFO struct is used to determine if the x86/amd64 machine +// supports a specific XState feature. +// Also, it is used to locate the XState context feature (AVX) in the context extended buffer. +// + +typedef struct _XSTATE_CONFIG_FEATURE_MSC_INFO +{ + ULONG32 SizeOfInfo; + ULONG32 ContextSize; + ULONG64 EnabledFeatures; + XSTATE_FEATURE Features[MAXIMUM_XSTATE_FEATURES]; +} XSTATE_CONFIG_FEATURE_MSC_INFO, *PXSTATE_CONFIG_FEATURE_MSC_INFO; + +// +// The miscellaneous information stream contains a variety +// of small pieces of information. A member is valid if +// it's within the available size and its corresponding +// bit is set. +// + +#define MINIDUMP_MISC1_PROCESS_ID 0x00000001 +#define MINIDUMP_MISC1_PROCESS_TIMES 0x00000002 +#define MINIDUMP_MISC1_PROCESSOR_POWER_INFO 0x00000004 +#define MINIDUMP_MISC3_PROCESS_INTEGRITY 0x00000010 +#define MINIDUMP_MISC3_PROCESS_EXECUTE_FLAGS 0x00000020 +#define MINIDUMP_MISC3_TIMEZONE 0x00000040 +#define MINIDUMP_MISC3_PROTECTED_PROCESS 0x00000080 +#define MINIDUMP_MISC4_BUILDSTRING 0x00000100 +#define MINIDUMP_MISC5_PROCESS_COOKIE 0x00000200 + +typedef struct _MINIDUMP_MISC_INFO { + ULONG32 SizeOfInfo; + ULONG32 Flags1; + ULONG32 ProcessId; + ULONG32 ProcessCreateTime; + ULONG32 ProcessUserTime; + ULONG32 ProcessKernelTime; +} MINIDUMP_MISC_INFO, *PMINIDUMP_MISC_INFO; + +typedef struct _MINIDUMP_MISC_INFO_2 { + ULONG32 SizeOfInfo; + ULONG32 Flags1; + ULONG32 ProcessId; + ULONG32 ProcessCreateTime; + ULONG32 ProcessUserTime; + ULONG32 ProcessKernelTime; + ULONG32 ProcessorMaxMhz; + ULONG32 ProcessorCurrentMhz; + ULONG32 ProcessorMhzLimit; + ULONG32 ProcessorMaxIdleState; + ULONG32 ProcessorCurrentIdleState; +} MINIDUMP_MISC_INFO_2, *PMINIDUMP_MISC_INFO_2; + +typedef struct _MINIDUMP_MISC_INFO_3 { + ULONG32 SizeOfInfo; + ULONG32 Flags1; + ULONG32 ProcessId; + ULONG32 ProcessCreateTime; + ULONG32 ProcessUserTime; + ULONG32 ProcessKernelTime; + ULONG32 ProcessorMaxMhz; + ULONG32 ProcessorCurrentMhz; + ULONG32 ProcessorMhzLimit; + ULONG32 ProcessorMaxIdleState; + ULONG32 ProcessorCurrentIdleState; + ULONG32 ProcessIntegrityLevel; + ULONG32 ProcessExecuteFlags; + ULONG32 ProtectedProcess; + ULONG32 TimeZoneId; + TIME_ZONE_INFORMATION TimeZone; +} MINIDUMP_MISC_INFO_3, *PMINIDUMP_MISC_INFO_3; + +typedef struct _MINIDUMP_MISC_INFO_4 { + ULONG32 SizeOfInfo; + ULONG32 Flags1; + ULONG32 ProcessId; + ULONG32 ProcessCreateTime; + ULONG32 ProcessUserTime; + ULONG32 ProcessKernelTime; + ULONG32 ProcessorMaxMhz; + ULONG32 ProcessorCurrentMhz; + ULONG32 ProcessorMhzLimit; + ULONG32 ProcessorMaxIdleState; + ULONG32 ProcessorCurrentIdleState; + ULONG32 ProcessIntegrityLevel; + ULONG32 ProcessExecuteFlags; + ULONG32 ProtectedProcess; + ULONG32 TimeZoneId; + TIME_ZONE_INFORMATION TimeZone; + WCHAR BuildString[MAX_PATH]; + WCHAR DbgBldStr[40]; +} MINIDUMP_MISC_INFO_4, *PMINIDUMP_MISC_INFO_4; + +typedef struct _MINIDUMP_MISC_INFO_5 { + ULONG32 SizeOfInfo; + ULONG32 Flags1; + ULONG32 ProcessId; + ULONG32 ProcessCreateTime; + ULONG32 ProcessUserTime; + ULONG32 ProcessKernelTime; + ULONG32 ProcessorMaxMhz; + ULONG32 ProcessorCurrentMhz; + ULONG32 ProcessorMhzLimit; + ULONG32 ProcessorMaxIdleState; + ULONG32 ProcessorCurrentIdleState; + ULONG32 ProcessIntegrityLevel; + ULONG32 ProcessExecuteFlags; + ULONG32 ProtectedProcess; + ULONG32 TimeZoneId; + TIME_ZONE_INFORMATION TimeZone; + WCHAR BuildString[MAX_PATH]; + WCHAR DbgBldStr[40]; + XSTATE_CONFIG_FEATURE_MSC_INFO XStateData; + ULONG32 ProcessCookie; +} MINIDUMP_MISC_INFO_5, *PMINIDUMP_MISC_INFO_5; + +// The latest MINIDUMP_MISC_INFO definition. +typedef MINIDUMP_MISC_INFO_5 MINIDUMP_MISC_INFO_N; +typedef MINIDUMP_MISC_INFO_N* PMINIDUMP_MISC_INFO_N; + +// +// The memory information stream contains memory region +// description information. This stream corresponds to +// what VirtualQuery would return for the process the +// dump was created for. +// + +typedef struct _MINIDUMP_MEMORY_INFO { + ULONG64 BaseAddress; + ULONG64 AllocationBase; + ULONG32 AllocationProtect; + ULONG32 __alignment1; + ULONG64 RegionSize; + ULONG32 State; + ULONG32 Protect; + ULONG32 Type; + ULONG32 __alignment2; +} MINIDUMP_MEMORY_INFO, *PMINIDUMP_MEMORY_INFO; + +typedef struct _MINIDUMP_MEMORY_INFO_LIST { + ULONG SizeOfHeader; + ULONG SizeOfEntry; + ULONG64 NumberOfEntries; +} MINIDUMP_MEMORY_INFO_LIST, *PMINIDUMP_MEMORY_INFO_LIST; + + +// +// The thread names stream in a minidump, containing information +// about each thread's name/description (if available). +// + +typedef struct _MINIDUMP_THREAD_NAME { + ULONG ThreadId; + RVA64 RvaOfThreadName; +} MINIDUMP_THREAD_NAME, *PMINIDUMP_THREAD_NAME; + +typedef struct _MINIDUMP_THREAD_NAME_LIST { + ULONG NumberOfThreadNames; + MINIDUMP_THREAD_NAME ThreadNames[0]; // Variable size buffer +} MINIDUMP_THREAD_NAME_LIST, *PMINIDUMP_THREAD_NAME_LIST; + +// +// The memory information stream contains memory region +// description information. This stream corresponds to +// what VirtualQuery would return for the process the +// dump was created for. +// + +// Thread dump writer status flags. +#define MINIDUMP_THREAD_INFO_ERROR_THREAD 0x00000001 +#define MINIDUMP_THREAD_INFO_WRITING_THREAD 0x00000002 +#define MINIDUMP_THREAD_INFO_EXITED_THREAD 0x00000004 +#define MINIDUMP_THREAD_INFO_INVALID_INFO 0x00000008 +#define MINIDUMP_THREAD_INFO_INVALID_CONTEXT 0x00000010 +#define MINIDUMP_THREAD_INFO_INVALID_TEB 0x00000020 + +typedef struct _MINIDUMP_THREAD_INFO { + ULONG32 ThreadId; + ULONG32 DumpFlags; + ULONG32 DumpError; + ULONG32 ExitStatus; + ULONG64 CreateTime; + ULONG64 ExitTime; + ULONG64 KernelTime; + ULONG64 UserTime; + ULONG64 StartAddress; + ULONG64 Affinity; +} MINIDUMP_THREAD_INFO, *PMINIDUMP_THREAD_INFO; + +typedef struct _MINIDUMP_THREAD_INFO_LIST { + ULONG SizeOfHeader; + ULONG SizeOfEntry; + ULONG NumberOfEntries; +} MINIDUMP_THREAD_INFO_LIST, *PMINIDUMP_THREAD_INFO_LIST; + +// +// Support for token information. +// +typedef struct _MINIDUMP_TOKEN_INFO_HEADER { + ULONG TokenSize; // The size of the token structure. + ULONG TokenId; // The PID in NtOpenProcessToken() call or TID in NtOpenThreadToken() call. + ULONG64 TokenHandle; // The handle value returned. +} MINIDUMP_TOKEN_INFO_HEADER, *PMINIDUMP_TOKEN_INFO_HEADER; + +typedef struct _MINIDUMP_TOKEN_INFO_LIST { + ULONG TokenListSize; + ULONG TokenListEntries; + ULONG ListHeaderSize; + ULONG ElementHeaderSize; +} MINIDUMP_TOKEN_INFO_LIST, *PMINIDUMP_TOKEN_INFO_LIST; + +// +// Support for global system memory/performance information. +// +typedef struct _MINIDUMP_SYSTEM_BASIC_INFORMATION { + ULONG TimerResolution; + ULONG PageSize; + ULONG NumberOfPhysicalPages; + ULONG LowestPhysicalPageNumber; + ULONG HighestPhysicalPageNumber; + ULONG AllocationGranularity; + ULONG64 MinimumUserModeAddress; + ULONG64 MaximumUserModeAddress; + ULONG64 ActiveProcessorsAffinityMask; + ULONG NumberOfProcessors; +} MINIDUMP_SYSTEM_BASIC_INFORMATION, *PMINIDUMP_SYSTEM_BASIC_INFORMATION; + +typedef struct _MINIDUMP_SYSTEM_FILECACHE_INFORMATION { + ULONG64 CurrentSize; + ULONG64 PeakSize; + ULONG PageFaultCount; + ULONG64 MinimumWorkingSet; + ULONG64 MaximumWorkingSet; + ULONG64 CurrentSizeIncludingTransitionInPages; + ULONG64 PeakSizeIncludingTransitionInPages; + ULONG TransitionRePurposeCount; + ULONG Flags; +} MINIDUMP_SYSTEM_FILECACHE_INFORMATION, *PMINIDUMP_SYSTEM_FILECACHE_INFORMATION; + +typedef struct _MINIDUMP_SYSTEM_BASIC_PERFORMANCE_INFORMATION { + ULONG64 AvailablePages; + ULONG64 CommittedPages; + ULONG64 CommitLimit; + ULONG64 PeakCommitment; +} MINIDUMP_SYSTEM_BASIC_PERFORMANCE_INFORMATION, *PMINIDUMP_SYSTEM_BASIC_PERFORMANCE_INFORMATION; + +typedef struct _MINIDUMP_SYSTEM_PERFORMANCE_INFORMATION { + ULONG64 IdleProcessTime; + ULONG64 IoReadTransferCount; + ULONG64 IoWriteTransferCount; + ULONG64 IoOtherTransferCount; + ULONG IoReadOperationCount; + ULONG IoWriteOperationCount; + ULONG IoOtherOperationCount; + ULONG AvailablePages; + ULONG CommittedPages; + ULONG CommitLimit; + ULONG PeakCommitment; + ULONG PageFaultCount; + ULONG CopyOnWriteCount; + ULONG TransitionCount; + ULONG CacheTransitionCount; + ULONG DemandZeroCount; + ULONG PageReadCount; + ULONG PageReadIoCount; + ULONG CacheReadCount; + ULONG CacheIoCount; + ULONG DirtyPagesWriteCount; + ULONG DirtyWriteIoCount; + ULONG MappedPagesWriteCount; + ULONG MappedWriteIoCount; + ULONG PagedPoolPages; + ULONG NonPagedPoolPages; + ULONG PagedPoolAllocs; + ULONG PagedPoolFrees; + ULONG NonPagedPoolAllocs; + ULONG NonPagedPoolFrees; + ULONG FreeSystemPtes; + ULONG ResidentSystemCodePage; + ULONG TotalSystemDriverPages; + ULONG TotalSystemCodePages; + ULONG NonPagedPoolLookasideHits; + ULONG PagedPoolLookasideHits; + ULONG AvailablePagedPoolPages; + ULONG ResidentSystemCachePage; + ULONG ResidentPagedPoolPage; + ULONG ResidentSystemDriverPage; + ULONG CcFastReadNoWait; + ULONG CcFastReadWait; + ULONG CcFastReadResourceMiss; + ULONG CcFastReadNotPossible; + ULONG CcFastMdlReadNoWait; + ULONG CcFastMdlReadWait; + ULONG CcFastMdlReadResourceMiss; + ULONG CcFastMdlReadNotPossible; + ULONG CcMapDataNoWait; + ULONG CcMapDataWait; + ULONG CcMapDataNoWaitMiss; + ULONG CcMapDataWaitMiss; + ULONG CcPinMappedDataCount; + ULONG CcPinReadNoWait; + ULONG CcPinReadWait; + ULONG CcPinReadNoWaitMiss; + ULONG CcPinReadWaitMiss; + ULONG CcCopyReadNoWait; + ULONG CcCopyReadWait; + ULONG CcCopyReadNoWaitMiss; + ULONG CcCopyReadWaitMiss; + ULONG CcMdlReadNoWait; + ULONG CcMdlReadWait; + ULONG CcMdlReadNoWaitMiss; + ULONG CcMdlReadWaitMiss; + ULONG CcReadAheadIos; + ULONG CcLazyWriteIos; + ULONG CcLazyWritePages; + ULONG CcDataFlushes; + ULONG CcDataPages; + ULONG ContextSwitches; + ULONG FirstLevelTbFills; + ULONG SecondLevelTbFills; + ULONG SystemCalls; + + ULONG64 CcTotalDirtyPages; + ULONG64 CcDirtyPageThreshold; + + LONG64 ResidentAvailablePages; + ULONG64 SharedCommittedPages; +} MINIDUMP_SYSTEM_PERFORMANCE_INFORMATION, *PMINIDUMP_SYSTEM_PERFORMANCE_INFORMATION; + +#define MINIDUMP_SYSMEMINFO1_FILECACHE_TRANSITIONREPURPOSECOUNT_FLAGS 0x0001 +#define MINIDUMP_SYSMEMINFO1_BASICPERF 0x0002 +#define MINIDUMP_SYSMEMINFO1_PERF_CCTOTALDIRTYPAGES_CCDIRTYPAGETHRESHOLD 0x0004 +#define MINIDUMP_SYSMEMINFO1_PERF_RESIDENTAVAILABLEPAGES_SHAREDCOMMITPAGES 0x0008 + +typedef struct _MINIDUMP_SYSTEM_MEMORY_INFO_1 { + USHORT Revision; + USHORT Flags; + + MINIDUMP_SYSTEM_BASIC_INFORMATION BasicInfo; + MINIDUMP_SYSTEM_FILECACHE_INFORMATION FileCacheInfo; + MINIDUMP_SYSTEM_BASIC_PERFORMANCE_INFORMATION BasicPerfInfo; + MINIDUMP_SYSTEM_PERFORMANCE_INFORMATION PerfInfo; +} MINIDUMP_SYSTEM_MEMORY_INFO_1, *PMINIDUMP_SYSTEM_MEMORY_INFO_1; + +typedef MINIDUMP_SYSTEM_MEMORY_INFO_1 MINIDUMP_SYSTEM_MEMORY_INFO_N; +typedef MINIDUMP_SYSTEM_MEMORY_INFO_N *PMINIDUMP_SYSTEM_MEMORY_INFO_N; + +// +// Support for process VM counters. +// +typedef struct _MINIDUMP_PROCESS_VM_COUNTERS_1 { + USHORT Revision; + ULONG PageFaultCount; + ULONG64 PeakWorkingSetSize; + ULONG64 WorkingSetSize; + ULONG64 QuotaPeakPagedPoolUsage; + ULONG64 QuotaPagedPoolUsage; + ULONG64 QuotaPeakNonPagedPoolUsage; + ULONG64 QuotaNonPagedPoolUsage; + ULONG64 PagefileUsage; + ULONG64 PeakPagefileUsage; + ULONG64 PrivateUsage; +} MINIDUMP_PROCESS_VM_COUNTERS_1, *PMINIDUMP_PROCESS_VM_COUNTERS_1; + +#define MINIDUMP_PROCESS_VM_COUNTERS 0x0001 +#define MINIDUMP_PROCESS_VM_COUNTERS_VIRTUALSIZE 0x0002 +#define MINIDUMP_PROCESS_VM_COUNTERS_EX 0x0004 +#define MINIDUMP_PROCESS_VM_COUNTERS_EX2 0x0008 +#define MINIDUMP_PROCESS_VM_COUNTERS_JOB 0x0010 + +typedef struct _MINIDUMP_PROCESS_VM_COUNTERS_2 { + USHORT Revision; + USHORT Flags; + ULONG PageFaultCount; + ULONG64 PeakWorkingSetSize; + ULONG64 WorkingSetSize; + ULONG64 QuotaPeakPagedPoolUsage; + ULONG64 QuotaPagedPoolUsage; + ULONG64 QuotaPeakNonPagedPoolUsage; + ULONG64 QuotaNonPagedPoolUsage; + ULONG64 PagefileUsage; + ULONG64 PeakPagefileUsage; + ULONG64 PeakVirtualSize; // VIRTUALSIZE + ULONG64 VirtualSize; // VIRTUALSIZE + ULONG64 PrivateUsage; // EX+ + ULONG64 PrivateWorkingSetSize; // EX2+ + ULONG64 SharedCommitUsage; // EX2+ + + ULONG64 JobSharedCommitUsage; // JOB+ + ULONG64 JobPrivateCommitUsage; // JOB+ + ULONG64 JobPeakPrivateCommitUsage; // JOB+ + ULONG64 JobPrivateCommitLimit; // JOB+ + ULONG64 JobTotalCommitLimit; // JOB+ +} MINIDUMP_PROCESS_VM_COUNTERS_2, *PMINIDUMP_PROCESS_VM_COUNTERS_2; + +typedef MINIDUMP_PROCESS_VM_COUNTERS_2 MINIDUMP_PROCESS_VM_COUNTERS_N; +typedef MINIDUMP_PROCESS_VM_COUNTERS_N *PMINIDUMP_PROCESS_VM_COUNTERS_N; + +// +// 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; + ULONG BufferSize; + PVOID Buffer; + +} MINIDUMP_USER_STREAM, *PMINIDUMP_USER_STREAM; + + +typedef struct _MINIDUMP_USER_STREAM_INFORMATION { + ULONG 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, + MemoryCallback, + CancelCallback, + WriteKernelMinidumpCallback, + KernelMinidumpStatusCallback, + RemoveMemoryCallback, + IncludeVmRegionCallback, + IoStartCallback, + IoWriteAllCallback, + IoFinishCallback, + ReadMemoryFailureCallback, + SecondaryFlagsCallback, + IsProcessSnapshotCallback, + VmStartCallback, + VmQueryCallback, + VmPreReadCallback, + VmPostReadCallback +} MINIDUMP_CALLBACK_TYPE; + + +typedef struct _MINIDUMP_THREAD_CALLBACK { + ULONG ThreadId; + HANDLE ThreadHandle; + +#if defined(_ARM64_) + ULONG Pad; +#endif + CONTEXT Context; + ULONG SizeOfContext; + ULONG64 StackBase; + ULONG64 StackEnd; +} MINIDUMP_THREAD_CALLBACK, *PMINIDUMP_THREAD_CALLBACK; + + +typedef struct _MINIDUMP_THREAD_EX_CALLBACK { + ULONG ThreadId; + HANDLE ThreadHandle; + +#if defined(_ARM64_) + ULONG Pad; +#endif + CONTEXT Context; + ULONG SizeOfContext; + ULONG64 StackBase; + ULONG64 StackEnd; + ULONG64 BackingStoreBase; + ULONG64 BackingStoreEnd; +} MINIDUMP_THREAD_EX_CALLBACK, *PMINIDUMP_THREAD_EX_CALLBACK; + + +typedef struct _MINIDUMP_INCLUDE_THREAD_CALLBACK { + ULONG ThreadId; +} MINIDUMP_INCLUDE_THREAD_CALLBACK, *PMINIDUMP_INCLUDE_THREAD_CALLBACK; + + +typedef enum _THREAD_WRITE_FLAGS { + ThreadWriteThread = 0x0001, + ThreadWriteStack = 0x0002, + ThreadWriteContext = 0x0004, + ThreadWriteBackingStore = 0x0008, + ThreadWriteInstructionWindow = 0x0010, + ThreadWriteThreadData = 0x0020, + ThreadWriteThreadInfo = 0x0040, +} THREAD_WRITE_FLAGS; + +typedef struct _MINIDUMP_MODULE_CALLBACK { + PWCHAR FullPath; + ULONG64 BaseOfImage; + ULONG SizeOfImage; + ULONG CheckSum; + ULONG TimeDateStamp; + VS_FIXEDFILEINFO VersionInfo; + PVOID CvRecord; + ULONG SizeOfCvRecord; + PVOID MiscRecord; + ULONG 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, + ModuleWriteTlsData = 0x0020, + ModuleWriteCodeSegs = 0x0040, +} MODULE_WRITE_FLAGS; + + +typedef struct _MINIDUMP_IO_CALLBACK { + HANDLE Handle; + ULONG64 Offset; + PVOID Buffer; + ULONG BufferBytes; +} MINIDUMP_IO_CALLBACK, *PMINIDUMP_IO_CALLBACK; + + +typedef struct _MINIDUMP_READ_MEMORY_FAILURE_CALLBACK +{ + ULONG64 Offset; + ULONG Bytes; + HRESULT FailureStatus; +} MINIDUMP_READ_MEMORY_FAILURE_CALLBACK, + *PMINIDUMP_READ_MEMORY_FAILURE_CALLBACK; + +typedef struct _MINIDUMP_VM_QUERY_CALLBACK +{ + ULONG64 Offset; +} MINIDUMP_VM_QUERY_CALLBACK, *PMINIDUMP_VM_QUERY_CALLBACK; + +typedef struct _MINIDUMP_VM_PRE_READ_CALLBACK +{ + ULONG64 Offset; + PVOID Buffer; + ULONG Size; +} MINIDUMP_VM_PRE_READ_CALLBACK, *PMINIDUMP_VM_PRE_READ_CALLBACK; + +typedef struct _MINIDUMP_VM_POST_READ_CALLBACK +{ + ULONG64 Offset; + PVOID Buffer; + ULONG Size; + ULONG Completed; + HRESULT Status; +} MINIDUMP_VM_POST_READ_CALLBACK, *PMINIDUMP_VM_POST_READ_CALLBACK; + +typedef struct _MINIDUMP_CALLBACK_INPUT { + ULONG ProcessId; + HANDLE ProcessHandle; + ULONG CallbackType; + union { + HRESULT Status; + MINIDUMP_THREAD_CALLBACK Thread; + MINIDUMP_THREAD_EX_CALLBACK ThreadEx; + MINIDUMP_MODULE_CALLBACK Module; + MINIDUMP_INCLUDE_THREAD_CALLBACK IncludeThread; + MINIDUMP_INCLUDE_MODULE_CALLBACK IncludeModule; + MINIDUMP_IO_CALLBACK Io; + MINIDUMP_READ_MEMORY_FAILURE_CALLBACK ReadMemoryFailure; + ULONG SecondaryFlags; + MINIDUMP_VM_QUERY_CALLBACK VmQuery; + MINIDUMP_VM_PRE_READ_CALLBACK VmPreRead; + MINIDUMP_VM_POST_READ_CALLBACK VmPostRead; + }; +} MINIDUMP_CALLBACK_INPUT, *PMINIDUMP_CALLBACK_INPUT; + +typedef struct _MINIDUMP_CALLBACK_OUTPUT { + union { + ULONG ModuleWriteFlags; + ULONG ThreadWriteFlags; + ULONG SecondaryFlags; + struct { + ULONG64 MemoryBase; + ULONG MemorySize; + }; + struct { + BOOL CheckCancel; + BOOL Cancel; + }; + HANDLE Handle; + struct { + MINIDUMP_MEMORY_INFO VmRegion; + BOOL Continue; + }; + struct { + HRESULT VmQueryStatus; + MINIDUMP_MEMORY_INFO VmQueryResult; + }; + struct { + HRESULT VmReadStatus; + ULONG VmReadBytesCompleted; + }; + HRESULT Status; + }; +} 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. +// +// On some operating systems a list of modules that were +// recently unloaded is kept in addition to the currently +// loaded module list. This information can be saved in +// the dump if desired. +// +// Stack and backing store memory can be scanned for referenced +// pages in order to pick up data referenced by locals or other +// stack memory. This can increase the size of a dump significantly. +// +// Module paths may contain undesired information such as user names +// or other important directory names so they can be stripped. This +// option reduces the ability to locate the proper image later +// and should only be used in certain situations. +// +// Complete operating system per-process and per-thread information can +// be gathered and stored in the dump. +// +// The virtual address space can be scanned for various types +// of memory to be included in the dump. +// +// Code which is concerned with potentially private information +// getting into the minidump can set a flag that automatically +// modifies all existing and future flags to avoid placing +// unnecessary data in the dump. Basic data, such as stack +// information, will still be included but optional data, such +// as indirect memory, will not. +// +// When doing a full memory dump it's possible to store all +// of the enumerated memory region descriptive information +// in a memory information stream. +// +// Additional thread information beyond the basic thread +// structure can be collected if desired. +// +// A minidump with code segments includes all of the code +// and code-related sections from loaded modules in order +// to capture executable content. +// +// MiniDumpWithoutAuxiliaryState turns off any secondary, +// auxiliary-supported memory gathering. +// +// MiniDumpWithFullAuxiliaryState asks any present auxiliary +// data providers to include all of their state in the dump. +// The exact set of what is provided depends on the auxiliary. +// This can be quite large. +// + +typedef enum _MINIDUMP_TYPE { + MiniDumpNormal = 0x00000000, + MiniDumpWithDataSegs = 0x00000001, + MiniDumpWithFullMemory = 0x00000002, + MiniDumpWithHandleData = 0x00000004, + MiniDumpFilterMemory = 0x00000008, + MiniDumpScanMemory = 0x00000010, + MiniDumpWithUnloadedModules = 0x00000020, + MiniDumpWithIndirectlyReferencedMemory = 0x00000040, + MiniDumpFilterModulePaths = 0x00000080, + MiniDumpWithProcessThreadData = 0x00000100, + MiniDumpWithPrivateReadWriteMemory = 0x00000200, + MiniDumpWithoutOptionalData = 0x00000400, + MiniDumpWithFullMemoryInfo = 0x00000800, + MiniDumpWithThreadInfo = 0x00001000, + MiniDumpWithCodeSegs = 0x00002000, + MiniDumpWithoutAuxiliaryState = 0x00004000, + MiniDumpWithFullAuxiliaryState = 0x00008000, + MiniDumpWithPrivateWriteCopyMemory = 0x00010000, + MiniDumpIgnoreInaccessibleMemory = 0x00020000, + MiniDumpWithTokenInformation = 0x00040000, + MiniDumpWithModuleHeaders = 0x00080000, + MiniDumpFilterTriage = 0x00100000, + MiniDumpWithAvxXStateContext = 0x00200000, + MiniDumpWithIptTrace = 0x00400000, + MiniDumpValidTypeFlags = 0x007fffff, +} MINIDUMP_TYPE; + +// +// In addition to the primary flags provided to +// MiniDumpWriteDump there are additional, less +// frequently used options queried via the secondary +// flags callback. +// +// MiniSecondaryWithoutPowerInfo suppresses the minidump +// query that retrieves processor power information for +// MINIDUMP_MISC_INFO. +// + +typedef enum _MINIDUMP_SECONDARY_FLAGS { + MiniSecondaryWithoutPowerInfo = 0x00000001, + + MiniSecondaryValidFlags = 0x00000001, +} MINIDUMP_SECONDARY_FLAGS; + + +// +// 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) ( + _Inout_ PVOID CallbackParam, + _In_ PMINIDUMP_CALLBACK_INPUT CallbackInput, + _Inout_ 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, +// ULONG 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_opt_ PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, + _In_opt_ PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, + _In_opt_ PMINIDUMP_CALLBACK_INFORMATION CallbackParam + ); + + +BOOL +WINAPI +MiniDumpReadDumpStream( + _In_ PVOID BaseOfDump, + _In_ ULONG StreamNumber, + _Outptr_result_maybenull_ PMINIDUMP_DIRECTORY * Dir, + _Outptr_result_maybenull_ PVOID * StreamPointer, + _Out_opt_ ULONG * StreamSize + ); + + + +#if defined(_MSC_VER) + +#if _MSC_VER >= 800 + +#if _MSC_VER >= 1200 +#pragma warning(pop) +#else +#pragma warning(default:4200) /* Zero length array */ +#pragma warning(default:4201) /* Nameless struct/union */ +#endif +#endif +#endif + +#include + +#ifdef __cplusplus +} +#endif + +#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) + +#endif /* _MINIDUMP_H */ + +// HEXTRACT: end_dbghelp hide-line end_imagehlp diff --git a/lib/dbghelp/lib/Win32/DbgHelp.Lib b/lib/dbghelp/lib/Win32/DbgHelp.Lib index 8ae9cf97..3acc06b1 100644 Binary files a/lib/dbghelp/lib/Win32/DbgHelp.Lib and b/lib/dbghelp/lib/Win32/DbgHelp.Lib differ diff --git a/lib/dbghelp/lib/x64/DbgHelp.Lib b/lib/dbghelp/lib/x64/DbgHelp.Lib index 07608792..b3bd6794 100644 Binary files a/lib/dbghelp/lib/x64/DbgHelp.Lib and b/lib/dbghelp/lib/x64/DbgHelp.Lib differ diff --git a/mfc_detect/vldmfc.cpp b/mfc_detect/vldmfc.cpp index 7f5c7d87..3df526df 100644 --- a/mfc_detect/vldmfc.cpp +++ b/mfc_detect/vldmfc.cpp @@ -232,6 +232,8 @@ BOOL CMFCExampleApp::InitInstance() #error MFC version not supported #elif _MFC_VER == 0x0E00 // VS 2015 #define MFCDLLNAME _T("mfc140d.dll") +#elif _MFC_VER == 0x0F00 // VS 2017 +#define MFCDLLNAME _T("mfc150d.dll") #else #error MFC version not supported #endif @@ -252,6 +254,8 @@ BOOL CMFCExampleApp::InitInstance() #error MFC version not supported #elif _MFC_VER == 0x0E00 // VS 2015 #define MFCDLLNAME _T("mfc140ud.dll") +#elif _MFC_VER == 0x0F00 // VS 2017 +#define MFCDLLNAME _T("mfc150ud.dll") #else #error MFC version not supported #endif @@ -274,6 +278,8 @@ BOOL CMFCExampleApp::InitInstance() #error MFC version not supported #elif _MFC_VER == 0x0E00 // VS 2015 #define MFCDLLNAME _T("mfc140.dll") +#elif _MFC_VER == 0x0F00 // VS 2017 +#define MFCDLLNAME _T("mfc150.dll") #else #error MFC version not supported #endif @@ -294,6 +300,8 @@ BOOL CMFCExampleApp::InitInstance() #error MFC version not supported #elif _MFC_VER == 0x0E00 // VS 2015 #define MFCDLLNAME _T("mfc140u.dll") +#elif _MFC_VER == 0x0F00 // VS 2017 +#define MFCDLLNAME _T("mfc150u.dll") #else #error MFC version not supported #endif diff --git a/mfc_detect/vldmfc_detect_vs15.sln b/mfc_detect/vldmfc_detect_vs15.sln new file mode 100644 index 00000000..a0e37a79 --- /dev/null +++ b/mfc_detect/vldmfc_detect_vs15.sln @@ -0,0 +1,40 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 14 +VisualStudioVersion = 14.0.23107.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vldmfc_detect", "vldmfc_detect.vcxproj", "{A231973E-072A-428E-982E-5363ADD1CDE2}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug (Unicode)|Win32 = Debug (Unicode)|Win32 + Debug (Unicode)|x64 = Debug (Unicode)|x64 + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release (Unicode)|Win32 = Release (Unicode)|Win32 + Release (Unicode)|x64 = Release (Unicode)|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {A231973E-072A-428E-982E-5363ADD1CDE2}.Debug (Unicode)|Win32.ActiveCfg = Debug (Unicode)|Win32 + {A231973E-072A-428E-982E-5363ADD1CDE2}.Debug (Unicode)|Win32.Build.0 = Debug (Unicode)|Win32 + {A231973E-072A-428E-982E-5363ADD1CDE2}.Debug (Unicode)|x64.ActiveCfg = Debug (Unicode)|x64 + {A231973E-072A-428E-982E-5363ADD1CDE2}.Debug (Unicode)|x64.Build.0 = Debug (Unicode)|x64 + {A231973E-072A-428E-982E-5363ADD1CDE2}.Debug|Win32.ActiveCfg = Debug|Win32 + {A231973E-072A-428E-982E-5363ADD1CDE2}.Debug|Win32.Build.0 = Debug|Win32 + {A231973E-072A-428E-982E-5363ADD1CDE2}.Debug|x64.ActiveCfg = Debug|x64 + {A231973E-072A-428E-982E-5363ADD1CDE2}.Debug|x64.Build.0 = Debug|x64 + {A231973E-072A-428E-982E-5363ADD1CDE2}.Release (Unicode)|Win32.ActiveCfg = Release (Unicode)|Win32 + {A231973E-072A-428E-982E-5363ADD1CDE2}.Release (Unicode)|Win32.Build.0 = Release (Unicode)|Win32 + {A231973E-072A-428E-982E-5363ADD1CDE2}.Release (Unicode)|x64.ActiveCfg = Release (Unicode)|x64 + {A231973E-072A-428E-982E-5363ADD1CDE2}.Release (Unicode)|x64.Build.0 = Release (Unicode)|x64 + {A231973E-072A-428E-982E-5363ADD1CDE2}.Release|Win32.ActiveCfg = Release|Win32 + {A231973E-072A-428E-982E-5363ADD1CDE2}.Release|Win32.Build.0 = Release|Win32 + {A231973E-072A-428E-982E-5363ADD1CDE2}.Release|x64.ActiveCfg = Release|x64 + {A231973E-072A-428E-982E-5363ADD1CDE2}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/setup/build_version.bat b/setup/build_version.bat index c2dfaa05..4776fe7e 100644 --- a/setup/build_version.bat +++ b/setup/build_version.bat @@ -5,7 +5,7 @@ TITLE Building VLD... SETLOCAL ENABLEDELAYEDEXPANSION REM Check if the needed files are present -IF "%VS140COMNTOOLS%"=="" GOTO :BadPaths +IF "%VS150COMNTOOLS%"=="" GOTO :BadPaths CD %~dp0/.. @@ -13,7 +13,7 @@ GOTO :GoodPaths :BadPaths ECHO: "Not all build dependencies found. To build VLD you need:" -ECHO: "* Visual Studio 2015 installed" +ECHO: "* Visual Studio 2017 installed" PAUSE GOTO :EndGood @@ -26,7 +26,7 @@ IF "%1"=="" SET BUILDTYPE=/rebuild rem IF "%1"=="build" SET BUILDTYPE= SET ORIGPATH="%CD%" -CALL "%VS140COMNTOOLS%vsvars32.bat" +CALL "%VS150COMNTOOLS%vsvars32.bat" CD %ORIGPATH% :: Store start time @@ -36,9 +36,9 @@ FOR /f "tokens=1-4 delims=:.," %%T IN ("%TIME%") DO ( SET /a Start100S=%%T*360000+1%%U*6000+1%%V*100+1%%W - 610100 ) -devenv /nologo vld_vs14.sln %BUILDTYPE% "Release|Win32" /Project vld +devenv /nologo vld_vs15.sln %BUILDTYPE% "Release|Win32" /Project vld IF %ERRORLEVEL% NEQ 0 GOTO EndBad -devenv /nologo vld_vs14.sln %BUILDTYPE% "Release|x64" /Project vld +devenv /nologo vld_vs15.sln %BUILDTYPE% "Release|x64" /Project vld IF %ERRORLEVEL% NEQ 0 GOTO EndBad if not exist "%ProgFiles%\Inno Setup 5\ISCC.exe" GOTO EndBad diff --git a/setup/dbghelp/x64/dbghelp.dll b/setup/dbghelp/x64/dbghelp.dll index 499fa290..48c4423f 100644 Binary files a/setup/dbghelp/x64/dbghelp.dll and b/setup/dbghelp/x64/dbghelp.dll differ diff --git a/setup/dbghelp/x86/Microsoft.DTfW.DHL.manifest b/setup/dbghelp/x86/Microsoft.DTfW.DHL.manifest deleted file mode 100644 index e61222f0..00000000 --- a/setup/dbghelp/x86/Microsoft.DTfW.DHL.manifest +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/setup/dbghelp/x64/Microsoft.DTfW.DHL.manifest b/setup/dbghelp/x86/Microsoft.Windows.DebuggersAndTools.manifest similarity index 62% rename from setup/dbghelp/x64/Microsoft.DTfW.DHL.manifest rename to setup/dbghelp/x86/Microsoft.Windows.DebuggersAndTools.manifest index 1ea64d51..cc52e4e4 100644 --- a/setup/dbghelp/x64/Microsoft.DTfW.DHL.manifest +++ b/setup/dbghelp/x86/Microsoft.Windows.DebuggersAndTools.manifest @@ -2,6 +2,6 @@ - + diff --git a/setup/dbghelp/x86/dbghelp.dll b/setup/dbghelp/x86/dbghelp.dll index 62d85086..47cfd975 100644 Binary files a/setup/dbghelp/x86/dbghelp.dll and b/setup/dbghelp/x86/dbghelp.dll differ diff --git a/setup/version.h b/setup/version.h index ef96d44f..cd762d37 100644 --- a/setup/version.h +++ b/setup/version.h @@ -1,9 +1,9 @@ -#define VLDVERSION L"2.5.1" -#define VERSION_NUMBER 2,5,1,0 -#define VERSION_STRING "2.5.1.0" -#define VERSION_COPYRIGHT "Copyright (C) 2005-2017" +#define VLDVERSION L"2.5.3" +#define VERSION_NUMBER 2,5,3,0 +#define VERSION_STRING "2.5.3.0" +#define VERSION_COPYRIGHT "Copyright (C) 2005-2019" #ifndef __FILE__ -!define VLD_VERSION "2.5.1" // NSIS Script +!define VLD_VERSION "2.5.3" // NSIS Script #endif diff --git a/setup/vld-setup.iss b/setup/vld-setup.iss index 43cb32fe..1c67d95d 100644 --- a/setup/vld-setup.iss +++ b/setup/vld-setup.iss @@ -2,9 +2,9 @@ ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! #define MyAppName "Visual Leak Detector" -#define MyAppVersion "2.5.1" +#define MyAppVersion "2.5.3" #define MyAppPublisher "VLD Team" -#define MyAppURL "http://vld.codeplex.com/" +#define MyAppURL "https://kinddragon.github.io/vld/" #define MyAppRegKey "Software\Visual Leak Detector" [Setup] @@ -25,7 +25,7 @@ LicenseFile=license-free.txt OutputBaseFilename=vld-{#MyAppVersion}-setup Compression=lzma SolidCompression=True -MinVersion=0,5.01 +MinVersion=0,6.00 ; Tell Windows Explorer to reload the environment ChangesEnvironment=yes AllowNoIcons=yes @@ -38,19 +38,19 @@ WizardSmallImageFile=WizSmallImage.bmp Name: "english"; MessagesFile: "compiler:Default.isl" [Icons] -Name: "{group}\View Documentation"; Filename: "http://vld.codeplex.com/documentation" +Name: "{group}\View Documentation"; Filename: "https://github.com/KindDragon/vld/wiki" [Files] Source: "dbghelp\x64\dbghelp.dll"; DestDir: "{app}\bin\Win64"; Flags: ignoreversion -Source: "dbghelp\x64\Microsoft.DTfW.DHL.manifest"; DestDir: "{app}\bin\Win64"; Flags: ignoreversion +Source: "dbghelp\x64\Microsoft.Windows.DebuggersAndTools.manifest"; DestDir: "{app}\bin\Win64"; Flags: ignoreversion Source: "dbghelp\x86\dbghelp.dll"; DestDir: "{app}\bin\Win32"; Flags: ignoreversion -Source: "dbghelp\x86\Microsoft.DTfW.DHL.manifest"; DestDir: "{app}\bin\Win32"; Flags: ignoreversion -Source: "..\src\bin\Win32\Release-v140\vld.lib"; DestDir: "{app}\lib\Win32"; Flags: ignoreversion -Source: "..\src\bin\Win32\Release-v140\vld_x86.dll"; DestDir: "{app}\bin\Win32"; Flags: ignoreversion -Source: "..\src\bin\Win32\Release-v140\vld_x86.pdb"; DestDir: "{app}\bin\Win32"; Flags: ignoreversion -Source: "..\src\bin\x64\Release-v140\vld.lib"; DestDir: "{app}\lib\Win64"; Flags: ignoreversion -Source: "..\src\bin\x64\Release-v140\vld_x64.dll"; DestDir: "{app}\bin\Win64"; Flags: ignoreversion -Source: "..\src\bin\x64\Release-v140\vld_x64.pdb"; DestDir: "{app}\bin\Win64"; Flags: ignoreversion +Source: "dbghelp\x86\Microsoft.Windows.DebuggersAndTools.manifest"; DestDir: "{app}\bin\Win32"; Flags: ignoreversion +Source: "..\src\bin\Win32\Release-v141\vld.lib"; DestDir: "{app}\lib\Win32"; Flags: ignoreversion +Source: "..\src\bin\Win32\Release-v141\vld_x86.dll"; DestDir: "{app}\bin\Win32"; Flags: ignoreversion +Source: "..\src\bin\Win32\Release-v141\vld_x86.pdb"; DestDir: "{app}\bin\Win32"; Flags: ignoreversion +Source: "..\src\bin\x64\Release-v141\vld.lib"; DestDir: "{app}\lib\Win64"; Flags: ignoreversion +Source: "..\src\bin\x64\Release-v141\vld_x64.dll"; DestDir: "{app}\bin\Win64"; Flags: ignoreversion +Source: "..\src\bin\x64\Release-v141\vld_x64.pdb"; DestDir: "{app}\bin\Win64"; Flags: ignoreversion Source: "..\src\vld.h"; DestDir: "{app}\include"; Flags: ignoreversion Source: "..\src\vld_def.h"; DestDir: "{app}\include"; Flags: ignoreversion Source: "..\vld.ini"; DestDir: "{app}"; Flags: ignoreversion @@ -61,7 +61,7 @@ Source: "..\COPYING.txt"; DestDir: "{app}"; Flags: ignoreversion [Tasks] Name: "modifypath"; Description: "Add VLD directory to your environmental path" Name: "modifyVS2008Props"; Description: "Add VLD directory to VS 2008" -Name: "modifyVS2010Props"; Description: "Add VLD directory to VS 2010 - VS 2015" +Name: "modifyVS2010Props"; Description: "Add VLD directory to VS 2010 - VS 2017" [ThirdParty] UseRelativePaths=True @@ -72,10 +72,10 @@ Root: "HKLM32"; Subkey: "{#MyAppRegKey}"; ValueType: string; ValueName: "Install Root: "HKLM32"; Subkey: "{#MyAppRegKey}"; ValueType: string; ValueName: "InstallPath"; ValueData: "{app}" Root: "HKLM32"; Subkey: "{#MyAppRegKey}"; ValueType: string; ValueName: "IniFile"; ValueData: "{app}\vld.ini" -Root: "HKLM64"; Subkey: "{#MyAppRegKey}"; Flags: uninsdeletekeyifempty -Root: "HKLM64"; Subkey: "{#MyAppRegKey}"; ValueType: string; ValueName: "InstalledVersion"; ValueData: "{#MyAppVersion}" -Root: "HKLM64"; Subkey: "{#MyAppRegKey}"; ValueType: string; ValueName: "InstallPath"; ValueData: "{app}" -Root: "HKLM64"; Subkey: "{#MyAppRegKey}"; ValueType: string; ValueName: "IniFile"; ValueData: "{app}\vld.ini" +Root: "HKLM64"; Subkey: "{#MyAppRegKey}"; Flags: uninsdeletekeyifempty; Check: IsWin64 +Root: "HKLM64"; Subkey: "{#MyAppRegKey}"; ValueType: string; ValueName: "InstalledVersion"; ValueData: "{#MyAppVersion}"; Check: IsWin64 +Root: "HKLM64"; Subkey: "{#MyAppRegKey}"; ValueType: string; ValueName: "InstallPath"; ValueData: "{app}"; Check: IsWin64 +Root: "HKLM64"; Subkey: "{#MyAppRegKey}"; ValueType: string; ValueName: "IniFile"; ValueData: "{app}\vld.ini"; Check: IsWin64 [Code] type diff --git a/src/tests/basics/Allocs.cpp b/src/tests/basics/Allocs.cpp index a2441fda..81b2df80 100644 --- a/src/tests/basics/Allocs.cpp +++ b/src/tests/basics/Allocs.cpp @@ -55,8 +55,10 @@ #define CRTDLLNAME _T("msvcr110.dll") #elif _MSC_VER == 1800 // VS 2013 #define CRTDLLNAME _T("msvcr120.dll") -#elif _MSC_VER >= 1900 // VS 2015 +#elif _MSC_VER == 1900 // VS 2015 #define CRTDLLNAME _T("ucrtbase.dll") +#else +#error Unsupported compiler #endif #endif diff --git a/src/tests/copydlls.bat b/src/tests/copydlls.bat index c84b0f27..11c7b325 100644 --- a/src/tests/copydlls.bat +++ b/src/tests/copydlls.bat @@ -3,4 +3,4 @@ xcopy "%~dp0\..\..\vld.ini" "%~dp0\..\bin\" /y /d copy "%~dp0\..\bin\%1\vld_%2.dll" "%~3\vld_%2.dll" /y copy "%~dp0\..\bin\%1\vld_%2.pdb" "%~3\vld_%2.pdb" /y copy "%~dp0\..\..\setup\dbghelp\%2\dbghelp.dll" "%~3\dbghelp.dll" /y -copy "%~dp0\..\..\setup\dbghelp\%2\Microsoft.DTfW.DHL.manifest" "%~3\Microsoft.DTfW.DHL.manifest" /y \ No newline at end of file +copy "%~dp0\..\..\setup\dbghelp\%2\Microsoft.Windows.DebuggersAndTools.manifest" "%~3\Microsoft.Windows.DebuggersAndTools.manifest" /y \ No newline at end of file diff --git a/src/tests/suite/testsuite.cpp b/src/tests/suite/testsuite.cpp index b4d612bc..ede70168 100644 --- a/src/tests/suite/testsuite.cpp +++ b/src/tests/suite/testsuite.cpp @@ -93,7 +93,10 @@ enum action_e { #define CRTDLLNAME _T("msvcr110.dll") #elif _MSC_VER == 1800 // VS 2013 #define CRTDLLNAME _T("msvcr120.dll") -#elif _MSC_VER >= 1900 // VS 2015 +#elif _MSC_VER == 1900 // VS 2015 +#define CRTDLLNAME _T("ucrtbase.dll") +#else +#error Unsupported compiler #endif #endif diff --git a/src/tests/vld_ComTest/xdlldata.c b/src/tests/vld_ComTest/xdlldata.c index c57bafcd..107e4a04 100644 Binary files a/src/tests/vld_ComTest/xdlldata.c and b/src/tests/vld_ComTest/xdlldata.c differ diff --git a/src/utility.cpp b/src/utility.cpp index c431b7f5..cedc8ac9 100644 --- a/src/utility.cpp +++ b/src/utility.cpp @@ -505,7 +505,7 @@ BOOL PatchImport (HMODULE importmodule, moduleentry_t *patchModule) IMAGE_DIRECTORY_ENTRY_IMPORT, &size, §ion); } - if (idte == NULL) { + if ((idte == NULL) || (idte->OriginalFirstThunk == 0)) { // This module has no IDT (i.e. it imports nothing). return FALSE; } @@ -607,7 +607,7 @@ BOOL PatchImport (HMODULE importmodule, moduleentry_t *patchModule) DbgReport(L"Hook dll \"%S\":\n", strrchr(pszBuffer, '\\') + 1); } - DbgReport(L"Import found %zu(\"%S\") for dll \"%S\".\n", + DbgReport(L"Import found %Iu(\"%S\") for dll \"%S\".\n", importname, patchModule->exportModuleName, importdllname); break; } diff --git a/src/vld.cpp b/src/vld.cpp index d47729a6..9d30194a 100644 --- a/src/vld.cpp +++ b/src/vld.cpp @@ -767,7 +767,8 @@ UINT32 VisualLeakDetector::getModuleState(ModuleSet::Iterator& it, UINT32& modul } // dbghelp32.dll should be updated in setup folder if you update dbghelp.h -static char dbghelp32_assert[sizeof(IMAGEHLP_MODULE64) == 3256 ? 1 : -1]; +static char dbghelp32_assert[sizeof(IMAGEHLP_MODULE64) == 3264 ? 1 : -1]; //10.0.16299, 3256 for previous (v6.11) + // attachtoloadedmodules - Attaches VLD to all modules contained in the provided // ModuleSet. Not all modules are in the ModuleSet will actually be included @@ -975,7 +976,10 @@ LPWSTR VisualLeakDetector::buildSymbolSearchPath () delete [] env; } - // Append Visual Studio 2015/2013/2012/2010/2008 symbols cache directory. +#if _MSC_VER > 1919 +#error Not supported VS +#endif + // Append Visual Studio 2017/2015/2013/2012/2010/2008 symbols cache directory. for (UINT n = 9; n <= 14; ++n) { WCHAR debuggerpath[MAX_PATH] = { 0 }; swprintf(debuggerpath, _countof(debuggerpath), L"Software\\Microsoft\\VisualStudio\\%u.0\\Debugger", n); diff --git a/src/vld.dll.dependency.x64.manifest b/src/vld.dll.dependency.x64.manifest index bc9fe1d2..c288bc6c 100644 --- a/src/vld.dll.dependency.x64.manifest +++ b/src/vld.dll.dependency.x64.manifest @@ -1,8 +1,37 @@ - - + + + + + + + + + + +Visual Leak Detector - + - + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/vld.dll.dependency.x86.manifest b/src/vld.dll.dependency.x86.manifest index cad71ffa..a0b7d660 100644 --- a/src/vld.dll.dependency.x86.manifest +++ b/src/vld.dll.dependency.x86.manifest @@ -1,8 +1,37 @@ + + + + + + + + +Visual Leak Detector - + + + + + + + + + + + + + + + diff --git a/src/vld.manifest b/src/vld.manifest new file mode 100644 index 00000000..ef4aadfe --- /dev/null +++ b/src/vld.manifest @@ -0,0 +1,24 @@ + + + +Visual Leak Detector + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/vld.rc b/src/vld.rc index f6cacc51..948c9c0f 100644 --- a/src/vld.rc +++ b/src/vld.rc @@ -70,6 +70,7 @@ BEGIN BEGIN BLOCK "040904b0" BEGIN + VALUE "CompanyName", "VLD Team" VALUE "FileDescription", "Visual Leak Detector DLL" VALUE "FileVersion", VERSION_STRING VALUE "InternalName", "vld" diff --git a/src/vld.vcxproj b/src/vld.vcxproj index 8411bc69..7b63b728 100644 --- a/src/vld.vcxproj +++ b/src/vld.vcxproj @@ -79,7 +79,7 @@ Disabled - _DEBUG;_USRDLL;WIN32;_WIN32_WINNT=0x0502;%(PreprocessorDefinitions) + _DEBUG;_USRDLL;WIN32;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebug Level4 @@ -98,7 +98,7 @@ Disabled - _DEBUG;_USRDLL;WIN64;_WIN32_WINNT=0x0502;%(PreprocessorDefinitions) + _DEBUG;_USRDLL;WIN64;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebug Level4 @@ -122,7 +122,7 @@ Full Speed true - NDEBUG;_USRDLL;WIN32;_WIN32_WINNT=0x0502;%(PreprocessorDefinitions) + NDEBUG;_USRDLL;WIN32;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) true MultiThreaded false @@ -145,7 +145,7 @@ Full Speed true - NDEBUG;_USRDLL;WIN64;_WIN32_WINNT=0x0502;%(PreprocessorDefinitions) + NDEBUG;_USRDLL;WIN64;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) true MultiThreaded false diff --git a/vld_vs15.sln b/vld_vs15.sln new file mode 100644 index 00000000..013a6689 --- /dev/null +++ b/vld_vs15.sln @@ -0,0 +1,498 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 14 +VisualStudioVersion = 14.0.24720.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vld", "src\vld.vcxproj", "{0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_basics", "src\tests\basics\basics.vcxproj", "{0943354A-41E0-4215-878A-8D0FE758052C}" + ProjectSection(ProjectDependencies) = postProject + {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE} = {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE} + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{9F9CFA3A-F154-4069-89E3-19BDC6BD3A7D}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testsuite", "src\tests\suite\testsuite.vcxproj", "{EE4A829C-5FD8-460B-8A90-B518B9BABB70}" + ProjectSection(ProjectDependencies) = postProject + {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE} = {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dynamic", "src\tests\dynamic_dll\dynamic.vcxproj", "{3AEA2AAF-3E9B-466F-B361-560B95AD88B4}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dynamic_app", "src\tests\dynamic_app\dynamic_app.vcxproj", "{5C25E1C8-00CB-4E0A-9BEC-952F0A6E5DCA}" + ProjectSection(ProjectDependencies) = postProject + {3AEA2AAF-3E9B-466F-B361-560B95AD88B4} = {3AEA2AAF-3E9B-466F-B361-560B95AD88B4} + {2178E5B2-1032-441F-A664-F3D8D1FD1913} = {2178E5B2-1032-441F-A664-F3D8D1FD1913} + {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE} = {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_mfc", "src\tests\mfc_dll\mfc.vcxproj", "{2178E5B2-1032-441F-A664-F3D8D1FD1913}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vldmfc", "src\tests\mfc\vldmfc.vcxproj", "{A231973E-072A-428E-982E-5363ADD1CDE2}" + ProjectSection(ProjectDependencies) = postProject + {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE} = {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "corruption", "src\tests\corruption\corruption.vcxproj", "{87911ED6-84BC-4526-9654-A4FF4E0EDF52}" + ProjectSection(ProjectDependencies) = postProject + {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE} = {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE} + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Dlls", "Dlls", "{281D5ACB-9ED2-496B-B19E-A75F4D4DA111}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgtest", "lib\gtest\msvc\gtest.vcxproj", "{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libs", "Libs", "{9FD1911C-3FAB-48DE-BE31-9F2C7B1EB58C}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libformat", "lib\cppformat\format.vcxproj", "{4ADFD279-56C6-4B1D-BA9E-B815E81C1B17}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vld_main", "src\tests\vld_main\vld_main_vs15.vcxproj", "{8C732490-DC1A-40C0-923F-1555B9141B80}" + ProjectSection(ProjectDependencies) = postProject + {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE} = {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vld_unload", "src\tests\vld_unload\vld_unload_vs15.vcxproj", "{A8EEDB38-1E5A-4D6E-A3E0-F15EF1F2E814}" + ProjectSection(ProjectDependencies) = postProject + {50C94B05-8C3E-49ED-B2B9-5715EB624D14} = {50C94B05-8C3E-49ED-B2B9-5715EB624D14} + {33F98E06-F44C-4E22-9E16-4C20F8238A95} = {33F98E06-F44C-4E22-9E16-4C20F8238A95} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vld_dll1", "src\tests\vld_dll1\vld_dll1_vs15.vcxproj", "{50C94B05-8C3E-49ED-B2B9-5715EB624D14}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vld_dll2", "src\tests\vld_dll2\vld_dll2_vs15.vcxproj", "{33F98E06-F44C-4E22-9E16-4C20F8238A95}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ComTest", "src\tests\vld_ComTest\ComTest_vs15.vcxproj", "{3719F504-3DF0-45F8-BC7A-4415804AC7C9}" + ProjectSection(ProjectDependencies) = postProject + {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE} = {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vld_main_test", "src\tests\vld_main_test\vld_main_test_vs15.vcxproj", "{BB99EDE9-D039-4169-B26B-6BFD93C6AF8E}" + ProjectSection(ProjectDependencies) = postProject + {8C732490-DC1A-40C0-923F-1555B9141B80} = {8C732490-DC1A-40C0-923F-1555B9141B80} + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug_StaticCrt|Win32 = Debug_StaticCrt|Win32 + Debug_StaticCrt|x64 = Debug_StaticCrt|x64 + Debug_VldRelease_StaticCrt|Win32 = Debug_VldRelease_StaticCrt|Win32 + Debug_VldRelease_StaticCrt|x64 = Debug_VldRelease_StaticCrt|x64 + Debug_VldRelease|Win32 = Debug_VldRelease|Win32 + Debug_VldRelease|x64 = Debug_VldRelease|x64 + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release_StaticCrt|Win32 = Release_StaticCrt|Win32 + Release_StaticCrt|x64 = Release_StaticCrt|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE}.Debug_StaticCrt|Win32.ActiveCfg = Debug|Win32 + {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE}.Debug_StaticCrt|Win32.Build.0 = Debug|Win32 + {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE}.Debug_StaticCrt|x64.ActiveCfg = Debug|x64 + {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE}.Debug_StaticCrt|x64.Build.0 = Debug|x64 + {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE}.Debug_VldRelease_StaticCrt|Win32.ActiveCfg = Release|Win32 + {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE}.Debug_VldRelease_StaticCrt|Win32.Build.0 = Release|Win32 + {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE}.Debug_VldRelease_StaticCrt|x64.ActiveCfg = Release|x64 + {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE}.Debug_VldRelease_StaticCrt|x64.Build.0 = Release|x64 + {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE}.Debug_VldRelease|Win32.ActiveCfg = Release|Win32 + {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE}.Debug_VldRelease|Win32.Build.0 = Release|Win32 + {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE}.Debug_VldRelease|x64.ActiveCfg = Release|x64 + {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE}.Debug_VldRelease|x64.Build.0 = Release|x64 + {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE}.Debug|Win32.ActiveCfg = Debug|Win32 + {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE}.Debug|Win32.Build.0 = Debug|Win32 + {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE}.Debug|x64.ActiveCfg = Debug|x64 + {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE}.Debug|x64.Build.0 = Debug|x64 + {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE}.Release_StaticCrt|Win32.ActiveCfg = Release|Win32 + {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE}.Release_StaticCrt|Win32.Build.0 = Release|Win32 + {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE}.Release_StaticCrt|x64.ActiveCfg = Release|x64 + {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE}.Release_StaticCrt|x64.Build.0 = Release|x64 + {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE}.Release|Win32.ActiveCfg = Release|Win32 + {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE}.Release|Win32.Build.0 = Release|Win32 + {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE}.Release|x64.ActiveCfg = Release|x64 + {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE}.Release|x64.Build.0 = Release|x64 + {0943354A-41E0-4215-878A-8D0FE758052C}.Debug_StaticCrt|Win32.ActiveCfg = Debug_StaticCrt|Win32 + {0943354A-41E0-4215-878A-8D0FE758052C}.Debug_StaticCrt|Win32.Build.0 = Debug_StaticCrt|Win32 + {0943354A-41E0-4215-878A-8D0FE758052C}.Debug_StaticCrt|x64.ActiveCfg = Debug_StaticCrt|x64 + {0943354A-41E0-4215-878A-8D0FE758052C}.Debug_StaticCrt|x64.Build.0 = Debug_StaticCrt|x64 + {0943354A-41E0-4215-878A-8D0FE758052C}.Debug_VldRelease_StaticCrt|Win32.ActiveCfg = Debug(Release)_StaticCrt|Win32 + {0943354A-41E0-4215-878A-8D0FE758052C}.Debug_VldRelease_StaticCrt|Win32.Build.0 = Debug(Release)_StaticCrt|Win32 + {0943354A-41E0-4215-878A-8D0FE758052C}.Debug_VldRelease_StaticCrt|x64.ActiveCfg = Debug(Release)_StaticCrt|x64 + {0943354A-41E0-4215-878A-8D0FE758052C}.Debug_VldRelease_StaticCrt|x64.Build.0 = Debug(Release)_StaticCrt|x64 + {0943354A-41E0-4215-878A-8D0FE758052C}.Debug_VldRelease|Win32.ActiveCfg = Debug(Release)|Win32 + {0943354A-41E0-4215-878A-8D0FE758052C}.Debug_VldRelease|Win32.Build.0 = Debug(Release)|Win32 + {0943354A-41E0-4215-878A-8D0FE758052C}.Debug_VldRelease|x64.ActiveCfg = Debug(Release)|x64 + {0943354A-41E0-4215-878A-8D0FE758052C}.Debug_VldRelease|x64.Build.0 = Debug(Release)|x64 + {0943354A-41E0-4215-878A-8D0FE758052C}.Debug|Win32.ActiveCfg = Debug|Win32 + {0943354A-41E0-4215-878A-8D0FE758052C}.Debug|Win32.Build.0 = Debug|Win32 + {0943354A-41E0-4215-878A-8D0FE758052C}.Debug|x64.ActiveCfg = Debug|x64 + {0943354A-41E0-4215-878A-8D0FE758052C}.Debug|x64.Build.0 = Debug|x64 + {0943354A-41E0-4215-878A-8D0FE758052C}.Release_StaticCrt|Win32.ActiveCfg = Release_StaticCrt|Win32 + {0943354A-41E0-4215-878A-8D0FE758052C}.Release_StaticCrt|Win32.Build.0 = Release_StaticCrt|Win32 + {0943354A-41E0-4215-878A-8D0FE758052C}.Release_StaticCrt|x64.ActiveCfg = Release_StaticCrt|x64 + {0943354A-41E0-4215-878A-8D0FE758052C}.Release_StaticCrt|x64.Build.0 = Release_StaticCrt|x64 + {0943354A-41E0-4215-878A-8D0FE758052C}.Release|Win32.ActiveCfg = Release|Win32 + {0943354A-41E0-4215-878A-8D0FE758052C}.Release|Win32.Build.0 = Release|Win32 + {0943354A-41E0-4215-878A-8D0FE758052C}.Release|x64.ActiveCfg = Release|x64 + {0943354A-41E0-4215-878A-8D0FE758052C}.Release|x64.Build.0 = Release|x64 + {EE4A829C-5FD8-460B-8A90-B518B9BABB70}.Debug_StaticCrt|Win32.ActiveCfg = Debug_StaticCrt|Win32 + {EE4A829C-5FD8-460B-8A90-B518B9BABB70}.Debug_StaticCrt|Win32.Build.0 = Debug_StaticCrt|Win32 + {EE4A829C-5FD8-460B-8A90-B518B9BABB70}.Debug_StaticCrt|x64.ActiveCfg = Debug_StaticCrt|x64 + {EE4A829C-5FD8-460B-8A90-B518B9BABB70}.Debug_StaticCrt|x64.Build.0 = Debug_StaticCrt|x64 + {EE4A829C-5FD8-460B-8A90-B518B9BABB70}.Debug_StaticCrt|x64.Deploy.0 = Debug_StaticCrt|x64 + {EE4A829C-5FD8-460B-8A90-B518B9BABB70}.Debug_VldRelease_StaticCrt|Win32.ActiveCfg = Debug(Release)_StaticCrt|Win32 + {EE4A829C-5FD8-460B-8A90-B518B9BABB70}.Debug_VldRelease_StaticCrt|Win32.Build.0 = Debug(Release)_StaticCrt|Win32 + {EE4A829C-5FD8-460B-8A90-B518B9BABB70}.Debug_VldRelease_StaticCrt|x64.ActiveCfg = Debug(Release)_StaticCrt|x64 + {EE4A829C-5FD8-460B-8A90-B518B9BABB70}.Debug_VldRelease_StaticCrt|x64.Build.0 = Debug(Release)_StaticCrt|x64 + {EE4A829C-5FD8-460B-8A90-B518B9BABB70}.Debug_VldRelease|Win32.ActiveCfg = Debug(Release)|Win32 + {EE4A829C-5FD8-460B-8A90-B518B9BABB70}.Debug_VldRelease|Win32.Build.0 = Debug(Release)|Win32 + {EE4A829C-5FD8-460B-8A90-B518B9BABB70}.Debug_VldRelease|x64.ActiveCfg = Debug(Release)|x64 + {EE4A829C-5FD8-460B-8A90-B518B9BABB70}.Debug_VldRelease|x64.Build.0 = Debug(Release)|x64 + {EE4A829C-5FD8-460B-8A90-B518B9BABB70}.Debug|Win32.ActiveCfg = Debug|Win32 + {EE4A829C-5FD8-460B-8A90-B518B9BABB70}.Debug|Win32.Build.0 = Debug|Win32 + {EE4A829C-5FD8-460B-8A90-B518B9BABB70}.Debug|x64.ActiveCfg = Debug|x64 + {EE4A829C-5FD8-460B-8A90-B518B9BABB70}.Debug|x64.Build.0 = Debug|x64 + {EE4A829C-5FD8-460B-8A90-B518B9BABB70}.Release_StaticCrt|Win32.ActiveCfg = Release_StaticCrt|Win32 + {EE4A829C-5FD8-460B-8A90-B518B9BABB70}.Release_StaticCrt|Win32.Build.0 = Release_StaticCrt|Win32 + {EE4A829C-5FD8-460B-8A90-B518B9BABB70}.Release_StaticCrt|x64.ActiveCfg = Release_StaticCrt|x64 + {EE4A829C-5FD8-460B-8A90-B518B9BABB70}.Release_StaticCrt|x64.Build.0 = Release_StaticCrt|x64 + {EE4A829C-5FD8-460B-8A90-B518B9BABB70}.Release|Win32.ActiveCfg = Release|Win32 + {EE4A829C-5FD8-460B-8A90-B518B9BABB70}.Release|Win32.Build.0 = Release|Win32 + {EE4A829C-5FD8-460B-8A90-B518B9BABB70}.Release|x64.ActiveCfg = Release|x64 + {EE4A829C-5FD8-460B-8A90-B518B9BABB70}.Release|x64.Build.0 = Release|x64 + {3AEA2AAF-3E9B-466F-B361-560B95AD88B4}.Debug_StaticCrt|Win32.ActiveCfg = Debug_StaticCrt|Win32 + {3AEA2AAF-3E9B-466F-B361-560B95AD88B4}.Debug_StaticCrt|Win32.Build.0 = Debug_StaticCrt|Win32 + {3AEA2AAF-3E9B-466F-B361-560B95AD88B4}.Debug_StaticCrt|x64.ActiveCfg = Debug_StaticCrt|x64 + {3AEA2AAF-3E9B-466F-B361-560B95AD88B4}.Debug_StaticCrt|x64.Build.0 = Debug_StaticCrt|x64 + {3AEA2AAF-3E9B-466F-B361-560B95AD88B4}.Debug_VldRelease_StaticCrt|Win32.ActiveCfg = Debug(Release)_StaticCrt|Win32 + {3AEA2AAF-3E9B-466F-B361-560B95AD88B4}.Debug_VldRelease_StaticCrt|Win32.Build.0 = Debug(Release)_StaticCrt|Win32 + {3AEA2AAF-3E9B-466F-B361-560B95AD88B4}.Debug_VldRelease_StaticCrt|x64.ActiveCfg = Debug(Release)_StaticCrt|x64 + {3AEA2AAF-3E9B-466F-B361-560B95AD88B4}.Debug_VldRelease_StaticCrt|x64.Build.0 = Debug(Release)_StaticCrt|x64 + {3AEA2AAF-3E9B-466F-B361-560B95AD88B4}.Debug_VldRelease|Win32.ActiveCfg = Debug(Release)|Win32 + {3AEA2AAF-3E9B-466F-B361-560B95AD88B4}.Debug_VldRelease|Win32.Build.0 = Debug(Release)|Win32 + {3AEA2AAF-3E9B-466F-B361-560B95AD88B4}.Debug_VldRelease|x64.ActiveCfg = Debug(Release)|x64 + {3AEA2AAF-3E9B-466F-B361-560B95AD88B4}.Debug_VldRelease|x64.Build.0 = Debug(Release)|x64 + {3AEA2AAF-3E9B-466F-B361-560B95AD88B4}.Debug|Win32.ActiveCfg = Debug|Win32 + {3AEA2AAF-3E9B-466F-B361-560B95AD88B4}.Debug|Win32.Build.0 = Debug|Win32 + {3AEA2AAF-3E9B-466F-B361-560B95AD88B4}.Debug|x64.ActiveCfg = Debug|x64 + {3AEA2AAF-3E9B-466F-B361-560B95AD88B4}.Debug|x64.Build.0 = Debug|x64 + {3AEA2AAF-3E9B-466F-B361-560B95AD88B4}.Release_StaticCrt|Win32.ActiveCfg = Release_StaticCrt|Win32 + {3AEA2AAF-3E9B-466F-B361-560B95AD88B4}.Release_StaticCrt|Win32.Build.0 = Release_StaticCrt|Win32 + {3AEA2AAF-3E9B-466F-B361-560B95AD88B4}.Release_StaticCrt|x64.ActiveCfg = Release_StaticCrt|x64 + {3AEA2AAF-3E9B-466F-B361-560B95AD88B4}.Release_StaticCrt|x64.Build.0 = Release_StaticCrt|x64 + {3AEA2AAF-3E9B-466F-B361-560B95AD88B4}.Release|Win32.ActiveCfg = Release|Win32 + {3AEA2AAF-3E9B-466F-B361-560B95AD88B4}.Release|Win32.Build.0 = Release|Win32 + {3AEA2AAF-3E9B-466F-B361-560B95AD88B4}.Release|x64.ActiveCfg = Release|x64 + {3AEA2AAF-3E9B-466F-B361-560B95AD88B4}.Release|x64.Build.0 = Release|x64 + {5C25E1C8-00CB-4E0A-9BEC-952F0A6E5DCA}.Debug_StaticCrt|Win32.ActiveCfg = Debug_StaticCrt|Win32 + {5C25E1C8-00CB-4E0A-9BEC-952F0A6E5DCA}.Debug_StaticCrt|Win32.Build.0 = Debug_StaticCrt|Win32 + {5C25E1C8-00CB-4E0A-9BEC-952F0A6E5DCA}.Debug_StaticCrt|x64.ActiveCfg = Debug_StaticCrt|x64 + {5C25E1C8-00CB-4E0A-9BEC-952F0A6E5DCA}.Debug_StaticCrt|x64.Build.0 = Debug_StaticCrt|x64 + {5C25E1C8-00CB-4E0A-9BEC-952F0A6E5DCA}.Debug_VldRelease_StaticCrt|Win32.ActiveCfg = Debug(Release)_StaticCrt|Win32 + {5C25E1C8-00CB-4E0A-9BEC-952F0A6E5DCA}.Debug_VldRelease_StaticCrt|Win32.Build.0 = Debug(Release)_StaticCrt|Win32 + {5C25E1C8-00CB-4E0A-9BEC-952F0A6E5DCA}.Debug_VldRelease_StaticCrt|x64.ActiveCfg = Debug(Release)_StaticCrt|x64 + {5C25E1C8-00CB-4E0A-9BEC-952F0A6E5DCA}.Debug_VldRelease_StaticCrt|x64.Build.0 = Debug(Release)_StaticCrt|x64 + {5C25E1C8-00CB-4E0A-9BEC-952F0A6E5DCA}.Debug_VldRelease|Win32.ActiveCfg = Debug(Release)|Win32 + {5C25E1C8-00CB-4E0A-9BEC-952F0A6E5DCA}.Debug_VldRelease|Win32.Build.0 = Debug(Release)|Win32 + {5C25E1C8-00CB-4E0A-9BEC-952F0A6E5DCA}.Debug_VldRelease|x64.ActiveCfg = Debug(Release)|x64 + {5C25E1C8-00CB-4E0A-9BEC-952F0A6E5DCA}.Debug_VldRelease|x64.Build.0 = Debug(Release)|x64 + {5C25E1C8-00CB-4E0A-9BEC-952F0A6E5DCA}.Debug|Win32.ActiveCfg = Debug|Win32 + {5C25E1C8-00CB-4E0A-9BEC-952F0A6E5DCA}.Debug|Win32.Build.0 = Debug|Win32 + {5C25E1C8-00CB-4E0A-9BEC-952F0A6E5DCA}.Debug|x64.ActiveCfg = Debug|x64 + {5C25E1C8-00CB-4E0A-9BEC-952F0A6E5DCA}.Debug|x64.Build.0 = Debug|x64 + {5C25E1C8-00CB-4E0A-9BEC-952F0A6E5DCA}.Release_StaticCrt|Win32.ActiveCfg = Release_StaticCrt|Win32 + {5C25E1C8-00CB-4E0A-9BEC-952F0A6E5DCA}.Release_StaticCrt|Win32.Build.0 = Release_StaticCrt|Win32 + {5C25E1C8-00CB-4E0A-9BEC-952F0A6E5DCA}.Release_StaticCrt|x64.ActiveCfg = Release_StaticCrt|x64 + {5C25E1C8-00CB-4E0A-9BEC-952F0A6E5DCA}.Release_StaticCrt|x64.Build.0 = Release_StaticCrt|x64 + {5C25E1C8-00CB-4E0A-9BEC-952F0A6E5DCA}.Release|Win32.ActiveCfg = Release|Win32 + {5C25E1C8-00CB-4E0A-9BEC-952F0A6E5DCA}.Release|Win32.Build.0 = Release|Win32 + {5C25E1C8-00CB-4E0A-9BEC-952F0A6E5DCA}.Release|x64.ActiveCfg = Release|x64 + {5C25E1C8-00CB-4E0A-9BEC-952F0A6E5DCA}.Release|x64.Build.0 = Release|x64 + {2178E5B2-1032-441F-A664-F3D8D1FD1913}.Debug_StaticCrt|Win32.ActiveCfg = Debug_StaticCrt|Win32 + {2178E5B2-1032-441F-A664-F3D8D1FD1913}.Debug_StaticCrt|Win32.Build.0 = Debug_StaticCrt|Win32 + {2178E5B2-1032-441F-A664-F3D8D1FD1913}.Debug_StaticCrt|x64.ActiveCfg = Debug_StaticCrt|x64 + {2178E5B2-1032-441F-A664-F3D8D1FD1913}.Debug_StaticCrt|x64.Build.0 = Debug_StaticCrt|x64 + {2178E5B2-1032-441F-A664-F3D8D1FD1913}.Debug_VldRelease_StaticCrt|Win32.ActiveCfg = Debug(Release)_StaticCrt|Win32 + {2178E5B2-1032-441F-A664-F3D8D1FD1913}.Debug_VldRelease_StaticCrt|Win32.Build.0 = Debug(Release)_StaticCrt|Win32 + {2178E5B2-1032-441F-A664-F3D8D1FD1913}.Debug_VldRelease_StaticCrt|x64.ActiveCfg = Debug(Release)_StaticCrt|x64 + {2178E5B2-1032-441F-A664-F3D8D1FD1913}.Debug_VldRelease_StaticCrt|x64.Build.0 = Debug(Release)_StaticCrt|x64 + {2178E5B2-1032-441F-A664-F3D8D1FD1913}.Debug_VldRelease|Win32.ActiveCfg = Debug(Release)|Win32 + {2178E5B2-1032-441F-A664-F3D8D1FD1913}.Debug_VldRelease|Win32.Build.0 = Debug(Release)|Win32 + {2178E5B2-1032-441F-A664-F3D8D1FD1913}.Debug_VldRelease|x64.ActiveCfg = Debug(Release)|x64 + {2178E5B2-1032-441F-A664-F3D8D1FD1913}.Debug_VldRelease|x64.Build.0 = Debug(Release)|x64 + {2178E5B2-1032-441F-A664-F3D8D1FD1913}.Debug|Win32.ActiveCfg = Debug|Win32 + {2178E5B2-1032-441F-A664-F3D8D1FD1913}.Debug|Win32.Build.0 = Debug|Win32 + {2178E5B2-1032-441F-A664-F3D8D1FD1913}.Debug|x64.ActiveCfg = Debug|x64 + {2178E5B2-1032-441F-A664-F3D8D1FD1913}.Debug|x64.Build.0 = Debug|x64 + {2178E5B2-1032-441F-A664-F3D8D1FD1913}.Release_StaticCrt|Win32.ActiveCfg = Release_StaticCrt|Win32 + {2178E5B2-1032-441F-A664-F3D8D1FD1913}.Release_StaticCrt|Win32.Build.0 = Release_StaticCrt|Win32 + {2178E5B2-1032-441F-A664-F3D8D1FD1913}.Release_StaticCrt|x64.ActiveCfg = Release_StaticCrt|x64 + {2178E5B2-1032-441F-A664-F3D8D1FD1913}.Release_StaticCrt|x64.Build.0 = Release_StaticCrt|x64 + {2178E5B2-1032-441F-A664-F3D8D1FD1913}.Release|Win32.ActiveCfg = Release|Win32 + {2178E5B2-1032-441F-A664-F3D8D1FD1913}.Release|Win32.Build.0 = Release|Win32 + {2178E5B2-1032-441F-A664-F3D8D1FD1913}.Release|x64.ActiveCfg = Release|x64 + {2178E5B2-1032-441F-A664-F3D8D1FD1913}.Release|x64.Build.0 = Release|x64 + {A231973E-072A-428E-982E-5363ADD1CDE2}.Debug_StaticCrt|Win32.ActiveCfg = Debug_StaticCrt|Win32 + {A231973E-072A-428E-982E-5363ADD1CDE2}.Debug_StaticCrt|Win32.Build.0 = Debug_StaticCrt|Win32 + {A231973E-072A-428E-982E-5363ADD1CDE2}.Debug_StaticCrt|x64.ActiveCfg = Debug_StaticCrt|x64 + {A231973E-072A-428E-982E-5363ADD1CDE2}.Debug_StaticCrt|x64.Build.0 = Debug_StaticCrt|x64 + {A231973E-072A-428E-982E-5363ADD1CDE2}.Debug_VldRelease_StaticCrt|Win32.ActiveCfg = Release_StaticCrt|Win32 + {A231973E-072A-428E-982E-5363ADD1CDE2}.Debug_VldRelease_StaticCrt|Win32.Build.0 = Release_StaticCrt|Win32 + {A231973E-072A-428E-982E-5363ADD1CDE2}.Debug_VldRelease_StaticCrt|x64.ActiveCfg = Release_StaticCrt|x64 + {A231973E-072A-428E-982E-5363ADD1CDE2}.Debug_VldRelease_StaticCrt|x64.Build.0 = Release_StaticCrt|x64 + {A231973E-072A-428E-982E-5363ADD1CDE2}.Debug_VldRelease|Win32.ActiveCfg = Release|Win32 + {A231973E-072A-428E-982E-5363ADD1CDE2}.Debug_VldRelease|Win32.Build.0 = Release|Win32 + {A231973E-072A-428E-982E-5363ADD1CDE2}.Debug_VldRelease|x64.ActiveCfg = Release|x64 + {A231973E-072A-428E-982E-5363ADD1CDE2}.Debug_VldRelease|x64.Build.0 = Release|x64 + {A231973E-072A-428E-982E-5363ADD1CDE2}.Debug|Win32.ActiveCfg = Debug|Win32 + {A231973E-072A-428E-982E-5363ADD1CDE2}.Debug|Win32.Build.0 = Debug|Win32 + {A231973E-072A-428E-982E-5363ADD1CDE2}.Debug|x64.ActiveCfg = Debug|x64 + {A231973E-072A-428E-982E-5363ADD1CDE2}.Debug|x64.Build.0 = Debug|x64 + {A231973E-072A-428E-982E-5363ADD1CDE2}.Release_StaticCrt|Win32.ActiveCfg = Release_StaticCrt|Win32 + {A231973E-072A-428E-982E-5363ADD1CDE2}.Release_StaticCrt|Win32.Build.0 = Release_StaticCrt|Win32 + {A231973E-072A-428E-982E-5363ADD1CDE2}.Release_StaticCrt|x64.ActiveCfg = Release_StaticCrt|x64 + {A231973E-072A-428E-982E-5363ADD1CDE2}.Release_StaticCrt|x64.Build.0 = Release_StaticCrt|x64 + {A231973E-072A-428E-982E-5363ADD1CDE2}.Release|Win32.ActiveCfg = Release|Win32 + {A231973E-072A-428E-982E-5363ADD1CDE2}.Release|Win32.Build.0 = Release|Win32 + {A231973E-072A-428E-982E-5363ADD1CDE2}.Release|x64.ActiveCfg = Release|x64 + {A231973E-072A-428E-982E-5363ADD1CDE2}.Release|x64.Build.0 = Release|x64 + {87911ED6-84BC-4526-9654-A4FF4E0EDF52}.Debug_StaticCrt|Win32.ActiveCfg = Debug_StaticCrt|Win32 + {87911ED6-84BC-4526-9654-A4FF4E0EDF52}.Debug_StaticCrt|Win32.Build.0 = Debug_StaticCrt|Win32 + {87911ED6-84BC-4526-9654-A4FF4E0EDF52}.Debug_StaticCrt|x64.ActiveCfg = Debug_StaticCrt|x64 + {87911ED6-84BC-4526-9654-A4FF4E0EDF52}.Debug_StaticCrt|x64.Build.0 = Debug_StaticCrt|x64 + {87911ED6-84BC-4526-9654-A4FF4E0EDF52}.Debug_VldRelease_StaticCrt|Win32.ActiveCfg = Debug(Release)_StaticCrt|Win32 + {87911ED6-84BC-4526-9654-A4FF4E0EDF52}.Debug_VldRelease_StaticCrt|Win32.Build.0 = Debug(Release)_StaticCrt|Win32 + {87911ED6-84BC-4526-9654-A4FF4E0EDF52}.Debug_VldRelease_StaticCrt|x64.ActiveCfg = Debug(Release)_StaticCrt|x64 + {87911ED6-84BC-4526-9654-A4FF4E0EDF52}.Debug_VldRelease_StaticCrt|x64.Build.0 = Debug(Release)_StaticCrt|x64 + {87911ED6-84BC-4526-9654-A4FF4E0EDF52}.Debug_VldRelease|Win32.ActiveCfg = Debug(Release)|Win32 + {87911ED6-84BC-4526-9654-A4FF4E0EDF52}.Debug_VldRelease|Win32.Build.0 = Debug(Release)|Win32 + {87911ED6-84BC-4526-9654-A4FF4E0EDF52}.Debug_VldRelease|x64.ActiveCfg = Debug(Release)|x64 + {87911ED6-84BC-4526-9654-A4FF4E0EDF52}.Debug_VldRelease|x64.Build.0 = Debug(Release)|x64 + {87911ED6-84BC-4526-9654-A4FF4E0EDF52}.Debug|Win32.ActiveCfg = Debug|Win32 + {87911ED6-84BC-4526-9654-A4FF4E0EDF52}.Debug|Win32.Build.0 = Debug|Win32 + {87911ED6-84BC-4526-9654-A4FF4E0EDF52}.Debug|x64.ActiveCfg = Debug|x64 + {87911ED6-84BC-4526-9654-A4FF4E0EDF52}.Debug|x64.Build.0 = Debug|x64 + {87911ED6-84BC-4526-9654-A4FF4E0EDF52}.Release_StaticCrt|Win32.ActiveCfg = Release_StaticCrt|Win32 + {87911ED6-84BC-4526-9654-A4FF4E0EDF52}.Release_StaticCrt|Win32.Build.0 = Release_StaticCrt|Win32 + {87911ED6-84BC-4526-9654-A4FF4E0EDF52}.Release_StaticCrt|x64.ActiveCfg = Release_StaticCrt|x64 + {87911ED6-84BC-4526-9654-A4FF4E0EDF52}.Release_StaticCrt|x64.Build.0 = Release_StaticCrt|x64 + {87911ED6-84BC-4526-9654-A4FF4E0EDF52}.Release|Win32.ActiveCfg = Release|Win32 + {87911ED6-84BC-4526-9654-A4FF4E0EDF52}.Release|Win32.Build.0 = Release|Win32 + {87911ED6-84BC-4526-9654-A4FF4E0EDF52}.Release|x64.ActiveCfg = Release|x64 + {87911ED6-84BC-4526-9654-A4FF4E0EDF52}.Release|x64.Build.0 = Release|x64 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug_StaticCrt|Win32.ActiveCfg = Debug_StaticCrt|Win32 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug_StaticCrt|Win32.Build.0 = Debug_StaticCrt|Win32 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug_StaticCrt|x64.ActiveCfg = Debug_StaticCrt|x64 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug_StaticCrt|x64.Build.0 = Debug_StaticCrt|x64 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug_VldRelease_StaticCrt|Win32.ActiveCfg = Debug_StaticCrt|Win32 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug_VldRelease_StaticCrt|Win32.Build.0 = Debug_StaticCrt|Win32 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug_VldRelease_StaticCrt|x64.ActiveCfg = Debug_StaticCrt|x64 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug_VldRelease_StaticCrt|x64.Build.0 = Debug_StaticCrt|x64 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug_VldRelease|Win32.ActiveCfg = Debug|Win32 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug_VldRelease|Win32.Build.0 = Debug|Win32 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug_VldRelease|x64.ActiveCfg = Debug|x64 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug_VldRelease|x64.Build.0 = Debug|x64 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug|Win32.ActiveCfg = Debug|Win32 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug|Win32.Build.0 = Debug|Win32 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug|x64.ActiveCfg = Debug|x64 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug|x64.Build.0 = Debug|x64 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release_StaticCrt|Win32.ActiveCfg = Release_StaticCrt|Win32 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release_StaticCrt|Win32.Build.0 = Release_StaticCrt|Win32 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release_StaticCrt|x64.ActiveCfg = Release_StaticCrt|x64 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release_StaticCrt|x64.Build.0 = Release_StaticCrt|x64 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release|Win32.ActiveCfg = Release|Win32 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release|Win32.Build.0 = Release|Win32 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release|x64.ActiveCfg = Release|x64 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release|x64.Build.0 = Release|x64 + {4ADFD279-56C6-4B1D-BA9E-B815E81C1B17}.Debug_StaticCrt|Win32.ActiveCfg = Debug|Win32 + {4ADFD279-56C6-4B1D-BA9E-B815E81C1B17}.Debug_StaticCrt|Win32.Build.0 = Debug|Win32 + {4ADFD279-56C6-4B1D-BA9E-B815E81C1B17}.Debug_StaticCrt|x64.ActiveCfg = Debug|x64 + {4ADFD279-56C6-4B1D-BA9E-B815E81C1B17}.Debug_StaticCrt|x64.Build.0 = Debug|x64 + {4ADFD279-56C6-4B1D-BA9E-B815E81C1B17}.Debug_VldRelease_StaticCrt|Win32.ActiveCfg = Release|Win32 + {4ADFD279-56C6-4B1D-BA9E-B815E81C1B17}.Debug_VldRelease_StaticCrt|Win32.Build.0 = Release|Win32 + {4ADFD279-56C6-4B1D-BA9E-B815E81C1B17}.Debug_VldRelease_StaticCrt|x64.ActiveCfg = Release|x64 + {4ADFD279-56C6-4B1D-BA9E-B815E81C1B17}.Debug_VldRelease_StaticCrt|x64.Build.0 = Release|x64 + {4ADFD279-56C6-4B1D-BA9E-B815E81C1B17}.Debug_VldRelease|Win32.ActiveCfg = Release|Win32 + {4ADFD279-56C6-4B1D-BA9E-B815E81C1B17}.Debug_VldRelease|Win32.Build.0 = Release|Win32 + {4ADFD279-56C6-4B1D-BA9E-B815E81C1B17}.Debug_VldRelease|x64.ActiveCfg = Release|x64 + {4ADFD279-56C6-4B1D-BA9E-B815E81C1B17}.Debug_VldRelease|x64.Build.0 = Release|x64 + {4ADFD279-56C6-4B1D-BA9E-B815E81C1B17}.Debug|Win32.ActiveCfg = Debug|Win32 + {4ADFD279-56C6-4B1D-BA9E-B815E81C1B17}.Debug|Win32.Build.0 = Debug|Win32 + {4ADFD279-56C6-4B1D-BA9E-B815E81C1B17}.Debug|x64.ActiveCfg = Debug|x64 + {4ADFD279-56C6-4B1D-BA9E-B815E81C1B17}.Debug|x64.Build.0 = Debug|x64 + {4ADFD279-56C6-4B1D-BA9E-B815E81C1B17}.Release_StaticCrt|Win32.ActiveCfg = Release|Win32 + {4ADFD279-56C6-4B1D-BA9E-B815E81C1B17}.Release_StaticCrt|Win32.Build.0 = Release|Win32 + {4ADFD279-56C6-4B1D-BA9E-B815E81C1B17}.Release_StaticCrt|x64.ActiveCfg = Release|x64 + {4ADFD279-56C6-4B1D-BA9E-B815E81C1B17}.Release_StaticCrt|x64.Build.0 = Release|x64 + {4ADFD279-56C6-4B1D-BA9E-B815E81C1B17}.Release|Win32.ActiveCfg = Release|Win32 + {4ADFD279-56C6-4B1D-BA9E-B815E81C1B17}.Release|Win32.Build.0 = Release|Win32 + {4ADFD279-56C6-4B1D-BA9E-B815E81C1B17}.Release|x64.ActiveCfg = Release|x64 + {4ADFD279-56C6-4B1D-BA9E-B815E81C1B17}.Release|x64.Build.0 = Release|x64 + {8C732490-DC1A-40C0-923F-1555B9141B80}.Debug_StaticCrt|Win32.ActiveCfg = Debug_StaticCrt|Win32 + {8C732490-DC1A-40C0-923F-1555B9141B80}.Debug_StaticCrt|Win32.Build.0 = Debug_StaticCrt|Win32 + {8C732490-DC1A-40C0-923F-1555B9141B80}.Debug_StaticCrt|x64.ActiveCfg = Debug_StaticCrt|x64 + {8C732490-DC1A-40C0-923F-1555B9141B80}.Debug_StaticCrt|x64.Build.0 = Debug_StaticCrt|x64 + {8C732490-DC1A-40C0-923F-1555B9141B80}.Debug_VldRelease_StaticCrt|Win32.ActiveCfg = Debug(Release)_StaticCrt|Win32 + {8C732490-DC1A-40C0-923F-1555B9141B80}.Debug_VldRelease_StaticCrt|Win32.Build.0 = Debug(Release)_StaticCrt|Win32 + {8C732490-DC1A-40C0-923F-1555B9141B80}.Debug_VldRelease_StaticCrt|x64.ActiveCfg = Debug(Release)_StaticCrt|x64 + {8C732490-DC1A-40C0-923F-1555B9141B80}.Debug_VldRelease_StaticCrt|x64.Build.0 = Debug(Release)_StaticCrt|x64 + {8C732490-DC1A-40C0-923F-1555B9141B80}.Debug_VldRelease|Win32.ActiveCfg = Debug(Release)|Win32 + {8C732490-DC1A-40C0-923F-1555B9141B80}.Debug_VldRelease|Win32.Build.0 = Debug(Release)|Win32 + {8C732490-DC1A-40C0-923F-1555B9141B80}.Debug_VldRelease|x64.ActiveCfg = Debug(Release)|x64 + {8C732490-DC1A-40C0-923F-1555B9141B80}.Debug_VldRelease|x64.Build.0 = Debug(Release)|x64 + {8C732490-DC1A-40C0-923F-1555B9141B80}.Debug|Win32.ActiveCfg = Debug|Win32 + {8C732490-DC1A-40C0-923F-1555B9141B80}.Debug|Win32.Build.0 = Debug|Win32 + {8C732490-DC1A-40C0-923F-1555B9141B80}.Debug|x64.ActiveCfg = Debug|x64 + {8C732490-DC1A-40C0-923F-1555B9141B80}.Debug|x64.Build.0 = Debug|x64 + {8C732490-DC1A-40C0-923F-1555B9141B80}.Release_StaticCrt|Win32.ActiveCfg = Release_StaticCrt|Win32 + {8C732490-DC1A-40C0-923F-1555B9141B80}.Release_StaticCrt|Win32.Build.0 = Release_StaticCrt|Win32 + {8C732490-DC1A-40C0-923F-1555B9141B80}.Release_StaticCrt|x64.ActiveCfg = Release_StaticCrt|x64 + {8C732490-DC1A-40C0-923F-1555B9141B80}.Release_StaticCrt|x64.Build.0 = Release_StaticCrt|x64 + {8C732490-DC1A-40C0-923F-1555B9141B80}.Release|Win32.ActiveCfg = Release|Win32 + {8C732490-DC1A-40C0-923F-1555B9141B80}.Release|Win32.Build.0 = Release|Win32 + {8C732490-DC1A-40C0-923F-1555B9141B80}.Release|x64.ActiveCfg = Release|x64 + {8C732490-DC1A-40C0-923F-1555B9141B80}.Release|x64.Build.0 = Release|x64 + {A8EEDB38-1E5A-4D6E-A3E0-F15EF1F2E814}.Debug_StaticCrt|Win32.ActiveCfg = Debug_StaticCrt|Win32 + {A8EEDB38-1E5A-4D6E-A3E0-F15EF1F2E814}.Debug_StaticCrt|Win32.Build.0 = Debug_StaticCrt|Win32 + {A8EEDB38-1E5A-4D6E-A3E0-F15EF1F2E814}.Debug_StaticCrt|x64.ActiveCfg = Debug_StaticCrt|x64 + {A8EEDB38-1E5A-4D6E-A3E0-F15EF1F2E814}.Debug_StaticCrt|x64.Build.0 = Debug_StaticCrt|x64 + {A8EEDB38-1E5A-4D6E-A3E0-F15EF1F2E814}.Debug_VldRelease_StaticCrt|Win32.ActiveCfg = Debug(Release)_StaticCrt|Win32 + {A8EEDB38-1E5A-4D6E-A3E0-F15EF1F2E814}.Debug_VldRelease_StaticCrt|Win32.Build.0 = Debug(Release)_StaticCrt|Win32 + {A8EEDB38-1E5A-4D6E-A3E0-F15EF1F2E814}.Debug_VldRelease_StaticCrt|x64.ActiveCfg = Debug(Release)_StaticCrt|x64 + {A8EEDB38-1E5A-4D6E-A3E0-F15EF1F2E814}.Debug_VldRelease_StaticCrt|x64.Build.0 = Debug(Release)_StaticCrt|x64 + {A8EEDB38-1E5A-4D6E-A3E0-F15EF1F2E814}.Debug_VldRelease|Win32.ActiveCfg = Debug(Release)|Win32 + {A8EEDB38-1E5A-4D6E-A3E0-F15EF1F2E814}.Debug_VldRelease|Win32.Build.0 = Debug(Release)|Win32 + {A8EEDB38-1E5A-4D6E-A3E0-F15EF1F2E814}.Debug_VldRelease|x64.ActiveCfg = Debug(Release)|x64 + {A8EEDB38-1E5A-4D6E-A3E0-F15EF1F2E814}.Debug_VldRelease|x64.Build.0 = Debug(Release)|x64 + {A8EEDB38-1E5A-4D6E-A3E0-F15EF1F2E814}.Debug|Win32.ActiveCfg = Debug|Win32 + {A8EEDB38-1E5A-4D6E-A3E0-F15EF1F2E814}.Debug|Win32.Build.0 = Debug|Win32 + {A8EEDB38-1E5A-4D6E-A3E0-F15EF1F2E814}.Debug|x64.ActiveCfg = Debug|x64 + {A8EEDB38-1E5A-4D6E-A3E0-F15EF1F2E814}.Debug|x64.Build.0 = Debug|x64 + {A8EEDB38-1E5A-4D6E-A3E0-F15EF1F2E814}.Release_StaticCrt|Win32.ActiveCfg = Release_StaticCrt|Win32 + {A8EEDB38-1E5A-4D6E-A3E0-F15EF1F2E814}.Release_StaticCrt|Win32.Build.0 = Release_StaticCrt|Win32 + {A8EEDB38-1E5A-4D6E-A3E0-F15EF1F2E814}.Release_StaticCrt|x64.ActiveCfg = Release_StaticCrt|x64 + {A8EEDB38-1E5A-4D6E-A3E0-F15EF1F2E814}.Release_StaticCrt|x64.Build.0 = Release_StaticCrt|x64 + {A8EEDB38-1E5A-4D6E-A3E0-F15EF1F2E814}.Release|Win32.ActiveCfg = Release|Win32 + {A8EEDB38-1E5A-4D6E-A3E0-F15EF1F2E814}.Release|Win32.Build.0 = Release|Win32 + {A8EEDB38-1E5A-4D6E-A3E0-F15EF1F2E814}.Release|x64.ActiveCfg = Release|x64 + {A8EEDB38-1E5A-4D6E-A3E0-F15EF1F2E814}.Release|x64.Build.0 = Release|x64 + {50C94B05-8C3E-49ED-B2B9-5715EB624D14}.Debug_StaticCrt|Win32.ActiveCfg = Debug_StaticCrt|Win32 + {50C94B05-8C3E-49ED-B2B9-5715EB624D14}.Debug_StaticCrt|Win32.Build.0 = Debug_StaticCrt|Win32 + {50C94B05-8C3E-49ED-B2B9-5715EB624D14}.Debug_StaticCrt|x64.ActiveCfg = Debug_StaticCrt|x64 + {50C94B05-8C3E-49ED-B2B9-5715EB624D14}.Debug_StaticCrt|x64.Build.0 = Debug_StaticCrt|x64 + {50C94B05-8C3E-49ED-B2B9-5715EB624D14}.Debug_VldRelease_StaticCrt|Win32.ActiveCfg = Debug(Release)_StaticCrt|Win32 + {50C94B05-8C3E-49ED-B2B9-5715EB624D14}.Debug_VldRelease_StaticCrt|Win32.Build.0 = Debug(Release)_StaticCrt|Win32 + {50C94B05-8C3E-49ED-B2B9-5715EB624D14}.Debug_VldRelease_StaticCrt|x64.ActiveCfg = Debug(Release)_StaticCrt|x64 + {50C94B05-8C3E-49ED-B2B9-5715EB624D14}.Debug_VldRelease_StaticCrt|x64.Build.0 = Debug(Release)_StaticCrt|x64 + {50C94B05-8C3E-49ED-B2B9-5715EB624D14}.Debug_VldRelease|Win32.ActiveCfg = Debug(Release)|Win32 + {50C94B05-8C3E-49ED-B2B9-5715EB624D14}.Debug_VldRelease|Win32.Build.0 = Debug(Release)|Win32 + {50C94B05-8C3E-49ED-B2B9-5715EB624D14}.Debug_VldRelease|x64.ActiveCfg = Debug(Release)|x64 + {50C94B05-8C3E-49ED-B2B9-5715EB624D14}.Debug_VldRelease|x64.Build.0 = Debug(Release)|x64 + {50C94B05-8C3E-49ED-B2B9-5715EB624D14}.Debug|Win32.ActiveCfg = Debug|Win32 + {50C94B05-8C3E-49ED-B2B9-5715EB624D14}.Debug|Win32.Build.0 = Debug|Win32 + {50C94B05-8C3E-49ED-B2B9-5715EB624D14}.Debug|x64.ActiveCfg = Debug|x64 + {50C94B05-8C3E-49ED-B2B9-5715EB624D14}.Debug|x64.Build.0 = Debug|x64 + {50C94B05-8C3E-49ED-B2B9-5715EB624D14}.Release_StaticCrt|Win32.ActiveCfg = Release_StaticCrt|Win32 + {50C94B05-8C3E-49ED-B2B9-5715EB624D14}.Release_StaticCrt|Win32.Build.0 = Release_StaticCrt|Win32 + {50C94B05-8C3E-49ED-B2B9-5715EB624D14}.Release_StaticCrt|x64.ActiveCfg = Release_StaticCrt|x64 + {50C94B05-8C3E-49ED-B2B9-5715EB624D14}.Release_StaticCrt|x64.Build.0 = Release_StaticCrt|x64 + {50C94B05-8C3E-49ED-B2B9-5715EB624D14}.Release|Win32.ActiveCfg = Release|Win32 + {50C94B05-8C3E-49ED-B2B9-5715EB624D14}.Release|Win32.Build.0 = Release|Win32 + {50C94B05-8C3E-49ED-B2B9-5715EB624D14}.Release|x64.ActiveCfg = Release|x64 + {50C94B05-8C3E-49ED-B2B9-5715EB624D14}.Release|x64.Build.0 = Release|x64 + {33F98E06-F44C-4E22-9E16-4C20F8238A95}.Debug_StaticCrt|Win32.ActiveCfg = Debug_StaticCrt|Win32 + {33F98E06-F44C-4E22-9E16-4C20F8238A95}.Debug_StaticCrt|Win32.Build.0 = Debug_StaticCrt|Win32 + {33F98E06-F44C-4E22-9E16-4C20F8238A95}.Debug_StaticCrt|x64.ActiveCfg = Debug_StaticCrt|x64 + {33F98E06-F44C-4E22-9E16-4C20F8238A95}.Debug_StaticCrt|x64.Build.0 = Debug_StaticCrt|x64 + {33F98E06-F44C-4E22-9E16-4C20F8238A95}.Debug_VldRelease_StaticCrt|Win32.ActiveCfg = Debug(Release)_StaticCrt|Win32 + {33F98E06-F44C-4E22-9E16-4C20F8238A95}.Debug_VldRelease_StaticCrt|Win32.Build.0 = Debug(Release)_StaticCrt|Win32 + {33F98E06-F44C-4E22-9E16-4C20F8238A95}.Debug_VldRelease_StaticCrt|x64.ActiveCfg = Debug(Release)_StaticCrt|x64 + {33F98E06-F44C-4E22-9E16-4C20F8238A95}.Debug_VldRelease_StaticCrt|x64.Build.0 = Debug(Release)_StaticCrt|x64 + {33F98E06-F44C-4E22-9E16-4C20F8238A95}.Debug_VldRelease|Win32.ActiveCfg = Debug(Release)|Win32 + {33F98E06-F44C-4E22-9E16-4C20F8238A95}.Debug_VldRelease|Win32.Build.0 = Debug(Release)|Win32 + {33F98E06-F44C-4E22-9E16-4C20F8238A95}.Debug_VldRelease|x64.ActiveCfg = Debug(Release)|x64 + {33F98E06-F44C-4E22-9E16-4C20F8238A95}.Debug_VldRelease|x64.Build.0 = Debug(Release)|x64 + {33F98E06-F44C-4E22-9E16-4C20F8238A95}.Debug|Win32.ActiveCfg = Debug|Win32 + {33F98E06-F44C-4E22-9E16-4C20F8238A95}.Debug|Win32.Build.0 = Debug|Win32 + {33F98E06-F44C-4E22-9E16-4C20F8238A95}.Debug|x64.ActiveCfg = Debug|x64 + {33F98E06-F44C-4E22-9E16-4C20F8238A95}.Debug|x64.Build.0 = Debug|x64 + {33F98E06-F44C-4E22-9E16-4C20F8238A95}.Release_StaticCrt|Win32.ActiveCfg = Release_StaticCrt|Win32 + {33F98E06-F44C-4E22-9E16-4C20F8238A95}.Release_StaticCrt|Win32.Build.0 = Release_StaticCrt|Win32 + {33F98E06-F44C-4E22-9E16-4C20F8238A95}.Release_StaticCrt|x64.ActiveCfg = Release_StaticCrt|x64 + {33F98E06-F44C-4E22-9E16-4C20F8238A95}.Release_StaticCrt|x64.Build.0 = Release_StaticCrt|x64 + {33F98E06-F44C-4E22-9E16-4C20F8238A95}.Release|Win32.ActiveCfg = Release|Win32 + {33F98E06-F44C-4E22-9E16-4C20F8238A95}.Release|Win32.Build.0 = Release|Win32 + {33F98E06-F44C-4E22-9E16-4C20F8238A95}.Release|x64.ActiveCfg = Release|x64 + {33F98E06-F44C-4E22-9E16-4C20F8238A95}.Release|x64.Build.0 = Release|x64 + {3719F504-3DF0-45F8-BC7A-4415804AC7C9}.Debug_StaticCrt|Win32.ActiveCfg = Debug_StaticCrt|Win32 + {3719F504-3DF0-45F8-BC7A-4415804AC7C9}.Debug_StaticCrt|Win32.Build.0 = Debug_StaticCrt|Win32 + {3719F504-3DF0-45F8-BC7A-4415804AC7C9}.Debug_StaticCrt|x64.ActiveCfg = Debug_StaticCrt|x64 + {3719F504-3DF0-45F8-BC7A-4415804AC7C9}.Debug_StaticCrt|x64.Build.0 = Debug_StaticCrt|x64 + {3719F504-3DF0-45F8-BC7A-4415804AC7C9}.Debug_VldRelease_StaticCrt|Win32.ActiveCfg = Debug(Release)_StaticCrt|Win32 + {3719F504-3DF0-45F8-BC7A-4415804AC7C9}.Debug_VldRelease_StaticCrt|Win32.Build.0 = Debug(Release)_StaticCrt|Win32 + {3719F504-3DF0-45F8-BC7A-4415804AC7C9}.Debug_VldRelease_StaticCrt|x64.ActiveCfg = Debug(Release)_StaticCrt|x64 + {3719F504-3DF0-45F8-BC7A-4415804AC7C9}.Debug_VldRelease_StaticCrt|x64.Build.0 = Debug(Release)_StaticCrt|x64 + {3719F504-3DF0-45F8-BC7A-4415804AC7C9}.Debug_VldRelease|Win32.ActiveCfg = Debug(Release)|Win32 + {3719F504-3DF0-45F8-BC7A-4415804AC7C9}.Debug_VldRelease|Win32.Build.0 = Debug(Release)|Win32 + {3719F504-3DF0-45F8-BC7A-4415804AC7C9}.Debug_VldRelease|x64.ActiveCfg = Debug(Release)|x64 + {3719F504-3DF0-45F8-BC7A-4415804AC7C9}.Debug_VldRelease|x64.Build.0 = Debug(Release)|x64 + {3719F504-3DF0-45F8-BC7A-4415804AC7C9}.Debug|Win32.ActiveCfg = Debug|Win32 + {3719F504-3DF0-45F8-BC7A-4415804AC7C9}.Debug|Win32.Build.0 = Debug|Win32 + {3719F504-3DF0-45F8-BC7A-4415804AC7C9}.Debug|x64.ActiveCfg = Debug|x64 + {3719F504-3DF0-45F8-BC7A-4415804AC7C9}.Debug|x64.Build.0 = Debug|x64 + {3719F504-3DF0-45F8-BC7A-4415804AC7C9}.Release_StaticCrt|Win32.ActiveCfg = Release_StaticCrt|Win32 + {3719F504-3DF0-45F8-BC7A-4415804AC7C9}.Release_StaticCrt|Win32.Build.0 = Release_StaticCrt|Win32 + {3719F504-3DF0-45F8-BC7A-4415804AC7C9}.Release_StaticCrt|x64.ActiveCfg = Release_StaticCrt|x64 + {3719F504-3DF0-45F8-BC7A-4415804AC7C9}.Release_StaticCrt|x64.Build.0 = Release_StaticCrt|x64 + {3719F504-3DF0-45F8-BC7A-4415804AC7C9}.Release|Win32.ActiveCfg = Release|Win32 + {3719F504-3DF0-45F8-BC7A-4415804AC7C9}.Release|Win32.Build.0 = Release|Win32 + {3719F504-3DF0-45F8-BC7A-4415804AC7C9}.Release|x64.ActiveCfg = Release|x64 + {3719F504-3DF0-45F8-BC7A-4415804AC7C9}.Release|x64.Build.0 = Release|x64 + {BB99EDE9-D039-4169-B26B-6BFD93C6AF8E}.Debug_StaticCrt|Win32.ActiveCfg = Debug_StaticCrt|Win32 + {BB99EDE9-D039-4169-B26B-6BFD93C6AF8E}.Debug_StaticCrt|Win32.Build.0 = Debug_StaticCrt|Win32 + {BB99EDE9-D039-4169-B26B-6BFD93C6AF8E}.Debug_StaticCrt|x64.ActiveCfg = Debug_StaticCrt|x64 + {BB99EDE9-D039-4169-B26B-6BFD93C6AF8E}.Debug_StaticCrt|x64.Build.0 = Debug_StaticCrt|x64 + {BB99EDE9-D039-4169-B26B-6BFD93C6AF8E}.Debug_VldRelease_StaticCrt|Win32.ActiveCfg = Debug(Release)_StaticCrt|Win32 + {BB99EDE9-D039-4169-B26B-6BFD93C6AF8E}.Debug_VldRelease_StaticCrt|Win32.Build.0 = Debug(Release)_StaticCrt|Win32 + {BB99EDE9-D039-4169-B26B-6BFD93C6AF8E}.Debug_VldRelease_StaticCrt|x64.ActiveCfg = Debug(Release)_StaticCrt|x64 + {BB99EDE9-D039-4169-B26B-6BFD93C6AF8E}.Debug_VldRelease_StaticCrt|x64.Build.0 = Debug(Release)_StaticCrt|x64 + {BB99EDE9-D039-4169-B26B-6BFD93C6AF8E}.Debug_VldRelease|Win32.ActiveCfg = Debug(Release)|Win32 + {BB99EDE9-D039-4169-B26B-6BFD93C6AF8E}.Debug_VldRelease|Win32.Build.0 = Debug(Release)|Win32 + {BB99EDE9-D039-4169-B26B-6BFD93C6AF8E}.Debug_VldRelease|x64.ActiveCfg = Debug(Release)|x64 + {BB99EDE9-D039-4169-B26B-6BFD93C6AF8E}.Debug_VldRelease|x64.Build.0 = Debug(Release)|x64 + {BB99EDE9-D039-4169-B26B-6BFD93C6AF8E}.Debug|Win32.ActiveCfg = Debug|Win32 + {BB99EDE9-D039-4169-B26B-6BFD93C6AF8E}.Debug|Win32.Build.0 = Debug|Win32 + {BB99EDE9-D039-4169-B26B-6BFD93C6AF8E}.Debug|x64.ActiveCfg = Debug|x64 + {BB99EDE9-D039-4169-B26B-6BFD93C6AF8E}.Debug|x64.Build.0 = Debug|x64 + {BB99EDE9-D039-4169-B26B-6BFD93C6AF8E}.Release_StaticCrt|Win32.ActiveCfg = Release_StaticCrt|Win32 + {BB99EDE9-D039-4169-B26B-6BFD93C6AF8E}.Release_StaticCrt|Win32.Build.0 = Release_StaticCrt|Win32 + {BB99EDE9-D039-4169-B26B-6BFD93C6AF8E}.Release_StaticCrt|x64.ActiveCfg = Release_StaticCrt|x64 + {BB99EDE9-D039-4169-B26B-6BFD93C6AF8E}.Release_StaticCrt|x64.Build.0 = Release_StaticCrt|x64 + {BB99EDE9-D039-4169-B26B-6BFD93C6AF8E}.Release|Win32.ActiveCfg = Release|Win32 + {BB99EDE9-D039-4169-B26B-6BFD93C6AF8E}.Release|Win32.Build.0 = Release|Win32 + {BB99EDE9-D039-4169-B26B-6BFD93C6AF8E}.Release|x64.ActiveCfg = Release|x64 + {BB99EDE9-D039-4169-B26B-6BFD93C6AF8E}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {0943354A-41E0-4215-878A-8D0FE758052C} = {9F9CFA3A-F154-4069-89E3-19BDC6BD3A7D} + {EE4A829C-5FD8-460B-8A90-B518B9BABB70} = {9F9CFA3A-F154-4069-89E3-19BDC6BD3A7D} + {3AEA2AAF-3E9B-466F-B361-560B95AD88B4} = {281D5ACB-9ED2-496B-B19E-A75F4D4DA111} + {5C25E1C8-00CB-4E0A-9BEC-952F0A6E5DCA} = {9F9CFA3A-F154-4069-89E3-19BDC6BD3A7D} + {2178E5B2-1032-441F-A664-F3D8D1FD1913} = {281D5ACB-9ED2-496B-B19E-A75F4D4DA111} + {A231973E-072A-428E-982E-5363ADD1CDE2} = {9F9CFA3A-F154-4069-89E3-19BDC6BD3A7D} + {87911ED6-84BC-4526-9654-A4FF4E0EDF52} = {9F9CFA3A-F154-4069-89E3-19BDC6BD3A7D} + {281D5ACB-9ED2-496B-B19E-A75F4D4DA111} = {9F9CFA3A-F154-4069-89E3-19BDC6BD3A7D} + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7} = {9FD1911C-3FAB-48DE-BE31-9F2C7B1EB58C} + {9FD1911C-3FAB-48DE-BE31-9F2C7B1EB58C} = {9F9CFA3A-F154-4069-89E3-19BDC6BD3A7D} + {4ADFD279-56C6-4B1D-BA9E-B815E81C1B17} = {9FD1911C-3FAB-48DE-BE31-9F2C7B1EB58C} + {8C732490-DC1A-40C0-923F-1555B9141B80} = {9F9CFA3A-F154-4069-89E3-19BDC6BD3A7D} + {A8EEDB38-1E5A-4D6E-A3E0-F15EF1F2E814} = {9F9CFA3A-F154-4069-89E3-19BDC6BD3A7D} + {50C94B05-8C3E-49ED-B2B9-5715EB624D14} = {281D5ACB-9ED2-496B-B19E-A75F4D4DA111} + {33F98E06-F44C-4E22-9E16-4C20F8238A95} = {281D5ACB-9ED2-496B-B19E-A75F4D4DA111} + {3719F504-3DF0-45F8-BC7A-4415804AC7C9} = {9F9CFA3A-F154-4069-89E3-19BDC6BD3A7D} + {BB99EDE9-D039-4169-B26B-6BFD93C6AF8E} = {9F9CFA3A-F154-4069-89E3-19BDC6BD3A7D} + EndGlobalSection +EndGlobal diff --git a/vld_vs15_wo_mfc.sln b/vld_vs15_wo_mfc.sln new file mode 100644 index 00000000..b81e7186 --- /dev/null +++ b/vld_vs15_wo_mfc.sln @@ -0,0 +1,410 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 14 +VisualStudioVersion = 14.0.24720.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vld", "src\vld.vcxproj", "{0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_basics", "src\tests\basics\basics.vcxproj", "{0943354A-41E0-4215-878A-8D0FE758052C}" + ProjectSection(ProjectDependencies) = postProject + {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE} = {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE} + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{9F9CFA3A-F154-4069-89E3-19BDC6BD3A7D}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testsuite", "src\tests\suite\testsuite.vcxproj", "{EE4A829C-5FD8-460B-8A90-B518B9BABB70}" + ProjectSection(ProjectDependencies) = postProject + {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE} = {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dynamic", "src\tests\dynamic_dll\dynamic.vcxproj", "{3AEA2AAF-3E9B-466F-B361-560B95AD88B4}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dynamic_app", "src\tests\dynamic_app\dynamic_app.vcxproj", "{5C25E1C8-00CB-4E0A-9BEC-952F0A6E5DCA}" + ProjectSection(ProjectDependencies) = postProject + {3AEA2AAF-3E9B-466F-B361-560B95AD88B4} = {3AEA2AAF-3E9B-466F-B361-560B95AD88B4} + {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE} = {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "corruption", "src\tests\corruption\corruption.vcxproj", "{87911ED6-84BC-4526-9654-A4FF4E0EDF52}" + ProjectSection(ProjectDependencies) = postProject + {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE} = {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE} + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Dlls", "Dlls", "{281D5ACB-9ED2-496B-B19E-A75F4D4DA111}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgtest", "lib\gtest\msvc\gtest.vcxproj", "{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libs", "Libs", "{9FD1911C-3FAB-48DE-BE31-9F2C7B1EB58C}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libformat", "lib\cppformat\format.vcxproj", "{4ADFD279-56C6-4B1D-BA9E-B815E81C1B17}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vld_main", "src\tests\vld_main\vld_main_vs15.vcxproj", "{8C732490-DC1A-40C0-923F-1555B9141B80}" + ProjectSection(ProjectDependencies) = postProject + {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE} = {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vld_unload", "src\tests\vld_unload\vld_unload_vs15.vcxproj", "{A8EEDB38-1E5A-4D6E-A3E0-F15EF1F2E814}" + ProjectSection(ProjectDependencies) = postProject + {50C94B05-8C3E-49ED-B2B9-5715EB624D14} = {50C94B05-8C3E-49ED-B2B9-5715EB624D14} + {33F98E06-F44C-4E22-9E16-4C20F8238A95} = {33F98E06-F44C-4E22-9E16-4C20F8238A95} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vld_dll1", "src\tests\vld_dll1\vld_dll1_vs15.vcxproj", "{50C94B05-8C3E-49ED-B2B9-5715EB624D14}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vld_dll2", "src\tests\vld_dll2\vld_dll2_vs15.vcxproj", "{33F98E06-F44C-4E22-9E16-4C20F8238A95}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vld_main_test", "src\tests\vld_main_test\vld_main_test_vs15.vcxproj", "{BB99EDE9-D039-4169-B26B-6BFD93C6AF8E}" + ProjectSection(ProjectDependencies) = postProject + {8C732490-DC1A-40C0-923F-1555B9141B80} = {8C732490-DC1A-40C0-923F-1555B9141B80} + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug_StaticCrt|Win32 = Debug_StaticCrt|Win32 + Debug_StaticCrt|x64 = Debug_StaticCrt|x64 + Debug_VldRelease_StaticCrt|Win32 = Debug_VldRelease_StaticCrt|Win32 + Debug_VldRelease_StaticCrt|x64 = Debug_VldRelease_StaticCrt|x64 + Debug_VldRelease|Win32 = Debug_VldRelease|Win32 + Debug_VldRelease|x64 = Debug_VldRelease|x64 + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release_StaticCrt|Win32 = Release_StaticCrt|Win32 + Release_StaticCrt|x64 = Release_StaticCrt|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE}.Debug_StaticCrt|Win32.ActiveCfg = Debug|Win32 + {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE}.Debug_StaticCrt|Win32.Build.0 = Debug|Win32 + {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE}.Debug_StaticCrt|x64.ActiveCfg = Debug|x64 + {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE}.Debug_StaticCrt|x64.Build.0 = Debug|x64 + {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE}.Debug_VldRelease_StaticCrt|Win32.ActiveCfg = Release|Win32 + {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE}.Debug_VldRelease_StaticCrt|Win32.Build.0 = Release|Win32 + {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE}.Debug_VldRelease_StaticCrt|x64.ActiveCfg = Release|x64 + {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE}.Debug_VldRelease_StaticCrt|x64.Build.0 = Release|x64 + {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE}.Debug_VldRelease|Win32.ActiveCfg = Release|Win32 + {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE}.Debug_VldRelease|Win32.Build.0 = Release|Win32 + {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE}.Debug_VldRelease|x64.ActiveCfg = Release|x64 + {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE}.Debug_VldRelease|x64.Build.0 = Release|x64 + {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE}.Debug|Win32.ActiveCfg = Debug|Win32 + {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE}.Debug|Win32.Build.0 = Debug|Win32 + {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE}.Debug|x64.ActiveCfg = Debug|x64 + {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE}.Debug|x64.Build.0 = Debug|x64 + {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE}.Release_StaticCrt|Win32.ActiveCfg = Release|Win32 + {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE}.Release_StaticCrt|Win32.Build.0 = Release|Win32 + {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE}.Release_StaticCrt|x64.ActiveCfg = Release|x64 + {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE}.Release_StaticCrt|x64.Build.0 = Release|x64 + {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE}.Release|Win32.ActiveCfg = Release|Win32 + {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE}.Release|Win32.Build.0 = Release|Win32 + {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE}.Release|x64.ActiveCfg = Release|x64 + {0D30FFCB-45DA-4D2B-8E3C-81BC145BF2DE}.Release|x64.Build.0 = Release|x64 + {0943354A-41E0-4215-878A-8D0FE758052C}.Debug_StaticCrt|Win32.ActiveCfg = Debug_StaticCrt|Win32 + {0943354A-41E0-4215-878A-8D0FE758052C}.Debug_StaticCrt|Win32.Build.0 = Debug_StaticCrt|Win32 + {0943354A-41E0-4215-878A-8D0FE758052C}.Debug_StaticCrt|x64.ActiveCfg = Debug_StaticCrt|x64 + {0943354A-41E0-4215-878A-8D0FE758052C}.Debug_StaticCrt|x64.Build.0 = Debug_StaticCrt|x64 + {0943354A-41E0-4215-878A-8D0FE758052C}.Debug_VldRelease_StaticCrt|Win32.ActiveCfg = Debug(Release)_StaticCrt|Win32 + {0943354A-41E0-4215-878A-8D0FE758052C}.Debug_VldRelease_StaticCrt|Win32.Build.0 = Debug(Release)_StaticCrt|Win32 + {0943354A-41E0-4215-878A-8D0FE758052C}.Debug_VldRelease_StaticCrt|x64.ActiveCfg = Debug(Release)_StaticCrt|x64 + {0943354A-41E0-4215-878A-8D0FE758052C}.Debug_VldRelease_StaticCrt|x64.Build.0 = Debug(Release)_StaticCrt|x64 + {0943354A-41E0-4215-878A-8D0FE758052C}.Debug_VldRelease|Win32.ActiveCfg = Debug(Release)|Win32 + {0943354A-41E0-4215-878A-8D0FE758052C}.Debug_VldRelease|Win32.Build.0 = Debug(Release)|Win32 + {0943354A-41E0-4215-878A-8D0FE758052C}.Debug_VldRelease|x64.ActiveCfg = Debug(Release)|x64 + {0943354A-41E0-4215-878A-8D0FE758052C}.Debug_VldRelease|x64.Build.0 = Debug(Release)|x64 + {0943354A-41E0-4215-878A-8D0FE758052C}.Debug|Win32.ActiveCfg = Debug|Win32 + {0943354A-41E0-4215-878A-8D0FE758052C}.Debug|Win32.Build.0 = Debug|Win32 + {0943354A-41E0-4215-878A-8D0FE758052C}.Debug|x64.ActiveCfg = Debug|x64 + {0943354A-41E0-4215-878A-8D0FE758052C}.Debug|x64.Build.0 = Debug|x64 + {0943354A-41E0-4215-878A-8D0FE758052C}.Release_StaticCrt|Win32.ActiveCfg = Release_StaticCrt|Win32 + {0943354A-41E0-4215-878A-8D0FE758052C}.Release_StaticCrt|Win32.Build.0 = Release_StaticCrt|Win32 + {0943354A-41E0-4215-878A-8D0FE758052C}.Release_StaticCrt|x64.ActiveCfg = Release_StaticCrt|x64 + {0943354A-41E0-4215-878A-8D0FE758052C}.Release_StaticCrt|x64.Build.0 = Release_StaticCrt|x64 + {0943354A-41E0-4215-878A-8D0FE758052C}.Release|Win32.ActiveCfg = Release|Win32 + {0943354A-41E0-4215-878A-8D0FE758052C}.Release|Win32.Build.0 = Release|Win32 + {0943354A-41E0-4215-878A-8D0FE758052C}.Release|x64.ActiveCfg = Release|x64 + {0943354A-41E0-4215-878A-8D0FE758052C}.Release|x64.Build.0 = Release|x64 + {EE4A829C-5FD8-460B-8A90-B518B9BABB70}.Debug_StaticCrt|Win32.ActiveCfg = Debug_StaticCrt|Win32 + {EE4A829C-5FD8-460B-8A90-B518B9BABB70}.Debug_StaticCrt|Win32.Build.0 = Debug_StaticCrt|Win32 + {EE4A829C-5FD8-460B-8A90-B518B9BABB70}.Debug_StaticCrt|x64.ActiveCfg = Debug_StaticCrt|x64 + {EE4A829C-5FD8-460B-8A90-B518B9BABB70}.Debug_StaticCrt|x64.Build.0 = Debug_StaticCrt|x64 + {EE4A829C-5FD8-460B-8A90-B518B9BABB70}.Debug_StaticCrt|x64.Deploy.0 = Debug_StaticCrt|x64 + {EE4A829C-5FD8-460B-8A90-B518B9BABB70}.Debug_VldRelease_StaticCrt|Win32.ActiveCfg = Debug(Release)_StaticCrt|Win32 + {EE4A829C-5FD8-460B-8A90-B518B9BABB70}.Debug_VldRelease_StaticCrt|Win32.Build.0 = Debug(Release)_StaticCrt|Win32 + {EE4A829C-5FD8-460B-8A90-B518B9BABB70}.Debug_VldRelease_StaticCrt|x64.ActiveCfg = Debug(Release)_StaticCrt|x64 + {EE4A829C-5FD8-460B-8A90-B518B9BABB70}.Debug_VldRelease_StaticCrt|x64.Build.0 = Debug(Release)_StaticCrt|x64 + {EE4A829C-5FD8-460B-8A90-B518B9BABB70}.Debug_VldRelease|Win32.ActiveCfg = Debug(Release)|Win32 + {EE4A829C-5FD8-460B-8A90-B518B9BABB70}.Debug_VldRelease|Win32.Build.0 = Debug(Release)|Win32 + {EE4A829C-5FD8-460B-8A90-B518B9BABB70}.Debug_VldRelease|x64.ActiveCfg = Debug(Release)|x64 + {EE4A829C-5FD8-460B-8A90-B518B9BABB70}.Debug_VldRelease|x64.Build.0 = Debug(Release)|x64 + {EE4A829C-5FD8-460B-8A90-B518B9BABB70}.Debug|Win32.ActiveCfg = Debug|Win32 + {EE4A829C-5FD8-460B-8A90-B518B9BABB70}.Debug|Win32.Build.0 = Debug|Win32 + {EE4A829C-5FD8-460B-8A90-B518B9BABB70}.Debug|x64.ActiveCfg = Debug|x64 + {EE4A829C-5FD8-460B-8A90-B518B9BABB70}.Debug|x64.Build.0 = Debug|x64 + {EE4A829C-5FD8-460B-8A90-B518B9BABB70}.Release_StaticCrt|Win32.ActiveCfg = Release_StaticCrt|Win32 + {EE4A829C-5FD8-460B-8A90-B518B9BABB70}.Release_StaticCrt|Win32.Build.0 = Release_StaticCrt|Win32 + {EE4A829C-5FD8-460B-8A90-B518B9BABB70}.Release_StaticCrt|x64.ActiveCfg = Release_StaticCrt|x64 + {EE4A829C-5FD8-460B-8A90-B518B9BABB70}.Release_StaticCrt|x64.Build.0 = Release_StaticCrt|x64 + {EE4A829C-5FD8-460B-8A90-B518B9BABB70}.Release|Win32.ActiveCfg = Release|Win32 + {EE4A829C-5FD8-460B-8A90-B518B9BABB70}.Release|Win32.Build.0 = Release|Win32 + {EE4A829C-5FD8-460B-8A90-B518B9BABB70}.Release|x64.ActiveCfg = Release|x64 + {EE4A829C-5FD8-460B-8A90-B518B9BABB70}.Release|x64.Build.0 = Release|x64 + {3AEA2AAF-3E9B-466F-B361-560B95AD88B4}.Debug_StaticCrt|Win32.ActiveCfg = Debug_StaticCrt|Win32 + {3AEA2AAF-3E9B-466F-B361-560B95AD88B4}.Debug_StaticCrt|Win32.Build.0 = Debug_StaticCrt|Win32 + {3AEA2AAF-3E9B-466F-B361-560B95AD88B4}.Debug_StaticCrt|x64.ActiveCfg = Debug_StaticCrt|x64 + {3AEA2AAF-3E9B-466F-B361-560B95AD88B4}.Debug_StaticCrt|x64.Build.0 = Debug_StaticCrt|x64 + {3AEA2AAF-3E9B-466F-B361-560B95AD88B4}.Debug_VldRelease_StaticCrt|Win32.ActiveCfg = Debug(Release)_StaticCrt|Win32 + {3AEA2AAF-3E9B-466F-B361-560B95AD88B4}.Debug_VldRelease_StaticCrt|Win32.Build.0 = Debug(Release)_StaticCrt|Win32 + {3AEA2AAF-3E9B-466F-B361-560B95AD88B4}.Debug_VldRelease_StaticCrt|x64.ActiveCfg = Debug(Release)_StaticCrt|x64 + {3AEA2AAF-3E9B-466F-B361-560B95AD88B4}.Debug_VldRelease_StaticCrt|x64.Build.0 = Debug(Release)_StaticCrt|x64 + {3AEA2AAF-3E9B-466F-B361-560B95AD88B4}.Debug_VldRelease|Win32.ActiveCfg = Debug(Release)|Win32 + {3AEA2AAF-3E9B-466F-B361-560B95AD88B4}.Debug_VldRelease|Win32.Build.0 = Debug(Release)|Win32 + {3AEA2AAF-3E9B-466F-B361-560B95AD88B4}.Debug_VldRelease|x64.ActiveCfg = Debug(Release)|x64 + {3AEA2AAF-3E9B-466F-B361-560B95AD88B4}.Debug_VldRelease|x64.Build.0 = Debug(Release)|x64 + {3AEA2AAF-3E9B-466F-B361-560B95AD88B4}.Debug|Win32.ActiveCfg = Debug|Win32 + {3AEA2AAF-3E9B-466F-B361-560B95AD88B4}.Debug|Win32.Build.0 = Debug|Win32 + {3AEA2AAF-3E9B-466F-B361-560B95AD88B4}.Debug|x64.ActiveCfg = Debug|x64 + {3AEA2AAF-3E9B-466F-B361-560B95AD88B4}.Debug|x64.Build.0 = Debug|x64 + {3AEA2AAF-3E9B-466F-B361-560B95AD88B4}.Release_StaticCrt|Win32.ActiveCfg = Release_StaticCrt|Win32 + {3AEA2AAF-3E9B-466F-B361-560B95AD88B4}.Release_StaticCrt|Win32.Build.0 = Release_StaticCrt|Win32 + {3AEA2AAF-3E9B-466F-B361-560B95AD88B4}.Release_StaticCrt|x64.ActiveCfg = Release_StaticCrt|x64 + {3AEA2AAF-3E9B-466F-B361-560B95AD88B4}.Release_StaticCrt|x64.Build.0 = Release_StaticCrt|x64 + {3AEA2AAF-3E9B-466F-B361-560B95AD88B4}.Release|Win32.ActiveCfg = Release|Win32 + {3AEA2AAF-3E9B-466F-B361-560B95AD88B4}.Release|Win32.Build.0 = Release|Win32 + {3AEA2AAF-3E9B-466F-B361-560B95AD88B4}.Release|x64.ActiveCfg = Release|x64 + {3AEA2AAF-3E9B-466F-B361-560B95AD88B4}.Release|x64.Build.0 = Release|x64 + {5C25E1C8-00CB-4E0A-9BEC-952F0A6E5DCA}.Debug_StaticCrt|Win32.ActiveCfg = Debug_StaticCrt|Win32 + {5C25E1C8-00CB-4E0A-9BEC-952F0A6E5DCA}.Debug_StaticCrt|Win32.Build.0 = Debug_StaticCrt|Win32 + {5C25E1C8-00CB-4E0A-9BEC-952F0A6E5DCA}.Debug_StaticCrt|x64.ActiveCfg = Debug_StaticCrt|x64 + {5C25E1C8-00CB-4E0A-9BEC-952F0A6E5DCA}.Debug_StaticCrt|x64.Build.0 = Debug_StaticCrt|x64 + {5C25E1C8-00CB-4E0A-9BEC-952F0A6E5DCA}.Debug_VldRelease_StaticCrt|Win32.ActiveCfg = Debug(Release)_StaticCrt|Win32 + {5C25E1C8-00CB-4E0A-9BEC-952F0A6E5DCA}.Debug_VldRelease_StaticCrt|Win32.Build.0 = Debug(Release)_StaticCrt|Win32 + {5C25E1C8-00CB-4E0A-9BEC-952F0A6E5DCA}.Debug_VldRelease_StaticCrt|x64.ActiveCfg = Debug(Release)_StaticCrt|x64 + {5C25E1C8-00CB-4E0A-9BEC-952F0A6E5DCA}.Debug_VldRelease_StaticCrt|x64.Build.0 = Debug(Release)_StaticCrt|x64 + {5C25E1C8-00CB-4E0A-9BEC-952F0A6E5DCA}.Debug_VldRelease|Win32.ActiveCfg = Debug(Release)|Win32 + {5C25E1C8-00CB-4E0A-9BEC-952F0A6E5DCA}.Debug_VldRelease|Win32.Build.0 = Debug(Release)|Win32 + {5C25E1C8-00CB-4E0A-9BEC-952F0A6E5DCA}.Debug_VldRelease|x64.ActiveCfg = Debug(Release)|x64 + {5C25E1C8-00CB-4E0A-9BEC-952F0A6E5DCA}.Debug_VldRelease|x64.Build.0 = Debug(Release)|x64 + {5C25E1C8-00CB-4E0A-9BEC-952F0A6E5DCA}.Debug|Win32.ActiveCfg = Debug|Win32 + {5C25E1C8-00CB-4E0A-9BEC-952F0A6E5DCA}.Debug|Win32.Build.0 = Debug|Win32 + {5C25E1C8-00CB-4E0A-9BEC-952F0A6E5DCA}.Debug|x64.ActiveCfg = Debug|x64 + {5C25E1C8-00CB-4E0A-9BEC-952F0A6E5DCA}.Debug|x64.Build.0 = Debug|x64 + {5C25E1C8-00CB-4E0A-9BEC-952F0A6E5DCA}.Release_StaticCrt|Win32.ActiveCfg = Release_StaticCrt|Win32 + {5C25E1C8-00CB-4E0A-9BEC-952F0A6E5DCA}.Release_StaticCrt|Win32.Build.0 = Release_StaticCrt|Win32 + {5C25E1C8-00CB-4E0A-9BEC-952F0A6E5DCA}.Release_StaticCrt|x64.ActiveCfg = Release_StaticCrt|x64 + {5C25E1C8-00CB-4E0A-9BEC-952F0A6E5DCA}.Release_StaticCrt|x64.Build.0 = Release_StaticCrt|x64 + {5C25E1C8-00CB-4E0A-9BEC-952F0A6E5DCA}.Release|Win32.ActiveCfg = Release|Win32 + {5C25E1C8-00CB-4E0A-9BEC-952F0A6E5DCA}.Release|Win32.Build.0 = Release|Win32 + {5C25E1C8-00CB-4E0A-9BEC-952F0A6E5DCA}.Release|x64.ActiveCfg = Release|x64 + {5C25E1C8-00CB-4E0A-9BEC-952F0A6E5DCA}.Release|x64.Build.0 = Release|x64 + {87911ED6-84BC-4526-9654-A4FF4E0EDF52}.Debug_StaticCrt|Win32.ActiveCfg = Debug_StaticCrt|Win32 + {87911ED6-84BC-4526-9654-A4FF4E0EDF52}.Debug_StaticCrt|Win32.Build.0 = Debug_StaticCrt|Win32 + {87911ED6-84BC-4526-9654-A4FF4E0EDF52}.Debug_StaticCrt|x64.ActiveCfg = Debug_StaticCrt|x64 + {87911ED6-84BC-4526-9654-A4FF4E0EDF52}.Debug_StaticCrt|x64.Build.0 = Debug_StaticCrt|x64 + {87911ED6-84BC-4526-9654-A4FF4E0EDF52}.Debug_VldRelease_StaticCrt|Win32.ActiveCfg = Debug(Release)_StaticCrt|Win32 + {87911ED6-84BC-4526-9654-A4FF4E0EDF52}.Debug_VldRelease_StaticCrt|Win32.Build.0 = Debug(Release)_StaticCrt|Win32 + {87911ED6-84BC-4526-9654-A4FF4E0EDF52}.Debug_VldRelease_StaticCrt|x64.ActiveCfg = Debug(Release)_StaticCrt|x64 + {87911ED6-84BC-4526-9654-A4FF4E0EDF52}.Debug_VldRelease_StaticCrt|x64.Build.0 = Debug(Release)_StaticCrt|x64 + {87911ED6-84BC-4526-9654-A4FF4E0EDF52}.Debug_VldRelease|Win32.ActiveCfg = Debug(Release)|Win32 + {87911ED6-84BC-4526-9654-A4FF4E0EDF52}.Debug_VldRelease|Win32.Build.0 = Debug(Release)|Win32 + {87911ED6-84BC-4526-9654-A4FF4E0EDF52}.Debug_VldRelease|x64.ActiveCfg = Debug(Release)|x64 + {87911ED6-84BC-4526-9654-A4FF4E0EDF52}.Debug_VldRelease|x64.Build.0 = Debug(Release)|x64 + {87911ED6-84BC-4526-9654-A4FF4E0EDF52}.Debug|Win32.ActiveCfg = Debug|Win32 + {87911ED6-84BC-4526-9654-A4FF4E0EDF52}.Debug|Win32.Build.0 = Debug|Win32 + {87911ED6-84BC-4526-9654-A4FF4E0EDF52}.Debug|x64.ActiveCfg = Debug|x64 + {87911ED6-84BC-4526-9654-A4FF4E0EDF52}.Debug|x64.Build.0 = Debug|x64 + {87911ED6-84BC-4526-9654-A4FF4E0EDF52}.Release_StaticCrt|Win32.ActiveCfg = Release_StaticCrt|Win32 + {87911ED6-84BC-4526-9654-A4FF4E0EDF52}.Release_StaticCrt|Win32.Build.0 = Release_StaticCrt|Win32 + {87911ED6-84BC-4526-9654-A4FF4E0EDF52}.Release_StaticCrt|x64.ActiveCfg = Release_StaticCrt|x64 + {87911ED6-84BC-4526-9654-A4FF4E0EDF52}.Release_StaticCrt|x64.Build.0 = Release_StaticCrt|x64 + {87911ED6-84BC-4526-9654-A4FF4E0EDF52}.Release|Win32.ActiveCfg = Release|Win32 + {87911ED6-84BC-4526-9654-A4FF4E0EDF52}.Release|Win32.Build.0 = Release|Win32 + {87911ED6-84BC-4526-9654-A4FF4E0EDF52}.Release|x64.ActiveCfg = Release|x64 + {87911ED6-84BC-4526-9654-A4FF4E0EDF52}.Release|x64.Build.0 = Release|x64 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug_StaticCrt|Win32.ActiveCfg = Debug_StaticCrt|Win32 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug_StaticCrt|Win32.Build.0 = Debug_StaticCrt|Win32 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug_StaticCrt|x64.ActiveCfg = Debug_StaticCrt|x64 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug_StaticCrt|x64.Build.0 = Debug_StaticCrt|x64 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug_VldRelease_StaticCrt|Win32.ActiveCfg = Debug_StaticCrt|Win32 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug_VldRelease_StaticCrt|Win32.Build.0 = Debug_StaticCrt|Win32 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug_VldRelease_StaticCrt|x64.ActiveCfg = Debug_StaticCrt|x64 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug_VldRelease_StaticCrt|x64.Build.0 = Debug_StaticCrt|x64 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug_VldRelease|Win32.ActiveCfg = Debug|Win32 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug_VldRelease|Win32.Build.0 = Debug|Win32 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug_VldRelease|x64.ActiveCfg = Debug|x64 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug_VldRelease|x64.Build.0 = Debug|x64 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug|Win32.ActiveCfg = Debug|Win32 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug|Win32.Build.0 = Debug|Win32 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug|x64.ActiveCfg = Debug|x64 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug|x64.Build.0 = Debug|x64 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release_StaticCrt|Win32.ActiveCfg = Release_StaticCrt|Win32 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release_StaticCrt|Win32.Build.0 = Release_StaticCrt|Win32 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release_StaticCrt|x64.ActiveCfg = Release_StaticCrt|x64 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release_StaticCrt|x64.Build.0 = Release_StaticCrt|x64 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release|Win32.ActiveCfg = Release|Win32 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release|Win32.Build.0 = Release|Win32 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release|x64.ActiveCfg = Release|x64 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release|x64.Build.0 = Release|x64 + {4ADFD279-56C6-4B1D-BA9E-B815E81C1B17}.Debug_StaticCrt|Win32.ActiveCfg = Debug|Win32 + {4ADFD279-56C6-4B1D-BA9E-B815E81C1B17}.Debug_StaticCrt|Win32.Build.0 = Debug|Win32 + {4ADFD279-56C6-4B1D-BA9E-B815E81C1B17}.Debug_StaticCrt|x64.ActiveCfg = Debug|x64 + {4ADFD279-56C6-4B1D-BA9E-B815E81C1B17}.Debug_StaticCrt|x64.Build.0 = Debug|x64 + {4ADFD279-56C6-4B1D-BA9E-B815E81C1B17}.Debug_VldRelease_StaticCrt|Win32.ActiveCfg = Release|Win32 + {4ADFD279-56C6-4B1D-BA9E-B815E81C1B17}.Debug_VldRelease_StaticCrt|Win32.Build.0 = Release|Win32 + {4ADFD279-56C6-4B1D-BA9E-B815E81C1B17}.Debug_VldRelease_StaticCrt|x64.ActiveCfg = Release|x64 + {4ADFD279-56C6-4B1D-BA9E-B815E81C1B17}.Debug_VldRelease_StaticCrt|x64.Build.0 = Release|x64 + {4ADFD279-56C6-4B1D-BA9E-B815E81C1B17}.Debug_VldRelease|Win32.ActiveCfg = Release|Win32 + {4ADFD279-56C6-4B1D-BA9E-B815E81C1B17}.Debug_VldRelease|Win32.Build.0 = Release|Win32 + {4ADFD279-56C6-4B1D-BA9E-B815E81C1B17}.Debug_VldRelease|x64.ActiveCfg = Release|x64 + {4ADFD279-56C6-4B1D-BA9E-B815E81C1B17}.Debug_VldRelease|x64.Build.0 = Release|x64 + {4ADFD279-56C6-4B1D-BA9E-B815E81C1B17}.Debug|Win32.ActiveCfg = Debug|Win32 + {4ADFD279-56C6-4B1D-BA9E-B815E81C1B17}.Debug|Win32.Build.0 = Debug|Win32 + {4ADFD279-56C6-4B1D-BA9E-B815E81C1B17}.Debug|x64.ActiveCfg = Debug|x64 + {4ADFD279-56C6-4B1D-BA9E-B815E81C1B17}.Debug|x64.Build.0 = Debug|x64 + {4ADFD279-56C6-4B1D-BA9E-B815E81C1B17}.Release_StaticCrt|Win32.ActiveCfg = Release|Win32 + {4ADFD279-56C6-4B1D-BA9E-B815E81C1B17}.Release_StaticCrt|Win32.Build.0 = Release|Win32 + {4ADFD279-56C6-4B1D-BA9E-B815E81C1B17}.Release_StaticCrt|x64.ActiveCfg = Release|x64 + {4ADFD279-56C6-4B1D-BA9E-B815E81C1B17}.Release_StaticCrt|x64.Build.0 = Release|x64 + {4ADFD279-56C6-4B1D-BA9E-B815E81C1B17}.Release|Win32.ActiveCfg = Release|Win32 + {4ADFD279-56C6-4B1D-BA9E-B815E81C1B17}.Release|Win32.Build.0 = Release|Win32 + {4ADFD279-56C6-4B1D-BA9E-B815E81C1B17}.Release|x64.ActiveCfg = Release|x64 + {4ADFD279-56C6-4B1D-BA9E-B815E81C1B17}.Release|x64.Build.0 = Release|x64 + {8C732490-DC1A-40C0-923F-1555B9141B80}.Debug_StaticCrt|Win32.ActiveCfg = Debug_StaticCrt|Win32 + {8C732490-DC1A-40C0-923F-1555B9141B80}.Debug_StaticCrt|Win32.Build.0 = Debug_StaticCrt|Win32 + {8C732490-DC1A-40C0-923F-1555B9141B80}.Debug_StaticCrt|x64.ActiveCfg = Debug_StaticCrt|x64 + {8C732490-DC1A-40C0-923F-1555B9141B80}.Debug_StaticCrt|x64.Build.0 = Debug_StaticCrt|x64 + {8C732490-DC1A-40C0-923F-1555B9141B80}.Debug_VldRelease_StaticCrt|Win32.ActiveCfg = Debug(Release)_StaticCrt|Win32 + {8C732490-DC1A-40C0-923F-1555B9141B80}.Debug_VldRelease_StaticCrt|Win32.Build.0 = Debug(Release)_StaticCrt|Win32 + {8C732490-DC1A-40C0-923F-1555B9141B80}.Debug_VldRelease_StaticCrt|x64.ActiveCfg = Debug(Release)_StaticCrt|x64 + {8C732490-DC1A-40C0-923F-1555B9141B80}.Debug_VldRelease_StaticCrt|x64.Build.0 = Debug(Release)_StaticCrt|x64 + {8C732490-DC1A-40C0-923F-1555B9141B80}.Debug_VldRelease|Win32.ActiveCfg = Debug(Release)|Win32 + {8C732490-DC1A-40C0-923F-1555B9141B80}.Debug_VldRelease|Win32.Build.0 = Debug(Release)|Win32 + {8C732490-DC1A-40C0-923F-1555B9141B80}.Debug_VldRelease|x64.ActiveCfg = Debug(Release)|x64 + {8C732490-DC1A-40C0-923F-1555B9141B80}.Debug_VldRelease|x64.Build.0 = Debug(Release)|x64 + {8C732490-DC1A-40C0-923F-1555B9141B80}.Debug|Win32.ActiveCfg = Debug|Win32 + {8C732490-DC1A-40C0-923F-1555B9141B80}.Debug|Win32.Build.0 = Debug|Win32 + {8C732490-DC1A-40C0-923F-1555B9141B80}.Debug|x64.ActiveCfg = Debug|x64 + {8C732490-DC1A-40C0-923F-1555B9141B80}.Debug|x64.Build.0 = Debug|x64 + {8C732490-DC1A-40C0-923F-1555B9141B80}.Release_StaticCrt|Win32.ActiveCfg = Release_StaticCrt|Win32 + {8C732490-DC1A-40C0-923F-1555B9141B80}.Release_StaticCrt|Win32.Build.0 = Release_StaticCrt|Win32 + {8C732490-DC1A-40C0-923F-1555B9141B80}.Release_StaticCrt|x64.ActiveCfg = Release_StaticCrt|x64 + {8C732490-DC1A-40C0-923F-1555B9141B80}.Release_StaticCrt|x64.Build.0 = Release_StaticCrt|x64 + {8C732490-DC1A-40C0-923F-1555B9141B80}.Release|Win32.ActiveCfg = Release|Win32 + {8C732490-DC1A-40C0-923F-1555B9141B80}.Release|Win32.Build.0 = Release|Win32 + {8C732490-DC1A-40C0-923F-1555B9141B80}.Release|x64.ActiveCfg = Release|x64 + {8C732490-DC1A-40C0-923F-1555B9141B80}.Release|x64.Build.0 = Release|x64 + {A8EEDB38-1E5A-4D6E-A3E0-F15EF1F2E814}.Debug_StaticCrt|Win32.ActiveCfg = Debug_StaticCrt|Win32 + {A8EEDB38-1E5A-4D6E-A3E0-F15EF1F2E814}.Debug_StaticCrt|Win32.Build.0 = Debug_StaticCrt|Win32 + {A8EEDB38-1E5A-4D6E-A3E0-F15EF1F2E814}.Debug_StaticCrt|x64.ActiveCfg = Debug_StaticCrt|x64 + {A8EEDB38-1E5A-4D6E-A3E0-F15EF1F2E814}.Debug_StaticCrt|x64.Build.0 = Debug_StaticCrt|x64 + {A8EEDB38-1E5A-4D6E-A3E0-F15EF1F2E814}.Debug_VldRelease_StaticCrt|Win32.ActiveCfg = Debug(Release)_StaticCrt|Win32 + {A8EEDB38-1E5A-4D6E-A3E0-F15EF1F2E814}.Debug_VldRelease_StaticCrt|Win32.Build.0 = Debug(Release)_StaticCrt|Win32 + {A8EEDB38-1E5A-4D6E-A3E0-F15EF1F2E814}.Debug_VldRelease_StaticCrt|x64.ActiveCfg = Debug(Release)_StaticCrt|x64 + {A8EEDB38-1E5A-4D6E-A3E0-F15EF1F2E814}.Debug_VldRelease_StaticCrt|x64.Build.0 = Debug(Release)_StaticCrt|x64 + {A8EEDB38-1E5A-4D6E-A3E0-F15EF1F2E814}.Debug_VldRelease|Win32.ActiveCfg = Debug(Release)|Win32 + {A8EEDB38-1E5A-4D6E-A3E0-F15EF1F2E814}.Debug_VldRelease|Win32.Build.0 = Debug(Release)|Win32 + {A8EEDB38-1E5A-4D6E-A3E0-F15EF1F2E814}.Debug_VldRelease|x64.ActiveCfg = Debug(Release)|x64 + {A8EEDB38-1E5A-4D6E-A3E0-F15EF1F2E814}.Debug_VldRelease|x64.Build.0 = Debug(Release)|x64 + {A8EEDB38-1E5A-4D6E-A3E0-F15EF1F2E814}.Debug|Win32.ActiveCfg = Debug|Win32 + {A8EEDB38-1E5A-4D6E-A3E0-F15EF1F2E814}.Debug|Win32.Build.0 = Debug|Win32 + {A8EEDB38-1E5A-4D6E-A3E0-F15EF1F2E814}.Debug|x64.ActiveCfg = Debug|x64 + {A8EEDB38-1E5A-4D6E-A3E0-F15EF1F2E814}.Debug|x64.Build.0 = Debug|x64 + {A8EEDB38-1E5A-4D6E-A3E0-F15EF1F2E814}.Release_StaticCrt|Win32.ActiveCfg = Release_StaticCrt|Win32 + {A8EEDB38-1E5A-4D6E-A3E0-F15EF1F2E814}.Release_StaticCrt|Win32.Build.0 = Release_StaticCrt|Win32 + {A8EEDB38-1E5A-4D6E-A3E0-F15EF1F2E814}.Release_StaticCrt|x64.ActiveCfg = Release_StaticCrt|x64 + {A8EEDB38-1E5A-4D6E-A3E0-F15EF1F2E814}.Release_StaticCrt|x64.Build.0 = Release_StaticCrt|x64 + {A8EEDB38-1E5A-4D6E-A3E0-F15EF1F2E814}.Release|Win32.ActiveCfg = Release|Win32 + {A8EEDB38-1E5A-4D6E-A3E0-F15EF1F2E814}.Release|Win32.Build.0 = Release|Win32 + {A8EEDB38-1E5A-4D6E-A3E0-F15EF1F2E814}.Release|x64.ActiveCfg = Release|x64 + {A8EEDB38-1E5A-4D6E-A3E0-F15EF1F2E814}.Release|x64.Build.0 = Release|x64 + {50C94B05-8C3E-49ED-B2B9-5715EB624D14}.Debug_StaticCrt|Win32.ActiveCfg = Debug_StaticCrt|Win32 + {50C94B05-8C3E-49ED-B2B9-5715EB624D14}.Debug_StaticCrt|Win32.Build.0 = Debug_StaticCrt|Win32 + {50C94B05-8C3E-49ED-B2B9-5715EB624D14}.Debug_StaticCrt|x64.ActiveCfg = Debug_StaticCrt|x64 + {50C94B05-8C3E-49ED-B2B9-5715EB624D14}.Debug_StaticCrt|x64.Build.0 = Debug_StaticCrt|x64 + {50C94B05-8C3E-49ED-B2B9-5715EB624D14}.Debug_VldRelease_StaticCrt|Win32.ActiveCfg = Debug(Release)_StaticCrt|Win32 + {50C94B05-8C3E-49ED-B2B9-5715EB624D14}.Debug_VldRelease_StaticCrt|Win32.Build.0 = Debug(Release)_StaticCrt|Win32 + {50C94B05-8C3E-49ED-B2B9-5715EB624D14}.Debug_VldRelease_StaticCrt|x64.ActiveCfg = Debug(Release)_StaticCrt|x64 + {50C94B05-8C3E-49ED-B2B9-5715EB624D14}.Debug_VldRelease_StaticCrt|x64.Build.0 = Debug(Release)_StaticCrt|x64 + {50C94B05-8C3E-49ED-B2B9-5715EB624D14}.Debug_VldRelease|Win32.ActiveCfg = Debug(Release)|Win32 + {50C94B05-8C3E-49ED-B2B9-5715EB624D14}.Debug_VldRelease|Win32.Build.0 = Debug(Release)|Win32 + {50C94B05-8C3E-49ED-B2B9-5715EB624D14}.Debug_VldRelease|x64.ActiveCfg = Debug(Release)|x64 + {50C94B05-8C3E-49ED-B2B9-5715EB624D14}.Debug_VldRelease|x64.Build.0 = Debug(Release)|x64 + {50C94B05-8C3E-49ED-B2B9-5715EB624D14}.Debug|Win32.ActiveCfg = Debug|Win32 + {50C94B05-8C3E-49ED-B2B9-5715EB624D14}.Debug|Win32.Build.0 = Debug|Win32 + {50C94B05-8C3E-49ED-B2B9-5715EB624D14}.Debug|x64.ActiveCfg = Debug|x64 + {50C94B05-8C3E-49ED-B2B9-5715EB624D14}.Debug|x64.Build.0 = Debug|x64 + {50C94B05-8C3E-49ED-B2B9-5715EB624D14}.Release_StaticCrt|Win32.ActiveCfg = Release_StaticCrt|Win32 + {50C94B05-8C3E-49ED-B2B9-5715EB624D14}.Release_StaticCrt|Win32.Build.0 = Release_StaticCrt|Win32 + {50C94B05-8C3E-49ED-B2B9-5715EB624D14}.Release_StaticCrt|x64.ActiveCfg = Release_StaticCrt|x64 + {50C94B05-8C3E-49ED-B2B9-5715EB624D14}.Release_StaticCrt|x64.Build.0 = Release_StaticCrt|x64 + {50C94B05-8C3E-49ED-B2B9-5715EB624D14}.Release|Win32.ActiveCfg = Release|Win32 + {50C94B05-8C3E-49ED-B2B9-5715EB624D14}.Release|Win32.Build.0 = Release|Win32 + {50C94B05-8C3E-49ED-B2B9-5715EB624D14}.Release|x64.ActiveCfg = Release|x64 + {50C94B05-8C3E-49ED-B2B9-5715EB624D14}.Release|x64.Build.0 = Release|x64 + {33F98E06-F44C-4E22-9E16-4C20F8238A95}.Debug_StaticCrt|Win32.ActiveCfg = Debug_StaticCrt|Win32 + {33F98E06-F44C-4E22-9E16-4C20F8238A95}.Debug_StaticCrt|Win32.Build.0 = Debug_StaticCrt|Win32 + {33F98E06-F44C-4E22-9E16-4C20F8238A95}.Debug_StaticCrt|x64.ActiveCfg = Debug_StaticCrt|x64 + {33F98E06-F44C-4E22-9E16-4C20F8238A95}.Debug_StaticCrt|x64.Build.0 = Debug_StaticCrt|x64 + {33F98E06-F44C-4E22-9E16-4C20F8238A95}.Debug_VldRelease_StaticCrt|Win32.ActiveCfg = Debug(Release)_StaticCrt|Win32 + {33F98E06-F44C-4E22-9E16-4C20F8238A95}.Debug_VldRelease_StaticCrt|Win32.Build.0 = Debug(Release)_StaticCrt|Win32 + {33F98E06-F44C-4E22-9E16-4C20F8238A95}.Debug_VldRelease_StaticCrt|x64.ActiveCfg = Debug(Release)_StaticCrt|x64 + {33F98E06-F44C-4E22-9E16-4C20F8238A95}.Debug_VldRelease_StaticCrt|x64.Build.0 = Debug(Release)_StaticCrt|x64 + {33F98E06-F44C-4E22-9E16-4C20F8238A95}.Debug_VldRelease|Win32.ActiveCfg = Debug(Release)|Win32 + {33F98E06-F44C-4E22-9E16-4C20F8238A95}.Debug_VldRelease|Win32.Build.0 = Debug(Release)|Win32 + {33F98E06-F44C-4E22-9E16-4C20F8238A95}.Debug_VldRelease|x64.ActiveCfg = Debug(Release)|x64 + {33F98E06-F44C-4E22-9E16-4C20F8238A95}.Debug_VldRelease|x64.Build.0 = Debug(Release)|x64 + {33F98E06-F44C-4E22-9E16-4C20F8238A95}.Debug|Win32.ActiveCfg = Debug|Win32 + {33F98E06-F44C-4E22-9E16-4C20F8238A95}.Debug|Win32.Build.0 = Debug|Win32 + {33F98E06-F44C-4E22-9E16-4C20F8238A95}.Debug|x64.ActiveCfg = Debug|x64 + {33F98E06-F44C-4E22-9E16-4C20F8238A95}.Debug|x64.Build.0 = Debug|x64 + {33F98E06-F44C-4E22-9E16-4C20F8238A95}.Release_StaticCrt|Win32.ActiveCfg = Release_StaticCrt|Win32 + {33F98E06-F44C-4E22-9E16-4C20F8238A95}.Release_StaticCrt|Win32.Build.0 = Release_StaticCrt|Win32 + {33F98E06-F44C-4E22-9E16-4C20F8238A95}.Release_StaticCrt|x64.ActiveCfg = Release_StaticCrt|x64 + {33F98E06-F44C-4E22-9E16-4C20F8238A95}.Release_StaticCrt|x64.Build.0 = Release_StaticCrt|x64 + {33F98E06-F44C-4E22-9E16-4C20F8238A95}.Release|Win32.ActiveCfg = Release|Win32 + {33F98E06-F44C-4E22-9E16-4C20F8238A95}.Release|Win32.Build.0 = Release|Win32 + {33F98E06-F44C-4E22-9E16-4C20F8238A95}.Release|x64.ActiveCfg = Release|x64 + {33F98E06-F44C-4E22-9E16-4C20F8238A95}.Release|x64.Build.0 = Release|x64 + {BB99EDE9-D039-4169-B26B-6BFD93C6AF8E}.Debug_StaticCrt|Win32.ActiveCfg = Debug_StaticCrt|Win32 + {BB99EDE9-D039-4169-B26B-6BFD93C6AF8E}.Debug_StaticCrt|Win32.Build.0 = Debug_StaticCrt|Win32 + {BB99EDE9-D039-4169-B26B-6BFD93C6AF8E}.Debug_StaticCrt|x64.ActiveCfg = Debug_StaticCrt|x64 + {BB99EDE9-D039-4169-B26B-6BFD93C6AF8E}.Debug_StaticCrt|x64.Build.0 = Debug_StaticCrt|x64 + {BB99EDE9-D039-4169-B26B-6BFD93C6AF8E}.Debug_VldRelease_StaticCrt|Win32.ActiveCfg = Debug(Release)_StaticCrt|Win32 + {BB99EDE9-D039-4169-B26B-6BFD93C6AF8E}.Debug_VldRelease_StaticCrt|Win32.Build.0 = Debug(Release)_StaticCrt|Win32 + {BB99EDE9-D039-4169-B26B-6BFD93C6AF8E}.Debug_VldRelease_StaticCrt|x64.ActiveCfg = Debug(Release)_StaticCrt|x64 + {BB99EDE9-D039-4169-B26B-6BFD93C6AF8E}.Debug_VldRelease_StaticCrt|x64.Build.0 = Debug(Release)_StaticCrt|x64 + {BB99EDE9-D039-4169-B26B-6BFD93C6AF8E}.Debug_VldRelease|Win32.ActiveCfg = Debug(Release)|Win32 + {BB99EDE9-D039-4169-B26B-6BFD93C6AF8E}.Debug_VldRelease|Win32.Build.0 = Debug(Release)|Win32 + {BB99EDE9-D039-4169-B26B-6BFD93C6AF8E}.Debug_VldRelease|x64.ActiveCfg = Debug(Release)|x64 + {BB99EDE9-D039-4169-B26B-6BFD93C6AF8E}.Debug_VldRelease|x64.Build.0 = Debug(Release)|x64 + {BB99EDE9-D039-4169-B26B-6BFD93C6AF8E}.Debug|Win32.ActiveCfg = Debug|Win32 + {BB99EDE9-D039-4169-B26B-6BFD93C6AF8E}.Debug|Win32.Build.0 = Debug|Win32 + {BB99EDE9-D039-4169-B26B-6BFD93C6AF8E}.Debug|x64.ActiveCfg = Debug|x64 + {BB99EDE9-D039-4169-B26B-6BFD93C6AF8E}.Debug|x64.Build.0 = Debug|x64 + {BB99EDE9-D039-4169-B26B-6BFD93C6AF8E}.Release_StaticCrt|Win32.ActiveCfg = Release_StaticCrt|Win32 + {BB99EDE9-D039-4169-B26B-6BFD93C6AF8E}.Release_StaticCrt|Win32.Build.0 = Release_StaticCrt|Win32 + {BB99EDE9-D039-4169-B26B-6BFD93C6AF8E}.Release_StaticCrt|x64.ActiveCfg = Release_StaticCrt|x64 + {BB99EDE9-D039-4169-B26B-6BFD93C6AF8E}.Release_StaticCrt|x64.Build.0 = Release_StaticCrt|x64 + {BB99EDE9-D039-4169-B26B-6BFD93C6AF8E}.Release|Win32.ActiveCfg = Release|Win32 + {BB99EDE9-D039-4169-B26B-6BFD93C6AF8E}.Release|Win32.Build.0 = Release|Win32 + {BB99EDE9-D039-4169-B26B-6BFD93C6AF8E}.Release|x64.ActiveCfg = Release|x64 + {BB99EDE9-D039-4169-B26B-6BFD93C6AF8E}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {0943354A-41E0-4215-878A-8D0FE758052C} = {9F9CFA3A-F154-4069-89E3-19BDC6BD3A7D} + {EE4A829C-5FD8-460B-8A90-B518B9BABB70} = {9F9CFA3A-F154-4069-89E3-19BDC6BD3A7D} + {3AEA2AAF-3E9B-466F-B361-560B95AD88B4} = {281D5ACB-9ED2-496B-B19E-A75F4D4DA111} + {5C25E1C8-00CB-4E0A-9BEC-952F0A6E5DCA} = {9F9CFA3A-F154-4069-89E3-19BDC6BD3A7D} + {87911ED6-84BC-4526-9654-A4FF4E0EDF52} = {9F9CFA3A-F154-4069-89E3-19BDC6BD3A7D} + {281D5ACB-9ED2-496B-B19E-A75F4D4DA111} = {9F9CFA3A-F154-4069-89E3-19BDC6BD3A7D} + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7} = {9FD1911C-3FAB-48DE-BE31-9F2C7B1EB58C} + {9FD1911C-3FAB-48DE-BE31-9F2C7B1EB58C} = {9F9CFA3A-F154-4069-89E3-19BDC6BD3A7D} + {4ADFD279-56C6-4B1D-BA9E-B815E81C1B17} = {9FD1911C-3FAB-48DE-BE31-9F2C7B1EB58C} + {8C732490-DC1A-40C0-923F-1555B9141B80} = {9F9CFA3A-F154-4069-89E3-19BDC6BD3A7D} + {A8EEDB38-1E5A-4D6E-A3E0-F15EF1F2E814} = {9F9CFA3A-F154-4069-89E3-19BDC6BD3A7D} + {50C94B05-8C3E-49ED-B2B9-5715EB624D14} = {281D5ACB-9ED2-496B-B19E-A75F4D4DA111} + {33F98E06-F44C-4E22-9E16-4C20F8238A95} = {281D5ACB-9ED2-496B-B19E-A75F4D4DA111} + {BB99EDE9-D039-4169-B26B-6BFD93C6AF8E} = {9F9CFA3A-F154-4069-89E3-19BDC6BD3A7D} + EndGlobalSection +EndGlobal