158 lines
4 KiB
C++
158 lines
4 KiB
C++
//TitleDB.cpp
|
|
|
|
#include "TitleDB.h"
|
|
|
|
#define PERFLIB TEXT("Software\\Microsoft\\Windows NT\\CurrentVersion\\PerfLib")
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// CTitleLibrary
|
|
//
|
|
// The CCtrLibrary object is an object that evaluates object and counter
|
|
// titles based on their IDs. The object uses a lookup table, where the
|
|
// elements reference strings in a block of ID / title pairs and the index
|
|
// is the ID values of the object and counters.
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
CTitleLibrary::CTitleLibrary()
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Constructor
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
{
|
|
Initialize();
|
|
}
|
|
|
|
CTitleLibrary::~CTitleLibrary()
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Destructor
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
{
|
|
if (m_tcsDataBlock)
|
|
delete []m_tcsDataBlock;
|
|
|
|
if (m_atcsNames)
|
|
delete []m_atcsNames;
|
|
}
|
|
|
|
HRESULT CTitleLibrary::Initialize()
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Initialize
|
|
//
|
|
// Sets up the lookup table for the library. The titles are indexed by their
|
|
// key ID values.
|
|
//
|
|
// Determine the maximum index value of the titles. Attempt to query the
|
|
// title/index pairs to determine how large of a block must be allocated to
|
|
// accept the structure. Create the block, and then query the title\index
|
|
// pairs. Create a lookup table the size of the maximum index, and populate
|
|
// it with the retrieved title data.
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
{
|
|
HKEY hKey = 0;
|
|
|
|
// Get the upper index limit
|
|
// =========================
|
|
|
|
DWORD dwSize;
|
|
|
|
if (ERROR_SUCCESS != RegOpenKeyEx(HKEY_LOCAL_MACHINE, PERFLIB,
|
|
0, KEY_READ, &hKey))
|
|
{
|
|
return E_FAIL;
|
|
}
|
|
|
|
dwSize = 4;
|
|
|
|
if (ERROR_SUCCESS != RegQueryValueEx(hKey, "Last Counter",
|
|
0, 0, (PBYTE)&m_lMaxIndex, &dwSize))
|
|
{
|
|
RegCloseKey(hKey);
|
|
return E_FAIL;
|
|
}
|
|
|
|
RegCloseKey(hKey);
|
|
|
|
// Get the size of block required to retrieve the title / index pairs
|
|
// ==================================================================
|
|
|
|
if (ERROR_SUCCESS != RegQueryValueEx(HKEY_PERFORMANCE_DATA, TEXT("Counter009"),
|
|
0, 0, 0, &dwSize))
|
|
return E_FAIL;
|
|
|
|
// Allocate the block, and retrieve the title / index pairs
|
|
// ========================================================
|
|
|
|
m_tcsDataBlock = new TCHAR[dwSize];
|
|
|
|
if (ERROR_SUCCESS != RegQueryValueEx(HKEY_PERFORMANCE_DATA, TEXT("Counter009"),
|
|
0, 0, (PBYTE)m_tcsDataBlock, &dwSize))
|
|
{
|
|
delete []m_tcsDataBlock;
|
|
return E_FAIL;
|
|
}
|
|
|
|
// Allocate and clear the memory for the lookup table
|
|
// ==================================================
|
|
|
|
m_atcsNames = new TCHAR*[m_lMaxIndex + 1];
|
|
memset(m_atcsNames, 0, (sizeof(TCHAR*) * (m_lMaxIndex + 1)));
|
|
|
|
// Populate the lookup table
|
|
// =========================
|
|
|
|
|
|
|
|
TCHAR* tcsTemp = m_tcsDataBlock;
|
|
int nLen, nIndex;
|
|
|
|
while ( 0 != (nLen = lstrlen(tcsTemp)))
|
|
{
|
|
// Get the index
|
|
// =============
|
|
|
|
nIndex = _ttoi(tcsTemp);
|
|
tcsTemp += nLen + 1;
|
|
|
|
// Set the table element at the index value to the string pointer
|
|
// ==============================================================
|
|
|
|
m_atcsNames[nIndex] = tcsTemp;
|
|
tcsTemp += lstrlen(tcsTemp) + 1;
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT CTitleLibrary::GetName(long lID, TCHAR** ptcsName)
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// GetName
|
|
//
|
|
// Evaluates the title given an object's or counter's ID.
|
|
//
|
|
// Parameters:
|
|
// lID - the Index into the library
|
|
// pstrName - the Name
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
{
|
|
// Is it a valid index?
|
|
// ====================
|
|
|
|
if (lID > m_lMaxIndex)
|
|
return E_INVALIDARG;
|
|
|
|
// Assign the pointer
|
|
// ==================
|
|
|
|
*ptcsName = m_atcsNames[lID];
|
|
|
|
return S_OK;
|
|
} |