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