2.2.4.2 _PERF_COUNTER_REG_INFO

The _PERF_COUNTER_REG_INFO structure contains information on the counter and is used when enumerating performance counter information on the server.

 typedef struct _PERF_COUNTER_REG_INFO {
   unsigned long CounterId;
   unsigned long Type;
   unsigned __int64 Attrib;
   unsigned long DetailLevel;
   long DefaultScale;
   unsigned long BaseCounterId;
   unsigned long PerfTimeId;
   unsigned long PerfFreqId;
   unsigned long MultiId;
   unsigned long AggregateFunc;
   unsigned long Reserved;
 } PERF_COUNTER_REG_INFO,
  *PPERF_COUNTER_REG_INFO;

CounterId: The numeric identifier of the counter. A performance counter's CounterId value MUST be unique within its counterset.

Type: The type of counter. The client MAY need to perform numeric operations on the value of the counter that is retrieved from the server to use it for analysis. Unless explicitly stated as an instantaneous value, the client MAY need to cache the value of the counter to compare it with the value from the next query. The value MUST be one of the following.

Value

Meaning

PERF_COUNTER_COUNTER

0x10410400

The counter data is a 32-bit value that indicates the rate of events being counted per second. To get the rate, the client takes the difference between counter values from two subsequent queries and divides it by the time difference between the two query time stamps. The unit of time is system time. The value is displayed as a rate of counts per second.

PERF_COUNTER_TIMER

0x20410500

The counter data is a 64-bit value that indicates the percentage of time that the server component updating the counter data was active over the sample interval. The client takes the difference in this value between subsequent queries and divides it by the sample interval; it displays this ratio as a percentage.

PERF_COUNTER_QUEUELEN_TYPE

0x00450400

The counter data is a 32-bit value that indicates the average change in the length of a queue over the sample interval. The client takes the difference in this value between subsequent queries and divides it by the sample interval.

PERF_COUNTER_LARGE_QUEUELEN_TYPE

0x00450500

This counter is similar to PERF_COUNTER_QUEUELEN_TYPE, except that the counter data is a 64-bit value.

PERF_COUNTER_100NS_QUEUELEN_TYPE

0x00550500

This counter is similar to PERF_COUNTER_LARGE_QUEUELEN_TYPE, except that the client assumes its clock is updated at a frequency of 100 nanoseconds for this calculation.

PERF_COUNTER_OBJ_TIME_QUEUELEN_TYPE

0x00650500

The counter data is a 32-bit value that indicates the average change in the length of a queue over the sample interval. The client takes the difference in this value between subsequent queries and divides it by the time difference that the server provides through the PerfTimeId counter, which contains the time stamp, and the PerfFreqId counter, which contains the frequency at which the server updates the time.

PERF_COUNTER_BULK_COUNT

0x10410500

This counter is similar to PERF_COUNTER_COUNTER, except that the counter data is a 64-bit value.

PERF_COUNTER_TEXT

0X00000B00

This counter is not a numeric counter, but rather Unicode text. The value is displayed as text.

PERF_COUNTER_RAWCOUNT

0x00010000

The counter data is an instantaneous 32-bit value and is not divided by a sample interval to calculate the average.

PERF_COUNTER_LARGE_RAWCOUNT

0x00010100

This counter is similar to PERF_COUNTER_RAWCOUNT, except that the counter data is a 64-bit value.

PERF_COUNTER_RAWCOUNT_HEX

0x00000000

The counter data is an instantaneous 32-bit value and is not divided by a sample interval to calculate the average. The value is displayed as a hexadecimal number.

PERF_COUNTER_LARGE_RAWCOUNT_HEX

0x00000100

This counter is similar to PERF_COUNTER_RAWCOUNT_HEX, except that the counter data is a 64-bit value.

PERF_SAMPLE_FRACTION

0x20C20400

The counter data is a 32-bit value that is used with another counter to calculate a ratio that is displayed as a percentage. The client takes the difference between this counter data value and divides it by the difference between the data value queries of the BaseCounterId counter.

