|
|
1.1.1.3 root 1: /*++
2:
3: Copyright (c) 1993 Microsoft Corporation
4:
5: Module Name:
6:
7: winperf.h
1.1 root 8:
1.1.1.3 root 9: Abstract:
10:
11: Header file for the Performance Monitor data.
12:
13: This file contains the definitions of the data structures returned
14: by the Configuration Registry in response to a request for
15: performance data. This file is used by both the Configuration
16: Registry and the Performance Monitor to define their interface.
17: The complete interface is described here, except for the name
18: of the node to query in the registry. It is
19:
20: HKEY_PERFORMANCE_DATA.
21:
22: By querying that node with a subkey of "Global" the caller will
23: retrieve the structures described here.
24:
25: There is no need to RegOpenKey() the reserved handle HKEY_PERFORMANCE_DATA,
26: but the caller should RegCloseKey() the handle so that network transports
27: and drivers can be removed or installed (which cannot happen while
28: they are open for monitoring.) Remote requests must first
29: RegConnectRegistry().
30:
31: --*/
32:
33: #ifndef _WINPERF_
34: #define _WINPERF_
1.1 root 35:
36: // Data structure definitions.
37:
38: // In order for data to be returned through the Configuration Registry
39: // in a system-independent fashion, it must be self-describing.
40:
41: // In the following, all offsets are in bytes.
42:
43: //
44: // Data is returned through the Configuration Registry in a
45: // a data block which begins with a _PERF_DATA_BLOCK structure.
46: //
47:
48: #define PERF_DATA_VERSION 1
1.1.1.3 root 49: #define PERF_DATA_REVISION 1
1.1 root 50:
51:
52: typedef struct _PERF_DATA_BLOCK {
53: WCHAR Signature[4]; // Signature: Unicode "PERF"
54: DWORD LittleEndian; // 0 = Big Endian, 1 = Little Endian
55: DWORD Version; // Version of these data structures
56: // starting at 1
57: DWORD Revision; // Revision of these data structures
58: // starting at 0 for each Version
1.1.1.3 root 59: DWORD TotalByteLength; // Total length of data block
60: DWORD HeaderLength; // Length of this structure
61: DWORD NumObjectTypes; // Number of types of objects
62: // being reported
63: LONG DefaultObject; // Object Title Index of default
64: // object to display when data from
65: // this system is retrieved (-1 =
66: // none, but this is not expected to
67: // be used)
68: SYSTEMTIME SystemTime; // Time at the system under
69: // measurement
70: LARGE_INTEGER PerfTime; // Performance counter value
71: // at the system under measurement
72: LARGE_INTEGER PerfFreq; // Performance counter frequency
73: // at the system under measurement
1.1 root 74: LARGE_INTEGER PerfTime100nSec; // Performance counter time in 100 nsec
75: // units at the system under measurement
1.1.1.3 root 76: DWORD SystemNameLength; // Length of the system name
77: DWORD SystemNameOffset; // Offset, from beginning of this
78: // structure, to name of system
79: // being measured
1.1 root 80: } PERF_DATA_BLOCK, *PPERF_DATA_BLOCK;
81:
82:
83: //
84: // The _PERF_DATA_BLOCK structure is followed by NumObjectTypes of
85: // data sections, one for each type of object measured. Each object
86: // type section begins with a _PERF_OBJECT_TYPE structure.
87: //
88:
89:
90: typedef struct _PERF_OBJECT_TYPE {
1.1.1.3 root 91: DWORD TotalByteLength; // Length of this object definition
92: // including this structure, the
93: // counter definitions, and the
94: // instance definitions and the
95: // counter blocks for each instance:
96: // This is the offset from this
97: // structure to the next object, if
98: // any
99: DWORD DefinitionLength; // Length of object definition,
100: // which includes this structure
101: // and the counter definition
102: // structures for this object: this
103: // is the offset of the first
104: // instance or of the counters
105: // for this object if there is
106: // no instance
107: DWORD HeaderLength; // Length of this structure: this
108: // is the offset to the first
109: // counter definition for this
110: // object
111: DWORD ObjectNameTitleIndex;
1.1 root 112: // Index to name in Title Database
113: LPWSTR ObjectNameTitle; // Initially NULL, for use by
114: // analysis program to point to
115: // retrieved title string
1.1.1.3 root 116: DWORD ObjectHelpTitleIndex;
117: // Index to Help in Title Database
1.1 root 118: LPWSTR ObjectHelpTitle; // Initially NULL, for use by
119: // analysis program to point to
120: // retrieved title string
1.1.1.3 root 121: DWORD DetailLevel; // Object level of detail (for
122: // controlling display complexity);
123: // will be min of detail levels
124: // for all this object's counters
125: DWORD NumCounters; // Number of counters in each
126: // counter block (one counter
127: // block per instance)
128: LONG DefaultCounter; // Default counter to display when
129: // this object is selected, index
130: // starting at 0 (-1 = none, but
131: // this is not expected to be used)
132: LONG NumInstances; // Number of object instances
133: // for which counters are being
134: // returned from the system under
135: // measurement. If the object defined
136: // will never have any instance data
137: // structures (PERF_INSTANCE_DEFINITION)
138: // then this value should be -1, if the
139: // object can have 0 or more instances,
140: // but has none present, then this
141: // should be 0, otherwise this field
142: // contains the number of instances of
143: // this counter.
144: DWORD CodePage; // 0 if instance strings are in
145: // UNICODE, else the Code Page of
146: // the instance names
147: LARGE_INTEGER PerfTime; // Sample Time in "Object" units
148: //
149: LARGE_INTEGER PerfFreq; // Frequency of "Object" units in
150: // counts per second.
1.1 root 151: } PERF_OBJECT_TYPE, *PPERF_OBJECT_TYPE;
152:
1.1.1.3 root 153: #define PERF_NO_INSTANCES -1 // no instances (see NumInstances above)
1.1 root 154: //
1.1.1.3 root 155: // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1.1 root 156: //
1.1.1.3 root 157: // PERF_COUNTER_DEFINITION.CounterType field values
158: //
159: //
160: // Counter ID Field Definition:
161: //
162: // 3 2 2 2 2 1 1 1
163: // 1 8 4 2 0 6 2 0 8 0
164: // +--------+--------+----+----+--------+--------+----+----+----------------+
165: // |Display |Calculation |Time|Counter | |Ctr |Size| |
166: // |Flags |Modifiers |Base|SubType |Reserved|Type|Fld | Reserved |
167: // +--------+--------+----+----+--------+--------+----+----+----------------+
168: //
169: //
170: // The counter type is the "or" of the following values as described below
171: //
172: // select one of the following to indicate the counter's data size
173: //
174: #define PERF_SIZE_DWORD 0x00000000
175: #define PERF_SIZE_LARGE 0x00000100
176: #define PERF_SIZE_ZERO 0x00000200 // for Zero Length fields
177: #define PERF_SIZE_VARIABLE_LEN 0x00000300 // length is in CounterLength field
178: // of Counter Definition struct
179: //
180: // select one of the following values to indicate the counter field usage
181: //
182: #define PERF_TYPE_NUMBER 0x00000000 // a number (not a counter)
183: #define PERF_TYPE_COUNTER 0x00000400 // an increasing numeric value
184: #define PERF_TYPE_TEXT 0x00000800 // a text field
185: #define PERF_TYPE_ZERO 0x00000C00 // displays a zero
186: //
187: // If the PERF_TYPE_NUMBER field was selected, then select one of the
188: // following to describe the Number
189: //
190: #define PERF_NUMBER_HEX 0x00000000 // display as HEX value
191: #define PERF_NUMBER_DECIMAL 0x00010000 // display as a decimal integer
192: #define PERF_NUMBER_DEC_1000 0x00020000 // display as a decimal/1000
193: //
194: // If the PERF_TYPE_COUNTER value was selected then select one of the
195: // following to indicate the type of counter
196: //
197: #define PERF_COUNTER_VALUE 0x00000000 // display counter value
198: #define PERF_COUNTER_RATE 0x00010000 // divide ctr / delta time
199: #define PERF_COUNTER_FRACTION 0x00020000 // divide ctr / base
200: #define PERF_COUNTER_BASE 0x00030000 // base value used in fractions
201: #define PERF_COUNTER_ELAPSED 0x00040000 // subtract counter from current time
202: #define PERF_COUNTER_QUEUELEN 0x00050000 // Use Queuelen processing func.
203: #define PERF_COUNTER_HISTOGRAM 0x00060000 // Counter begins or ends a histogram
204: //
205: // If the PERF_TYPE_TEXT value was selected, then select one of the
206: // following to indicate the type of TEXT data.
207: //
208: #define PERF_TEXT_UNICODE 0x00000000 // type of text in text field
209: #define PERF_TEXT_ASCII 0x00010000 // ASCII using the CodePage field
210: //
211: // Timer SubTypes
212: //
213: #define PERF_TIMER_TICK 0x00000000 // use system perf. freq for base
214: #define PERF_TIMER_100NS 0x00100000 // use 100 NS timer time base units
215: #define PERF_OBJECT_TIMER 0x00200000 // use the object timer freq
216: //
217: // Any types that have calculations performed can use one or more of
218: // the following calculation modification flags listed here
219: //
220: #define PERF_DELTA_COUNTER 0x00400000 // compute difference first
221: #define PERF_DELTA_BASE 0x00800000 // compute base diff as well
222: #define PERF_INVERSE_COUNTER 0x01000000 // show as 1.00-value (assumes:
223: #define PERF_MULTI_COUNTER 0x02000000 // sum of multiple instances
224: //
225: // Select one of the following values to indicate the display suffix (if any)
226: //
227: #define PERF_DISPLAY_NO_SUFFIX 0x00000000 // no suffix
228: #define PERF_DISPLAY_PER_SEC 0x10000000 // "/sec"
229: #define PERF_DISPLAY_PERCENT 0x20000000 // "%"
230: #define PERF_DISPLAY_SECONDS 0x30000000 // "secs"
231: #define PERF_DISPLAY_NOSHOW 0x40000000 // value is not displayed
232: //
233: // Predefined counter types
234: //
235:
236: // 32-bit Counter. Divide delta by delta time. Display suffix: "/sec"
237: #define PERF_COUNTER_COUNTER \
238: (PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_RATE |\
239: PERF_TIMER_TICK | PERF_DELTA_COUNTER | PERF_DISPLAY_PER_SEC)
240:
241:
242: // 64-bit Timer. Divide delta by delta time. Display suffix: "%"
243: #define PERF_COUNTER_TIMER \
244: (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_RATE |\
245: PERF_TIMER_TICK | PERF_DELTA_COUNTER | PERF_DISPLAY_PERCENT)
246:
247: // Queue Length Space-Time Product. Divide delta by delta time. No Display Suffix.
248: #define PERF_COUNTER_QUEUELEN_TYPE \
249: (PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_QUEUELEN |\
250: PERF_TIMER_TICK | PERF_DELTA_COUNTER | PERF_DISPLAY_NO_SUFFIX)
251:
252: // 64-bit Counter. Divide delta by delta time. Display Suffix: "/sec"
253: #define PERF_COUNTER_BULK_COUNT \
254: (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_RATE |\
255: PERF_TIMER_TICK | PERF_DELTA_COUNTER | PERF_DISPLAY_PER_SEC)
256:
257: // Indicates the counter is not a counter but rather Unicode text Display as text.
258: #define PERF_COUNTER_TEXT \
259: (PERF_SIZE_VARIABLE_LEN | PERF_TYPE_TEXT | PERF_TEXT_UNICODE |\
260: PERF_DISPLAY_NO_SUFFIX)
261:
262: // Indicates the data is a counter which should not be
263: // time averaged on display (such as an error counter on a serial line)
264: // Display as is. No Display Suffix.
265: #define PERF_COUNTER_RAWCOUNT \
266: (PERF_SIZE_DWORD | PERF_TYPE_NUMBER | PERF_NUMBER_DECIMAL |\
267: PERF_DISPLAY_NO_SUFFIX)
268:
269: // A count which is either 1 or 0 on each sampling interrupt (% busy)
270: // Divide delta by delta base. Display Suffix: "%"
271: #define PERF_SAMPLE_FRACTION \
272: (PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_FRACTION |\
273: PERF_DELTA_COUNTER | PERF_DELTA_BASE | PERF_DISPLAY_PERCENT)
274:
275: // A count which is sampled on each sampling interrupt (queue length)
276: // Divide delta by delta time. No Display Suffix.
277: #define PERF_SAMPLE_COUNTER \
278: (PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_RATE |\
279: PERF_TIMER_TICK | PERF_DELTA_COUNTER | PERF_DISPLAY_NO_SUFFIX)
280:
281: // A label: no data is associated with this counter (it has 0 length)
282: // Do not display.
283: #define PERF_COUNTER_NODATA \
284: (PERF_SIZE_ZERO | PERF_DISPLAY_NOSHOW)
285:
286: // 64-bit Timer inverse (e.g., idle is measured, but display busy %)
287: // Display 100 - delta divided by delta time. Display suffix: "%"
288: #define PERF_COUNTER_TIMER_INV \
289: (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_RATE |\
290: PERF_TIMER_TICK | PERF_DELTA_COUNTER | PERF_INVERSE_COUNTER | \
291: PERF_DISPLAY_PERCENT)
292:
293: // The divisor for a sample, used with the previous counter to form a
294: // sampled %. You must check for >0 before dividing by this! This
295: // counter will directly follow the numerator counter. It should not
296: // be displayed to the user.
297: #define PERF_SAMPLE_BASE \
298: (PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_BASE |\
299: PERF_DISPLAY_NOSHOW |\
300: 0x00000001) // for compatibility with pre-beta versions
301:
302: // A timer which, when divided by an average base, produces a time
303: // in seconds which is the average time of some operation. This
304: // timer times total operations, and the base is the number of opera-
305: // tions. Display Suffix: "sec"
306: #define PERF_AVERAGE_TIMER \
307: (PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_FRACTION |\
308: PERF_DISPLAY_SECONDS)
309:
310: // Used as the denominator in the computation of time or count
311: // averages. Must directly follow the numerator counter. Not dis-
312: // played to the user.
313: #define PERF_AVERAGE_BASE \
314: (PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_BASE |\
315: PERF_DISPLAY_NOSHOW |\
316: 0x00000002) // for compatibility with pre-beta versions
317:
318:
319: // A bulk count which, when divided (typically) by the number of
320: // operations, gives (typically) the number of bytes per operation.
321: // No Display Suffix.
322: #define PERF_AVERAGE_BULK \
323: (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_FRACTION |\
324: PERF_DISPLAY_NOSHOW)
325:
326: // 64-bit Timer in 100 nsec units. Display delta divided by
327: // delta time. Display suffix: "%"
328: #define PERF_100NSEC_TIMER \
329: (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_RATE |\
330: PERF_TIMER_100NS | PERF_DELTA_COUNTER | PERF_DISPLAY_PERCENT)
331:
332: // 64-bit Timer inverse (e.g., idle is measured, but display busy %)
333: // Display 100 - delta divided by delta time. Display suffix: "%"
334: #define PERF_100NSEC_TIMER_INV \
335: (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_RATE |\
336: PERF_TIMER_100NS | PERF_DELTA_COUNTER | PERF_INVERSE_COUNTER |\
337: PERF_DISPLAY_PERCENT)
338:
339: // 64-bit Timer. Divide delta by delta time. Display suffix: "%"
340: // Timer for multiple instances, so result can exceed 100%.
341: #define PERF_COUNTER_MULTI_TIMER \
342: (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_RATE |\
343: PERF_DELTA_COUNTER | PERF_TIMER_TICK | PERF_MULTI_COUNTER |\
344: PERF_DISPLAY_PERCENT)
345:
346: // 64-bit Timer inverse (e.g., idle is measured, but display busy %)
347: // Display 100 * _MULTI_BASE - delta divided by delta time.
348: // Display suffix: "%" Timer for multiple instances, so result
349: // can exceed 100%. Followed by a counter of type _MULTI_BASE.
1.1 root 350: #define PERF_COUNTER_MULTI_TIMER_INV \
1.1.1.3 root 351: (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_RATE |\
352: PERF_DELTA_COUNTER | PERF_MULTI_COUNTER | PERF_TIMER_TICK |\
353: PERF_INVERSE_COUNTER | PERF_DISPLAY_PERCENT)
354:
355: // Number of instances to which the preceding _MULTI_..._INV counter
356: // applies. Used as a factor to get the percentage.
357: #define PERF_COUNTER_MULTI_BASE \
358: (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_BASE |\
359: PERF_MULTI_COUNTER | PERF_DISPLAY_NOSHOW)
360:
361: // 64-bit Timer in 100 nsec units. Display delta divided by delta time.
362: // Display suffix: "%" Timer for multiple instances, so result can exceed 100%.
363: #define PERF_100NSEC_MULTI_TIMER \
364: (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_DELTA_COUNTER |\
365: PERF_COUNTER_RATE | PERF_TIMER_100NS | PERF_MULTI_COUNTER |\
366: PERF_DISPLAY_PERCENT)
367:
368: // 64-bit Timer inverse (e.g., idle is measured, but display busy %)
369: // Display 100 * _MULTI_BASE - delta divided by delta time.
370: // Display suffix: "%" Timer for multiple instances, so result
371: // can exceed 100%. Followed by a counter of type _MULTI_BASE.
1.1 root 372: #define PERF_100NSEC_MULTI_TIMER_INV \
1.1.1.3 root 373: (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_DELTA_COUNTER |\
374: PERF_COUNTER_RATE | PERF_TIMER_100NS | PERF_MULTI_COUNTER |\
375: PERF_INVERSE_COUNTER | PERF_DISPLAY_PERCENT)
376:
377: // Indicates the data is a fraction of the following counter which
378: // should not be time averaged on display (such as free space over
379: // total space.) Display as is. Display the quotient as "%".
380: #define PERF_RAW_FRACTION \
381: (PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_FRACTION |\
382: PERF_DISPLAY_PERCENT)
383:
384: // Indicates the data is a base for the preceding counter which should
385: // not be time averaged on display (such as free space over total space.)
386: #define PERF_RAW_BASE \
387: (PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_BASE |\
388: PERF_DISPLAY_NOSHOW |\
389: 0x00000003) // for compatibility with pre-beta versions
390:
391: // The data collected in this counter is actually the start time of the
392: // item being measured. For display, this data is subtracted from the
393: // sample time to yield the elapsed time as the difference between the two.
394: // In the definition below, the PerfTime field of the Object contains
395: // the sample time as indicated by the PERF_OBJECT_TIMER bit and the
396: // difference is scaled by the PerfFreq of the Object to convert the time
397: // units into seconds.
398: #define PERF_ELAPSED_TIME \
399: (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_ELAPSED |\
400: PERF_OBJECT_TIMER | PERF_DISPLAY_SECONDS)
1.1 root 401: //
1.1.1.3 root 402: // The following counter type can be used with the preceding types to
403: // define a range of values to be displayed in a histogram.
1.1 root 404: //
405:
1.1.1.3 root 406: #define PERF_COUNTER_HISTOGRAM_TYPE 0x80000000
407: // Counter begins or ends a histogram
1.1 root 408:
409: //
410: // The following are used to determine the level of detail associated
411: // with the counter. The user will be setting the level of detail
412: // that should be displayed at any given time.
413: //
414:
1.1.1.3 root 415: #define PERF_DETAIL_NOVICE 100 // The uninformed can understand it
416: #define PERF_DETAIL_ADVANCED 200 // For the advanced user
417: #define PERF_DETAIL_EXPERT 300 // For the expert user
418: #define PERF_DETAIL_WIZARD 400 // For the system designer
1.1 root 419:
420:
421: //
422: // There is one of the following for each of the
423: // PERF_OBJECT_TYPE.NumCounters. The Unicode names in this structure MUST
424: // come from a message file.
425: //
426:
427: typedef struct _PERF_COUNTER_DEFINITION {
428: DWORD ByteLength; // Length in bytes of this structure
1.1.1.3 root 429: DWORD CounterNameTitleIndex;
430: // Index of Counter name into
431: // Title Database
1.1 root 432: LPWSTR CounterNameTitle; // Initially NULL, for use by
433: // analysis program to point to
434: // retrieved title string
1.1.1.3 root 435: DWORD CounterHelpTitleIndex;
436: // Index of Counter Help into
437: // Title Database
1.1 root 438: LPWSTR CounterHelpTitle; // Initially NULL, for use by
439: // analysis program to point to
440: // retrieved title string
1.1.1.3 root 441: LONG DefaultScale; // Power of 10 by which to scale
1.1 root 442: // chart line if vertical axis is 100
443: // 0 ==> 1, 1 ==> 10, -1 ==>1/10, etc.
1.1.1.3 root 444: DWORD DetailLevel; // Counter level of detail (for
445: // controlling display complexity)
446: DWORD CounterType; // Type of counter
447: DWORD CounterSize; // Size of counter in bytes
448: DWORD CounterOffset; // Offset from the start of the
449: // PERF_COUNTER_BLOCK to the first
450: // byte of this counter
1.1 root 451: } PERF_COUNTER_DEFINITION, *PPERF_COUNTER_DEFINITION;
452:
453: //
1.1.1.3 root 454: // If (PERF_DATA_BLOCK.NumInstances >= 0) then there will be
455: // PERF_DATA_BLOCK.NumInstances of a (PERF_INSTANCE_DEFINITION
456: // followed by a PERF_COUNTER_BLOCK followed by the counter data fields)
457: // for each instance.
458: //
459: // If (PERF_DATA_BLOCK.NumInstances < 0) then the counter definition
460: // strucutre above will be followed by only a PERF_COUNTER_BLOCK and the
461: // counter data for that COUNTER.
1.1 root 462: //
463:
464: #define PERF_NO_UNIQUE_ID -1
465:
466: typedef struct _PERF_INSTANCE_DEFINITION {
1.1.1.3 root 467: DWORD ByteLength; // Length in bytes of this structure,
468: // including the subsequent name
1.1 root 469: DWORD ParentObjectTitleIndex;
470: // Title Index to name of "parent"
1.1.1.3 root 471: // object (e.g., if thread, then
1.1 root 472: // process is parent object type);
473: // if logical drive, the physical
474: // drive is parent object type
1.1.1.3 root 475: DWORD ParentObjectInstance;
476: // Index to instance of parent object
477: // type which is the parent of this
478: // instance.
479: LONG UniqueID; // A unique ID used instead of
480: // matching the name to identify
481: // this instance, -1 = none
482: DWORD NameOffset; // Offset from beginning of
483: // this struct to the Unicode name
484: // of this instance
485: DWORD NameLength; // Length in bytes of name; 0 = none
1.1 root 486:
487: } PERF_INSTANCE_DEFINITION, *PPERF_INSTANCE_DEFINITION;
488: //
489: // If .ParentObjectName is 0, there
1.1.1.3 root 490: // is no parent-child hierarchy for this object type. Otherwise,
1.1 root 491: // the .ParentObjectInstance is an index, starting at 0, into the
492: // instances reported for the parent object type. It is only
493: // meaningful if .ParentObjectName is not 0. The purpose of all this
494: // is to permit reporting/summation of object instances like threads
495: // within processes, and logical drives within physical drives.
496: //
497: //
498: // The PERF_INSTANCE_DEFINITION will be followed by a PERF_COUNTER_BLOCK.
499: //
500:
501: typedef struct _PERF_COUNTER_BLOCK {
1.1.1.3 root 502: DWORD ByteLength; // Length in bytes of this structure,
503: // including the following counters
1.1 root 504: } PERF_COUNTER_BLOCK, *PPERF_COUNTER_BLOCK;
505:
506: //
507: // The PERF_COUNTER_BLOCK is followed by PERF_OBJECT_TYPE.NumCounters
508: // number of counters.
509: //
1.1.1.2 root 510:
1.1.1.3 root 511: //
512: // function typedefs for extensible counter function prototypes
513: //
1.1.1.4 ! root 514: typedef DWORD (APIENTRY PM_OPEN_PROC) (LPWSTR);
! 515: typedef DWORD (APIENTRY PM_COLLECT_PROC) (LPWSTR, LPVOID *, LPDWORD, LPDWORD);
! 516: typedef DWORD (APIENTRY PM_CLOSE_PROC) (void);
1.1.1.3 root 517:
518: #endif // _WINPERF_
519:
520:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.