1202 lines
28 KiB
C++
1202 lines
28 KiB
C++
|
//////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// 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
|