536 lines
14 KiB
C++
536 lines
14 KiB
C++
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Copyright (c) 1999-2000 Microsoft Corporation
|
|
//
|
|
// Module Name:
|
|
// ClusterResDepRes.cpp
|
|
//
|
|
// Description:
|
|
// Implementation of CClusterResDepRes class
|
|
//
|
|
// Author:
|
|
// Henry Wang (HenryWa) 24-AUG-1999
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "Pch.h"
|
|
#include "ClusterResDepRes.h"
|
|
|
|
//****************************************************************************
|
|
//
|
|
// CClusterResDepRes
|
|
//
|
|
//****************************************************************************
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CClusterResDepRes::CClusterResDepRes(
|
|
// LPCWSTR pwszNameIn,
|
|
// CWbemServices * pNamespaceIn,
|
|
// DWORD dwEnumTypeIn
|
|
// )
|
|
//
|
|
// Description:
|
|
// Create a cluster node object
|
|
//
|
|
// Arguments:
|
|
// pwszNameIn -- Class name
|
|
// pNamespaceIn -- Namespace
|
|
// dwEnumTypeIn -- Type id
|
|
//
|
|
// Return Values:
|
|
// pointer to the CProvBase
|
|
//
|
|
//--
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
CClusterResDepRes::CClusterResDepRes(
|
|
LPCWSTR pwszNameIn,
|
|
CWbemServices * pNamespaceIn,
|
|
DWORD dwEnumTypeIn
|
|
)
|
|
: CClusterObjDep( pwszNameIn, pNamespaceIn, dwEnumTypeIn )
|
|
{
|
|
|
|
} //*** CClusterResDepRes::CClusterResDepRes()
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// static
|
|
// CProvBase *
|
|
// CClusterResDepRes::S_CreateThis(
|
|
// LPCWSTR pwszNameIn,
|
|
// CWbemServices * pNamespaceIn,
|
|
// DWORD dwEnumTypeIn
|
|
// )
|
|
//
|
|
// Description:
|
|
// Create a cluster node object
|
|
//
|
|
// Arguments:
|
|
// pwszNameIn -- Class name
|
|
// pNamespaceIn -- Namespace
|
|
// dwEnumTypeIn -- Type id
|
|
//
|
|
// Return Values:
|
|
// pointer to the CProvBase
|
|
//
|
|
//--
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
CProvBase *
|
|
CClusterResDepRes::S_CreateThis(
|
|
LPCWSTR pwszNameIn,
|
|
CWbemServices * pNamespaceIn,
|
|
DWORD dwEnumTypeIn
|
|
)
|
|
{
|
|
return new CClusterResDepRes(
|
|
pwszNameIn,
|
|
pNamespaceIn,
|
|
dwEnumTypeIn
|
|
);
|
|
|
|
} //*** CClusterResDepRes::S_CreateThis()
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// SCODE
|
|
// CClusterResDepRes::EnumInstance(
|
|
// long lFlagsIn,
|
|
// IWbemContext * pCtxIn,
|
|
// IWbemObjectSink * pHandlerIn
|
|
// )
|
|
//
|
|
// Description:
|
|
// Enumerate dependencies of a resource.
|
|
//
|
|
// Arguments:
|
|
// lFlagsIn -- WMI flag
|
|
// pCtxIn -- WMI context
|
|
// pHandlerIn -- WMI sink pointer
|
|
//
|
|
// Return Values:
|
|
// WBEM_S_NO_ERROR
|
|
//
|
|
//--
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
SCODE
|
|
CClusterResDepRes::EnumInstance(
|
|
long lFlagsIn,
|
|
IWbemContext * pCtxIn,
|
|
IWbemObjectSink * pHandlerIn
|
|
)
|
|
{
|
|
SAFECLUSTER shCluster;
|
|
LPCWSTR pwszName = NULL;
|
|
CError er;
|
|
DWORD dwError;
|
|
CWbemClassObject wco;
|
|
CWbemClassObject wcoAntecedent;
|
|
CWbemClassObject wcoDependent;
|
|
_bstr_t bstrGroup;
|
|
_bstr_t bstrPart;
|
|
DWORD cchDepResName = MAX_PATH;
|
|
CWstrBuf wsbDepResName;
|
|
|
|
|
|
shCluster = OpenCluster( NULL );
|
|
CClusterEnum clusEnum( shCluster, m_dwEnumType );
|
|
|
|
m_wcoAntecedent.SpawnInstance( 0, & wcoAntecedent );
|
|
m_wcoDependent.SpawnInstance( 0, & wcoDependent );
|
|
|
|
wsbDepResName.SetSize( cchDepResName );
|
|
while ( ( pwszName = clusEnum.GetNext() ) != NULL )
|
|
{
|
|
DWORD dwIndex = 0;
|
|
DWORD dwType;
|
|
SAFERESOURCE shResource;
|
|
SAFERESENUM shResEnum;
|
|
|
|
shResource = OpenClusterResource( shCluster, pwszName );
|
|
shResEnum = ClusterResourceOpenEnum( shResource, CLUSTER_RESOURCE_ENUM_DEPENDS );
|
|
|
|
for ( ; ; )
|
|
{
|
|
DWORD cch = cchDepResName;
|
|
|
|
dwError = ClusterResourceEnum(
|
|
shResEnum,
|
|
dwIndex++,
|
|
& dwType,
|
|
wsbDepResName,
|
|
& cch
|
|
);
|
|
if ( dwError == ERROR_MORE_DATA )
|
|
{
|
|
cchDepResName = ++ cch ;
|
|
wsbDepResName.SetSize( cch );
|
|
dwError = ClusterResourceEnum(
|
|
shResEnum,
|
|
dwIndex++,
|
|
& dwType,
|
|
wsbDepResName,
|
|
& cch
|
|
);
|
|
} // if: buffer was too small
|
|
|
|
if ( dwError == ERROR_SUCCESS )
|
|
{
|
|
wcoAntecedent.SetProperty( pwszName, CLUSREG_NAME_RESTYPE_NAME );
|
|
wcoAntecedent.GetProperty( bstrGroup, PVD_WBEM_RELPATH );
|
|
|
|
wcoDependent.SetProperty( wsbDepResName, CLUSREG_NAME_RESTYPE_NAME );
|
|
wcoDependent.GetProperty( bstrPart, PVD_WBEM_RELPATH );
|
|
|
|
m_pClass->SpawnInstance( 0, & wco );
|
|
wco.SetProperty( (LPWSTR) bstrGroup, PVD_WBEM_PROP_ANTECEDENT );
|
|
wco.SetProperty( (LPWSTR) bstrPart, PVD_WBEM_PROP_DEPENDENT );
|
|
pHandlerIn->Indicate( 1, & wco );
|
|
}
|
|
else if ( dwError == ERROR_NO_MORE_ITEMS )
|
|
{
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
er = dwError;
|
|
}
|
|
} // forever
|
|
} // while: more dependencies
|
|
|
|
return WBEM_S_NO_ERROR;
|
|
|
|
} //*** CClusterResDepRes::EnumInstance()
|
|
|
|
//****************************************************************************
|
|
//
|
|
// CClusterToNode
|
|
//
|
|
//****************************************************************************
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CClusterToNode::CClusterToNode(
|
|
// LPCWSTR pwszNameIn,
|
|
// CWbemServices * pNamespaceIn,
|
|
// DWORD dwEnumTypeIn
|
|
// )
|
|
//
|
|
// Description:
|
|
// Constructor
|
|
//
|
|
// Arguments:
|
|
// pwszNameIn -- Class name
|
|
// pNamespaceIn -- Namespace
|
|
// dwEnumTypeIn -- Type id
|
|
//
|
|
// Return Values:
|
|
// None.
|
|
//
|
|
//--
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
CClusterToNode::CClusterToNode(
|
|
LPCWSTR pwszNameIn,
|
|
CWbemServices * pNamespaceIn,
|
|
DWORD dwEnumTypeIn
|
|
)
|
|
: CClusterObjDep( pwszNameIn, pNamespaceIn, dwEnumTypeIn )
|
|
{
|
|
|
|
} //*** CClusterToNode::CClusterToNode()
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// static
|
|
// CProvBase *
|
|
// CClusterToNode::S_CreateThis(
|
|
// LPCWSTR pwszNameIn,
|
|
// CWbemServices * pNamespaceIn,
|
|
// DWORD dwEnumTypeIn
|
|
// )
|
|
//
|
|
// Description:
|
|
// Create a cluster node object.
|
|
//
|
|
// Arguments:
|
|
// pwszNameIn -- Class name
|
|
// pNamespaceIn -- Namespace
|
|
// dwEnumTypeIn -- Type id
|
|
//
|
|
// Return Values:
|
|
// Pointer to the CProvBase
|
|
//
|
|
//--
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
CProvBase *
|
|
CClusterToNode::S_CreateThis(
|
|
LPCWSTR pwszNameIn,
|
|
CWbemServices * pNamespaceIn,
|
|
DWORD dwEnumTypeIn
|
|
)
|
|
{
|
|
return new CClusterToNode(
|
|
pwszNameIn,
|
|
pNamespaceIn,
|
|
dwEnumTypeIn
|
|
);
|
|
|
|
} //*** CClusterToNode::S_CreateThis()
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// SCODE
|
|
// CClusterToNode::EnumInstance(
|
|
// long lFlagsIn,
|
|
// IWbemContext * pCtxIn,
|
|
// IWbemObjectSink * pHandlerIn
|
|
// )
|
|
//
|
|
// Description:
|
|
// Enumerate
|
|
//
|
|
// Arguments:
|
|
// lFlagsIn -- WMI flag
|
|
// pCtxIn -- WMI context
|
|
// pHandlerIn -- WMI sink pointer
|
|
//
|
|
// Return Values:
|
|
// WBEM_S_NO_ERROR
|
|
//
|
|
//--
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
SCODE
|
|
CClusterToNode::EnumInstance(
|
|
long lFlagsIn,
|
|
IWbemContext * pCtxIn,
|
|
IWbemObjectSink * pHandlerIn
|
|
)
|
|
{
|
|
SAFECLUSTER shCluster;
|
|
LPCWSTR pwszName = NULL;
|
|
DWORD cchClusterName = MAX_PATH;
|
|
CWstrBuf wsbClusterName;
|
|
CError er;
|
|
DWORD dwError;
|
|
CWbemClassObject wcoAntecedent;
|
|
CWbemClassObject wcoDependent;
|
|
_bstr_t bstrAntecedent;
|
|
_bstr_t bstrDependent;
|
|
|
|
wsbClusterName.SetSize( cchClusterName );
|
|
|
|
shCluster = OpenCluster( NULL );
|
|
CClusterEnum clusEnum( shCluster, m_dwEnumType );
|
|
dwError = GetClusterInformation(
|
|
shCluster,
|
|
wsbClusterName,
|
|
& cchClusterName,
|
|
NULL
|
|
);
|
|
|
|
if ( dwError == ERROR_MORE_DATA )
|
|
{
|
|
wsbClusterName.SetSize( ++ cchClusterName );
|
|
er = GetClusterInformation(
|
|
shCluster,
|
|
wsbClusterName,
|
|
& cchClusterName,
|
|
NULL
|
|
);
|
|
}
|
|
m_wcoAntecedent.SpawnInstance( 0, & wcoAntecedent );
|
|
m_wcoDependent.SpawnInstance( 0, & wcoDependent );
|
|
|
|
wcoAntecedent.SetProperty( wsbClusterName, PVD_PROP_NAME );
|
|
wcoAntecedent.GetProperty( bstrAntecedent, PVD_WBEM_RELPATH );
|
|
|
|
while ( ( pwszName = clusEnum.GetNext() ) != NULL )
|
|
{
|
|
CWbemClassObject wco;
|
|
|
|
wcoDependent.SetProperty( pwszName, PVD_PROP_NAME );
|
|
|
|
wcoDependent.GetProperty( bstrDependent, PVD_WBEM_RELPATH );
|
|
|
|
m_pClass->SpawnInstance( 0, & wco );
|
|
wco.SetProperty( (LPWSTR) bstrAntecedent, PVD_WBEM_PROP_ANTECEDENT );
|
|
wco.SetProperty( (LPWSTR) bstrDependent, PVD_WBEM_PROP_DEPENDENT );
|
|
pHandlerIn->Indicate( 1, & wco );
|
|
} // while: more properties
|
|
|
|
return WBEM_S_NO_ERROR;
|
|
|
|
} //*** CClusterToNode::EnumInstance()
|
|
|
|
//****************************************************************************
|
|
//
|
|
// CClusterHostedService
|
|
//
|
|
//****************************************************************************
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CClusterHostedService::CClusterHostedService(
|
|
// LPCWSTR pwszNameIn,
|
|
// CWbemServices * pNamespaceIn,
|
|
// DWORD dwEnumType
|
|
// )
|
|
//
|
|
// Description:
|
|
// Constructor.
|
|
//
|
|
// Arguments:
|
|
// pwszNameIn -- Class name
|
|
// pNamespaceIn -- Namespace
|
|
// dwEnumTypeIn -- Type id
|
|
//
|
|
// Return Values:
|
|
// None.
|
|
//
|
|
//--
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
CClusterHostedService::CClusterHostedService(
|
|
LPCWSTR pwszNameIn,
|
|
CWbemServices * pNamespaceIn,
|
|
DWORD dwEnumTypeIn
|
|
)
|
|
: CClusterObjDep( pwszNameIn, pNamespaceIn, dwEnumTypeIn )
|
|
{
|
|
|
|
} //*** CClusterHostedService::CClusterHostedService()
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// static
|
|
// CProvBase *
|
|
// CClusterHostedService::S_CreateThis(
|
|
// LPCWSTR pwszNameIn,
|
|
// CWbemServices * pNamespaceIn,
|
|
// DWORD dwEnumTypeIn
|
|
// )
|
|
//
|
|
// Description:
|
|
// Create a hostedservice.
|
|
//
|
|
// Arguments:
|
|
// pwszNameIn -- Class name
|
|
// pNamespaceIn -- Namespace
|
|
// dwEnumTypeIn -- Type id
|
|
//
|
|
// Return Values:
|
|
// Pointer to the CProvBase
|
|
//
|
|
//--
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
CProvBase *
|
|
CClusterHostedService::S_CreateThis(
|
|
LPCWSTR pwszNameIn,
|
|
CWbemServices * pNamespaceIn,
|
|
DWORD dwEnumTypeIn
|
|
)
|
|
{
|
|
return new CClusterHostedService(
|
|
pwszNameIn,
|
|
pNamespaceIn,
|
|
dwEnumTypeIn
|
|
);
|
|
|
|
} //*** CClusterHostedService::S_CreateThis()
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// SCODE
|
|
// CClusterHostedService::EnumInstance(
|
|
// long lFlagsIn,
|
|
// IWbemContext * pCtxIn,
|
|
// IWbemObjectSink * pHandlerIn
|
|
// )
|
|
//
|
|
// Description:
|
|
// Enum instance of hostedservice
|
|
//
|
|
// Arguments:
|
|
// lFlagsIn -- WMI flag
|
|
// pCtxIn -- WMI context
|
|
// pHandlerIn -- WMI sink pointer
|
|
//
|
|
// Return Values:
|
|
// WBEM_S_NO_ERROR
|
|
//--
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
SCODE
|
|
CClusterHostedService::EnumInstance(
|
|
long lFlagsIn,
|
|
IWbemContext * pCtxIn,
|
|
IWbemObjectSink * pHandlerIn
|
|
)
|
|
{
|
|
// SAFECLUSTER shCluster;
|
|
CError er;
|
|
CWbemClassObject wcoAntecedent;
|
|
_bstr_t bstrAntecedent;
|
|
_bstr_t bstrDependent;
|
|
CComPtr< IEnumWbemClassObject > pEnum;
|
|
|
|
// shCluster = OpenCluster( NULL ); // DAVIDP: Why is this needed? 19-Jul-2000
|
|
|
|
m_wcoAntecedent.SpawnInstance( 0, &wcoAntecedent );
|
|
|
|
//
|
|
// network interface objects
|
|
//
|
|
|
|
er = m_pNamespace->CreateInstanceEnum(
|
|
_bstr_t( PVD_CLASS_SERVICES ),
|
|
0,
|
|
NULL,
|
|
&pEnum
|
|
);
|
|
|
|
for( ; ; )
|
|
{
|
|
CWbemClassObject wcoService;
|
|
DWORD cWco;
|
|
HRESULT hr;
|
|
|
|
hr = pEnum->Next(
|
|
5000,
|
|
1,
|
|
&wcoService,
|
|
&cWco
|
|
);
|
|
if ( hr == WBEM_S_NO_ERROR )
|
|
{
|
|
CWbemClassObject wco;
|
|
|
|
wcoService.GetProperty( bstrAntecedent, PVD_PROP_SERVICE_SYSTEMNAME );
|
|
|
|
wcoAntecedent.SetProperty( ( LPWSTR ) bstrAntecedent, PVD_PROP_NODE_NAME );
|
|
wcoAntecedent.GetProperty( bstrAntecedent, PVD_WBEM_RELPATH );
|
|
|
|
wcoService.GetProperty( bstrDependent, PVD_WBEM_RELPATH );
|
|
m_pClass->SpawnInstance( 0, &wco );
|
|
wco.SetProperty( ( LPWSTR ) bstrAntecedent, PVD_WBEM_PROP_ANTECEDENT );
|
|
wco.SetProperty( ( LPWSTR ) bstrDependent, PVD_WBEM_PROP_DEPENDENT );
|
|
pHandlerIn->Indicate( 1, &wco );
|
|
}
|
|
else
|
|
{
|
|
break;
|
|
}
|
|
|
|
} // forever
|
|
|
|
return WBEM_S_NO_ERROR;
|
|
|
|
} //*** CClusterHostedService::EnumInstance()
|