From f721de2f263bf7bc14b705a9729d9dd91a60eed2 Mon Sep 17 00:00:00 2001 From: Simon Rozman Date: Tue, 19 Jul 2016 11:59:57 +0200 Subject: [PATCH] winstd::event_provider::write() split to allow va_arg-type parameters too --- include/WinStd/ETW.h | 36 ++++++++++++++++++++++++++++++------ 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/include/WinStd/ETW.h b/include/WinStd/ETW.h index 80189bf9..7c784e65 100644 --- a/include/WinStd/ETW.h +++ b/include/WinStd/ETW.h @@ -317,6 +317,8 @@ namespace winstd /// /// Writes an event with one or more parameter. /// + /// \note The list must be terminated with `winstd::event_data::blank`. + /// /// \return /// - `ERROR_SUCCESS` when write succeeds; /// - error code otherwise. @@ -326,28 +328,50 @@ namespace winstd inline ULONG write(_In_ PCEVENT_DESCRIPTOR EventDescriptor, _In_ const EVENT_DATA_DESCRIPTOR ¶m1, ...) { assert(m_h); + UNREFERENCED_PARAMETER(param1); va_list arg; + va_start(arg, EventDescriptor); + ULONG ulResult = write(EventDescriptor, arg); + va_end(arg); + + return ulResult; + } + + + /// + /// Writes an event with variable number of parameters. + /// + /// \note The list must be terminated with `winstd::event_data::blank`. + /// + /// \return + /// - `ERROR_SUCCESS` when write succeeds; + /// - error code otherwise. + /// + /// \sa [EventWrite function](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363752.aspx) + /// + inline ULONG write(_In_ PCEVENT_DESCRIPTOR EventDescriptor, _In_ va_list arg) + { + assert(m_h); + + va_list arg_start = arg; std::vector params; ULONG param_count; // Preallocate array. - va_start(arg, param1); - for (param_count = 1;; param_count++) { + for (param_count = 0;; param_count++) { EVENT_DATA_DESCRIPTOR &p = va_arg(arg, EVENT_DATA_DESCRIPTOR); if (!p.Ptr) break; } - va_end(arg); params.reserve(param_count); // Copy parameters to array. - va_start(arg, param1); - for (params.push_back(param1);;) { + arg = arg_start; + for (;;) { EVENT_DATA_DESCRIPTOR &p = va_arg(arg, EVENT_DATA_DESCRIPTOR); if (!p.Ptr) break; params.push_back(p); } - va_end(arg); return EventWrite(m_h, EventDescriptor, param_count, params.data()); }