// Licensed under the Apache License, Version 2.0 // or the MIT license // , at your option. // All files in the project carrying such notice may not be copied, modified, or distributed // except according to those terms. use shared::basetsd::SIZE_T; use shared::guiddef::{GUID, LPCGUID, LPGUID}; use shared::minwindef::{DWORD, LPBYTE, LPDWORD, LPVOID, ULONG}; use um::minwinbase::SYSTEMTIME; use um::winnt::{HANDLE, LONG, LONGLONG, LPCWSTR, PCWSTR, PHANDLE, PVOID, ULONGLONG}; pub const PERF_PROVIDER_USER_MODE: ULONG = 0; pub const PERF_PROVIDER_KERNEL_MODE: ULONG = 1; pub const PERF_PROVIDER_DRIVER: ULONG = 2; pub const PERF_COUNTERSET_FLAG_MULTIPLE: ULONG = 2; pub const PERF_COUNTERSET_FLAG_AGGREGATE: ULONG = 4; pub const PERF_COUNTERSET_FLAG_HISTORY: ULONG = 8; pub const PERF_COUNTERSET_FLAG_INSTANCE: ULONG = 16; pub const PERF_COUNTERSET_SINGLE_INSTANCE: ULONG = 0; pub const PERF_COUNTERSET_MULTI_INSTANCES: ULONG = PERF_COUNTERSET_FLAG_MULTIPLE; pub const PERF_COUNTERSET_SINGLE_AGGREGATE: ULONG = PERF_COUNTERSET_FLAG_AGGREGATE; pub const PERF_COUNTERSET_MULTI_AGGREGATE: ULONG = PERF_COUNTERSET_FLAG_AGGREGATE | PERF_COUNTERSET_FLAG_MULTIPLE; pub const PERF_COUNTERSET_SINGLE_AGGREGATE_HISTORY: ULONG = PERF_COUNTERSET_FLAG_HISTORY | PERF_COUNTERSET_SINGLE_AGGREGATE; pub const PERF_COUNTERSET_INSTANCE_AGGREGATE: ULONG = PERF_COUNTERSET_MULTI_AGGREGATE | PERF_COUNTERSET_FLAG_INSTANCE; pub const PERF_AGGREGATE_UNDEFINED: ULONG = 0; pub const PERF_AGGREGATE_TOTAL: ULONG = 1; pub const PERF_AGGREGATE_AVG: ULONG = 2; pub const PERF_AGGREGATE_MIN: ULONG = 3; pub const PERF_AGGREGATE_MAX: ULONG = 4; pub const PERF_ATTRIB_BY_REFERENCE: ULONGLONG = 0x0000000000000001; pub const PERF_ATTRIB_NO_DISPLAYABLE: ULONGLONG = 0x0000000000000002; pub const PERF_ATTRIB_NO_GROUP_SEPARATOR: ULONGLONG = 0x0000000000000004; pub const PERF_ATTRIB_DISPLAY_AS_REAL: ULONGLONG = 0x0000000000000008; pub const PERF_ATTRIB_DISPLAY_AS_HEX: ULONGLONG = 0x0000000000000010; STRUCT!{struct PERF_COUNTERSET_INFO { CounterSetGuid: GUID, ProviderGuid: GUID, NumCounters: ULONG, InstanceType: ULONG, }} pub type PPERF_COUNTERSET_INFO = *mut PERF_COUNTERSET_INFO; STRUCT!{struct PERF_COUNTER_INFO { CounterId: ULONG, Type: ULONG, Attrib: ULONGLONG, Size: ULONG, DetailLevel: ULONG, Scale: LONG, Offset: LONG, }} pub type PPERF_COUNTER_INFO = *mut PERF_COUNTER_INFO; STRUCT!{struct PERF_COUNTERSET_INSTANCE { CounterSetGuid: GUID, dwSize: ULONG, InstanceId: ULONG, InstanceNameOffset: ULONG, InstanceNameSize: ULONG, }} pub type PPERF_COUNTERSET_INSTANCE = *mut PERF_COUNTERSET_INSTANCE; STRUCT!{struct PERF_COUNTER_IDENTITY { CounterSetGuid: GUID, BufferSize: ULONG, CounterId: ULONG, InstanceId: ULONG, MachineOffset: ULONG, NameOffset: ULONG, Reserved: ULONG, }} pub type PPERF_COUNTER_IDENTITY = *mut PERF_COUNTER_IDENTITY; pub const PERF_WILDCARD_COUNTER: ULONG = 0xFFFFFFFF; pub const PERF_WILDCARD_INSTANCE: &'static str = "*"; pub const PERF_AGGREGATE_INSTANCE: &'static str = "_Total"; pub const PERF_MAX_INSTANCE_NAME: ULONG = 1024; pub const PERF_ADD_COUNTER: ULONG = 1; pub const PERF_REMOVE_COUNTER: ULONG = 2; pub const PERF_ENUM_INSTANCES: ULONG = 3; pub const PERF_COLLECT_START: ULONG = 5; pub const PERF_COLLECT_END: ULONG = 6; pub const PERF_FILTER: ULONG = 9; FN!{stdcall PERFLIBREQUEST( RequestCode: ULONG, Buffer: PVOID, BufferSize: ULONG, ) -> ULONG} FN!{stdcall PERF_MEM_ALLOC( AllocSize: SIZE_T, pContext: LPVOID, ) -> LPVOID} FN!{stdcall PERF_MEM_FREE( pBuffer: LPVOID, pContext: LPVOID, ) -> ()} STRUCT!{struct PERF_PROVIDER_CONTEXT { ContextSize: DWORD, Reserved: DWORD, ControlCallback: PERFLIBREQUEST, MemAllocRoutine: PERF_MEM_ALLOC, MemFreeRoutine: PERF_MEM_FREE, pMemContext: LPVOID, }} pub type PPERF_PROVIDER_CONTEXT = *mut PERF_PROVIDER_CONTEXT; extern "system" { pub fn PerfStartProviderEx( ProviderGuid: LPGUID, ProviderContext: PPERF_PROVIDER_CONTEXT, Provider: PHANDLE, ) -> ULONG; pub fn PerfStartProvider( ProviderGuid: LPGUID, ControlCallback: PERFLIBREQUEST, Provider: PHANDLE, ) -> ULONG; pub fn PerfStopProvider( ProviderHandle: HANDLE, ) -> ULONG; pub fn PerfSetCounterSetInfo( ProviderHandle: HANDLE, Template: PPERF_COUNTERSET_INFO, TemplateSize: ULONG, ) -> ULONG; pub fn PerfCreateInstance( ProviderHandle: HANDLE, CounterSetGuid: LPCGUID, Name: PCWSTR, Id: ULONG, ) -> PPERF_COUNTERSET_INSTANCE; pub fn PerfDeleteInstance( Provider: HANDLE, InstanceBlock: PPERF_COUNTERSET_INSTANCE, ) -> ULONG; pub fn PerfQueryInstance( ProviderHandle: HANDLE, CounterSetGuid: LPCGUID, Name: LPCWSTR, Id: ULONG, ) -> PPERF_COUNTERSET_INSTANCE; pub fn PerfSetCounterRefValue( Provider: HANDLE, Instance: PPERF_COUNTERSET_INSTANCE, CounterId: ULONG, Address: PVOID, ) -> ULONG; pub fn PerfSetULongCounterValue( Provider: HANDLE, Instance: PPERF_COUNTERSET_INSTANCE, CounterId: ULONG, Value: ULONG, ) -> ULONG; pub fn PerfSetULongLongCounterValue( Provider: HANDLE, Instance: PPERF_COUNTERSET_INSTANCE, CounterId: ULONG, Value: ULONGLONG, ) -> ULONG; pub fn PerfIncrementULongCounterValue( Provider: HANDLE, Instance: PPERF_COUNTERSET_INSTANCE, CounterId: ULONG, Value: ULONG, ) -> ULONG; pub fn PerfIncrementULongLongCounterValue( Provider: HANDLE, Instance: PPERF_COUNTERSET_INSTANCE, CounterId: ULONG, Value: ULONGLONG, ) -> ULONG; pub fn PerfDecrementULongCounterValue( Provider: HANDLE, Instance: PPERF_COUNTERSET_INSTANCE, CounterId: ULONG, Value: ULONG, ) -> ULONG; pub fn PerfDecrementULongLongCounterValue( Provider: HANDLE, Instance: PPERF_COUNTERSET_INSTANCE, CounterId: ULONG, Value: ULONGLONG, ) -> ULONG; } STRUCT!{struct PERF_INSTANCE_HEADER { Size: ULONG, InstanceId: ULONG, }} pub type PPERF_INSTANCE_HEADER = *mut PERF_INSTANCE_HEADER; ENUM!{enum PerfRegInfoType { PERF_REG_COUNTERSET_STRUCT = 1, PERF_REG_COUNTER_STRUCT, PERF_REG_COUNTERSET_NAME_STRING, PERF_REG_COUNTERSET_HELP_STRING, PERF_REG_COUNTER_NAME_STRINGS, PERF_REG_COUNTER_HELP_STRINGS, PERF_REG_PROVIDER_NAME, PERF_REG_PROVIDER_GUID, PERF_REG_COUNTERSET_ENGLISH_NAME, PERF_REG_COUNTER_ENGLISH_NAMES, }} STRUCT!{struct PERF_COUNTERSET_REG_INFO { CounterSetGuid: GUID, CounterSetType: ULONG, DetailLevel: ULONG, NumCounters: ULONG, InstanceType: ULONG, }} pub type PPERF_COUNTERSET_REG_INFO = *mut PERF_COUNTERSET_REG_INFO; STRUCT!{struct PERF_COUNTER_REG_INFO { CounterId: ULONG, Type: ULONG, Attrib: ULONGLONG, DetailLevel: ULONG, DefaultScale: LONG, BaseCounterId: ULONG, PerfTimeId: ULONG, PerfFreqId: ULONG, MultiId: ULONG, AggregateFinc: ULONG, Reserved: ULONG, }} pub type PPERF_COUNTER_REG_INFO = *mut PERF_COUNTER_REG_INFO; STRUCT!{struct PERF_STRING_BUFFER_HEADER { dwSize: DWORD, dwCounters: DWORD, }} pub type PPERF_STRING_BUFFER_HEADER = *mut PERF_STRING_BUFFER_HEADER; STRUCT!{struct PERF_STRING_COUNTER_HEADER { dwCounterId: DWORD, dwOffset: DWORD, }} pub type PPERF_STRING_COUNTER_HEADER = *mut PERF_STRING_COUNTER_HEADER; STRUCT!{struct PERF_COUNTER_IDENTIFIER { CounterSetGuid: GUID, Status: ULONG, Size: ULONG, CounterId: ULONG, InstanceId: ULONG, Index: ULONG, Reserved: ULONG, }} pub type PPERF_COUNTER_IDENTIFIER = *mut PERF_COUNTER_IDENTIFIER; STRUCT!{struct PERF_DATA_HEADER { dwTotalSize: ULONG, dwNumCounters: ULONG, PerfTimeStamp: LONGLONG, PerfTime100NSec: LONGLONG, PrefFreq: LONGLONG, SystemTime: SYSTEMTIME, }} pub type PPERF_DATA_HEADER = *mut PERF_DATA_HEADER; ENUM!{enum PerfCounterDataType { PERF_ERROR_RETURN = 0, PERF_SINGLE_COUNTER = 1, PERF_MULTIPLE_COUNTERS = 2, PERF_MULTIPLE_INSTANCES = 4, PERF_COUNTERSET = 6, }} STRUCT!{struct PERF_COUNTER_HEADER { dwStatus: ULONG, dwType: PerfCounterDataType, dwSize: ULONG, Reserved: ULONG, }} pub type PPERF_COUNTER_HEADER = *mut PERF_COUNTER_HEADER; STRUCT!{struct PERF_MULTI_INSTANCES { dwTotalSize: ULONG, dwInstances: ULONG, }} pub type PPERF_MULTI_INSTANCES = *mut PERF_MULTI_INSTANCES; STRUCT!{struct PERF_MULTI_COUNTERS { dwSize: ULONG, dwCounters: ULONG, }} pub type PPERF_MULTI_COUNTERS = *mut PERF_MULTI_COUNTERS; STRUCT!{struct PERF_COUNTER_DATA { dwDataSize: ULONG, dwSize: ULONG, }} pub type PPERF_COUNTER_DATA = *mut PERF_COUNTER_DATA; extern "system" { pub fn PerfEnumerateCounterSet( szMachine: LPCWSTR, pCounterSetIds: LPGUID, cCounterSetIds: DWORD, pcCounterSetIdsActual: LPDWORD, ) -> ULONG; pub fn PerfEnumerateCounterSetInstances( szMachine: LPCWSTR, pCounterSetIds: LPCGUID, pInstances: PPERF_INSTANCE_HEADER, cbInstances: DWORD, pcbInstancesActual: LPDWORD, ) -> ULONG; pub fn PerfQueryCounterSetRegistrationInfo( szMachine: LPCWSTR, pCounterSetId: LPCGUID, requestCode: PerfRegInfoType, requestLangId: DWORD, pbRegInfo: LPBYTE, cbRegInfo: DWORD, pcbRegInfoActual: LPDWORD, ) -> ULONG; pub fn PerfOpenQueryHandle( szMachine: LPCWSTR, hQuery: *mut HANDLE, ) -> ULONG; pub fn PerfCloseQueryHandle( hQuery: HANDLE, ) -> ULONG; pub fn PerfQueryCounterInfo( hQuery: HANDLE, pCounters: PPERF_COUNTER_IDENTIFIER, cbCounters: DWORD, pcbCountersActual: LPDWORD, ) -> ULONG; pub fn PerfQueryCounterData( hQuery: HANDLE, pCounterBlock: PPERF_DATA_HEADER, cbCounterBlock: DWORD, pcbCounterBlockActual: LPDWORD, ) -> ULONG; pub fn PerfAddCounters( hQuery: HANDLE, pCounters: PPERF_COUNTER_IDENTIFIER, cbCounters: DWORD, ) -> ULONG; pub fn PerfDeleteCounters( hQuery: HANDLE, pCounters: PPERF_COUNTER_IDENTIFIER, cbCounters: DWORD, ) -> ULONG; }