winapi_ui_automation/um/
perflib.rs

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.
6use 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}