--- mstools/h/winperf.h 2018/08/09 18:21:03 1.1.1.2 +++ mstools/h/winperf.h 2018/08/09 18:22:57 1.1.1.3 @@ -1,303 +1,37 @@ -#ifndef _WINPERF_INCLUDED_ -#define _WINPERF_INCLUDED_ -// -// winperf.h - Header file for the Performance Monitor data -// -// -// -// Written by: -// -// Russ Blake 11/15/91 -// -// Revision History: -// -// None -// russbl - 1/22/92 - Add diagrams of data structures -// russbl - 4/14/92 - Add version/revision, signature, -// and pointer fields for titles -// strings reserved for analysis -// program usage -// russbl - 5/29/92 - Add default scale to counter -// definition, *Pstruct types to -// all structure defs, and counter -// types ..._MULTI_ -// - - -// -// This file contains the definitions of the data structures returned -// by the Configuration Registry in response to a request for -// performance data. This file is used by both the Configuration -// Registry and the Performance Monitor to define their interface. -// The complete interface is described here, except for the name -// of the node to query in the registry. It is -// -// HKEY_PERFORMANCE_DATA. -// -// By querying that node with a subkey of "GLOBAL" the caller will -// retrieve the structures described here. -// -// There is no need to RegOpenKey the reserved handle HKEY_PERFORMANCE_DATA, -// but the caller should RegCloseKey the handle so that network transports -// and drivers can be removed or installed (which cannot happen while -// they are open for monitoring.) -// -// - - -/*****************************************************************************\ - - -The basic layout of the data block returned is a header followed by a -data area for each type of object under measurement. Typical object -types are processor, disk, and memory. The system being observed -defines what objects are under measurement. Naturally, different -systems may measure different types of objects. - - - +-----------------------------------------+ - | | - | PERF_DATA_BLOCK | - | - - - - - - - - - - - - - - - - - - - - | - | NumObjectTypes | - | - - - - - - - - - - - - - - - - - - - - | - |-----------------------------------------| - | | - | | - | PERF_OBJECT_TYPE 0 | - | | - | | - |-----------------------------------------| - | | - | | - | PERF_OBJECT_TYPE 1 | - | | - | | - |-----------------------------------------| - | | - | | - | PERF_OBJECT_TYPE 2 | - | | - | | - |-----------------------------------------| - | . | - | . | - | . | - |-----------------------------------------| - | | - | | - | PERF_OBJECT_TYPE NumObjectTypes-1 | - | | - | | - +-----------------------------------------+ - -Note that from one call to the next, there may be different object types -defined, meaning that PERF_DATA_BLOCK.NumObjectTypes will vary. As will -become clear shortly, the size of the area for each object type may also -vary. You cannot count on the locations of the object type areas from -one call to the system to the next. To help to accomodate this, offsets -have been included to help naviagte the structure. Such offsets are -!always! relative to the !beginning! of the structure which contains them. - - +-----------------------------------------+ - | PERF_DATA_BLOCK | - | - - - - - - - - - - - - - - - - - - - - | - | TotalByteLength *--------* - | - - - - - - - - - - - - - - - - - - - - | | - | HeaderLength *----* | - | - - - - - - - - - - - - - - - - - - - - | | | - | | | | - | | | | - |-----------------------------------------| | | - | PERF_OBJECT_TYPE 0 |<---* | - | - - - - - - - - - - - - - - - - - - - - | | - | TotalByteLength *----* | - | - - - - - - - - - - - - - - - - - - - - | | | - | | | | - | | | | - |-----------------------------------------| | | - | PERF_OBJECT_TYPE 1 |<---* | - | - - - - - - - - - - - - - - - - - - - - | | - | TotalByteLength *----* | - | - - - - - - - - - - - - - - - - - - - - | | | - | | | | - | | | | - | | | | - | | | | - |-----------------------------------------| | | - | PERF_OBJECT_TYPE 2 |<---* | - | - - - - - - - - - - - - - - - - - - - - | | - | TotalByteLength *----* | - | - - - - - - - - - - - - - - - - - - - - | | | - | | | | - | | | | - |-----------------------------------------| | | - | . |<---* | - | . | . - | . |. . . . - |-----------------------------------------| . . - | PERF_OBJECT_TYPE NumObjectTypes-1 |<---* | - | | | - | | | - | | | - | | | - +-----------------------------------------+<-------* - - -Each PERF_OBJECT_TYPE definition is followed by the definitions of all the -counters which are defined for that object. Typical counters for the -object of type processor are Processor Time, Interrupts, and Page Faults. - - +-----------------------------------------+ - | PERF_OBJECT_TYPE i | - | | - | - - - - - - - - - - - - - - - - - - - - | - | DefinitionLength *----------* - | - - - - - - - - - - - - - - - - - - - - | | - | HeaderLength *-----* | - | - - - - - - - - - - - - - - - - - - - - | | | - | NumCounters | | | - | - - - - - - - - - - - - - - - - - - - - | | | - | | | | - | | | | - |-----------------------------------------| | | - | PERF_COUNTER_DEFINITION 0 |<----* | - | | | - | | | - |-----------------------------------------| | - | PERF_COUNTER_DEFINITION 1 | | - | | | - | | | - |-----------------------------------------| | - | PERF_COUNTER_DEFINITION 2 | | - | | | - | | | - |-----------------------------------------| | - | . | | - | . | | - | . | | - |-----------------------------------------| | - | PERF_COUNTER_DEFINITION NumCounters-1 | | - | | | - | | | - |-----------------------------------------| | - | . |<---------* - | . | - | . | - +-----------------------------------------+ - - -Following the counter definitions for the object type are the Instances for -that object type. In a multiprocessor system, for example, there are by -definition multiple instances of the object type processor. The number -of instances for an object type like threads may not be the same from -one call to get data to the next. - - +-----------------------------------------+ - | PERF_OBJECT_TYPE i | - | | - | - - - - - - - - - - - - - - - - - - - - | - | TotalByteLength *---------------* - | - - - - - - - - - - - - - - - - - - - - | | - | DefinitionLength *----------* | - | - - - - - - - - - - - - - - - - - - - - | | | - | HeaderLength *-----* | | - | - - - - - - - - - - - - - - - - - - - - | | | | - | NumCounters | | | | - | - - - - - - - - - - - - - - - - - - - - | | | | - | NumInstances | | | | - | - - - - - - - - - - - - - - - - - - - - | | | | - | | | | | - | | | | | - |-----------------------------------------| | | | - | PERF_COUNTER_DEFINITION 0 |<----* | | - | | | | - | | | | - |-----------------------------------------| | | - | PERF_COUNTER_DEFINITION 1 | | | - | | | | - | | | | - |-----------------------------------------| | | - | . | | | - | . | | | - | . | | | - |-----------------------------------------| | | - | PERF_COUNTER_DEFINITION NumCounters-1 | | | - | | | | - | | | | - |-----------------------------------------| | | - | PERF_INSTANCE_DEFINITION 0 |<---------* | - | | | - | | | - |-----------------------------------------| | - | PERF_INSTANCE_DEFINITION 1 | | - | | | - | | | - |-----------------------------------------| | - | PERF_INSTANCE_DEFINITION 2 | | - | | | - | | | - |-----------------------------------------| | - | . | | - | . | | - | . | | - |-----------------------------------------| | - | PERF_INSTANCE_DEFINITION NumInstances-1 | | - | | | - | | | - +-----------------------------------------+<--------------* - -Each instance definition is followed by the counter data for that instance. -This is the actual data for each counter defined for the object type of -which the instance is a member. There are PERF_OBJECT_TYPE.NumCounters -such counters for !each! instance. - -The size of the various instance definitions is not constant, since each -instance definition structure is followed by the null-terminated name of -the instance. Therefore the instance definition contains an offset to -its first counter data item, and also to its name. - - +-----------------------------------------+ - | PERF_INSTANCE_DEFINITION j | - | | - | - - - - - - - - - - - - - - - - - - - - | - | ByteLength *-----------* - | - - - - - - - - - - - - - - - - - - - - | | - | | | - | | | - | - - - - - - - - - - - - - - - - - - - - | | - | NameOffset *-----* | - | - - - - - - - - - - - - - - - - - - - - | | | - | | | | - | | | | - | - - - - - - - - - - - - - - - - - - - - | | | - | Name of PERF_INSTANCE_DEFINITION j |<----* | - | | | - | | | - | | | - | ...padded to 4 byte boundary| | - |-----------------------------------------| | - | PERF_COUNTER_BLOCK |<----------* - | - - - - - - - - - - - - - - - - - - - - | - | ByteLength *-----* - | - - - - - - - - - - - - - - - - - - - - | | - | Data for Counter 0 | | - | - - - - - - - - - - - - - - - - - - - - | | - | Data for Counter 1 | | - | - - - - - - - - - - - - - - - - - - - - | | - | Data for Counter 2 | | - | | | - | - - - - - - - - - - - - - - - - - - - - | | - | . | | - | . | | - | . | | - | - - - - - - - - - - - - - - - - - - - - | | - | Data for Counter NumCounters-1 | | - | | | - +-----------------------------------------+<----* +/*++ + +Copyright (c) 1993 Microsoft Corporation + +Module Name: + + winperf.h - -\*****************************************************************************/ +Abstract: + + Header file for the Performance Monitor data. + + This file contains the definitions of the data structures returned + by the Configuration Registry in response to a request for + performance data. This file is used by both the Configuration + Registry and the Performance Monitor to define their interface. + The complete interface is described here, except for the name + of the node to query in the registry. It is + + HKEY_PERFORMANCE_DATA. + + By querying that node with a subkey of "Global" the caller will + retrieve the structures described here. + + There is no need to RegOpenKey() the reserved handle HKEY_PERFORMANCE_DATA, + but the caller should RegCloseKey() the handle so that network transports + and drivers can be removed or installed (which cannot happen while + they are open for monitoring.) Remote requests must first + RegConnectRegistry(). + +--*/ + +#ifndef _WINPERF_ +#define _WINPERF_ // Data structure definitions. @@ -312,7 +46,7 @@ its first counter data item, and also to // #define PERF_DATA_VERSION 1 -#define PERF_DATA_REVISION 0 +#define PERF_DATA_REVISION 1 typedef struct _PERF_DATA_BLOCK { @@ -322,27 +56,27 @@ typedef struct _PERF_DATA_BLOCK { // starting at 1 DWORD Revision; // Revision of these data structures // starting at 0 for each Version - DWORD TotalByteLength; // Total length of data block - DWORD HeaderLength; // Length of this structure - DWORD NumObjectTypes; // Number of types of objects - // being reported - DWORD DefaultObject; // Index starting at 0 of default - // object to display when data from - // this system is retireved (-1 = - // none, but this is not expected to - // be used) - SYSTEMTIME SystemTime; // Time at the system under - // measurement - LARGE_INTEGER PerfTime; // Performance counter value - // at the system under measurement - LARGE_INTEGER PerfFreq; // Performance counter frequency - // at the system under measurement + DWORD TotalByteLength; // Total length of data block + DWORD HeaderLength; // Length of this structure + DWORD NumObjectTypes; // Number of types of objects + // being reported + LONG DefaultObject; // Object Title Index of default + // object to display when data from + // this system is retrieved (-1 = + // none, but this is not expected to + // be used) + SYSTEMTIME SystemTime; // Time at the system under + // measurement + LARGE_INTEGER PerfTime; // Performance counter value + // at the system under measurement + LARGE_INTEGER PerfFreq; // Performance counter frequency + // at the system under measurement LARGE_INTEGER PerfTime100nSec; // Performance counter time in 100 nsec // units at the system under measurement - DWORD SystemNameLength; // Length of the system name - DWORD SystemNameOffset; // Offset, from beginning of this - // structure, to name of system - // being measured + DWORD SystemNameLength; // Length of the system name + DWORD SystemNameOffset; // Offset, from beginning of this + // structure, to name of system + // being measured } PERF_DATA_BLOCK, *PPERF_DATA_BLOCK; @@ -354,199 +88,323 @@ typedef struct _PERF_DATA_BLOCK { typedef struct _PERF_OBJECT_TYPE { - DWORD TotalByteLength; // Length of this object definition - // including this structure, the - // counter defintions, and the - // instance definitions and the - // counter blocks for each instance: - // This is the offset from this - // structure to the next object, if - // any - DWORD DefinitionLength; // Length of object definition, - // which includes this structure - // and the counter definition - // structures for this object: this - // is the offset of the first - // instance or of the counters - // for this object if there is - // no instance - DWORD HeaderLength; // Length of this structure: this - // is the offset to the first - // counter definition for this - // object - DWORD ObjectNameTitleIndex; + DWORD TotalByteLength; // Length of this object definition + // including this structure, the + // counter definitions, and the + // instance definitions and the + // counter blocks for each instance: + // This is the offset from this + // structure to the next object, if + // any + DWORD DefinitionLength; // Length of object definition, + // which includes this structure + // and the counter definition + // structures for this object: this + // is the offset of the first + // instance or of the counters + // for this object if there is + // no instance + DWORD HeaderLength; // Length of this structure: this + // is the offset to the first + // counter definition for this + // object + DWORD ObjectNameTitleIndex; // Index to name in Title Database LPWSTR ObjectNameTitle; // Initially NULL, for use by // analysis program to point to // retrieved title string - DWORD ObjectHelpTitleIndex; - // Index to Help in Title Database + DWORD ObjectHelpTitleIndex; + // Index to Help in Title Database LPWSTR ObjectHelpTitle; // Initially NULL, for use by // analysis program to point to // retrieved title string - DWORD DetailLevel; // Object level of detail (for - // controlling display complexity); - // will be min of detail levels - // for all this object's counters - DWORD NumCounters; // Number of counters in each - // counter block (one counter - // block per instance) - DWORD DefaultCounter; // Default counter to display when - // this object is selected, index - // starting at 0 (-1 = none, but - // this is not expected to be used) - DWORD NumInstances; // Number of object instances - // for which counters are being - // returned from the system under - // measurement - DWORD CodePage; // 0 if instance strings are in - // UNICODE, else the Code Page of - // the instance names + DWORD DetailLevel; // Object level of detail (for + // controlling display complexity); + // will be min of detail levels + // for all this object's counters + DWORD NumCounters; // Number of counters in each + // counter block (one counter + // block per instance) + LONG DefaultCounter; // Default counter to display when + // this object is selected, index + // starting at 0 (-1 = none, but + // this is not expected to be used) + LONG NumInstances; // Number of object instances + // for which counters are being + // returned from the system under + // measurement. If the object defined + // will never have any instance data + // structures (PERF_INSTANCE_DEFINITION) + // then this value should be -1, if the + // object can have 0 or more instances, + // but has none present, then this + // should be 0, otherwise this field + // contains the number of instances of + // this counter. + DWORD CodePage; // 0 if instance strings are in + // UNICODE, else the Code Page of + // the instance names + LARGE_INTEGER PerfTime; // Sample Time in "Object" units + // + LARGE_INTEGER PerfFreq; // Frequency of "Object" units in + // counts per second. } PERF_OBJECT_TYPE, *PPERF_OBJECT_TYPE; +#define PERF_NO_INSTANCES -1 // no instances (see NumInstances above) // -// The following types of counters are currently defined. +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - -#define PERF_COUNTER_COUNTER 1 // 32-bit Counter. Divide delta - // by delta time. - - // Display suffix: "/sec" -#define PERF_COUNTER_TIMER 2 // 64-bit Timer. Divide delta by - // delta time. - // Display suffix: "%" - -#define PERF_COUNTER_QUEUELEN 3 // Queue Length Space-Time Product. - // Divide delta by delta time. - // No Display Suffix. - -#define PERF_COUNTER_BULK_COUNT 4 // 64-bit Counter. Divide delta by - // delta time. - // Display Suffix: "/sec" - -#define PERF_COUNTER_TEXT 5 // Indicates the counter is not a - // counter but rather Unicode text - // Display as text. - -#define PERF_COUNTER_RAWCOUNT 6 // Indicates the data is a - // counter which should not be - // time averaged on display (such as - // an error counter on a serial line) - // Display as is. No Display Suffix. - -#define PERF_SAMPLE_FRACTION 7 // A count which is either 1 or 0 on - // each sampling interrupt (% busy) - // Divide delta by delta base. - // Display Suffix: "%" - -#define PERF_SAMPLE_COUNTER 8 // A count which is sampled on each - // sampling interrupt (queue length) - // Divide delta by delta time. - // No Display Suffix. - -#define PERF_COUNTER_NODATA 9 // A label: no data is associated - // with this counter (it has 0 length) - // Do not display. - -#define PERF_COUNTER_TIMER_INV 10 // 64-bit Timer inverse (e.g., idle - // is measured, but display busy %) - // Display 100 - delta divided by - // delta time. Display suffix: "%" - -#define PERF_SAMPLE_BASE 11 // The divisor for a sample, used with - // the previous counter to form a - // sampled %. You must check for >0 - // before dividing by this! This - // counter will directly follow the - // numerator counter. It should not - // be displayed to the user. - -#define PERF_AVERAGE_TIMER 12 // A timer which, when divided by - // an average base, produces a time - // in seconds which is the average - // time of some operation. This - // timer times total operations, and - // the base is the number of opera- - // tions. Display Suffix: "sec" - -#define PERF_AVERAGE_BASE 13 // Used as the denominator in the - // computation of time or count - // averages. Must directly follow - // the numerator counter. Not dis- - // played to the user. - -#define PERF_AVERAGE_BULK 14 // A bulk count which, when divided - // (typically) by the number of - // operations, gives (typically) the - // number of bytes per operation. - // No Display Suffix. - -#define PERF_100NSEC_TIMER 15 // 64-bit Timer in 100 nsec units. - // Display delta divided by - // delta time. Display suffix: "%" - -#define PERF_100NSEC_TIMER_INV 16 // 64-bit Timer inverse (e.g., idle - // is measured, but display busy %) - // Display 100 - delta divided by - // delta time. Display suffix: "%" - -#define PERF_COUNTER_MULTI_TIMER 17 // 64-bit Timer. Divide delta by - // delta time. Display suffix: "%" - // Timer for multiple instances, so - // result can exceed 100%. - +// PERF_COUNTER_DEFINITION.CounterType field values +// +// +// Counter ID Field Definition: +// +// 3 2 2 2 2 1 1 1 +// 1 8 4 2 0 6 2 0 8 0 +// +--------+--------+----+----+--------+--------+----+----+----------------+ +// |Display |Calculation |Time|Counter | |Ctr |Size| | +// |Flags |Modifiers |Base|SubType |Reserved|Type|Fld | Reserved | +// +--------+--------+----+----+--------+--------+----+----+----------------+ +// +// +// The counter type is the "or" of the following values as described below +// +// select one of the following to indicate the counter's data size +// +#define PERF_SIZE_DWORD 0x00000000 +#define PERF_SIZE_LARGE 0x00000100 +#define PERF_SIZE_ZERO 0x00000200 // for Zero Length fields +#define PERF_SIZE_VARIABLE_LEN 0x00000300 // length is in CounterLength field + // of Counter Definition struct +// +// select one of the following values to indicate the counter field usage +// +#define PERF_TYPE_NUMBER 0x00000000 // a number (not a counter) +#define PERF_TYPE_COUNTER 0x00000400 // an increasing numeric value +#define PERF_TYPE_TEXT 0x00000800 // a text field +#define PERF_TYPE_ZERO 0x00000C00 // displays a zero +// +// If the PERF_TYPE_NUMBER field was selected, then select one of the +// following to describe the Number +// +#define PERF_NUMBER_HEX 0x00000000 // display as HEX value +#define PERF_NUMBER_DECIMAL 0x00010000 // display as a decimal integer +#define PERF_NUMBER_DEC_1000 0x00020000 // display as a decimal/1000 +// +// If the PERF_TYPE_COUNTER value was selected then select one of the +// following to indicate the type of counter +// +#define PERF_COUNTER_VALUE 0x00000000 // display counter value +#define PERF_COUNTER_RATE 0x00010000 // divide ctr / delta time +#define PERF_COUNTER_FRACTION 0x00020000 // divide ctr / base +#define PERF_COUNTER_BASE 0x00030000 // base value used in fractions +#define PERF_COUNTER_ELAPSED 0x00040000 // subtract counter from current time +#define PERF_COUNTER_QUEUELEN 0x00050000 // Use Queuelen processing func. +#define PERF_COUNTER_HISTOGRAM 0x00060000 // Counter begins or ends a histogram +// +// If the PERF_TYPE_TEXT value was selected, then select one of the +// following to indicate the type of TEXT data. +// +#define PERF_TEXT_UNICODE 0x00000000 // type of text in text field +#define PERF_TEXT_ASCII 0x00010000 // ASCII using the CodePage field +// +// Timer SubTypes +// +#define PERF_TIMER_TICK 0x00000000 // use system perf. freq for base +#define PERF_TIMER_100NS 0x00100000 // use 100 NS timer time base units +#define PERF_OBJECT_TIMER 0x00200000 // use the object timer freq +// +// Any types that have calculations performed can use one or more of +// the following calculation modification flags listed here +// +#define PERF_DELTA_COUNTER 0x00400000 // compute difference first +#define PERF_DELTA_BASE 0x00800000 // compute base diff as well +#define PERF_INVERSE_COUNTER 0x01000000 // show as 1.00-value (assumes: +#define PERF_MULTI_COUNTER 0x02000000 // sum of multiple instances +// +// Select one of the following values to indicate the display suffix (if any) +// +#define PERF_DISPLAY_NO_SUFFIX 0x00000000 // no suffix +#define PERF_DISPLAY_PER_SEC 0x10000000 // "/sec" +#define PERF_DISPLAY_PERCENT 0x20000000 // "%" +#define PERF_DISPLAY_SECONDS 0x30000000 // "secs" +#define PERF_DISPLAY_NOSHOW 0x40000000 // value is not displayed +// +// Predefined counter types +// + +// 32-bit Counter. Divide delta by delta time. Display suffix: "/sec" +#define PERF_COUNTER_COUNTER \ + (PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_RATE |\ + PERF_TIMER_TICK | PERF_DELTA_COUNTER | PERF_DISPLAY_PER_SEC) + + +// 64-bit Timer. Divide delta by delta time. Display suffix: "%" +#define PERF_COUNTER_TIMER \ + (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_RATE |\ + PERF_TIMER_TICK | PERF_DELTA_COUNTER | PERF_DISPLAY_PERCENT) + +// Queue Length Space-Time Product. Divide delta by delta time. No Display Suffix. +#define PERF_COUNTER_QUEUELEN_TYPE \ + (PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_QUEUELEN |\ + PERF_TIMER_TICK | PERF_DELTA_COUNTER | PERF_DISPLAY_NO_SUFFIX) + +// 64-bit Counter. Divide delta by delta time. Display Suffix: "/sec" +#define PERF_COUNTER_BULK_COUNT \ + (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_RATE |\ + PERF_TIMER_TICK | PERF_DELTA_COUNTER | PERF_DISPLAY_PER_SEC) + +// Indicates the counter is not a counter but rather Unicode text Display as text. +#define PERF_COUNTER_TEXT \ + (PERF_SIZE_VARIABLE_LEN | PERF_TYPE_TEXT | PERF_TEXT_UNICODE |\ + PERF_DISPLAY_NO_SUFFIX) + +// Indicates the data is a counter which should not be +// time averaged on display (such as an error counter on a serial line) +// Display as is. No Display Suffix. +#define PERF_COUNTER_RAWCOUNT \ + (PERF_SIZE_DWORD | PERF_TYPE_NUMBER | PERF_NUMBER_DECIMAL |\ + PERF_DISPLAY_NO_SUFFIX) + +// A count which is either 1 or 0 on each sampling interrupt (% busy) +// Divide delta by delta base. Display Suffix: "%" +#define PERF_SAMPLE_FRACTION \ + (PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_FRACTION |\ + PERF_DELTA_COUNTER | PERF_DELTA_BASE | PERF_DISPLAY_PERCENT) + +// A count which is sampled on each sampling interrupt (queue length) +// Divide delta by delta time. No Display Suffix. +#define PERF_SAMPLE_COUNTER \ + (PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_RATE |\ + PERF_TIMER_TICK | PERF_DELTA_COUNTER | PERF_DISPLAY_NO_SUFFIX) + +// A label: no data is associated with this counter (it has 0 length) +// Do not display. +#define PERF_COUNTER_NODATA \ + (PERF_SIZE_ZERO | PERF_DISPLAY_NOSHOW) + +// 64-bit Timer inverse (e.g., idle is measured, but display busy %) +// Display 100 - delta divided by delta time. Display suffix: "%" +#define PERF_COUNTER_TIMER_INV \ + (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_RATE |\ + PERF_TIMER_TICK | PERF_DELTA_COUNTER | PERF_INVERSE_COUNTER | \ + PERF_DISPLAY_PERCENT) + +// The divisor for a sample, used with the previous counter to form a +// sampled %. You must check for >0 before dividing by this! This +// counter will directly follow the numerator counter. It should not +// be displayed to the user. +#define PERF_SAMPLE_BASE \ + (PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_BASE |\ + PERF_DISPLAY_NOSHOW |\ + 0x00000001) // for compatibility with pre-beta versions + +// A timer which, when divided by an average base, produces a time +// in seconds which is the average time of some operation. This +// timer times total operations, and the base is the number of opera- +// tions. Display Suffix: "sec" +#define PERF_AVERAGE_TIMER \ + (PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_FRACTION |\ + PERF_DISPLAY_SECONDS) + +// Used as the denominator in the computation of time or count +// averages. Must directly follow the numerator counter. Not dis- +// played to the user. +#define PERF_AVERAGE_BASE \ + (PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_BASE |\ + PERF_DISPLAY_NOSHOW |\ + 0x00000002) // for compatibility with pre-beta versions + + +// A bulk count which, when divided (typically) by the number of +// operations, gives (typically) the number of bytes per operation. +// No Display Suffix. +#define PERF_AVERAGE_BULK \ + (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_FRACTION |\ + PERF_DISPLAY_NOSHOW) + +// 64-bit Timer in 100 nsec units. Display delta divided by +// delta time. Display suffix: "%" +#define PERF_100NSEC_TIMER \ + (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_RATE |\ + PERF_TIMER_100NS | PERF_DELTA_COUNTER | PERF_DISPLAY_PERCENT) + +// 64-bit Timer inverse (e.g., idle is measured, but display busy %) +// Display 100 - delta divided by delta time. Display suffix: "%" +#define PERF_100NSEC_TIMER_INV \ + (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_RATE |\ + PERF_TIMER_100NS | PERF_DELTA_COUNTER | PERF_INVERSE_COUNTER |\ + PERF_DISPLAY_PERCENT) + +// 64-bit Timer. Divide delta by delta time. Display suffix: "%" +// Timer for multiple instances, so result can exceed 100%. +#define PERF_COUNTER_MULTI_TIMER \ + (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_RATE |\ + PERF_DELTA_COUNTER | PERF_TIMER_TICK | PERF_MULTI_COUNTER |\ + PERF_DISPLAY_PERCENT) + +// 64-bit Timer inverse (e.g., idle is measured, but display busy %) +// Display 100 * _MULTI_BASE - delta divided by delta time. +// Display suffix: "%" Timer for multiple instances, so result +// can exceed 100%. Followed by a counter of type _MULTI_BASE. #define PERF_COUNTER_MULTI_TIMER_INV \ - 18 // 64-bit Timer inverse (e.g., idle - // is measured, but display busy %) - // Display 100 * _MULTI_BASE - - // delta divided by delta time. - // Display suffix: "%" Timer for - // multiple instances, so result - // can exceed 100%. Followed by - // a counter of type _MULTI_BASE. - -#define PERF_COUNTER_MULTI_BASE 19 // Number of instances to which the - // preceeding _MULTI_..._INV counter - // applies. Used as a factor to get - // the percentage. - -#define PERF_100NSEC_MULTI_TIMER 20 // 64-bit Timer in 100 nsec units. - // Display delta divided by - // delta time. Display suffix: "%" - // Timer for multiple instances, so - // result can exceed 100%. - + (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_RATE |\ + PERF_DELTA_COUNTER | PERF_MULTI_COUNTER | PERF_TIMER_TICK |\ + PERF_INVERSE_COUNTER | PERF_DISPLAY_PERCENT) + +// Number of instances to which the preceding _MULTI_..._INV counter +// applies. Used as a factor to get the percentage. +#define PERF_COUNTER_MULTI_BASE \ + (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_BASE |\ + PERF_MULTI_COUNTER | PERF_DISPLAY_NOSHOW) + +// 64-bit Timer in 100 nsec units. Display delta divided by delta time. +// Display suffix: "%" Timer for multiple instances, so result can exceed 100%. +#define PERF_100NSEC_MULTI_TIMER \ + (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_DELTA_COUNTER |\ + PERF_COUNTER_RATE | PERF_TIMER_100NS | PERF_MULTI_COUNTER |\ + PERF_DISPLAY_PERCENT) + +// 64-bit Timer inverse (e.g., idle is measured, but display busy %) +// Display 100 * _MULTI_BASE - delta divided by delta time. +// Display suffix: "%" Timer for multiple instances, so result +// can exceed 100%. Followed by a counter of type _MULTI_BASE. #define PERF_100NSEC_MULTI_TIMER_INV \ - 21 // 64-bit Timer inverse (e.g., idle - // is measured, but display busy %) - // Display 100 * _MULTI_BASE - - // delta divided by delta time. - // Display suffix: "%" Timer for - // multiple instances, so result - // can exceed 100%. Followed by - // a counter of type _MULTI_BASE. - -#define PERF_RAW_FRACTION 22 // Indicates the data is a fraction - // of the following - // counter which should not be - // time averaged on display (such as - // free space over total space.) - // Display as is. Display the - // quotient as "%". - -#define PERF_RAW_BASE 23 // Indicates the data is a base for - // the preceeding - // counter which should not be - // time averaged on display (such as - // free space over total space.) - + (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_DELTA_COUNTER |\ + PERF_COUNTER_RATE | PERF_TIMER_100NS | PERF_MULTI_COUNTER |\ + PERF_INVERSE_COUNTER | PERF_DISPLAY_PERCENT) + +// Indicates the data is a fraction of the following counter which +// should not be time averaged on display (such as free space over +// total space.) Display as is. Display the quotient as "%". +#define PERF_RAW_FRACTION \ + (PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_FRACTION |\ + PERF_DISPLAY_PERCENT) + +// Indicates the data is a base for the preceding counter which should +// not be time averaged on display (such as free space over total space.) +#define PERF_RAW_BASE \ + (PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_BASE |\ + PERF_DISPLAY_NOSHOW |\ + 0x00000003) // for compatibility with pre-beta versions + +// The data collected in this counter is actually the start time of the +// item being measured. For display, this data is subtracted from the +// sample time to yield the elapsed time as the difference between the two. +// In the definition below, the PerfTime field of the Object contains +// the sample time as indicated by the PERF_OBJECT_TIMER bit and the +// difference is scaled by the PerfFreq of the Object to convert the time +// units into seconds. +#define PERF_ELAPSED_TIME \ + (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_ELAPSED |\ + PERF_OBJECT_TIMER | PERF_DISPLAY_SECONDS) // -// The following counter type can be used with the preceeding types to -// define a reange of values to be displayed in a histogram. +// The following counter type can be used with the preceding types to +// define a range of values to be displayed in a histogram. // -#define PERF_COUNTER_HISTOGRAM 0x80000000 - // Counter begins or ends a histogram +#define PERF_COUNTER_HISTOGRAM_TYPE 0x80000000 + // Counter begins or ends a histogram // // The following are used to determine the level of detail associated @@ -554,10 +412,10 @@ typedef struct _PERF_OBJECT_TYPE { // that should be displayed at any given time. // -#define PERF_DETAIL_NOVICE 100 // The uninformed can understand it -#define PERF_DETAIL_ADVANCED 200 // For the advanced user -#define PERF_DETAIL_EXPERT 300 // For the expert user -#define PERF_DETAIL_WIZARD 400 // For the system designer +#define PERF_DETAIL_NOVICE 100 // The uninformed can understand it +#define PERF_DETAIL_ADVANCED 200 // For the advanced user +#define PERF_DETAIL_EXPERT 300 // For the expert user +#define PERF_DETAIL_WIZARD 400 // For the system designer // @@ -568,65 +426,68 @@ typedef struct _PERF_OBJECT_TYPE { typedef struct _PERF_COUNTER_DEFINITION { DWORD ByteLength; // Length in bytes of this structure - DWORD CounterNameTitleIndex; - // Index of Counter name into - // Title Database + DWORD CounterNameTitleIndex; + // Index of Counter name into + // Title Database LPWSTR CounterNameTitle; // Initially NULL, for use by // analysis program to point to // retrieved title string - DWORD CounterHelpTitleIndex; - // Index of Counter Help into - // Title Database + DWORD CounterHelpTitleIndex; + // Index of Counter Help into + // Title Database LPWSTR CounterHelpTitle; // Initially NULL, for use by // analysis program to point to // retrieved title string - DWORD DefaultScale; // Power of 10 by which to scale + LONG DefaultScale; // Power of 10 by which to scale // chart line if vertical axis is 100 // 0 ==> 1, 1 ==> 10, -1 ==>1/10, etc. - DWORD DetailLevel; // Counter level of detail (for - // controlling display complexity) - DWORD CounterType; // Type of counter - DWORD CounterSize; // Size of counter in bytes - DWORD CounterOffset; // Offset from the start of the - // PERF_COUNTER_BLOCK to the first - // byte of this counter + DWORD DetailLevel; // Counter level of detail (for + // controlling display complexity) + DWORD CounterType; // Type of counter + DWORD CounterSize; // Size of counter in bytes + DWORD CounterOffset; // Offset from the start of the + // PERF_COUNTER_BLOCK to the first + // byte of this counter } PERF_COUNTER_DEFINITION, *PPERF_COUNTER_DEFINITION; - // -// There is one of the following for each of the -// PERF_DATA_BLOCK.NumInstances. +// If (PERF_DATA_BLOCK.NumInstances >= 0) then there will be +// PERF_DATA_BLOCK.NumInstances of a (PERF_INSTANCE_DEFINITION +// followed by a PERF_COUNTER_BLOCK followed by the counter data fields) +// for each instance. +// +// If (PERF_DATA_BLOCK.NumInstances < 0) then the counter definition +// strucutre above will be followed by only a PERF_COUNTER_BLOCK and the +// counter data for that COUNTER. // #define PERF_NO_UNIQUE_ID -1 typedef struct _PERF_INSTANCE_DEFINITION { - DWORD ByteLength; // Length in bytes of this structure, - // including the subsequent name + DWORD ByteLength; // Length in bytes of this structure, + // including the subsequent name DWORD ParentObjectTitleIndex; // Title Index to name of "parent" - // object (e.g., if thread, then + // object (e.g., if thread, then // process is parent object type); // if logical drive, the physical // drive is parent object type - DWORD ParentObjectInstance; - // Index to instance of parent object - // type which is the parent of this - // instance. - DWORD UniqueID; // A unique ID used instead of - // matching the name to identify - // this instance, -1 = none - DWORD NameOffset; // Offset from beginning of - // this struct to the Unicode name - // of this instance - DWORD NameLength; // Length in bytes of name; 0 = none + DWORD ParentObjectInstance; + // Index to instance of parent object + // type which is the parent of this + // instance. + LONG UniqueID; // A unique ID used instead of + // matching the name to identify + // this instance, -1 = none + DWORD NameOffset; // Offset from beginning of + // this struct to the Unicode name + // of this instance + DWORD NameLength; // Length in bytes of name; 0 = none } PERF_INSTANCE_DEFINITION, *PPERF_INSTANCE_DEFINITION; - - // // If .ParentObjectName is 0, there -// is no parent-child hierarcy for this object type. Otherwise, +// is no parent-child hierarchy for this object type. Otherwise, // the .ParentObjectInstance is an index, starting at 0, into the // instances reported for the parent object type. It is only // meaningful if .ParentObjectName is not 0. The purpose of all this @@ -638,8 +499,8 @@ typedef struct _PERF_INSTANCE_DEFINITION // typedef struct _PERF_COUNTER_BLOCK { - DWORD ByteLength; // Length in bytes of this structure, - // including the following counters + DWORD ByteLength; // Length in bytes of this structure, + // including the following counters } PERF_COUNTER_BLOCK, *PPERF_COUNTER_BLOCK; // @@ -647,4 +508,13 @@ typedef struct _PERF_COUNTER_BLOCK { // number of counters. // -#endif // _WINPERF_INCLUDED_ +// +// function typedefs for extensible counter function prototypes +// +typedef DWORD (PM_OPEN_PROC) (LPWSTR); +typedef DWORD (PM_COLLECT_PROC) (LPWSTR, LPVOID *, LPDWORD, LPDWORD); +typedef DWORD (PM_CLOSE_PROC) (); + +#endif // _WINPERF_ + +