// 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_HIST
ORY
| 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 = 0 x0000000000000001;
pub const PERF_ATTRIB_NO_DISPLAYABLE: ULONGLONG = 0 x0000000000000002;
pub const PERF_ATTRIB_NO_GROUP_SEPARATOR: ULONGLONG = 0 x0000000000000004;
pub const PERF_ATTRIB_DISPLAY_AS_REAL: ULONGLONG = 0 x0000000000000008;
pub const PERF_ATTRIB_DISPLAY_AS_HEX: ULONGLONG = 0 x0000000000000010;
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 = 0 xFFFFFFFF;
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;
}
Messung V0.5 in Prozent C=95 H=100 G=97
¤ Dauer der Verarbeitung: 0.14 Sekunden
(vorverarbeitet am 2026-06-18)
¤
*© Formatika GbR, Deutschland