PERF_SAMPLE_COUNTER

0x00410400

The 32-bit counter data is similar to the PERF_COUNTER_COUNTER, except that the system performance time is used to calculate the sample interval instead of the system time.

PERF_COUNTER_TIMER_INV

0x21410500

The 64-bit counter data is generally used to show inactive time. The client takes the difference in the counter data between two queries and then divides that by the sample interval, which is calculated by using the system performance time. This ratio is then subtracted from 1 and displayed as a percentage.

PERF_ELAPSED_TIME

0x30240500

The 64-bit counter data contains a time value from which the value of the PerfTimeId counter is subtracted. This difference is then divided by the value of the PerfFreqId counter, which contains the frequency at which the server updates the time.

PERF_SAMPLE_BASE

0x40030401

The 32-bit counter data is used as the BaseCounterId for calculations that involve PERF_SAMPLE_FRACTION and MUST be greater than 0.

PERF_AVERAGE_TIMER

0x30020400

The 32-bit counter data is generally used to indicate the average time for an operation. The client takes the difference in the counter data between subsequent queries and divides that by the frequency of the system clock. It then divides this value by the value of the difference between subsequent queries of the BaseCounterId counter, which would contain the number of operations.

PERF_AVERAGE_BASE

0x40030402

The 32-bit counter data is used as the BaseCounterId counter in calculations that involve PERF_AVERAGE_TIMER or PERF_AVERAGE_BULK.

PERF_AVERAGE_BULK

0x40020500

The 64-bit counter data is generally used to show an average metric, such as bytes, for an operation. The client takes the difference in this value between subsequent queries and divides that value by the difference in the value of the BaseCounterId counter.

PERF_OBJ_TIME_TIMER

0x20610500

The 64-bit counter data is used as a server-specific timer. The client takes the difference in the counter data between subsequent queries and then divides that by the difference in time. The time difference is calculated by taking the difference of the PerfTimeId counter between subsequent queries and dividing it by the value of the PerfFreqId counter.

PERF_PRECISION_100NS_TIMER

0x20570500

The 64-bit counter data is used as a precise elapsed timer. The client takes the difference in the counter data between subsequent queries and then divides that by the value of the difference in the BaseCounterId counter; the BaseCounterId counter represents a clock time that is assumed to be updated at a frequency of 100 nanoseconds.

PERF_PRECISION_SYSTEM_TIMER

0x20470500

The 64-bit counter data is used as an elapsed timer. The client takes the difference in the counter data from subsequent queries and divides it by the difference in the counter data of the BaseCounterId counter, which serves as a timestamp counter. The client assumes the frequency of the clock is the same as the system performance timer.

PERF_PRECISION_OBJECT_TIMER

0x20670500

The 64-bit counter data is used as a precise elapsed timer. The client takes the difference in the counter data between subsequent queries and divides that by the value of the difference in time. This difference is calculated by taking the difference between subsequent queries of the PerfTimeId counter and dividing it by the frequency, which is the value of the PerfFreqId counter.

 PERF_100NSEC_TIMER

0x20510500

The 64-bit counter data is used to indicate the ratio of active time over elapsed time. The client takes the difference in the counter data between subsequent queries and then divides that by the sample interval; the frequency of the client clock is assumed to be 100 nanoseconds. The value is displayed as a percentage.

 PERF_100NSEC_TIMER_INV

0x21510500

The 64-bit counter data is the inverse of the PERF_100NSEC_TIMER; it shows the ratio of inactive time over elapsed time. The client takes the difference in this counter value between subsequent queries and then divides it by the sample interval; this result is subtracted from 1 and then displayed as a percentage. The frequency of the client clock in this calculation is assumed to be 100 nanoseconds.

PERF_COUNTER_MULTI_TIMER

0x22410500

