From 8dead920cc9e62894412c21a943f8b1d869864ac Mon Sep 17 00:00:00 2001 From: daladim Date: Fri, 4 Nov 2022 17:43:11 +0100 Subject: [PATCH] TraceProperties: use typed values and sane defaults --- src/native/etw_types.rs | 8 ++++---- src/trace.rs | 26 +++++++++++++++++++++----- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/native/etw_types.rs b/src/native/etw_types.rs index c66836b..4b4e427 100644 --- a/src/native/etw_types.rs +++ b/src/native/etw_types.rs @@ -155,13 +155,13 @@ impl EventTraceProperties { etw_trace_properties.BufferSize = trace_properties.buffer_size; etw_trace_properties.MinimumBuffers = trace_properties.min_buffer; etw_trace_properties.MaximumBuffers = trace_properties.max_buffer; - etw_trace_properties.FlushTimer = trace_properties.flush_timer; + etw_trace_properties.FlushTimer = trace_properties.flush_timer.as_secs().clamp(1, u32::MAX as u64) as u32; // See https://learn.microsoft.com/en-us/windows/win32/api/evntrace/ns-evntrace-event_trace_properties - if trace_properties.log_file_mode != 0 { - etw_trace_properties.LogFileMode = trace_properties.log_file_mode; + if trace_properties.log_file_mode.is_empty() == false { + etw_trace_properties.LogFileMode = trace_properties.log_file_mode.bits(); } else { etw_trace_properties.LogFileMode = - u32::from(LoggingMode::RealTime) | u32::from(LoggingMode::NoPerProcBuffering); + (LoggingMode::EVENT_TRACE_REAL_TIME_MODE | LoggingMode::EVENT_TRACE_NO_PER_PROCESSOR_BUFFERING).bits() } etw_trace_properties.LogFileMode |= T::augmented_file_mode(); diff --git a/src/trace.rs b/src/trace.rs index 07bcc8e..ee8f38f 100644 --- a/src/trace.rs +++ b/src/trace.rs @@ -4,10 +4,11 @@ use std::marker::PhantomData; use std::sync::atomic::{AtomicUsize, Ordering}; use std::sync::Arc; +use std::time::Duration; use self::private::PrivateTraceTrait; -use crate::native::etw_types::{EventRecord, EventTraceProperties}; +use crate::native::etw_types::{EventRecord, EventTraceProperties, LoggingMode}; use crate::native::{evntrace, version_helper}; use crate::native::evntrace::{ControlHandle, TraceHandle, start_trace, open_trace, process_trace, enable_provider, control_trace, close_trace}; use crate::provider::Provider; @@ -51,7 +52,7 @@ type TraceResult = Result; /// These are some configuration settings that will be included in an [`EVENT_TRACE_PROPERTIES`](https://learn.microsoft.com/en-us/windows/win32/api/evntrace/ns-evntrace-event_trace_properties) /// /// [More info](https://docs.microsoft.com/en-us/message-analyzer/specifying-advanced-etw-session-configuration-settings#configuring-the-etw-session) -#[derive(Debug, Copy, Clone, Default)] +#[derive(Debug, Copy, Clone)] pub struct TraceProperties { /// Represents the ETW Session in KB pub buffer_size: u32, @@ -59,10 +60,25 @@ pub struct TraceProperties { pub min_buffer: u32, /// Represents the ETW Session maximum number of buffers in the buffer pool pub max_buffer: u32, - /// Represents the ETW Session flush interval in seconds - pub flush_timer: u32, + /// Represents the ETW Session flush interval. + /// + /// This duration will be rounded to the closest second (and 0 will be translated as 1 second) + pub flush_timer: Duration, /// Represents the ETW Session [Logging Mode](https://docs.microsoft.com/en-us/windows/win32/etw/logging-mode-constants) - pub log_file_mode: u32, + pub log_file_mode: LoggingMode, +} + +impl Default for TraceProperties { + fn default() -> Self { + // Sane defaults, inspired by https://learn.microsoft.com/en-us/windows/win32/api/evntrace/ns-evntrace-event_trace_properties + TraceProperties { + buffer_size: 32, + min_buffer: 0, + max_buffer: 0, + flush_timer: Duration::from_secs(1), + log_file_mode: LoggingMode::EVENT_TRACE_REAL_TIME_MODE | LoggingMode::EVENT_TRACE_NO_PER_PROCESSOR_BUFFERING, + } + } } /// Data used by callbacks when the trace is running