/*
Copyright 2015-2016 Amebis
Copyright 2016 GÉANT
This file is part of GÉANTLink.
GÉANTLink is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
GÉANTLink is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with GÉANTLink. If not, see .
*/
#include "StdAfx.h"
//#pragma comment(lib, "tdh.lib")
//#pragma comment(lib, "Ws2_32.lib")
//
//using namespace std;
//using namespace winstd;
//
//static vector g_traces;
//
//
//static BOOL WINAPI ConsoleHandler(_In_ DWORD dwCtrlType)
//{
// switch(dwCtrlType) {
// case CTRL_C_EVENT:
// case CTRL_BREAK_EVENT:
// case CTRL_CLOSE_EVENT:
// case CTRL_LOGOFF_EVENT:
// case CTRL_SHUTDOWN_EVENT:
// for (vector::const_iterator trace = g_traces.cbegin(), trace_end = g_traces.cend(); trace != trace_end; ++trace)
// CloseTrace(*trace);
// }
// return TRUE;
//}
//
//
//static tstring MapToString(_In_ const EVENT_MAP_INFO *pMapInfo, _In_ LPCBYTE pData)
//{
// if ( (pMapInfo->Flag & EVENTMAP_INFO_FLAG_MANIFEST_VALUEMAP) ||
// ((pMapInfo->Flag & EVENTMAP_INFO_FLAG_WBEM_VALUEMAP ) && (pMapInfo->Flag & ~EVENTMAP_INFO_FLAG_WBEM_VALUEMAP) != EVENTMAP_INFO_FLAG_WBEM_FLAG))
// {
// if ((pMapInfo->Flag & EVENTMAP_INFO_FLAG_WBEM_NO_MAP) == EVENTMAP_INFO_FLAG_WBEM_NO_MAP)
// return tstring_printf(_T("%ls"), (PBYTE)pMapInfo + pMapInfo->MapEntryArray[*(PULONG)pData].OutputOffset);
// else {
// for (ULONG i = 0; ; i++) {
// if (i >= pMapInfo->EntryCount)
// return tstring_printf(_T("%lu"), *(PULONG)pData);
// else if (pMapInfo->MapEntryArray[i].Value == *(PULONG)pData)
// return tstring_printf(_T("%ls"), (PBYTE)pMapInfo + pMapInfo->MapEntryArray[i].OutputOffset);
// }
// }
// } else if (
// (pMapInfo->Flag & EVENTMAP_INFO_FLAG_MANIFEST_BITMAP) ||
// (pMapInfo->Flag & EVENTMAP_INFO_FLAG_WBEM_BITMAP ) ||
// ((pMapInfo->Flag & EVENTMAP_INFO_FLAG_WBEM_VALUEMAP ) && (pMapInfo->Flag & ~EVENTMAP_INFO_FLAG_WBEM_VALUEMAP) == EVENTMAP_INFO_FLAG_WBEM_FLAG))
// {
// tstring out;
//
// if (pMapInfo->Flag & EVENTMAP_INFO_FLAG_WBEM_NO_MAP) {
// for (ULONG i = 0; i < pMapInfo->EntryCount; i++)
// if (*(PULONG)pData & (1 << i))
// out.append(tstring_printf(out.empty() ? _T("%ls") : _T(" | %ls"), (PBYTE)pMapInfo + pMapInfo->MapEntryArray[i].OutputOffset));
// } else {
// for (ULONG i = 0; i < pMapInfo->EntryCount; i++)
// if ((pMapInfo->MapEntryArray[i].Value & *(PULONG)pData) == pMapInfo->MapEntryArray[i].Value)
// out.append(tstring_printf(out.empty() ? _T("%ls") : _T(" | %ls"), (PBYTE)pMapInfo + pMapInfo->MapEntryArray[i].OutputOffset));
// }
//
// return out.empty() ? tstring_printf(_T("%lu"), *(PULONG)pData) : out;
// }
//
// return _T("");
//}
//
//
//static tstring DataToString(_In_ USHORT InType, _In_ USHORT OutType, _In_count_(nDataSize) LPCBYTE pData, _In_ SIZE_T nDataSize, _In_ const EVENT_MAP_INFO *pMapInfo, _In_ BYTE nPtrSize)
//{
// assert(pData || !nDataSize);
//
// switch (InType) {
// case TDH_INTYPE_UNICODESTRING:
// case TDH_INTYPE_NONNULLTERMINATEDSTRING:
// case TDH_INTYPE_UNICODECHAR:
// return tstring_printf(_T("%.*ls"), nDataSize/sizeof(WCHAR), pData);
//
// case TDH_INTYPE_ANSISTRING:
// case TDH_INTYPE_NONNULLTERMINATEDANSISTRING:
// case TDH_INTYPE_ANSICHAR: {
// // Convert strings from ANSI code page, all others (JSON, XML etc.) from UTF-8
// wstring str;
// MultiByteToWideChar(OutType == TDH_OUTTYPE_STRING ? CP_ACP : CP_UTF8, 0, (LPCSTR)pData, (int)nDataSize, str);
// return tstring_printf(_T("%ls"), str.c_str());
// }
//
// case TDH_INTYPE_COUNTEDSTRING:
// return DataToString(TDH_INTYPE_NONNULLTERMINATEDSTRING, OutType, (LPCBYTE)((PUSHORT)pData + 1), *(PUSHORT)pData, pMapInfo, nPtrSize);
//
// case TDH_INTYPE_COUNTEDANSISTRING:
// return DataToString(TDH_INTYPE_NONNULLTERMINATEDANSISTRING, OutType, (LPCBYTE)((PUSHORT)pData + 1), *(PUSHORT)pData, pMapInfo, nPtrSize);
//
// case TDH_INTYPE_REVERSEDCOUNTEDSTRING:
// return DataToString(TDH_INTYPE_NONNULLTERMINATEDSTRING, OutType, (LPCBYTE)((PUSHORT)pData + 1), MAKEWORD(HIBYTE(*(PUSHORT)pData), LOBYTE(*(PUSHORT)pData)), pMapInfo, nPtrSize);
//
// case TDH_INTYPE_REVERSEDCOUNTEDANSISTRING:
// return DataToString(TDH_INTYPE_NONNULLTERMINATEDANSISTRING, OutType, (LPCBYTE)((PUSHORT)pData + 1), MAKEWORD(HIBYTE(*(PUSHORT)pData), LOBYTE(*(PUSHORT)pData)), pMapInfo, nPtrSize);
//
// case TDH_INTYPE_INT8:
// assert(nDataSize >= sizeof(CHAR));
// switch (OutType) {
// case TDH_OUTTYPE_STRING: return DataToString(TDH_INTYPE_ANSICHAR, TDH_OUTTYPE_NULL, pData, nDataSize, pMapInfo, nPtrSize);
// default : return tstring_printf(_T("%hd"), *(PCHAR)pData);
// }
//
// case TDH_INTYPE_UINT8:
// assert(nDataSize >= sizeof(BYTE));
// switch (OutType) {
// case TDH_OUTTYPE_STRING : return DataToString(TDH_INTYPE_ANSICHAR, TDH_OUTTYPE_NULL, pData, nDataSize, pMapInfo, nPtrSize);
// case TDH_OUTTYPE_HEXINT8: return tstring_printf(_T("0x%x"), *(PBYTE)pData);
// default : return tstring_printf(_T("%hu" ), *(PBYTE)pData);
// }
//
// case TDH_INTYPE_INT16:
// assert(nDataSize >= sizeof(SHORT));
// return tstring_printf(_T("%hd"), *(PSHORT)pData);
//
// case TDH_INTYPE_UINT16:
// assert(nDataSize >= sizeof(USHORT));
// switch (OutType) {
// case TDH_OUTTYPE_PORT : return tstring_printf(_T("%hu" ), ntohs(*(PUSHORT)pData));
// case TDH_OUTTYPE_HEXINT16: return tstring_printf(_T("0x%x"), *(PUSHORT)pData );
// case TDH_OUTTYPE_STRING : return tstring_printf(_T("%lc" ), *(PUSHORT)pData );
// default : return tstring_printf(_T("%hu" ), *(PUSHORT)pData );
// }
//
// case TDH_INTYPE_INT32:
// assert(nDataSize >= sizeof(LONG));
// switch (OutType) {
// case TDH_OUTTYPE_HRESULT: return tstring_printf(_T("0x%x"), *(PLONG)pData);
// default : return tstring_printf(_T("%ld" ), *(PLONG)pData);
// }
//
// case TDH_INTYPE_UINT32:
// assert(nDataSize >= sizeof(ULONG));
// switch (OutType) {
// case TDH_OUTTYPE_HRESULT :
// case TDH_OUTTYPE_WIN32ERROR:
// case TDH_OUTTYPE_NTSTATUS :
// case TDH_OUTTYPE_HEXINT32 : return tstring_printf(_T("0x%x" ), *(PULONG)pData);
// case TDH_OUTTYPE_IPV4 : return tstring_printf(_T("%d.%d.%d.%d"), (*(PULONG)pData >> 0) & 0xff, (*(PULONG)pData >> 8) & 0xff, (*(PULONG)pData >> 16) & 0xff, (*(PULONG)pData >> 24) & 0xff);
// default: return pMapInfo ? MapToString(pMapInfo, pData) : tstring_printf(_T("%lu"), *(PULONG)pData);
// }
//
// case TDH_INTYPE_HEXINT32:
// return DataToString(TDH_INTYPE_UINT32, TDH_OUTTYPE_HEXINT32, pData, nDataSize, pMapInfo, nPtrSize);
//
// case TDH_INTYPE_INT64:
// assert(nDataSize >= sizeof(LONGLONG));
// return tstring_printf(_T("%I64d"), *(PLONGLONG)pData);
//
// case TDH_INTYPE_UINT64:
// assert(nDataSize >= sizeof(ULONGLONG));
// switch (OutType) {
// case TDH_OUTTYPE_HEXINT64: return tstring_printf(_T("0x%I64x"), *(PULONGLONG)pData);
// default : return tstring_printf(_T("%I64u" ), *(PULONGLONG)pData);
// }
//
// case TDH_INTYPE_HEXINT64:
// return DataToString(TDH_INTYPE_UINT64, TDH_OUTTYPE_HEXINT64, pData, nDataSize, pMapInfo, nPtrSize);
//
// case TDH_INTYPE_FLOAT:
// assert(nDataSize >= sizeof(FLOAT));
// return tstring_printf(_T("%f"), *(PFLOAT)pData);
//
// case TDH_INTYPE_DOUBLE:
// assert(nDataSize >= sizeof(DOUBLE));
// return tstring_printf(_T("%I64f"), *(DOUBLE*)pData);
//
// case TDH_INTYPE_BOOLEAN:
// assert(nDataSize >= sizeof(ULONG)); // Yes, boolean is really 32-bit.
// return *(PULONG)pData ? _T("true") : _T("false");
//
// case TDH_INTYPE_BINARY:
// switch (OutType) {
// case TDH_OUTTYPE_IPV6: {
// auto RtlIpv6AddressToString = (LPTSTR(NTAPI*)(const IN6_ADDR*, LPTSTR))GetProcAddress(GetModuleHandle(_T("ntdll.dll")),
//#ifdef _UNICODE
// "RtlIpv6AddressToStringW"
//#else
// "RtlIpv6AddressToStringA"
//#endif
// );
// if (RtlIpv6AddressToString) {
// TCHAR szIPv6Addr[47];
// RtlIpv6AddressToString((IN6_ADDR*)pData, szIPv6Addr);
// return tstring_printf(_T("%s"), szIPv6Addr);
// } else
// return _T("");
// }
// default: {
// tstring out;
// for (SIZE_T i = 0; i < nDataSize; i++)
// out.append(tstring_printf(i ? _T(" %02x") : _T("%02x"), pData[i]));
// return out;
// }}
//
// case TDH_INTYPE_HEXDUMP:
// return DataToString(TDH_INTYPE_BINARY, TDH_OUTTYPE_NULL, pData, nDataSize, pMapInfo, nPtrSize);
//
// case TDH_INTYPE_GUID: {
// assert(nDataSize >= sizeof(GUID));
// WCHAR szGuid[39];
// StringFromGUID2(*(GUID*)pData, szGuid, _countof(szGuid));
// return tstring_printf(_T("%ls"), szGuid);
// }
//
// case TDH_INTYPE_POINTER:
// assert(nDataSize >= nPtrSize);
// switch (nPtrSize) {
// case sizeof(ULONG ): return tstring_printf(_T("0x%08x" ), *(PULONG )pData);
// case sizeof(ULONGLONG): return tstring_printf(_T("0x%016I64x"), *(PULONGLONG)pData);
// default: // Unsupported pointer size.
// assert(0);
// return _T("");
// }
//
// case TDH_INTYPE_SIZET:
// assert(nDataSize >= nPtrSize);
// switch (nPtrSize) {
// case sizeof(ULONG ): return tstring_printf(_T("%u" ), *(PULONG )pData);
// case sizeof(ULONGLONG): return tstring_printf(_T("%I64u"), *(PULONGLONG)pData);
// default: // Unsupported size_t size.
// assert(0);
// return _T("");
// }
//
// case TDH_INTYPE_FILETIME: {
// assert(nDataSize >= sizeof(FILETIME));
// SYSTEMTIME st, st_local;
// FileTimeToSystemTime((PFILETIME)pData, &st);
// SystemTimeToTzSpecificLocalTime(NULL, &st, &st_local);
// return DataToString(TDH_INTYPE_SYSTEMTIME, OutType, (LPCBYTE)&st_local, sizeof(st_local), pMapInfo, nPtrSize);
// }
//
// case TDH_INTYPE_SYSTEMTIME:
// assert(nDataSize >= sizeof(SYSTEMTIME));
// switch (OutType) {
// case TDH_OUTTYPE_CULTURE_INSENSITIVE_DATETIME: return tstring_printf(_T("%04d-%02d-%02d %02d:%02d:%02d.%03u"), ((PSYSTEMTIME)pData)->wYear, ((PSYSTEMTIME)pData)->wMonth, ((PSYSTEMTIME)pData)->wDay, ((PSYSTEMTIME)pData)->wHour, ((PSYSTEMTIME)pData)->wMinute, ((PSYSTEMTIME)pData)->wSecond, ((PSYSTEMTIME)pData)->wMilliseconds);
// default: {
// tstring out;
// return GetDateFormat(LOCALE_USER_DEFAULT, DATE_LONGDATE, (PSYSTEMTIME)pData, NULL, out) ? out : tstring(_T("