|
|
1.1 ! root 1: // ! 2: // winperf.h - Header file for the Performance Monitor data ! 3: // ! 4: // ! 5: // ! 6: // Written by: ! 7: // ! 8: // Russ Blake 11/15/91 ! 9: // ! 10: // Revision History: ! 11: // ! 12: // None ! 13: // russbl - 1/22/92 - Add diagrams of data structures ! 14: // russbl - 4/14/92 - Add version/revision, signature, ! 15: // and pointer fields for titles ! 16: // strings reserved for analysis ! 17: // program usage ! 18: // russbl - 5/29/92 - Add default scale to counter ! 19: // definition, *Pstruct types to ! 20: // all structure defs, and counter ! 21: // types ..._MULTI_ ! 22: // ! 23: ! 24: ! 25: // ! 26: // This file contains the definitions of the data structures returned ! 27: // by the Configuration Registry in response to a request for ! 28: // performance data. This file is used by both the Configuration ! 29: // Registry and the Performance Monitor to define their interface. ! 30: // The complete interface is described here, except for the name ! 31: // of the node to query in the registry. It is ! 32: // ! 33: // HKEY_PERFORMANCE_DATA. ! 34: // ! 35: // By querying that node with a subkey of "GLOBAL" the caller will ! 36: // retrieve the structures described here. ! 37: // ! 38: // There is no need to RegOpenKey the reserved handle HKEY_PERFORMANCE_DATA, ! 39: // but the caller should RegCloseKey the handle so that network transports ! 40: // and drivers can be removed or installed (which cannot happen while ! 41: // they are open for monitoring.) ! 42: // ! 43: // ! 44: ! 45: ! 46: /*****************************************************************************\ ! 47: ! 48: ! 49: The basic layout of the data block returned is a header followed by a ! 50: data area for each type of object under measurement. Typical object ! 51: types are processor, disk, and memory. The system being observed ! 52: defines what objects are under measurement. Naturally, different ! 53: systems may measure different types of objects. ! 54: ! 55: ! 56: +-----------------------------------------+ ! 57: | | ! 58: | PERF_DATA_BLOCK | ! 59: | - - - - - - - - - - - - - - - - - - - - | ! 60: | NumObjectTypes | ! 61: | - - - - - - - - - - - - - - - - - - - - | ! 62: |-----------------------------------------| ! 63: | | ! 64: | | ! 65: | PERF_OBJECT_TYPE 0 | ! 66: | | ! 67: | | ! 68: |-----------------------------------------| ! 69: | | ! 70: | | ! 71: | PERF_OBJECT_TYPE 1 | ! 72: | | ! 73: | | ! 74: |-----------------------------------------| ! 75: | | ! 76: | | ! 77: | PERF_OBJECT_TYPE 2 | ! 78: | | ! 79: | | ! 80: |-----------------------------------------| ! 81: | . | ! 82: | . | ! 83: | . | ! 84: |-----------------------------------------| ! 85: | | ! 86: | | ! 87: | PERF_OBJECT_TYPE NumObjectTypes-1 | ! 88: | | ! 89: | | ! 90: +-----------------------------------------+ ! 91: ! 92: Note that from one call to the next, there may be different object types ! 93: defined, meaning that PERF_DATA_BLOCK.NumObjectTypes will vary. As will ! 94: become clear shortly, the size of the area for each object type may also ! 95: vary. You cannot count on the locations of the object type areas from ! 96: one call to the system to the next. To help to accomodate this, offsets ! 97: have been included to help naviagte the structure. Such offsets are ! 98: !always! relative to the !beginning! of the structure which contains them. ! 99: ! 100: +-----------------------------------------+ ! 101: | PERF_DATA_BLOCK | ! 102: | - - - - - - - - - - - - - - - - - - - - | ! 103: | TotalByteLength *--------* ! 104: | - - - - - - - - - - - - - - - - - - - - | | ! 105: | HeaderLength *----* | ! 106: | - - - - - - - - - - - - - - - - - - - - | | | ! 107: | | | | ! 108: | | | | ! 109: |-----------------------------------------| | | ! 110: | PERF_OBJECT_TYPE 0 |<---* | ! 111: | - - - - - - - - - - - - - - - - - - - - | | ! 112: | TotalByteLength *----* | ! 113: | - - - - - - - - - - - - - - - - - - - - | | | ! 114: | | | | ! 115: | | | | ! 116: |-----------------------------------------| | | ! 117: | PERF_OBJECT_TYPE 1 |<---* | ! 118: | - - - - - - - - - - - - - - - - - - - - | | ! 119: | TotalByteLength *----* | ! 120: | - - - - - - - - - - - - - - - - - - - - | | | ! 121: | | | | ! 122: | | | | ! 123: | | | | ! 124: | | | | ! 125: |-----------------------------------------| | | ! 126: | PERF_OBJECT_TYPE 2 |<---* | ! 127: | - - - - - - - - - - - - - - - - - - - - | | ! 128: | TotalByteLength *----* | ! 129: | - - - - - - - - - - - - - - - - - - - - | | | ! 130: | | | | ! 131: | | | | ! 132: |-----------------------------------------| | | ! 133: | . |<---* | ! 134: | . | . ! 135: | . |. . . . ! 136: |-----------------------------------------| . . ! 137: | PERF_OBJECT_TYPE NumObjectTypes-1 |<---* | ! 138: | | | ! 139: | | | ! 140: | | | ! 141: | | | ! 142: +-----------------------------------------+<-------* ! 143: ! 144: ! 145: Each PERF_OBJECT_TYPE definition is followed by the definitions of all the ! 146: counters which are defined for that object. Typical counters for the ! 147: object of type processor are Processor Time, Interrupts, and Page Faults. ! 148: ! 149: +-----------------------------------------+ ! 150: | PERF_OBJECT_TYPE i | ! 151: | | ! 152: | - - - - - - - - - - - - - - - - - - - - | ! 153: | DefinitionLength *----------* ! 154: | - - - - - - - - - - - - - - - - - - - - | | ! 155: | HeaderLength *-----* | ! 156: | - - - - - - - - - - - - - - - - - - - - | | | ! 157: | NumCounters | | | ! 158: | - - - - - - - - - - - - - - - - - - - - | | | ! 159: | | | | ! 160: | | | | ! 161: |-----------------------------------------| | | ! 162: | PERF_COUNTER_DEFINITION 0 |<----* | ! 163: | | | ! 164: | | | ! 165: |-----------------------------------------| | ! 166: | PERF_COUNTER_DEFINITION 1 | | ! 167: | | | ! 168: | | | ! 169: |-----------------------------------------| | ! 170: | PERF_COUNTER_DEFINITION 2 | | ! 171: | | | ! 172: | | | ! 173: |-----------------------------------------| | ! 174: | . | | ! 175: | . | | ! 176: | . | | ! 177: |-----------------------------------------| | ! 178: | PERF_COUNTER_DEFINITION NumCounters-1 | | ! 179: | | | ! 180: | | | ! 181: |-----------------------------------------| | ! 182: | . |<---------* ! 183: | . | ! 184: | . | ! 185: +-----------------------------------------+ ! 186: ! 187: ! 188: Following the counter definitions for the object type are the Instances for ! 189: that object type. In a multiprocessor system, for example, there are by ! 190: definition multiple instances of the object type processor. The number ! 191: of instances for an object type like threads may not be the same from ! 192: one call to get data to the next. ! 193: ! 194: +-----------------------------------------+ ! 195: | PERF_OBJECT_TYPE i | ! 196: | | ! 197: | - - - - - - - - - - - - - - - - - - - - | ! 198: | TotalByteLength *---------------* ! 199: | - - - - - - - - - - - - - - - - - - - - | | ! 200: | DefinitionLength *----------* | ! 201: | - - - - - - - - - - - - - - - - - - - - | | | ! 202: | HeaderLength *-----* | | ! 203: | - - - - - - - - - - - - - - - - - - - - | | | | ! 204: | NumCounters | | | | ! 205: | - - - - - - - - - - - - - - - - - - - - | | | | ! 206: | NumInstances | | | | ! 207: | - - - - - - - - - - - - - - - - - - - - | | | | ! 208: | | | | | ! 209: | | | | | ! 210: |-----------------------------------------| | | | ! 211: | PERF_COUNTER_DEFINITION 0 |<----* | | ! 212: | | | | ! 213: | | | | ! 214: |-----------------------------------------| | | ! 215: | PERF_COUNTER_DEFINITION 1 | | | ! 216: | | | | ! 217: | | | | ! 218: |-----------------------------------------| | | ! 219: | . | | | ! 220: | . | | | ! 221: | . | | | ! 222: |-----------------------------------------| | | ! 223: | PERF_COUNTER_DEFINITION NumCounters-1 | | | ! 224: | | | | ! 225: | | | | ! 226: |-----------------------------------------| | | ! 227: | PERF_INSTANCE_DEFINITION 0 |<---------* | ! 228: | | | ! 229: | | | ! 230: |-----------------------------------------| | ! 231: | PERF_INSTANCE_DEFINITION 1 | | ! 232: | | | ! 233: | | | ! 234: |-----------------------------------------| | ! 235: | PERF_INSTANCE_DEFINITION 2 | | ! 236: | | | ! 237: | | | ! 238: |-----------------------------------------| | ! 239: | . | | ! 240: | . | | ! 241: | . | | ! 242: |-----------------------------------------| | ! 243: | PERF_INSTANCE_DEFINITION NumInstances-1 | | ! 244: | | | ! 245: | | | ! 246: +-----------------------------------------+<--------------* ! 247: ! 248: Each instance definition is followed by the counter data for that instance. ! 249: This is the actual data for each counter defined for the object type of ! 250: which the instance is a member. There are PERF_OBJECT_TYPE.NumCounters ! 251: such counters for !each! instance. ! 252: ! 253: The size of the various instance definitions is not constant, since each ! 254: instance definition structure is followed by the null-terminated name of ! 255: the instance. Therefore the instance definition contains an offset to ! 256: its first counter data item, and also to its name. ! 257: ! 258: +-----------------------------------------+ ! 259: | PERF_INSTANCE_DEFINITION j | ! 260: | | ! 261: | - - - - - - - - - - - - - - - - - - - - | ! 262: | ByteLength *-----------* ! 263: | - - - - - - - - - - - - - - - - - - - - | | ! 264: | | | ! 265: | | | ! 266: | - - - - - - - - - - - - - - - - - - - - | | ! 267: | NameOffset *-----* | ! 268: | - - - - - - - - - - - - - - - - - - - - | | | ! 269: | | | | ! 270: | | | | ! 271: | - - - - - - - - - - - - - - - - - - - - | | | ! 272: | Name of PERF_INSTANCE_DEFINITION j |<----* | ! 273: | | | ! 274: | | | ! 275: | | | ! 276: | ...padded to 4 byte boundary| | ! 277: |-----------------------------------------| | ! 278: | PERF_COUNTER_BLOCK |<----------* ! 279: | - - - - - - - - - - - - - - - - - - - - | ! 280: | ByteLength *-----* ! 281: | - - - - - - - - - - - - - - - - - - - - | | ! 282: | Data for Counter 0 | | ! 283: | - - - - - - - - - - - - - - - - - - - - | | ! 284: | Data for Counter 1 | | ! 285: | - - - - - - - - - - - - - - - - - - - - | | ! 286: | Data for Counter 2 | | ! 287: | | | ! 288: | - - - - - - - - - - - - - - - - - - - - | | ! 289: | . | | ! 290: | . | | ! 291: | . | | ! 292: | - - - - - - - - - - - - - - - - - - - - | | ! 293: | Data for Counter NumCounters-1 | | ! 294: | | | ! 295: +-----------------------------------------+<----* ! 296: ! 297: ! 298: \*****************************************************************************/ ! 299: ! 300: // Data structure definitions. ! 301: ! 302: // In order for data to be returned through the Configuration Registry ! 303: // in a system-independent fashion, it must be self-describing. ! 304: ! 305: // In the following, all offsets are in bytes. ! 306: ! 307: // ! 308: // Data is returned through the Configuration Registry in a ! 309: // a data block which begins with a _PERF_DATA_BLOCK structure. ! 310: // ! 311: ! 312: #define PERF_DATA_VERSION 1 ! 313: #define PERF_DATA_REVISION 0 ! 314: ! 315: ! 316: typedef struct _PERF_DATA_BLOCK { ! 317: WCHAR Signature[4]; // Signature: Unicode "PERF" ! 318: DWORD LittleEndian; // 0 = Big Endian, 1 = Little Endian ! 319: DWORD Version; // Version of these data structures ! 320: // starting at 1 ! 321: DWORD Revision; // Revision of these data structures ! 322: // starting at 0 for each Version ! 323: DWORD TotalByteLength; // Total length of data block ! 324: DWORD HeaderLength; // Length of this structure ! 325: DWORD NumObjectTypes; // Number of types of objects ! 326: // being reported ! 327: DWORD DefaultObject; // Index starting at 0 of default ! 328: // object to display when data from ! 329: // this system is retireved (-1 = ! 330: // none, but this is not expected to ! 331: // be used) ! 332: SYSTEMTIME SystemTime; // Time at the system under ! 333: // measurement ! 334: LARGE_INTEGER PerfTime; // Performance counter value ! 335: // at the system under measurement ! 336: LARGE_INTEGER PerfFreq; // Performance counter frequency ! 337: // at the system under measurement ! 338: LARGE_INTEGER PerfTime100nSec; // Performance counter time in 100 nsec ! 339: // units at the system under measurement ! 340: DWORD SystemNameLength; // Length of the system name ! 341: DWORD SystemNameOffset; // Offset, from beginning of this ! 342: // structure, to name of system ! 343: // being measured ! 344: } PERF_DATA_BLOCK, *PPERF_DATA_BLOCK; ! 345: ! 346: ! 347: // ! 348: // The _PERF_DATA_BLOCK structure is followed by NumObjectTypes of ! 349: // data sections, one for each type of object measured. Each object ! 350: // type section begins with a _PERF_OBJECT_TYPE structure. ! 351: // ! 352: ! 353: ! 354: typedef struct _PERF_OBJECT_TYPE { ! 355: DWORD TotalByteLength; // Length of this object definition ! 356: // including this structure, the ! 357: // counter defintions, and the ! 358: // instance definitions and the ! 359: // counter blocks for each instance: ! 360: // This is the offset from this ! 361: // structure to the next object, if ! 362: // any ! 363: DWORD DefinitionLength; // Length of object definition, ! 364: // which includes this structure ! 365: // and the counter definition ! 366: // structures for this object: this ! 367: // is the offset of the first ! 368: // instance or of the counters ! 369: // for this object if there is ! 370: // no instance ! 371: DWORD HeaderLength; // Length of this structure: this ! 372: // is the offset to the first ! 373: // counter definition for this ! 374: // object ! 375: DWORD ObjectNameTitleIndex; ! 376: // Index to name in Title Database ! 377: LPWSTR ObjectNameTitle; // Initially NULL, for use by ! 378: // analysis program to point to ! 379: // retrieved title string ! 380: DWORD ObjectHelpTitleIndex; ! 381: // Index to Help in Title Database ! 382: LPWSTR ObjectHelpTitle; // Initially NULL, for use by ! 383: // analysis program to point to ! 384: // retrieved title string ! 385: DWORD DetailLevel; // Object level of detail (for ! 386: // controlling display complexity); ! 387: // will be min of detail levels ! 388: // for all this object's counters ! 389: DWORD NumCounters; // Number of counters in each ! 390: // counter block (one counter ! 391: // block per instance) ! 392: DWORD DefaultCounter; // Default counter to display when ! 393: // this object is selected, index ! 394: // starting at 0 (-1 = none, but ! 395: // this is not expected to be used) ! 396: DWORD NumInstances; // Number of object instances ! 397: // for which counters are being ! 398: // returned from the system under ! 399: // measurement ! 400: DWORD CodePage; // 0 if instance strings are in ! 401: // UNICODE, else the Code Page of ! 402: // the instance names ! 403: } PERF_OBJECT_TYPE, *PPERF_OBJECT_TYPE; ! 404: ! 405: // ! 406: // The following types of counters are currently defined. ! 407: // ! 408: ! 409: #define PERF_COUNTER_COUNTER 1 // 32-bit Counter. Divide delta ! 410: // by delta time. ! 411: ! 412: // Display suffix: "/sec" ! 413: #define PERF_COUNTER_TIMER 2 // 64-bit Timer. Divide delta by ! 414: // delta time. ! 415: // Display suffix: "%" ! 416: ! 417: #define PERF_COUNTER_QUEUELEN 3 // Queue Length Space-Time Product. ! 418: // Divide delta by delta time. ! 419: // No Display Suffix. ! 420: ! 421: #define PERF_COUNTER_BULK_COUNT 4 // 64-bit Counter. Divide delta by ! 422: // delta time. ! 423: // Display Suffix: "/sec" ! 424: ! 425: #define PERF_COUNTER_TEXT 5 // Indicates the counter is not a ! 426: // counter but rather Unicode text ! 427: // Display as text. ! 428: ! 429: #define PERF_COUNTER_RAWCOUNT 6 // Indicates the data is a ! 430: // counter which should not be ! 431: // time averaged on display (such as ! 432: // an error counter on a serial line) ! 433: // Display as is. No Display Suffix. ! 434: ! 435: #define PERF_SAMPLE_FRACTION 7 // A count which is either 1 or 0 on ! 436: // each sampling interrupt (% busy) ! 437: // Divide delta by delta base. ! 438: // Display Suffix: "%" ! 439: ! 440: #define PERF_SAMPLE_COUNTER 8 // A count which is sampled on each ! 441: // sampling interrupt (queue length) ! 442: // Divide delta by delta time. ! 443: // No Display Suffix. ! 444: ! 445: #define PERF_COUNTER_NODATA 9 // A label: no data is associated ! 446: // with this counter (it has 0 length) ! 447: // Do not display. ! 448: ! 449: #define PERF_COUNTER_TIMER_INV 10 // 64-bit Timer inverse (e.g., idle ! 450: // is measured, but display busy %) ! 451: // Display 100 - delta divided by ! 452: // delta time. Display suffix: "%" ! 453: ! 454: #define PERF_SAMPLE_BASE 11 // The divisor for a sample, used with ! 455: // the previous counter to form a ! 456: // sampled %. You must check for >0 ! 457: // before dividing by this! This ! 458: // counter will directly follow the ! 459: // numerator counter. It should not ! 460: // be displayed to the user. ! 461: ! 462: #define PERF_AVERAGE_TIMER 12 // A timer which, when divided by ! 463: // an average base, produces a time ! 464: // in seconds which is the average ! 465: // time of some operation. This ! 466: // timer times total operations, and ! 467: // the base is the number of opera- ! 468: // tions. Display Suffix: "sec" ! 469: ! 470: #define PERF_AVERAGE_BASE 13 // Used as the denominator in the ! 471: // computation of time or count ! 472: // averages. Must directly follow ! 473: // the numerator counter. Not dis- ! 474: // played to the user. ! 475: ! 476: #define PERF_AVERAGE_BULK 14 // A bulk count which, when divided ! 477: // (typically) by the number of ! 478: // operations, gives (typically) the ! 479: // number of bytes per operation. ! 480: // No Display Suffix. ! 481: ! 482: #define PERF_100NSEC_TIMER 15 // 64-bit Timer in 100 nsec units. ! 483: // Display delta divided by ! 484: // delta time. Display suffix: "%" ! 485: ! 486: #define PERF_100NSEC_TIMER_INV 16 // 64-bit Timer inverse (e.g., idle ! 487: // is measured, but display busy %) ! 488: // Display 100 - delta divided by ! 489: // delta time. Display suffix: "%" ! 490: ! 491: #define PERF_COUNTER_MULTI_TIMER 17 // 64-bit Timer. Divide delta by ! 492: // delta time. Display suffix: "%" ! 493: // Timer for multiple instances, so ! 494: // result can exceed 100%. ! 495: ! 496: #define PERF_COUNTER_MULTI_TIMER_INV \ ! 497: 18 // 64-bit Timer inverse (e.g., idle ! 498: // is measured, but display busy %) ! 499: // Display 100 * _MULTI_BASE - ! 500: // delta divided by delta time. ! 501: // Display suffix: "%" Timer for ! 502: // multiple instances, so result ! 503: // can exceed 100%. Followed by ! 504: // a counter of type _MULTI_BASE. ! 505: ! 506: #define PERF_COUNTER_MULTI_BASE 19 // Number of instances to which the ! 507: // preceeding _MULTI_..._INV counter ! 508: // applies. Used as a factor to get ! 509: // the percentage. ! 510: ! 511: #define PERF_100NSEC_MULTI_TIMER 20 // 64-bit Timer in 100 nsec units. ! 512: // Display delta divided by ! 513: // delta time. Display suffix: "%" ! 514: // Timer for multiple instances, so ! 515: // result can exceed 100%. ! 516: ! 517: #define PERF_100NSEC_MULTI_TIMER_INV \ ! 518: 21 // 64-bit Timer inverse (e.g., idle ! 519: // is measured, but display busy %) ! 520: // Display 100 * _MULTI_BASE - ! 521: // delta divided by delta time. ! 522: // Display suffix: "%" Timer for ! 523: // multiple instances, so result ! 524: // can exceed 100%. Followed by ! 525: // a counter of type _MULTI_BASE. ! 526: ! 527: // ! 528: // The following counter type can be used with the preceeding types to ! 529: // define a reange of values to be displayed in a histogram. ! 530: // ! 531: ! 532: #define PERF_COUNTER_HISTOGRAM 0x80000000 ! 533: // Counter begins or ends a histogram ! 534: ! 535: // ! 536: // The following are used to determine the level of detail associated ! 537: // with the counter. The user will be setting the level of detail ! 538: // that should be displayed at any given time. ! 539: // ! 540: ! 541: #define PERF_DETAIL_NOVICE 100 // The uninformed can understand it ! 542: #define PERF_DETAIL_ADVANCED 200 // For the advanced user ! 543: #define PERF_DETAIL_EXPERT 300 // For the expert user ! 544: #define PERF_DETAIL_WIZARD 400 // For the system designer ! 545: ! 546: ! 547: // ! 548: // There is one of the following for each of the ! 549: // PERF_OBJECT_TYPE.NumCounters. The Unicode names in this structure MUST ! 550: // come from a message file. ! 551: // ! 552: ! 553: typedef struct _PERF_COUNTER_DEFINITION { ! 554: DWORD ByteLength; // Length in bytes of this structure ! 555: DWORD CounterNameTitleIndex; ! 556: // Index of Counter name into ! 557: // Title Database ! 558: LPWSTR CounterNameTitle; // Initially NULL, for use by ! 559: // analysis program to point to ! 560: // retrieved title string ! 561: DWORD CounterHelpTitleIndex; ! 562: // Index of Counter Help into ! 563: // Title Database ! 564: LPWSTR CounterHelpTitle; // Initially NULL, for use by ! 565: // analysis program to point to ! 566: // retrieved title string ! 567: DWORD DefaultScale; // Power of 10 by which to scale ! 568: // chart line if vertical axis is 100 ! 569: // 0 ==> 1, 1 ==> 10, -1 ==>1/10, etc. ! 570: DWORD DetailLevel; // Counter level of detail (for ! 571: // controlling display complexity) ! 572: DWORD CounterType; // Type of counter ! 573: DWORD CounterSize; // Size of counter in bytes ! 574: DWORD CounterOffset; // Offset from the start of the ! 575: // PERF_COUNTER_BLOCK to the first ! 576: // byte of this counter ! 577: } PERF_COUNTER_DEFINITION, *PPERF_COUNTER_DEFINITION; ! 578: ! 579: ! 580: // ! 581: // There is one of the following for each of the ! 582: // PERF_DATA_BLOCK.NumInstances. ! 583: // ! 584: ! 585: #define PERF_NO_UNIQUE_ID -1 ! 586: ! 587: typedef struct _PERF_INSTANCE_DEFINITION { ! 588: DWORD ByteLength; // Length in bytes of this structure, ! 589: // including the subsequent name ! 590: DWORD ParentObjectTitleIndex; ! 591: // Title Index to name of "parent" ! 592: // object (e.g., if thread, then ! 593: // process is parent object type); ! 594: // if logical drive, the physical ! 595: // drive is parent object type ! 596: DWORD ParentObjectInstance; ! 597: // Index to instance of parent object ! 598: // type which is the parent of this ! 599: // instance. ! 600: DWORD UniqueID; // A unique ID used instead of ! 601: // matching the name to identify ! 602: // this instance, -1 = none ! 603: DWORD NameOffset; // Offset from beginning of ! 604: // this struct to the Unicode name ! 605: // of this instance ! 606: DWORD NameLength; // Length in bytes of name; 0 = none ! 607: ! 608: } PERF_INSTANCE_DEFINITION, *PPERF_INSTANCE_DEFINITION; ! 609: ! 610: ! 611: // ! 612: // If .ParentObjectName is 0, there ! 613: // is no parent-child hierarcy for this object type. Otherwise, ! 614: // the .ParentObjectInstance is an index, starting at 0, into the ! 615: // instances reported for the parent object type. It is only ! 616: // meaningful if .ParentObjectName is not 0. The purpose of all this ! 617: // is to permit reporting/summation of object instances like threads ! 618: // within processes, and logical drives within physical drives. ! 619: // ! 620: // ! 621: // The PERF_INSTANCE_DEFINITION will be followed by a PERF_COUNTER_BLOCK. ! 622: // ! 623: ! 624: typedef struct _PERF_COUNTER_BLOCK { ! 625: DWORD ByteLength; // Length in bytes of this structure, ! 626: // including the following counters ! 627: } PERF_COUNTER_BLOCK, *PPERF_COUNTER_BLOCK; ! 628: ! 629: // ! 630: // The PERF_COUNTER_BLOCK is followed by PERF_OBJECT_TYPE.NumCounters ! 631: // number of counters. ! 632: //
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.