winstd::event_provider::write() split to allow va_arg-type parameters too

This commit is contained in:
Simon Rozman 2016-07-19 11:59:57 +02:00
parent df911bc302
commit f721de2f26

View File

@ -317,6 +317,8 @@ namespace winstd
/// ///
/// Writes an event with one or more parameter. /// Writes an event with one or more parameter.
/// ///
/// \note The list must be terminated with `winstd::event_data::blank`.
///
/// \return /// \return
/// - `ERROR_SUCCESS` when write succeeds; /// - `ERROR_SUCCESS` when write succeeds;
/// - error code otherwise. /// - error code otherwise.
@ -326,28 +328,50 @@ namespace winstd
inline ULONG write(_In_ PCEVENT_DESCRIPTOR EventDescriptor, _In_ const EVENT_DATA_DESCRIPTOR &param1, ...) inline ULONG write(_In_ PCEVENT_DESCRIPTOR EventDescriptor, _In_ const EVENT_DATA_DESCRIPTOR &param1, ...)
{ {
assert(m_h); assert(m_h);
UNREFERENCED_PARAMETER(param1);
va_list arg; 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<EVENT_DATA_DESCRIPTOR> params; std::vector<EVENT_DATA_DESCRIPTOR> params;
ULONG param_count; ULONG param_count;
// Preallocate array. // Preallocate array.
va_start(arg, param1); for (param_count = 0;; param_count++) {
for (param_count = 1;; param_count++) {
EVENT_DATA_DESCRIPTOR &p = va_arg(arg, EVENT_DATA_DESCRIPTOR); EVENT_DATA_DESCRIPTOR &p = va_arg(arg, EVENT_DATA_DESCRIPTOR);
if (!p.Ptr) break; if (!p.Ptr) break;
} }
va_end(arg);
params.reserve(param_count); params.reserve(param_count);
// Copy parameters to array. // Copy parameters to array.
va_start(arg, param1); arg = arg_start;
for (params.push_back(param1);;) { for (;;) {
EVENT_DATA_DESCRIPTOR &p = va_arg(arg, EVENT_DATA_DESCRIPTOR); EVENT_DATA_DESCRIPTOR &p = va_arg(arg, EVENT_DATA_DESCRIPTOR);
if (!p.Ptr) break; if (!p.Ptr) break;
params.push_back(p); params.push_back(p);
} }
va_end(arg);
return EventWrite(m_h, EventDescriptor, param_count, params.data()); return EventWrite(m_h, EventDescriptor, param_count, params.data());
} }