1 // Licensed under the Apache License, Version 2.0
2 // <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
3 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
4 // All files in the project carrying such notice may not be copied, modified, or distributed
5 // except according to those terms.
6 use shared::basetsd::{SIZE_T, ULONG64};
7 use shared::guiddef::{LPCGUID, LPGUID};
8 use shared::minwindef::{UCHAR, ULONG, USHORT};
9 use um::winnt::{ANYSIZE_ARRAY, BOOLEAN, PCWSTR, PVOID, ULONGLONG, VOID};
10 pub const EVENT_MIN_LEVEL: UCHAR = 0;
11 pub const EVENT_MAX_LEVEL: UCHAR = 0xff;
12 pub const EVENT_ACTIVITY_CTRL_GET_ID: ULONG = 1;
13 pub const EVENT_ACTIVITY_CTRL_SET_ID: ULONG = 2;
14 pub const EVENT_ACTIVITY_CTRL_CREATE_ID: ULONG = 3;
15 pub const EVENT_ACTIVITY_CTRL_GET_SET_ID: ULONG = 4;
16 pub const EVENT_ACTIVITY_CTRL_CREATE_SET_ID: ULONG = 5;
17 pub const MAX_EVENT_DATA_DESCRIPTORS: SIZE_T = 128;
18 pub const MAX_EVENT_FILTER_DATA_SIZE: SIZE_T = 1024;
19 pub const MAX_EVENT_FILTER_PAYLOAD_SIZE: SIZE_T = 4096;
20 pub const MAX_EVENT_FILTER_EVENT_NAME_SIZE: SIZE_T = 4096;
21 pub const MAX_EVENT_FILTERS_COUNT: SIZE_T = 8;
22 pub const MAX_EVENT_FILTER_PID_COUNT: SIZE_T = 8;
23 pub const MAX_EVENT_FILTER_EVENT_ID_COUNT: SIZE_T = 64;
24 pub const EVENT_FILTER_TYPE_NONE: ULONG = 0x00000000;
25 pub const EVENT_FILTER_TYPE_SCHEMATIZED: ULONG = 0x80000000;
26 pub const EVENT_FILTER_TYPE_SYSTEM_FLAGS: ULONG = 0x80000001;
27 pub const EVENT_FILTER_TYPE_TRACEHANDLE: ULONG = 0x80000002;
28 pub const EVENT_FILTER_TYPE_PID: ULONG = 0x80000004;
29 pub const EVENT_FILTER_TYPE_EXECUTABLE_NAME: ULONG = 0x80000008;
30 pub const EVENT_FILTER_TYPE_PACKAGE_ID: ULONG = 0x80000010;
31 pub const EVENT_FILTER_TYPE_PACKAGE_APP_ID: ULONG = 0x80000020;
32 pub const EVENT_FILTER_TYPE_PAYLOAD: ULONG = 0x80000100;
33 pub const EVENT_FILTER_TYPE_EVENT_ID: ULONG = 0x80000200;
34 pub const EVENT_FILTER_TYPE_EVENT_NAME: ULONG = 0x80000400;
35 pub const EVENT_FILTER_TYPE_STACKWALK: ULONG = 0x80001000;
36 pub const EVENT_FILTER_TYPE_STACKWALK_NAME: ULONG = 0x80001000;
37 pub const EVENT_FILTER_TYPE_STACKWALK_LEVEL_KW: ULONG = 0x80004000;
38 pub const EVENT_DATA_DESCRIPTOR_TYPE_NONE: UCHAR = 0;
39 pub const EVENT_DATA_DESCRIPTOR_TYPE_EVENT_METADATA: UCHAR = 1;
40 pub const EVENT_DATA_DESCRIPTOR_TYPE_PROVIDER_METADATA: UCHAR = 2;
41 pub const EVENT_DATA_DESCRIPTOR_TYPE_TIMESTAMP_OVERRIDE: UCHAR = 3;
42 pub const EVENT_WRITE_FLAG_NO_FAULTING: ULONG = 0x00000001;
43 pub const EVENT_WRITE_FLAG_INPRIVATE: ULONG = 0x00000002;
44 pub type REGHANDLE = ULONGLONG;
45 pub type PREGHANDLE = *mut REGHANDLE;
46 STRUCT!{struct EVENT_DATA_DESCRIPTOR_u_s {
47 Type: UCHAR,
48 Reserved1: UCHAR,
49 Reserved2: USHORT,
50 }}
51 UNION!{union EVENT_DATA_DESCRIPTOR_u {
52 [u32; 1],
53 Reserved Reserved_mut: ULONG,
54 s s_mut: EVENT_DATA_DESCRIPTOR_u_s,
55 }}
56 STRUCT!{struct EVENT_DATA_DESCRIPTOR {
57 Ptr: ULONGLONG,
58 Size: ULONG,
59 u: EVENT_DATA_DESCRIPTOR_u,
60 }}
61 pub type PEVENT_DATA_DESCRIPTOR = *mut EVENT_DATA_DESCRIPTOR;
62 STRUCT!{struct EVENT_DESCRIPTOR {
63 Id: USHORT,
64 Version: UCHAR,
65 Channel: UCHAR,
66 Level: UCHAR,
67 Opcode: UCHAR,
68 Task: USHORT,
69 Keyword: ULONGLONG,
70 }}
71 pub type PEVENT_DESCRIPTOR = *mut EVENT_DESCRIPTOR;
72 pub type PCEVENT_DESCRIPTOR = *const EVENT_DESCRIPTOR;
73 STRUCT!{struct EVENT_FILTER_DESCRIPTOR {
74 Ptr: ULONGLONG,
75 Size: ULONG,
76 Type: ULONG,
77 }}
78 pub type PEVENT_FILTER_DESCRIPTOR = *mut EVENT_FILTER_DESCRIPTOR;
79 STRUCT!{struct EVENT_FILTER_HEADER {
80 Id: USHORT,
81 Version: UCHAR,
82 Reserved: [UCHAR; 5],
83 InstanceId: ULONGLONG,
84 Size: ULONG,
85 NextOffset: ULONG,
86 }}
87 pub type PEVENT_FILTER_HEADER = *mut EVENT_FILTER_HEADER;
88 STRUCT!{struct EVENT_FILTER_EVENT_ID {
89 FilterIn: BOOLEAN,
90 Reserved: UCHAR,
91 Count: USHORT,
92 Events: [USHORT; ANYSIZE_ARRAY],
93 }}
94 pub type PEVENT_FILTER_EVENT_ID = *mut EVENT_FILTER_EVENT_ID;
95 STRUCT!{struct EVENT_FILTER_EVENT_NAME {
96 MatchAnyKeyword: ULONGLONG,
97 MatchAllKeyword: ULONGLONG,
98 Level: UCHAR,
99 FilterIn: BOOLEAN,
100 NameCount: USHORT,
101 Names: [UCHAR; ANYSIZE_ARRAY],
102 }}
103 pub type PEVENT_FILTER_EVENT_NAME = *mut EVENT_FILTER_EVENT_NAME;
104 STRUCT!{struct EVENT_FILTER_LEVEL_KW {
105 MatchAnyKeyword: ULONGLONG,
106 MatchAllKeyword: ULONGLONG,
107 Level: UCHAR,
108 FilterIn: BOOLEAN,
109 }}
110 ENUM!{enum EVENT_INFO_CLASS {
111 EventProviderBinaryTrackInfo,
112 EventProviderSetReserved1,
113 EventProviderSetTraits,
114 EventProviderUseDescriptorType,
115 MaxEventInfo,
116 }}
117 FN!{stdcall PENABLECALLBACK(
118 SourceId: LPCGUID,
119 IsEnabled: ULONG,
120 Level: UCHAR,
121 MatchAnyKeyword: ULONGLONG,
122 MatchAllKeyword: ULONGLONG,
123 FilterData: PEVENT_FILTER_DESCRIPTOR,
124 CallbackContext: PVOID,
125 ) -> ()}
126 extern "system" {
EventRegister( ProviderId: LPCGUID, EnableCallback: PENABLECALLBACK, CallbackContext: PVOID, RegHandle: PREGHANDLE, ) -> ULONG127 pub fn EventRegister(
128 ProviderId: LPCGUID,
129 EnableCallback: PENABLECALLBACK,
130 CallbackContext: PVOID,
131 RegHandle: PREGHANDLE,
132 ) -> ULONG;
EventUnregister( RegHandle: REGHANDLE, ) -> ULONG133 pub fn EventUnregister(
134 RegHandle: REGHANDLE,
135 ) -> ULONG;
EventSetInformation( RegHandle: REGHANDLE, InformationClass: EVENT_INFO_CLASS, EventInformation: PVOID, InformationLength: ULONG, ) -> ULONG136 pub fn EventSetInformation(
137 RegHandle: REGHANDLE,
138 InformationClass: EVENT_INFO_CLASS,
139 EventInformation: PVOID,
140 InformationLength: ULONG,
141 ) -> ULONG;
EventEnabled( RegHandle: REGHANDLE, EventDescriptor: PCEVENT_DESCRIPTOR, ) -> BOOLEAN142 pub fn EventEnabled(
143 RegHandle: REGHANDLE,
144 EventDescriptor: PCEVENT_DESCRIPTOR,
145 ) -> BOOLEAN;
EventProviderEnabled( RegHandle: REGHANDLE, Level: UCHAR, Keyword: ULONGLONG, ) -> BOOLEAN146 pub fn EventProviderEnabled(
147 RegHandle: REGHANDLE,
148 Level: UCHAR,
149 Keyword: ULONGLONG,
150 ) -> BOOLEAN;
EventWrite( RegHandle: REGHANDLE, EventDescriptor: PCEVENT_DESCRIPTOR, UserDataCount: ULONG, UserData: PEVENT_DATA_DESCRIPTOR, ) -> ULONG151 pub fn EventWrite(
152 RegHandle: REGHANDLE,
153 EventDescriptor: PCEVENT_DESCRIPTOR,
154 UserDataCount: ULONG,
155 UserData: PEVENT_DATA_DESCRIPTOR,
156 ) -> ULONG;
EventWriteTransfer( RegHandle: REGHANDLE, EventDescriptor: PCEVENT_DESCRIPTOR, ActivityId: LPCGUID, RelatedActivityId: LPCGUID, UserDataCount: ULONG, UserData: PEVENT_DATA_DESCRIPTOR, ) -> ULONG157 pub fn EventWriteTransfer(
158 RegHandle: REGHANDLE,
159 EventDescriptor: PCEVENT_DESCRIPTOR,
160 ActivityId: LPCGUID,
161 RelatedActivityId: LPCGUID,
162 UserDataCount: ULONG,
163 UserData: PEVENT_DATA_DESCRIPTOR,
164 ) -> ULONG;
EventWriteEx( RegHandle: REGHANDLE, EventDescriptor: PCEVENT_DESCRIPTOR, Filter: ULONG64, Flags: ULONG, ActivityId: LPCGUID, RelatedActivityId: LPCGUID, UserDataCount: ULONG, UserData: PEVENT_DATA_DESCRIPTOR, ) -> ULONG165 pub fn EventWriteEx(
166 RegHandle: REGHANDLE,
167 EventDescriptor: PCEVENT_DESCRIPTOR,
168 Filter: ULONG64,
169 Flags: ULONG,
170 ActivityId: LPCGUID,
171 RelatedActivityId: LPCGUID,
172 UserDataCount: ULONG,
173 UserData: PEVENT_DATA_DESCRIPTOR,
174 ) -> ULONG;
EventWriteString( RegHandle: REGHANDLE, Level: UCHAR, Keyword: ULONGLONG, EventString: PCWSTR, ) -> ULONG175 pub fn EventWriteString(
176 RegHandle: REGHANDLE,
177 Level: UCHAR,
178 Keyword: ULONGLONG,
179 EventString: PCWSTR,
180 ) -> ULONG;
EventActivityIdControl( ControlCode: ULONG, ActivityId: LPGUID, ) -> ULONG181 pub fn EventActivityIdControl(
182 ControlCode: ULONG,
183 ActivityId: LPGUID,
184 ) -> ULONG;
185 }
186 #[inline]
EventDataDescCreate( EventDataDescriptor: PEVENT_DATA_DESCRIPTOR, DataPtr: *const VOID, DataSize: ULONG, )187 pub unsafe fn EventDataDescCreate(
188 EventDataDescriptor: PEVENT_DATA_DESCRIPTOR,
189 DataPtr: *const VOID,
190 DataSize: ULONG,
191 ) {
192 (*EventDataDescriptor).Ptr = DataPtr as ULONGLONG;
193 (*EventDataDescriptor).Size = DataSize;
194 *(*EventDataDescriptor).u.Reserved_mut() = 0;
195 }
196 #[inline]
EventDescCreate( EventDescriptor: PEVENT_DESCRIPTOR, Id: USHORT, Version: UCHAR, Channel: UCHAR, Level: UCHAR, Task: USHORT, Opcode: UCHAR, Keyword: ULONGLONG, )197 pub unsafe fn EventDescCreate(
198 EventDescriptor: PEVENT_DESCRIPTOR,
199 Id: USHORT,
200 Version: UCHAR,
201 Channel: UCHAR,
202 Level: UCHAR,
203 Task: USHORT,
204 Opcode: UCHAR,
205 Keyword: ULONGLONG,
206 ) {
207 (*EventDescriptor).Id = Id;
208 (*EventDescriptor).Version = Version;
209 (*EventDescriptor).Channel = Channel;
210 (*EventDescriptor).Level = Level;
211 (*EventDescriptor).Task = Task;
212 (*EventDescriptor).Opcode = Opcode;
213 (*EventDescriptor).Keyword = Keyword;
214 }
215 #[inline]
EventDescZero(EventDescriptor: PEVENT_DESCRIPTOR)216 pub unsafe fn EventDescZero(EventDescriptor: PEVENT_DESCRIPTOR) {
217 use core::ptr::write_bytes;
218 // FIXME: 16 = sizeof::<EVENT_DESCRIPTOR>()
219 write_bytes(EventDescriptor, 0, 16);
220 }
221 #[inline]
EventDescGetId(EventDescriptor: PCEVENT_DESCRIPTOR) -> USHORT222 pub unsafe fn EventDescGetId(EventDescriptor: PCEVENT_DESCRIPTOR) -> USHORT {
223 (*EventDescriptor).Id
224 }
225 #[inline]
EventDescGetVersion(EventDescriptor: PCEVENT_DESCRIPTOR) -> UCHAR226 pub unsafe fn EventDescGetVersion(EventDescriptor: PCEVENT_DESCRIPTOR) -> UCHAR {
227 (*EventDescriptor).Version
228 }
229 #[inline]
EventDescGetTask(EventDescriptor: PCEVENT_DESCRIPTOR) -> USHORT230 pub unsafe fn EventDescGetTask(EventDescriptor: PCEVENT_DESCRIPTOR) -> USHORT {
231 (*EventDescriptor).Task
232 }
233 #[inline]
EventDescGetOpcode(EventDescriptor: PCEVENT_DESCRIPTOR) -> UCHAR234 pub unsafe fn EventDescGetOpcode(EventDescriptor: PCEVENT_DESCRIPTOR) -> UCHAR {
235 (*EventDescriptor).Opcode
236 }
237 #[inline]
EventDescGetChannel(EventDescriptor: PCEVENT_DESCRIPTOR) -> UCHAR238 pub unsafe fn EventDescGetChannel(EventDescriptor: PCEVENT_DESCRIPTOR) -> UCHAR {
239 (*EventDescriptor).Channel
240 }
241 #[inline]
EventDescGetLevel(EventDescriptor: PCEVENT_DESCRIPTOR) -> UCHAR242 pub unsafe fn EventDescGetLevel(EventDescriptor: PCEVENT_DESCRIPTOR) -> UCHAR {
243 (*EventDescriptor).Level
244 }
245 #[inline]
EventDescGetKeyword(EventDescriptor: PCEVENT_DESCRIPTOR) -> ULONGLONG246 pub unsafe fn EventDescGetKeyword(EventDescriptor: PCEVENT_DESCRIPTOR) -> ULONGLONG {
247 (*EventDescriptor).Keyword
248 }
249 #[inline]
EventDescSetId(EventDescriptor: PEVENT_DESCRIPTOR, Id: USHORT) -> PEVENT_DESCRIPTOR250 pub unsafe fn EventDescSetId(EventDescriptor: PEVENT_DESCRIPTOR, Id: USHORT) -> PEVENT_DESCRIPTOR {
251 (*EventDescriptor).Id = Id;
252 EventDescriptor
253 }
254 #[inline]
EventDescSetVersion( EventDescriptor: PEVENT_DESCRIPTOR, Version: UCHAR, ) -> PEVENT_DESCRIPTOR255 pub unsafe fn EventDescSetVersion(
256 EventDescriptor: PEVENT_DESCRIPTOR,
257 Version: UCHAR,
258 ) -> PEVENT_DESCRIPTOR {
259 (*EventDescriptor).Version = Version;
260 EventDescriptor
261 }
262 #[inline]
EventDescSetTask( EventDescriptor: PEVENT_DESCRIPTOR, Task: USHORT, ) -> PEVENT_DESCRIPTOR263 pub unsafe fn EventDescSetTask(
264 EventDescriptor: PEVENT_DESCRIPTOR,
265 Task: USHORT,
266 ) -> PEVENT_DESCRIPTOR {
267 (*EventDescriptor).Task = Task;
268 EventDescriptor
269 }
270 #[inline]
EventDescSetOpcode( EventDescriptor: PEVENT_DESCRIPTOR, Opcode: UCHAR, ) -> PEVENT_DESCRIPTOR271 pub unsafe fn EventDescSetOpcode(
272 EventDescriptor: PEVENT_DESCRIPTOR,
273 Opcode: UCHAR,
274 ) -> PEVENT_DESCRIPTOR {
275 (*EventDescriptor).Opcode = Opcode;
276 EventDescriptor
277 }
278 #[inline]
EventDescSetLevel( EventDescriptor: PEVENT_DESCRIPTOR, Level: UCHAR, ) -> PEVENT_DESCRIPTOR279 pub unsafe fn EventDescSetLevel(
280 EventDescriptor: PEVENT_DESCRIPTOR,
281 Level: UCHAR,
282 ) -> PEVENT_DESCRIPTOR {
283 (*EventDescriptor).Level = Level;
284 EventDescriptor
285 }
286 #[inline]
EventDescSetChannel( EventDescriptor: PEVENT_DESCRIPTOR, Channel: UCHAR, ) -> PEVENT_DESCRIPTOR287 pub unsafe fn EventDescSetChannel(
288 EventDescriptor: PEVENT_DESCRIPTOR,
289 Channel: UCHAR,
290 ) -> PEVENT_DESCRIPTOR {
291 (*EventDescriptor).Channel = Channel;
292 EventDescriptor
293 }
294 #[inline]
EventDescSetKeyword( EventDescriptor: PEVENT_DESCRIPTOR, Keyword: ULONGLONG, ) -> PEVENT_DESCRIPTOR295 pub unsafe fn EventDescSetKeyword(
296 EventDescriptor: PEVENT_DESCRIPTOR,
297 Keyword: ULONGLONG,
298 ) -> PEVENT_DESCRIPTOR {
299 (*EventDescriptor).Keyword = Keyword;
300 EventDescriptor
301 }
302 #[inline]
EventDescOrKeyword( EventDescriptor: PEVENT_DESCRIPTOR, Keyword: ULONGLONG, ) -> PEVENT_DESCRIPTOR303 pub unsafe fn EventDescOrKeyword(
304 EventDescriptor: PEVENT_DESCRIPTOR,
305 Keyword: ULONGLONG,
306 ) -> PEVENT_DESCRIPTOR {
307 (*EventDescriptor).Keyword |= Keyword;
308 EventDescriptor
309 }
310