1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
//! A strongly typed Event Tracing for Windows wrapper.
//!
//! The [`gen_etw_wrapper!`] macro turns an ETW manifest into a strongly typed provider struct.
//! See the examples directory for a basic demonstration.
//!
//! ```no_run
//! use etw_wrapper::{Result, gen_etw_wrapper};
//!
//! gen_etw_wrapper!("manifests/widgetservice.man", PROVIDER_WIDGETSERVICE -> WidgetLogger);
//!
//! fn main() -> Result<()> {
//! let provider = WidgetLogger::register()?;
//! provider.request_failed(0x12ABCDEF, 500, 42, "failed to succeed")?;
//! Ok(())
//! }
//! ```
//!
//! To avoid the procedural macro, call [`EtwLogger::register`], check [`EtwLogger::enabled`]
//! before each call to [`EtwLogger::write`], and convert parameters to
//! [`EVENT_DATA_DESCRIPTOR`] instances with the helpers in the [`field`] module.
//!
//! ```no_run
//! use etw_wrapper::{EVENT_DESCRIPTOR, EtwLogger, GUID, field::*};
//! let ctx = EtwLogger::register(&GUID::default()).unwrap();
//! let x = 1u32;
//! let y = to_u16cstring("hello");
//!
//! let descriptor = EVENT_DESCRIPTOR::default();
//! ctx.write(&descriptor, &[scalar(&x), str16(&y)]).unwrap();
//! ```
pub use gen_etw_wrapper;
// Gives generated code a stable path when the macro is invoked from this package's own targets.
extern crate self as etw_wrapper;
pub use EtwLogger;
// Re-export Windows types so callers do not need a direct windows dependency
pub use ;
pub use PSID;
pub use ;
pub use ;