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
{
43 pub type PPERF_COUNTERSET_INFO
= *mut PERF_COUNTERSET_INFO
;
44 STRUCT
!{struct PERF_COUNTER_INFO
{
53 pub type PPERF_COUNTER_INFO
= *mut PERF_COUNTER_INFO
;
54 STRUCT
!{struct PERF_COUNTERSET_INSTANCE
{
58 InstanceNameOffset
: ULONG
,
59 InstanceNameSize
: ULONG
,
61 pub type PPERF_COUNTERSET_INSTANCE
= *mut PERF_COUNTERSET_INSTANCE
;
62 STRUCT
!{struct PERF_COUNTER_IDENTITY
{
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(
87 FN
!{stdcall
PERF_MEM_ALLOC(
91 FN
!{stdcall
PERF_MEM_FREE(
95 STRUCT
!{struct PERF_PROVIDER_CONTEXT
{
98 ControlCallback
: PERFLIBREQUEST
,
99 MemAllocRoutine
: PERF_MEM_ALLOC
,
100 MemFreeRoutine
: PERF_MEM_FREE
,
103 pub type PPERF_PROVIDER_CONTEXT
= *mut PERF_PROVIDER_CONTEXT
;
105 pub fn PerfStartProviderEx(
106 ProviderGuid
: LPGUID
,
107 ProviderContext
: PPERF_PROVIDER_CONTEXT
,
110 pub fn PerfStartProvider(
111 ProviderGuid
: LPGUID
,
112 ControlCallback
: PERFLIBREQUEST
,
115 pub fn PerfStopProvider(
116 ProviderHandle
: HANDLE
,
118 pub fn PerfSetCounterSetInfo(
119 ProviderHandle
: HANDLE
,
120 Template
: PPERF_COUNTERSET_INFO
,
123 pub fn PerfCreateInstance(
124 ProviderHandle
: HANDLE
,
125 CounterSetGuid
: LPCGUID
,
128 ) -> PPERF_COUNTERSET_INSTANCE
;
129 pub fn PerfDeleteInstance(
131 InstanceBlock
: PPERF_COUNTERSET_INSTANCE
,
133 pub fn PerfQueryInstance(
134 ProviderHandle
: HANDLE
,
135 CounterSetGuid
: LPCGUID
,
138 ) -> PPERF_COUNTERSET_INSTANCE
;
139 pub fn PerfSetCounterRefValue(
141 Instance
: PPERF_COUNTERSET_INSTANCE
,
145 pub fn PerfSetULongCounterValue(
147 Instance
: PPERF_COUNTERSET_INSTANCE
,
151 pub fn PerfSetULongLongCounterValue(
153 Instance
: PPERF_COUNTERSET_INSTANCE
,
157 pub fn PerfIncrementULongCounterValue(
159 Instance
: PPERF_COUNTERSET_INSTANCE
,
163 pub fn PerfIncrementULongLongCounterValue(
165 Instance
: PPERF_COUNTERSET_INSTANCE
,
169 pub fn PerfDecrementULongCounterValue(
171 Instance
: PPERF_COUNTERSET_INSTANCE
,
175 pub fn PerfDecrementULongLongCounterValue(
177 Instance
: PPERF_COUNTERSET_INSTANCE
,
182 STRUCT
!{struct PERF_INSTANCE_HEADER
{
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
,
199 STRUCT
!{struct PERF_COUNTERSET_REG_INFO
{
200 CounterSetGuid
: GUID
,
201 CounterSetType
: ULONG
,
206 pub type PPERF_COUNTERSET_REG_INFO
= *mut PERF_COUNTERSET_REG_INFO
;
207 STRUCT
!{struct PERF_COUNTER_REG_INFO
{
213 BaseCounterId
: ULONG
,
217 AggregateFinc
: ULONG
,
220 pub type PPERF_COUNTER_REG_INFO
= *mut PERF_COUNTER_REG_INFO
;
221 STRUCT
!{struct PERF_STRING_BUFFER_HEADER
{
225 pub type PPERF_STRING_BUFFER_HEADER
= *mut PERF_STRING_BUFFER_HEADER
;
226 STRUCT
!{struct PERF_STRING_COUNTER_HEADER
{
230 pub type PPERF_STRING_COUNTER_HEADER
= *mut PERF_STRING_COUNTER_HEADER
;
231 STRUCT
!{struct PERF_COUNTER_IDENTIFIER
{
232 CounterSetGuid
: GUID
,
240 pub type PPERF_COUNTER_IDENTIFIER
= *mut PERF_COUNTER_IDENTIFIER
;
241 STRUCT
!{struct PERF_DATA_HEADER
{
243 dwNumCounters
: ULONG
,
244 PerfTimeStamp
: LONGLONG
,
245 PerfTime100NSec
: LONGLONG
,
247 SystemTime
: SYSTEMTIME
,
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,
257 STRUCT
!{struct PERF_COUNTER_HEADER
{
259 dwType
: PerfCounterDataType
,
263 pub type PPERF_COUNTER_HEADER
= *mut PERF_COUNTER_HEADER
;
264 STRUCT
!{struct PERF_MULTI_INSTANCES
{
268 pub type PPERF_MULTI_INSTANCES
= *mut PERF_MULTI_INSTANCES
;
269 STRUCT
!{struct PERF_MULTI_COUNTERS
{
273 pub type PPERF_MULTI_COUNTERS
= *mut PERF_MULTI_COUNTERS
;
274 STRUCT
!{struct PERF_COUNTER_DATA
{
278 pub type PPERF_COUNTER_DATA
= *mut PERF_COUNTER_DATA
;
280 pub fn PerfEnumerateCounterSet(
282 pCounterSetIds
: LPGUID
,
283 cCounterSetIds
: DWORD
,
284 pcCounterSetIdsActual
: LPDWORD
,
286 pub fn PerfEnumerateCounterSetInstances(
288 pCounterSetIds
: LPCGUID
,
289 pInstances
: PPERF_INSTANCE_HEADER
,
291 pcbInstancesActual
: LPDWORD
,
293 pub fn PerfQueryCounterSetRegistrationInfo(
295 pCounterSetId
: LPCGUID
,
296 requestCode
: PerfRegInfoType
,
297 requestLangId
: DWORD
,
300 pcbRegInfoActual
: LPDWORD
,
302 pub fn PerfOpenQueryHandle(
306 pub fn PerfCloseQueryHandle(
309 pub fn PerfQueryCounterInfo(
311 pCounters
: PPERF_COUNTER_IDENTIFIER
,
313 pcbCountersActual
: LPDWORD
,
315 pub fn PerfQueryCounterData(
317 pCounterBlock
: PPERF_DATA_HEADER
,
318 cbCounterBlock
: DWORD
,
319 pcbCounterBlockActual
: LPDWORD
,
321 pub fn PerfAddCounters(
323 pCounters
: PPERF_COUNTER_IDENTIFIER
,
326 pub fn PerfDeleteCounters(
328 pCounters
: PPERF_COUNTER_IDENTIFIER
,