The names and descriptions of all performance objects and their counters are stored using the registry. You must add this information for the objects and counters you add to the system.
The following example shows the registry location where performance counter names and descriptions are stored.
HKEY_LOCAL_MACHINE
\SOFTWARE
\Microsoft
\Windows NT
\CurrentVersion
\Perflib
Last Counter = highest counter index
Last Help = highest help index
\009
Counter = 2 System 4 Memory ...
Help = 3 The System object type ...
\supported language, other than U.S. English
Counter = ...
Help = ...
To add names and descriptions of the objects and counters for your application, use the lodctr utility included with Windows NT. The lodctr utility takes strings from an .INI file and adds them to the Counter and Help values under the appropriate language subkeys. It also updates the Last Counter and Last Help values. In addition to adding values under the PerfLib key, the lodctr utility also adds the following value entries to the Services node for the application.
\HKEY_LOCAL_MACHINE
\SYSTEM
\CurrentControlSet
\Services
\Application_Name
\Performance
First Counter = lowest counter index
First Help = lowest help index
Last Counter = highest counter index
Last Help = highest help index
The command-line syntax for lodctr is:
lodctr MyApplication.ini
The .INI file used by lodctr has the following format:
[info]
drivername=Application_Name
symbolfile=SymbolFile
// One key (value optional) for each language supported.
[languages]
langid=
.
.
.
// Name and description for each counter or counter object
[text]
offset_langid_NAME=Name // Counter name string.
offset_langid_HELP=Description // Help description string.
.
.
.
The .INI file entries are variables with the following meanings:
Variable | Description |
---|---|
DriverName | The name of the performance key created under the HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services key. |
SymbolFile | An .H file containing symbolic offsets of counters. The performance DLL also uses the offsets in this file along with the First Counter and First Help registry values to determine the indexes of the various counters and counter objects. |
Langid | An ID corresponding to the language subkey in the registry (for example, 009 for U.S. English). |
Offset | A symbolic constant defined in SymbolFile. Offsets must be consecutive, even numbers beginning with zero. These offsets determine the order in which the counters are installed in the Counter and Help values in the registry. |
The following is an example SymbolFile.
// SYMFILE.H
#define OBJECT_1 0
#define DEVICE_COUNTER_1 2
#define DEVICE_COUNTER_2 4
The following is an example .INI file.
// begin .INI file example
[info]
drivername=MyApplication
symbolfile=symfile.h
[languages]
009=English
011=OtherLanguage
[text]
OBJECT_1_009_NAME=Device Name
OBJECT_1_009_HELP=Displays performance statistics on Device Name
OBJECT_1_011_NAME=Device Name in other language
OBJECT_1_011_HELP=Displays performance of Device Name in other language
DEVICE_COUNTER_1_009_NAME=Counter A
DEVICE_COUNTER_1_009_HELP=Displays the current value of Counter A
DEVICE_COUNTER_1_011_NAME=Counter A in other language
DEVICE_COUNTER_1_011_HELP=Displays the value of Counter A in other language
DEVICE_COUNTER_2_009_NAME=Counter B
DEVICE_COUNTER_2_009_HELP=Displays the current rate of Device B
DEVICE_COUNTER_2_011_NAME=Counter B in other language
DEVICE_COUNTER_2_011_HELP=Displays the rate of Device B in other language
If you run lodctr to add counters for an application and the application does not have a Services key, lodctr returns without modifying the Perflib values.
Note The loading function of LODCTR, LoadPerfCounterTextStrings, is declared in LOADPERF.H and exported from LOADPERF.DLL. This allows you to call this function directly from your install program. The syntax for this function is as follows:
LONG LoadPerfCounterTextStrings(
LPSTR lpCommandLine, |
BOOL bQuietModeArg |
); |
where lpCommandLine is the name of your initialization file and bQuietModeArg is a Boolean parameter that indicates whether to display output during the loading of the counter text strings. If the function succeeds, the return value is ERROR_SUCCESS. If the function fails, the return value is a nonzero error code defined in WINERROR.H.