2025-04-27 07:49:33 -04:00

253 lines
6.9 KiB
C++

//***************************************************************************
//
// Copyright (c) 1997-2001 Microsoft Corporation, All Rights Reserved
//
// File: dpdetail.cpp
//
// Description:
// This file implements the DiskPerfDetails() routine which
// demonstrates how to enumerate properties for the DiskPerf
// class and instances.
//
// Part of : WMIDiskPerf
//
// History:
//
//***************************************************************************
#include <wbemidl.h>
#include <stdio.h>
void ShowPropInfo( IWbemClassObject *pInst );
char PropListHeader[] =
"DiskPerf Property Descriptions:\n\n"
"WMI Data ID\tProperty\tDescription\n"
"======================================="
"=======================================\n"
"";
//==============================================================================
//
// DiskPerfDetails( IWbemServices * pIWbemServices )
//
//==============================================================================
void DiskPerfDetails( IWbemServices * pIWbemServices )
{
HRESULT hr;
long lLower, lUpper, lCount;
SAFEARRAY *psaNames = NULL;
BSTR PropName = NULL;
VARIANT vVal;
ULONG uReturned;
IEnumWbemClassObject *pEnum = NULL;
IWbemClassObject *pPerfData = NULL;
IWbemClassObject *pPerfInst = NULL;
IWbemQualifierSet *pQualSet = NULL;
VariantInit( &vVal );
// Alloc class name string for DiskPerf
BSTR PerfClass = SysAllocString( L"MSDiskDriver_PerformanceData" );
// Get the Descriptions for the WMIDataId properties in the Embedded class.
// Here the object info for the Class - MSDiskDriver_PerformanceData is
// retrieved and displayed.
// Collect object information for PerfClass
hr = pIWbemServices->GetObject( PerfClass,
0L,
NULL,
&pPerfData,
NULL );
SysFreeString( PerfClass );
if ( hr == WBEM_NO_ERROR )
{
// show the property description list header
printf( PropListHeader );
// Load up a safearray of property names
if ( ( pPerfData->GetNames( NULL,
WBEM_FLAG_ALWAYS | WBEM_FLAG_NONSYSTEM_ONLY,
NULL,
&psaNames ) ) == WBEM_NO_ERROR )
{
// Get the upper and lower bounds of the Names array
if ( ( hr = SafeArrayGetLBound( psaNames, 1, &lLower ) ) == S_OK )
{
hr = SafeArrayGetUBound( psaNames, 1, &lUpper );
}
if ( hr != S_OK )
{
printf( "Problem with property name array.\n" );
}
else
{
BSTR WmiQual = SysAllocString( L"WmiDataId" );
BSTR DescQual = SysAllocString( L"Description" );
UINT uWmiId;
for ( lCount = lLower; lCount <= lUpper; lCount++ )
{
// get the property name for this element
if ( ( SafeArrayGetElement( psaNames,
&lCount,
&PropName)) == S_OK )
{
if ( ( pPerfData->GetPropertyQualifierSet( PropName, &pQualSet ) ) == WBEM_NO_ERROR )
{
// check to see if the property is a WMI data Item and save its description
// these are the DiskPerf counters
if ( ( pQualSet->Get( WmiQual, 0L, &vVal, NULL ) ) == WBEM_NO_ERROR )
{
uWmiId = vVal.lVal;
VariantClear( &vVal );
if ( ( pQualSet->Get( DescQual, 0L, &vVal, NULL ) ) == WBEM_NO_ERROR )
{
wprintf( L"( %d )\t\t%s\t%s\n", uWmiId, PropName, vVal.bstrVal );
VariantClear( &vVal );
}
else // No Description qualifier available
wprintf( L"( %d )\t\t%s\n", uWmiId, PropName);
}
pQualSet->Release( );
pQualSet = NULL;
}
SysFreeString( PropName );
}
}
SysFreeString( WmiQual );
SysFreeString( DescQual );
}
SafeArrayDestroy( psaNames );
}
pPerfData->Release( );
}
// Now that the data class info is displayed, go get the values for all the
// disk instances
PerfClass = SysAllocString( L"MSDiskDriver_Performance" );
// Create enumerator for all disk instances
hr = pIWbemServices->CreateInstanceEnum( PerfClass,
WBEM_FLAG_SHALLOW,
NULL,
&pEnum );
SysFreeString( PerfClass );
if ( hr == WBEM_NO_ERROR )
{
while ( pEnum->Next( INFINITE,
1,
&pPerfInst,
&uReturned ) == WBEM_NO_ERROR )
{
// Explicitly get the properties of InstanceName and Active state
// Get the Instance Name string
PropName = SysAllocString( L"InstanceName" );
if ( ( pPerfInst->Get( PropName,
0L,
&vVal,
NULL, NULL ) ) == WBEM_NO_ERROR )
{
wprintf( L"\n%s\n", vVal.bstrVal );
VariantClear( &vVal );
}
// Get Active status boolean
PropName = wcscpy( PropName, L"Active" );
if ( ( pPerfInst->Get( PropName,
0L,
&vVal,
NULL, NULL ) ) == WBEM_NO_ERROR )
{
wprintf( L"\t%s\t\t= %s\n", PropName, vVal.boolVal ? L"TRUE" : L"FALSE" );
VariantClear( &vVal );
}
// Get the performance data embedded object
PropName = wcscpy( PropName, L"PerfData" );
if ( ( pPerfInst->Get( PropName,
0L,
&vVal,
NULL, NULL ) ) == WBEM_NO_ERROR )
{
if ( vVal.punkVal->QueryInterface( IID_IWbemClassObject,
(PVOID *) &pPerfData ) == S_OK )
{
// display the WMI data item from this instance
ShowPropInfo( pPerfData );
pPerfData->Release( );
}
VariantClear( &vVal );
}
SysFreeString( PropName );
pPerfInst->Release( );
}
pEnum->Release( );
}
else
{
printf( "Can't enumerate DiskPerf instances!\n" );
}
}
// Display property names and values for an instance.
void ShowPropInfo( IWbemClassObject *pInst )
{
HRESULT hr;
VARIANT vVal;
BSTR PropName;
if ( pInst )
{
hr = pInst->BeginEnumeration( WBEM_FLAG_LOCAL_ONLY );
while ( hr == WBEM_NO_ERROR )
{
if ( ( hr = pInst->Next( 0, &PropName,
&vVal,
NULL, NULL ) ) == WBEM_NO_ERROR )
{
switch( vVal.vt )
{
case VT_I4:
{
wprintf( L"\t%s\t= %d\n", PropName, vVal.lVal );
}
break;
case VT_BSTR:
{
wprintf( L"\t%s\t= %s\n", PropName, vVal.bstrVal );
}
break;
default:
{
wprintf( L"\t%s\t= NULL\n", PropName );
}
break;
}
VariantClear( &vVal );
SysFreeString( PropName );
}
}
pInst->EndEnumeration( );
}
}