summaryrefslogtreecommitdiff
path: root/utils/vcrtrace
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /utils/vcrtrace
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'utils/vcrtrace')
-rw-r--r--utils/vcrtrace/stdafx.cpp15
-rw-r--r--utils/vcrtrace/stdafx.h33
-rw-r--r--utils/vcrtrace/vcrtrace.cpp661
-rw-r--r--utils/vcrtrace/vcrtrace.vcproj173
4 files changed, 882 insertions, 0 deletions
diff --git a/utils/vcrtrace/stdafx.cpp b/utils/vcrtrace/stdafx.cpp
new file mode 100644
index 0000000..247a20a
--- /dev/null
+++ b/utils/vcrtrace/stdafx.cpp
@@ -0,0 +1,15 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//
+//=============================================================================//
+// stdafx.cpp : source file that includes just the standard includes
+// vcrtrace.pch will be the pre-compiled header
+// stdafx.obj will contain the pre-compiled type information
+
+#include "stdafx.h"
+
+// TODO: reference any additional headers you need in STDAFX.H
+// and not in this file
diff --git a/utils/vcrtrace/stdafx.h b/utils/vcrtrace/stdafx.h
new file mode 100644
index 0000000..0ca1d3a
--- /dev/null
+++ b/utils/vcrtrace/stdafx.h
@@ -0,0 +1,33 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//
+//=============================================================================//
+// stdafx.h : include file for standard system include files,
+// or project specific include files that are used frequently, but
+// are changed infrequently
+//
+
+#if !defined(AFX_STDAFX_H__8DD85263_B744_43D5_A6D3_30438C1410E0__INCLUDED_)
+#define AFX_STDAFX_H__8DD85263_B744_43D5_A6D3_30438C1410E0__INCLUDED_
+
+#if _MSC_VER > 1000
+#pragma once
+#endif // _MSC_VER > 1000
+
+#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
+
+#include <stdio.h>
+#include <windows.h>
+#include <winsock2.h>
+#include <process.h>
+#include <assert.h>
+
+// TODO: reference additional headers your program requires here
+
+//{{AFX_INSERT_LOCATION}}
+// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
+
+#endif // !defined(AFX_STDAFX_H__8DD85263_B744_43D5_A6D3_30438C1410E0__INCLUDED_)
diff --git a/utils/vcrtrace/vcrtrace.cpp b/utils/vcrtrace/vcrtrace.cpp
new file mode 100644
index 0000000..c971782
--- /dev/null
+++ b/utils/vcrtrace/vcrtrace.cpp
@@ -0,0 +1,661 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//
+//=============================================================================//
+// vcrtrace.cpp : Defines the entry point for the console application.
+//
+
+#include "stdafx.h"
+#include <time.h>
+#include "tier0/vcrmode.h"
+#include "tier1/utlvector.h"
+
+
+
+IVCRTrace *g_pTrace = 0;
+
+
+class CVCRHelpers : public IVCRHelpers
+{
+public:
+ virtual void ErrorMessage( const char *pMsg )
+ {
+ Msg("ERROR: %s\n", pMsg);
+ }
+
+ virtual void* GetMainWindow()
+ {
+ return 0;
+ }
+};
+
+static CVCRHelpers g_VCRHelpers;
+
+
+void ErrFunction( char const *pMsg )
+{
+ Msg( "%s", pMsg );
+}
+
+
+typedef struct
+{
+ int m_Message;
+ char const *m_pName;
+} WMessage;
+#define DEFINE_WMESSAGE(x) x, #x
+
+
+// Message table for windows messages.
+WMessage g_WMessages[] =
+{
+ DEFINE_WMESSAGE(WM_NOTIFY),
+ DEFINE_WMESSAGE(WM_INPUTLANGCHANGEREQUEST),
+ DEFINE_WMESSAGE(WM_INPUTLANGCHANGE),
+ DEFINE_WMESSAGE(WM_TCARD),
+ DEFINE_WMESSAGE(WM_HELP),
+ DEFINE_WMESSAGE(WM_USERCHANGED),
+ DEFINE_WMESSAGE(WM_NOTIFYFORMAT),
+ DEFINE_WMESSAGE(NFR_ANSI),
+ DEFINE_WMESSAGE(NFR_UNICODE),
+ DEFINE_WMESSAGE(NF_QUERY),
+ DEFINE_WMESSAGE(NF_REQUERY),
+ DEFINE_WMESSAGE(WM_CONTEXTMENU),
+ DEFINE_WMESSAGE(WM_STYLECHANGING),
+ DEFINE_WMESSAGE(WM_STYLECHANGED),
+ DEFINE_WMESSAGE(WM_DISPLAYCHANGE),
+ DEFINE_WMESSAGE(WM_GETICON),
+ DEFINE_WMESSAGE(WM_SETICON),
+ DEFINE_WMESSAGE(WM_NCCREATE),
+ DEFINE_WMESSAGE(WM_NCDESTROY),
+ DEFINE_WMESSAGE(WM_NCCALCSIZE),
+ DEFINE_WMESSAGE(WM_NCHITTEST),
+ DEFINE_WMESSAGE(WM_NCPAINT),
+ DEFINE_WMESSAGE(WM_NCACTIVATE),
+ DEFINE_WMESSAGE(WM_GETDLGCODE),
+ DEFINE_WMESSAGE(WM_SYNCPAINT),
+ DEFINE_WMESSAGE(WM_NCMOUSEMOVE),
+ DEFINE_WMESSAGE(WM_NCLBUTTONDOWN),
+ DEFINE_WMESSAGE(WM_NCLBUTTONUP),
+ DEFINE_WMESSAGE(WM_NCLBUTTONDBLCLK),
+ DEFINE_WMESSAGE(WM_NCRBUTTONDOWN),
+ DEFINE_WMESSAGE(WM_NCRBUTTONUP),
+ DEFINE_WMESSAGE(WM_NCRBUTTONDBLCLK),
+ DEFINE_WMESSAGE(WM_NCMBUTTONDOWN),
+ DEFINE_WMESSAGE(WM_NCMBUTTONUP),
+ DEFINE_WMESSAGE(WM_NCMBUTTONDBLCLK),
+ DEFINE_WMESSAGE(WM_KEYFIRST),
+ DEFINE_WMESSAGE(WM_KEYDOWN),
+ DEFINE_WMESSAGE(WM_KEYUP),
+ DEFINE_WMESSAGE(WM_CHAR),
+ DEFINE_WMESSAGE(WM_DEADCHAR),
+ DEFINE_WMESSAGE(WM_SYSKEYDOWN),
+ DEFINE_WMESSAGE(WM_SYSKEYUP),
+ DEFINE_WMESSAGE(WM_SYSCHAR),
+ DEFINE_WMESSAGE(WM_SYSDEADCHAR),
+ DEFINE_WMESSAGE(WM_KEYLAST),
+ DEFINE_WMESSAGE(WM_IME_STARTCOMPOSITION),
+ DEFINE_WMESSAGE(WM_IME_ENDCOMPOSITION),
+ DEFINE_WMESSAGE(WM_IME_COMPOSITION),
+ DEFINE_WMESSAGE(WM_IME_KEYLAST),
+ DEFINE_WMESSAGE(WM_INITDIALOG),
+ DEFINE_WMESSAGE(WM_COMMAND),
+ DEFINE_WMESSAGE(WM_SYSCOMMAND),
+ DEFINE_WMESSAGE(WM_TIMER),
+ DEFINE_WMESSAGE(WM_HSCROLL),
+ DEFINE_WMESSAGE(WM_VSCROLL),
+ DEFINE_WMESSAGE(WM_INITMENU),
+ DEFINE_WMESSAGE(WM_INITMENUPOPUP),
+ DEFINE_WMESSAGE(WM_MENUSELECT),
+ DEFINE_WMESSAGE(WM_MENUCHAR),
+ DEFINE_WMESSAGE(WM_ENTERIDLE),
+ DEFINE_WMESSAGE(WM_CTLCOLORMSGBOX),
+ DEFINE_WMESSAGE(WM_CTLCOLOREDIT),
+ DEFINE_WMESSAGE(WM_CTLCOLORLISTBOX),
+ DEFINE_WMESSAGE(WM_CTLCOLORBTN),
+ DEFINE_WMESSAGE(WM_CTLCOLORDLG),
+ DEFINE_WMESSAGE(WM_CTLCOLORSCROLLBAR),
+ DEFINE_WMESSAGE(WM_CTLCOLORSTATIC),
+ DEFINE_WMESSAGE(WM_MOUSEMOVE),
+ DEFINE_WMESSAGE(WM_LBUTTONDOWN),
+ DEFINE_WMESSAGE(WM_LBUTTONUP),
+ DEFINE_WMESSAGE(WM_LBUTTONDBLCLK),
+ DEFINE_WMESSAGE(WM_RBUTTONDOWN),
+ DEFINE_WMESSAGE(WM_RBUTTONUP),
+ DEFINE_WMESSAGE(WM_RBUTTONDBLCLK),
+ DEFINE_WMESSAGE(WM_MBUTTONDOWN),
+ DEFINE_WMESSAGE(WM_MBUTTONUP),
+ DEFINE_WMESSAGE(WM_MBUTTONDBLCLK),
+ DEFINE_WMESSAGE(WM_MOUSELAST),
+ DEFINE_WMESSAGE(WM_PARENTNOTIFY),
+ DEFINE_WMESSAGE(WM_ENTERMENULOOP),
+ DEFINE_WMESSAGE(WM_EXITMENULOOP )
+};
+
+// Message table for winsock messages.
+WMessage g_WinsockMessages[] =
+{
+ DEFINE_WMESSAGE(WSAEWOULDBLOCK),
+ DEFINE_WMESSAGE(WSAEINPROGRESS),
+ DEFINE_WMESSAGE(WSAEALREADY),
+ DEFINE_WMESSAGE(WSAENOTSOCK),
+ DEFINE_WMESSAGE(WSAEDESTADDRREQ),
+ DEFINE_WMESSAGE(WSAEMSGSIZE),
+ DEFINE_WMESSAGE(WSAEPROTOTYPE),
+ DEFINE_WMESSAGE(WSAENOPROTOOPT),
+ DEFINE_WMESSAGE(WSAEPROTONOSUPPORT),
+ DEFINE_WMESSAGE(WSAESOCKTNOSUPPORT),
+ DEFINE_WMESSAGE(WSAEOPNOTSUPP),
+ DEFINE_WMESSAGE(WSAEPFNOSUPPORT),
+ DEFINE_WMESSAGE(WSAEAFNOSUPPORT),
+ DEFINE_WMESSAGE(WSAEADDRINUSE),
+ DEFINE_WMESSAGE(WSAEADDRNOTAVAIL),
+ DEFINE_WMESSAGE(WSAENETDOWN),
+ DEFINE_WMESSAGE(WSAENETUNREACH),
+ DEFINE_WMESSAGE(WSAENETRESET),
+ DEFINE_WMESSAGE(WSAECONNABORTED),
+ DEFINE_WMESSAGE(WSAECONNRESET),
+ DEFINE_WMESSAGE(WSAENOBUFS),
+ DEFINE_WMESSAGE(WSAEISCONN),
+ DEFINE_WMESSAGE(WSAENOTCONN),
+ DEFINE_WMESSAGE(WSAESHUTDOWN),
+ DEFINE_WMESSAGE(WSAETOOMANYREFS),
+ DEFINE_WMESSAGE(WSAETIMEDOUT),
+ DEFINE_WMESSAGE(WSAECONNREFUSED),
+ DEFINE_WMESSAGE(WSAELOOP),
+ DEFINE_WMESSAGE(WSAENAMETOOLONG),
+ DEFINE_WMESSAGE(WSAEHOSTDOWN),
+ DEFINE_WMESSAGE(WSAEHOSTUNREACH),
+ DEFINE_WMESSAGE(WSAENOTEMPTY),
+ DEFINE_WMESSAGE(WSAEPROCLIM),
+ DEFINE_WMESSAGE(WSAEUSERS),
+ DEFINE_WMESSAGE(WSAEDQUOT),
+ DEFINE_WMESSAGE(WSAESTALE),
+ DEFINE_WMESSAGE(WSAEREMOTE),
+ DEFINE_WMESSAGE(WSAEDISCON),
+ DEFINE_WMESSAGE(WSASYSNOTREADY),
+ DEFINE_WMESSAGE(WSAVERNOTSUPPORTED),
+ DEFINE_WMESSAGE(WSANOTINITIALISED)
+};
+
+
+static char const* GetWMessageName(WMessage *pMessages, int nMessages, int msg)
+{
+ static char str[128];
+ int i;
+
+ for(i=0; i < nMessages; i++)
+ {
+ if(pMessages[i].m_Message == msg)
+ return pMessages[i].m_pName;
+ }
+
+ sprintf(str, "%d", msg);
+ return str;
+}
+
+FILE *g_fpTrace = NULL;
+bool g_bEndOfFile = false;
+
+template<class T>
+static void VCRTrace_ReadVal(T &val)
+{
+ if ( fread( &val, 1, sizeof( val ), g_fpTrace ) != sizeof( val ) )
+ g_bEndOfFile = true;
+}
+
+static void VCRTrace_Read( void *pOut, int size )
+{
+ if ( fread( pOut, 1, size, g_fpTrace ) != (size_t)size )
+ g_bEndOfFile = true;
+}
+
+void ReadAndPrintShortString( const char *pFormat )
+{
+ unsigned short len;
+ VCRTrace_ReadVal( len );
+
+ static CUtlVector<char> tempData;
+ if ( tempData.Count() < len )
+ tempData.SetSize( len );
+
+ VCRTrace_Read( tempData.Base(), len );
+ if ( len > 0 && ( tempData[len-2] == '\n' || tempData[len-2] == '\r' ) )
+ tempData[len-2] = 0;
+
+ Msg( pFormat, tempData.Base() );
+}
+
+static void VCR_TraceEvents()
+{
+ int iEvent = 0;
+
+ g_pTrace = g_pVCR->GetVCRTraceInterface();
+
+ while ( !g_bEndOfFile )
+ {
+ ++iEvent;
+
+ unsigned char eventCode;
+ VCRTrace_Read( &eventCode, sizeof( eventCode ) );
+
+ unsigned short iThread = 0;
+ if ( eventCode & 0x80 )
+ {
+ VCRTrace_Read( &iThread, sizeof( iThread ) );
+ eventCode &= ~0x80;
+ }
+
+ Msg( "%5d (thread %d): ", iEvent, iThread );
+
+ VCREvent event = (VCREvent)eventCode;
+ switch(event)
+ {
+ case VCREvent_Sys_FloatTime:
+ {
+ double ret;
+ VCRTrace_Read(&ret, sizeof(ret));
+ Msg("Sys_FloatTime: %f\n", ret);
+ }
+ break;
+
+ case VCREvent_recvfrom:
+ {
+ int ret;
+ char buf[8192];
+
+ VCRTrace_Read(&ret, sizeof(ret));
+
+ Assert(ret < (int)sizeof(buf));
+ if(ret == SOCKET_ERROR)
+ {
+ int err;
+ VCRTrace_ReadVal(err);
+
+ Msg("recvfrom: %d (error %s)\n", ret, GetWMessageName(g_WinsockMessages, sizeof(g_WinsockMessages)/sizeof(g_WinsockMessages[0]), err));
+ }
+ else
+ {
+ Msg("recvfrom: %d\n", ret);
+ VCRTrace_Read(buf, ret);
+
+ char bFrom;
+ VCRTrace_ReadVal( bFrom );
+ if ( bFrom )
+ {
+ sockaddr_in from;
+ VCRTrace_Read( &from, sizeof( from ) );
+ }
+ }
+ }
+ break;
+
+ case VCREvent_SyncToken:
+ {
+ char len;
+ char buf[256];
+
+ VCRTrace_Read(&len, 1);
+ VCRTrace_Read(buf, len);
+ buf[len] = 0;
+
+ Msg("SyncToken: %s\n", buf);
+ }
+ break;
+
+ case VCREvent_GetCursorPos:
+ {
+ POINT pt;
+ VCRTrace_ReadVal(pt);
+ Msg("GetCursorPos: (%d, %d)\n", pt.x, pt.y);
+ }
+ break;
+
+ case VCREvent_SetCursorPos:
+ {
+ int x, y;
+ VCRTrace_Read(&x, sizeof(x));
+ VCRTrace_Read(&y, sizeof(y));
+ Msg("SetCursorPos: (%d, %d)\n", x, y);
+ }
+ break;
+
+ case VCREvent_ScreenToClient:
+ {
+ POINT pt;
+ VCRTrace_ReadVal(pt);
+ Msg("ScreenToClient: (%d, %d)\n", pt.x, pt.y);
+ }
+ break;
+
+ case VCREvent_Cmd_Exec:
+ {
+ int len;
+ char *f;
+
+ VCRTrace_Read(&len, sizeof(len));
+
+ if(len != -1)
+ {
+ f = (char*)malloc(len);
+ VCRTrace_Read(f, len);
+ }
+
+ Msg("Cmd_Exec: %d\n", len);
+ }
+ break;
+
+ case VCREvent_CmdLine:
+ {
+ int len;
+ char str[8192];
+
+ VCRTrace_Read(&len, sizeof(len));
+ Assert(len < sizeof(str));
+ VCRTrace_Read(str, len);
+
+ Msg("CmdLine: %s\n", str);
+ }
+ break;
+
+ case VCREvent_RegOpenKeyEx:
+ {
+ long ret;
+ VCRTrace_ReadVal(ret);
+ Msg("RegOpenKeyEx: %d\n", ret);
+ }
+ break;
+
+ case VCREvent_RegSetValueEx:
+ {
+ long ret;
+ VCRTrace_ReadVal(ret);
+ Msg("RegSetValueEx: %d\n", ret);
+ }
+ break;
+
+ case VCREvent_RegQueryValueEx:
+ {
+ long ret;
+ unsigned long type, cbData;
+ char dummy;
+
+ VCRTrace_ReadVal(ret);
+ VCRTrace_ReadVal(type);
+ VCRTrace_ReadVal(cbData);
+ while(cbData)
+ {
+ VCRTrace_ReadVal(dummy);
+ cbData--;
+ }
+
+ Msg("RegQueryValueEx\n");
+ }
+ break;
+
+ case VCREvent_RegCreateKeyEx:
+ {
+ long ret;
+ VCRTrace_ReadVal(ret);
+ Msg("RegCreateKeyEx: %d\n", ret);
+ }
+ break;
+
+ case VCREvent_RegCloseKey:
+ {
+ Msg("VCREvent_RegCloseKey\n");
+ }
+ break;
+
+ case VCREvent_PeekMessage:
+ {
+ MSG msg;
+ int valid;
+
+ VCRTrace_Read(&valid, sizeof(valid));
+ if(valid)
+ {
+ VCRTrace_Read(&msg, sizeof(MSG));
+ }
+
+ Msg("PeekMessage - msg: %s, wParam: %x, lParam: %x\n", GetWMessageName(g_WMessages, sizeof(g_WMessages)/sizeof(g_WMessages[0]), msg.message), msg.wParam, msg.lParam);
+ }
+ break;
+
+ case VCREvent_GameMsg:
+ {
+ char valid;
+ VCRTrace_Read( &valid, sizeof(valid) );
+
+ if ( valid )
+ {
+ UINT uMsg;
+ WPARAM wParam;
+ LPARAM lParam;
+ VCRTrace_Read( &uMsg, sizeof(uMsg) );
+ VCRTrace_Read( &wParam, sizeof(wParam) );
+ VCRTrace_Read( &lParam, sizeof(lParam) );
+ Msg( "GameMsg - msg: %s, wParam: %x, lParam: %x\n", GetWMessageName(g_WMessages, sizeof(g_WMessages)/sizeof(g_WMessages[0]), uMsg), wParam, lParam );
+ }
+ else
+ {
+ Msg("GameMsg - <end>\n" );
+ }
+ }
+ break;
+
+ case VCREvent_GetNumberOfConsoleInputEvents:
+ {
+ char val;
+ unsigned long nEvents;
+
+ VCRTrace_ReadVal( val );
+ VCRTrace_ReadVal( nEvents );
+
+ Msg( "GetNumberOfConsoleInputEvents (returned %d, nEvents = %d)\n", val, nEvents );
+ }
+ break;
+
+ case VCREvent_ReadConsoleInput:
+ {
+ char val;
+ unsigned long nRead;
+ INPUT_RECORD recs[1024];
+
+ VCRTrace_ReadVal( val );
+ if ( val )
+ {
+ VCRTrace_ReadVal( nRead );
+ VCRTrace_Read( recs, nRead * sizeof( INPUT_RECORD ) );
+ }
+ else
+ {
+ nRead = 0;
+ }
+
+ Msg( "ReadConsoleInput (returned %d, nRead = %d)\n", val, nRead );
+ }
+ break;
+
+ case VCREvent_GetKeyState:
+ {
+ short ret;
+ VCRTrace_ReadVal( ret );
+ Msg( "VCREvent_GetKeyState: %d\n", ret );
+ }
+ break;
+
+ case VCREvent_recv:
+ {
+ int ret;
+
+ // Get the result from our file.
+ VCRTrace_ReadVal( ret );
+ if ( ret == SOCKET_ERROR )
+ {
+ int err;
+ VCRTrace_ReadVal( err );
+ Msg( "VCREvent_recv - SOCKET_ERROR - %d\n", err );
+ }
+ else
+ {
+ CUtlVector<char> dummyData;
+ dummyData.SetSize( ret );
+ VCRTrace_Read( dummyData.Base(), ret );
+ Msg( "VCREvent_recv - size %d", ret );
+ }
+ }
+ break;
+
+ case VCREvent_send:
+ {
+ int ret;
+
+ // Get the result from our file.
+ VCRTrace_ReadVal( ret );
+ if ( ret == SOCKET_ERROR )
+ {
+ int err;
+ VCRTrace_ReadVal(err);
+ Msg( "VCREvent_send - SOCKET_ERROR - %d\n", err );
+ }
+ else
+ {
+ Msg( "VCREvent_send - %d\n", ret );
+ }
+ }
+ break;
+
+ case VCREvent_Generic:
+ {
+ unsigned char nameLen;
+ VCRTrace_ReadVal( nameLen );
+ char testName[512] = "(none)";
+
+ if ( nameLen != 255 )
+ {
+ VCRTrace_Read( testName, nameLen );
+ }
+
+ int dataLen;
+ VCRTrace_ReadVal( dataLen );
+
+ CUtlVector<char> tempData;
+ tempData.SetSize( dataLen );
+ VCRTrace_Read( tempData.Base(), dataLen );
+
+ Msg( "VCREvent_Generic (name: %s, len: %d)\n", testName, dataLen );
+ }
+ break;
+
+ case VCREvent_CreateThread:
+ {
+ Msg( "VCREvent_CreateThread\n" );
+ }
+ break;
+
+ case VCREvent_WaitForSingleObject:
+ {
+ char val;
+ VCRTrace_ReadVal( val );
+
+ Msg( "VCREvent_WaitForSingleObject " );
+ if ( val == 1 )
+ Msg( "(WAIT_OBJECT_0)\n" );
+ else if ( val == 2 )
+ Msg( "(WAIT_ABANDONED)\n" );
+ else
+ Msg( "(WAIT_TIMEOUT)\n" );
+ }
+ break;
+
+ case VCREvent_EnterCriticalSection:
+ {
+ Msg( "VCREvent_EnterCriticalSection\n" );
+ }
+ break;
+
+ case VCREvent_LocalTime:
+ {
+ tm today;
+ VCRTrace_ReadVal( today );
+ Msg( "VCREvent_LocalTime\n" );
+ }
+ break;
+
+ case VCREvent_Time:
+ {
+ long today;
+ VCRTrace_ReadVal( today );
+ Msg( "VCREvent_Time\n" );
+ }
+ break;
+
+ case VCREvent_GenericString:
+ {
+ Msg( "VCREvent_GenericString: " );
+
+ ReadAndPrintShortString( "[%s] " );
+ ReadAndPrintShortString( "%s" );
+ Msg( "\n" );
+ }
+ break;
+
+ default:
+ {
+ Msg( "***ERROR*** VCR_TraceEvent: invalid event" );
+ return;
+ }
+ }
+ }
+}
+
+
+SpewRetval_t MySpewOutput( SpewType_t spewType, tchar const *pMsg )
+{
+ printf( "%s", pMsg );
+ OutputDebugString( pMsg );
+
+ if ( spewType == SPEW_ASSERT )
+ return SPEW_DEBUGGER;
+
+ else if ( spewType == SPEW_ERROR )
+ return SPEW_ABORT;
+
+ else
+ return SPEW_CONTINUE;
+}
+
+
+int main(int argc, char* argv[])
+{
+ if(argc <= 1)
+ {
+ Msg("vcrtrace <vcr filename>\n");
+ return 1;
+ }
+
+ SpewOutputFunc( MySpewOutput );
+
+ g_fpTrace = fopen( argv[1], "rb" );
+ if ( !g_fpTrace )
+ {
+ Msg("Invalid or mission VCR file '%s'\n", argv[1]);
+ return 1;
+ }
+
+ unsigned long version;
+ VCRTrace_ReadVal( version );
+ if ( version != VCRFILE_VERSION )
+ {
+ Msg( "Invalid VCR file version (is %d, but we need %d).\n", version, VCRFILE_VERSION );
+ return 1;
+ }
+
+ VCR_TraceEvents();
+ return 0;
+}
+
diff --git a/utils/vcrtrace/vcrtrace.vcproj b/utils/vcrtrace/vcrtrace.vcproj
new file mode 100644
index 0000000..047086d
--- /dev/null
+++ b/utils/vcrtrace/vcrtrace.vcproj
@@ -0,0 +1,173 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="7.10"
+ Name="vcrtrace"
+ ProjectGUID="{3A726913-1B92-4536-811C-C1E3020CCD1B}"
+ SccProjectName=""
+ SccLocalPath="">
+ <Platforms>
+ <Platform
+ Name="Win32"/>
+ </Platforms>
+ <Configurations>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory=".\Release"
+ IntermediateDirectory=".\Release"
+ ConfigurationType="1"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="FALSE"
+ CharacterSet="2">
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="2"
+ InlineFunctionExpansion="1"
+ AdditionalIncludeDirectories="..\..\engine,..\..\common,..\..\public,..\..\public\tier1"
+ PreprocessorDefinitions="NDEBUG;WIN32;_CONSOLE;VCRTRACE_APP"
+ StringPooling="TRUE"
+ RuntimeLibrary="4"
+ EnableFunctionLevelLinking="TRUE"
+ PrecompiledHeaderFile=".\Release/vcrtrace.pch"
+ AssemblerListingLocation=".\Release/"
+ ObjectFile=".\Release/"
+ ProgramDataBaseFileName=".\Release/"
+ WarningLevel="3"
+ SuppressStartupBanner="TRUE"
+ CompileAs="0"/>
+ <Tool
+ Name="VCCustomBuildTool"/>
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="platform.lib winmm.lib ws2_32.lib odbc32.lib odbccp32.lib"
+ OutputFile=".\Release/vcrtrace.exe"
+ LinkIncremental="1"
+ SuppressStartupBanner="TRUE"
+ AdditionalLibraryDirectories="..\..\lib\public"
+ ProgramDatabaseFile=".\Release/vcrtrace.pdb"
+ SubSystem="1"
+ TargetMachine="1"/>
+ <Tool
+ Name="VCMIDLTool"
+ TypeLibraryName=".\Release/vcrtrace.tlb"
+ HeaderFileName=""/>
+ <Tool
+ Name="VCPostBuildEventTool"/>
+ <Tool
+ Name="VCPreBuildEventTool"/>
+ <Tool
+ Name="VCPreLinkEventTool"/>
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="NDEBUG"
+ Culture="1033"/>
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool
+ Name="VCXMLDataGeneratorTool"/>
+ <Tool
+ Name="VCWebDeploymentTool"/>
+ <Tool
+ Name="VCManagedWrapperGeneratorTool"/>
+ <Tool
+ Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+ </Configuration>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory=".\Debug"
+ IntermediateDirectory=".\Debug"
+ ConfigurationType="1"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="FALSE"
+ CharacterSet="2">
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\..\engine,..\..\common,..\..\public,..\..\public\tier1"
+ PreprocessorDefinitions="_DEBUG;WIN32;_CONSOLE;VCRTRACE_APP"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="5"
+ PrecompiledHeaderFile=".\Debug/vcrtrace.pch"
+ AssemblerListingLocation=".\Debug/"
+ ObjectFile=".\Debug/"
+ ProgramDataBaseFileName=".\Debug/"
+ WarningLevel="3"
+ SuppressStartupBanner="TRUE"
+ DebugInformationFormat="4"
+ CompileAs="0"/>
+ <Tool
+ Name="VCCustomBuildTool"/>
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="platform.lib winmm.lib ws2_32.lib odbc32.lib odbccp32.lib"
+ OutputFile=".\Debug/vcrtrace.exe"
+ LinkIncremental="1"
+ SuppressStartupBanner="TRUE"
+ AdditionalLibraryDirectories="..\..\lib\public"
+ GenerateDebugInformation="TRUE"
+ ProgramDatabaseFile=".\Debug/vcrtrace.pdb"
+ SubSystem="1"
+ TargetMachine="1"/>
+ <Tool
+ Name="VCMIDLTool"
+ TypeLibraryName=".\Debug/vcrtrace.tlb"
+ HeaderFileName=""/>
+ <Tool
+ Name="VCPostBuildEventTool"/>
+ <Tool
+ Name="VCPreBuildEventTool"/>
+ <Tool
+ Name="VCPreLinkEventTool"/>
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="_DEBUG"
+ Culture="1033"/>
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool
+ Name="VCXMLDataGeneratorTool"/>
+ <Tool
+ Name="VCWebDeploymentTool"/>
+ <Tool
+ Name="VCManagedWrapperGeneratorTool"/>
+ <Tool
+ Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat">
+ <File
+ RelativePath="StdAfx.cpp">
+ </File>
+ <File
+ RelativePath="vcrtrace.cpp">
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl">
+ <File
+ RelativePath="StdAfx.h">
+ </File>
+ <File
+ RelativePath="..\..\public\platform\vcr_shared.h">
+ </File>
+ <File
+ RelativePath="..\..\public\platform\vcrmode.h">
+ </File>
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe">
+ </Filter>
+ <File
+ RelativePath="ReadMe.txt">
+ </File>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>