| // Licensed under the Apache License, Version 2.0 | 
 | // <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license | 
 | // <LICENSE-MIT or http://opensource.org/licenses/MIT>, 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; | 
 | } |