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;
7 use shared::guiddef::{GUID, LPCGUID, LPGUID};
8 use shared::minwindef::{DWORD, LPBYTE, LPDWORD, LPVOID, ULONG};
9 use um::minwinbase::SYSTEMTIME;
10 use um::winnt::{HANDLE, LONG, LONGLONG, LPCWSTR, PCWSTR, PHANDLE, PVOID, ULONGLONG};
11 pub const PERF_PROVIDER_USER_MODE: ULONG = 0;
12 pub const PERF_PROVIDER_KERNEL_MODE: ULONG = 1;
13 pub const PERF_PROVIDER_DRIVER: ULONG = 2;
14 pub const PERF_COUNTERSET_FLAG_MULTIPLE: ULONG = 2;
15 pub const PERF_COUNTERSET_FLAG_AGGREGATE: ULONG = 4;
16 pub const PERF_COUNTERSET_FLAG_HISTORY: ULONG = 8;
17 pub const PERF_COUNTERSET_FLAG_INSTANCE: ULONG = 16;
18 pub const PERF_COUNTERSET_SINGLE_INSTANCE: ULONG = 0;
19 pub const PERF_COUNTERSET_MULTI_INSTANCES: ULONG = PERF_COUNTERSET_FLAG_MULTIPLE;
20 pub const PERF_COUNTERSET_SINGLE_AGGREGATE: ULONG = PERF_COUNTERSET_FLAG_AGGREGATE;
21 pub const PERF_COUNTERSET_MULTI_AGGREGATE: ULONG = PERF_COUNTERSET_FLAG_AGGREGATE
22     | PERF_COUNTERSET_FLAG_MULTIPLE;
23 pub const PERF_COUNTERSET_SINGLE_AGGREGATE_HISTORY: ULONG = PERF_COUNTERSET_FLAG_HISTORY
24     | PERF_COUNTERSET_SINGLE_AGGREGATE;
25 pub const PERF_COUNTERSET_INSTANCE_AGGREGATE: ULONG = PERF_COUNTERSET_MULTI_AGGREGATE
26     | PERF_COUNTERSET_FLAG_INSTANCE;
27 pub const PERF_AGGREGATE_UNDEFINED: ULONG = 0;
28 pub const PERF_AGGREGATE_TOTAL: ULONG = 1;
29 pub const PERF_AGGREGATE_AVG: ULONG = 2;
30 pub const PERF_AGGREGATE_MIN: ULONG = 3;
31 pub const PERF_AGGREGATE_MAX: ULONG = 4;
32 pub const PERF_ATTRIB_BY_REFERENCE: ULONGLONG = 0x0000000000000001;
33 pub const PERF_ATTRIB_NO_DISPLAYABLE: ULONGLONG = 0x0000000000000002;
34 pub const PERF_ATTRIB_NO_GROUP_SEPARATOR: ULONGLONG = 0x0000000000000004;
35 pub const PERF_ATTRIB_DISPLAY_AS_REAL: ULONGLONG = 0x0000000000000008;
36 pub const PERF_ATTRIB_DISPLAY_AS_HEX: ULONGLONG = 0x0000000000000010;
37 STRUCT!{struct PERF_COUNTERSET_INFO {
38     CounterSetGuid: GUID,
39     ProviderGuid: GUID,
40     NumCounters: ULONG,
41     InstanceType: ULONG,
42 }}
43 pub type PPERF_COUNTERSET_INFO = *mut PERF_COUNTERSET_INFO;
44 STRUCT!{struct PERF_COUNTER_INFO {
45     CounterId: ULONG,
46     Type: ULONG,
47     Attrib: ULONGLONG,
48     Size: ULONG,
49     DetailLevel: ULONG,
50     Scale: LONG,
51     Offset: LONG,
52 }}
53 pub type PPERF_COUNTER_INFO = *mut PERF_COUNTER_INFO;
54 STRUCT!{struct PERF_COUNTERSET_INSTANCE {
55     CounterSetGuid: GUID,
56     dwSize: ULONG,
57     InstanceId: ULONG,
58     InstanceNameOffset: ULONG,
59     InstanceNameSize: ULONG,
60 }}
61 pub type PPERF_COUNTERSET_INSTANCE = *mut PERF_COUNTERSET_INSTANCE;
62 STRUCT!{struct PERF_COUNTER_IDENTITY {
63     CounterSetGuid: GUID,
64     BufferSize: ULONG,
65     CounterId: ULONG,
66     InstanceId: ULONG,
67     MachineOffset: ULONG,
68     NameOffset: ULONG,
69     Reserved: ULONG,
70 }}
71 pub type PPERF_COUNTER_IDENTITY = *mut PERF_COUNTER_IDENTITY;
72 pub const PERF_WILDCARD_COUNTER: ULONG = 0xFFFFFFFF;
73 pub const PERF_WILDCARD_INSTANCE: &'static str = "*";
74 pub const PERF_AGGREGATE_INSTANCE: &'static str = "_Total";
75 pub const PERF_MAX_INSTANCE_NAME: ULONG = 1024;
76 pub const PERF_ADD_COUNTER: ULONG = 1;
77 pub const PERF_REMOVE_COUNTER: ULONG = 2;
78 pub const PERF_ENUM_INSTANCES: ULONG = 3;
79 pub const PERF_COLLECT_START: ULONG = 5;
80 pub const PERF_COLLECT_END: ULONG = 6;
81 pub const PERF_FILTER: ULONG = 9;
82 FN!{stdcall PERFLIBREQUEST(
83     RequestCode: ULONG,
84     Buffer: PVOID,
85     BufferSize: ULONG,
86 ) -> ULONG}
87 FN!{stdcall PERF_MEM_ALLOC(
88     AllocSize: SIZE_T,
89     pContext: LPVOID,
90 ) -> LPVOID}
91 FN!{stdcall PERF_MEM_FREE(
92     pBuffer: LPVOID,
93     pContext: LPVOID,
94 ) -> ()}
95 STRUCT!{struct PERF_PROVIDER_CONTEXT {
96     ContextSize: DWORD,
97     Reserved: DWORD,
98     ControlCallback: PERFLIBREQUEST,
99     MemAllocRoutine: PERF_MEM_ALLOC,
100     MemFreeRoutine: PERF_MEM_FREE,
101     pMemContext: LPVOID,
102 }}
103 pub type PPERF_PROVIDER_CONTEXT = *mut PERF_PROVIDER_CONTEXT;
104 extern "system" {
PerfStartProviderEx( ProviderGuid: LPGUID, ProviderContext: PPERF_PROVIDER_CONTEXT, Provider: PHANDLE, ) -> ULONG105     pub fn PerfStartProviderEx(
106         ProviderGuid: LPGUID,
107         ProviderContext: PPERF_PROVIDER_CONTEXT,
108         Provider: PHANDLE,
109     ) -> ULONG;
PerfStartProvider( ProviderGuid: LPGUID, ControlCallback: PERFLIBREQUEST, Provider: PHANDLE, ) -> ULONG110     pub fn PerfStartProvider(
111         ProviderGuid: LPGUID,
112         ControlCallback: PERFLIBREQUEST,
113         Provider: PHANDLE,
114     ) -> ULONG;
PerfStopProvider( ProviderHandle: HANDLE, ) -> ULONG115     pub fn PerfStopProvider(
116         ProviderHandle: HANDLE,
117     ) -> ULONG;
PerfSetCounterSetInfo( ProviderHandle: HANDLE, Template: PPERF_COUNTERSET_INFO, TemplateSize: ULONG, ) -> ULONG118     pub fn PerfSetCounterSetInfo(
119         ProviderHandle: HANDLE,
120         Template: PPERF_COUNTERSET_INFO,
121         TemplateSize: ULONG,
122     ) -> ULONG;
PerfCreateInstance( ProviderHandle: HANDLE, CounterSetGuid: LPCGUID, Name: PCWSTR, Id: ULONG, ) -> PPERF_COUNTERSET_INSTANCE123     pub fn PerfCreateInstance(
124         ProviderHandle: HANDLE,
125         CounterSetGuid: LPCGUID,
126         Name: PCWSTR,
127         Id: ULONG,
128     ) -> PPERF_COUNTERSET_INSTANCE;
PerfDeleteInstance( Provider: HANDLE, InstanceBlock: PPERF_COUNTERSET_INSTANCE, ) -> ULONG129     pub fn PerfDeleteInstance(
130         Provider: HANDLE,
131         InstanceBlock: PPERF_COUNTERSET_INSTANCE,
132     ) -> ULONG;
PerfQueryInstance( ProviderHandle: HANDLE, CounterSetGuid: LPCGUID, Name: LPCWSTR, Id: ULONG, ) -> PPERF_COUNTERSET_INSTANCE133     pub fn PerfQueryInstance(
134         ProviderHandle: HANDLE,
135         CounterSetGuid: LPCGUID,
136         Name: LPCWSTR,
137         Id: ULONG,
138     ) -> PPERF_COUNTERSET_INSTANCE;
PerfSetCounterRefValue( Provider: HANDLE, Instance: PPERF_COUNTERSET_INSTANCE, CounterId: ULONG, Address: PVOID, ) -> ULONG139     pub fn PerfSetCounterRefValue(
140         Provider: HANDLE,
141         Instance: PPERF_COUNTERSET_INSTANCE,
142         CounterId: ULONG,
143         Address: PVOID,
144     ) -> ULONG;
PerfSetULongCounterValue( Provider: HANDLE, Instance: PPERF_COUNTERSET_INSTANCE, CounterId: ULONG, Value: ULONG, ) -> ULONG145     pub fn PerfSetULongCounterValue(
146         Provider: HANDLE,
147         Instance: PPERF_COUNTERSET_INSTANCE,
148         CounterId: ULONG,
149         Value: ULONG,
150     ) -> ULONG;
PerfSetULongLongCounterValue( Provider: HANDLE, Instance: PPERF_COUNTERSET_INSTANCE, CounterId: ULONG, Value: ULONGLONG, ) -> ULONG151     pub fn PerfSetULongLongCounterValue(
152         Provider: HANDLE,
153         Instance: PPERF_COUNTERSET_INSTANCE,
154         CounterId: ULONG,
155         Value: ULONGLONG,
156     ) -> ULONG;
PerfIncrementULongCounterValue( Provider: HANDLE, Instance: PPERF_COUNTERSET_INSTANCE, CounterId: ULONG, Value: ULONG, ) -> ULONG157     pub fn PerfIncrementULongCounterValue(
158         Provider: HANDLE,
159         Instance: PPERF_COUNTERSET_INSTANCE,
160         CounterId: ULONG,
161         Value: ULONG,
162     ) -> ULONG;
PerfIncrementULongLongCounterValue( Provider: HANDLE, Instance: PPERF_COUNTERSET_INSTANCE, CounterId: ULONG, Value: ULONGLONG, ) -> ULONG163     pub fn PerfIncrementULongLongCounterValue(
164         Provider: HANDLE,
165         Instance: PPERF_COUNTERSET_INSTANCE,
166         CounterId: ULONG,
167         Value: ULONGLONG,
168     ) -> ULONG;
PerfDecrementULongCounterValue( Provider: HANDLE, Instance: PPERF_COUNTERSET_INSTANCE, CounterId: ULONG, Value: ULONG, ) -> ULONG169     pub fn PerfDecrementULongCounterValue(
170         Provider: HANDLE,
171         Instance: PPERF_COUNTERSET_INSTANCE,
172         CounterId: ULONG,
173         Value: ULONG,
174     ) -> ULONG;
PerfDecrementULongLongCounterValue( Provider: HANDLE, Instance: PPERF_COUNTERSET_INSTANCE, CounterId: ULONG, Value: ULONGLONG, ) -> ULONG175     pub fn PerfDecrementULongLongCounterValue(
176         Provider: HANDLE,
177         Instance: PPERF_COUNTERSET_INSTANCE,
178         CounterId: ULONG,
179         Value: ULONGLONG,
180     ) -> ULONG;
181 }
182 STRUCT!{struct PERF_INSTANCE_HEADER {
183     Size: ULONG,
184     InstanceId: ULONG,
185 }}
186 pub type PPERF_INSTANCE_HEADER = *mut PERF_INSTANCE_HEADER;
187 ENUM!{enum PerfRegInfoType {
188     PERF_REG_COUNTERSET_STRUCT = 1,
189     PERF_REG_COUNTER_STRUCT,
190     PERF_REG_COUNTERSET_NAME_STRING,
191     PERF_REG_COUNTERSET_HELP_STRING,
192     PERF_REG_COUNTER_NAME_STRINGS,
193     PERF_REG_COUNTER_HELP_STRINGS,
194     PERF_REG_PROVIDER_NAME,
195     PERF_REG_PROVIDER_GUID,
196     PERF_REG_COUNTERSET_ENGLISH_NAME,
197     PERF_REG_COUNTER_ENGLISH_NAMES,
198 }}
199 STRUCT!{struct PERF_COUNTERSET_REG_INFO {
200     CounterSetGuid: GUID,
201     CounterSetType: ULONG,
202     DetailLevel: ULONG,
203     NumCounters: ULONG,
204     InstanceType: ULONG,
205 }}
206 pub type PPERF_COUNTERSET_REG_INFO = *mut PERF_COUNTERSET_REG_INFO;
207 STRUCT!{struct PERF_COUNTER_REG_INFO {
208     CounterId: ULONG,
209     Type: ULONG,
210     Attrib: ULONGLONG,
211     DetailLevel: ULONG,
212     DefaultScale: LONG,
213     BaseCounterId: ULONG,
214     PerfTimeId: ULONG,
215     PerfFreqId: ULONG,
216     MultiId: ULONG,
217     AggregateFinc: ULONG,
218     Reserved: ULONG,
219 }}
220 pub type PPERF_COUNTER_REG_INFO = *mut PERF_COUNTER_REG_INFO;
221 STRUCT!{struct PERF_STRING_BUFFER_HEADER {
222     dwSize: DWORD,
223     dwCounters: DWORD,
224 }}
225 pub type PPERF_STRING_BUFFER_HEADER = *mut PERF_STRING_BUFFER_HEADER;
226 STRUCT!{struct PERF_STRING_COUNTER_HEADER {
227     dwCounterId: DWORD,
228     dwOffset: DWORD,
229 }}
230 pub type PPERF_STRING_COUNTER_HEADER = *mut PERF_STRING_COUNTER_HEADER;
231 STRUCT!{struct PERF_COUNTER_IDENTIFIER {
232     CounterSetGuid: GUID,
233     Status: ULONG,
234     Size: ULONG,
235     CounterId: ULONG,
236     InstanceId: ULONG,
237     Index: ULONG,
238     Reserved: ULONG,
239 }}
240 pub type PPERF_COUNTER_IDENTIFIER = *mut PERF_COUNTER_IDENTIFIER;
241 STRUCT!{struct PERF_DATA_HEADER {
242     dwTotalSize: ULONG,
243     dwNumCounters: ULONG,
244     PerfTimeStamp: LONGLONG,
245     PerfTime100NSec: LONGLONG,
246     PrefFreq: LONGLONG,
247     SystemTime: SYSTEMTIME,
248 }}
249 pub type PPERF_DATA_HEADER = *mut PERF_DATA_HEADER;
250 ENUM!{enum PerfCounterDataType {
251     PERF_ERROR_RETURN = 0,
252     PERF_SINGLE_COUNTER = 1,
253     PERF_MULTIPLE_COUNTERS = 2,
254     PERF_MULTIPLE_INSTANCES = 4,
255     PERF_COUNTERSET = 6,
256 }}
257 STRUCT!{struct PERF_COUNTER_HEADER {
258     dwStatus: ULONG,
259     dwType: PerfCounterDataType,
260     dwSize: ULONG,
261     Reserved: ULONG,
262 }}
263 pub type PPERF_COUNTER_HEADER = *mut PERF_COUNTER_HEADER;
264 STRUCT!{struct PERF_MULTI_INSTANCES {
265     dwTotalSize: ULONG,
266     dwInstances: ULONG,
267 }}
268 pub type PPERF_MULTI_INSTANCES = *mut PERF_MULTI_INSTANCES;
269 STRUCT!{struct PERF_MULTI_COUNTERS {
270     dwSize: ULONG,
271     dwCounters: ULONG,
272 }}
273 pub type PPERF_MULTI_COUNTERS = *mut PERF_MULTI_COUNTERS;
274 STRUCT!{struct PERF_COUNTER_DATA {
275     dwDataSize: ULONG,
276     dwSize: ULONG,
277 }}
278 pub type PPERF_COUNTER_DATA = *mut PERF_COUNTER_DATA;
279 extern "system" {
PerfEnumerateCounterSet( szMachine: LPCWSTR, pCounterSetIds: LPGUID, cCounterSetIds: DWORD, pcCounterSetIdsActual: LPDWORD, ) -> ULONG280     pub fn PerfEnumerateCounterSet(
281         szMachine: LPCWSTR,
282         pCounterSetIds: LPGUID,
283         cCounterSetIds: DWORD,
284         pcCounterSetIdsActual: LPDWORD,
285     ) -> ULONG;
PerfEnumerateCounterSetInstances( szMachine: LPCWSTR, pCounterSetIds: LPCGUID, pInstances: PPERF_INSTANCE_HEADER, cbInstances: DWORD, pcbInstancesActual: LPDWORD, ) -> ULONG286     pub fn PerfEnumerateCounterSetInstances(
287         szMachine: LPCWSTR,
288         pCounterSetIds: LPCGUID,
289         pInstances: PPERF_INSTANCE_HEADER,
290         cbInstances: DWORD,
291         pcbInstancesActual: LPDWORD,
292     ) -> ULONG;
PerfQueryCounterSetRegistrationInfo( szMachine: LPCWSTR, pCounterSetId: LPCGUID, requestCode: PerfRegInfoType, requestLangId: DWORD, pbRegInfo: LPBYTE, cbRegInfo: DWORD, pcbRegInfoActual: LPDWORD, ) -> ULONG293     pub fn PerfQueryCounterSetRegistrationInfo(
294         szMachine: LPCWSTR,
295         pCounterSetId: LPCGUID,
296         requestCode: PerfRegInfoType,
297         requestLangId: DWORD,
298         pbRegInfo: LPBYTE,
299         cbRegInfo: DWORD,
300         pcbRegInfoActual: LPDWORD,
301     ) -> ULONG;
PerfOpenQueryHandle( szMachine: LPCWSTR, hQuery: *mut HANDLE, ) -> ULONG302     pub fn PerfOpenQueryHandle(
303         szMachine: LPCWSTR,
304         hQuery: *mut HANDLE,
305     ) -> ULONG;
PerfCloseQueryHandle( hQuery: HANDLE, ) -> ULONG306     pub fn PerfCloseQueryHandle(
307         hQuery: HANDLE,
308     ) -> ULONG;
PerfQueryCounterInfo( hQuery: HANDLE, pCounters: PPERF_COUNTER_IDENTIFIER, cbCounters: DWORD, pcbCountersActual: LPDWORD, ) -> ULONG309     pub fn PerfQueryCounterInfo(
310         hQuery: HANDLE,
311         pCounters: PPERF_COUNTER_IDENTIFIER,
312         cbCounters: DWORD,
313         pcbCountersActual: LPDWORD,
314     ) -> ULONG;
PerfQueryCounterData( hQuery: HANDLE, pCounterBlock: PPERF_DATA_HEADER, cbCounterBlock: DWORD, pcbCounterBlockActual: LPDWORD, ) -> ULONG315     pub fn PerfQueryCounterData(
316         hQuery: HANDLE,
317         pCounterBlock: PPERF_DATA_HEADER,
318         cbCounterBlock: DWORD,
319         pcbCounterBlockActual: LPDWORD,
320     ) -> ULONG;
PerfAddCounters( hQuery: HANDLE, pCounters: PPERF_COUNTER_IDENTIFIER, cbCounters: DWORD, ) -> ULONG321     pub fn PerfAddCounters(
322         hQuery: HANDLE,
323         pCounters: PPERF_COUNTER_IDENTIFIER,
324         cbCounters: DWORD,
325     ) -> ULONG;
PerfDeleteCounters( hQuery: HANDLE, pCounters: PPERF_COUNTER_IDENTIFIER, cbCounters: DWORD, ) -> ULONG326     pub fn PerfDeleteCounters(
327         hQuery: HANDLE,
328         pCounters: PPERF_COUNTER_IDENTIFIER,
329         cbCounters: DWORD,
330     ) -> ULONG;
331 }
332