The 64-bit counter data is used to indicate the average ratio of active time over elapsed time; it is used when there are multiple instances, such as disks that are being monitored. The client takes the difference in the counter data between subsequent queries and divides it by the sample interval. The client uses the frequency of the system performance time to calculate elapsed time. This ratio is then divided by the value of the MultiId counter and is displayed as a percentage.

PERF_COUNTER_MULTI_TIMER_INV

0x23410500

The 64-bit counter data is the inverse of the PERF_COUNTER_MULTI_TIMER. The client takes the difference in the counter data between subsequent queries and divides it by the sample interval. The client uses the frequency of the system performance time. This value is then subtracted from the value of the MultiId counter and is displayed as a percentage.

 PERF_100NSEC_MULTI_TIMER

0x22510500

The 64-bit counter data is used to indicate the average ratio of active time over elapsed time; it is used when there are multiple instances, such as disks that are being monitored. The client takes the difference in the counter data between subsequent queries and divides it by the sample interval. The client uses the frequency of 100 nanoseconds to calculate elapsed time. This ratio is then divided by the value of the MultiId counter and is displayed as a percentage.

 PERF_100NSEC_MULTI_TIMER_INV

0x23510500

The 64-bit counter data is the inverse of the PERF_100NSEC_MULTI_TIMER. The client takes the difference in the counter data between subsequent queries and then divides it by the sample interval; the client uses the frequency of 100 nanoseconds to calculate elapsed time. This value is then subtracted from the value of the MultiId counter; it is displayed as a percentage.

PERF_RAW_FRACTION

0x20020400

The 32-bit counter data is used to show a ratio between two values. The client takes the counter data and divides it by the value of the BaseCounterId counter; it displays this ratio as a percentage.

PERF_RAW_BASE

0x40030403

The 32-bit counter data is used by the client in calculations involving the PERF_RAW_FRACTION counter. The client SHOULD NOT display this counter.

PERF_LARGE_RAW_FRACTION

0x20020500

The counter data is similar to PERF_RAW_FRACTION, except that it is a 64-bit value.

PERF_LARGE_RAW_BASE

0x40030500

The 64-bit counter data is used by the client in calculations that involve PERF_LARGE_RAW_FRACTION, PERF_PRECISION_SYSTEM_TIMER, and PERF_PRECISION_100NS_TIMER counters.

Attrib: The counter attributes describe certain properties that can be combined in certain cases. The value MUST be one or more of the following.

Value

Meaning

0x0000000000000001

Reference. The query on the server MUST dereference the counter to obtain the value.<2>

0x0000000000000002

No display. Instructs the client consumer querying for performance counter data not to display the counter value.

0x0000000000000004

No group separator. Instructs the client consumer querying performance counter data to display the counter values as a single number without commas between digits.

0x0000000000000008

Display as real. Instructs the client consumer querying performance counter to display the counter value as a real number.

0x0000000000000010

Display as hexadecimal. Instructs the client consumer querying performance counter to display the counter value as a hexadecimal number.

Note that only certain combinations of the preceding possible values are allowed.

  • The "Reference" value (0x0000000000000001) can be specified with any other value.

  • The "No display" value (0x0000000000000002) MUST NOT be specified with the "No group separator", "Display as real" or "Display as hex" values.

  • The "No group separator" (0x0000000000000004) or the "Display as real" (0x0000000000000008) values MUST NOT be specified with the "Display as hex" value.

DetailLevel: The detail level of the counter. The value MUST be one of the following.

Value

Meaning

0x00000064

Novice level. Designed to be accessed by casual users who do not have detailed system knowledge.

0x000000C8

Advanced level. Designed to be accessed by IT administrators who are monitoring multiple machines.

DefaultScale: Indicates the amount by which the counter value is scaled. Valid values are from 0xFFFFFFF6 to 0x0000000A (-10 to 10 decimal). For example, if the value of the counter is 0x0000000A (10 decimal) and the default scale is 0x00000002 (2 decimal), the counter value that is calculated by the client MUST be 0x000003E8 (1000 decimal).

