blob: 42267482a889cf09527fe23d66f453e7c18b17ff [file] [log] [blame]
// Copyright © 2017 winapi-rs developers
// Licensed under the Apache License, Version 2.0
// <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
// All files in the project carrying such notice may not be copied, modified, or distributed
// except according to those terms.
use shared::basetsd::{SIZE_T, ULONG32, ULONG64};
use shared::evntprov::PEVENT_FILTER_DESCRIPTOR;
use shared::guiddef::{GUID, LPCGUID, LPGUID};
use shared::minwindef::{DWORD, LPFILETIME, PULONG, UCHAR, UINT, ULONG, USHORT};
use shared::wmistr::{WMIDPREQUESTCODE, WNODE_HEADER};
use um::evntcons::PEVENT_RECORD;
use um::handleapi::INVALID_HANDLE_VALUE;
use um::timezoneapi::TIME_ZONE_INFORMATION;
use um::winnt::{
ANYSIZE_ARRAY, BOOLEAN, HANDLE, LARGE_INTEGER, LONG, LONGLONG, LPCSTR, LPCWSTR, LPSTR, LPWSTR,
PVOID, ULONGLONG, WCHAR
};
use vc::vadefs::va_list;
DEFINE_GUID!{EventTraceGuid,
0x68fdd900, 0x4a3e, 0x11d1, 0x84, 0xf4, 0x00, 0x00, 0xf8, 0x04, 0x64, 0xe3}
DEFINE_GUID!{SystemTraceControlGuid,
0x9e814aad, 0x3204, 0x11d2, 0x9a, 0x82, 0x00, 0x60, 0x08, 0xa8, 0x69, 0x39}
DEFINE_GUID!{EventTraceConfigGuid,
0x01853a65, 0x418f, 0x4f36, 0xae, 0xfc, 0xdc, 0x0f, 0x1d, 0x2f, 0xd2, 0x35}
DEFINE_GUID!{DefaultTraceSecurityGuid,
0x0811c1af, 0x7a07, 0x4a06, 0x82, 0xed, 0x86, 0x94, 0x55, 0xcd, 0xf7, 0x13}
DEFINE_GUID!{PrivateLoggerNotificationGuid,
0x3595ab5c, 0x042a, 0x4c8e, 0xb9, 0x42, 0x2d, 0x05, 0x9b, 0xfe, 0xb1, 0xb1}
pub const KERNEL_LOGGER_NAME: &'static str = "NT Kernel Logger";
pub const GLOBAL_LOGGER_NAME: &'static str = "GlobalLogger";
pub const EVENT_LOGGER_NAME: &'static str = "EventLog";
pub const DIAG_LOGGER_NAME: &'static str = "DiagLog";
pub const MAX_MOF_FIELDS: SIZE_T = 16;
DECLARE_HANDLE!{TRACEHANDLE, __TRACEHANDLE}
pub type PTRACEHANDLE = *mut TRACEHANDLE;
pub const EVENT_TRACE_TYPE_INFO: DWORD = 0x00;
pub const EVENT_TRACE_TYPE_START: DWORD = 0x01;
pub const EVENT_TRACE_TYPE_END: DWORD = 0x02;
pub const EVENT_TRACE_TYPE_STOP: DWORD = 0x02;
pub const EVENT_TRACE_TYPE_DC_START: DWORD = 0x03;
pub const EVENT_TRACE_TYPE_DC_END: DWORD = 0x04;
pub const EVENT_TRACE_TYPE_EXTENSION: DWORD = 0x05;
pub const EVENT_TRACE_TYPE_REPLY: DWORD = 0x06;
pub const EVENT_TRACE_TYPE_DEQUEUE: DWORD = 0x07;
pub const EVENT_TRACE_TYPE_RESUME: DWORD = 0x07;
pub const EVENT_TRACE_TYPE_CHECKPOINT: DWORD = 0x08;
pub const EVENT_TRACE_TYPE_SUSPEND: DWORD = 0x08;
pub const EVENT_TRACE_TYPE_WINEVT_SEND: DWORD = 0x09;
pub const EVENT_TRACE_TYPE_WINEVT_RECEIVE: DWORD = 0xF0;
pub const TRACE_LEVEL_CRITICAL: UCHAR = 1;
pub const TRACE_LEVEL_ERROR: UCHAR = 2;
pub const TRACE_LEVEL_WARNING: UCHAR = 3;
pub const TRACE_LEVEL_INFORMATION: UCHAR = 4;
pub const TRACE_LEVEL_VERBOSE: UCHAR = 5;
pub const TRACE_LEVEL_RESERVED6: UCHAR = 6;
pub const TRACE_LEVEL_RESERVED7: UCHAR = 7;
pub const TRACE_LEVEL_RESERVED8: UCHAR = 8;
pub const TRACE_LEVEL_RESERVED9: UCHAR = 9;
pub const EVENT_TRACE_TYPE_LOAD: DWORD = 0x0A;
pub const EVENT_TRACE_TYPE_TERMINATE: DWORD = 0x0B;
pub const EVENT_TRACE_TYPE_IO_READ: DWORD = 0x0A;
pub const EVENT_TRACE_TYPE_IO_WRITE: DWORD = 0x0B;
pub const EVENT_TRACE_TYPE_IO_READ_INIT: DWORD = 0x0C;
pub const EVENT_TRACE_TYPE_IO_WRITE_INIT: DWORD = 0x0D;
pub const EVENT_TRACE_TYPE_IO_FLUSH: DWORD = 0x0E;
pub const EVENT_TRACE_TYPE_IO_FLUSH_INIT: DWORD = 0x0F;
pub const EVENT_TRACE_TYPE_IO_REDIRECTED_INIT: DWORD = 0x10;
pub const EVENT_TRACE_TYPE_MM_TF: DWORD = 0x0A;
pub const EVENT_TRACE_TYPE_MM_DZF: DWORD = 0x0B;
pub const EVENT_TRACE_TYPE_MM_COW: DWORD = 0x0C;
pub const EVENT_TRACE_TYPE_MM_GPF: DWORD = 0x0D;
pub const EVENT_TRACE_TYPE_MM_HPF: DWORD = 0x0E;
pub const EVENT_TRACE_TYPE_MM_AV: DWORD = 0x0F;
pub const EVENT_TRACE_TYPE_SEND: DWORD = 0x0A;
pub const EVENT_TRACE_TYPE_RECEIVE: DWORD = 0x0B;
pub const EVENT_TRACE_TYPE_CONNECT: DWORD = 0x0C;
pub const EVENT_TRACE_TYPE_DISCONNECT: DWORD = 0x0D;
pub const EVENT_TRACE_TYPE_RETRANSMIT: DWORD = 0x0E;
pub const EVENT_TRACE_TYPE_ACCEPT: DWORD = 0x0F;
pub const EVENT_TRACE_TYPE_RECONNECT: DWORD = 0x10;
pub const EVENT_TRACE_TYPE_CONNFAIL: DWORD = 0x11;
pub const EVENT_TRACE_TYPE_COPY_TCP: DWORD = 0x12;
pub const EVENT_TRACE_TYPE_COPY_ARP: DWORD = 0x13;
pub const EVENT_TRACE_TYPE_ACKFULL: DWORD = 0x14;
pub const EVENT_TRACE_TYPE_ACKPART: DWORD = 0x15;
pub const EVENT_TRACE_TYPE_ACKDUP: DWORD = 0x16;
pub const EVENT_TRACE_TYPE_GUIDMAP: DWORD = 0x0A;
pub const EVENT_TRACE_TYPE_CONFIG: DWORD = 0x0B;
pub const EVENT_TRACE_TYPE_SIDINFO: DWORD = 0x0C;
pub const EVENT_TRACE_TYPE_SECURITY: DWORD = 0x0D;
pub const EVENT_TRACE_TYPE_DBGID_RSDS: DWORD = 0x40;
pub const EVENT_TRACE_TYPE_REGCREATE: DWORD = 0x0A;
pub const EVENT_TRACE_TYPE_REGOPEN: DWORD = 0x0B;
pub const EVENT_TRACE_TYPE_REGDELETE: DWORD = 0x0C;
pub const EVENT_TRACE_TYPE_REGQUERY: DWORD = 0x0D;
pub const EVENT_TRACE_TYPE_REGSETVALUE: DWORD = 0x0E;
pub const EVENT_TRACE_TYPE_REGDELETEVALUE: DWORD = 0x0F;
pub const EVENT_TRACE_TYPE_REGQUERYVALUE: DWORD = 0x10;
pub const EVENT_TRACE_TYPE_REGENUMERATEKEY: DWORD = 0x11;
pub const EVENT_TRACE_TYPE_REGENUMERATEVALUEKEY: DWORD = 0x12;
pub const EVENT_TRACE_TYPE_REGQUERYMULTIPLEVALUE: DWORD = 0x13;
pub const EVENT_TRACE_TYPE_REGSETINFORMATION: DWORD = 0x14;
pub const EVENT_TRACE_TYPE_REGFLUSH: DWORD = 0x15;
pub const EVENT_TRACE_TYPE_REGKCBCREATE: DWORD = 0x16;
pub const EVENT_TRACE_TYPE_REGKCBDELETE: DWORD = 0x17;
pub const EVENT_TRACE_TYPE_REGKCBRUNDOWNBEGIN: DWORD = 0x18;
pub const EVENT_TRACE_TYPE_REGKCBRUNDOWNEND: DWORD = 0x19;
pub const EVENT_TRACE_TYPE_REGVIRTUALIZE: DWORD = 0x1A;
pub const EVENT_TRACE_TYPE_REGCLOSE: DWORD = 0x1B;
pub const EVENT_TRACE_TYPE_REGSETSECURITY: DWORD = 0x1C;
pub const EVENT_TRACE_TYPE_REGQUERYSECURITY: DWORD = 0x1D;
pub const EVENT_TRACE_TYPE_REGCOMMIT: DWORD = 0x1E;
pub const EVENT_TRACE_TYPE_REGPREPARE: DWORD = 0x1F;
pub const EVENT_TRACE_TYPE_REGROLLBACK: DWORD = 0x20;
pub const EVENT_TRACE_TYPE_REGMOUNTHIVE: DWORD = 0x21;
pub const EVENT_TRACE_TYPE_CONFIG_CPU: DWORD = 0x0A;
pub const EVENT_TRACE_TYPE_CONFIG_PHYSICALDISK: DWORD = 0x0B;
pub const EVENT_TRACE_TYPE_CONFIG_LOGICALDISK: DWORD = 0x0C;
pub const EVENT_TRACE_TYPE_CONFIG_NIC: DWORD = 0x0D;
pub const EVENT_TRACE_TYPE_CONFIG_VIDEO: DWORD = 0x0E;
pub const EVENT_TRACE_TYPE_CONFIG_SERVICES: DWORD = 0x0F;
pub const EVENT_TRACE_TYPE_CONFIG_POWER: DWORD = 0x10;
pub const EVENT_TRACE_TYPE_CONFIG_NETINFO: DWORD = 0x11;
pub const EVENT_TRACE_TYPE_CONFIG_OPTICALMEDIA: DWORD = 0x12;
pub const EVENT_TRACE_TYPE_CONFIG_IRQ: DWORD = 0x15;
pub const EVENT_TRACE_TYPE_CONFIG_PNP: DWORD = 0x16;
pub const EVENT_TRACE_TYPE_CONFIG_IDECHANNEL: DWORD = 0x17;
pub const EVENT_TRACE_TYPE_CONFIG_NUMANODE: DWORD = 0x18;
pub const EVENT_TRACE_TYPE_CONFIG_PLATFORM: DWORD = 0x19;
pub const EVENT_TRACE_TYPE_CONFIG_PROCESSORGROUP: DWORD = 0x1A;
pub const EVENT_TRACE_TYPE_CONFIG_PROCESSORNUMBER: DWORD = 0x1B;
pub const EVENT_TRACE_TYPE_CONFIG_DPI: DWORD = 0x1C;
pub const EVENT_TRACE_TYPE_CONFIG_CI_INFO: DWORD = 0x1D;
pub const EVENT_TRACE_TYPE_CONFIG_MACHINEID: DWORD = 0x1E;
pub const EVENT_TRACE_TYPE_CONFIG_DEFRAG: DWORD = 0x1F;
pub const EVENT_TRACE_TYPE_CONFIG_MOBILEPLATFORM: DWORD = 0x20;
pub const EVENT_TRACE_TYPE_CONFIG_DEVICEFAMILY: DWORD = 0x21;
pub const EVENT_TRACE_TYPE_CONFIG_FLIGHTID: DWORD = 0x22;
pub const EVENT_TRACE_TYPE_CONFIG_PROCESSOR: DWORD = 0x23;
pub const EVENT_TRACE_TYPE_OPTICAL_IO_READ: DWORD = 0x37;
pub const EVENT_TRACE_TYPE_OPTICAL_IO_WRITE: DWORD = 0x38;
pub const EVENT_TRACE_TYPE_OPTICAL_IO_FLUSH: DWORD = 0x39;
pub const EVENT_TRACE_TYPE_OPTICAL_IO_READ_INIT: DWORD = 0x3a;
pub const EVENT_TRACE_TYPE_OPTICAL_IO_WRITE_INIT: DWORD = 0x3b;
pub const EVENT_TRACE_TYPE_OPTICAL_IO_FLUSH_INIT: DWORD = 0x3c;
pub const EVENT_TRACE_TYPE_FLT_PREOP_INIT: DWORD = 0x60;
pub const EVENT_TRACE_TYPE_FLT_POSTOP_INIT: DWORD = 0x61;
pub const EVENT_TRACE_TYPE_FLT_PREOP_COMPLETION: DWORD = 0x62;
pub const EVENT_TRACE_TYPE_FLT_POSTOP_COMPLETION: DWORD = 0x63;
pub const EVENT_TRACE_TYPE_FLT_PREOP_FAILURE: DWORD = 0x64;
pub const EVENT_TRACE_TYPE_FLT_POSTOP_FAILURE: DWORD = 0x65;
pub const EVENT_TRACE_FLAG_PROCESS: DWORD = 0x00000001;
pub const EVENT_TRACE_FLAG_THREAD: DWORD = 0x00000002;
pub const EVENT_TRACE_FLAG_IMAGE_LOAD: DWORD = 0x00000004;
pub const EVENT_TRACE_FLAG_DISK_IO: DWORD = 0x00000100;
pub const EVENT_TRACE_FLAG_DISK_FILE_IO: DWORD = 0x00000200;
pub const EVENT_TRACE_FLAG_MEMORY_PAGE_FAULTS: DWORD = 0x00001000;
pub const EVENT_TRACE_FLAG_MEMORY_HARD_FAULTS: DWORD = 0x00002000;
pub const EVENT_TRACE_FLAG_NETWORK_TCPIP: DWORD = 0x00010000;
pub const EVENT_TRACE_FLAG_REGISTRY: DWORD = 0x00020000;
pub const EVENT_TRACE_FLAG_DBGPRINT: DWORD = 0x00040000;
pub const EVENT_TRACE_FLAG_PROCESS_COUNTERS: DWORD = 0x00000008;
pub const EVENT_TRACE_FLAG_CSWITCH: DWORD = 0x00000010;
pub const EVENT_TRACE_FLAG_DPC: DWORD = 0x00000020;
pub const EVENT_TRACE_FLAG_INTERRUPT: DWORD = 0x00000040;
pub const EVENT_TRACE_FLAG_SYSTEMCALL: DWORD = 0x00000080;
pub const EVENT_TRACE_FLAG_DISK_IO_INIT: DWORD = 0x00000400;
pub const EVENT_TRACE_FLAG_ALPC: DWORD = 0x00100000;
pub const EVENT_TRACE_FLAG_SPLIT_IO: DWORD = 0x00200000;
pub const EVENT_TRACE_FLAG_DRIVER: DWORD = 0x00800000;
pub const EVENT_TRACE_FLAG_PROFILE: DWORD = 0x01000000;
pub const EVENT_TRACE_FLAG_FILE_IO: DWORD = 0x02000000;
pub const EVENT_TRACE_FLAG_FILE_IO_INIT: DWORD = 0x04000000;
pub const EVENT_TRACE_FLAG_DISPATCHER: DWORD = 0x00000800;
pub const EVENT_TRACE_FLAG_VIRTUAL_ALLOC: DWORD = 0x00004000;
pub const EVENT_TRACE_FLAG_VAMAP: DWORD = 0x00008000;
pub const EVENT_TRACE_FLAG_NO_SYSCONFIG: DWORD = 0x10000000;
pub const EVENT_TRACE_FLAG_JOB: DWORD = 0x00080000;
pub const EVENT_TRACE_FLAG_DEBUG_EVENTS: DWORD = 0x00400000;
pub const EVENT_TRACE_FLAG_EXTENSION: DWORD = 0x80000000;
pub const EVENT_TRACE_FLAG_FORWARD_WMI: DWORD = 0x40000000;
pub const EVENT_TRACE_FLAG_ENABLE_RESERVE: DWORD = 0x20000000;
pub const EVENT_TRACE_FILE_MODE_NONE: DWORD = 0x00000000;
pub const EVENT_TRACE_FILE_MODE_SEQUENTIAL: DWORD = 0x00000001;
pub const EVENT_TRACE_FILE_MODE_CIRCULAR: DWORD = 0x00000002;
pub const EVENT_TRACE_FILE_MODE_APPEND: DWORD = 0x00000004;
pub const EVENT_TRACE_REAL_TIME_MODE: DWORD = 0x00000100;
pub const EVENT_TRACE_DELAY_OPEN_FILE_MODE: DWORD = 0x00000200;
pub const EVENT_TRACE_BUFFERING_MODE: DWORD = 0x00000400;
pub const EVENT_TRACE_PRIVATE_LOGGER_MODE: DWORD = 0x00000800;
pub const EVENT_TRACE_ADD_HEADER_MODE: DWORD = 0x00001000;
pub const EVENT_TRACE_USE_GLOBAL_SEQUENCE: DWORD = 0x00004000;
pub const EVENT_TRACE_USE_LOCAL_SEQUENCE: DWORD = 0x00008000;
pub const EVENT_TRACE_RELOG_MODE: DWORD = 0x00010000;
pub const EVENT_TRACE_USE_PAGED_MEMORY: DWORD = 0x01000000;
pub const EVENT_TRACE_FILE_MODE_NEWFILE: DWORD = 0x00000008;
pub const EVENT_TRACE_FILE_MODE_PREALLOCATE: DWORD = 0x00000020;
pub const EVENT_TRACE_NONSTOPPABLE_MODE: DWORD = 0x00000040;
pub const EVENT_TRACE_SECURE_MODE: DWORD = 0x00000080;
pub const EVENT_TRACE_USE_KBYTES_FOR_SIZE: DWORD = 0x00002000;
pub const EVENT_TRACE_PRIVATE_IN_PROC: DWORD = 0x00020000;
pub const EVENT_TRACE_MODE_RESERVED: DWORD = 0x00100000;
pub const EVENT_TRACE_NO_PER_PROCESSOR_BUFFERING: DWORD = 0x10000000;
pub const EVENT_TRACE_SYSTEM_LOGGER_MODE: DWORD = 0x02000000;
pub const EVENT_TRACE_ADDTO_TRIAGE_DUMP: DWORD = 0x80000000;
pub const EVENT_TRACE_STOP_ON_HYBRID_SHUTDOWN: DWORD = 0x00400000;
pub const EVENT_TRACE_PERSIST_ON_HYBRID_SHUTDOWN: DWORD = 0x00800000;
pub const EVENT_TRACE_INDEPENDENT_SESSION_MODE: DWORD = 0x08000000;
pub const EVENT_TRACE_COMPRESSED_MODE: DWORD = 0x04000000;
pub const EVENT_TRACE_CONTROL_QUERY: DWORD = 0;
pub const EVENT_TRACE_CONTROL_STOP: DWORD = 1;
pub const EVENT_TRACE_CONTROL_UPDATE: DWORD = 2;
pub const EVENT_TRACE_CONTROL_FLUSH: DWORD = 3;
pub const TRACE_MESSAGE_SEQUENCE: DWORD = 1;
pub const TRACE_MESSAGE_GUID: DWORD = 2;
pub const TRACE_MESSAGE_COMPONENTID: DWORD = 4;
pub const TRACE_MESSAGE_TIMESTAMP: DWORD = 8;
pub const TRACE_MESSAGE_PERFORMANCE_TIMESTAMP: DWORD = 16;
pub const TRACE_MESSAGE_SYSTEMINFO: DWORD = 32;
pub const TRACE_MESSAGE_POINTER32: DWORD = 0x0040;
pub const TRACE_MESSAGE_POINTER64: DWORD = 0x0080;
pub const TRACE_MESSAGE_FLAG_MASK: DWORD = 0xFFFF;
pub const TRACE_MESSAGE_MAXIMUM_SIZE: SIZE_T = 64 * 1024;
pub const EVENT_TRACE_USE_PROCTIME: DWORD = 0x0001;
pub const EVENT_TRACE_USE_NOCPUTIME: DWORD = 0x0002;
pub const TRACE_HEADER_FLAG_USE_TIMESTAMP: DWORD = 0x00000200;
pub const TRACE_HEADER_FLAG_TRACED_GUID: DWORD = 0x00020000;
pub const TRACE_HEADER_FLAG_LOG_WNODE: DWORD = 0x00040000;
pub const TRACE_HEADER_FLAG_USE_GUID_PTR: DWORD = 0x00080000;
pub const TRACE_HEADER_FLAG_USE_MOF_PTR: DWORD = 0x00100000;
ENUM!{enum ETW_COMPRESSION_RESUMPTION_MODE {
EtwCompressionModeRestart = 0,
EtwCompressionModeNoDisable = 1,
EtwCompressionModeNoRestart = 2,
}}
STRUCT!{struct EVENT_TRACE_HEADER_u1_s {
HeaderType: UCHAR,
MarkerFlags: UCHAR,
}}
UNION!{union EVENT_TRACE_HEADER_u1 {
[u16; 1],
FieldTypeFlags FieldTypeFlags_mut: USHORT,
s s_mut: EVENT_TRACE_HEADER_u1_s,
}}
STRUCT!{struct EVENT_TRACE_HEADER_u2_CLASS {
Type: UCHAR,
Level: UCHAR,
Version: USHORT,
}}
UNION!{union EVENT_TRACE_HEADER_u2 {
[u32; 1],
Version Version_mut: ULONG,
Class Class_mut: EVENT_TRACE_HEADER_u2_CLASS,
}}
UNION!{union EVENT_TRACE_HEADER_u3 {
[u64; 2],
Guid Guid_mut: GUID,
GuidPtr GuidPtr_mut: ULONGLONG,
}}
STRUCT!{struct EVENT_TRACE_HEADER_u4_s1 {
ClientContext: ULONG,
Flags: ULONG,
}}
STRUCT!{struct EVENT_TRACE_HEADER_u4_s2 {
KernelTime: ULONG,
UserTime: ULONG,
}}
UNION!{union EVENT_TRACE_HEADER_u4 {
[u64; 1],
s1 s1_mut: EVENT_TRACE_HEADER_u4_s1,
s2 s2_mut: EVENT_TRACE_HEADER_u4_s2,
ProcessorTime ProcessorTime_mut: ULONG64,
}}
STRUCT!{struct EVENT_TRACE_HEADER {
Size: USHORT,
u1: EVENT_TRACE_HEADER_u1,
u2: EVENT_TRACE_HEADER_u2,
ThreadId: ULONG,
ProcessId: ULONG,
TimeStamp: LARGE_INTEGER,
u3: EVENT_TRACE_HEADER_u3,
u4: EVENT_TRACE_HEADER_u4,
}}
pub type PEVENT_TRACE_HEADER = *mut EVENT_TRACE_HEADER;
STRUCT!{struct EVENT_INSTANCE_HEADER_u1_s {
HeaderType: UCHAR,
MarkerFlags: UCHAR,
}}
UNION!{union EVENT_INSTANCE_HEADER_u1 {
[u16; 1],
FieldTypeFlags FieldTypeFlags_mut: USHORT,
s s_mut: EVENT_INSTANCE_HEADER_u1_s,
}}
STRUCT!{struct EVENT_INSTANCE_HEADER_u2_CLASS {
Type: UCHAR,
Level: UCHAR,
Version: USHORT,
}}
UNION!{union EVENT_INSTANCE_HEADER_u2 {
[u32; 1],
Version Version_mut: ULONG,
Class Class_mut: EVENT_INSTANCE_HEADER_u2_CLASS,
}}
STRUCT!{struct EVENT_INSTANCE_HEADER_u3_s1 {
KernelTime: ULONG,
UserTime: ULONG,
}}
STRUCT!{struct EVENT_INSTANCE_HEADER_u3_s2 {
EventId: ULONG,
Flags: ULONG,
}}
UNION!{union EVENT_INSTANCE_HEADER_u3 {
[u64; 1],
s1 s1_mut: EVENT_INSTANCE_HEADER_u3_s1,
ProcessorTime ProcessorTime_mut: ULONG64,
s2 s2_mut: EVENT_INSTANCE_HEADER_u3_s2,
}}
STRUCT!{struct EVENT_INSTANCE_HEADER {
Size: USHORT,
u1: EVENT_INSTANCE_HEADER_u1,
u2: EVENT_INSTANCE_HEADER_u2,
ThreadId: ULONG,
ProcessId: ULONG,
TimeStamp: LARGE_INTEGER,
RegHandle: ULONGLONG,
InstanceId: ULONG,
ParentInstanceId: ULONG,
u3: EVENT_INSTANCE_HEADER_u3,
ParentRegHandle: ULONGLONG,
}}
pub type PEVENT_INSTANCE_HEADER = *mut EVENT_INSTANCE_HEADER;
pub const ETW_NULL_TYPE_VALUE: ULONG = 0;
pub const ETW_OBJECT_TYPE_VALUE: ULONG = 1;
pub const ETW_STRING_TYPE_VALUE: ULONG = 2;
pub const ETW_SBYTE_TYPE_VALUE: ULONG = 3;
pub const ETW_BYTE_TYPE_VALUE: ULONG = 4;
pub const ETW_INT16_TYPE_VALUE: ULONG = 5;
pub const ETW_UINT16_TYPE_VALUE: ULONG = 6;
pub const ETW_INT32_TYPE_VALUE: ULONG = 7;
pub const ETW_UINT32_TYPE_VALUE: ULONG = 8;
pub const ETW_INT64_TYPE_VALUE: ULONG = 9;
pub const ETW_UINT64_TYPE_VALUE: ULONG = 10;
pub const ETW_CHAR_TYPE_VALUE: ULONG = 11;
pub const ETW_SINGLE_TYPE_VALUE: ULONG = 12;
pub const ETW_DOUBLE_TYPE_VALUE: ULONG = 13;
pub const ETW_BOOLEAN_TYPE_VALUE: ULONG = 14;
pub const ETW_DECIMAL_TYPE_VALUE: ULONG = 15;
pub const ETW_GUID_TYPE_VALUE: ULONG = 101;
pub const ETW_ASCIICHAR_TYPE_VALUE: ULONG = 102;
pub const ETW_ASCIISTRING_TYPE_VALUE: ULONG = 103;
pub const ETW_COUNTED_STRING_TYPE_VALUE: ULONG = 104;
pub const ETW_POINTER_TYPE_VALUE: ULONG = 105;
pub const ETW_SIZET_TYPE_VALUE: ULONG = 106;
pub const ETW_HIDDEN_TYPE_VALUE: ULONG = 107;
pub const ETW_BOOL_TYPE_VALUE: ULONG = 108;
pub const ETW_COUNTED_ANSISTRING_TYPE_VALUE: ULONG = 109;
pub const ETW_REVERSED_COUNTED_STRING_TYPE_VALUE: ULONG = 110;
pub const ETW_REVERSED_COUNTED_ANSISTRING_TYPE_VALUE: ULONG = 111;
pub const ETW_NON_NULL_TERMINATED_STRING_TYPE_VALUE: ULONG = 112;
pub const ETW_REDUCED_ANSISTRING_TYPE_VALUE: ULONG = 113;
pub const ETW_REDUCED_STRING_TYPE_VALUE: ULONG = 114;
pub const ETW_SID_TYPE_VALUE: ULONG = 115;
pub const ETW_VARIANT_TYPE_VALUE: ULONG = 116;
pub const ETW_PTVECTOR_TYPE_VALUE: ULONG = 117;
pub const ETW_WMITIME_TYPE_VALUE: ULONG = 118;
pub const ETW_DATETIME_TYPE_VALUE: ULONG = 119;
pub const ETW_REFRENCE_TYPE_VALUE: ULONG = 120;
// TODO: DEFINE_TRACE_MOF_FIELD
STRUCT!{struct MOF_FIELD{
DataPtr: ULONG64,
Length: ULONG,
DataType: ULONG,
}}
pub type PMOF_FIELD = *mut MOF_FIELD;
STRUCT!{struct TRACE_LOGFILE_HEADER_u1_VERSIONDETAIL {
MajorVersion: UCHAR,
MinorVersion: UCHAR,
SubVersion: UCHAR,
SubMinorVersion: UCHAR,
}}
UNION!{union TRACE_LOGFILE_HEADER_u1 {
[u32; 1],
Version Version_mut: ULONG,
VersionDetail VersionDetail_mut: TRACE_LOGFILE_HEADER_u1_VERSIONDETAIL,
}}
STRUCT!{struct TRACE_LOGFILE_HEADER_u2_s {
StartBuffers: ULONG,
PointerSize: ULONG,
EventsLost: ULONG,
CpuSpeedInMHz: ULONG,
}}
UNION!{union TRACE_LOGFILE_HEADER_u2 {
[u32; 4],
LogInstanceGuid LogInstanceGuid_mut: GUID,
s s_mut: TRACE_LOGFILE_HEADER_u2_s,
}}
STRUCT!{struct TRACE_LOGFILE_HEADER {
BufferSize: ULONG,
u1: TRACE_LOGFILE_HEADER_u1,
ProviderVersion: ULONG,
NumberOfProcessors: ULONG,
EndTime: LARGE_INTEGER,
TimerResolution: ULONG,
MaximumFileSize: ULONG,
LogFileMode: ULONG,
BuffersWritten: ULONG,
u2: TRACE_LOGFILE_HEADER_u2,
LoggerName: LPWSTR,
LogFileName: LPWSTR,
TimeZone: TIME_ZONE_INFORMATION,
BootTime: LARGE_INTEGER,
PrefFreq: LARGE_INTEGER,
StartTime: LARGE_INTEGER,
ReservedFlags: ULONG,
BuffersLost: ULONG,
}}
pub type PTRACE_LOGFILE_HEADER = *mut TRACE_LOGFILE_HEADER;
STRUCT!{struct TRACE_LOGFILE_HEADER32 {
BufferSize: ULONG,
u1: TRACE_LOGFILE_HEADER_u1,
ProviderVersion: ULONG,
NumberOfProcessors: ULONG,
EndTime: LARGE_INTEGER,
TimerResolution: ULONG,
MaximumFileSize: ULONG,
LogFileMode: ULONG,
BuffersWritten: ULONG,
u2: TRACE_LOGFILE_HEADER_u2,
LoggerName: ULONG32,
LogFileName: ULONG32,
TimeZone: TIME_ZONE_INFORMATION,
BootTime: LARGE_INTEGER,
PrefFreq: LARGE_INTEGER,
StartTime: LARGE_INTEGER,
ReservedFlags: ULONG,
BuffersLost: ULONG,
}}
pub type PTRACE_LOGFILE_HEADER32 = *mut TRACE_LOGFILE_HEADER32;
STRUCT!{struct TRACE_LOGFILE_HEADER64 {
BufferSize: ULONG,
u1: TRACE_LOGFILE_HEADER_u1,
ProviderVersion: ULONG,
NumberOfProcessors: ULONG,
EndTime: LARGE_INTEGER,
TimerResolution: ULONG,
MaximumFileSize: ULONG,
LogFileMode: ULONG,
BuffersWritten: ULONG,
u2: TRACE_LOGFILE_HEADER_u2,
LoggerName: ULONG64,
LogFileName: ULONG64,
TimeZone: TIME_ZONE_INFORMATION,
BootTime: LARGE_INTEGER,
PrefFreq: LARGE_INTEGER,
StartTime: LARGE_INTEGER,
ReservedFlags: ULONG,
BuffersLost: ULONG,
}}
pub type PTRACE_LOGFILE_HEADER64 = *mut TRACE_LOGFILE_HEADER64;
STRUCT!{struct EVENT_INSTANCE_INFO {
RegHandle: HANDLE,
InstanceId: ULONG,
}}
pub type PEVENT_INSTANCE_INFO = *mut EVENT_INSTANCE_INFO;
UNION!{union EVENT_TRACE_PROPERTIES_u {
[u32; 1],
AgeLimit AgeLimit_mut: LONG,
FlushThreshold FlushThreshold_mut: LONG,
}}
STRUCT!{struct EVENT_TRACE_PROPERTIES {
Wnode: WNODE_HEADER,
BufferSize: ULONG,
MinimumBuffers: ULONG,
MaximumBuffers: ULONG,
MaximumFileSize: ULONG,
LogFileMode: ULONG,
FlushTimer: ULONG,
EnableFlags: ULONG,
u: EVENT_TRACE_PROPERTIES_u,
NumberOfBuffers: ULONG,
FreeBuffers: ULONG,
EventsLost: ULONG,
BuffersWritten: ULONG,
LogBuffersLost: ULONG,
RealTimeBuffersLost: ULONG,
LoggerThreadId: HANDLE,
LogFileNameOffset: ULONG,
LoggerNameOffset: ULONG,
}}
pub type PEVENT_TRACE_PROPERTIES = *mut EVENT_TRACE_PROPERTIES;
UNION!{union EVENT_TRACE_PROPERTIES_V2_u1 {
[u32; 1],
AgeLimit AgeLimit_mut: LONG,
FlushThreshold FlushThreshold_mut: LONG,
}}
STRUCT!{struct EVENT_TRACE_PROPERTIES_V2_u2_s {
bitfield: ULONG,
}}
BITFIELD!{EVENT_TRACE_PROPERTIES_V2_u2_s bitfield: ULONG [
VersionNumber set_VersionNumber[0..8],
]}
UNION!{union EVENT_TRACE_PROPERTIES_V2_u2 {
[u32; 1],
s s_mut: EVENT_TRACE_PROPERTIES_V2_u2_s,
V2Control V2Control_mut: ULONG,
}}
STRUCT!{struct EVENT_TRACE_PROPERTIES_V2_u3_s {
bitfield: ULONG,
}}
BITFIELD!{EVENT_TRACE_PROPERTIES_V2_u3_s bitfield: ULONG [
Wow set_Wow[0..1],
]}
UNION!{union EVENT_TRACE_PROPERTIES_V2_u3 {
[u64; 1],
s s_mut: EVENT_TRACE_PROPERTIES_V2_u3_s,
V2Options V2Options_mut: ULONG64,
}}
STRUCT!{struct EVENT_TRACE_PROPERTIES_V2 {
Wnode: WNODE_HEADER,
BufferSize: ULONG,
MinimumBuffers: ULONG,
MaximumBuffers: ULONG,
MaximumFileSize: ULONG,
LogFileMode: ULONG,
FlushTimer: ULONG,
EnableFlags: ULONG,
u1: EVENT_TRACE_PROPERTIES_u,
NumberOfBuffers: ULONG,
FreeBuffers: ULONG,
EventsLost: ULONG,
BuffersWritten: ULONG,
LogBuffersLost: ULONG,
RealTimeBuffersLost: ULONG,
LoggerThreadId: HANDLE,
LogFileNameOffset: ULONG,
LoggerNameOffset: ULONG,
u2: EVENT_TRACE_PROPERTIES_V2_u2,
FilterDescCount: ULONG,
FilterDesc: PEVENT_FILTER_DESCRIPTOR,
u3: EVENT_TRACE_PROPERTIES_V2_u3,
}}
pub type PEVENT_TRACE_PROPERTIES_V2 = *mut EVENT_TRACE_PROPERTIES_V2;
STRUCT!{struct TRACE_GUID_REGISTRATION {
Guid: LPCGUID,
RegHandle: HANDLE,
}}
pub type PTRACE_GUID_REGISTRATION = *mut TRACE_GUID_REGISTRATION;
STRUCT!{struct TRACE_GUID_PROPERTIES {
Guid: GUID,
GuidType: ULONG,
LoggerId: ULONG,
EnableLevel: ULONG,
EnableFlags: ULONG,
IsEnable: BOOLEAN,
}}
pub type PTRACE_GUID_PROPERTIES = *mut TRACE_GUID_PROPERTIES;
STRUCT!{struct ETW_BUFFER_CONTEXT_u_s {
ProcessorNumber: UCHAR,
Alignment: UCHAR,
}}
UNION!{union ETW_BUFFER_CONTEXT_u {
[u16; 1],
s s_mut: ETW_BUFFER_CONTEXT_u_s,
ProcessorIndex ProcessorIndex_mut: USHORT,
}}
STRUCT!{struct ETW_BUFFER_CONTEXT {
u: ETW_BUFFER_CONTEXT_u,
LoggerId: USHORT,
}}
pub type PETW_BUFFER_CONTEXT = *mut ETW_BUFFER_CONTEXT;
pub const TRACE_PROVIDER_FLAG_LEGACY: ULONG = 0x00000001;
pub const TRACE_PROVIDER_FLAG_PRE_ENABLE: ULONG = 0x00000002;
STRUCT!{struct TRACE_ENABLE_INFO {
IsEnabled: ULONG,
Level: UCHAR,
Reserved1: UCHAR,
LoggerId: USHORT,
EnabledProperty: ULONG,
Reserved2: ULONG,
MatchAnyKeyword: ULONGLONG,
MatchAllKeyword: ULONGLONG,
}}
pub type PTRACE_ENABLE_INFO = *mut TRACE_ENABLE_INFO;
STRUCT!{struct TRACE_PROVIDER_INSTANCE_INFO {
NameOffset: ULONG,
EnableCount: ULONG,
Pid: ULONG,
Flags: ULONG,
}}
pub type PTRACE_PROVIDER_INSTANCE_INFO = *mut TRACE_PROVIDER_INSTANCE_INFO;
STRUCT!{struct TRACE_GUID_INFO {
InstanceCount: ULONG,
Reserved: ULONG,
}}
pub type PTRACE_GUID_INFO = *mut TRACE_GUID_INFO;
STRUCT!{struct PROFILE_SOURCE_INFO {
NextEntryOffset: ULONG,
Source: ULONG,
MinInterval: ULONG,
MaxInterval: ULONG,
Reserved: ULONG64,
Description: [WCHAR; ANYSIZE_ARRAY],
}}
pub type PPROFILE_SOURCE_INFO = *mut PROFILE_SOURCE_INFO;
UNION!{union EVENT_TRACE_u {
[u32; 1],
ClientContext ClientContext_mut: ULONG,
BufferContext BufferContext_mut: ETW_BUFFER_CONTEXT,
}}
STRUCT!{struct EVENT_TRACE {
Header: EVENT_TRACE_HEADER,
InstanceId: ULONG,
ParentInstanceId: ULONG,
ParentGuid: GUID,
MofData: PVOID,
MofLength: ULONG,
u: EVENT_TRACE_u,
}}
pub type PEVENT_TRACE = *mut EVENT_TRACE;
pub const EVENT_CONTROL_CODE_DISABLE_PROVIDER: ULONG = 0;
pub const EVENT_CONTROL_CODE_ENABLE_PROVIDER: ULONG = 1;
pub const EVENT_CONTROL_CODE_CAPTURE_STATE: ULONG = 2;
FN!{stdcall PEVENT_TRACE_BUFFER_CALLBACKW(
PEVENT_TRACE_LOGFILEW,
) -> ULONG}
FN!{stdcall PEVENT_TRACE_BUFFER_CALLBACKA(
PEVENT_TRACE_LOGFILEA,
) -> ULONG}
FN!{stdcall PEVENT_CALLBACK(
pEvent: PEVENT_TRACE,
) -> ()}
FN!{stdcall PEVENT_RECORD_CALLBACK(
EventRecord: PEVENT_RECORD,
) -> ()}
FN!{stdcall WMIDPREQUEST(
RequestCode: WMIDPREQUESTCODE,
RequestContext: PVOID,
BufferSize: *mut ULONG,
Buffer: PVOID,
) -> ULONG}
UNION!{union EVENT_TRACE_LOGFILE_u1 {
[u32; 1],
LogFileMode LogFileMode_mut: ULONG,
ProcessTraceMode ProcessTraceMode_mut: ULONG,
}}
UNION!{union EVENT_TRACE_LOGFILE_u2 {
[u32; 1] [u64; 1],
EventCallback EventCallback_mut: PEVENT_CALLBACK,
EventRecordCallback EventRecordCallback_mut: PEVENT_RECORD_CALLBACK,
}}
STRUCT!{struct EVENT_TRACE_LOGFILEW {
LogFileName: LPWSTR,
LoggerName: LPWSTR,
CurrentTime: LONGLONG,
BuffersRead: ULONG,
u1: EVENT_TRACE_LOGFILE_u1,
CurrentEvent: EVENT_TRACE,
LogfileHeader: TRACE_LOGFILE_HEADER,
BufferCallback: PEVENT_TRACE_BUFFER_CALLBACKW,
BufferSize: ULONG,
Filled: ULONG,
EventsLost: ULONG,
u2: EVENT_TRACE_LOGFILE_u2,
IsKernelTrace: ULONG,
Context: PVOID,
}}
pub type PEVENT_TRACE_LOGFILEW = *mut EVENT_TRACE_LOGFILEW;
STRUCT!{struct EVENT_TRACE_LOGFILEA {
LogFileName: LPSTR,
LoggerName: LPSTR,
CurrentTime: LONGLONG,
BuffersRead: ULONG,
u1: EVENT_TRACE_LOGFILE_u1,
CurrentEvent: EVENT_TRACE,
LogfileHeader: TRACE_LOGFILE_HEADER,
BufferCallback: PEVENT_TRACE_BUFFER_CALLBACKA,
BufferSize: ULONG,
Filled: ULONG,
EventsLost: ULONG,
u2: EVENT_TRACE_LOGFILE_u2,
IsKernelTrace: ULONG,
Context: PVOID,
}}
pub type PEVENT_TRACE_LOGFILEA = *mut EVENT_TRACE_LOGFILEA;
extern "system" {
pub fn StartTraceW(
SessionHandle: PTRACEHANDLE,
SessionName: LPCWSTR,
Properties: PEVENT_TRACE_PROPERTIES,
) -> ULONG;
pub fn StartTraceA(
SessionHandle: PTRACEHANDLE,
SessionName: LPCSTR,
Properties: PEVENT_TRACE_PROPERTIES,
) -> ULONG;
pub fn StopTraceW(
SessionHandle: TRACEHANDLE,
SessionName: LPCWSTR,
Properties: PEVENT_TRACE_PROPERTIES,
) -> ULONG;
pub fn StopTraceA(
SessionHandle: TRACEHANDLE,
SessionName: LPCSTR,
Properties: PEVENT_TRACE_PROPERTIES,
) -> ULONG;
pub fn QueryTraceW(
SessionHandle: TRACEHANDLE,
SessionName: LPCWSTR,
Properties: PEVENT_TRACE_PROPERTIES,
) -> ULONG;
pub fn QueryTraceA(
SessionHandle: TRACEHANDLE,
SessionName: LPCSTR,
Properties: PEVENT_TRACE_PROPERTIES,
) -> ULONG;
pub fn UpdateTraceW(
SessionHandle: TRACEHANDLE,
SessionName: LPCWSTR,
Properties: PEVENT_TRACE_PROPERTIES,
) -> ULONG;
pub fn UpdateTraceA(
SessionHandle: TRACEHANDLE,
SessionName: LPCSTR,
Properties: PEVENT_TRACE_PROPERTIES,
) -> ULONG;
pub fn FlushTraceW(
SessionHandle: TRACEHANDLE,
SessionName: LPCWSTR,
Properties: PEVENT_TRACE_PROPERTIES,
) -> ULONG;
pub fn FlushTraceA(
SessionHandle: TRACEHANDLE,
SessionName: LPCSTR,
Properties: PEVENT_TRACE_PROPERTIES,
) -> ULONG;
pub fn ControlTraceW(
SessionHandle: TRACEHANDLE,
SessionName: LPCWSTR,
Properties: PEVENT_TRACE_PROPERTIES,
ControlCode: ULONG,
) -> ULONG;
pub fn ControlTraceA(
SessionHandle: TRACEHANDLE,
SessionName: LPCSTR,
Properties: PEVENT_TRACE_PROPERTIES,
ControlCode: ULONG,
) -> ULONG;
pub fn QueryAllTracesW(
PropertyArray: *mut PEVENT_TRACE_PROPERTIES,
PropertyArrayCount: ULONG,
SessionCount: PULONG,
) -> ULONG;
pub fn QueryAllTracesA(
PropertyArray: *mut PEVENT_TRACE_PROPERTIES,
PropertyArrayCount: ULONG,
SessionCount: PULONG,
) -> ULONG;
pub fn EnableTrace(
Enable: ULONG,
EnableFlag: ULONG,
EnableLevel: ULONG,
ControlGuid: LPCGUID,
SessionHandle: TRACEHANDLE,
) -> ULONG;
pub fn EnableTraceEx(
ProviderId: LPCGUID,
SourceId: LPCGUID,
TraceHandle: TRACEHANDLE,
IsEnabled: ULONG,
Level: UCHAR,
MatchAnyKeyword: ULONGLONG,
MatchAllKeyword: ULONGLONG,
EnableProperty: ULONG,
EnableFilterDesc: PEVENT_FILTER_DESCRIPTOR,
) -> ULONG;
}
pub const ENABLE_TRACE_PARAMETERS_VERSION: ULONG = 1;
pub const ENABLE_TRACE_PARAMETERS_VERSION_2: ULONG = 2;
STRUCT!{struct ENABLE_TRACE_PARAMETERS_V1 {
Version: ULONG,
EnableProperty: ULONG,
ControlFlags: ULONG,
SourceId: GUID,
EnableFilterDesc: PEVENT_FILTER_DESCRIPTOR,
}}
pub type PENABLE_TRACE_PARAMETERS_V1 = *mut ENABLE_TRACE_PARAMETERS_V1;
STRUCT!{struct ENABLE_TRACE_PARAMETERS {
Version: ULONG,
EnableProperty: ULONG,
ControlFlags: ULONG,
SourceId: GUID,
EnableFilterDesc: PEVENT_FILTER_DESCRIPTOR,
FilterDescCount: ULONG,
}}
pub type PENABLE_TRACE_PARAMETERS = *mut ENABLE_TRACE_PARAMETERS;
extern "system" {
pub fn EnableTraceEx2(
TraceHandle: TRACEHANDLE,
ProviderId: LPCGUID,
ControlCode: ULONG,
Level: UCHAR,
MatchAnyKeyword: ULONGLONG,
MatchAllKeyword: ULONGLONG,
Timeout: ULONG,
EnableParameters: PENABLE_TRACE_PARAMETERS,
) -> ULONG;
}
ENUM!{enum TRACE_QUERY_INFO_CLASS {
TraceGuidQueryList,
TraceGuidQueryInfo,
TraceGuidQueryProcess,
TraceStackTracingInfo,
TraceSystemTraceEnableFlagsInfo,
TraceSampledProfileIntervalInfo,
TraceProfileSourceConfigInfo,
TraceProfileSourceListInfo,
TracePmcEventListInfo,
TracePmcCounterListInfo,
TraceSetDisallowList,
TraceVersionInfo,
TraceGroupQueryList,
TraceGroupQueryInfo,
TraceDisallowListQuery,
TraceCompressionInfo,
TracePeriodicCaptureStateListInfo,
TracePeriodicCaptureStateInfo,
TraceProviderBinaryTracking,
TraceMaxLoggersQuery,
MaxTraceSetInfoClass,
}}
pub type TRACE_INFO_CLASS = TRACE_QUERY_INFO_CLASS;
extern "system" {
pub fn EnumerateTraceGuidsEx(
TraceQueryInfoClass: TRACE_QUERY_INFO_CLASS,
InBuffer: PVOID,
InBufferSize: ULONG,
OutBuffer: PVOID,
OutBufferSize: ULONG,
ReturnLength: PULONG,
) -> ULONG;
}
STRUCT!{struct CLASSIC_EVENT_ID {
EventGuid: GUID,
Type: UCHAR,
Reserved: [UCHAR; 7],
}}
pub type PCLASSIC_EVENT_ID = *mut CLASSIC_EVENT_ID;
STRUCT!{struct TRACE_PROFILE_INTERVAL {
Source: ULONG,
Interval: ULONG,
}}
pub type PTRACE_PROFILE_INTERVAL = *mut TRACE_PROFILE_INTERVAL;
STRUCT!{struct TRACE_VERSION_INFO {
EtwTraceProcessingVersion: UINT,
Reserved: UINT,
}}
pub type PTRACE_VERSION_INFO = *mut TRACE_VERSION_INFO;
STRUCT!{struct TRACE_PERIODIC_CAPTURE_STATE_INFO {
CaptureStateFrequencyInSeconds: ULONG,
ProviderCount: USHORT,
Reserved: USHORT,
}}
pub type PTRACE_PERIODIC_CAPTURE_STATE_INFO = *mut TRACE_PERIODIC_CAPTURE_STATE_INFO;
extern "system" {
pub fn TraceSetInformation(
SessionHandle: TRACEHANDLE,
InformationClass: TRACE_INFO_CLASS,
TraceInformation: PVOID,
InformationLength: ULONG,
) -> ULONG;
pub fn TraceQueryInformation(
SessionHandle: TRACEHANDLE,
InformationClass: TRACE_QUERY_INFO_CLASS,
TraceInformation: PVOID,
InformationLength: ULONG,
ReturnLength: PULONG,
) -> ULONG;
pub fn CreateTraceInstanceId(
RegHandle: HANDLE,
pInstInfo: PEVENT_INSTANCE_INFO,
) -> ULONG;
pub fn TraceEvent(
SessionHandle: TRACEHANDLE,
EventTrace: PEVENT_TRACE_HEADER,
) -> ULONG;
pub fn TraceEventInstance(
SessionHandle: TRACEHANDLE,
EventTrace: PEVENT_TRACE_HEADER,
pInstInfo: PEVENT_INSTANCE_INFO,
pParentInstInfo: PEVENT_INSTANCE_INFO,
) -> ULONG;
pub fn RegisterTraceGuidsW(
RequestAddress: WMIDPREQUEST,
RequestContext: PVOID,
ControlGuid: LPCGUID,
GuidCount: ULONG,
TraceGuidReg: PTRACE_GUID_REGISTRATION,
MofImagePath: LPCWSTR,
MofResourceName: LPCWSTR,
RegistrationHandle: PTRACEHANDLE,
) -> ULONG;
pub fn RegisterTraceGuidsA(
RequestAddress: WMIDPREQUEST,
RequestContext: PVOID,
ControlGuid: LPCGUID,
GuidCount: ULONG,
TraceGuidReg: PTRACE_GUID_REGISTRATION,
MofImagePath: LPCSTR,
MofResourceName: LPCSTR,
RegistrationHandle: PTRACEHANDLE,
) -> ULONG;
pub fn EnumerateTraceGuids(
GuidPropertiesArray: *mut PTRACE_GUID_PROPERTIES,
PropertyArrayCount: ULONG,
GuidCount: PULONG,
) -> ULONG;
pub fn UnregisterTraceGuids(
RegistrationHandle: TRACEHANDLE,
) -> ULONG;
pub fn GetTraceLoggerHandle(
Buffer: PVOID,
) -> TRACEHANDLE;
pub fn GetTraceEnableLevel(
SessionHandle: TRACEHANDLE,
) -> UCHAR;
pub fn GetTraceEnableFlags(
SessionHandle: TRACEHANDLE,
) -> ULONG;
pub fn OpenTraceW(
Logfile: PEVENT_TRACE_LOGFILEW,
) -> TRACEHANDLE;
pub fn ProcessTrace(
HandleArray: PTRACEHANDLE,
HandleCount: ULONG,
StartTime: LPFILETIME,
EndTime: LPFILETIME,
) -> ULONG;
pub fn CloseTrace(
TraceHandle: TRACEHANDLE,
) -> ULONG;
}
ENUM!{enum ETW_PROCESS_HANDLE_INFO_TYPE {
EtwQueryPartitionInformation = 1,
EtwQueryProcessHandleInfoMax,
}}
STRUCT!{struct ETW_TRACE_PARTITION_INFORMATION {
PartitionId: GUID,
ParentId: GUID,
Reserved: ULONG64,
PartitionType: ULONG,
}}
pub type PETW_TRACE_PARTITION_INFORMATION = *mut ETW_TRACE_PARTITION_INFORMATION;
extern "system" {
pub fn QueryTraceProcessingHandle(
ProcessingHandle: TRACEHANDLE,
InformationClass: ETW_PROCESS_HANDLE_INFO_TYPE,
InBuffer: PVOID,
InBufferSize: ULONG,
OutBuffer: PVOID,
OutBufferSize: ULONG,
ReturnLength: PULONG,
) -> ULONG;
pub fn OpenTraceA(
Logfile: PEVENT_TRACE_LOGFILEA,
) -> TRACEHANDLE;
pub fn SetTraceCallback(
pGuid: LPCGUID,
EventCallback: PEVENT_CALLBACK,
) -> ULONG;
pub fn RemoveTraceCallback(
pGuid: LPCGUID,
) -> ULONG;
}
extern "C" {
pub fn TraceMessage(
SessionHandle: TRACEHANDLE,
MessageFlags: ULONG,
MessageGuid: LPGUID,
MessageNumber: USHORT,
...
) -> ULONG;
pub fn TraceMessageVa(
SessionHandle: TRACEHANDLE,
MessageFlags: ULONG,
MessageGuid: LPGUID,
MessageNumber: USHORT,
MessageArgList: va_list,
);
}
pub const INVALID_PROCESSTRACE_HANDLE: TRACEHANDLE = INVALID_HANDLE_VALUE as TRACEHANDLE;