windows-nt/Source/XPSP1/NT/base/screg/winreg/cntrtext/common/wbemutil.c
2020-09-26 16:20:57 +08:00

812 lines
32 KiB
C

/*
WbemUtil.C
functions and definitions used to access WBEM perf
data
*/
#include <windows.h>
#include <rpc.h>
#include <ntprfctr.h>
#include <stdio.h>
#include <assert.h>
#include "wbemutil.h"
const PERFTYPE_LOOKUP PerfTypeTable[] =
{
{PERF_100NSEC_MULTI_TIMER, (LPWSTR)L"uint64" ,(LPWSTR)L"real64"},
{PERF_100NSEC_MULTI_TIMER_INV, (LPWSTR)L"uint64" ,(LPWSTR)L"real64"},
{PERF_100NSEC_TIMER, (LPWSTR)L"uint64" ,(LPWSTR)L"real64"},
{PERF_100NSEC_TIMER_INV, (LPWSTR)L"uint64" ,(LPWSTR)L"real64"},
{PERF_AVERAGE_BASE, (LPWSTR)L"uint32" ,(LPWSTR)L""},
{PERF_AVERAGE_BULK, (LPWSTR)L"uint64" ,(LPWSTR)L"real64"},
{PERF_AVERAGE_TIMER, (LPWSTR)L"uint32" ,(LPWSTR)L"real64"},
{PERF_COUNTER_BULK_COUNT, (LPWSTR)L"uint64" ,(LPWSTR)L"real64"},
{PERF_COUNTER_COUNTER, (LPWSTR)L"uint32" ,(LPWSTR)L"real64"},
{PERF_COUNTER_DELTA, (LPWSTR)L"uint32" ,(LPWSTR)L"uint32"},
{PERF_COUNTER_HISTOGRAM_TYPE, (LPWSTR)L"" ,(LPWSTR)L""},
{PERF_COUNTER_LARGE_DELTA, (LPWSTR)L"uint64" ,(LPWSTR)L"uint64"},
{PERF_COUNTER_LARGE_QUEUELEN_TYPE, (LPWSTR)L"uint64" ,(LPWSTR)L"real64"},
{PERF_COUNTER_LARGE_RAWCOUNT, (LPWSTR)L"uint64" ,(LPWSTR)L"uint64"},
{PERF_COUNTER_LARGE_RAWCOUNT_HEX, (LPWSTR)L"uint64",(LPWSTR)L"uint64"},
{PERF_COUNTER_MULTI_BASE, (LPWSTR)L"uint64" ,(LPWSTR)L""},
{PERF_COUNTER_MULTI_TIMER, (LPWSTR)L"uint64" ,(LPWSTR)L"real64"},
{PERF_COUNTER_MULTI_TIMER_INV, (LPWSTR)L"uint64" ,(LPWSTR)L"real64"},
{PERF_COUNTER_NODATA, (LPWSTR)L"" ,(LPWSTR)L""},
{PERF_COUNTER_QUEUELEN_TYPE, (LPWSTR)L"uint32" ,(LPWSTR)L"real64"},
{PERF_COUNTER_RAWCOUNT, (LPWSTR)L"uint32" ,(LPWSTR)L"uint32"},
{PERF_COUNTER_RAWCOUNT_HEX, (LPWSTR)L"uint32" ,(LPWSTR)L"uint32"},
{PERF_COUNTER_TEXT, (LPWSTR)L"string" ,(LPWSTR)L"string"},
{PERF_COUNTER_TIMER, (LPWSTR)L"uint64" ,(LPWSTR)L"real64"},
{PERF_COUNTER_TIMER_INV, (LPWSTR)L"uint64" ,(LPWSTR)L"real64"},
{PERF_ELAPSED_TIME, (LPWSTR)L"uint64" ,(LPWSTR)L"real64"},
{PERF_RAW_BASE, (LPWSTR)L"uint32" ,(LPWSTR)L""},
{PERF_RAW_FRACTION, (LPWSTR)L"uint32" ,(LPWSTR)L"real64"},
{PERF_SAMPLE_FRACTION, (LPWSTR)L"uint32" ,(LPWSTR)L"real64"},
{PERF_SAMPLE_BASE, (LPWSTR)L"uint32" ,(LPWSTR)L""},
{PERF_SAMPLE_COUNTER, (LPWSTR)L"uint32" ,(LPWSTR)L"real64"},
{PERF_COUNTER_100NS_QUEUELEN_TYPE, (LPWSTR)L"uint64" ,(LPWSTR)L"real64"},
{PERF_COUNTER_OBJ_TIME_QUEUELEN_TYPE, (LPWSTR)L"uint64" ,(LPWSTR)L"real64"},
{PERF_OBJ_TIME_TIMER, (LPWSTR)L"uint64" ,(LPWSTR)L"real64"},
{PERF_LARGE_RAW_BASE, (LPWSTR)L"uint64" ,(LPWSTR)L""},
{PERF_LARGE_RAW_FRACTION, (LPWSTR)L"uint64" ,(LPWSTR)L"real64"},
{PERF_PRECISION_SYSTEM_TIMER, (LPWSTR)L"uint64" ,(LPWSTR)L"real64"},
{PERF_PRECISION_100NS_TIMER, (LPWSTR)L"uint64" ,(LPWSTR)L"real64"},
{PERF_PRECISION_OBJECT_TIMER, (LPWSTR)L"uint64" ,(LPWSTR)L"real64"}
};
const PPERFTYPE_LOOKUP PerfTypes = (const PPERFTYPE_LOOKUP)&PerfTypeTable[0];
const DWORD dwNumPerfTypes = (sizeof(PerfTypeTable) / sizeof(PerfTypeTable[0]));
const PERFOBJECT_LOOKUP PerfObjectGuidTable[] =
{
{SYSTEM_OBJECT_TITLE_INDEX, (LPWSTR)L"{5C7A4F5C-9E4D-11d1-BB3C-00A0C913CAD4}"},
{PROCESSOR_OBJECT_TITLE_INDEX, (LPWSTR)L"{5C7A4F5D-9E4D-11d1-BB3C-00A0C913CAD4}"},
{MEMORY_OBJECT_TITLE_INDEX, (LPWSTR)L"{5C7A4F5E-9E4D-11d1-BB3C-00A0C913CAD4}"},
{CACHE_OBJECT_TITLE_INDEX, (LPWSTR)L"{5C7A4F5F-9E4D-11d1-BB3C-00A0C913CAD4}"},
{PHYSICAL_DISK_OBJECT_TITLE_INDEX, (LPWSTR)L"{5C7A4F60-9E4D-11d1-BB3C-00A0C913CAD4}"},
{LOGICAL_DISK_OBJECT_TITLE_INDEX, (LPWSTR)L"{5C7A4F61-9E4D-11d1-BB3C-00A0C913CAD4}"},
{PROCESS_OBJECT_TITLE_INDEX, (LPWSTR)L"{5C7A4F62-9E4D-11d1-BB3C-00A0C913CAD4}"},
{THREAD_OBJECT_TITLE_INDEX, (LPWSTR)L"{5C7A4F63-9E4D-11d1-BB3C-00A0C913CAD4}"},
{OBJECT_OBJECT_TITLE_INDEX, (LPWSTR)L"{5C7A4F64-9E4D-11d1-BB3C-00A0C913CAD4}"},
{REDIRECTOR_OBJECT_TITLE_INDEX, (LPWSTR)L"{5C7A4F65-9E4D-11d1-BB3C-00A0C913CAD4}"},
{SERVER_OBJECT_TITLE_INDEX, (LPWSTR)L"{5C7A4F66-9E4D-11d1-BB3C-00A0C913CAD4}"},
{SERVER_QUEUE_OBJECT_TITLE_INDEX, (LPWSTR)L"{5C7A4F67-9E4D-11d1-BB3C-00A0C913CAD4}"},
{PAGEFILE_OBJECT_TITLE_INDEX, (LPWSTR)L"{5C7A4F68-9E4D-11d1-BB3C-00A0C913CAD4}"},
{BROWSER_OBJECT_TITLE_INDEX, (LPWSTR)L"{5C7A4F69-9E4D-11d1-BB3C-00A0C913CAD4}"},
{EXPROCESS_OBJECT_TITLE_INDEX, (LPWSTR)L"{5C7A4F6A-9E4D-11d1-BB3C-00A0C913CAD4}"},
{IMAGE_OBJECT_TITLE_INDEX, (LPWSTR)L"{5C7A4F6B-9E4D-11d1-BB3C-00A0C913CAD4}"},
{THREAD_DETAILS_OBJECT_TITLE_INDEX, (LPWSTR)L"{5C7A4F6C-9E4D-11d1-BB3C-00A0C913CAD4}"},
{LONG_IMAGE_OBJECT_TITLE_INDEX, (LPWSTR)L"{5C7A4F6D-9E4D-11d1-BB3C-00A0C913CAD4}"},
{TCP_OBJECT_TITLE_INDEX, (LPWSTR)L"{5C7A4F6E-9E4D-11d1-BB3C-00A0C913CAD4}"},
{UDP_OBJECT_TITLE_INDEX, (LPWSTR)L"{5C7A4F6F-9E4D-11d1-BB3C-00A0C913CAD4}"},
{IP_OBJECT_TITLE_INDEX, (LPWSTR)L"{5C7A4F70-9E4D-11d1-BB3C-00A0C913CAD4}"},
{ICMP_OBJECT_TITLE_INDEX, (LPWSTR)L"{5C7A4F71-9E4D-11d1-BB3C-00A0C913CAD4}"},
{NET_OBJECT_TITLE_INDEX, (LPWSTR)L"{5C7A4F72-9E4D-11d1-BB3C-00A0C913CAD4}"},
{NBT_OBJECT_TITLE_INDEX, (LPWSTR)L"{5C7A4F73-9E4D-11d1-BB3C-00A0C913CAD4}"},
{NBF_OBJECT_TITLE_INDEX, (LPWSTR)L"{5C7A4F74-9E4D-11d1-BB3C-00A0C913CAD4}"},
{NBF_RESOURCE_OBJECT_TITLE_INDEX, (LPWSTR)L"{5C7A4F75-9E4D-11d1-BB3C-00A0C913CAD4}"},
{FTP_FIRST_COUNTER_INDEX, (LPWSTR)L"{5C7A4F76-9E4D-11d1-BB3C-00A0C913CAD4}"},
{RAS_FIRST_COUNTER_INDEX, (LPWSTR)L"{5C7A4F77-9E4D-11d1-BB3C-00A0C913CAD4}"},
{WIN_FIRST_COUNTER_INDEX, (LPWSTR)L"{5C7A4F78-9E4D-11d1-BB3C-00A0C913CAD4}"},
{SFM_FIRST_COUNTER_INDEX, (LPWSTR)L"{5C7A4F79-9E4D-11d1-BB3C-00A0C913CAD4}"},
{ATK_FIRST_COUNTER_INDEX, (LPWSTR)L"{5C7A4F7A-9E4D-11d1-BB3C-00A0C913CAD4}"},
{BH_FIRST_COUNTER_INDEX, (LPWSTR)L"{5C7A4F7B-9E4D-11d1-BB3C-00A0C913CAD4}"},
{TAPI_FIRST_COUNTER_INDEX, (LPWSTR)L"{5C7A4F7C-9E4D-11d1-BB3C-00A0C913CAD4}"},
{LSPL_FIRST_COUNTER_INDEX, (LPWSTR)L"{5C7A4F7D-9E4D-11d1-BB3C-00A0C913CAD4}"},
{JOB_OBJECT_TITLE_INDEX, (LPWSTR)L"{5C7A4F7E-9E4D-11d1-BB3C-00A0C913CAD4}"},
{JOB_DETAILS_OBJECT_TITLE_INDEX, (LPWSTR)L"{5C7A4F7F-9E4D-11d1-BB3C-00A0C913CAD4}"}
// {RSVP_FIRST_COUNTER_INDEX, (LPWSTR)L"{5C7A4F80-9E4D-11d1-BB3C-00A0C913CAD4}"}
};
const PPERFOBJECT_LOOKUP PerfObjectGuids = (const PPERFOBJECT_LOOKUP)&PerfObjectGuidTable[0];
const DWORD dwNumPerfObjectGuids = (sizeof(PerfObjectGuidTable) / sizeof(PerfObjectGuidTable[0]));
LPCWSTR szRawClass = (LPCWSTR)L"Win32_PerfRawData";
LPCWSTR szFmtClass = (LPCWSTR)L"Win32_PerfFormattedData";
LPCWSTR szGenericProviderName = (LPCWSTR)L"NT5_GenericPerfProvider_V1";
LPCWSTR szGenericProviderGuid = (LPCWSTR)L"{FF37A93C-C28E-11D1-AEB6-00C04FB68820}";
__inline
static
PPERF_OBJECT_TYPE
FirstObject (
PPERF_DATA_BLOCK pPerfData
)
{
return ((PPERF_OBJECT_TYPE) ((PBYTE) pPerfData + pPerfData->HeaderLength));
}
__inline
static
PPERF_OBJECT_TYPE
NextObject (
PPERF_OBJECT_TYPE pObject
)
{ // NextObject
return ((PPERF_OBJECT_TYPE) ((PBYTE) pObject + pObject->TotalByteLength));
} // NextObject
__inline
static
PERF_COUNTER_DEFINITION *
FirstCounter(
PERF_OBJECT_TYPE *pObjectDef
)
{
return (PERF_COUNTER_DEFINITION *)
((PCHAR) pObjectDef + pObjectDef->HeaderLength);
}
__inline
static
PERF_COUNTER_DEFINITION *
NextCounter(
PERF_COUNTER_DEFINITION *pCounterDef
)
{
return (PERF_COUNTER_DEFINITION *)
((PCHAR) pCounterDef + pCounterDef->ByteLength);
}
__inline
static
PERF_INSTANCE_DEFINITION *
FirstInstance(
PERF_OBJECT_TYPE * pObjectDef)
{
return (PERF_INSTANCE_DEFINITION * )
((PCHAR) pObjectDef + pObjectDef->DefinitionLength);
}
__inline
static
PERF_INSTANCE_DEFINITION *
NextInstance(
PERF_INSTANCE_DEFINITION * pInstDef)
{
PERF_COUNTER_BLOCK *pCounterBlock;
pCounterBlock = (PERF_COUNTER_BLOCK *)
((PCHAR) pInstDef + pInstDef->ByteLength);
return (PERF_INSTANCE_DEFINITION * )
((PCHAR) pCounterBlock + pCounterBlock->ByteLength);
}
__inline
static
LPCWSTR
GetInstanceName(
PERF_INSTANCE_DEFINITION *pInstDef
)
{
static WCHAR szLocalName[MAX_PATH];
LPWSTR szSrc, szDest;
assert ((pInstDef->NameLength) < (MAX_PATH * sizeof(WCHAR)));
szDest = &szLocalName[0];
szSrc = (LPWSTR) ((PCHAR) pInstDef + pInstDef->NameOffset);
while (*szSrc != 0) {
switch (*szSrc) {
case '\\':
*szDest++ = *szSrc;
*szDest++ = *szSrc++;
break;
default:
*szDest++ = *szSrc++;
};
}
*szDest++ = 0;
return (LPCWSTR)&szLocalName[0];
}
static
__inline
DWORD
AddStringToBuffer (
LPWSTR szBuffer,
LPWSTR szNewString,
LPDWORD pLength,
LPDWORD pTotalLength,
DWORD dwMaxLength
)
{
DWORD dwReturn = ERROR_SUCCESS;
if ((*pTotalLength + *pLength) < dwMaxLength) {
memcpy (&szBuffer[*pTotalLength], szNewString, (*pLength * sizeof(WCHAR)));
*pTotalLength += *pLength;
szBuffer[*pTotalLength] = 0;
} else {
*pTotalLength += *pLength;
dwReturn = ERROR_INSUFFICIENT_BUFFER;
}
return dwReturn;
}
LPCWSTR
FormatPerfName (
LPWSTR szNameIn,
BOOL bHiddenCounter
)
{
static WCHAR szStringBuffer[MAX_PATH];
LPWSTR szSrc, szDest;
BOOL bUpCase = FALSE;
memset(szStringBuffer, 0, sizeof(szStringBuffer));
szDest = &szStringBuffer[0];
if (szNameIn != NULL) {
for (szSrc = szNameIn; *szSrc != 0; szSrc++) {
switch (*szSrc) {
case '%':
lstrcpyW(szDest, (LPCWSTR)L"Percent");
szDest += lstrlenW((LPCWSTR)L"Percent");
bUpCase = TRUE;
break;
case '#':
lstrcpyW(szDest, (LPCWSTR)L"NumberOf");
szDest += lstrlenW((LPCWSTR)L"NumberOf");
bUpCase = TRUE;
break;
case '/':
lstrcpyW(szDest, (LPCWSTR)L"Per");
szDest += lstrlenW((LPCWSTR)L"Per");
bUpCase = TRUE;
break;
case ' ':
case ')':
case '(':
case '.':
case '-':
// skip
bUpCase = TRUE;
break;
default:
if (bUpCase) {
*szDest++ = towupper(*szSrc);
bUpCase = FALSE;
} else {
*szDest++ = *szSrc;
}
break;
}
}
if (bHiddenCounter) {
lstrcpyW (szDest, (LPCWSTR)L"_Base");
szDest += lstrlenW((LPCWSTR)L"_Base");
}
}
*szDest = 0;
return (LPCWSTR)&szStringBuffer[0];
}
PERFTYPE_LOOKUP *
GetPerfTypeInfo (
DWORD dwType
)
{
DWORD dwIndex = 0;
while (dwIndex < dwNumPerfTypes) {
if (dwType == (DWORD)PerfTypes[dwIndex].PerfType) {
return (&PerfTypes[dwIndex]);
} else {
dwIndex++;
}
}
return NULL;
}
LPCWSTR
GetPerfObjectGuid (
DWORD dwObjectId
)
{
DWORD dwIndex = 0;
while (dwIndex < dwNumPerfObjectGuids) {
if (dwObjectId == (DWORD)PerfObjectGuids[dwIndex].PerfObjectId) {
return ((LPCWSTR)PerfObjectGuids[dwIndex].GuidString);
} else {
dwIndex++;
}
}
return (LPCWSTR)L"";
}
DWORD
GenerateMofHeader (
LPWSTR szBuffer, // string buffer
LPCWSTR szComputerName,
LPDWORD pcchBufferSize // max size in characters in, size used out
)
{
WCHAR szMachineName[MAX_PATH];
WCHAR szTempBuffer[MAX_PATH];
DWORD dwTotalLength = 0;
DWORD dwLength = sizeof(szMachineName)/sizeof(szMachineName[0]);
SYSTEMTIME st;
DWORD dwReturn = ERROR_SUCCESS;
if (szComputerName == NULL) {
GetComputerNameW(&szMachineName[0], &dwLength);
} else if (szComputerName[0] == 0){
GetComputerNameW(&szMachineName[0], &dwLength);
} else {
lstrcpyW (szMachineName, szComputerName);
}
GetLocalTime( &st );
dwLength = swprintf (szTempBuffer, (LPCWSTR)L"\x0D\x0A//WBEM Performance Data MOF Dumped from machine %ws on %2.2d/%2.2d/%2.2d %2.2d:%2.2d:%2.2d\x0D\x0A",
szMachineName,
st.wMonth, st.wDay, (st.wYear % 100),
st.wHour, st.wMinute, st.wSecond);
dwReturn = AddStringToBuffer (
szBuffer, szTempBuffer, &dwLength, &dwTotalLength, *pcchBufferSize);
dwLength = swprintf (szTempBuffer, (LPCWSTR)L"\x0D\x0A#pragma autorecover");
dwReturn = AddStringToBuffer (
szBuffer, szTempBuffer, &dwLength, &dwTotalLength, *pcchBufferSize);
dwLength = swprintf (szTempBuffer, (LPCWSTR)L"\x0D\x0A#pragma namespace (\"\\\\\\\\.\\\\Root\\\\Default\")");
dwReturn = AddStringToBuffer (
szBuffer, szTempBuffer, &dwLength, &dwTotalLength, *pcchBufferSize);
dwLength = swprintf (szTempBuffer, (LPCWSTR)L"\x0D\x0A#pragma classflags(\"forceupdate\")\x0D\x0A");
dwReturn = AddStringToBuffer (
szBuffer, szTempBuffer, &dwLength, &dwTotalLength, *pcchBufferSize);
dwLength = swprintf (szTempBuffer, (LPCWSTR)L"\x0D\x0Aqualifier vendor:ToInstance;");
dwReturn = AddStringToBuffer (
szBuffer, szTempBuffer, &dwLength, &dwTotalLength, *pcchBufferSize);
dwLength = swprintf (szTempBuffer, (LPCWSTR)L"\x0D\x0Aqualifier classguid:ToInstance;");
dwReturn = AddStringToBuffer (
szBuffer, szTempBuffer, &dwLength, &dwTotalLength, *pcchBufferSize);
dwLength = swprintf (szTempBuffer, (LPCWSTR)L"\x0D\x0Aqualifier locale:ToInstance;");
dwReturn = AddStringToBuffer (
szBuffer, szTempBuffer, &dwLength, &dwTotalLength, *pcchBufferSize);
dwLength = swprintf (szTempBuffer, (LPCWSTR)L"\x0D\x0Aqualifier display:ToInstance;");
dwReturn = AddStringToBuffer (
szBuffer, szTempBuffer, &dwLength, &dwTotalLength, *pcchBufferSize);
dwLength = swprintf (szTempBuffer, (LPCWSTR)L"\x0D\x0Aqualifier perfindex:ToInstance;");
dwReturn = AddStringToBuffer (
szBuffer, szTempBuffer, &dwLength, &dwTotalLength, *pcchBufferSize);
dwLength = swprintf (szTempBuffer, (LPCWSTR)L"\x0D\x0Aqualifier helpindex:ToInstance;");
dwReturn = AddStringToBuffer (
szBuffer, szTempBuffer, &dwLength, &dwTotalLength, *pcchBufferSize);
dwLength = swprintf (szTempBuffer, (LPCWSTR)L"\x0D\x0Aqualifier perfdetail:ToInstance;");
dwReturn = AddStringToBuffer (
szBuffer, szTempBuffer, &dwLength, &dwTotalLength, *pcchBufferSize);
dwLength = swprintf (szTempBuffer, (LPCWSTR)L"\x0D\x0Aqualifier countertype:ToInstance;");
dwReturn = AddStringToBuffer (
szBuffer, szTempBuffer, &dwLength, &dwTotalLength, *pcchBufferSize);
dwLength = swprintf (szTempBuffer, (LPCWSTR)L"\x0D\x0Aqualifier perfdefault:ToInstance;");
dwReturn = AddStringToBuffer (
szBuffer, szTempBuffer, &dwLength, &dwTotalLength, *pcchBufferSize);
dwLength = swprintf (szTempBuffer, (LPCWSTR)L"\x0D\x0Aqualifier defaultscale:ToInstance;");
dwReturn = AddStringToBuffer (
szBuffer, szTempBuffer, &dwLength, &dwTotalLength, *pcchBufferSize);
dwLength = swprintf (szTempBuffer, (LPCWSTR)L"\x0D\x0A");
dwReturn = AddStringToBuffer (
szBuffer, szTempBuffer, &dwLength, &dwTotalLength, *pcchBufferSize);
*pcchBufferSize = dwTotalLength;
return dwReturn;
}
DWORD
GenerateMofObject (
LPWSTR szBuffer,
LPDWORD pcchBufferSize,
PPERF_COUNTER_DLL_INFO pPcDllInfo,
PERF_OBJECT_TYPE *pPerfObject,
LPWSTR *lpCounterText, // name strings array
LPWSTR *lpDisplayText, // Localized name strings array
DWORD dwFlags
)
{
BOOL bRawDefinition = (dwFlags & WM_GMO_RAW_DEFINITION);
BOOL bCostlyObject = (dwFlags & WM_GMO_COSTLY_OBJECT);
BOOL bDefaultObject = (dwFlags & WM_GMO_DEFAULT_OBJECT);
WCHAR szTempBuffer[MAX_PATH];
DWORD dwTotalLength = 0;
DWORD dwLength;
DWORD dwReturn = ERROR_SUCCESS;
dwLength = swprintf (szTempBuffer, (LPCWSTR)L"\x0D\x0A\x0D\x0A[");
dwReturn = AddStringToBuffer (
szBuffer, szTempBuffer, &dwLength, &dwTotalLength, *pcchBufferSize);
if (pPerfObject->NumInstances == PERF_NO_INSTANCES) {
dwLength = swprintf (szTempBuffer, (LPCWSTR)L"\x0D\x0A singleton,");
dwReturn = AddStringToBuffer (
szBuffer, szTempBuffer, &dwLength, &dwTotalLength, *pcchBufferSize);
}
if (bCostlyObject) {
dwLength = swprintf (szTempBuffer, (LPCWSTR)L"\x0D\x0A costly,");
dwReturn = AddStringToBuffer (
szBuffer, szTempBuffer, &dwLength, &dwTotalLength, *pcchBufferSize);
}
if (bDefaultObject) {
dwLength = swprintf (szTempBuffer, (LPCWSTR)L"\x0D\x0A perfdefault,");
dwReturn = AddStringToBuffer (
szBuffer, szTempBuffer, &dwLength, &dwTotalLength, *pcchBufferSize);
}
if (pPcDllInfo != NULL) {
dwLength = swprintf (szTempBuffer, (LPCWSTR)L"\x0D\x0A dynamic,");
dwReturn = AddStringToBuffer (
szBuffer, szTempBuffer, &dwLength, &dwTotalLength, *pcchBufferSize);
if ((dwReturn == ERROR_SUCCESS) && (pPcDllInfo->szWbemProviderName != NULL)) {
dwLength = swprintf (szTempBuffer, (LPCWSTR)L"\x0D\x0A provider(\"%s\"),",
szGenericProviderName);
dwReturn = AddStringToBuffer (
szBuffer, szTempBuffer, &dwLength, &dwTotalLength, *pcchBufferSize);
} else {
// if this structure is used, all fields must be present
dwReturn = ERROR_INVALID_PARAMETER;
}
if ((dwReturn == ERROR_SUCCESS) && (pPcDllInfo->szRegistryKey != NULL)) {
dwLength = swprintf (szTempBuffer, (LPCWSTR)L"\x0D\x0A registrykey(\"%s\"),",
pPcDllInfo->szRegistryKey);
dwReturn = AddStringToBuffer (
szBuffer, szTempBuffer, &dwLength, &dwTotalLength, *pcchBufferSize);
} else {
// if this structure is used, all fields must be present
dwReturn = ERROR_INVALID_PARAMETER;
}
if ((dwReturn == ERROR_SUCCESS) && (pPcDllInfo->szClassGuid != NULL)) {
if (pPcDllInfo->szClassGuid[0] != 0) {
dwLength = swprintf (szTempBuffer, (LPCWSTR)L"\x0D\x0A classguid(\"%s\"),",
pPcDllInfo->szClassGuid);
dwReturn = AddStringToBuffer (
szBuffer, szTempBuffer, &dwLength, &dwTotalLength, *pcchBufferSize);
}
} else {
// if this structure is used, all fields must be present
dwReturn = ERROR_INVALID_PARAMETER;
}
}
dwLength = swprintf (szTempBuffer, (LPCWSTR)L"\x0D\x0A locale(\"0x%4.4x\"),", (GetSystemDefaultLCID() & 0x0000FFFF));
dwReturn = AddStringToBuffer (
szBuffer, szTempBuffer, &dwLength, &dwTotalLength, *pcchBufferSize);
dwLength = swprintf (szTempBuffer, (LPCWSTR)L"\x0D\x0A display(\"%ws\"),",
lpDisplayText[pPerfObject->ObjectNameTitleIndex]);
dwReturn = AddStringToBuffer (
szBuffer, szTempBuffer, &dwLength, &dwTotalLength, *pcchBufferSize);
dwLength = swprintf (szTempBuffer, (LPCWSTR)L"\x0D\x0A perfindex(%d),", pPerfObject->ObjectNameTitleIndex);
dwReturn = AddStringToBuffer (
szBuffer, szTempBuffer, &dwLength, &dwTotalLength, *pcchBufferSize);
dwLength = swprintf (szTempBuffer, (LPCWSTR)L"\x0D\x0A helpindex(%d),", pPerfObject->ObjectHelpTitleIndex);
dwReturn = AddStringToBuffer (
szBuffer, szTempBuffer, &dwLength, &dwTotalLength, *pcchBufferSize);
dwLength = swprintf (szTempBuffer, (LPCWSTR)L"\x0D\x0A perfdetail(%d)", pPerfObject->DetailLevel);
dwReturn = AddStringToBuffer (
szBuffer, szTempBuffer, &dwLength, &dwTotalLength, *pcchBufferSize);
dwLength = swprintf (szTempBuffer, (LPCWSTR)L"\x0D\x0A]%sclass Win32Perf_%ws%ws : %ws\x0D\x0A{",
(LPCWSTR)L"\x0D\x0A", (bRawDefinition ? (LPCWSTR)L"Raw" : (LPCWSTR)L""),
FormatPerfName(lpCounterText[pPerfObject->ObjectNameTitleIndex],FALSE),
(bRawDefinition ? szRawClass : szFmtClass));
dwReturn = AddStringToBuffer (
szBuffer, szTempBuffer, &dwLength, &dwTotalLength, *pcchBufferSize);
// add an entry for the instance name here if the object has instances
if (pPerfObject->NumInstances != PERF_NO_INSTANCES) {
dwLength = swprintf (szTempBuffer, (LPCWSTR)L"\x0D\x0A [key]\x0D\x0A string\tName;");
dwReturn = AddStringToBuffer (
szBuffer, szTempBuffer, &dwLength, &dwTotalLength, *pcchBufferSize);
}
*pcchBufferSize = dwTotalLength;
return dwReturn;
}
DWORD
GenerateMofObjectTail (
LPWSTR szBuffer,
LPDWORD pcchBufferSize
)
{
WCHAR szTempBuffer[MAX_PATH];
DWORD dwTotalLength = 0;
DWORD dwLength;
DWORD dwReturn = ERROR_SUCCESS;
dwLength = swprintf (szTempBuffer, (LPCWSTR)L"\x0D\x0A};\x0D\x0A");
dwReturn = AddStringToBuffer (
szBuffer, szTempBuffer, &dwLength, &dwTotalLength, *pcchBufferSize);
*pcchBufferSize = dwTotalLength;
return dwReturn;
}
DWORD
GenerateMofCounter (
LPWSTR szBuffer,
LPDWORD pcchBufferSize,
PERF_COUNTER_DEFINITION *pPerfCounter,
LPWSTR *lpCounterText, // name strings array
LPWSTR *lpDisplayText, // Localized name strings array
DWORD dwFlags
)
{
WCHAR szTempBuffer[MAX_PATH];
DWORD dwTotalLength = 0;
DWORD dwLength;
DWORD dwReturn = ERROR_SUCCESS;
BOOL bRawDefinition = (dwFlags & WM_GMO_RAW_DEFINITION);
BOOL bDefaultCounter = (dwFlags & WM_GMO_DEFAULT_COUNTER);
PERFTYPE_LOOKUP *pType;
pType = GetPerfTypeInfo (pPerfCounter->CounterType);
if (pType != NULL) {
if (bRawDefinition || IsDisplayableType(pPerfCounter->CounterType)) {
dwLength = swprintf (szTempBuffer, (LPCWSTR)L"\x0D\x0A [");
dwReturn = AddStringToBuffer (
szBuffer, szTempBuffer, &dwLength, &dwTotalLength, *pcchBufferSize);
if (bDefaultCounter) {
dwLength = swprintf (szTempBuffer, (LPCWSTR)L"\x0D\x0A perfdefault,");
dwReturn = AddStringToBuffer (
szBuffer, szTempBuffer, &dwLength, &dwTotalLength, *pcchBufferSize);
}
dwLength = swprintf (szTempBuffer, (LPCWSTR)L"\x0D\x0A display(\"%ws\"),",
lpDisplayText[pPerfCounter->CounterNameTitleIndex]);
dwReturn = AddStringToBuffer (
szBuffer, szTempBuffer, &dwLength, &dwTotalLength, *pcchBufferSize);
dwLength = swprintf (szTempBuffer, (LPCWSTR)L"\x0D\x0A countertype(%u),", pPerfCounter->CounterType);
dwReturn = AddStringToBuffer (
szBuffer, szTempBuffer, &dwLength, &dwTotalLength, *pcchBufferSize);
dwLength = swprintf (szTempBuffer, (LPCWSTR)L"\x0D\x0A perfindex(%d),", pPerfCounter->CounterNameTitleIndex);
dwReturn = AddStringToBuffer (
szBuffer, szTempBuffer, &dwLength, &dwTotalLength, *pcchBufferSize);
dwLength = swprintf (szTempBuffer, (LPCWSTR)L"\x0D\x0A helpindex(%d),", pPerfCounter->CounterHelpTitleIndex);
dwReturn = AddStringToBuffer (
szBuffer, szTempBuffer, &dwLength, &dwTotalLength, *pcchBufferSize);
dwLength = swprintf (szTempBuffer, (LPCWSTR)L"\x0D\x0A defaultscale(%d),", pPerfCounter->DefaultScale);
dwReturn = AddStringToBuffer (
szBuffer, szTempBuffer, &dwLength, &dwTotalLength, *pcchBufferSize);
dwLength = swprintf (szTempBuffer, (LPCWSTR)L"\x0D\x0A perfdetail(%d)", pPerfCounter->DetailLevel);
dwReturn = AddStringToBuffer (
szBuffer, szTempBuffer, &dwLength, &dwTotalLength, *pcchBufferSize);
dwLength = swprintf (szTempBuffer, (LPCWSTR)L"\x0D\x0A ]\x0D\x0A %ws\t%ws;\x0D\x0A",
(bRawDefinition ? pType->RawType : pType->FmtType),
FormatPerfName (lpCounterText[pPerfCounter->CounterNameTitleIndex],
(IsDisplayableType(pPerfCounter->CounterType) ? FALSE : TRUE)));
dwReturn = AddStringToBuffer (
szBuffer, szTempBuffer, &dwLength, &dwTotalLength, *pcchBufferSize);
// return size used
*pcchBufferSize = dwTotalLength;
}
} else {
dwReturn = ERROR_FILE_NOT_FOUND;
}
return dwReturn;
}
DWORD
GenerateMofInstances (
LPWSTR szBuffer,
LPDWORD pcchBufferSize,
PERF_DATA_BLOCK * pPerfDataBlock,
PERF_OBJECT_TYPE * pPerfObject,
LPWSTR * lpCounterText, // name strings array
LPWSTR * lpDisplayText, // Localized name strings array
DWORD dwFlags
)
{
WCHAR szTempBuffer[MAX_PATH];
DWORD dwTotalLength = 0;
DWORD dwLength;
DWORD dwReturn = ERROR_SUCCESS;
BOOL bRawDefinition = (dwFlags & WM_GMO_RAW_DEFINITION);
//
// for each instance, dump all the counter data for that instance
//
PERF_INSTANCE_DEFINITION * pThisInstance;
PERF_INSTANCE_DEFINITION * pParentInstance;
PERF_OBJECT_TYPE * pParentObject;
PERF_COUNTER_DEFINITION * pThisCounter;
DWORD dwParentInstIdx;
DWORD dwObjectIdx;
DWORD dwInstanceIndex;
DWORD dwCounterCount;
LPDWORD pValue;
LONGLONG llTimeStamp;
UNREFERENCED_PARAMETER (lpDisplayText);
if (pPerfObject->NumInstances == PERF_NO_INSTANCES) {
dwLength = swprintf (szTempBuffer, (LPCWSTR)L"\x0D\x0A\x0D\x0Ainstance of Win32Perf_%ws%ws\x0D\x0A{",
(bRawDefinition ? (LPCWSTR)L"Raw" : (LPCWSTR)L""),
FormatPerfName(lpCounterText[pPerfObject->ObjectNameTitleIndex], FALSE));
dwReturn = AddStringToBuffer (
szBuffer, szTempBuffer, &dwLength, &dwTotalLength, *pcchBufferSize);
GetSystemTimeAsFileTime ((LPFILETIME)&llTimeStamp);
dwLength = swprintf (szTempBuffer, (LPCWSTR)L"\x0D\x0A Timestamp = ");
dwReturn = AddStringToBuffer (
szBuffer, szTempBuffer, &dwLength, &dwTotalLength, *pcchBufferSize);
pValue = (LPDWORD)&llTimeStamp;
pValue++;
dwLength = swprintf (szTempBuffer, (LPCWSTR)L"0x%8.8x", *pValue);
dwReturn = AddStringToBuffer (
szBuffer, szTempBuffer, &dwLength, &dwTotalLength, *pcchBufferSize);
pValue--;
dwLength = swprintf (szTempBuffer, (LPCWSTR)L"%8.8x;", *pValue);
dwReturn = AddStringToBuffer (
szBuffer, szTempBuffer, &dwLength, &dwTotalLength, *pcchBufferSize);
pThisCounter = FirstCounter(pPerfObject);
assert (pThisCounter != NULL);
for (dwCounterCount = 0; dwCounterCount < pPerfObject->NumCounters; dwCounterCount++) {
dwLength = swprintf (szTempBuffer, (LPCWSTR)L"\x0D\x0A %ws = ",
FormatPerfName (lpCounterText[pThisCounter->CounterNameTitleIndex],
(IsDisplayableType(pThisCounter->CounterType) ? FALSE : TRUE)));
dwReturn = AddStringToBuffer (
szBuffer, szTempBuffer, &dwLength, &dwTotalLength, *pcchBufferSize);
pValue = (LPDWORD)pPerfObject;
pValue = (LPDWORD)((LPBYTE)pValue + pPerfObject->DefinitionLength);
pValue = (LPDWORD)((LPBYTE)pValue + pThisCounter->CounterOffset);
if (pThisCounter->CounterSize == 8) {
pValue++;
dwLength = swprintf (szTempBuffer, (LPCWSTR)L"0x%8.8x", *pValue);
dwReturn = AddStringToBuffer (
szBuffer, szTempBuffer, &dwLength, &dwTotalLength, *pcchBufferSize);
pValue--;
dwLength = swprintf (szTempBuffer, (LPCWSTR)L"%8.8x;", *pValue);
dwReturn = AddStringToBuffer (
szBuffer, szTempBuffer, &dwLength, &dwTotalLength, *pcchBufferSize);
} else {
dwLength = swprintf (szTempBuffer, (LPCWSTR)L"0x%8.8x;", *pValue);
dwReturn = AddStringToBuffer (
szBuffer, szTempBuffer, &dwLength, &dwTotalLength, *pcchBufferSize);
}
pThisCounter = NextCounter (pThisCounter);
}
dwLength = swprintf (szTempBuffer, (LPCWSTR)L"\x0D\x0A};\x0D\x0A");
dwReturn = AddStringToBuffer (
szBuffer, szTempBuffer, &dwLength, &dwTotalLength, *pcchBufferSize);
} else {
// do the multiple instance case here
pThisInstance = FirstInstance(pPerfObject);
for (dwInstanceIndex = 0; dwInstanceIndex < (DWORD)pPerfObject->NumInstances; dwInstanceIndex++) {
dwLength = swprintf (szTempBuffer, (LPCWSTR)L"\x0D\x0A\x0D\x0Ainstance of Win32Perf_%ws%ws\x0D\x0A{",
(bRawDefinition ? (LPCWSTR)L"Raw" : (LPCWSTR)L""),
FormatPerfName(lpCounterText[pPerfObject->ObjectNameTitleIndex],FALSE));
dwReturn = AddStringToBuffer (
szBuffer, szTempBuffer, &dwLength, &dwTotalLength, *pcchBufferSize);
if (pThisInstance->ParentObjectTitleIndex > 0) {
// get parent instance name
pParentObject = FirstObject(pPerfDataBlock);
dwObjectIdx = 0;
while ((pParentObject != NULL) &&
(pParentObject->ObjectNameTitleIndex != pThisInstance->ParentObjectTitleIndex) &&
(dwObjectIdx < pPerfDataBlock->NumObjectTypes)) {
pParentObject = NextObject (pParentObject);
dwObjectIdx++;
}
if (pParentObject->ObjectNameTitleIndex == pThisInstance->ParentObjectTitleIndex) {
pParentInstance = FirstInstance (pParentObject);
for (dwParentInstIdx = 0;
dwParentInstIdx < pThisInstance->ParentObjectInstance;
dwParentInstIdx++) {
pParentInstance = NextInstance(pParentInstance);
}
dwLength = swprintf (szTempBuffer, (LPCWSTR)L"\x0D\x0A Name = \"%ws/",
GetInstanceName (pParentInstance));
dwReturn = AddStringToBuffer (
szBuffer, szTempBuffer, &dwLength, &dwTotalLength, *pcchBufferSize);
dwLength = swprintf (szTempBuffer, (LPCWSTR)L"%ws\";", GetInstanceName (pThisInstance));
dwReturn = AddStringToBuffer (
szBuffer, szTempBuffer, &dwLength, &dwTotalLength, *pcchBufferSize);
} else {
dwLength = swprintf (szTempBuffer, (LPCWSTR)L"\x0D\x0A Name = \"%ws\";",
GetInstanceName (pThisInstance));
dwReturn = AddStringToBuffer (
szBuffer, szTempBuffer, &dwLength, &dwTotalLength, *pcchBufferSize);
}
} else {
dwLength = swprintf (szTempBuffer, (LPCWSTR)L"\x0D\x0A Name = \"%ws\";",
GetInstanceName (pThisInstance));
dwReturn = AddStringToBuffer (
szBuffer, szTempBuffer, &dwLength, &dwTotalLength, *pcchBufferSize);
}
pThisCounter = FirstCounter(pPerfObject);
assert (pThisCounter != NULL);
for (dwCounterCount = 0; dwCounterCount < pPerfObject->NumCounters; dwCounterCount++) {
assert (pThisCounter != NULL);
dwLength = swprintf (szTempBuffer, (LPCWSTR)L"\x0D\x0A %ws = ",
FormatPerfName (lpCounterText[pThisCounter->CounterNameTitleIndex],
(IsDisplayableType(pThisCounter->CounterType) ? FALSE : TRUE)));
dwReturn = AddStringToBuffer (
szBuffer, szTempBuffer, &dwLength, &dwTotalLength, *pcchBufferSize);
pValue = (LPDWORD)pThisInstance;
pValue = (LPDWORD)((LPBYTE)pValue + pThisInstance->ByteLength);
pValue = (LPDWORD)((LPBYTE)pValue + pThisCounter->CounterOffset);
if (pThisCounter->CounterSize == 8) {
pValue++;
dwLength = swprintf (szTempBuffer, (LPCWSTR)L"0x%8.8x", *pValue);
dwReturn = AddStringToBuffer (
szBuffer, szTempBuffer, &dwLength, &dwTotalLength, *pcchBufferSize);
pValue--;
dwLength = swprintf (szTempBuffer, (LPCWSTR)L"%8.8x;", *pValue);
dwReturn = AddStringToBuffer (
szBuffer, szTempBuffer, &dwLength, &dwTotalLength, *pcchBufferSize);
} else {
dwLength = swprintf (szTempBuffer, (LPCWSTR)L"0x%8.8x;", *pValue);
dwReturn = AddStringToBuffer (
szBuffer, szTempBuffer, &dwLength, &dwTotalLength, *pcchBufferSize);
}
pThisCounter = NextCounter (pThisCounter);
}
dwLength = swprintf (szTempBuffer, (LPCWSTR)L"\x0D\x0A};\x0D\x0A");
dwReturn = AddStringToBuffer (
szBuffer, szTempBuffer, &dwLength, &dwTotalLength, *pcchBufferSize);
pThisInstance = NextInstance(pThisInstance);
}
}
*pcchBufferSize = dwTotalLength;
return dwReturn;
}