1use shared::basetsd::SIZE_T;
7use shared::guiddef::{GUID, LPCGUID, LPGUID};
8use shared::minwindef::{DWORD, LPBYTE, LPDWORD, LPVOID, ULONG};
9use um::minwinbase::SYSTEMTIME;
10use um::winnt::{HANDLE, LONG, LONGLONG, LPCWSTR, PCWSTR, PHANDLE, PVOID, ULONGLONG};
11pub const PERF_PROVIDER_USER_MODE: ULONG = 0;
12pub const PERF_PROVIDER_KERNEL_MODE: ULONG = 1;
13pub const PERF_PROVIDER_DRIVER: ULONG = 2;
14pub const PERF_COUNTERSET_FLAG_MULTIPLE: ULONG = 2;
15pub const PERF_COUNTERSET_FLAG_AGGREGATE: ULONG = 4;
16pub const PERF_COUNTERSET_FLAG_HISTORY: ULONG = 8;
17pub const PERF_COUNTERSET_FLAG_INSTANCE: ULONG = 16;
18pub const PERF_COUNTERSET_SINGLE_INSTANCE: ULONG = 0;
19pub const PERF_COUNTERSET_MULTI_INSTANCES: ULONG = PERF_COUNTERSET_FLAG_MULTIPLE;
20pub const PERF_COUNTERSET_SINGLE_AGGREGATE: ULONG = PERF_COUNTERSET_FLAG_AGGREGATE;
21pub const PERF_COUNTERSET_MULTI_AGGREGATE: ULONG = PERF_COUNTERSET_FLAG_AGGREGATE
22 | PERF_COUNTERSET_FLAG_MULTIPLE;
23pub const PERF_COUNTERSET_SINGLE_AGGREGATE_HISTORY: ULONG = PERF_COUNTERSET_FLAG_HISTORY
24 | PERF_COUNTERSET_SINGLE_AGGREGATE;
25pub const PERF_COUNTERSET_INSTANCE_AGGREGATE: ULONG = PERF_COUNTERSET_MULTI_AGGREGATE
26 | PERF_COUNTERSET_FLAG_INSTANCE;
27pub const PERF_AGGREGATE_UNDEFINED: ULONG = 0;
28pub const PERF_AGGREGATE_TOTAL: ULONG = 1;
29pub const PERF_AGGREGATE_AVG: ULONG = 2;
30pub const PERF_AGGREGATE_MIN: ULONG = 3;
31pub const PERF_AGGREGATE_MAX: ULONG = 4;
32pub const PERF_ATTRIB_BY_REFERENCE: ULONGLONG = 0x0000000000000001;
33pub const PERF_ATTRIB_NO_DISPLAYABLE: ULONGLONG = 0x0000000000000002;
34pub const PERF_ATTRIB_NO_GROUP_SEPARATOR: ULONGLONG = 0x0000000000000004;
35pub const PERF_ATTRIB_DISPLAY_AS_REAL: ULONGLONG = 0x0000000000000008;
36pub const PERF_ATTRIB_DISPLAY_AS_HEX: ULONGLONG = 0x0000000000000010;
37STRUCT!{struct PERF_COUNTERSET_INFO {
38 CounterSetGuid: GUID,
39 ProviderGuid: GUID,
40 NumCounters: ULONG,
41 InstanceType: ULONG,
42}}
43pub type PPERF_COUNTERSET_INFO = *mut PERF_COUNTERSET_INFO;
44STRUCT!{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}}
53pub type PPERF_COUNTER_INFO = *mut PERF_COUNTER_INFO;
54STRUCT!{struct PERF_COUNTERSET_INSTANCE {
55 CounterSetGuid: GUID,
56 dwSize: ULONG,
57 InstanceId: ULONG,
58 InstanceNameOffset: ULONG,
59 InstanceNameSize: ULONG,
60}}
61pub type PPERF_COUNTERSET_INSTANCE = *mut PERF_COUNTERSET_INSTANCE;
62STRUCT!{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}}
71pub type PPERF_COUNTER_IDENTITY = *mut PERF_COUNTER_IDENTITY;
72pub const PERF_WILDCARD_COUNTER: ULONG = 0xFFFFFFFF;
73pub const PERF_WILDCARD_INSTANCE: &'static str = "*";
74pub const PERF_AGGREGATE_INSTANCE: &'static str = "_Total";
75pub const PERF_MAX_INSTANCE_NAME: ULONG = 1024;
76pub const PERF_ADD_COUNTER: ULONG = 1;
77pub const PERF_REMOVE_COUNTER: ULONG = 2;
78pub const PERF_ENUM_INSTANCES: ULONG = 3;
79pub const PERF_COLLECT_START: ULONG = 5;
80pub const PERF_COLLECT_END: ULONG = 6;
81pub const PERF_FILTER: ULONG = 9;
82FN!{stdcall PERFLIBREQUEST(
83 RequestCode: ULONG,
84 Buffer: PVOID,
85 BufferSize: ULONG,
86) -> ULONG}
87FN!{stdcall PERF_MEM_ALLOC(
88 AllocSize: SIZE_T,
89 pContext: LPVOID,
90) -> LPVOID}
91FN!{stdcall PERF_MEM_FREE(
92 pBuffer: LPVOID,
93 pContext: LPVOID,
94) -> ()}
95STRUCT!{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}}
103pub type PPERF_PROVIDER_CONTEXT = *mut PERF_PROVIDER_CONTEXT;
104extern "system" {
105 pub fn PerfStartProviderEx(
106 ProviderGuid: LPGUID,
107 ProviderContext: PPERF_PROVIDER_CONTEXT,
108 Provider: PHANDLE,
109 ) -> ULONG;
110 pub fn PerfStartProvider(
111 ProviderGuid: LPGUID,
112 ControlCallback: PERFLIBREQUEST,
113 Provider: PHANDLE,
114 ) -> ULONG;
115 pub fn PerfStopProvider(
116 ProviderHandle: HANDLE,
117 ) -> ULONG;
118 pub fn PerfSetCounterSetInfo(
119 ProviderHandle: HANDLE,
120 Template: PPERF_COUNTERSET_INFO,
121 TemplateSize: ULONG,
122 ) -> ULONG;
123 pub fn PerfCreateInstance(
124 ProviderHandle: HANDLE,
125 CounterSetGuid: LPCGUID,
126 Name: PCWSTR,
127 Id: ULONG,
128 ) -> PPERF_COUNTERSET_INSTANCE;
129 pub fn PerfDeleteInstance(
130 Provider: HANDLE,
131 InstanceBlock: PPERF_COUNTERSET_INSTANCE,
132 ) -> ULONG;
133 pub fn PerfQueryInstance(
134 ProviderHandle: HANDLE,
135 CounterSetGuid: LPCGUID,
136 Name: LPCWSTR,
137 Id: ULONG,
138 ) -> PPERF_COUNTERSET_INSTANCE;
139 pub fn PerfSetCounterRefValue(
140 Provider: HANDLE,
141 Instance: PPERF_COUNTERSET_INSTANCE,
142 CounterId: ULONG,
143 Address: PVOID,
144 ) -> ULONG;
145 pub fn PerfSetULongCounterValue(
146 Provider: HANDLE,
147 Instance: PPERF_COUNTERSET_INSTANCE,
148 CounterId: ULONG,
149 Value: ULONG,
150 ) -> ULONG;
151 pub fn PerfSetULongLongCounterValue(
152 Provider: HANDLE,
153 Instance: PPERF_COUNTERSET_INSTANCE,
154 CounterId: ULONG,
155 Value: ULONGLONG,
156 ) -> ULONG;
157 pub fn PerfIncrementULongCounterValue(
158 Provider: HANDLE,
159 Instance: PPERF_COUNTERSET_INSTANCE,
160 CounterId: ULONG,
161 Value: ULONG,
162 ) -> ULONG;
163 pub fn PerfIncrementULongLongCounterValue(
164 Provider: HANDLE,
165 Instance: PPERF_COUNTERSET_INSTANCE,
166 CounterId: ULONG,
167 Value: ULONGLONG,
168 ) -> ULONG;
169 pub fn PerfDecrementULongCounterValue(
170 Provider: HANDLE,
171 Instance: PPERF_COUNTERSET_INSTANCE,
172 CounterId: ULONG,
173 Value: ULONG,
174 ) -> ULONG;
175 pub fn PerfDecrementULongLongCounterValue(
176 Provider: HANDLE,
177 Instance: PPERF_COUNTERSET_INSTANCE,
178 CounterId: ULONG,
179 Value: ULONGLONG,
180 ) -> ULONG;
181}
182STRUCT!{struct PERF_INSTANCE_HEADER {
183 Size: ULONG,
184 InstanceId: ULONG,
185}}
186pub type PPERF_INSTANCE_HEADER = *mut PERF_INSTANCE_HEADER;
187ENUM!{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}}
199STRUCT!{struct PERF_COUNTERSET_REG_INFO {
200 CounterSetGuid: GUID,
201 CounterSetType: ULONG,
202 DetailLevel: ULONG,
203 NumCounters: ULONG,
204 InstanceType: ULONG,
205}}
206pub type PPERF_COUNTERSET_REG_INFO = *mut PERF_COUNTERSET_REG_INFO;
207STRUCT!{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}}
220pub type PPERF_COUNTER_REG_INFO = *mut PERF_COUNTER_REG_INFO;
221STRUCT!{struct PERF_STRING_BUFFER_HEADER {
222 dwSize: DWORD,
223 dwCounters: DWORD,
224}}
225pub type PPERF_STRING_BUFFER_HEADER = *mut PERF_STRING_BUFFER_HEADER;
226STRUCT!{struct PERF_STRING_COUNTER_HEADER {
227 dwCounterId: DWORD,
228 dwOffset: DWORD,
229}}
230pub type PPERF_STRING_COUNTER_HEADER = *mut PERF_STRING_COUNTER_HEADER;
231STRUCT!{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}}
240pub type PPERF_COUNTER_IDENTIFIER = *mut PERF_COUNTER_IDENTIFIER;
241STRUCT!{struct PERF_DATA_HEADER {
242 dwTotalSize: ULONG,
243 dwNumCounters: ULONG,
244 PerfTimeStamp: LONGLONG,
245 PerfTime100NSec: LONGLONG,
246 PrefFreq: LONGLONG,
247 SystemTime: SYSTEMTIME,
248}}
249pub type PPERF_DATA_HEADER = *mut PERF_DATA_HEADER;
250ENUM!{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}}
257STRUCT!{struct PERF_COUNTER_HEADER {
258 dwStatus: ULONG,
259 dwType: PerfCounterDataType,
260 dwSize: ULONG,
261 Reserved: ULONG,
262}}
263pub type PPERF_COUNTER_HEADER = *mut PERF_COUNTER_HEADER;
264STRUCT!{struct PERF_MULTI_INSTANCES {
265 dwTotalSize: ULONG,
266 dwInstances: ULONG,
267}}
268pub type PPERF_MULTI_INSTANCES = *mut PERF_MULTI_INSTANCES;
269STRUCT!{struct PERF_MULTI_COUNTERS {
270 dwSize: ULONG,
271 dwCounters: ULONG,
272}}
273pub type PPERF_MULTI_COUNTERS = *mut PERF_MULTI_COUNTERS;
274STRUCT!{struct PERF_COUNTER_DATA {
275 dwDataSize: ULONG,
276 dwSize: ULONG,
277}}
278pub type PPERF_COUNTER_DATA = *mut PERF_COUNTER_DATA;
279extern "system" {
280 pub fn PerfEnumerateCounterSet(
281 szMachine: LPCWSTR,
282 pCounterSetIds: LPGUID,
283 cCounterSetIds: DWORD,
284 pcCounterSetIdsActual: LPDWORD,
285 ) -> ULONG;
286 pub fn PerfEnumerateCounterSetInstances(
287 szMachine: LPCWSTR,
288 pCounterSetIds: LPCGUID,
289 pInstances: PPERF_INSTANCE_HEADER,
290 cbInstances: DWORD,
291 pcbInstancesActual: LPDWORD,
292 ) -> ULONG;
293 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;
302 pub fn PerfOpenQueryHandle(
303 szMachine: LPCWSTR,
304 hQuery: *mut HANDLE,
305 ) -> ULONG;
306 pub fn PerfCloseQueryHandle(
307 hQuery: HANDLE,
308 ) -> ULONG;
309 pub fn PerfQueryCounterInfo(
310 hQuery: HANDLE,
311 pCounters: PPERF_COUNTER_IDENTIFIER,
312 cbCounters: DWORD,
313 pcbCountersActual: LPDWORD,
314 ) -> ULONG;
315 pub fn PerfQueryCounterData(
316 hQuery: HANDLE,
317 pCounterBlock: PPERF_DATA_HEADER,
318 cbCounterBlock: DWORD,
319 pcbCounterBlockActual: LPDWORD,
320 ) -> ULONG;
321 pub fn PerfAddCounters(
322 hQuery: HANDLE,
323 pCounters: PPERF_COUNTER_IDENTIFIER,
324 cbCounters: DWORD,
325 ) -> ULONG;
326 pub fn PerfDeleteCounters(
327 hQuery: HANDLE,
328 pCounters: PPERF_COUNTER_IDENTIFIER,
329 cbCounters: DWORD,
330 ) -> ULONG;
331}