// StructureWrappers.cpp: implementation of the CStructureWrappers class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #pragma warning (disable : 4786) #pragma warning (disable : 4275) #include #include #include #include #include #include using namespace std; #include #include #include #ifdef NONNT5 typedef unsigned long ULONG_PTR; #endif #include #include #include #include #include #include "t_string.h" #include "Utilities.h" #include "Persistor.h" #include "StructureWrappers.h" #include "StructureWapperHelpers.h" #include "ConstantMap.h" ////////////////////////////////////////////////////////////////////// // Wrappers that serialize and de-serialize Event Tracing Data // Structures. ////////////////////////////////////////////////////////////////////// #define MAX_LINE 1024 static TCHAR g_tcNl = _T('\n'); static TCHAR g_tcCR = 0x0d; static TCHAR g_tcLF = 0x0a; #ifdef _UNICODE static TCHAR g_tcDQuote[] = _T("\""); static TCHAR g_atcNL[] = {0x0d, 0x0a, 0x00}; #else static TCHAR g_atcNL[] = {g_tcNl}; static TCHAR g_tcDQuote = _T('"'); #endif CConstantMap g_ConstantMap; ////////////////////////////////////////////////////////////////////// // _EVENT_TRACE_PROPERTIES ////////////////////////////////////////////////////////////////////// CEventTraceProperties::CEventTraceProperties() { m_pProps = NULL; m_bIsNULL = true; } CEventTraceProperties::CEventTraceProperties (PEVENT_TRACE_PROPERTIES pProps) { Initialize(pProps); } CEventTraceProperties::~CEventTraceProperties() { if (m_pProps) { free(m_pProps->LogFileName); m_pProps->LogFileName = NULL; free(m_pProps->LoggerName); m_pProps->LoggerName = NULL; free(m_pProps); m_pProps = NULL; } m_bIsNULL = true; } CEventTraceProperties::CEventTraceProperties(CEventTraceProperties &rhs) { Initialize(rhs.m_pProps); } CEventTraceProperties &CEventTraceProperties::operator= (CEventTraceProperties &rhs) { if ( this != &rhs ) { delete this; Initialize(rhs.m_pProps); } return *this; } #if 0 "_EVENT_TRACE_PROPERTIES Instance Begin" "BufferSize:ULONG:32" "MinimunBuffers:ULONG:2" "MaximunBuffers:ULONG:3" "MaximunFileSize:ULONG:4" "LogFileMode:@#$ENUM:EVENT_TRACE_FILE_MODE_NEWFILE|EVENT_TRACE_REAL_TIME_MODE|@#$UNKNOWNVALUE:0x20" "FlushTimer:ULONG:6" "EnableFlags:@#$ENUM:EVENT_TRACE_FLAG_IMAGE_LOAD|EVENT_TRACE_FLAG_DISK_IO|@#$UNKNOWNVALUE:20" "NumberOfBuffers:ULONG:8" "FreeBuffers:ULONG:9" "EventsLost:ULONG:10" "BuffersWritten:ULONG:11" "LogBuffersLost:ULONG:12" "RealTimeBuffersLost:ULONG:13" "AgeLimit:LONG:-14" "LoggerThreadId:HANDLE:0000000F" "LogFileName:TCHAR*:Log file name" "LoggerName:TCHAR*:Logger name" "_EVENT_TRACE_PROPERTIES Instance End" #endif void CEventTraceProperties::InitializeMemberVar(TCHAR *tcBuffer, int nVar) { int nDebug = 0; if (nVar == 17 || nVar == 18) { nDebug = nVar; } t_string tsTemp; tsTemp = tcBuffer; int nPos = tsTemp.find(_T(":"), 0); // The first character in the type. int nPosType = nPos + 1; if (nPos == t_string::npos) { m_bDeSerializationOK = false; return; } nPos = tsTemp.find(_T(":"), nPos + 1); t_string tsType; tsType = tsTemp.substr(nPosType,nPos - nPosType); // The first chatacter in the value. ++nPos; t_string tsValue; tsValue = tsTemp.substr(nPos, (tsTemp.length() - nPos) - 1); // a TCHAR * value if (tsType.compare(_T("TCHAR*")) == 0) { InitializeTCHARVar(tsValue ,m_pVarArray[nVar]); } // A #define value else if (tsType.compare(_T("@#$ENUM")) == 0) { InitializeEnumVar(tsValue , m_pVarArray[nVar]); } // A HEX else if (tsType.compare(_T("HANDLE")) == 0) { InitializeHandleVar(tsValue , m_pVarArray[nVar]); } // An unsigned value else if (tsType.compare(_T("ULONG")) == 0) { InitializeULONGVar(tsValue , m_pVarArray[nVar]); } // A long value else if (tsType.compare(_T("LONG")) == 0) { InitializeLONGVar(tsValue , m_pVarArray[nVar]); } // A long value else if (tsType.compare(_T("GUID")) == 0) { InitializeGUIDVar(tsValue , m_pVarArray[nVar]); } } void CEventTraceProperties::Initialize (PEVENT_TRACE_PROPERTIES pProps) { m_bDeSerializationOK = true; if (pProps == NULL) { m_pProps = NULL; m_bIsNULL = true; } m_pProps = (EVENT_TRACE_PROPERTIES *) malloc (sizeof(EVENT_TRACE_PROPERTIES)); RtlZeroMemory(m_pProps, sizeof(EVENT_TRACE_PROPERTIES)); *m_pProps = *pProps; m_pProps -> LogFileName = pProps -> LogFileName ? NewTCHAR(pProps -> LogFileName) : NULL; m_pProps -> LoggerName = pProps -> LoggerName ? NewTCHAR(pProps -> LoggerName) : NULL; m_pProps -> Wnode.BufferSize = sizeof(*m_pProps); m_bIsNULL = false; } PEVENT_TRACE_PROPERTIES CEventTraceProperties::GetEventTracePropertiesInstance() { if (m_pProps == NULL) { return NULL; } EVENT_TRACE_PROPERTIES *pProps = (EVENT_TRACE_PROPERTIES *) malloc (sizeof(EVENT_TRACE_PROPERTIES)); RtlZeroMemory(pProps, sizeof(EVENT_TRACE_PROPERTIES)); *pProps = *m_pProps; pProps -> LogFileName = m_pProps -> LogFileName ? NewTCHAR(m_pProps -> LogFileName) : NULL; pProps -> LoggerName = m_pProps -> LoggerName ? NewTCHAR(m_pProps -> LoggerName) : NULL; int n1 = sizeof(*pProps); int n2 = sizeof(EVENT_TRACE_PROPERTIES); pProps -> Wnode.BufferSize = sizeof(*pProps); return pProps; } HRESULT CEventTraceProperties::Persist (CPersistor &rPersistor) { if (rPersistor.IsLoading()) { rPersistor.Stream() >> *this; } else { rPersistor.Stream() << *this; } return S_OK; } t_ostream& operator<<(t_ostream &ros, const CEventTraceProperties &r) { t_string tsOut; tsOut = _T("\"_EVENT_TRACE_PROPERTIES Instance Begin\"\n"); PutALine(ros, tsOut.c_str()); // "Wnode.Guid:GUID:{0000cbd1-0011-11d0-0d00-00aa006d010a}" // "Wnode.Flags:@#$ENUM:WNODE_FLAG_ALL_DATA" tsOut = _T("\"Wnode.Guid:GUID:"); PutALine(ros, tsOut.c_str()); GUIDOut(ros, r.m_pProps -> Wnode.Guid); tsOut = g_tcDQuote; tsOut += g_atcNL; PutALine(ros, tsOut.c_str()); WnodeFlagsOut(ros, r.m_pProps -> Wnode.Flags); tsOut = _T("\"BufferSize:ULONG:"); PutALine(ros, tsOut.c_str()); PutAULONGVar(ros, r.m_pProps -> BufferSize); tsOut = g_tcDQuote; tsOut += g_atcNL; PutALine(ros, tsOut.c_str()); tsOut = _T("\"MinimunBuffers:ULONG:"); PutALine(ros, tsOut.c_str()); PutAULONGVar(ros, r.m_pProps -> MinimumBuffers); tsOut = g_tcDQuote; tsOut += g_atcNL; PutALine(ros, tsOut.c_str()); tsOut = _T("\"MaximunBuffers:ULONG:"); PutALine(ros, tsOut.c_str()); PutAULONGVar(ros, r.m_pProps -> MaximumBuffers); tsOut = g_tcDQuote; tsOut += g_atcNL; PutALine(ros, tsOut.c_str()); tsOut = _T("\"MaximunFileSize:ULONG:"); PutALine(ros, tsOut.c_str()); PutAULONGVar(ros, r.m_pProps -> MaximumFileSize); tsOut = g_tcDQuote; tsOut += g_atcNL; PutALine(ros, tsOut.c_str()); LogFileModeOut(ros, r.m_pProps -> LogFileMode ); tsOut = _T("\"FlushTimer:ULONG:"); PutALine(ros, tsOut.c_str()); PutAULONGVar(ros, r.m_pProps -> FlushTimer); tsOut = g_tcDQuote; tsOut += g_atcNL; PutALine(ros, tsOut.c_str()); EnableFlagsOut(ros,r.m_pProps -> EnableFlags); // ros << _T("\"NumberOfBuffers:ULONG:") << r.m_pProps -> NumberOfBuffers << g_tcDQuote << g_atcNL; tsOut = _T("\"NumberOfBuffers:ULONG:"); PutALine(ros, tsOut.c_str()); PutAULONGVar(ros, r.m_pProps -> NumberOfBuffers); tsOut = g_tcDQuote; tsOut += g_atcNL; PutALine(ros, tsOut.c_str()); // ros << _T("\"FreeBuffers:ULONG:") << r.m_pProps -> FreeBuffers << g_tcDQuote << g_atcNL; tsOut = _T("\"FreeBuffers:ULONG:"); PutALine(ros, tsOut.c_str()); PutAULONGVar(ros, r.m_pProps -> FreeBuffers); tsOut = g_tcDQuote; tsOut += g_atcNL; PutALine(ros, tsOut.c_str()); // ros << _T("\"EventsLost:ULONG:") << r.m_pProps -> EventsLost << g_tcDQuote << g_atcNL; tsOut = _T("\"EventsLost:ULONG:"); PutALine(ros, tsOut.c_str()); PutAULONGVar(ros, r.m_pProps -> EventsLost); tsOut = g_tcDQuote; tsOut += g_atcNL; PutALine(ros, tsOut.c_str()); // ros << _T("\"BuffersWritten:ULONG:") << r.m_pProps -> BuffersWritten << g_tcDQuote << g_atcNL; tsOut = _T("\"BuffersWritten:ULONG:"); PutALine(ros, tsOut.c_str()); PutAULONGVar(ros, r.m_pProps -> BuffersWritten); tsOut = g_tcDQuote; tsOut += g_atcNL; PutALine(ros, tsOut.c_str()); // ros << _T("\"LogBuffersLost:ULONG:") << r.m_pProps -> LogBuffersLost << g_tcDQuote << g_atcNL; tsOut = _T("\"LogBuffersLost:ULONG:"); PutALine(ros, tsOut.c_str()); PutAULONGVar(ros, r.m_pProps -> LogBuffersLost); tsOut = g_tcDQuote; tsOut += g_atcNL; PutALine(ros, tsOut.c_str()); // ros << _T("\"RealTimeBuffersLost:ULONG:") << r.m_pProps -> RealTimeBuffersLost << g_tcDQuote < RealTimeBuffersLost); tsOut = g_tcDQuote; tsOut += g_atcNL; PutALine(ros, tsOut.c_str()); // ros << _T("\"AgeLimit:LONG:") << r.m_pProps -> AgeLimit << g_tcDQuote < AgeLimit); tsOut = g_tcDQuote; tsOut += g_atcNL; PutALine(ros, tsOut.c_str()); // Handles are in hex. // ros << _T("\"LoggerThreadId:HANDLE:0x") << r.m_pProps -> LoggerThreadId << g_tcDQuote < LoggerThreadId, true); tsOut = g_tcDQuote; tsOut += g_atcNL; PutALine(ros, tsOut.c_str()); // ros << _T("\"LogFileName:TCHAR*:") << r.m_pProps -> LogFileName << g_tcDQuote < LogFileName) { tsOut += r.m_pProps -> LogFileName; } tsOut += g_tcDQuote; tsOut += g_atcNL; PutALine(ros, tsOut.c_str()); // ros << _T("\"LoggerName:TCHAR*:") << r.m_pProps -> LoggerName << g_tcDQuote < LoggerName) { tsOut += r.m_pProps -> LoggerName; } tsOut += g_tcDQuote; tsOut += g_atcNL; PutALine(ros, tsOut.c_str()); tsOut = _T("\"_EVENT_TRACE_PROPERTIES Instance End\"\n"); PutALine(ros, tsOut.c_str()); return ros; } t_istream& operator>>(t_istream &ris,CEventTraceProperties &r) { r.m_bDeSerializationOK = true; // We are doing line oriented serailization and assume that // a line in the stream is 1024 or less TCHARS. TCHAR *ptcBuffer = (TCHAR *) malloc(MAX_LINE * sizeof(TCHAR)); GetALine(ris, ptcBuffer,MAX_LINE); if (_tcscmp(ptcBuffer,_T("\"_EVENT_TRACE_PROPERTIES Instance NULL\"")) == 0) { r.~CEventTraceProperties(); r.m_bDeSerializationOK = false; free(ptcBuffer); return ris; } if (_tcscmp(ptcBuffer,_T("\"_EVENT_TRACE_PROPERTIES Instance Begin\"")) != 0) { r.m_bDeSerializationOK = false; free(ptcBuffer); return ris; } r.~CEventTraceProperties(); r.m_pProps = (EVENT_TRACE_PROPERTIES *) malloc (sizeof(EVENT_TRACE_PROPERTIES)); RtlZeroMemory(r.m_pProps, sizeof(EVENT_TRACE_PROPERTIES)); r.m_pProps->Wnode.BufferSize = sizeof(EVENT_TRACE_PROPERTIES); // "Wnode.Guid:GUID:{0000cbd1-0011-11d0-0d00-00aa006d010a}" // "Wnode.Flags:@#$ENUM:WNODE_FLAG_ALL_DATA" r.m_pVarArray[0] = &r.m_pProps->Wnode.Guid; r.m_pVarArray[1] = &r.m_pProps->Wnode.Flags; r.m_pVarArray[2] = &r.m_pProps->BufferSize; r.m_pVarArray[3] = &r.m_pProps->MinimumBuffers; r.m_pVarArray[4] = &r.m_pProps->MaximumBuffers; r.m_pVarArray[5] = &r.m_pProps->MaximumFileSize; r.m_pVarArray[6] = &r.m_pProps->LogFileMode; r.m_pVarArray[7] = &r.m_pProps->FlushTimer; r.m_pVarArray[8] = &r.m_pProps->EnableFlags; r.m_pVarArray[9] = &r.m_pProps->NumberOfBuffers; r.m_pVarArray[10] = &r.m_pProps->FreeBuffers; r.m_pVarArray[11] = &r.m_pProps->EventsLost; r.m_pVarArray[12] = &r.m_pProps->BuffersWritten; r.m_pVarArray[13] = &r.m_pProps->LogBuffersLost; r.m_pVarArray[14] = &r.m_pProps->RealTimeBuffersLost; r.m_pVarArray[15] = &r.m_pProps->AgeLimit; r.m_pVarArray[16] = &r.m_pProps->LoggerThreadId; r.m_pVarArray[17] = &r.m_pProps->LogFileName; r.m_pVarArray[18] = &r.m_pProps->LoggerName; int n = 0; while (n < 19 && GetALine(ris,ptcBuffer,MAX_LINE)) { r.InitializeMemberVar(ptcBuffer,n++); } // Consume end of Props GetALine(ris,ptcBuffer,MAX_LINE); free(ptcBuffer); BOOL bHeapGood = HeapValidate(GetProcessHeap(), 0, NULL); return ris; }