|
|
//////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2000 Microsoft Corporation
//
// Module Name:
// WmiHelpers.cpp
//
// Description:
// This file contains the implementation of WMI help functions.
//
// Documentation:
//
// Header File:
// WmiHelpers.h
//
// Maintained By:
// Galen Barbee (GalenB) 27-Apr-2000
//
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
// Include Files
//////////////////////////////////////////////////////////////////////////////
#include "pch.h"
#include "PrivateInterfaces.h"
#include "CEnumClusCfgNetworks.h"
#include <WinIOCTL.h>
//////////////////////////////////////////////////////////////////////////////
// Constant Definitions
//////////////////////////////////////////////////////////////////////////////
const WCHAR g_szPhysicalDriveFormat [] = { L"\\\\.\\PHYSICALDRIVE%lu\0" };
//////////////////////////////////////////////////////////////////////////////
//++
//
// HrGetWMIProperty
//
// Description:
// Get a named property from a WMI object.
//
// Arguments:
//
// Return Value:
// S_OK
// Success
//
// E_POINTER
// The IWbemClassObject param is NULL.
//
// Remarks:
// None.
//
//--
//////////////////////////////////////////////////////////////////////////////
HRESULT HrGetWMIProperty( IWbemClassObject * pWMIObjectIn, LPCWSTR pcszPropertyNameIn, ULONG ulPropertyTypeIn, VARIANT * pVariantOut ) { TraceFunc1( "pcszPropertyNameIn = '%ws'", pcszPropertyNameIn );
Assert( pWMIObjectIn != NULL ); Assert( pcszPropertyNameIn != NULL ); Assert( pVariantOut != NULL );
HRESULT hr; BSTR bstrProp = NULL;
VariantClear( pVariantOut );
bstrProp = TraceSysAllocString( pcszPropertyNameIn ); if ( bstrProp == NULL ) { hr = THR( E_OUTOFMEMORY ); goto Cleanup; } // if:
hr = THR( pWMIObjectIn->Get( bstrProp, 0L, pVariantOut, NULL, NULL ) ); if ( FAILED( hr ) ) { LogMsg( L"[SRV] Could not get the value for WMI property '%ws'. (hr = %#08x)", bstrProp, hr ); goto Cleanup; } // if:
//
// KB: 28-JUN-2000 GalenB
//
// For reasons only known to WMI boolean properties are of type VT_NULL instead of
// VT_BOOL when they are not set or false...
//
// KB: 27-JUL-2000 GalenB
//
// Added the special case check for signature. We know that signature will be NULL
// when the spindle is under ClusDisk control...
//
if ( ( ulPropertyTypeIn != VT_BOOL ) && ( _wcsicmp( bstrProp, L"Signature" ) != 0 ) ) { if ( pVariantOut->vt != ulPropertyTypeIn ) { LogMsg( L"[SRV] Variant type for WMI Property '%ws' was supposed to be '%d', but was '%d' instead.", pcszPropertyNameIn, ulPropertyTypeIn, pVariantOut->vt ); hr = THR( E_PROPTYPEMISMATCH ); } // if:
} // if:
Cleanup:
TraceSysFreeString( bstrProp );
HRETURN( hr );
} //*** HrGetWMIProperty()
//////////////////////////////////////////////////////////////////////////////
//++
//
// HrSetWbemServices
//
// Description:
// Set the WBemServices object into the passed in punk.
//
// Arguments:
//
// Return Value:
// S_OK
// Success
//
// E_POINTER
// The IUnknown param is NULL.
//
// Remarks:
// None.
//
//--
//////////////////////////////////////////////////////////////////////////////
HRESULT HrSetWbemServices( IUnknown * punkIn, IWbemServices * pIWbemServicesIn ) { TraceFunc( "" ); Assert( punkIn != NULL );
HRESULT hr; IClusCfgWbemServices * pWbemProvider;
if ( punkIn == NULL ) { hr = THR( E_POINTER ); goto Exit; } // if:
hr = punkIn->TypeSafeQI( IClusCfgWbemServices, &pWbemProvider ); if ( SUCCEEDED( hr ) ) { hr = THR( pWbemProvider->SetWbemServices( pIWbemServicesIn ) ); pWbemProvider->Release(); } // if:
else if ( hr == E_NOINTERFACE ) { hr = S_OK; } // else if:
else { THR( hr ); }
Exit:
HRETURN( hr );
} //*** HrSetWbemServices()
//////////////////////////////////////////////////////////////////////////////
//++
//
// HrSetInitialize
//
// Description:
// Initialize the passed in punk.
//
// Arguments:
//
// Return Value:
// S_OK
// Success
//
// E_POINTER
// The IUnknown param is NULL.
//
// Remarks:
// None.
//
//--
//////////////////////////////////////////////////////////////////////////////
HRESULT HrSetInitialize( IUnknown * punkIn, IClusCfgCallback * picccIn, LCID lcidIn ) { TraceFunc( "" ); Assert( punkIn != NULL );
HRESULT hr; IClusCfgInitialize * pcci; IUnknown * punkCallback = NULL;
if ( punkIn == NULL ) { hr = THR( E_POINTER ); goto Cleanup; } // if:
if ( picccIn != NULL ) { hr = THR( picccIn->TypeSafeQI( IUnknown, &punkCallback ) ); if ( FAILED( hr ) ) { goto Cleanup; } // if:
} // if:
hr = THR( punkIn->TypeSafeQI( IClusCfgInitialize, &pcci ) ); if ( SUCCEEDED( hr ) ) { hr = STHR( pcci->Initialize( punkCallback, lcidIn ) ); pcci->Release(); } // if:
else if ( hr == E_NOINTERFACE ) { hr = S_OK; } // else if:
Cleanup:
if ( punkCallback != NULL ) { punkCallback->Release(); } // if:
HRETURN( hr );
} //*** HrSetInitialize()
//////////////////////////////////////////////////////////////////////////////
//++
//
// HrCreateNetworksEnum
//
// Description:
// Create a network enumerator.
//
// Arguments:
//
// Return Value:
// S_OK
// Success
//
// E_POINTER
// The IUnknown param is NULL.
//
// Remarks:
// None.
//
//--
//////////////////////////////////////////////////////////////////////////////
HRESULT HrCreateNetworksEnum( IClusCfgCallback * picccIn, LCID lcidIn, IWbemServices * pIWbemServicesIn, IUnknown ** ppunkOut ) { TraceFunc( "" );
HRESULT hr;
if ( ppunkOut == NULL ) { hr = THR( E_POINTER ); LogMsg( L"[SRV] HrCreateNetworksEnum() was given a NULL pointer argument." ); goto Exit; } // if:
hr = THR( CEnumClusCfgNetworks::S_HrCreateInstance( ppunkOut ) ); if ( FAILED( hr ) ) { goto Exit; } // if:
*ppunkOut = TraceInterface( L"CEnumClusCfgNetworks", IUnknown, *ppunkOut, 1 );
hr = THR( HrSetInitialize( *ppunkOut, picccIn, lcidIn ) ); if ( FAILED( hr ) ) { goto Exit; } // if:
hr = THR( HrSetWbemServices( *ppunkOut, pIWbemServicesIn ) ); if ( FAILED( hr ) ) { goto Exit; } // if:
Exit:
HRETURN( hr );
} //*** HrCreateNetworksEnum()
/////////////////////////////////////////////////////////////////////////////
//++
//
// HrLoadOperatingSystemInfo()
//
// Description:
// Load the Win32_OperatingSystem object and determine which partition
// were booted and have the OS installed on them.
//
// Arguments:
// None.
//
// Return Value:
// S_OK
// Success.
//
// Win32 Error
// something failed.
//
// Remarks:
// None.
//
//--
//////////////////////////////////////////////////////////////////////////////
HRESULT HrLoadOperatingSystemInfo( IClusCfgCallback * picccIn, IWbemServices * pIWbemServicesIn, BSTR * pbstrBootDeviceOut, BSTR * pbstrSystemDeviceOut ) { TraceFunc( "" ); Assert( picccIn != NULL ); Assert( pIWbemServicesIn != NULL ); Assert( pbstrBootDeviceOut != NULL ); Assert( pbstrSystemDeviceOut != NULL );
HRESULT hr = S_OK;
BSTR bstrClass; IEnumWbemClassObject * pOperatingSystems = NULL; ULONG ulReturned; IWbemClassObject * pOperatingSystem = NULL; int c; VARIANT var; HRESULT hrTemp;
VariantInit( &var );
bstrClass = TraceSysAllocString( L"Win32_OperatingSystem" ); if ( bstrClass == NULL ) { goto OutOfMemory; } // if:
hr = THR( pIWbemServicesIn->CreateInstanceEnum( bstrClass, WBEM_FLAG_SHALLOW, NULL, &pOperatingSystems ) ); if ( FAILED( hr ) ) { hrTemp = THR( HrSendStatusReport( picccIn, TASKID_Major_Find_Devices, TASKID_Minor_WMI_OS_Qry_Failed, 0, 1, 1, hr, IDS_ERROR_WMI_OS_QRY_FAILED ) ); if ( FAILED( hrTemp ) ) { hr = hrTemp; } // if:
goto Cleanup; } // if:
for ( c = 1; ; c++ ) { hr = pOperatingSystems->Next( WBEM_INFINITE, 1, &pOperatingSystem, &ulReturned ); if ( ( hr == S_OK ) && ( ulReturned == 1 ) ) { Assert( c < 2 ); // only expect one of these!
hr = THR( HrGetWMIProperty( pOperatingSystem, L"BootDevice", VT_BSTR, &var ) ); if ( FAILED( hr ) ) { goto Cleanup; } // if:
*pbstrBootDeviceOut = TraceSysAllocString( var.bstrVal ); if ( *pbstrBootDeviceOut == NULL ) { goto OutOfMemory; } // if:
VariantClear( &var );
hr = THR( HrGetWMIProperty( pOperatingSystem, L"SystemDevice", VT_BSTR, &var ) ); if ( FAILED( hr ) ) { goto Cleanup; } // if:
*pbstrSystemDeviceOut = TraceSysAllocString( var.bstrVal ); if ( *pbstrSystemDeviceOut == NULL ) { goto OutOfMemory; } // if:
pOperatingSystem->Release(); pOperatingSystem = NULL; } // if:
else if ( ( hr == S_FALSE ) && ( ulReturned == 0 ) ) { hr = S_OK; break; } // else if:
else { hrTemp = THR( HrSendStatusReport( picccIn, TASKID_Major_Find_Devices, TASKID_Minor_WMI_OS_Qry_Next_Failed, 0, 1, 1, hr, IDS_ERROR_WMI_OS_QRY_NEXT_FAILED ) ); if ( FAILED( hrTemp ) ) { hr = hrTemp; } // if:
goto Cleanup; } // else:
} // for:
goto Cleanup;
OutOfMemory:
hr = THR( E_OUTOFMEMORY );
Cleanup:
VariantClear( &var );
if ( pOperatingSystem != NULL ) { pOperatingSystem->Release(); } // if:
if ( pOperatingSystems != NULL ) { pOperatingSystems->Release(); } // if:
TraceSysFreeString( bstrClass );
HRETURN( hr );
} //*** HrLoadOperatingSystemInfo()
/////////////////////////////////////////////////////////////////////////////
//++
//
// HrConvertDeviceVolumeToLogicalDisk()
//
// Description:
// Convert a device volume to a logical disk.
//
// Arguments:
//
//
// Return Value:
// S_OK
// Success.
//
// Win32 Error
// something failed.
//
// Remarks:
// None.
//
//--
//////////////////////////////////////////////////////////////////////////////
HRESULT HrConvertDeviceVolumeToLogicalDisk( BSTR bstrDeviceVolumeIn, BSTR * pbstrLogicalDiskOut ) { TraceFunc( "" ); Assert( pbstrLogicalDiskOut != NULL );
HRESULT hr = S_OK; BOOL fRet; size_t cchMountPoint; WCHAR * pszMountPoint = NULL; WCHAR szVolume[ MAX_PATH ]; DWORD sc; DWORD cchPaths = 16; WCHAR * pszPaths = NULL; int c; DWORD cch;
cchMountPoint = wcslen( g_szNameSpaceRoot ) + wcslen( bstrDeviceVolumeIn ) + 2; pszMountPoint = new WCHAR[ cchMountPoint ]; if ( pszMountPoint == NULL ) { goto OutOfMemory; } // if:
wcscpy( pszMountPoint, g_szNameSpaceRoot ); wcscat( pszMountPoint, bstrDeviceVolumeIn ); wcscat( pszMountPoint, L"\\" );
fRet = GetVolumeNameForVolumeMountPoint( pszMountPoint, szVolume, sizeof( szVolume ) ); if ( !fRet ) { sc = TW32( GetLastError() ); hr = HRESULT_FROM_WIN32( sc );
LogMsg( L"[SRV] GetVolumeNameForVolumeMountPoint() failed. Mount point is '%ws'. (hr = %#08x)", pszMountPoint, hr );
//
// GetVolumeNameForVolumeMountPoint() is no longer supported for IA64 EFI partitions. If the error is
// ERROR_INVALID_FUNCTION then we should try to get the device number using an IOCTL.
//
if ( HRESULT_CODE( hr ) == ERROR_INVALID_FUNCTION ) { LogMsg( L"[SRV] Device volume '%ws' must be an IA64 EFI volume.", bstrDeviceVolumeIn ); } // if:
goto Cleanup; } // if:
pszPaths = new WCHAR[ cchPaths ]; if ( pszPaths == NULL ) { goto OutOfMemory; } // if:
//
// KB: 16 JAN 2001 GalenB
//
// Since the device name that is passed in is for a volume there will never be more than
// one logical disk in the multisz pszPaths.
//
for ( c = 0; ; c++ ) { Assert( c < 2 ); // expect to go through here no more than twice.
fRet = GetVolumePathNamesForVolumeName( szVolume, pszPaths, cchPaths, &cch ); if ( fRet ) { break; } // if:
else { sc = GetLastError(); if ( sc == ERROR_MORE_DATA ) { cchPaths = cch;
delete [] pszPaths; pszPaths = new WCHAR[ cchPaths ]; if ( pszPaths == NULL ) { goto OutOfMemory; } // if:
continue; } // if:
hr = THR( HRESULT_FROM_WIN32( sc ) ); LogMsg( L"[SRV] GetVolumePathNamesForVolumeName() failed. Volume is is '%ws'. (hr = %#08x)", szVolume, hr ); goto Cleanup; } // else:
} // for:
*pbstrLogicalDiskOut = TraceSysAllocString( pszPaths ); if ( *pbstrLogicalDiskOut == NULL ) { goto OutOfMemory; } // if:
goto Cleanup;
OutOfMemory:
hr = THR( E_OUTOFMEMORY );
Cleanup:
delete [] pszPaths;
delete [] pszMountPoint;
HRETURN( hr );
} //*** HrConvertDeviceVolumeToLogicalDisk()
/////////////////////////////////////////////////////////////////////////////
//++
//
// HrConvertDeviceVolumeToWMIDeviceID()
//
// Description:
// Since IA64 EFI partitions no longer support the call to
// GetVolumeNameForVolumeMountPoint() to convert the device name
// into a logical disk, since there will not longer be logical disks
// for these partitions.
//
// Arguments:
//
//
// Return Value:
// S_OK
// Success
//
// Remarks:
// None.
//
//--
//////////////////////////////////////////////////////////////////////////////
HRESULT HrConvertDeviceVolumeToWMIDeviceID( BSTR bstrDeviceVolumeIn, BSTR * pbstrWMIDeviceIDOut ) { TraceFunc( "" );
HRESULT hr = S_OK; HANDLE hVolume = NULL; DWORD dwSize; DWORD sc; STORAGE_DEVICE_NUMBER sdnDevNumber; BOOL fRet; size_t cchDevice; WCHAR * pszDevice = NULL; WCHAR sz[ 64 ];
cchDevice = wcslen( g_szNameSpaceRoot ) + wcslen( bstrDeviceVolumeIn ) + 2; pszDevice = new WCHAR[ cchDevice ]; if ( pszDevice == NULL ) { goto OutOfMemory; } // if:
wcscpy( pszDevice, g_szNameSpaceRoot ); wcscat( pszDevice, bstrDeviceVolumeIn ); //
// get handle to partition
//
hVolume = CreateFile( pszDevice , GENERIC_READ , FILE_SHARE_READ , NULL , OPEN_EXISTING , FILE_ATTRIBUTE_NORMAL , NULL );
if ( hVolume == INVALID_HANDLE_VALUE ) { sc = TW32( GetLastError() ); hr = HRESULT_FROM_WIN32( sc ); goto Cleanup; } // if:
//
// issue storage class ioctl to get drive and partition numbers
// for this device
//
fRet = DeviceIoControl( hVolume , IOCTL_STORAGE_GET_DEVICE_NUMBER , NULL , 0 , &sdnDevNumber , sizeof( sdnDevNumber ) , &dwSize , NULL ); if ( !fRet ) { sc = TW32( GetLastError() ); hr = HRESULT_FROM_WIN32( sc ); goto Cleanup; } // if:
_snwprintf( sz, ARRAYSIZE( sz ), g_szPhysicalDriveFormat, sdnDevNumber.DeviceNumber );
*pbstrWMIDeviceIDOut = SysAllocString( sz ); if ( *pbstrWMIDeviceIDOut == NULL ) { goto OutOfMemory; } // if:
goto Cleanup;
OutOfMemory:
hr = THR( E_OUTOFMEMORY ); LogMsg( L"[SRV] HrConvertDeviceVolumeToWMIDeviceID() is out of memory. (hr = %#08x)", hr );
Cleanup:
if ( hVolume != NULL ) { CloseHandle( hVolume ); } // if:
delete [] pszDevice;
HRETURN( hr );
} //*** HrConvertDeviceVolumeToWMIDeviceID()
/////////////////////////////////////////////////////////////////////////////
//++
//
// HrGetPageFileLogicalDisks()
//
// Description:
// Mark the drives that have paging files on them.
//
// Arguments:
//
//
// Return Value:
// S_OK
// Success.
//
// Remarks:
// None.
//
//--
//////////////////////////////////////////////////////////////////////////////
HRESULT HrGetPageFileLogicalDisks( IClusCfgCallback * picccIn, IWbemServices * pIWbemServicesIn, WCHAR szLogicalDisksOut[ 26 ], int * pcLogicalDisksOut ) { TraceFunc( "" );
HRESULT hr = S_FALSE; IEnumWbemClassObject * pPagingFiles = NULL; BSTR bstrClass; ULONG ulReturned; IWbemClassObject * pPagingFile = NULL; VARIANT var; int idx; HRESULT hrTemp;
bstrClass = TraceSysAllocString( L"Win32_PageFile" ); if ( bstrClass == NULL ) { hr = THR( E_OUTOFMEMORY ); goto Cleanup; } // if:
hr = THR( pIWbemServicesIn->CreateInstanceEnum( bstrClass, WBEM_FLAG_SHALLOW, NULL, &pPagingFiles ) ); if ( FAILED( hr ) ) { hrTemp = THR( HrSendStatusReport( picccIn, TASKID_Major_Find_Devices, TASKID_Minor_WMI_PageFile_Qry_Failed, 0, 1, 1, hr, IDS_ERROR_WMI_PAGEFILE_QRY_FAILED ) ); if ( FAILED( hrTemp ) ) { hr = hrTemp; } // if:
goto Cleanup; } // if:
VariantInit( &var );
for ( idx = 0; idx < sizeof( szLogicalDisksOut ); idx++ ) { hr = pPagingFiles->Next( WBEM_INFINITE, 1, &pPagingFile, &ulReturned ); if ( ( hr == S_OK ) && ( ulReturned == 1 ) ) { VariantClear( &var );
hr = THR( HrGetWMIProperty( pPagingFile, L"Drive", VT_BSTR, &var ) ); if ( FAILED( hr ) ) { goto Cleanup; } // if:
CharUpper( var.bstrVal );
szLogicalDisksOut[ idx ] = var.bstrVal[ 0 ];
pPagingFile->Release(); pPagingFile = NULL; } // if:
else if ( ( hr == S_FALSE ) && ( ulReturned == 0 ) ) { hr = S_OK; break; } // else if:
else { hrTemp = THR( HrSendStatusReport( picccIn, TASKID_Major_Find_Devices, TASKID_Minor_WMI_PageFile_Qry_Next_Failed, 0, 1, 1, hr, IDS_ERROR_WMI_PAGEFILE_QRY_NEXT_FAILED ) ); if ( FAILED( hrTemp ) ) { hr = hrTemp; } // if:
goto Cleanup; } // else:
} // for:
if ( pcLogicalDisksOut != NULL ) { *pcLogicalDisksOut = idx; } // if:
Cleanup:
VariantClear( &var );
TraceSysFreeString( bstrClass );
if ( pPagingFile != NULL ) { pPagingFile->Release(); } // if:
if ( pPagingFiles != NULL ) { pPagingFiles->Release(); } // if:
HRETURN( hr );
} //*** HrGetPageFileLogicalDisks()
/////////////////////////////////////////////////////////////////////////////
//++
//
// HrGetSystemDevice()
//
// Description:
// Returns the system (booted) device.
//
// Arguments:
//
//
// Return Value:
// None.
//
// Remarks:
// None.
//
//--
//////////////////////////////////////////////////////////////////////////////
HRESULT HrGetSystemDevice( BSTR * pbstrSystemDeviceOut ) { TraceFunc( "" ); Assert( pbstrSystemDeviceOut != NULL );
HRESULT hr = S_OK; DWORD sc; HKEY hKey = NULL; WCHAR * pszSystemDevice = NULL; DWORD cbSystemDevice = 0; // no need to but prefix complains #318170
sc = TW32( RegOpenKeyEx( HKEY_LOCAL_MACHINE, L"System\\Setup", 0, KEY_READ, &hKey ) ); if ( sc != ERROR_SUCCESS ) { hr = HRESULT_FROM_WIN32( sc ); LogMsg( L"[SRV] RegOpenKeyEx() failed. (hr = %#08x)", hr ); goto Cleanup; } // if:
sc = TW32( RegQueryValueEx( hKey, L"SystemPartition", NULL, NULL, NULL, &cbSystemDevice ) ); if ( sc != ERROR_SUCCESS ) { hr = HRESULT_FROM_WIN32( sc ); LogMsg( L"[SRV] RegQueryValueEx() failed. (hr = %#08x)", hr ); goto Cleanup; } // if:
pszSystemDevice = new WCHAR[ cbSystemDevice / sizeof( WCHAR ) ]; if ( pszSystemDevice == NULL ) { goto OutOfMemory; } // if:
sc = TW32( RegQueryValueEx( hKey, L"SystemPartition", NULL, NULL, (BYTE *) pszSystemDevice, &cbSystemDevice ) ); if ( sc != ERROR_SUCCESS ) { hr = HRESULT_FROM_WIN32( sc ); LogMsg( L"[SRV] RegQueryValueEx() failed. (hr = %#08x)", hr ); goto Cleanup; } // if:
*pbstrSystemDeviceOut = TraceSysAllocString( pszSystemDevice ); if ( *pbstrSystemDeviceOut == NULL ) { goto OutOfMemory; } // if:
goto Cleanup;
OutOfMemory:
hr = THR( E_OUTOFMEMORY ); LogMsg( L"[SRV] HrGetSystemDevice() is out of memory. (hr = %#08x)", hr );
Cleanup:
delete [] pszSystemDevice;
if ( hKey != NULL ) { RegCloseKey( hKey ); } // if:
HRETURN( hr );
} //*** HrGetSystemDevice()
/////////////////////////////////////////////////////////////////////////////
//++
//
// HrGetBootLogicalDisk()
//
// Description:
// Returns the boot (system) logical disk.
//
// Arguments:
//
//
// Return Value:
// None.
//
// Remarks:
// None.
//
//--
//////////////////////////////////////////////////////////////////////////////
HRESULT HrGetBootLogicalDisk( BSTR * pbstrBootLogicalDiskOut ) { TraceFunc( "" ); Assert( pbstrBootLogicalDiskOut != NULL );
HRESULT hr = S_OK; DWORD sc; WCHAR szWindowsDir[ MAX_PATH ]; WCHAR szVolume[ MAX_PATH ]; BOOL fRet;
sc = GetWindowsDirectory( szWindowsDir, ARRAYSIZE( szWindowsDir ) ); if ( sc == 0 ) { sc = TW32( GetLastError() ); hr = HRESULT_FROM_WIN32( sc ); LogMsg( L"[SRV] GetWindowsDirectory() failed. (hr = %#08x)", hr ); goto Exit; } // if:
fRet = GetVolumePathName( szWindowsDir, szVolume, ARRAYSIZE( szVolume ) ); if ( !fRet ) { sc = TW32( GetLastError() ); hr = HRESULT_FROM_WIN32( sc ); LogMsg( L"[SRV] GetVolumePathName() failed. (hr = %#08x)", hr ); goto Exit; } // if:
*pbstrBootLogicalDiskOut = TraceSysAllocString( szVolume ); if ( *pbstrBootLogicalDiskOut == NULL ) { hr = THR( E_OUTOFMEMORY ); } // if:
Exit:
HRETURN( hr );
} //*** HrGetBootLogicalDisk()
/////////////////////////////////////////////////////////////////////////////
//++
//
// HrCheckSecurity()
//
// Description:
// Checks the server security level.
//
// Arguments:
//
//
// Return Value:
// S_OK
// Secutity is high enough.
//
// E_ACCESSDENIED
// Security is not high enough.
//
// Remarks:
// None.
//
//--
//////////////////////////////////////////////////////////////////////////////
HRESULT HrCheckSecurity( void ) { TraceFunc( "" );
HRESULT hr = S_OK; IServerSecurity * piss = NULL; DWORD dwAuthnSvc; DWORD dwAuthzSvc; BSTR bstrServerPrincName = NULL; DWORD dwAuthnLevel; DWORD dwImpersonationLevel; void * pvPrivs = NULL; DWORD dwCapabilities;
hr = THR( CoGetCallContext( IID_IServerSecurity, reinterpret_cast< void ** >( &piss ) ) ); if ( FAILED( hr ) ) { goto Cleanup; } // if:
hr = THR( piss->QueryBlanket( &dwAuthnSvc, &dwAuthzSvc, &bstrServerPrincName, &dwAuthnLevel, &dwImpersonationLevel, &pvPrivs, &dwCapabilities ) );
Cleanup:
SysFreeString( bstrServerPrincName );
if ( piss != NULL ) { piss->Release(); } // if:
HRETURN( hr );
} //*** HrCheckSecurity()
/////////////////////////////////////////////////////////////////////////////
//++
//
// TraceWMIProperties()
//
// Description:
// Trace the properties to the debugger.
//
// Arguments:
//
//
// Return Value:
// None.
//
// Remarks:
// None.
//
//--
//////////////////////////////////////////////////////////////////////////////
#ifdef DEBUG
void TraceProperties( IWbemClassObject * pDiskIn ) { TraceFunc( "" );
HRESULT hr = S_FALSE; VARIANT var; BSTR bstrPropName; CIMTYPE cimType; LONG lFlags;
VariantInit( &var );
hr = THR( pDiskIn->BeginEnumeration( 0 ) ); if ( FAILED( hr ) ) { goto Exit; } // if:
for ( ; ; ) { VariantClear( &var );
hr = pDiskIn->Next( 0, &bstrPropName, &var, &cimType, &lFlags ); if ( FAILED( hr ) ) { break; } // if:
else if ( hr == S_OK ) { if ( var.vt == VT_BSTR ) { DebugMsg( L"Property %ws = %ws", bstrPropName, var.bstrVal ); } // if:
if ( var.vt == VT_I4 ) { DebugMsg( L"Property %ws = %d", bstrPropName, var.iVal ); } // if:
if ( var.vt == VT_BOOL ) { if ( var.boolVal == VARIANT_TRUE ) { DebugMsg( L"Property %ws = True", bstrPropName ); } // if:
else { DebugMsg( L"Property %ws = False", bstrPropName ); } // else:
} // if:
if ( var.vt == VT_NULL ) { DebugMsg( L"Property %ws = NULL", bstrPropName ); } // if:
TraceSysFreeString( bstrPropName ); VariantClear( &var ); } // else if:
else { break; } // else:
} // for:
Exit:
VariantClear( &var );
TraceFuncExit( );
} //*** TraceWMIProperties()
#endif
|