{--------------------------------------------------------------------
Author: J.M.Wehlou
Description: ported winperf.h from platform sdk
--------------------------------------------------------------------}
unit winperf;
interface
uses
Windows;
//
==================================================================
const
PERF_DETAIL_NOVICE = 100;
// The uninformed can understand it
PERF_DETAIL_ADVANCED = 200;
// For the advanced user
PERF_DETAIL_EXPERT = 300;
// For the expert user
PERF_DETAIL_WIZARD = 400;
// For the system designer
//
------------------------------------------------------------------
// these structures must be aligned on 8 byte boundaries, and since that is
// Delphi's default (A8 or A+), we don't need to do anything for that
type
PERF_OBJECT_TYPE = record
TotalByteLength : DWORD;
// 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
DefinitionLength : DWORD;
// 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
HeaderLength : DWORD;
// Length of this
structure: this
// is the offset to the first
// counter definition for this
// object
ObjectNameTitleIndex : DWORD;
// Index to name in Title Database
{$ifdef _WIN64}
ObjectNameTitle : DWORD;
// Should use this as an offset
{$else}
ObjectNameTitle : LPWSTR;
// Initially NULL, for use by
// analysis program to point to
// retrieved title string
{$endif}
ObjectHelpTitleIndex : DWORD;
// Index to Help in Title Database
{$ifdef _WIN64}
ObjectHelpTitle : DWORD;
// Should use this
as an offset
{$else}
ObjectHelpTitle : LPWSTR;
// Initially NULL, for
use by
// analysis program to point to
// retrieved title string
{$endif}
DetailLevel : DWORD;
// Object level
of detail (for
// controlling display complexity);
// will be min of detail levels
// for all this object's counters
NumCounters : DWORD;
// Number of counters in each
// counter block (one counter
// block per instance)
DefaultCounter : longint;
// Default counter to
display when
// this object is selected, index
// starting at 0 (-1 = none, but
// this is not expected to be used)
NumInstances : longint;
// 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.
CodePage : DWORD;
// 0 if instance strings are in
// UNICODE, else the Code Page of
// the instance names
PerfTime : LARGE_INTEGER;
// Sample Time in "Object" units
//
PerfFreq : LARGE_INTEGER;
// Frequency of "Object" units in
// counts per second.
end;
//
------------------------------------------------------------------
PERF_COUNTER_DEFINITION = record
ByteLength : DWORD;
// Length
in bytes of this structure
CounterNameTitleIndex : DWORD;
// Index of Counter name into
// Title Database
{$ifdef _WIN64}
CounterNameTitle : DWORD;
{$else}
CounterNameTitle : LPWSTR;
// Initially NULL, for use
by
// analysis program to point to
// retrieved title string
{$endif}
CounterHelpTitleIndex : DWORD;
// Index of Counter Help into
// Title Database
{$ifdef _WIN64}
CounterHelpTitle : DWORD;
{$else}
CounterHelpTitle : LPWSTR;
// Initially NULL, for use
by
// analysis program to point to
// retrieved title string
{$endif}
DefaultScale : longint;
// Power of
10 by which to scale
// chart line if vertical axis is 100
// 0 ==> 1, 1 ==> 10, -1 ==>1/10, etc.
DetailLevel : DWORD;
// Counter level of detail (for
// controlling display complexity)
CounterType : DWORD;
// Type of counter
CounterSize : DWORD;
// Size of counter in bytes
CounterOffset : DWORD;
// Offset from the start of
the
// PERF_COUNTER_BLOCK to the first
// byte of this counter
end;
//
------------------------------------------------------------------
PERF_INSTANCE_DEFINITION = record
ByteLength : DWORD;
// Length
in bytes of this structure,
// including the subsequent name
ParentObjectTitleIndex : DWORD;
// Title Index to name of "parent"
// object (e.g., if thread, then
// process is parent object type);
// if logical drive, the physical
// drive is parent object type
ParentObjectInstance : DWORD;
// Index to instance of parent object
// type which is the parent of this
// instance.
UniqueID : longint;
// A unique ID used instead of
// matching the name to identify
// this instance, -1 = none
NameOffset : DWORD;
// Offset from beginning of
// this struct to the Unicode name
// of this instance
NameLength : DWORD;
// Length
in bytes of name; 0 = none
// this length includes the characters
// in the string plus the size of the
// terminating NULL char. It does not
// include any additional pad bytes to
// correct structure alignment
end;
//
------------------------------------------------------------------
PERF_COUNTER_BLOCK = record
ByteLength : DWORD;
// Length
in bytes of this structure,
// including the following counters
end;
// - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - -
//
// 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
//
const
PERF_SIZE_DWORD
= $00000000; // 32 bit
field
PERF_SIZE_LARGE
= $00000100; // 64 bit
field
PERF_SIZE_ZERO
= $00000200; // for
Zero Length fields
PERF_SIZE_VARIABLE_LEN =
$00000300; // length is in
CounterLength field
// of Counter Definition struct
//
// select one of the following values to
indicate the counter field usage
//
PERF_TYPE_NUMBER
= $00000000; // a
number (not a counter)
PERF_TYPE_COUNTER
= $00000400; // an
increasing numeric value
PERF_TYPE_TEXT
= $00000800; // a text
field
PERF_TYPE_ZERO
= $00000C00; //
displays a zero
//
// If the PERF_TYPE_NUMBER field was selected,
then select one of the
// following to describe the Number
//
PERF_NUMBER_HEX
= $00000000; //
display as HEX value
PERF_NUMBER_DECIMAL
= $00010000; //
display as a decimal integer
PERF_NUMBER_DEC_1000
= $00020000; //
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
//
PERF_COUNTER_VALUE
= $00000000; //
display counter value
PERF_COUNTER_RATE
= $00010000; // divide
ctr / delta time
PERF_COUNTER_FRACTION =
$00020000; // divide ctr /
base
PERF_COUNTER_BASE
= $00030000; // base
value used in fractions
PERF_COUNTER_ELAPSED
= $00040000; //
subtract counter from current time
PERF_COUNTER_QUEUELEN =
$00050000; // Use Queuelen
processing func.
PERF_COUNTER_HISTOGRAM =
$00060000; // Counter begins
or ends a histogram
PERF_COUNTER_PRECISION =
$00070000; // divide ctr /
private clock
//
// If the PERF_TYPE_TEXT value was selected,
then select one of the
// following to indicate the type of TEXT data.
//
PERF_TEXT_UNICODE
= $00000000; // type
of text in text field
PERF_TEXT_ASCII
= $00010000; // ASCII
using the CodePage field
//
// Timer SubTypes
//
PERF_TIMER_TICK
= $00000000; // use
system perf. freq for base
PERF_TIMER_100NS
= $00100000; // use
100 NS timer time base units
PERF_OBJECT_TIMER
= $00200000; // use
the object timer freq
//
// Any types that have calculations performed
can use one or more of
// the following calculation modification flags
listed here
//
PERF_DELTA_COUNTER
= $00400000; //
compute difference first
PERF_DELTA_BASE
= $00800000; //
compute base diff as well
PERF_INVERSE_COUNTER
= $01000000; // show
as 1.00-value (assumes:
PERF_MULTI_COUNTER
= $02000000; // sum of
multiple instances
//
// Select one of the following values to
indicate the display suffix (if any)
//
PERF_DISPLAY_NO_SUFFIX =
$00000000; // no suffix
PERF_DISPLAY_PER_SEC
= $10000000; // "/sec"
PERF_DISPLAY_PERCENT
= $20000000; // "%"
PERF_DISPLAY_SECONDS
= $30000000; // "secs"
PERF_DISPLAY_NOSHOW
= $40000000; // value
is not displayed
//
// Predefined counter types
//
// 32-bit Counter. Divide
delta by delta time. Display suffix: "/sec"
PERF_COUNTER_COUNTER =
(PERF_SIZE_DWORD or
PERF_TYPE_COUNTER or PERF_COUNTER_RATE or
PERF_TIMER_TICK or
PERF_DELTA_COUNTER or PERF_DISPLAY_PER_SEC);
// 64-bit Timer. Divide
delta by delta time. Display suffix: "%"
PERF_COUNTER_TIMER =
(PERF_SIZE_LARGE or
PERF_TYPE_COUNTER or PERF_COUNTER_RATE or
PERF_TIMER_TICK or
PERF_DELTA_COUNTER or PERF_DISPLAY_PERCENT);
// Queue Length
Space-Time Product. Divide delta by delta time. No Display Suffix.
PERF_COUNTER_QUEUELEN_TYPE =
(PERF_SIZE_DWORD or
PERF_TYPE_COUNTER or PERF_COUNTER_QUEUELEN or
PERF_TIMER_TICK or
PERF_DELTA_COUNTER or PERF_DISPLAY_NO_SUFFIX);
// Queue Length
Space-Time Product. Divide delta by delta time. No Display Suffix.
PERF_COUNTER_LARGE_QUEUELEN_TYPE =
(PERF_SIZE_LARGE or
PERF_TYPE_COUNTER or PERF_COUNTER_QUEUELEN or
PERF_TIMER_TICK or
PERF_DELTA_COUNTER or PERF_DISPLAY_NO_SUFFIX);
// Queue Length
Space-Time Product using 100 Ns timebase.
// Divide delta by delta time. No Display
Suffix.
PERF_COUNTER_100NS_QUEUELEN_TYPE =
(PERF_SIZE_LARGE or
PERF_TYPE_COUNTER or PERF_COUNTER_QUEUELEN or
PERF_TIMER_100NS or
PERF_DELTA_COUNTER or PERF_DISPLAY_NO_SUFFIX);
// Queue Length
Space-Time Product using Object specific timebase.
// Divide delta by delta time. No Display
Suffix.
PERF_COUNTER_OBJ_TIME_QUEUELEN_TYPE =
(PERF_SIZE_LARGE or
PERF_TYPE_COUNTER or PERF_COUNTER_QUEUELEN or
PERF_OBJECT_TIMER or
PERF_DELTA_COUNTER or PERF_DISPLAY_NO_SUFFIX);
// 64-bit Counter. Divide
delta by delta time. Display Suffix: "/sec"
PERF_COUNTER_BULK_COUNT =
(PERF_SIZE_LARGE or
PERF_TYPE_COUNTER or PERF_COUNTER_RATE or
PERF_TIMER_TICK or
PERF_DELTA_COUNTER or PERF_DISPLAY_PER_SEC);
// Indicates the counter
is not a counter but rather Unicode text Display as text.
PERF_COUNTER_TEXT =
(PERF_SIZE_VARIABLE_LEN or
PERF_TYPE_TEXT or PERF_TEXT_UNICODE or
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.
PERF_COUNTER_RAWCOUNT =
(PERF_SIZE_DWORD or
PERF_TYPE_NUMBER or PERF_NUMBER_DECIMAL or
PERF_DISPLAY_NO_SUFFIX);
// Same as
PERF_COUNTER_RAWCOUNT except its size is a large integer
PERF_COUNTER_LARGE_RAWCOUNT =
(PERF_SIZE_LARGE or
PERF_TYPE_NUMBER or PERF_NUMBER_DECIMAL or
PERF_DISPLAY_NO_SUFFIX);
// Special case for
RAWCOUNT that want to be displayed in hex
// 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.
PERF_COUNTER_RAWCOUNT_HEX =
(PERF_SIZE_DWORD or
PERF_TYPE_NUMBER or PERF_NUMBER_HEX or
PERF_DISPLAY_NO_SUFFIX);
// Same as
PERF_COUNTER_RAWCOUNT_HEX except its size is a large integer
PERF_COUNTER_LARGE_RAWCOUNT_HEX =
(PERF_SIZE_LARGE or
PERF_TYPE_NUMBER or PERF_NUMBER_HEX or
PERF_DISPLAY_NO_SUFFIX);
// A count which is
either 1 or 0 on each sampling interrupt (% busy);
// Divide delta by delta base. Display Suffix:
"%"
PERF_SAMPLE_FRACTION =
(PERF_SIZE_DWORD or
PERF_TYPE_COUNTER or PERF_COUNTER_FRACTION or
PERF_DELTA_COUNTER or
PERF_DELTA_BASE or PERF_DISPLAY_PERCENT);
// A count which is
sampled on each sampling interrupt (queue length);
// Divide delta by delta time. No Display
Suffix.
PERF_SAMPLE_COUNTER =
(PERF_SIZE_DWORD or
PERF_TYPE_COUNTER or PERF_COUNTER_RATE or
PERF_TIMER_TICK or
PERF_DELTA_COUNTER or PERF_DISPLAY_NO_SUFFIX);
// A label: no data is
associated with this counter (it has 0 length);
// Do not display.
PERF_COUNTER_NODATA =
(PERF_SIZE_ZERO or
PERF_DISPLAY_NOSHOW);
// 64-bit Timer inverse
(e.g., idle is measured, but display busy %);
// Display 100 - delta divided by delta time.
Display suffix: "%"
PERF_COUNTER_TIMER_INV =
(PERF_SIZE_LARGE or
PERF_TYPE_COUNTER or PERF_COUNTER_RATE or
PERF_TIMER_TICK or
PERF_DELTA_COUNTER or PERF_INVERSE_COUNTER or
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.
PERF_SAMPLE_BASE =
(PERF_SIZE_DWORD or
PERF_TYPE_COUNTER or PERF_COUNTER_BASE or
PERF_DISPLAY_NOSHOW or
$00000001);
// 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"
PERF_AVERAGE_TIMER =
(PERF_SIZE_DWORD or
PERF_TYPE_COUNTER or PERF_COUNTER_FRACTION or
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.
PERF_AVERAGE_BASE =
(PERF_SIZE_DWORD or
PERF_TYPE_COUNTER or PERF_COUNTER_BASE or
PERF_DISPLAY_NOSHOW or
$00000002);
// 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.
PERF_AVERAGE_BULK =
(PERF_SIZE_LARGE or
PERF_TYPE_COUNTER or PERF_COUNTER_FRACTION or
PERF_DISPLAY_NOSHOW);
// 64-bit Timer in object
specific units. Display delta divided by
// delta time as returned in the object type
header structure. Display suffix: "%"
PERF_OBJ_TIME_TIMER =
(PERF_SIZE_LARGE or
PERF_TYPE_COUNTER or PERF_COUNTER_RATE or
PERF_OBJECT_TIMER or
PERF_DELTA_COUNTER or PERF_DISPLAY_PERCENT);
// 64-bit Timer in 100
nsec units. Display delta divided by
// delta time. Display suffix: "%"
PERF_100NSEC_TIMER
=
(PERF_SIZE_LARGE or
PERF_TYPE_COUNTER or PERF_COUNTER_RATE or
PERF_TIMER_100NS or
PERF_DELTA_COUNTER or PERF_DISPLAY_PERCENT);
// 64-bit Timer inverse
(e.g., idle is measured, but display busy %);
// Display 100 - delta divided by delta time.
Display suffix: "%"
PERF_100NSEC_TIMER_INV =
(PERF_SIZE_LARGE or
PERF_TYPE_COUNTER or PERF_COUNTER_RATE or
PERF_TIMER_100NS or
PERF_DELTA_COUNTER or PERF_INVERSE_COUNTER or
PERF_DISPLAY_PERCENT);
// 64-bit Timer. Divide
delta by delta time. Display suffix: "%"
// Timer for multiple instances, so result can
exceed 100%.
PERF_COUNTER_MULTI_TIMER =
(PERF_SIZE_LARGE or
PERF_TYPE_COUNTER or PERF_COUNTER_RATE or
PERF_DELTA_COUNTER or
PERF_TIMER_TICK or PERF_MULTI_COUNTER or
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.
PERF_COUNTER_MULTI_TIMER_INV =
(PERF_SIZE_LARGE or
PERF_TYPE_COUNTER or PERF_COUNTER_RATE or
PERF_DELTA_COUNTER or
PERF_MULTI_COUNTER or PERF_TIMER_TICK or
PERF_INVERSE_COUNTER or
PERF_DISPLAY_PERCENT);
// Number of instances to
which the preceding _MULTI_..._INV counter
// applies. Used as a factor to get the
percentage.
PERF_COUNTER_MULTI_BASE =
(PERF_SIZE_LARGE or
PERF_TYPE_COUNTER or PERF_COUNTER_BASE or
PERF_MULTI_COUNTER or
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%.
PERF_100NSEC_MULTI_TIMER =
(PERF_SIZE_LARGE or
PERF_TYPE_COUNTER or PERF_DELTA_COUNTER or
PERF_COUNTER_RATE or
PERF_TIMER_100NS or PERF_MULTI_COUNTER or
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.
PERF_100NSEC_MULTI_TIMER_INV =
(PERF_SIZE_LARGE or
PERF_TYPE_COUNTER or PERF_DELTA_COUNTER or
PERF_COUNTER_RATE or
PERF_TIMER_100NS or PERF_MULTI_COUNTER or
PERF_INVERSE_COUNTER or
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 "%".
PERF_RAW_FRACTION =
(PERF_SIZE_DWORD or
PERF_TYPE_COUNTER or PERF_COUNTER_FRACTION or
PERF_DISPLAY_PERCENT);
PERF_LARGE_RAW_FRACTION =
(PERF_SIZE_LARGE or
PERF_TYPE_COUNTER or PERF_COUNTER_FRACTION or
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.);
PERF_RAW_BASE =
(PERF_SIZE_DWORD or
PERF_TYPE_COUNTER or PERF_COUNTER_BASE or
PERF_DISPLAY_NOSHOW or
$00000003);
// for compatibility with pre-beta versions
PERF_LARGE_RAW_BASE =
(PERF_SIZE_LARGE or
PERF_TYPE_COUNTER or PERF_COUNTER_BASE or
PERF_DISPLAY_NOSHOW );
// 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.
PERF_ELAPSED_TIME =
(PERF_SIZE_LARGE or
PERF_TYPE_COUNTER or PERF_COUNTER_ELAPSED or
PERF_OBJECT_TIMER or
PERF_DISPLAY_SECONDS);
//
// The following counter type can be used with
the preceding types to
// define a range of values to be displayed in
a histogram.
//
PERF_COUNTER_HISTOGRAM_TYPE =
$80000000;
// Counter begins or ends
a histogram
//
// This counter is used to display the
difference from one sample
// to the next. The counter value is a
constantly increasing number
// and the value displayed is the difference
between the current
// value and the previous value. Negative
numbers are not allowed
// which shouldn't be a problem as long as the
counter value is
// increasing or unchanged.
//
PERF_COUNTER_DELTA =
(PERF_SIZE_DWORD or
PERF_TYPE_COUNTER or PERF_COUNTER_VALUE or
PERF_DELTA_COUNTER or
PERF_DISPLAY_NO_SUFFIX);
PERF_COUNTER_LARGE_DELTA =
(PERF_SIZE_LARGE or
PERF_TYPE_COUNTER or PERF_COUNTER_VALUE or
PERF_DELTA_COUNTER or
PERF_DISPLAY_NO_SUFFIX);
//
// The precision counters are timers that
consist of two counter values:
// 1); the count of elapsed time of the event
being monitored
// 2); the "clock" time in the same units
//
// the precision
timers are used where the standard system timers are not
// precise enough for accurate readings. It's
assumed that the service
// providing the data is also providing a
timestamp at the same time which
// will eliminate any error that may occur
since some small and variable
// time elapses between the time the system
timestamp is captured and when
// the data is collected from the performance
DLL. Only in extreme cases
// has this been observed to be problematic.
//
// when using this type of timer, the
definition of the
// PERF_PRECISION_TIMESTAMP counter must
immediately follow the
// definition of the PERF_PRECISION_*_TIMER in
the Object header
//
// The timer used has the same frequency as the
System Performance Timer
PERF_PRECISION_SYSTEM_TIMER =
(PERF_SIZE_LARGE or
PERF_TYPE_COUNTER or PERF_COUNTER_PRECISION or
PERF_TIMER_TICK or
PERF_DELTA_COUNTER or PERF_DISPLAY_PERCENT );
//
// The timer used has the same frequency as the
100 NanoSecond Timer
PERF_PRECISION_100NS_TIMER =
(PERF_SIZE_LARGE or
PERF_TYPE_COUNTER or PERF_COUNTER_PRECISION or
PERF_TIMER_100NS or
PERF_DELTA_COUNTER or PERF_DISPLAY_PERCENT );
//
// The timer used is of the frequency specified
in the Object header's
// PerfFreq field (PerfTime is ignored);
PERF_PRECISION_OBJECT_TIMER =
(PERF_SIZE_LARGE or
PERF_TYPE_COUNTER or PERF_COUNTER_PRECISION or
PERF_OBJECT_TIMER or
PERF_DELTA_COUNTER or PERF_DISPLAY_PERCENT );
//
// This is the timestamp to use in the
computation of the timer specified
// in the previous description block
PERF_PRECISION_TIMESTAMP =
PERF_LARGE_RAW_BASE;
//
==================================================================
implementation
end.