BaseCounterId: The CounterId of another counter in the counterset whose value is used by the client in calculating this counter's value. The type of calculation depends of the type of the performance counter.

For example, the difference in the value between queries of a counter are divided by the difference in the value between queries of the counter whose CounterId is BaseCounterId.

The following counter types require a BaseCounterId.

Counter type

Base counter type

PERF_AVERAGE_TIMER

PERF_AVERAGE_BASE

PERF_AVERAGE_BULK

PERF_AVERAGE_BASE

PERF_LARGE_RAW_FRACTION

PERF_LARGE_RAW_BASE

PERF_PRECISION_SYSTEM_TIMER

PERF_LARGE_RAW_BASE

PERF_PRECISION_100NS_TIMER

PERF_LARGE_RAW_BASE

PERF_RAW_FRACTION

PERF_RAW_BASE

PERF_SAMPLE_FRACTION

PERF_SAMPLE_BASE

PerfTimeId: The CounterId of another counter in the counterset whose time value is used to calculate the value of this counter.

In certain cases, such as when calculating rate, it is necessary to gather a time value and take the difference between subsequent queries of this time value to calculate elapsed time on the client. PerfTimeId specifies the CounterId of the counter, which MUST be of type PERF_COUNTER_LARGE_RAWCOUNT, in the counterset that will contain the time value that is used to calculate the rate of this counter. The following counter types require a PerfTimeId (for more information, see [MSFT-COUNTERTYPES]):

§ PERF_COUNTER_OBJ_TIME_QUEUELEN_TYPE

§ PERF_ELAPSED_TIME

§ PERF_OBJ_TIME_TIMER

§ PERF_PRECISION_OBJECT_TIMER

PerfFreqId: The CounterId of another counter in the counterset whose frequency value is used to calculate the value of this counter.

In certain cases, such as when rate is calculated, it is necessary to gather a time value and take the difference between subsequent queries of this time value. The time value is then divided by the frequency at which time is updated to calculate the elapsed time, in seconds, on the client. PerfFreqId specifies the CounterId of the counter, which MUST be of type PERF_COUNTER_LARGE_RAWCOUNT, in the counterset whose value will contain the frequency at which time is updated to calculate the rate of this counter. The following counter types require a PerfFreqId (for more information, see [MSFT-COUNTERTYPES]):

§ PERF_COUNTER_OBJ_TIME_QUEUELEN_TYPE

§ PERF_ELAPSED_TIME

§ PERF_OBJ_TIME_TIMER

§ PERF_PRECISION_OBJECT_TIMER

MultiId: The CounterId of another counter within the current counterset that is used to calculate the value of this counter.

In certain cases, such as when rate counters are scaled, it is necessary to divide the difference in this counter value between queries by an additional value on the client. The CounterId of the counter is specified by MultiId. It MUST be of type PERF_COUNTER_RAWCOUNT in the counterset that is used as a divisor to this counter value. The following counter types require a MultiId (for more information, see [MSFT-COUNTERTYPES]):

§ PERF_COUNTER_MULTI_TIMER

§ PERF_100NSEC_MULTI_TIMER

§ PERF_100NSEC_MULTI_TIMER_INV

§ PERF_COUNTER_MULTI_TIMER_INV

AggregateFunc: The aggregation function to be performed by the client on the counter if the counterset to which the counter belongs is of type Global Aggregate, Multiple Instance Aggregate, or Global Aggregate History. The client specifies across which counter instances the aggregation are performed if the counterset type is Multiple Instance Aggregate; otherwise, the client MUST aggregate values across all instances of the counterset. One of the following values MUST be specified.

Value

Meaning

0x00000000

Undefined.

0x00000001

Total. The sum of the values of the returned counter instances.

0x00000002

Average. The average of the values of the returned counter instances.

0x00000003

Minimum. The minimum value of the returned counter instance values.

0x00000004

Maximum. The maximum value of the returned counter instance values.

Reserved: This is a reserved field. It MUST be set to 0, and MUST be ignored on receipt.