- Added Win64 support to the crash report generator.

SVN r1184 (trunk)
This commit is contained in:
Randy Heit 2008-08-24 04:51:15 +00:00
parent 3638c658d6
commit 4d56889483
4 changed files with 430 additions and 260 deletions

View file

@ -1,3 +1,7 @@
August 23, 2008
- Added Win64 support to the crash report generator. (Pity that Win32
cannot be as informative.)
August 22, 2008 (Changes by Graf Zahl)
- Added and fixed Boss death submission for random spawner.
- Added functions to FActorInfo that can set the damage factors and

View file

@ -41,6 +41,9 @@
#include <richedit.h>
#include <winuser.h>
#include <tlhelp32.h>
#ifndef _M_IX86
#include <winternl.h>
#endif
#ifndef __GNUC__
#include <dbghelp.h>
#endif
@ -142,6 +145,11 @@ typedef BOOL (WINAPI *WRITEDUMP) (HANDLE, DWORD, HANDLE, int,
// TYPES -------------------------------------------------------------------
#ifdef _M_X64
typedef PRUNTIME_FUNCTION (WINAPI *RTLLOOKUPFUNCTIONENTRY)
(ULONG64 ControlPc, PULONG64 ImageBase, void *HistoryTable);
#endif
// Damn Microsoft for doing Get/SetWindowLongPtr half-assed. Instead of
// giving them proper prototypes under Win32, they are just macros for
// Get/SetWindowLong, meaning they take LONGs and not LONG_PTRs.
@ -235,8 +243,8 @@ static void AddZipFile (HANDLE ziphandle, TarFile *whichfile, short dosdate, sho
static HANDLE CreateTempFile ();
static void DumpBytes (HANDLE file, BYTE *address);
static void AddStackInfo (HANDLE file, void *dumpaddress, DWORD code);
static void StackWalk (HANDLE file, void *dumpaddress, DWORD *topOfStack, DWORD *jump);
static void AddStackInfo (HANDLE file, void *dumpaddress, DWORD code, CONTEXT *ctxt);
static void StackWalk (HANDLE file, void *dumpaddress, DWORD *topOfStack, DWORD *jump, CONTEXT *ctxt);
static void AddToolHelp (HANDLE file);
static HANDLE WriteTextReport ();
@ -650,9 +658,9 @@ HANDLE WriteTextReport ()
if (verinfo.dwPlatformId != VER_PLATFORM_WIN32_WINDOWS)
{
j += mysnprintf (CrashSummary + j, countof(CrashSummary) - j,
" - tried to %s address %08lX",
" - tried to %s address %p",
CrashPointers.ExceptionRecord->ExceptionInformation[0] ? "write" : "read",
CrashPointers.ExceptionRecord->ExceptionInformation[1]);
(void *)CrashPointers.ExceptionRecord->ExceptionInformation[1]);
}
}
CrashSummary[j++] = ')';
@ -741,17 +749,21 @@ HANDLE WriteTextReport ()
AddToolHelp (file);
#ifdef _M_IX86
Writef (file, "\r\nBytes near EIP:");
#else
Writef (file, "\r\nBytes near RIP:");
#endif
DumpBytes (file, (BYTE *)CrashPointers.ExceptionRecord->ExceptionAddress-16);
if (ctxt->ContextFlags & CONTEXT_CONTROL)
{
#ifndef _M_X64
AddStackInfo (file, (void *)(size_t)CrashPointers.ContextRecord->Esp,
CrashPointers.ExceptionRecord->ExceptionCode);
CrashPointers.ExceptionRecord->ExceptionCode, ctxt);
#else
AddStackInfo (file, (void *)CrashPointers.ContextRecord->Rsp,
CrashPointers.ExceptionRecord->ExceptionCode);
CrashPointers.ExceptionRecord->ExceptionCode, ctxt);
#endif
}
@ -814,7 +826,7 @@ static void AddToolHelp (HANDLE file)
if (thread.th32ThreadID == DbgThreadID)
{
Writef (file, " at %08x*", CrashAddress);
Writef (file, " at %p*", CrashAddress);
}
Writef (file, "\r\n");
}
@ -829,7 +841,7 @@ static void AddToolHelp (HANDLE file)
{
do
{
Writef (file, "%08x - %08x %c%s\r\n",
Writef (file, "%p - %p %c%s\r\n",
module.modBaseAddr, module.modBaseAddr + module.modBaseSize - 1,
module.modBaseAddr <= CrashPointers.ExceptionRecord->ExceptionAddress &&
module.modBaseAddr + module.modBaseSize > CrashPointers.ExceptionRecord->ExceptionAddress
@ -849,12 +861,16 @@ static void AddToolHelp (HANDLE file)
//
//==========================================================================
static void AddStackInfo (HANDLE file, void *dumpaddress, DWORD code)
static void AddStackInfo (HANDLE file, void *dumpaddress, DWORD code, CONTEXT *ctxt)
{
DWORD *addr = (DWORD *)dumpaddress, *jump;
DWORD *topOfStack = GetTopOfStack (dumpaddress);
BYTE peekb;
#ifdef _M_IX86
DWORD peekd;
#else
QWORD peekq;
#endif
jump = topOfStack;
if (code == EXCEPTION_STACK_OVERFLOW)
@ -866,7 +882,7 @@ static void AddStackInfo (HANDLE file, void *dumpaddress, DWORD code)
}
}
StackWalk (file, dumpaddress, topOfStack, jump);
StackWalk (file, dumpaddress, topOfStack, jump, ctxt);
Writef (file, "\r\nStack Contents:\r\n");
DWORD *scan;
@ -881,6 +897,8 @@ static void AddStackInfo (HANDLE file, void *dumpaddress, DWORD code)
Writef (file, "\r\n . . . Snip . . .\r\n\r\n");
}
Writef (file, "%p:", scan);
#ifdef _M_IX86
if (topOfStack - scan < 4)
{
max = topOfStack - scan;
@ -890,7 +908,6 @@ static void AddStackInfo (HANDLE file, void *dumpaddress, DWORD code)
max = 4;
}
Writef (file, "%p:", scan);
for (i = 0; i < max; ++i)
{
if (!SafeReadMemory (&scan[i], &peekd, 4))
@ -903,8 +920,31 @@ static void AddStackInfo (HANDLE file, void *dumpaddress, DWORD code)
{
Writef (file, " ");
}
#else
if ((QWORD *)topOfStack - (QWORD *)scan < 2)
{
max = (QWORD *)topOfStack - (QWORD *)scan;
}
else
{
max = 2;
}
for (i = 0; i < max; ++i)
{
if (!SafeReadMemory (&scan[i], &peekq, 8))
{
break;
}
Writef (file, " %016x", peekq);
}
if (i < 2)
{
Writef (file, " ");
}
#endif
Writef (file, " ");
for (i = 0; i < max*4; ++i)
for (i = 0; i < max*sizeof(void*); ++i)
{
if (!SafeReadMemory ((BYTE *)scan + i, &peekb, 1))
{
@ -916,9 +956,12 @@ static void AddStackInfo (HANDLE file, void *dumpaddress, DWORD code)
}
}
#ifdef _M_IX86
//==========================================================================
//
// StackWalk
// Win32 version
//
// Lists a possible call trace for the crashing thread to the text report.
// This is not very specific and just lists any pointers into the
@ -926,7 +969,7 @@ static void AddStackInfo (HANDLE file, void *dumpaddress, DWORD code)
//
//==========================================================================
static void StackWalk (HANDLE file, void *dumpaddress, DWORD *topOfStack, DWORD *jump)
static void StackWalk (HANDLE file, void *dumpaddress, DWORD *topOfStack, DWORD *jump, CONTEXT *ctxt)
{
DWORD *addr = (DWORD *)dumpaddress;
@ -947,7 +990,6 @@ static void StackWalk (HANDLE file, void *dumpaddress, DWORD *topOfStack, DWORD
Writef (file, "\r\n\r\n . . . . Snip . . . .\r\n");
}
#ifndef _M_X64
DWORD_PTR code;
if (SafeReadMemory (scan, &code, sizeof(code)) &&
@ -1106,11 +1148,133 @@ static void StackWalk (HANDLE file, void *dumpaddress, DWORD *topOfStack, DWORD
}
}
}
#endif
}
Writef (file, "\r\n");
}
#else
//==========================================================================
//
// StackWalk
// Win64 version
//
// Walks the stack for the crashing thread and dumps the trace to the text
// report. Unlike the Win32 version, Win64 provides facilities for
// doing a 100% exact walk.
//
// See http://www.nynaeve.net/?p=113 for more information, and
// http://www.nynaeve.net/Code/StackWalk64.cpp in particular.
//
//==========================================================================
static void StackWalk (HANDLE file, void *dumpaddress, DWORD *topOfStack, DWORD *jump, CONTEXT *ctxt)
{
RTLLOOKUPFUNCTIONENTRY RtlLookupFunctionEntry;
HMODULE kernel;
CONTEXT context;
KNONVOLATILE_CONTEXT_POINTERS nv_context;
PRUNTIME_FUNCTION function;
PVOID handler_data;
ULONG64 establisher_frame;
ULONG64 image_base;
Writef (file, "\r\nCall trace:\r\n rip=%p <- Here it dies.\r\n", CrashAddress);
kernel = GetModuleHandle("kernel32.dll");
if (kernel == NULL || NULL == (RtlLookupFunctionEntry =
(RTLLOOKUPFUNCTIONENTRY)GetProcAddress(kernel, "RtlLookupFunctionEntry")))
{
Writef (file, " Unavailable: Could not get address of RtlLookupFunctionEntry\r\n");
return;
}
// Get the caller's context
context = *ctxt;
// This unwind loop intentionally skips the first call frame, as it
// shall correspond to the call to StackTrace64, which we aren't
// interested in.
for (ULONG frame = 0; ; ++frame)
{
// Try to look up unwind metadata for the current function.
function = RtlLookupFunctionEntry(context.Rip, &image_base, NULL);
memset(&nv_context, 0, sizeof(nv_context));
if (function == NULL)
{
// If we don't have a RUNTIME_FUNCTION, then we've encountered
// a leaf function. Adjust the stack appropriately.
context.Rip = (ULONG64)(*(PULONG64)context.Rsp);
context.Rsp += 8;
Writef(file, " Leaf function\r\n\r\n");
}
else
{
// Note that there is not a one-to-one correspondance between
// runtime functions and source functions. One source function
// may be broken into multiple runtime functions. This loop walks
// backward from the current runtime function for however many
// consecutive runtime functions precede it. There is a slight
// chance that this will walk across different source functions.
// (Or maybe not, depending on whether or not the compiler
// guarantees that there will be empty space between functions;
// it looks like VC++ might.) In practice, this seems to work
// quite well for identifying the exact address to search for in
// a map file to determine the function name.
PRUNTIME_FUNCTION function2 = function;
ULONG64 base = image_base;
while (function2 != NULL)
{
Writef(file, " Function range: %p -> %p\r\n",
(void *)(base + function2->BeginAddress),
(void *)(base + function2->EndAddress));
function2 = RtlLookupFunctionEntry(base + function2->BeginAddress - 1, &base, NULL);
}
Writef(file, "\r\n");
// Use RtlVirtualUnwind to execute the unwind for us.
RtlVirtualUnwind(0/*UNW_FLAG_NHANDLER*/, image_base, context.Rip,
function, &context, &handler_data, &establisher_frame,
&nv_context);
}
// If we reach a RIP of zero, this means we've walked off the end of
// the call stack and are done.
if (context.Rip == NULL)
{
break;
}
// Display the context. Note that we don't bother showing the XMM
// context, although we have the nonvolatile portion of it.
Writef(file, " FRAME %02d:\r\n rip=%p rsp=%p rbp=%p\r\n",
frame, context.Rip, context.Rsp, context.Rbp);
Writef(file, " r12=%p r13=%p r14=%p\r\n"
" rdi=%p rsi=%p rbx=%p\r\n",
context.R12, context.R13, context.R14,
context.Rdi, context.Rsi, context.Rbx);
static const char reg_names[16][4] =
{
"rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
"r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
};
// If we have stack-based register stores, then display them here.
for (int i = 0; i < 16; ++i)
{
if (nv_context.IntegerContext[i])
{
Writef(file, " -> '%s' saved on stack at %p (=> %p)\r\n",
reg_names[i], nv_context.IntegerContext[i], *nv_context.IntegerContext[i]);
}
}
}
}
#endif
//==========================================================================
//
// DumpBytes
@ -1121,7 +1285,7 @@ static void StackWalk (HANDLE file, void *dumpaddress, DWORD *topOfStack, DWORD
static void DumpBytes (HANDLE file, BYTE *address)
{
char line[64*3], *line_p = line;
char line[68*3], *line_p = line;
DWORD len;
BYTE peek;

View file

@ -9,6 +9,7 @@
//
#include "afxres.h"
#include "../version.h"
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
@ -35,7 +36,7 @@ END
2 TEXTINCLUDE
BEGIN
"#include ""afxres.h""\r\n"
"#include ""../version.h\0"
"#include ""../version.h""\r\0"
END
3 TEXTINCLUDE
@ -161,7 +162,7 @@ BEGIN
IDD_CRASHDIALOG, DIALOG
BEGIN
LEFTMARGIN, 4
RIGHTMARGIN, 401
RIGHTMARGIN, 408
TOPMARGIN, 4
BOTTOMMARGIN, 303
HORZGUIDE, 49
@ -179,7 +180,7 @@ BEGIN
IDD_CRASHDETAILS, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 384
RIGHTMARGIN, 392
TOPMARGIN, 7
HORZGUIDE, 76
END
@ -374,19 +375,19 @@ BEGIN
PUSHBUTTON "Select None",IDC_SELECTNONE,320,31,50,14
END
IDD_CRASHDIALOG DIALOGEX 0, 0, 405, 308
IDD_CRASHDIALOG DIALOGEX 0, 0, 415, 308
STYLE DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_CONTROLPARENT | WS_EX_APPWINDOW
CAPTION "ZDoom Very Fatal Error"
FONT 8, "MS Shell Dlg", 400, 0, 0x0
BEGIN
CONTROL "",IDC_CRASHTAB,"SysTabControl32",WS_TABSTOP,4,4,397,280
PUSHBUTTON "&Send Error Report",IDYES,139,289,91,14,WS_DISABLED
PUSHBUTTON "Save Report to Disk...",IDC_SAVEREPORT,235,289,91,14
PUSHBUTTON "&Discard Report",IDNO,331,289,70,14
CONTROL "",IDC_CRASHTAB,"SysTabControl32",WS_TABSTOP,4,4,404,280
PUSHBUTTON "&Send Error Report",IDYES,146,289,91,14,WS_DISABLED
PUSHBUTTON "Save Report to Disk...",IDC_SAVEREPORT,242,289,91,14
PUSHBUTTON "&Discard Report",IDNO,338,289,70,14
END
IDD_CRASHOVERVIEW DIALOGEX 1, 13, 391, 264
IDD_CRASHOVERVIEW DIALOGEX 1, 13, 400, 264
STYLE DS_SETFONT | DS_FIXEDSYS | DS_CONTROL | WS_CHILD | WS_VISIBLE
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
@ -400,15 +401,15 @@ BEGIN
LTEXT "Static",IDC_CRASHSUMMARY,14,233,363,20
END
IDD_CRASHDETAILS DIALOGEX 0, 0, 391, 164
IDD_CRASHDETAILS DIALOGEX 0, 0, 400, 164
STYLE DS_SETFONT | DS_3DLOOK | DS_FIXEDSYS | DS_CONTROL | WS_CHILD
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
LTEXT "The error report contains these files:",IDC_STATIC,7,5,119,8
LTEXT "The selected file contains this information:",IDC_STATIC,7,74,136,8
RTEXT "Static",IDC_CRASHFILESIZE,329,74,55,8
LISTBOX IDC_CRASHFILES,7,15,377,53,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
CONTROL "",IDC_CRASHFILECONTENTS,"RichEdit20A",ES_MULTILINE | ES_READONLY | WS_BORDER | WS_VSCROLL | WS_TABSTOP,7,83,377,174
RTEXT "Static",IDC_CRASHFILESIZE,337,74,55,8
LISTBOX IDC_CRASHFILES,7,15,385,53,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
CONTROL "",IDC_CRASHFILECONTENTS,"RichEdit20A",ES_MULTILINE | ES_READONLY | WS_BORDER | WS_VSCROLL | WS_TABSTOP,7,83,385,174
END
IDD_BOING DIALOGEX 0, 0, 187, 196
@ -508,7 +509,7 @@ BEGIN
BEGIN
VALUE "Translation", 0x409, 1200
END
END
END
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="8,00"
Version="8.00"
Name="zdoom"
ProjectGUID="{8049475B-5C87-46F9-9358-635218A4EF18}"
RootNamespace=" zdoom"
@ -138,6 +138,118 @@
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|x64"
OutputDirectory="$(PlatformName)\$(ConfigurationName)"
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
ConfigurationType="1"
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="false"
CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
CommandLine="$(OutDir)\updaterevision.exe src src/svnrevision.h"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="NDEBUG"
MkTypLibCompatible="true"
SuppressStartupBanner="true"
TargetEnvironment="3"
TypeLibraryName=".\Release/zdoom.tlb"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="3"
InlineFunctionExpansion="2"
EnableIntrinsicFunctions="true"
FavorSizeOrSpeed="1"
OmitFramePointers="true"
AdditionalIncludeDirectories="src\win32;src\sound;src;zlib;src\g_shared;src\g_doom;src\g_raven;src\g_heretic;src\g_hexen;src\g_strife;jpeg-6b;snes_spc\snes_spc;gdtoa"
PreprocessorDefinitions="NDEBUG,WIN32,_WIN32,_WINDOWS,HAVE_STRUPR,HAVE_FILELENGTH"
StringPooling="true"
RuntimeLibrary="0"
EnableFunctionLevelLinking="false"
ForceConformanceInForLoopScope="true"
RuntimeTypeInfo="false"
UsePrecompiledHeader="0"
PrecompiledHeaderFile=""
AssemblerOutput="0"
WarningLevel="3"
SuppressStartupBanner="true"
DebugInformationFormat="1"
CompileAs="0"
DisableSpecificWarnings="4996"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="NDEBUG"
Culture="1033"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="ddraw.lib dxguid.lib dinput8.lib comctl32.lib strmiids.lib wsock32.lib ws2_32.lib winmm.lib fmodex64_vc.lib setupapi.lib"
ShowProgress="0"
OutputFile="../zdoom64.exe"
LinkIncremental="1"
SuppressStartupBanner="true"
IgnoreDefaultLibraryNames=""
GenerateDebugInformation="true"
ProgramDatabaseFile="..\zdoom64.pdb"
StripPrivateSymbols=""
GenerateMapFile="true"
MapFileName="$(OutDir)/zdoom.map"
MapExports="true"
SubSystem="2"
StackReserveSize="0"
TerminalServerAware="2"
OptimizeReferences="2"
EnableCOMDATFolding="2"
SetChecksum="true"
TargetMachine="17"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCWebDeploymentTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Debug|Win32"
OutputDirectory=".\Debug"
@ -244,117 +356,6 @@
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|x64"
OutputDirectory="$(PlatformName)\$(ConfigurationName)"
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
ConfigurationType="1"
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="false"
CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
CommandLine="$(OutDir)\updaterevision.exe src src/svnrevision.h"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="NDEBUG"
MkTypLibCompatible="true"
SuppressStartupBanner="true"
TargetEnvironment="3"
TypeLibraryName=".\Release/zdoom.tlb"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="3"
InlineFunctionExpansion="2"
EnableIntrinsicFunctions="true"
FavorSizeOrSpeed="1"
OmitFramePointers="true"
AdditionalIncludeDirectories="src\win32;src\sound;src;zlib;src\g_shared;src\g_doom;src\g_raven;src\g_heretic;src\g_hexen;src\g_strife;jpeg-6b;snes_spc\snes_spc;gdtoa"
PreprocessorDefinitions="NDEBUG,WIN32,_WIN32,_WINDOWS,HAVE_STRUPR,HAVE_FILELENGTH"
StringPooling="true"
RuntimeLibrary="0"
EnableFunctionLevelLinking="false"
ForceConformanceInForLoopScope="true"
RuntimeTypeInfo="false"
UsePrecompiledHeader="0"
PrecompiledHeaderFile=""
AssemblerOutput="0"
WarningLevel="3"
SuppressStartupBanner="true"
DebugInformationFormat="1"
CompileAs="0"
DisableSpecificWarnings="4996"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="NDEBUG"
Culture="1033"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="ddraw.lib dxguid.lib dinput8.lib comctl32.lib strmiids.lib wsock32.lib ws2_32.lib winmm.lib fmodex64_vc.lib setupapi.lib"
ShowProgress="0"
OutputFile="../zdoom64.exe"
LinkIncremental="1"
SuppressStartupBanner="true"
IgnoreDefaultLibraryNames=""
GenerateDebugInformation="true"
ProgramDatabaseFile="..\zdoom.pdb"
StripPrivateSymbols=""
GenerateMapFile="true"
MapFileName=".\Release/zdoom.map"
MapExports="true"
SubSystem="2"
StackReserveSize="0"
TerminalServerAware="2"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="17"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCWebDeploymentTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Debug|x64"
OutputDirectory="$(PlatformName)\$(ConfigurationName)"
@ -929,16 +930,6 @@
Outputs="&quot;src/$(InputName).h&quot;"
/>
</FileConfiguration>
<FileConfiguration
Name="Debug|Win32"
>
<Tool
Name="VCCustomBuildTool"
Description="Creating $(InputName).h from src/$(InputFileName)"
CommandLine="tools\re2c\re2c --no-generation-date -s -o &quot;src/$(InputName).h&quot; &quot;src/$(InputFileName)&quot;&#x0D;&#x0A;"
Outputs="&quot;src/$(InputName).h&quot;"
/>
</FileConfiguration>
<FileConfiguration
Name="Release|x64"
>
@ -949,6 +940,16 @@
Outputs="&quot;src/$(InputName).h&quot;"
/>
</FileConfiguration>
<FileConfiguration
Name="Debug|Win32"
>
<Tool
Name="VCCustomBuildTool"
Description="Creating $(InputName).h from src/$(InputFileName)"
CommandLine="tools\re2c\re2c --no-generation-date -s -o &quot;src/$(InputName).h&quot; &quot;src/$(InputFileName)&quot;&#x0D;&#x0A;"
Outputs="&quot;src/$(InputName).h&quot;"
/>
</FileConfiguration>
<FileConfiguration
Name="Debug|x64"
>
@ -1546,16 +1547,6 @@
Outputs="$(IntDir)\$(InputName).obj"
/>
</FileConfiguration>
<FileConfiguration
Name="Debug|Win32"
>
<Tool
Name="VCCustomBuildTool"
Description="Assembling $(InputPath)..."
CommandLine="nasm -g -o &quot;$(IntDir)\$(InputName).obj&quot; -f win32 &quot;$(InputPath)&quot; -isrc/&#x0D;&#x0A;$(OutDir)\fixrtext &quot;$(IntDir)\$(InputName).obj&quot;&#x0D;&#x0A;"
Outputs="$(IntDir)\$(InputName).obj"
/>
</FileConfiguration>
<FileConfiguration
Name="Release|x64"
ExcludedFromBuild="true"
@ -1567,6 +1558,16 @@
Outputs="$(IntDir)/$(InputName).obj"
/>
</FileConfiguration>
<FileConfiguration
Name="Debug|Win32"
>
<Tool
Name="VCCustomBuildTool"
Description="Assembling $(InputPath)..."
CommandLine="nasm -g -o &quot;$(IntDir)\$(InputName).obj&quot; -f win32 &quot;$(InputPath)&quot; -isrc/&#x0D;&#x0A;$(OutDir)\fixrtext &quot;$(IntDir)\$(InputName).obj&quot;&#x0D;&#x0A;"
Outputs="$(IntDir)\$(InputName).obj"
/>
</FileConfiguration>
<FileConfiguration
Name="Debug|x64"
ExcludedFromBuild="true"
@ -1592,16 +1593,6 @@
Outputs="$(IntDir)\$(InputName).obj"
/>
</FileConfiguration>
<FileConfiguration
Name="Debug|Win32"
>
<Tool
Name="VCCustomBuildTool"
Description="Assembling $(InputPath)..."
CommandLine="nasm -g -o &quot;$(IntDir)\$(InputName).obj&quot; -f win32 &quot;$(InputPath)&quot; -isrc/&#x0D;&#x0A;$(OutDir)\fixrtext &quot;$(IntDir)\$(InputName).obj&quot;&#x0D;&#x0A;"
Outputs="$(IntDir)\$(InputName).obj"
/>
</FileConfiguration>
<FileConfiguration
Name="Release|x64"
ExcludedFromBuild="true"
@ -1613,6 +1604,16 @@
Outputs="$(IntDir)/$(InputName).obj"
/>
</FileConfiguration>
<FileConfiguration
Name="Debug|Win32"
>
<Tool
Name="VCCustomBuildTool"
Description="Assembling $(InputPath)..."
CommandLine="nasm -g -o &quot;$(IntDir)\$(InputName).obj&quot; -f win32 &quot;$(InputPath)&quot; -isrc/&#x0D;&#x0A;$(OutDir)\fixrtext &quot;$(IntDir)\$(InputName).obj&quot;&#x0D;&#x0A;"
Outputs="$(IntDir)\$(InputName).obj"
/>
</FileConfiguration>
<FileConfiguration
Name="Debug|x64"
ExcludedFromBuild="true"
@ -1638,16 +1639,6 @@
Outputs="$(IntDir)\$(InputName).obj"
/>
</FileConfiguration>
<FileConfiguration
Name="Debug|Win32"
>
<Tool
Name="VCCustomBuildTool"
Description="Assembling $(InputPath)..."
CommandLine="nasm -g -o &quot;$(IntDir)\$(InputName).obj&quot; -f win32 &quot;$(InputPath)&quot; -isrc/&#x0D;&#x0A;$(OutDir)\fixrtext &quot;$(IntDir)\$(InputName).obj&quot;&#x0D;&#x0A;"
Outputs="$(IntDir)\$(InputName).obj"
/>
</FileConfiguration>
<FileConfiguration
Name="Release|x64"
ExcludedFromBuild="true"
@ -1659,6 +1650,16 @@
Outputs="$(IntDir)/$(InputName).obj"
/>
</FileConfiguration>
<FileConfiguration
Name="Debug|Win32"
>
<Tool
Name="VCCustomBuildTool"
Description="Assembling $(InputPath)..."
CommandLine="nasm -g -o &quot;$(IntDir)\$(InputName).obj&quot; -f win32 &quot;$(InputPath)&quot; -isrc/&#x0D;&#x0A;$(OutDir)\fixrtext &quot;$(IntDir)\$(InputName).obj&quot;&#x0D;&#x0A;"
Outputs="$(IntDir)\$(InputName).obj"
/>
</FileConfiguration>
<FileConfiguration
Name="Debug|x64"
ExcludedFromBuild="true"
@ -1684,16 +1685,6 @@
Outputs="$(IntDir)\$(InputName).obj"
/>
</FileConfiguration>
<FileConfiguration
Name="Debug|Win32"
>
<Tool
Name="VCCustomBuildTool"
Description="Assembling $(InputPath)..."
CommandLine="nasm -g -o &quot;$(IntDir)\$(InputName).obj&quot; -f win32 &quot;$(InputPath)&quot; -isrc/&#x0D;&#x0A;$(OutDir)\fixrtext &quot;$(IntDir)\$(InputName).obj&quot;&#x0D;&#x0A;"
Outputs="$(IntDir)\$(InputName).obj"
/>
</FileConfiguration>
<FileConfiguration
Name="Release|x64"
ExcludedFromBuild="true"
@ -1705,6 +1696,16 @@
Outputs="$(IntDir)/$(InputName).obj"
/>
</FileConfiguration>
<FileConfiguration
Name="Debug|Win32"
>
<Tool
Name="VCCustomBuildTool"
Description="Assembling $(InputPath)..."
CommandLine="nasm -g -o &quot;$(IntDir)\$(InputName).obj&quot; -f win32 &quot;$(InputPath)&quot; -isrc/&#x0D;&#x0A;$(OutDir)\fixrtext &quot;$(IntDir)\$(InputName).obj&quot;&#x0D;&#x0A;"
Outputs="$(IntDir)\$(InputName).obj"
/>
</FileConfiguration>
<FileConfiguration
Name="Debug|x64"
ExcludedFromBuild="true"
@ -1730,16 +1731,6 @@
Outputs="$(IntDir)\$(InputName).obj"
/>
</FileConfiguration>
<FileConfiguration
Name="Debug|Win32"
>
<Tool
Name="VCCustomBuildTool"
Description="Assembling $(InputPath)..."
CommandLine="nasm -g -o &quot;$(IntDir)\$(InputName).obj&quot; -f win32 &quot;$(InputPath)&quot; -isrc/&#x0D;&#x0A;$(OutDir)\fixrtext &quot;$(IntDir)\$(InputName).obj&quot;&#x0D;&#x0A;"
Outputs="$(IntDir)\$(InputName).obj"
/>
</FileConfiguration>
<FileConfiguration
Name="Release|x64"
ExcludedFromBuild="true"
@ -1751,6 +1742,16 @@
Outputs="$(IntDir)/$(InputName).obj"
/>
</FileConfiguration>
<FileConfiguration
Name="Debug|Win32"
>
<Tool
Name="VCCustomBuildTool"
Description="Assembling $(InputPath)..."
CommandLine="nasm -g -o &quot;$(IntDir)\$(InputName).obj&quot; -f win32 &quot;$(InputPath)&quot; -isrc/&#x0D;&#x0A;$(OutDir)\fixrtext &quot;$(IntDir)\$(InputName).obj&quot;&#x0D;&#x0A;"
Outputs="$(IntDir)\$(InputName).obj"
/>
</FileConfiguration>
<FileConfiguration
Name="Debug|x64"
ExcludedFromBuild="true"
@ -1778,14 +1779,6 @@
Name="VCCustomBuildTool"
/>
</FileConfiguration>
<FileConfiguration
Name="Debug|Win32"
ExcludedFromBuild="true"
>
<Tool
Name="VCCustomBuildTool"
/>
</FileConfiguration>
<FileConfiguration
Name="Release|x64"
>
@ -1796,6 +1789,14 @@
Outputs="$(IntDir)/$(InputName).obj"
/>
</FileConfiguration>
<FileConfiguration
Name="Debug|Win32"
ExcludedFromBuild="true"
>
<Tool
Name="VCCustomBuildTool"
/>
</FileConfiguration>
<FileConfiguration
Name="Debug|x64"
>
@ -1961,6 +1962,14 @@
Outputs="$(IntDir)\$(InputName).obj"
/>
</FileConfiguration>
<FileConfiguration
Name="Release|x64"
ExcludedFromBuild="true"
>
<Tool
Name="VCCustomBuildTool"
/>
</FileConfiguration>
<FileConfiguration
Name="Debug|Win32"
>
@ -1971,14 +1980,6 @@
Outputs="$(IntDir)\$(InputName).obj"
/>
</FileConfiguration>
<FileConfiguration
Name="Release|x64"
ExcludedFromBuild="true"
>
<Tool
Name="VCCustomBuildTool"
/>
</FileConfiguration>
<FileConfiguration
Name="Debug|x64"
ExcludedFromBuild="true"
@ -2848,6 +2849,14 @@
AdditionalIncludeDirectories="src\win32;$(NoInherit)"
/>
</FileConfiguration>
<FileConfiguration
Name="Release|x64"
>
<Tool
Name="VCResourceCompilerTool"
AdditionalIncludeDirectories="src\win32;$(NoInherit)"
/>
</FileConfiguration>
<FileConfiguration
Name="Debug|Win32"
>
@ -2857,14 +2866,6 @@
AdditionalIncludeDirectories="src\win32;$(NoInherit)"
/>
</FileConfiguration>
<FileConfiguration
Name="Release|x64"
>
<Tool
Name="VCResourceCompilerTool"
AdditionalIncludeDirectories="src\win32;$(NoInherit)"
/>
</FileConfiguration>
<FileConfiguration
Name="Debug|x64"
>
@ -3139,7 +3140,7 @@
/>
</FileConfiguration>
<FileConfiguration
Name="Debug|Win32"
Name="Release|x64"
ExcludedFromBuild="true"
>
<Tool
@ -3147,7 +3148,7 @@
/>
</FileConfiguration>
<FileConfiguration
Name="Release|x64"
Name="Debug|Win32"
ExcludedFromBuild="true"
>
<Tool
@ -3179,7 +3180,7 @@
/>
</FileConfiguration>
<FileConfiguration
Name="Debug|Win32"
Name="Release|x64"
ExcludedFromBuild="true"
>
<Tool
@ -3187,7 +3188,7 @@
/>
</FileConfiguration>
<FileConfiguration
Name="Release|x64"
Name="Debug|Win32"
ExcludedFromBuild="true"
>
<Tool
@ -3216,7 +3217,7 @@
/>
</FileConfiguration>
<FileConfiguration
Name="Debug|Win32"
Name="Release|x64"
ExcludedFromBuild="true"
>
<Tool
@ -3225,7 +3226,7 @@
/>
</FileConfiguration>
<FileConfiguration
Name="Release|x64"
Name="Debug|Win32"
ExcludedFromBuild="true"
>
<Tool
@ -3255,7 +3256,7 @@
/>
</FileConfiguration>
<FileConfiguration
Name="Debug|Win32"
Name="Release|x64"
ExcludedFromBuild="true"
>
<Tool
@ -3263,7 +3264,7 @@
/>
</FileConfiguration>
<FileConfiguration
Name="Release|x64"
Name="Debug|Win32"
ExcludedFromBuild="true"
>
<Tool
@ -3292,7 +3293,7 @@
/>
</FileConfiguration>
<FileConfiguration
Name="Debug|Win32"
Name="Release|x64"
ExcludedFromBuild="true"
>
<Tool
@ -3301,7 +3302,7 @@
/>
</FileConfiguration>
<FileConfiguration
Name="Release|x64"
Name="Debug|Win32"
ExcludedFromBuild="true"
>
<Tool
@ -3332,7 +3333,7 @@
/>
</FileConfiguration>
<FileConfiguration
Name="Debug|Win32"
Name="Release|x64"
ExcludedFromBuild="true"
>
<Tool
@ -3341,7 +3342,7 @@
/>
</FileConfiguration>
<FileConfiguration
Name="Release|x64"
Name="Debug|Win32"
ExcludedFromBuild="true"
>
<Tool
@ -3371,7 +3372,7 @@
/>
</FileConfiguration>
<FileConfiguration
Name="Debug|Win32"
Name="Release|x64"
ExcludedFromBuild="true"
>
<Tool
@ -3379,7 +3380,7 @@
/>
</FileConfiguration>
<FileConfiguration
Name="Release|x64"
Name="Debug|Win32"
ExcludedFromBuild="true"
>
<Tool
@ -3408,7 +3409,7 @@
/>
</FileConfiguration>
<FileConfiguration
Name="Debug|Win32"
Name="Release|x64"
ExcludedFromBuild="true"
>
<Tool
@ -3417,7 +3418,7 @@
/>
</FileConfiguration>
<FileConfiguration
Name="Release|x64"
Name="Debug|Win32"
ExcludedFromBuild="true"
>
<Tool
@ -3448,7 +3449,7 @@
/>
</FileConfiguration>
<FileConfiguration
Name="Debug|Win32"
Name="Release|x64"
ExcludedFromBuild="true"
>
<Tool
@ -3457,7 +3458,7 @@
/>
</FileConfiguration>
<FileConfiguration
Name="Release|x64"
Name="Debug|Win32"
ExcludedFromBuild="true"
>
<Tool
@ -3488,7 +3489,7 @@
/>
</FileConfiguration>
<FileConfiguration
Name="Debug|Win32"
Name="Release|x64"
ExcludedFromBuild="true"
>
<Tool
@ -3497,7 +3498,7 @@
/>
</FileConfiguration>
<FileConfiguration
Name="Release|x64"
Name="Debug|Win32"
ExcludedFromBuild="true"
>
<Tool
@ -3527,7 +3528,7 @@
/>
</FileConfiguration>
<FileConfiguration
Name="Debug|Win32"
Name="Release|x64"
ExcludedFromBuild="true"
>
<Tool
@ -3535,7 +3536,7 @@
/>
</FileConfiguration>
<FileConfiguration
Name="Release|x64"
Name="Debug|Win32"
ExcludedFromBuild="true"
>
<Tool
@ -3563,7 +3564,7 @@
/>
</FileConfiguration>
<FileConfiguration
Name="Debug|Win32"
Name="Release|x64"
ExcludedFromBuild="true"
>
<Tool
@ -3571,7 +3572,7 @@
/>
</FileConfiguration>
<FileConfiguration
Name="Release|x64"
Name="Debug|Win32"
ExcludedFromBuild="true"
>
<Tool
@ -3599,7 +3600,7 @@
/>
</FileConfiguration>
<FileConfiguration
Name="Debug|Win32"
Name="Release|x64"
ExcludedFromBuild="true"
>
<Tool
@ -3607,7 +3608,7 @@
/>
</FileConfiguration>
<FileConfiguration
Name="Release|x64"
Name="Debug|Win32"
ExcludedFromBuild="true"
>
<Tool
@ -3635,7 +3636,7 @@
/>
</FileConfiguration>
<FileConfiguration
Name="Debug|Win32"
Name="Release|x64"
ExcludedFromBuild="true"
>
<Tool
@ -3643,7 +3644,7 @@
/>
</FileConfiguration>
<FileConfiguration
Name="Release|x64"
Name="Debug|Win32"
ExcludedFromBuild="true"
>
<Tool
@ -3673,7 +3674,7 @@
/>
</FileConfiguration>
<FileConfiguration
Name="Debug|Win32"
Name="Release|x64"
ExcludedFromBuild="true"
>
<Tool
@ -3683,7 +3684,7 @@
/>
</FileConfiguration>
<FileConfiguration
Name="Release|x64"
Name="Debug|Win32"
ExcludedFromBuild="true"
>
<Tool
@ -3727,7 +3728,7 @@
/>
</FileConfiguration>
<FileConfiguration
Name="Debug|Win32"
Name="Release|x64"
ExcludedFromBuild="true"
>
<Tool
@ -3735,7 +3736,7 @@
/>
</FileConfiguration>
<FileConfiguration
Name="Release|x64"
Name="Debug|Win32"
ExcludedFromBuild="true"
>
<Tool
@ -3769,7 +3770,7 @@
/>
</FileConfiguration>
<FileConfiguration
Name="Debug|Win32"
Name="Release|x64"
>
<Tool
Name="VCCustomBuildTool"
@ -3779,7 +3780,7 @@
/>
</FileConfiguration>
<FileConfiguration
Name="Release|x64"
Name="Debug|Win32"
>
<Tool
Name="VCCustomBuildTool"