mirror of https://github.com/UMSKT/xpmgr.git
277 lines
8.5 KiB
C
277 lines
8.5 KiB
C
/*++
|
|
Copyright (c) Microsoft Corporation. All rights reserved.
|
|
|
|
Module Name:
|
|
|
|
perflib.h
|
|
|
|
Abstract:
|
|
|
|
Public headers for PERFLIB provider APIs,
|
|
--*/
|
|
|
|
#ifndef _PERFLIB_H_
|
|
#define _PERFLIB_H_
|
|
|
|
#pragma once
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
// PERFLIB V2 provider side published literals, data structures and APIs.
|
|
//
|
|
|
|
// This is used in generated PERF_COUNTERSET_INFO structure to declare provider type.
|
|
// Kernel provider is reserved for Microsoft internal use.
|
|
// Driver provider and user-mode provider literals will be published.
|
|
//
|
|
#define PERF_PROVIDER_USER_MODE 0
|
|
#define PERF_PROVIDER_KERNEL_MODE 1
|
|
#define PERF_PROVIDER_DRIVER 2
|
|
|
|
// These are used for PERF_COUNTERSET_INFO::InstanceType value. That is, whether the CounterSet
|
|
// allows multiple instances (for example, Process, PhysicalDisk, etc) or only single default instance
|
|
// (for example, Memory, TCP, etc).
|
|
//
|
|
#define PERF_COUNTERSET_FLAG_MULTIPLE 2 // 0010
|
|
#define PERF_COUNTERSET_FLAG_AGGREGATE 4 // 0100
|
|
#define PERF_COUNTERSET_FLAG_HISTORY 8 // 1000
|
|
#define PERF_COUNTERSET_FLAG_INSTANCE 16 // 00010000
|
|
|
|
#define PERF_COUNTERSET_SINGLE_INSTANCE 0
|
|
#define PERF_COUNTERSET_MULTI_INSTANCES (PERF_COUNTERSET_FLAG_MULTIPLE)
|
|
#define PERF_COUNTERSET_SINGLE_AGGREGATE (PERF_COUNTERSET_FLAG_AGGREGATE)
|
|
#define PERF_COUNTERSET_MULTI_AGGREGATE (PERF_COUNTERSET_FLAG_AGGREGATE | PERF_COUNTERSET_FLAG_MULTIPLE)
|
|
#define PERF_COUNTERSET_SINGLE_AGGREGATE_HISTORY (PERF_COUNTERSET_FLAG_HISTORY | PERF_COUNTERSET_SINGLE_AGGREGATE)
|
|
#define PERF_COUNTERSET_INSTANCE_AGGREGATE (PERF_COUNTERSET_MULTI_AGGREGATE | PERF_COUNTERSET_FLAG_INSTANCE)
|
|
|
|
// Pre-defined aggregation function for CounterSets that need counter data aggregation. This is only useful
|
|
// for CounterSet with instanceType PERF_COUNTERSET_SINGLE_AGGREGATE, PERF_COUNTERSET_MULTI_AGGREGATE, and
|
|
// PERF_COUNTERSET_SINGLE_AGGREGATE_HISTORY. For other CounterSet instanceTypes, this is no effect.
|
|
//
|
|
#define PERF_AGGREGATE_UNDEFINED 0
|
|
#define PERF_AGGREGATE_TOTAL 1
|
|
#define PERF_AGGREGATE_AVG 2
|
|
#define PERF_AGGREGATE_MIN 3
|
|
#define PERF_AGGREGATE_MAX 4
|
|
|
|
// These are possible attributes used in generated PERF_COUNTER_INFO::Attrib value.
|
|
//
|
|
#define PERF_ATTRIB_BY_REFERENCE 0x0000000000000001
|
|
#define PERF_ATTRIB_NO_DISPLAYABLE 0x0000000000000002
|
|
#define PERF_ATTRIB_NO_GROUP_SEPARATOR 0x0000000000000004
|
|
#define PERF_ATTRIB_DISPLAY_AS_REAL 0x0000000000000008
|
|
#define PERF_ATTRIB_DISPLAY_AS_HEX 0x0000000000000010
|
|
|
|
// Provider counterset is defined as a leading PERF_COUNTERSET_INFO structure followed by a sequence
|
|
// of PERF_COUNTER_INFO structures. Note that the structure block will be automatically generated
|
|
// by schema generation/parsing tool.
|
|
//
|
|
typedef struct _PERF_COUNTERSET_INFO {
|
|
GUID CounterSetGuid;
|
|
GUID ProviderGuid;
|
|
ULONG NumCounters;
|
|
ULONG InstanceType;
|
|
} PERF_COUNTERSET_INFO, * PPERF_COUNTERSET_INFO;
|
|
|
|
typedef struct _PERF_COUNTER_INFO {
|
|
ULONG CounterId; // max of 64K counters per GUID instance
|
|
ULONG Type;
|
|
ULONGLONG Attrib;
|
|
ULONG Size;
|
|
ULONG DetailLevel;
|
|
LONG Scale;
|
|
ULONG Offset; // overlays to give the actual counter
|
|
} PERF_COUNTER_INFO, * PPERF_COUNTER_INFO;
|
|
|
|
// PERF_COUNTERSET_INSTANCE block is returned from PerfCreateInstance() API call to identify specific
|
|
// instance of a counterset. The returned block is formed by PERF_COUNTERSET_INSTANCE structure followed
|
|
// by counter data block (layout defined by provider counterset template) and instance name string (if exists).
|
|
//
|
|
typedef struct _PERF_COUNTERSET_INSTANCE {
|
|
GUID CounterSetGuid;
|
|
ULONG dwSize;
|
|
ULONG InstanceId;
|
|
ULONG InstanceNameOffset;
|
|
ULONG InstanceNameSize;
|
|
} PERF_COUNTERSET_INSTANCE, * PPERF_COUNTERSET_INSTANCE;
|
|
|
|
// PERF_COUNTER_IDENTITY structure is used in customized notification callback. Wheneven PERFLIB V2
|
|
// invokes customized notification callback, it passes wnode datablock (which contains WNODE_HEADER
|
|
// structure followed by other binary data) that contains the information providers can use.
|
|
//
|
|
// For PERF_ADD_COUNTER and PERF_REMOVE_COUNTER request, PERFLIB will pass PERF_COUNTER_IDENTITY block
|
|
// so that providers know which counter is added/removed. For other requests, currently only machine name
|
|
// is passed (so that providers can determine whether the request is for physical node or virtual node).
|
|
//
|
|
typedef struct _PERF_COUNTER_IDENTITY {
|
|
GUID CounterSetGuid;
|
|
ULONG BufferSize;
|
|
ULONG CounterId;
|
|
ULONG InstanceId;
|
|
ULONG MachineOffset;
|
|
ULONG NameOffset;
|
|
ULONG Reserved;
|
|
} PERF_COUNTER_IDENTITY, * PPERF_COUNTER_IDENTITY;
|
|
|
|
#define PERF_WILDCARD_COUNTER 0xFFFFFFFF
|
|
#define PERF_WILDCARD_INSTANCE L"*"
|
|
#define PERF_AGGREGATE_INSTANCE L"_Total"
|
|
#define PERF_MAX_INSTANCE_NAME 1024
|
|
|
|
#define PERF_ADD_COUNTER 1
|
|
#define PERF_REMOVE_COUNTER 2
|
|
#define PERF_ENUM_INSTANCES 3
|
|
#define PERF_COLLECT_START 5
|
|
#define PERF_COLLECT_END 6
|
|
#define PERF_FILTER 9
|
|
|
|
// Prototype for service request callback. Data providers register with PERFLIB V2 by passing a service
|
|
// request callback function that is called for all PERFLIB requests.
|
|
//
|
|
typedef ULONG (
|
|
#ifndef MIDL_PASS
|
|
WINAPI
|
|
#endif
|
|
* PERFLIBREQUEST)(
|
|
IN ULONG RequestCode,
|
|
IN PVOID Buffer,
|
|
IN ULONG BufferSize
|
|
);
|
|
|
|
// Usually PerfSetCounterSetInfo() calls is automatically generated PerfAutoStartUp() function (generated
|
|
// by schema generation/parsing tool) to inform PERFLIB the layout of specific counterset.
|
|
//
|
|
ULONG __stdcall
|
|
PerfStartProvider(
|
|
__in LPGUID ProviderGuid,
|
|
__in_opt PERFLIBREQUEST ControlCallback,
|
|
__out HANDLE * phProvider
|
|
);
|
|
|
|
// Start PERFLIB V2 provider with customized memory allocation/free routines.
|
|
//
|
|
typedef LPVOID (* PERF_MEM_ALLOC)(IN SIZE_T AllocSize, IN LPVOID pContext);
|
|
typedef void (* PERF_MEM_FREE)(IN LPVOID pBuffer, IN LPVOID pContext);
|
|
|
|
typedef struct _PROVIDER_CONTEXT {
|
|
DWORD ContextSize; // should be sizeof(PERF_PROVIDER_CONTEXT)
|
|
DWORD Reserved;
|
|
PERFLIBREQUEST ControlCallback;
|
|
PERF_MEM_ALLOC MemAllocRoutine;
|
|
PERF_MEM_FREE MemFreeRoutine;
|
|
LPVOID pMemContext;
|
|
} PERF_PROVIDER_CONTEXT, * PPERF_PROVIDER_CONTEXT;
|
|
|
|
ULONG WINAPI
|
|
PerfStartProviderEx(
|
|
__in LPGUID ProviderGuid,
|
|
__in_opt PPERF_PROVIDER_CONTEXT ProviderContext,
|
|
__out PHANDLE Provider
|
|
);
|
|
|
|
ULONG WINAPI
|
|
PerfStartProvider(
|
|
__in LPGUID ProviderGuid,
|
|
__in_opt PERFLIBREQUEST ControlCallback,
|
|
__out PHANDLE Provider
|
|
);
|
|
|
|
ULONG WINAPI
|
|
PerfStopProvider(
|
|
__in HANDLE ProviderHandle
|
|
);
|
|
|
|
ULONG WINAPI
|
|
PerfSetCounterSetInfo(
|
|
__in HANDLE ProviderHandle,
|
|
__inout_bcount(TemplateSize) PPERF_COUNTERSET_INFO Template,
|
|
__in ULONG TemplateSize
|
|
);
|
|
|
|
PPERF_COUNTERSET_INSTANCE WINAPI
|
|
PerfCreateInstance(
|
|
__in HANDLE ProviderHandle,
|
|
__in LPCGUID CounterSetGuid,
|
|
__in PCWSTR Name,
|
|
__in ULONG Id
|
|
);
|
|
|
|
ULONG WINAPI
|
|
PerfDeleteInstance(
|
|
__in HANDLE Provider,
|
|
__in PPERF_COUNTERSET_INSTANCE InstanceBlock
|
|
);
|
|
|
|
PPERF_COUNTERSET_INSTANCE WINAPI
|
|
PerfQueryInstance(
|
|
__in HANDLE ProviderHandle,
|
|
__in LPCGUID CounterSetGuid,
|
|
__in PCWSTR Name,
|
|
__in ULONG Id
|
|
);
|
|
|
|
ULONG WINAPI
|
|
PerfSetCounterRefValue(
|
|
__in HANDLE Provider,
|
|
__inout PPERF_COUNTERSET_INSTANCE Instance,
|
|
__in ULONG CounterId,
|
|
__in PVOID Address
|
|
);
|
|
|
|
ULONG WINAPI
|
|
PerfSetULongCounterValue(
|
|
__in HANDLE Provider,
|
|
__inout PPERF_COUNTERSET_INSTANCE Instance,
|
|
__in ULONG CounterId,
|
|
__in ULONG Value
|
|
);
|
|
|
|
ULONG WINAPI
|
|
PerfSetULongLongCounterValue(
|
|
__in HANDLE Provider,
|
|
__inout PPERF_COUNTERSET_INSTANCE Instance,
|
|
__in ULONG CounterId,
|
|
__in ULONGLONG Value
|
|
);
|
|
|
|
ULONG WINAPI
|
|
PerfIncrementULongCounterValue(
|
|
__in HANDLE Provider,
|
|
__inout PPERF_COUNTERSET_INSTANCE Instance,
|
|
__in ULONG CounterId,
|
|
__in ULONG Value
|
|
);
|
|
|
|
ULONG WINAPI
|
|
PerfIncrementULongLongCounterValue(
|
|
__in HANDLE Provider,
|
|
__inout PPERF_COUNTERSET_INSTANCE Instance,
|
|
__in ULONG CounterId,
|
|
__in ULONGLONG Value
|
|
);
|
|
|
|
ULONG WINAPI
|
|
PerfDecrementULongCounterValue(
|
|
__in HANDLE Provider,
|
|
__inout PPERF_COUNTERSET_INSTANCE Instance,
|
|
__in ULONG CounterId,
|
|
__in ULONG Value
|
|
);
|
|
|
|
ULONG WINAPI
|
|
PerfDecrementULongLongCounterValue(
|
|
__in HANDLE Provider,
|
|
__inout PPERF_COUNTERSET_INSTANCE Instance,
|
|
__in ULONG CounterId,
|
|
__in ULONGLONG Value
|
|
);
|
|
|
|
#ifdef __cplusplus
|
|
} // extern "C"
|
|
#endif
|
|
|
|
#endif /* _PERFLIB_H_ */
|
|
|