📄 winperf.pas
字号:
Unit winperf;
// Windows NT performance data structures
Interface
uses Windows ;
{
Copyright (C) 1993-1996 Microsoft Corporation
Module Name:
winperf.h
Converted to Pascal/Delphi
by Angus Robertson, Magenta Systems Ltd, 7 August 1998
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().
}
Type
// Data structure definitions.
// In order for data to be returned through the Configuration Registry
// in a system-independent fashion, it must be self-describing.
// In the following, all offsets are in bytes.
// Data is returned through the Configuration Registry in a
// a data block which begins with a _PERF_DATA_BLOCK structure.
PPERF_DATA_BLOCK = ^PERF_DATA_BLOCK ;
PERF_DATA_BLOCK = RECORD // pdb
Signature: Array[0..3] Of WideChar; // Signature: Unicode "PERF"
LittleEndian: DWORD; // 0 = Big Endian, 1 = Little Endian
Version: DWORD; // Version of these data structures
// starting at 1
Revision: DWORD; // Revision of these data structures
// starting at 0 for each Version
TotalByteLength: DWORD; // Total length of data block
HeaderLength: DWORD; // Length of this structure
NumObjectTypes: DWORD; // Number of types of objects
// being reported
DefaultObject: integer; // 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: TSystemTime ; // Time at the system under
// measurement
PerfTime: TLargeInteger ; // Performance counter value
// at the system under measurement
PerfFreq: TLargeInteger; // Performance counter frequency
// at the system under measurement
PerfTime100nSec: TLargeInteger; // Performance counter time in 100 nsec
// units at the system under measurement
SystemNameLength: DWORD; // Length of the system name
SystemNameOffset: DWORD; // Offset, from beginning of this
// structure, to name of system
// being measured
end ;
// The _PERF_DATA_BLOCK structure is followed by NumObjectTypes of
// data sections, one for each type of object measured. Each object
// type section begins with a _PERF_OBJECT_TYPE structure.
PPERF_OBJECT_TYPE =^PERF_OBJECT_TYPE ;
PERF_OBJECT_TYPE = RECORD // pot
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
ObjectNameTitle: DWORD; // Initially NULL, for use by
// analysis program to point to
// retrieved title string
ObjectHelpTitleIndex: DWORD; // Index to Help in Title Database
ObjectHelpTitle: DWORD; // Initially NULL, for use by
// analysis program to point to
// retrieved title string
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: integer; // Default counter to display when
// this object is selected, index
// starting at 0 (-1 = none, but
// this is not expected to be used)
NumInstances: integer; // 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: TLargeInteger; // Sample Time in "Object" units
PerfFreq: TLargeInteger; // Frequency of "Object" units in
// counts per second.
end ;
// There is one of the following for each of the
// PERF_OBJECT_TYPE.NumCounters. The Unicode names in this structure MUST
// come from a message file.
PPERF_COUNTER_DEFINITION = ^PERF_COUNTER_DEFINITION ;
PERF_COUNTER_DEFINITION = RECORD // pcd
ByteLength: DWORD; // Length in bytes of this structure
CounterNameTitleIndex: DWORD; // Index of Counter name into
// Title Database
CounterNameTitle: DWORD; // Initially NULL, for use by
// analysis program to point to
// retrieved title string
CounterHelpTitleIndex: DWORD; // Index of Counter Help into
// Title Database
CounterHelpTitle: DWORD; // Initially NULL, for use by
// analysis program to point to
// retrieved title string
DefaultScale: integer; // 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; // PERF_COUNTER_BLOCK to the first
// byte of this counter
end ;
// 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.
PPERF_INSTANCE_DEFINITION = ^PERF_INSTANCE_DEFINITION ;
PERF_INSTANCE_DEFINITION = RECORD // pid
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: integer; // 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 ;
// If .ParentObjectName is 0, there
// 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
// is to permit reporting/summation of object instances like threads
// within processes, and logical drives within physical drives.
// The PERF_INSTANCE_DEFINITION will be followed by a PERF_COUNTER_BLOCK.
PPERF_COUNTER_BLOCK= ^PERF_COUNTER_BLOCK ;
PERF_COUNTER_BLOCK = RECORD // pcb
ByteLength: DWORD; // Length in bytes of this structure,
// including the following counters
end ;
// The PERF_COUNTER_BLOCK is followed by PERF_OBJECT_TYPE.NumCounters
// number of counters.
const
PERF_DATA_VERSION = 1 ;
PERF_DATA_REVISION = 1 ;
PERF_NO_INSTANCES = -1 ; // no instances (see NumInstances above)
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//
// 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 orCalculation |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
PERF_SIZE_DWORD = $00000000 ;
PERF_SIZE_LARGE = $00000100 ;
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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -