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