diff --git a/EventMonitor/.gitignore b/EventMonitor/.gitignore
new file mode 100644
index 0000000..9c8716a
--- /dev/null
+++ b/EventMonitor/.gitignore
@@ -0,0 +1,2 @@
+/temp
+/*.user
diff --git a/EventMonitor/EventMonitor.props b/EventMonitor/EventMonitor.props
new file mode 100644
index 0000000..1f4e4d0
--- /dev/null
+++ b/EventMonitor/EventMonitor.props
@@ -0,0 +1,18 @@
+
+
+
+
+
+ ..\output\$(Platform).$(Configuration)\
+
+
+
+ ..\lib\Events\build\temp\Events.$(Platform).$(Configuration).$(PlatformToolset);..\lib\WinStd\include;%(AdditionalIncludeDirectories)
+ _CONSOLE;%(PreprocessorDefinitions)
+
+
+ Console
+
+
+
+
\ No newline at end of file
diff --git a/EventMonitor/EventMonitor.rc b/EventMonitor/EventMonitor.rc
new file mode 100644
index 0000000..f4ede9b
Binary files /dev/null and b/EventMonitor/EventMonitor.rc differ
diff --git a/EventMonitor/EventMonitor.vcxproj b/EventMonitor/EventMonitor.vcxproj
new file mode 100644
index 0000000..8a1fc3d
--- /dev/null
+++ b/EventMonitor/EventMonitor.vcxproj
@@ -0,0 +1,114 @@
+
+
+
+
+ Debug
+ Win32
+
+
+ Debug
+ x64
+
+
+ Release
+ Win32
+
+
+ Release
+ x64
+
+
+
+ {E0D0725B-B2FC-4225-9481-CA9B1B6306F2}
+ Win32Proj
+ EventMonitor
+
+
+
+ Application
+ true
+ Unicode
+
+
+ Application
+ true
+ Unicode
+
+
+ Application
+ false
+ true
+ Unicode
+
+
+ Application
+ false
+ true
+ Unicode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Create
+ Create
+ Create
+ Create
+
+
+
+
+ {d63f24bd-92a0-4d6b-8b69-ed947e4d2b1b}
+
+
+ {47399d91-7eb9-41de-b521-514ba5db0c43}
+
+
+
+
+
+
\ No newline at end of file
diff --git a/EventMonitor/EventMonitor.vcxproj.filters b/EventMonitor/EventMonitor.vcxproj.filters
new file mode 100644
index 0000000..c2bbbec
--- /dev/null
+++ b/EventMonitor/EventMonitor.vcxproj.filters
@@ -0,0 +1,38 @@
+
+
+
+
+ {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
+ cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx
+
+
+ {93995380-89BD-4b04-88EB-625FBE52EBFB}
+ h;hpp;hxx;hm;inl;inc;xsd
+
+
+ {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
+ rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms
+
+
+
+
+ Resource Files
+
+
+
+
+ Header Files
+
+
+
+
+
+
+
+ Source Files
+
+
+ Source Files
+
+
+
\ No newline at end of file
diff --git a/EventMonitor/Main.cpp b/EventMonitor/Main.cpp
new file mode 100644
index 0000000..504a4b5
--- /dev/null
+++ b/EventMonitor/Main.cpp
@@ -0,0 +1,132 @@
+/*
+ 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"
+
+using namespace std;
+using namespace winstd;
+
+// {B963A9BE-2D21-4A4C-BE47-10490AD63AB9}
+static const GUID g_session_id =
+{ 0xb963a9be, 0x2d21, 0x4a4c, { 0xbe, 0x47, 0x10, 0x49, 0xa, 0xd6, 0x3a, 0xb9 } };
+
+
+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 VOID WINAPI EventRecordCallback(_In_ PEVENT_RECORD EventRecord)
+{
+ UNREFERENCED_PARAMETER(EventRecord);
+}
+
+
+#ifdef _UNICODE
+int wmain(int argc, const wchar_t *argv[])
+#else
+int main(int argc, const char *argv[])
+#endif
+{
+ UNREFERENCED_PARAMETER(argc);
+ UNREFERENCED_PARAMETER(argv);
+
+ ULONG ulResult;
+ event_session session;
+
+ for (unsigned int i = 0; ; i++) {
+ //tstring log_file(tstring_printf(i ? _T("test.etl") : _T("test %u.etl"), i));
+ tstring name(tstring_printf(i ? _T(PRODUCT_NAME_STR) _T(" Event Monitor Session %u") : _T(PRODUCT_NAME_STR) _T(" Event Monitor Session"), i));
+
+ // Allocate session properties.
+ ULONG
+ ulSizeName = (ULONG)((name .length() + 1)*sizeof(TCHAR)),
+ //ulSizeLogFile = (ULONG)((log_file.length() + 1)*sizeof(TCHAR)),
+ ulSize = sizeof(EVENT_TRACE_PROPERTIES) + ulSizeName /*+ ulSizeLogFile*/;
+ unique_ptr properties((EVENT_TRACE_PROPERTIES*)new char[ulSize]);
+ if (!properties) {
+ _ftprintf(stderr, _T("Error allocating session properties memory.\n"));
+ return 1;
+ }
+
+ // Initialize properties.
+ memset(properties.get(), 0, sizeof(EVENT_TRACE_PROPERTIES));
+ properties->Wnode.BufferSize = ulSize;
+ properties->Wnode.Flags = WNODE_FLAG_TRACED_GUID;
+ properties->Wnode.ClientContext = 1; //QPC clock resolution
+ properties->Wnode.Guid = g_session_id;
+ properties->LogFileMode = /*EVENT_TRACE_FILE_MODE_SEQUENTIAL |*/ EVENT_TRACE_REAL_TIME_MODE;
+ properties->MaximumFileSize = 1; // 1 MB
+ properties->LoggerNameOffset = sizeof(EVENT_TRACE_PROPERTIES);
+ //properties->LogFileNameOffset = sizeof(EVENT_TRACE_PROPERTIES) + ulSizeName;
+ //memcpy((LPTSTR)((char*)properties.get() + properties->LogFileNameOffset), log_file.c_str(), ulSizeLogFile);
+
+ if ((ulResult = session.create(name.c_str(), properties.get())) == ERROR_SUCCESS) {
+ break;
+ } else if (ulResult == ERROR_ACCESS_DENIED) {
+ _ftprintf(stderr, _T("Access denied creating event session: you need administrative privileges (Run As Administrator) or be a member of Performance Log Users group to start event tracing session.\n"), ulResult);
+ return 1;
+ } else if (ulResult == ERROR_ALREADY_EXISTS) {
+ _ftprintf(stderr, _T("The %s event session already exists.\n"), name.c_str());
+ continue;
+ } else {
+ _ftprintf(stderr, _T("Error creating event session (error %u).\n"), ulResult);
+ return 1;
+ }
+ }
+
+ // Enable event provider we are interested in to log events to our session.
+ event_trace_enabler trace_enabler(session, &EAPMETHOD_TRACE_EVENT_PROVIDER, TRACE_LEVEL_VERBOSE);
+ if ((ulResult = trace_enabler.status()) != ERROR_SUCCESS) {
+ _ftprintf(stderr, _T("Error enabling event provider (error %u).\n"), ulResult);
+ return 1;
+ }
+
+ // Open trace.
+ EVENT_TRACE_LOGFILE tlf = {};
+ tlf.LoggerName = (LPTSTR)session.name();
+ tlf.ProcessTraceMode = PROCESS_TRACE_MODE_REAL_TIME | PROCESS_TRACE_MODE_EVENT_RECORD;
+ tlf.EventRecordCallback = EventRecordCallback;
+ event_trace trace;
+ if (!trace.create(&tlf)) {
+ _ftprintf(stderr, _T("Error opening event trace (error %u).\n"), GetLastError());
+ return 1;
+ }
+
+ // Process events.
+ g_traces.push_back(trace.detach());
+ SetConsoleCtrlHandler(ConsoleHandler, TRUE);
+ ProcessTrace(g_traces.data(), (ULONG)g_traces.size(), NULL, NULL);
+
+ return 0;
+}
diff --git a/EventMonitor/README.md b/EventMonitor/README.md
new file mode 100644
index 0000000..1eee758
--- /dev/null
+++ b/EventMonitor/README.md
@@ -0,0 +1,9 @@
+#EventMonitor
+Output real-time GÉANTLink events to console
+
+##Usage
+```
+EventMonitor
+```
+
+Press Ctrl+C to stop the program.
diff --git a/EventMonitor/StdAfx.cpp b/EventMonitor/StdAfx.cpp
new file mode 100644
index 0000000..4af5ec1
--- /dev/null
+++ b/EventMonitor/StdAfx.cpp
@@ -0,0 +1,21 @@
+/*
+ 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"
diff --git a/EventMonitor/StdAfx.h b/EventMonitor/StdAfx.h
new file mode 100644
index 0000000..0bb65fb
--- /dev/null
+++ b/EventMonitor/StdAfx.h
@@ -0,0 +1,32 @@
+/*
+ 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 .
+*/
+
+#pragma once
+
+#include "../include/Version.h"
+
+#include
+
+#include
+#include
+
+#include
+
+#include // Must include after
diff --git a/VS10Solution.sln b/VS10Solution.sln
index 98b95b5..d2715e0 100644
--- a/VS10Solution.sln
+++ b/VS10Solution.sln
@@ -40,6 +40,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TTLS_UI", "lib\TTLS_UI\buil
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MsiUseFeature", "MsiUseFeature\MsiUseFeature.vcxproj", "{679D03C5-CD70-4FFA-93F8-A4AB3637509B}"
EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "EventMonitor", "EventMonitor\EventMonitor.vcxproj", "{E0D0725B-B2FC-4225-9481-CA9B1B6306F2}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
@@ -160,6 +162,14 @@ Global
{679D03C5-CD70-4FFA-93F8-A4AB3637509B}.Release|Win32.Build.0 = Release|Win32
{679D03C5-CD70-4FFA-93F8-A4AB3637509B}.Release|x64.ActiveCfg = Release|x64
{679D03C5-CD70-4FFA-93F8-A4AB3637509B}.Release|x64.Build.0 = Release|x64
+ {E0D0725B-B2FC-4225-9481-CA9B1B6306F2}.Debug|Win32.ActiveCfg = Debug|Win32
+ {E0D0725B-B2FC-4225-9481-CA9B1B6306F2}.Debug|Win32.Build.0 = Debug|Win32
+ {E0D0725B-B2FC-4225-9481-CA9B1B6306F2}.Debug|x64.ActiveCfg = Debug|x64
+ {E0D0725B-B2FC-4225-9481-CA9B1B6306F2}.Debug|x64.Build.0 = Debug|x64
+ {E0D0725B-B2FC-4225-9481-CA9B1B6306F2}.Release|Win32.ActiveCfg = Release|Win32
+ {E0D0725B-B2FC-4225-9481-CA9B1B6306F2}.Release|Win32.Build.0 = Release|Win32
+ {E0D0725B-B2FC-4225-9481-CA9B1B6306F2}.Release|x64.ActiveCfg = Release|x64
+ {E0D0725B-B2FC-4225-9481-CA9B1B6306F2}.Release|x64.Build.0 = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -179,5 +189,6 @@ Global
{42F0F0F4-C928-4860-A4E4-94991C2C3D90} = {E66A3FE1-4EE4-401F-8EAD-BE518B230393}
{2D3CE079-7EB1-4F47-B79E-F0310671ECCB} = {7B5EC9B7-208C-426A-941D-DAF9271BD4A4}
{679D03C5-CD70-4FFA-93F8-A4AB3637509B} = {7B5EC9B7-208C-426A-941D-DAF9271BD4A4}
+ {E0D0725B-B2FC-4225-9481-CA9B1B6306F2} = {7B5EC9B7-208C-426A-941D-DAF9271BD4A4}
EndGlobalSection
EndGlobal
diff --git a/lib/WinStd b/lib/WinStd
index c2bbaf0..6684c2c 160000
--- a/lib/WinStd
+++ b/lib/WinStd
@@ -1 +1 @@
-Subproject commit c2bbaf0b7e7e5d3a2b75d5a0b5a2635bece0e213
+Subproject commit 6684c2cc6413533e0ab210db749d17dd4c171efb