JwaWinPerf.pas
上传用户:davidchvip
上传日期:2009-07-28
资源大小:1749k
文件大小:39k
源码类别:

Windows编程

开发平台:

Delphi

  1. {******************************************************************************}
  2. {                                                                       }
  3. { Performance Monitoring API interface Unit for Object Pascal                  }
  4. {                                                                       }
  5. { Portions created by Microsoft are Copyright (C) 1995-2001 Microsoft          }
  6. { Corporation. All Rights Reserved.                                            }
  7. {                 }
  8. { The original file is: winperf.h, released June 2000. The original Pascal     }
  9. { code is: WinPerf.pas, released December 2000. The initial developer of the   }
  10. { Pascal code is Marcel van Brakel (brakelm@chello.nl).                        }
  11. {                                                                              }
  12. { Portions created by Marcel van Brakel are Copyright (C) 1999-2001            }
  13. { Marcel van Brakel. All Rights Reserved.                                      }
  14. {                 }
  15. { Obtained through: Joint Endeavour of Delphi Innovators (Project JEDI)        }
  16. {                }
  17. { You may retrieve the latest version of this file at the Project JEDI home    }
  18. { page, located at http://delphi-jedi.org or my personal homepage located at   }
  19. { http://members.chello.nl/m.vanbrakel2                                        }
  20. {                }
  21. { The contents of this file are used with permission, subject to the Mozilla   }
  22. { Public License Version 1.1 (the "License"); you may not use this file except }
  23. { in compliance with the License. You may obtain a copy of the License at      }
  24. { http://www.mozilla.org/MPL/MPL-1.1.html                                      }
  25. {                                                                              }
  26. { Software distributed under the License is distributed on an "AS IS" basis,   }
  27. { WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for }
  28. { the specific language governing rights and limitations under the License.    }
  29. {                                                                              }
  30. { Alternatively, the contents of this file may be used under the terms of the  }
  31. { GNU Lesser General Public License (the  "LGPL License"), in which case the   }
  32. { provisions of the LGPL License are applicable instead of those above.        }
  33. { If you wish to allow use of your version of this file only under the terms   }
  34. { of the LGPL License and not to allow others to use your version of this file }
  35. { under the MPL, indicate your decision by deleting  the provisions above and  }
  36. { replace  them with the notice and other provisions required by the LGPL      }
  37. { License.  If you do not delete the provisions above, a recipient may use     }
  38. { your version of this file under either the MPL or the LGPL License.          }
  39. {                 }
  40. { For more information about the LGPL: http://www.gnu.org/copyleft/lesser.html }
  41. {                 }
  42. {******************************************************************************}
  43. unit JwaWinPerf;
  44. {$WEAKPACKAGEUNIT}
  45. {$HPPEMIT ''}
  46. {$HPPEMIT '#include "WinPerf.h"'}
  47. {$HPPEMIT ''}
  48. {$I WINDEFINES.INC}
  49. interface
  50. uses
  51.   JwaWinBase, JwaWinType;
  52. //  Header file for the Performance Monitor data.
  53. //
  54. //  This file contains the definitions of the data structures returned
  55. //  by the Configuration Registry in response to a request for
  56. //  performance data.  This file is used by both the Configuration
  57. //  Registry and the Performance Monitor to define their interface.
  58. //  The complete interface is described here, except for the name
  59. //  of the node to query in the registry.  It is
  60. //
  61. //                 HKEY_PERFORMANCE_DATA.
  62. //
  63. //  By querying that node with a subkey of "Global" the caller will
  64. //  retrieve the structures described here.
  65. //
  66. //  There is no need to RegOpenKey() the reserved handle HKEY_PERFORMANCE_DATA,
  67. //  but the caller should RegCloseKey() the handle so that network transports
  68. //  and drivers can be removed or installed (which cannot happen while
  69. //  they are open for monitoring.)  Remote requests must first
  70. //  RegConnectRegistry().
  71. //  Data structure definitions.
  72. //  In order for data to be returned through the Configuration Registry
  73. //  in a system-independent fashion, it must be self-describing.
  74. //  In the following, all offsets are in bytes.
  75. //
  76. //  Data is returned through the Configuration Registry in a
  77. //  a data block which begins with a _PERF_DATA_BLOCK structure.
  78. //
  79. const
  80.   PERF_DATA_VERSION  = 1;
  81.   {$EXTERNALSYM PERF_DATA_VERSION}
  82.   PERF_DATA_REVISION = 1;
  83.   {$EXTERNALSYM PERF_DATA_REVISION}
  84. type
  85.   PPERF_DATA_BLOCK = ^PERF_DATA_BLOCK;
  86.   {$EXTERNALSYM PPERF_DATA_BLOCK}
  87.   _PERF_DATA_BLOCK = record
  88.     Signature: array [0..3] of WCHAR;   // Signature: Unicode "PERF"
  89.     LittleEndian: DWORD;                // 0 = Big Endian, 1 = Little Endian
  90.     Version: DWORD;                     // Version of these data structures
  91.                                         // starting at 1
  92.     Revision: DWORD;                    // Revision of these data structures
  93.                                         // starting at 0 for each Version
  94.     TotalByteLength: DWORD;             // Total length of data block
  95.     HeaderLength: DWORD;                // Length of this structure
  96.     NumObjectTypes: DWORD;              // Number of types of objects
  97.                                         // being reported
  98.     DefaultObject: LONG;                // Object Title Index of default
  99.                                         // object to display when data from
  100.                                         // this system is retrieved (-1 =
  101.                                         // none, but this is not expected to
  102.                                         // be used)
  103.     SystemTime: SYSTEMTIME;             // Time at the system under
  104.                                         // measurement
  105.     PerfTime: LARGE_INTEGER;            // Performance counter value
  106.                                         // at the system under measurement
  107.     PerfFreq: LARGE_INTEGER;            // Performance counter frequency
  108.                                         // at the system under measurement
  109.     PerfTime100nSec: LARGE_INTEGER;     // Performance counter time in 100 nsec
  110.                                         // units at the system under measurement
  111.     SystemNameLength: DWORD;            // Length of the system name
  112.     SystemNameOffset: DWORD;            // Offset, from beginning of this
  113.                                         // structure, to name of system
  114.                                         // being measured
  115.   end;
  116.   {$EXTERNALSYM _PERF_DATA_BLOCK}
  117.   PERF_DATA_BLOCK = _PERF_DATA_BLOCK;
  118.   {$EXTERNALSYM PERF_DATA_BLOCK}
  119.   TPerfDataBlock = PERF_DATA_BLOCK;
  120.   PPerfDataBlock = PPERF_DATA_BLOCK;
  121. //
  122. //  The _PERF_DATA_BLOCK structure is followed by NumObjectTypes of
  123. //  data sections, one for each type of object measured.  Each object
  124. //  type section begins with a _PERF_OBJECT_TYPE structure.
  125. //
  126.   PPERF_OBJECT_TYPE = ^PERF_OBJECT_TYPE;
  127.   {$EXTERNALSYM PPERF_OBJECT_TYPE}
  128.   _PERF_OBJECT_TYPE = record
  129.     TotalByteLength: DWORD;             // Length of this object definition
  130.                                         // including this structure, the
  131.                                         // counter definitions, and the
  132.                                         // instance definitions and the
  133.                                         // counter blocks for each instance:
  134.                                         // This is the offset from this
  135.                                         // structure to the next object, if
  136.                                         // any
  137.     DefinitionLength: DWORD;            // Length of object definition,
  138.                                         // which includes this structure
  139.                                         // and the counter definition
  140.                                         // structures for this object: this
  141.                                         // is the offset of the first
  142.                                         // instance or of the counters
  143.                                         // for this object if there is
  144.                                         // no instance
  145.     HeaderLength: DWORD;                // Length of this structure: this
  146.                                         // is the offset to the first
  147.                                         // counter definition for this
  148.                                         // object
  149.     ObjectNameTitleIndex: DWORD;        // Index to name in Title Database
  150.     ObjectNameTitle: LPWSTR;            // Initially NULL, for use by
  151.                                         // analysis program to point to
  152.                                         // retrieved title string
  153.     ObjectHelpTitleIndex: DWORD;        // Index to Help in Title Database
  154.     ObjectHelpTitle: LPWSTR;            // Initially NULL, for use by
  155.                                         // analysis program to point to
  156.                                         // retrieved title string
  157.     DetailLevel: DWORD;                 // Object level of detail (for
  158.                                         // controlling display complexity);
  159.                                         // will be min of detail levels
  160.                                         // for all this object's counters
  161.     NumCounters: DWORD;                 // Number of counters in each
  162.                                         // counter block (one counter
  163.                                         // block per instance)
  164.     DefaultCounter: LONG;               // Default counter to display when
  165.                                         // this object is selected, index
  166.                                         // starting at 0 (-1 = none, but
  167.                                         // this is not expected to be used)
  168.     NumInstances: LONG;                 // Number of object instances
  169.                                         // for which counters are being
  170.                                         // returned from the system under
  171.                                         // measurement. If the object defined
  172.                                         // will never have any instance data
  173.                                         // structures (PERF_INSTANCE_DEFINITION)
  174.                                         // then this value should be -1, if the
  175.                                         // object can have 0 or more instances,
  176.                                         // but has none present, then this
  177.                                         // should be 0, otherwise this field
  178.                                         // contains the number of instances of
  179.                                         // this counter.
  180.     CodePage: DWORD;                    // 0 if instance strings are in
  181.                                         // UNICODE, else the Code Page of
  182.                                         // the instance names
  183.     PerfTime: LARGE_INTEGER;            // Sample Time in "Object" units
  184.     PerfFreq: LARGE_INTEGER;            // Frequency of "Object" units in
  185.                                         // counts per second.
  186.   end;
  187.   {$EXTERNALSYM _PERF_OBJECT_TYPE}
  188.   PERF_OBJECT_TYPE = _PERF_OBJECT_TYPE;
  189.   {$EXTERNALSYM PERF_OBJECT_TYPE}
  190.   TPerfObjectType = PERF_OBJECT_TYPE;
  191.   PPerfObjectType = PPERF_OBJECT_TYPE;
  192. const
  193.   PERF_NO_INSTANCES = -1;               // no instances (see NumInstances above)
  194.   {$EXTERNALSYM PERF_NO_INSTANCES}
  195. //
  196. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  197. //
  198. //  PERF_COUNTER_DEFINITION.CounterType field values
  199. //
  200. //
  201. //        Counter ID Field Definition:
  202. //
  203. //   3      2        2    2    2        1        1    1
  204. //   1      8        4    2    0        6        2    0    8                0
  205. //  +--------+--------+----+----+--------+--------+----+----+----------------+
  206. //  |Display |Calculation  |Time|Counter |        |Ctr |Size|                |
  207. //  |Flags   |Modifiers    |Base|SubType |Reserved|Type|Fld |   Reserved     |
  208. //  +--------+--------+----+----+--------+--------+----+----+----------------+
  209. //
  210. //
  211. //  The counter type is the "or" of the following values as described below
  212. //
  213. //  select one of the following to indicate the counter's data size
  214. //
  215.   PERF_SIZE_DWORD         = $00000000;
  216.   {$EXTERNALSYM PERF_SIZE_DWORD}
  217.   PERF_SIZE_LARGE         = $00000100;
  218.   {$EXTERNALSYM PERF_SIZE_LARGE}
  219.   PERF_SIZE_ZERO          = $00000200;      // for Zero Length Fields
  220.   {$EXTERNALSYM PERF_SIZE_ZERO}
  221.   PERF_SIZE_VARIABLE_LEN  = $00000300;      // length is in CounterLength Fields
  222.                                             //  of Counter Definition struct
  223.   {$EXTERNALSYM PERF_SIZE_VARIABLE_LEN}
  224. //
  225. //  select one of the following values to indicate the counter field usage
  226. //
  227.   PERF_TYPE_NUMBER        = $00000000;      // a number (not a counter)
  228.   {$EXTERNALSYM PERF_TYPE_NUMBER}
  229.   PERF_TYPE_COUNTER       = $00000400;      // an increasing numeric Value
  230.   {$EXTERNALSYM PERF_TYPE_COUNTER}
  231.   PERF_TYPE_TEXT          = $00000800;      // a text Fields
  232.   {$EXTERNALSYM PERF_TYPE_TEXT}
  233.   PERF_TYPE_ZERO          = $00000C00;      // displays a zero
  234.   {$EXTERNALSYM PERF_TYPE_ZERO}
  235. //
  236. //  If the PERF_TYPE_NUMBER field was selected, then select one of the
  237. //  following to describe the Number
  238. //
  239.   PERF_NUMBER_HEX         = $00000000;     // display as HEX Value
  240.   {$EXTERNALSYM PERF_NUMBER_HEX}
  241.   PERF_NUMBER_DECIMAL     = $00010000;     // display as a decimal integer
  242.   {$EXTERNALSYM PERF_NUMBER_DECIMAL}
  243.   PERF_NUMBER_DEC_1000    = $00020000;     // display as a decimal/1000
  244.   {$EXTERNALSYM PERF_NUMBER_DEC_1000}
  245. //
  246. //  If the PERF_TYPE_COUNTER value was selected then select one of the
  247. //  following to indicate the type of counter
  248. //
  249.   PERF_COUNTER_VALUE      = $00000000;     // display counter Value
  250.   {$EXTERNALSYM PERF_COUNTER_VALUE}
  251.   PERF_COUNTER_RATE       = $00010000;     // divide ctr / delta time
  252.   {$EXTERNALSYM PERF_COUNTER_RATE}
  253.   PERF_COUNTER_FRACTION   = $00020000;     // divide ctr / base
  254.   {$EXTERNALSYM PERF_COUNTER_FRACTION}
  255.   PERF_COUNTER_BASE       = $00030000;     // base value used in fractions
  256.   {$EXTERNALSYM PERF_COUNTER_BASE}
  257.   PERF_COUNTER_ELAPSED    = $00040000;     // subtract counter from current time
  258.   {$EXTERNALSYM PERF_COUNTER_ELAPSED}
  259.   PERF_COUNTER_QUEUELEN   = $00050000;     // Use Queuelen processing func.
  260.   {$EXTERNALSYM PERF_COUNTER_QUEUELEN}
  261.   PERF_COUNTER_HISTOGRAM  = $00060000;     // Counter begins or ends a histogram
  262.   {$EXTERNALSYM PERF_COUNTER_HISTOGRAM}
  263.   PERF_COUNTER_PRECISION  = $00070000;     // divide ctr / private clock
  264.   {$EXTERNALSYM PERF_COUNTER_PRECISION}
  265. //
  266. //  If the PERF_TYPE_TEXT value was selected, then select one of the
  267. //  following to indicate the type of TEXT data.
  268. //
  269.   PERF_TEXT_UNICODE       = $00000000;     // type of text in text Fields
  270.   {$EXTERNALSYM PERF_TEXT_UNICODE}
  271.   PERF_TEXT_ASCII         = $00010000;     // ASCII using the CodePage Fields
  272.   {$EXTERNALSYM PERF_TEXT_ASCII}
  273. //
  274. //  Timer SubTypes
  275. //
  276.   PERF_TIMER_TICK         = $00000000;     // use system perf. freq for base
  277.   {$EXTERNALSYM PERF_TIMER_TICK}
  278.   PERF_TIMER_100NS        = $00100000;     // use 100 NS timer time base units
  279.   {$EXTERNALSYM PERF_TIMER_100NS}
  280.   PERF_OBJECT_TIMER       = $00200000;     // use the object timer freq
  281.   {$EXTERNALSYM PERF_OBJECT_TIMER}
  282. //
  283. //  Any types that have calculations performed can use one or more of
  284. //  the following calculation modification flags listed here
  285. //
  286.   PERF_DELTA_COUNTER      = $00400000;     // compute difference First
  287.   {$EXTERNALSYM PERF_DELTA_COUNTER}
  288.   PERF_DELTA_BASE         = $00800000;     // compute base diff as well
  289.   {$EXTERNALSYM PERF_DELTA_BASE}
  290.   PERF_INVERSE_COUNTER    = $01000000;     // show as 1.00-value (assumes:
  291.   {$EXTERNALSYM PERF_INVERSE_COUNTER}
  292.   PERF_MULTI_COUNTER      = $02000000;     // sum of multiple instances
  293.   {$EXTERNALSYM PERF_MULTI_COUNTER}
  294. //
  295. //  Select one of the following values to indicate the display suffix (if any)
  296. //
  297.   PERF_DISPLAY_NO_SUFFIX  = $00000000;     // no suffix
  298.   {$EXTERNALSYM PERF_DISPLAY_NO_SUFFIX}
  299.   PERF_DISPLAY_PER_SEC    = $10000000;     // "/sec"
  300.   {$EXTERNALSYM PERF_DISPLAY_PER_SEC}
  301.   PERF_DISPLAY_PERCENT    = $20000000;     // "%"
  302.   {$EXTERNALSYM PERF_DISPLAY_PERCENT}
  303.   PERF_DISPLAY_SECONDS    = $30000000;     // "secs"
  304.   {$EXTERNALSYM PERF_DISPLAY_SECONDS}
  305.   PERF_DISPLAY_NOSHOW     = $40000000;     // value is not displayed
  306.   {$EXTERNALSYM PERF_DISPLAY_NOSHOW}
  307. //
  308. //  Predefined counter types
  309. //
  310. // 32-bit Counter.  Divide delta by delta time.  Display suffix: "/sec"
  311.   PERF_COUNTER_COUNTER =
  312.             PERF_SIZE_DWORD or PERF_TYPE_COUNTER or PERF_COUNTER_RATE or
  313.             PERF_TIMER_TICK or PERF_DELTA_COUNTER or PERF_DISPLAY_PER_SEC;
  314.   {$EXTERNALSYM PERF_COUNTER_COUNTER}
  315. // 64-bit Timer.  Divide delta by delta time.  Display suffix: "%"
  316.   PERF_COUNTER_TIMER =
  317.             PERF_SIZE_LARGE or PERF_TYPE_COUNTER or PERF_COUNTER_RATE or
  318.             PERF_TIMER_TICK or PERF_DELTA_COUNTER or PERF_DISPLAY_PERCENT;
  319.   {$EXTERNALSYM PERF_COUNTER_TIMER}
  320. // Queue Length Space-Time Product. Divide delta by delta time. No Display Suffix.
  321.   PERF_COUNTER_QUEUELEN_TYPE =
  322.             PERF_SIZE_DWORD or PERF_TYPE_COUNTER or PERF_COUNTER_QUEUELEN or
  323.             PERF_TIMER_TICK or PERF_DELTA_COUNTER or PERF_DISPLAY_NO_SUFFIX;
  324.   {$EXTERNALSYM PERF_COUNTER_QUEUELEN_TYPE}
  325. // Queue Length Space-Time Product. Divide delta by delta time. No Display Suffix.
  326.   PERF_COUNTER_LARGE_QUEUELEN_TYPE =
  327.             PERF_SIZE_LARGE or PERF_TYPE_COUNTER or PERF_COUNTER_QUEUELEN or
  328.             PERF_TIMER_TICK or PERF_DELTA_COUNTER or PERF_DISPLAY_NO_SUFFIX;
  329.   {$EXTERNALSYM PERF_COUNTER_LARGE_QUEUELEN_TYPE}
  330. // Queue Length Space-Time Product using 100 Ns timebase.
  331. // Divide delta by delta time. No Display Suffix.
  332.   PERF_COUNTER_100NS_QUEUELEN_TYPE =
  333.             PERF_SIZE_LARGE or PERF_TYPE_COUNTER or PERF_COUNTER_QUEUELEN or
  334.             PERF_TIMER_100NS or PERF_DELTA_COUNTER or PERF_DISPLAY_NO_SUFFIX;
  335.   {$EXTERNALSYM PERF_COUNTER_100NS_QUEUELEN_TYPE}
  336. // Queue Length Space-Time Product using Object specific timebase.
  337. // Divide delta by delta time. No Display Suffix.
  338.   PERF_COUNTER_OBJ_TIME_QUEUELEN_TYPE =
  339.             PERF_SIZE_LARGE or PERF_TYPE_COUNTER or PERF_COUNTER_QUEUELEN or
  340.             PERF_OBJECT_TIMER or PERF_DELTA_COUNTER or PERF_DISPLAY_NO_SUFFIX;
  341.   {$EXTERNALSYM PERF_COUNTER_OBJ_TIME_QUEUELEN_TYPE}
  342. // 64-bit Counter.  Divide delta by delta time. Display Suffix: "/sec"
  343.   PERF_COUNTER_BULK_COUNT =
  344.             PERF_SIZE_LARGE or PERF_TYPE_COUNTER or PERF_COUNTER_RATE or
  345.             PERF_TIMER_TICK or PERF_DELTA_COUNTER or PERF_DISPLAY_PER_SEC;
  346.   {$EXTERNALSYM PERF_COUNTER_BULK_COUNT}
  347. // Indicates the counter is not a  counter but rather Unicode text Display as text.
  348.   PERF_COUNTER_TEXT =
  349.             PERF_SIZE_VARIABLE_LEN or PERF_TYPE_TEXT or PERF_TEXT_UNICODE or
  350.             PERF_DISPLAY_NO_SUFFIX;
  351.   {$EXTERNALSYM PERF_COUNTER_TEXT}
  352. // Indicates the data is a counter  which should not be
  353. // time averaged on display (such as an error counter on a serial line)
  354. // Display as is.  No Display Suffix.
  355.   PERF_COUNTER_RAWCOUNT =
  356.             PERF_SIZE_DWORD or PERF_TYPE_NUMBER or PERF_NUMBER_DECIMAL or
  357.             PERF_DISPLAY_NO_SUFFIX;
  358.   {$EXTERNALSYM PERF_COUNTER_RAWCOUNT}
  359. // Same as PERF_COUNTER_RAWCOUNT except its size is a large integer
  360.   PERF_COUNTER_LARGE_RAWCOUNT =
  361.             PERF_SIZE_LARGE or PERF_TYPE_NUMBER or PERF_NUMBER_DECIMAL or
  362.             PERF_DISPLAY_NO_SUFFIX;
  363.   {$EXTERNALSYM PERF_COUNTER_LARGE_RAWCOUNT}
  364. // Special case for RAWCOUNT that want to be displayed in hex
  365. // Indicates the data is a counter  which should not be
  366. // time averaged on display (such as an error counter on a serial line)
  367. // Display as is.  No Display Suffix.
  368.   PERF_COUNTER_RAWCOUNT_HEX =
  369.             PERF_SIZE_DWORD or PERF_TYPE_NUMBER or PERF_NUMBER_HEX or
  370.             PERF_DISPLAY_NO_SUFFIX;
  371.   {$EXTERNALSYM PERF_COUNTER_RAWCOUNT_HEX}
  372. // Same as PERF_COUNTER_RAWCOUNT_HEX except its size is a large integer
  373.   PERF_COUNTER_LARGE_RAWCOUNT_HEX =
  374.             PERF_SIZE_LARGE or PERF_TYPE_NUMBER or PERF_NUMBER_HEX or
  375.             PERF_DISPLAY_NO_SUFFIX;
  376.   {$EXTERNALSYM PERF_COUNTER_LARGE_RAWCOUNT_HEX}
  377. // A count which is either 1 or 0 on each sampling interrupt (% busy)
  378. // Divide delta by delta base. Display Suffix: "%"
  379.   PERF_SAMPLE_FRACTION =
  380.             PERF_SIZE_DWORD or PERF_TYPE_COUNTER or PERF_COUNTER_FRACTION or
  381.             PERF_DELTA_COUNTER or PERF_DELTA_BASE or PERF_DISPLAY_PERCENT;
  382.   {$EXTERNALSYM PERF_SAMPLE_FRACTION}
  383. // A count which is sampled on each sampling interrupt (queue length)
  384. // Divide delta by delta time. No Display Suffix.
  385.   PERF_SAMPLE_COUNTER =
  386.             PERF_SIZE_DWORD or PERF_TYPE_COUNTER or PERF_COUNTER_RATE or
  387.             PERF_TIMER_TICK or PERF_DELTA_COUNTER or PERF_DISPLAY_NO_SUFFIX;
  388.   {$EXTERNALSYM PERF_SAMPLE_COUNTER}
  389. // A label: no data is associated with this counter (it has 0 length)
  390. // Do not display.
  391.   PERF_COUNTER_NODATA =
  392.             PERF_SIZE_ZERO or PERF_DISPLAY_NOSHOW;
  393.   {$EXTERNALSYM PERF_COUNTER_NODATA}
  394. // 64-bit Timer inverse (e.g., idle is measured, but display busy %)
  395. // Display 100 - delta divided by delta time.  Display suffix: "%"
  396.   PERF_COUNTER_TIMER_INV =
  397.             PERF_SIZE_LARGE or PERF_TYPE_COUNTER or PERF_COUNTER_RATE or
  398.             PERF_TIMER_TICK or PERF_DELTA_COUNTER or PERF_INVERSE_COUNTER or
  399.             PERF_DISPLAY_PERCENT;
  400.   {$EXTERNALSYM PERF_COUNTER_TIMER_INV}
  401. // The divisor for a sample, used with the previous counter to form a
  402. // sampled %.  You must check for >0 before dividing by this!  This
  403. // counter will directly follow the  numerator counter.  It should not
  404. // be displayed to the user.
  405.   PERF_SAMPLE_BASE =
  406.             PERF_SIZE_DWORD or PERF_TYPE_COUNTER or PERF_COUNTER_BASE or
  407.             PERF_DISPLAY_NOSHOW or
  408.             $00000001;  // for compatibility with pre-beta versions
  409.   {$EXTERNALSYM PERF_SAMPLE_BASE}
  410. // A timer which, when divided by an average base, produces a time
  411. // in seconds which is the average time of some operation.  This
  412. // timer times total operations, and  the base is the number of opera-
  413. // tions.  Display Suffix: "sec"
  414.   PERF_AVERAGE_TIMER =
  415.             PERF_SIZE_DWORD or PERF_TYPE_COUNTER or PERF_COUNTER_FRACTION or
  416.             PERF_DISPLAY_SECONDS;
  417.   {$EXTERNALSYM PERF_AVERAGE_TIMER}
  418. // Used as the denominator in the computation of time or count
  419. // averages.  Must directly follow the numerator counter.  Not dis-
  420. // played to the user.
  421.   PERF_AVERAGE_BASE =
  422.             PERF_SIZE_DWORD or PERF_TYPE_COUNTER or PERF_COUNTER_BASE or
  423.             PERF_DISPLAY_NOSHOW or
  424.             $00000002;  // for compatibility with pre-beta versions
  425.   {$EXTERNALSYM PERF_AVERAGE_BASE}
  426. // A bulk count which, when divided (typically) by the number of
  427. // operations, gives (typically) the number of bytes per operation.
  428. // No Display Suffix.
  429.   PERF_AVERAGE_BULK =
  430.             PERF_SIZE_LARGE or PERF_TYPE_COUNTER or PERF_COUNTER_FRACTION  or
  431.             PERF_DISPLAY_NOSHOW;
  432.   {$EXTERNALSYM PERF_AVERAGE_BULK}
  433. // 64-bit Timer in object specific units. Display delta divided by
  434. // delta time as returned in the object type header structure.  Display suffix: "%"
  435.   PERF_OBJ_TIME_TIMER =
  436.             PERF_SIZE_LARGE or PERF_TYPE_COUNTER or PERF_COUNTER_RATE or
  437.             PERF_OBJECT_TIMER or PERF_DELTA_COUNTER or PERF_DISPLAY_PERCENT;
  438.   {$EXTERNALSYM PERF_OBJ_TIME_TIMER}
  439. // 64-bit Timer in 100 nsec units. Display delta divided by
  440. // delta time.  Display suffix: "%"
  441.   PERF_100NSEC_TIMER =
  442.             PERF_SIZE_LARGE or PERF_TYPE_COUNTER or PERF_COUNTER_RATE or
  443.             PERF_TIMER_100NS or PERF_DELTA_COUNTER or PERF_DISPLAY_PERCENT;
  444.   {$EXTERNALSYM PERF_100NSEC_TIMER}
  445. // 64-bit Timer inverse (e.g., idle is measured, but display busy %)
  446. // Display 100 - delta divided by delta time.  Display suffix: "%"
  447.   PERF_100NSEC_TIMER_INV =
  448.             PERF_SIZE_LARGE or PERF_TYPE_COUNTER or PERF_COUNTER_RATE or
  449.             PERF_TIMER_100NS or PERF_DELTA_COUNTER or PERF_INVERSE_COUNTER  or
  450.             PERF_DISPLAY_PERCENT;
  451.   {$EXTERNALSYM PERF_100NSEC_TIMER_INV}
  452. // 64-bit Timer.  Divide delta by delta time.  Display suffix: "%"
  453. // Timer for multiple instances, so result can exceed 100%.
  454.   PERF_COUNTER_MULTI_TIMER =
  455.             PERF_SIZE_LARGE or PERF_TYPE_COUNTER or PERF_COUNTER_RATE or
  456.             PERF_DELTA_COUNTER or PERF_TIMER_TICK or PERF_MULTI_COUNTER or
  457.             PERF_DISPLAY_PERCENT;
  458.   {$EXTERNALSYM PERF_COUNTER_MULTI_TIMER}
  459. // 64-bit Timer inverse (e.g., idle is measured, but display busy %)
  460. // Display 100 * _MULTI_BASE - delta divided by delta time.
  461. // Display suffix: "%" Timer for multiple instances, so result
  462. // can exceed 100%.  Followed by a counter of type _MULTI_BASE.
  463.   PERF_COUNTER_MULTI_TIMER_INV =
  464.             PERF_SIZE_LARGE or PERF_TYPE_COUNTER or PERF_COUNTER_RATE or
  465.             PERF_DELTA_COUNTER or PERF_MULTI_COUNTER or PERF_TIMER_TICK or
  466.             PERF_INVERSE_COUNTER or PERF_DISPLAY_PERCENT;
  467.   {$EXTERNALSYM PERF_COUNTER_MULTI_TIMER_INV}
  468. // Number of instances to which the preceding _MULTI_..._INV counter
  469. // applies.  Used as a factor to get the percentage.
  470.   PERF_COUNTER_MULTI_BASE =
  471.             PERF_SIZE_LARGE or PERF_TYPE_COUNTER or PERF_COUNTER_BASE or
  472.             PERF_MULTI_COUNTER or PERF_DISPLAY_NOSHOW;
  473.   {$EXTERNALSYM PERF_COUNTER_MULTI_BASE}
  474. // 64-bit Timer in 100 nsec units. Display delta divided by delta time.
  475. // Display suffix: "%" Timer for multiple instances, so result can exceed 100%.
  476.   PERF_100NSEC_MULTI_TIMER =
  477.             PERF_SIZE_LARGE or PERF_TYPE_COUNTER or PERF_DELTA_COUNTER or
  478.             PERF_COUNTER_RATE or PERF_TIMER_100NS or PERF_MULTI_COUNTER or
  479.             PERF_DISPLAY_PERCENT;
  480.   {$EXTERNALSYM PERF_100NSEC_MULTI_TIMER}
  481. // 64-bit Timer inverse (e.g., idle is measured, but display busy %)
  482. // Display 100 * _MULTI_BASE - delta divided by delta time.
  483. // Display suffix: "%" Timer for multiple instances, so result
  484. // can exceed 100%.  Followed by a counter of type _MULTI_BASE.
  485.   PERF_100NSEC_MULTI_TIMER_INV =
  486.             PERF_SIZE_LARGE or PERF_TYPE_COUNTER or PERF_DELTA_COUNTER or
  487.             PERF_COUNTER_RATE or PERF_TIMER_100NS or PERF_MULTI_COUNTER or
  488.             PERF_INVERSE_COUNTER or PERF_DISPLAY_PERCENT;
  489.   {$EXTERNALSYM PERF_100NSEC_MULTI_TIMER_INV}
  490. // Indicates the data is a fraction of the following counter  which
  491. // should not be time averaged on display (such as free space over
  492. // total space.) Display as is.  Display the quotient as "%".
  493.   PERF_RAW_FRACTION =
  494.             PERF_SIZE_DWORD or PERF_TYPE_COUNTER or PERF_COUNTER_FRACTION or
  495.             PERF_DISPLAY_PERCENT;
  496.   {$EXTERNALSYM PERF_RAW_FRACTION}
  497.   PERF_LARGE_RAW_FRACTION =
  498.             PERF_SIZE_LARGE or PERF_TYPE_COUNTER or PERF_COUNTER_FRACTION or
  499.             PERF_DISPLAY_PERCENT;
  500.   {$EXTERNALSYM PERF_LARGE_RAW_FRACTION}
  501. // Indicates the data is a base for the preceding counter which should
  502. // not be time averaged on display (such as free space over total space.)
  503.   PERF_RAW_BASE =
  504.             PERF_SIZE_DWORD or PERF_TYPE_COUNTER or PERF_COUNTER_BASE or
  505.             PERF_DISPLAY_NOSHOW or
  506.             $00000003;  // for compatibility with pre-beta versions
  507.   {$EXTERNALSYM PERF_RAW_BASE}
  508.   PERF_LARGE_RAW_BASE =
  509.             PERF_SIZE_LARGE or PERF_TYPE_COUNTER or PERF_COUNTER_BASE or
  510.             PERF_DISPLAY_NOSHOW;
  511.   {$EXTERNALSYM PERF_LARGE_RAW_BASE}
  512. // The data collected in this counter is actually the start time of the
  513. // item being measured. For display, this data is subtracted from the
  514. // sample time to yield the elapsed time as the difference between the two.
  515. // In the definition below, the PerfTime field of the Object contains
  516. // the sample time as indicated by the PERF_OBJECT_TIMER bit and the
  517. // difference is scaled by the PerfFreq of the Object to convert the time
  518. // units into seconds.
  519.   PERF_ELAPSED_TIME =
  520.             PERF_SIZE_LARGE or PERF_TYPE_COUNTER or PERF_COUNTER_ELAPSED or
  521.             PERF_OBJECT_TIMER or PERF_DISPLAY_SECONDS;
  522.   {$EXTERNALSYM PERF_ELAPSED_TIME}
  523. //
  524. //  The following counter type can be used with the preceding types to
  525. //  define a range of values to be displayed in a histogram.
  526. //
  527.   PERF_COUNTER_HISTOGRAM_TYPE = $80000000; // Counter begins or ends a histogram
  528.   {$EXTERNALSYM PERF_COUNTER_HISTOGRAM_TYPE}
  529. //
  530. //  This counter is used to display the difference from one sample
  531. //  to the next. The counter value is a constantly increasing number
  532. //  and the value displayed is the difference between the current
  533. //  value and the previous value. Negative numbers are not allowed
  534. //  which shouldn't be a problem as long as the counter value is
  535. //  increasing or unchanged.
  536. //
  537.   PERF_COUNTER_DELTA =
  538.             PERF_SIZE_DWORD or PERF_TYPE_COUNTER or PERF_COUNTER_VALUE or
  539.             PERF_DELTA_COUNTER or PERF_DISPLAY_NO_SUFFIX;
  540.   {$EXTERNALSYM PERF_COUNTER_DELTA}
  541.   PERF_COUNTER_LARGE_DELTA =
  542.             PERF_SIZE_LARGE or PERF_TYPE_COUNTER or PERF_COUNTER_VALUE or
  543.             PERF_DELTA_COUNTER or PERF_DISPLAY_NO_SUFFIX;
  544.   {$EXTERNALSYM PERF_COUNTER_LARGE_DELTA}
  545. //
  546. //  The precision counters are timers that consist of two counter values:
  547. //      1) the count of elapsed time of the event being monitored
  548. //      2) the "clock" time in the same units
  549. //
  550. //  the precition timers are used where the standard system timers are not
  551. //  precise enough for accurate readings. It's assumed that the service
  552. //  providing the data is also providing a timestamp at the same time which
  553. //  will eliminate any error that may occur since some small and variable
  554. //  time elapses between the time the system timestamp is captured and when
  555. //  the data is collected from the performance DLL. Only in extreme cases
  556. //  has this been observed to be problematic.
  557. //
  558. //  when using this type of timer, the definition of the
  559. //      PERF_PRECISION_TIMESTAMP counter must immediately follow the
  560. //      definition of the PERF_PRECISION_*_TIMER in the Object header
  561. //
  562. // The timer used has the same frequency as the System Performance Timer
  563.   PERF_PRECISION_SYSTEM_TIMER =
  564.         PERF_SIZE_LARGE or PERF_TYPE_COUNTER or PERF_COUNTER_PRECISION or
  565.         PERF_TIMER_TICK or PERF_DELTA_COUNTER or PERF_DISPLAY_PERCENT;
  566.   {$EXTERNALSYM PERF_PRECISION_SYSTEM_TIMER}
  567. //
  568. // The timer used has the same frequency as the 100 NanoSecond Timer
  569.   PERF_PRECISION_100NS_TIMER =
  570.         PERF_SIZE_LARGE or PERF_TYPE_COUNTER or PERF_COUNTER_PRECISION or
  571.         PERF_TIMER_100NS or PERF_DELTA_COUNTER or PERF_DISPLAY_PERCENT;
  572.   {$EXTERNALSYM PERF_PRECISION_100NS_TIMER}
  573. //
  574. // The timer used is of the frequency specified in the Object header's
  575. //  PerfFreq field (PerfTime is ignored)
  576.   PERF_PRECISION_OBJECT_TIMER =
  577.         PERF_SIZE_LARGE or PERF_TYPE_COUNTER or PERF_COUNTER_PRECISION or
  578.         PERF_OBJECT_TIMER or PERF_DELTA_COUNTER or PERF_DISPLAY_PERCENT;
  579.   {$EXTERNALSYM PERF_PRECISION_OBJECT_TIMER}
  580. //
  581. // This is the timestamp to use in the computation of the timer specified
  582. // in the previous description block
  583.   PERF_PRECISION_TIMESTAMP = PERF_LARGE_RAW_BASE;
  584.   {$EXTERNALSYM PERF_PRECISION_TIMESTAMP}
  585. //
  586. //  The following are used to determine the level of detail associated
  587. //  with the counter.  The user will be setting the level of detail
  588. //  that should be displayed at any given time.
  589. //
  590. //
  591.   PERF_DETAIL_NOVICE         = 100; // The uninformed can understand it
  592.   {$EXTERNALSYM PERF_DETAIL_NOVICE}
  593.   PERF_DETAIL_ADVANCED       = 200; // For the advanced user
  594.   {$EXTERNALSYM PERF_DETAIL_ADVANCED}
  595.   PERF_DETAIL_EXPERT         = 300; // For the expert user
  596.   {$EXTERNALSYM PERF_DETAIL_EXPERT}
  597.   PERF_DETAIL_WIZARD         = 400; // For the system designer
  598.   {$EXTERNALSYM PERF_DETAIL_WIZARD}
  599. //
  600. //
  601. //  There is one of the following for each of the
  602. //  PERF_OBJECT_TYPE.NumCounters.  The Unicode names in this structure MUST
  603. //  come from a message file.
  604. //
  605. //
  606. type
  607.   PPERF_COUNTER_DEFINITION = ^PERF_COUNTER_DEFINITION;
  608.   {$EXTERNALSYM PPERF_COUNTER_DEFINITION}
  609.   _PERF_COUNTER_DEFINITION = record
  610.     ByteLength: DWORD;                  // Length in bytes of this structure
  611.     CounterNameTitleIndex: DWORD;       // Index of Counter name into
  612.                                         // Title Database
  613.     CounterNameTitle: LPWSTR;           // Initially NULL, for use by
  614.                                         // analysis program to point to
  615.                                         // retrieved title string
  616.     CounterHelpTitleIndex: DWORD;       // Index of Counter Help into
  617.                                         // Title Database
  618.     CounterHelpTitle: LPWSTR;           // Initially NULL, for use by
  619.                                         // analysis program to point to
  620.                                         // retrieved title string
  621.     DefaultScale: LONG;                 // Power of 10 by which to scale
  622.                                         // chart line if vertical axis is 100
  623.                                         // 0 ==> 1, 1 ==> 10, -1 ==>1/10, etc.
  624.     DetailLevel: DWORD;                 // Counter level of detail (for
  625.                                         // controlling display complexity)
  626.     CounterType: DWORD;                 // Type of counter
  627.     CounterSize: DWORD;                 // Size of counter in bytes
  628.     CounterOffset: DWORD;               // Offset from the start of the
  629.                                         // PERF_COUNTER_BLOCK to the first
  630.                                         // byte of this counter
  631.   end;
  632.   {$EXTERNALSYM _PERF_COUNTER_DEFINITION}
  633.   PERF_COUNTER_DEFINITION = _PERF_COUNTER_DEFINITION;
  634.   {$EXTERNALSYM PERF_COUNTER_DEFINITION}
  635.   TPerfCounterDefinition = PERF_COUNTER_DEFINITION;
  636.   PPerfCounterDefinition = PPERF_COUNTER_DEFINITION;
  637. //
  638. //
  639. //  If (PERF_DATA_BLOCK.NumInstances >= 0) then there will be
  640. //  PERF_DATA_BLOCK.NumInstances of a (PERF_INSTANCE_DEFINITION
  641. //  followed by a PERF_COUNTER_BLOCK followed by the counter data fields)
  642. //  for each instance.
  643. //
  644. //  If (PERF_DATA_BLOCK.NumInstances < 0) then the counter definition
  645. //  strucutre above will be followed by only a PERF_COUNTER_BLOCK and the
  646. //  counter data for that COUNTER.
  647. //
  648. const
  649.   PERF_NO_UNIQUE_ID = -1;
  650.   {$EXTERNALSYM PERF_NO_UNIQUE_ID}
  651. type
  652.   PPERF_INSTANCE_DEFINITION = ^PERF_INSTANCE_DEFINITION;
  653.   {$EXTERNALSYM PPERF_INSTANCE_DEFINITION}
  654.   _PERF_INSTANCE_DEFINITION = record
  655.     ByteLength: DWORD;                  // Length in bytes of this structure,
  656.                                         // including the subsequent name
  657.     ParentObjectTitleIndex: DWORD;      // Title Index to name of "parent"
  658.                                         // object (e.g., if thread, then
  659.                                         // process is parent object type);
  660.                                         // if logical drive, the physical
  661.                                         // drive is parent object type
  662.     ParentObjectInstance: DWORD;        // Index to instance of parent object
  663.                                         // type which is the parent of this
  664.                                         // instance.
  665.     UniqueID: LONG;                     // A unique ID used instead of
  666.                                         // matching the name to identify
  667.                                         // this instance, -1 = none
  668.     NameOffset: DWORD;                  // Offset from beginning of
  669.                                         // this struct to the Unicode name
  670.                                         // of this instance
  671.     NameLength: DWORD;                  // Length in bytes of name; 0 = none
  672.                                         // this length includes the characters
  673.                                         // in the string plus the size of the
  674.                                         // terminating NULL char. It does not
  675.                                         // include any additional pad bytes to
  676.                                         // correct structure alignment
  677.   end;
  678.   {$EXTERNALSYM _PERF_INSTANCE_DEFINITION}
  679.   PERF_INSTANCE_DEFINITION = _PERF_INSTANCE_DEFINITION;
  680.   {$EXTERNALSYM PERF_INSTANCE_DEFINITION}
  681.   TPerfInstanceDefinition = PERF_INSTANCE_DEFINITION;
  682.   PPerfInstanceDefinition = PPERF_INSTANCE_DEFINITION;
  683. //
  684. //  If .ParentObjectName is 0, there
  685. //  is no parent-child hierarchy for this object type.  Otherwise,
  686. //   the .ParentObjectInstance is an index, starting at 0, into the
  687. //  instances reported for the parent object type.  It is only
  688. //  meaningful if .ParentObjectName is not 0.  The purpose of all this
  689. //  is to permit reporting/summation of object instances like threads
  690. //  within processes, and logical drives within physical drives.
  691. //
  692. //
  693. //  The PERF_INSTANCE_DEFINITION will be followed by a PERF_COUNTER_BLOCK.
  694. //
  695.   PPERF_COUNTER_BLOCK = ^PERF_COUNTER_BLOCK;
  696.   {$EXTERNALSYM PPERF_COUNTER_BLOCK}
  697.   _PERF_COUNTER_BLOCK = record
  698.     ByteLength: DWORD;                  // Length in bytes of this structure,
  699.                                         // including the following counters
  700.   end;
  701.   {$EXTERNALSYM _PERF_COUNTER_BLOCK}
  702.   PERF_COUNTER_BLOCK = _PERF_COUNTER_BLOCK;
  703.   {$EXTERNALSYM PERF_COUNTER_BLOCK}
  704.   TPerfCounterBlock = PERF_COUNTER_BLOCK;
  705.   PPerfCounterBlock = PPERF_COUNTER_BLOCK;
  706. //
  707. //  The PERF_COUNTER_BLOCK is followed by PERF_OBJECT_TYPE.NumCounters
  708. //  number of counters.
  709. //
  710. //
  711. // Support for New Extensible API starting with NT 5.0
  712. //
  713. const
  714.   PERF_QUERY_OBJECTS = DWORD($80000000);
  715.   {$EXTERNALSYM PERF_QUERY_OBJECTS}
  716.   PERF_QUERY_GLOBAL  = DWORD($80000001);
  717.   {$EXTERNALSYM PERF_QUERY_GLOBAL}
  718.   PERF_QUERY_COSTLY  = DWORD($80000002);
  719.   {$EXTERNALSYM PERF_QUERY_COSTLY}
  720. //
  721. //  function typedefs for extensible counter function prototypes
  722. //
  723. type
  724.   PM_OPEN_PROC = function (Arg1: LPWSTR): DWORD; stdcall;
  725.   {$EXTERNALSYM PM_OPEN_PROC}
  726.   PM_COLLECT_PROC = function (Arg1: LPWSTR; Arg2: Pointer; Arg3, Arg4: LPDWORD): DWORD; stdcall;
  727.   {$EXTERNALSYM PM_COLLECT_PROC}
  728.   PM_CLOSE_PROC = function: DWORD; stdcall;
  729.   {$EXTERNALSYM PM_CLOSE_PROC}
  730.   PM_QUERY_PROC = function (Arg1: LPDWORD; Arg2: Pointer; Arg3, Arg4: LPDWORD): DWORD; stdcall;
  731.   {$EXTERNALSYM PM_QUERY_PROC}
  732. const
  733.   MAX_PERF_OBJECTS_IN_QUERY_FUNCTION = LONG(64);
  734.   {$EXTERNALSYM MAX_PERF_OBJECTS_IN_QUERY_FUNCTION}
  735. //
  736. // The following are the possible values for
  737. // HKLMSOFTWAREMicrosoftWindows NTCurrentVersionPerflibEventLogLevel
  738. // The default is WINPERF_LOG_NONE if the registry value is not defined.
  739. // This should be adopted by all perfdlls to avoid flooding the application
  740. // event log.
  741. //
  742. const
  743.   WINPERF_LOG_NONE      = 0;          // No event reported
  744.   {$EXTERNALSYM WINPERF_LOG_NONE}
  745.   WINPERF_LOG_USER      = 1;          // Report only errors
  746.   {$EXTERNALSYM WINPERF_LOG_USER}
  747.   WINPERF_LOG_DEBUG     = 2;          // Report debug errors as well
  748.   {$EXTERNALSYM WINPERF_LOG_DEBUG}
  749.   WINPERF_LOG_VERBOSE   = 3;          // Report everything
  750.   {$EXTERNALSYM WINPERF_LOG_VERBOSE}
  751. implementation
  752. end.