977 lines
28 KiB
C++
977 lines
28 KiB
C++
/*++
|
|
|
|
Copyright (c) 1997-1999 Microsoft Corporation
|
|
|
|
Module Name:
|
|
frswmipv.cpp
|
|
|
|
Abstract:
|
|
This is the implementation of the WMI provider for NTFRS. This file
|
|
contains the implementation of the CProvider class.
|
|
|
|
Author:
|
|
Sudarshan Chitre (sudarc) , Mathew George (t-mattg) - 3-Aug-2000
|
|
|
|
Environment
|
|
User mode winnt
|
|
|
|
--*/
|
|
|
|
|
|
extern "C" {
|
|
#include <ntreppch.h>
|
|
#include <frs.h>
|
|
}
|
|
|
|
#include <frswmipv.h>
|
|
|
|
//
|
|
// Extern globals from other modules.
|
|
//
|
|
extern "C" PGEN_TABLE ReplicasByGuid;
|
|
extern "C" PCHAR OLPartnerStateNames[];
|
|
|
|
// const CLSID CLSID_Provider = {0x39143F73,0xFDB1,0x4CF5,0x8C,0xB7,0xC8,0x43,0x9E,0x3F,0x5C,0x20};
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CProvider
|
|
|
|
|
|
//
|
|
// Class constructor/destructor
|
|
//
|
|
|
|
CProvider::CProvider()
|
|
/*++
|
|
Routine Description:
|
|
Initializes members of the CProvider class.
|
|
|
|
Arguments:
|
|
None
|
|
|
|
Return Value:
|
|
None
|
|
|
|
--*/
|
|
{
|
|
ODS(L"CProvider constructor.\n");
|
|
m_NumReplicaSets = 5;
|
|
m_dwRef = 0;
|
|
m_ipNamespace = NULL;
|
|
m_ipMicrosoftFrs_DfsMemberClassDef = NULL;
|
|
m_ipMicrosoftFrs_SysVolMemberClassDef = NULL;
|
|
m_ipMicrosoftFrs_DfsConnectionClassDef = NULL;
|
|
m_ipMicrosoftFrs_SysVolConnectionClassDef = NULL;
|
|
m_ipMicrosoftFrs_DfsMemberEventClassDef = NULL;
|
|
}
|
|
|
|
CProvider::~CProvider()
|
|
/*++
|
|
Routine Description:
|
|
Deallocates resources acquired by this object.
|
|
|
|
Arguments:
|
|
None
|
|
|
|
Return Value:
|
|
None
|
|
|
|
--*/
|
|
{
|
|
if(m_ipNamespace)
|
|
{
|
|
m_ipNamespace->Release();
|
|
m_ipNamespace = NULL;
|
|
}
|
|
|
|
if(m_ipMicrosoftFrs_DfsMemberClassDef)
|
|
{
|
|
m_ipMicrosoftFrs_DfsMemberClassDef->Release();
|
|
m_ipMicrosoftFrs_DfsMemberClassDef = NULL;
|
|
}
|
|
|
|
if(m_ipMicrosoftFrs_SysVolMemberClassDef)
|
|
{
|
|
m_ipMicrosoftFrs_SysVolMemberClassDef->Release();
|
|
m_ipMicrosoftFrs_SysVolMemberClassDef = NULL;
|
|
}
|
|
|
|
if(m_ipMicrosoftFrs_DfsConnectionClassDef)
|
|
{
|
|
m_ipMicrosoftFrs_DfsConnectionClassDef->Release();
|
|
m_ipMicrosoftFrs_DfsConnectionClassDef = NULL;
|
|
}
|
|
|
|
if(m_ipMicrosoftFrs_SysVolConnectionClassDef)
|
|
{
|
|
m_ipMicrosoftFrs_SysVolConnectionClassDef->Release();
|
|
m_ipMicrosoftFrs_SysVolConnectionClassDef = NULL;
|
|
}
|
|
|
|
|
|
if(m_ipMicrosoftFrs_DfsMemberEventClassDef)
|
|
{
|
|
m_ipMicrosoftFrs_DfsMemberEventClassDef->Release();
|
|
m_ipMicrosoftFrs_DfsMemberEventClassDef = NULL;
|
|
}
|
|
}
|
|
|
|
|
|
//
|
|
// Methods for the IUnknown interface
|
|
//
|
|
|
|
ULONG CProvider::AddRef()
|
|
/*++
|
|
Routine Description:
|
|
Increments the reference count of the object.
|
|
|
|
Arguments:
|
|
None
|
|
|
|
Return Value:
|
|
Current reference count. (> 0)
|
|
|
|
--*/
|
|
{
|
|
return InterlockedIncrement((LONG *)&m_dwRef);
|
|
}
|
|
|
|
ULONG CProvider::Release()
|
|
/*++
|
|
Routine Description:
|
|
Decrements the reference count of the object. Frees
|
|
the object resource when the reference count becomes
|
|
zero.
|
|
|
|
Arguments:
|
|
None
|
|
|
|
Return Value:
|
|
New reference count.
|
|
--*/
|
|
{
|
|
ULONG dwRef = InterlockedDecrement((LONG *)&m_dwRef);
|
|
if(dwRef == 0)
|
|
delete this;
|
|
return dwRef;
|
|
}
|
|
|
|
|
|
HRESULT CProvider::QueryInterface(REFIID riid, void** ppv)
|
|
/*++
|
|
Routine Description:
|
|
This method is called by COM to obtain pointers to
|
|
a given interface. The provider currently supports
|
|
the IUnknown, IWbemProviderInit and the IWbemServices
|
|
interface.
|
|
|
|
Arguments:
|
|
riid : GUID of the required interface.
|
|
ppv : Pointer where the "interface pointer" is returned.
|
|
|
|
Return Value:
|
|
Status of operation. Pointer to the requested interface
|
|
is returned in *ppv.
|
|
--*/
|
|
{
|
|
if(riid == IID_IUnknown || riid == IID_IWbemProviderInit)
|
|
{
|
|
*ppv = (IWbemProviderInit *) this;
|
|
AddRef();
|
|
return S_OK;
|
|
}
|
|
else if (riid == IID_IWbemServices)
|
|
{
|
|
*ppv = (IWbemServices *) this;
|
|
AddRef();
|
|
return S_OK;
|
|
}
|
|
else if (riid == IID_IWbemEventProvider)
|
|
{
|
|
*ppv = (IWbemEventProvider *) this;
|
|
AddRef();
|
|
return S_OK;
|
|
}
|
|
else return E_NOINTERFACE;
|
|
}
|
|
|
|
//
|
|
// Methods for the IWbemProviderInit interface.
|
|
//
|
|
|
|
STDMETHODIMP CProvider::Initialize(
|
|
IN LPWSTR pszUser,
|
|
IN LONG lFlags,
|
|
IN LPWSTR pszNamespace,
|
|
IN LPWSTR pszLocale,
|
|
IN IWbemServices *pNamespace,
|
|
IN IWbemContext *pCtx,
|
|
IN IWbemProviderInitSink *pInitSink
|
|
)
|
|
/*++
|
|
Routine Description:
|
|
|
|
This method is called to initialize the provider.
|
|
We obtain the class defns of the classes we support
|
|
from WMI by calling GetObject on the namespace pointer.
|
|
|
|
Arguments:
|
|
|
|
wszUser : [in] Pointer to the user name, if per-user initialization was requested
|
|
in the __Win32Provider registration instance for this provider. Otherwise, this
|
|
will be NULL. Note that this parameter is set to NULL for Event (consumer)
|
|
providers regardless of the value of PerUserInitialization.
|
|
|
|
lFlags : [in] Reserved. It must be zero.
|
|
|
|
wszNamespace : [in] Namespace name for which the provider is being initialized.
|
|
|
|
wszLocale : [in] Locale name for which the provider is being initialized. This
|
|
is typically a string of the following format, where the hex value is a
|
|
Microsoft standard LCID value: "MS_409". This parameter may be NULL.
|
|
|
|
pNamespace : [in] An IWbemServices pointer back into Windows Management.
|
|
This pointer is capable of servicing any requests made by the provider.
|
|
The provider should use the IWbemProviderInit::AddRef method on this
|
|
pointer if it is going to call back into Windows Management during its
|
|
execution.
|
|
|
|
pCtx : [in] An IWbemContext pointer associated with initialization. This
|
|
parameter may be NULL. If the provider will make requests back into Windows
|
|
Management before completing initialization, it should use the
|
|
IWbemProviderInit::AddRef method on this pointer. For more information,
|
|
see Making Calls to WMI.
|
|
|
|
pInitSink : [in] An IWbemProviderInitSink pointer that is used by the provider
|
|
to report initialization status.
|
|
|
|
Return Value:
|
|
The provider should return WBEM_S_NO_ERROR and indicate its status using the
|
|
supplied object sink in the pInitSink parameter. However, if a provider
|
|
returns WBEM_E_FAILED and does not use the sink, then the provider
|
|
initialization will be considered as failed.
|
|
--*/
|
|
|
|
{
|
|
// WBEM_VALIDATE_INTF_PTR( pNamespace );
|
|
// WBEM_VALIDATE_INTF_PTR( pCtx );
|
|
// WBEM_VALIDATE_INTF_PTR( pInitSink );
|
|
HRESULT res = WBEM_S_NO_ERROR;
|
|
|
|
ODS(L"In Initialize().\n");
|
|
|
|
//
|
|
// Fill up our member variables.
|
|
//
|
|
m_ipNamespace = pNamespace;
|
|
m_ipNamespace->AddRef();
|
|
|
|
BSTR bstrObjectName = SysAllocString(L"MicrosoftFrs_DfsMember");
|
|
|
|
res = m_ipNamespace->GetObject( bstrObjectName,
|
|
WBEM_FLAG_RETURN_WBEM_COMPLETE,
|
|
pCtx,
|
|
&m_ipMicrosoftFrs_DfsMemberClassDef,
|
|
NULL );
|
|
if(FAILED(res))
|
|
{
|
|
ODS(L"\nFailed to get ReplicaSetSummaryInfo class definition.\n");
|
|
SysFreeString(bstrObjectName);
|
|
m_ipNamespace->Release();
|
|
return res;
|
|
}
|
|
|
|
SysReAllocString(&bstrObjectName, L"MicrosoftFrs_SysVolMember");
|
|
res = m_ipNamespace->GetObject( bstrObjectName,
|
|
WBEM_FLAG_RETURN_WBEM_COMPLETE,
|
|
pCtx,
|
|
&m_ipMicrosoftFrs_SysVolMemberClassDef,
|
|
NULL );
|
|
if(FAILED(res))
|
|
{
|
|
ODS(L"\nFailed to get ReplicaSetSummaryInfo class definition.\n");
|
|
SysFreeString(bstrObjectName);
|
|
m_ipNamespace->Release();
|
|
return res;
|
|
}
|
|
|
|
SysReAllocString(&bstrObjectName, L"MicrosoftFrs_DfsConnection");
|
|
ODS(bstrObjectName);
|
|
res = m_ipNamespace->GetObject( bstrObjectName,
|
|
WBEM_FLAG_RETURN_WBEM_COMPLETE,
|
|
pCtx,
|
|
&m_ipMicrosoftFrs_DfsConnectionClassDef,
|
|
NULL );
|
|
if(FAILED(res))
|
|
{
|
|
ODS(L"\nFailed to get InboundPartnerInfo class definition.\n");
|
|
SysFreeString(bstrObjectName);
|
|
m_ipNamespace->Release();
|
|
return res;
|
|
}
|
|
|
|
SysReAllocString(&bstrObjectName, L"MicrosoftFrs_SysVolConnection");
|
|
ODS(bstrObjectName);
|
|
res = m_ipNamespace->GetObject( bstrObjectName,
|
|
WBEM_FLAG_RETURN_WBEM_COMPLETE,
|
|
pCtx,
|
|
&m_ipMicrosoftFrs_SysVolConnectionClassDef,
|
|
NULL );
|
|
if(FAILED(res))
|
|
{
|
|
ODS(L"\nFailed to get InboundPartnerInfo class definition.\n");
|
|
SysFreeString(bstrObjectName);
|
|
m_ipNamespace->Release();
|
|
return res;
|
|
}
|
|
|
|
|
|
SysReAllocString(&bstrObjectName, L"MicrosoftFrs_DfsMemberEvent");
|
|
res = m_ipNamespace->GetObject( bstrObjectName,
|
|
WBEM_FLAG_RETURN_WBEM_COMPLETE,
|
|
pCtx,
|
|
&m_ipMicrosoftFrs_DfsMemberEventClassDef,
|
|
NULL );
|
|
if(FAILED(res))
|
|
{
|
|
ODS(L"\nFailed to get MicrosoftFrs_DfsMemberEvent class definition.\n");
|
|
SysFreeString(bstrObjectName);
|
|
m_ipNamespace->Release();
|
|
return res;
|
|
}
|
|
|
|
//
|
|
// Let winmgmt know that we have initialized.
|
|
//
|
|
pInitSink->SetStatus( WBEM_S_INITIALIZED, 0 );
|
|
ODS(L"Completed IWbemProviderInit::Initialize() \n");
|
|
return WBEM_S_NO_ERROR ;
|
|
// return WBEM_E_FAILED;
|
|
}
|
|
|
|
STDMETHODIMP CProvider::GetObjectAsync(
|
|
IN const BSTR bstrObjectPath,
|
|
IN long lFlags,
|
|
IN IWbemContext *pCtx,
|
|
IN IWbemObjectSink *pResponseHandler)
|
|
/*++
|
|
Routine Description:
|
|
This method is called by WMI to obtain the instance
|
|
of a given object. The requested instance is indicated
|
|
to WMI using the pResponseHandler interface.
|
|
|
|
Arguments:
|
|
strObjectPath : [in] Path of the object to retrieve. If this is NULL, an empty
|
|
object, which can become a new class, is returned.
|
|
|
|
lFlags : [in] Flags which affect the behavior of this method.
|
|
|
|
pCtx : [in] Typically NULL. Otherwise, this is a pointer to an IWbemContext
|
|
object that may be used by the provider producing the requested class or
|
|
instance.
|
|
|
|
pResponseHandler :[in] Pointer to the caller's implementation of IWbemObjectSink.
|
|
This handler receives the requested object when it becomes available through the
|
|
IWbemObjectSink::Indicate method.
|
|
|
|
Return Value:
|
|
Status of operation.
|
|
--*/
|
|
{
|
|
/*
|
|
HRESULT hRes;
|
|
|
|
// WBEM_VALIDATE_IN_STRING_PTR( bstrObjectPath );
|
|
// TODO : check lFlags?
|
|
// WBEM_VALIDATE_INTF_PTR( pCtx );
|
|
// WBEM_VALIDATE_INTF_PTR( pResponseHandler );
|
|
|
|
static LPCWSTR ROOTSTR_MEMBER =
|
|
L"Microsoft_NtFrsMemberStatus.ReplicaSetGUID=\"";
|
|
static LPCWSTR ROOTSTR_CONNECTION_LIST =
|
|
L"Microsoft_NtFrsConnectionStatus.CompositeGUID=\"";
|
|
|
|
ODS(L"In IWbemServices::GetObjectAsync()\n");
|
|
|
|
//
|
|
// First check whether the given path matches the summary info
|
|
// object path.
|
|
//
|
|
int rootlen = lstrlen(ROOTSTR_MEMBER);
|
|
|
|
if (lstrlen(bstrObjectPath) > rootlen &&
|
|
0 == _wcsnicmp(bstrObjectPath, ROOTSTR_MEMBER, rootlen))
|
|
{
|
|
//
|
|
// Extract the index/key by removing the prefix.
|
|
//
|
|
BSTR bstrIndexValue = SysAllocString(
|
|
(const OLECHAR *)((BSTR)bstrObjectPath + rootlen));
|
|
// remove trailing doublequote
|
|
bstrIndexValue[lstrlen(bstrIndexValue)-1] = L'\0';
|
|
|
|
hRes = EnumNtFrsMemberStatus(pCtx, pResponseHandler, bstrIndexValue );
|
|
SysFreeString(bstrIndexValue);
|
|
return hRes;
|
|
}
|
|
|
|
//
|
|
// else : check for the inbound partner info object path.
|
|
//
|
|
rootlen = lstrlen(ROOTSTR_CONNECTION_LIST);
|
|
if (lstrlen(bstrObjectPath) > rootlen &&
|
|
0 == _wcsnicmp(bstrObjectPath, ROOTSTR_CONNECTION_LIST, rootlen)
|
|
)
|
|
{
|
|
// remove prefix
|
|
BSTR bstrIndexValue = SysAllocString(
|
|
(const OLECHAR *)((BSTR)bstrObjectPath + rootlen));
|
|
// remove trailing doublequote
|
|
bstrIndexValue[lstrlen(bstrIndexValue)-1] = L'\0';
|
|
|
|
hRes = EnumNtFrsConnectionStatus( pCtx, pResponseHandler, bstrIndexValue );
|
|
SysFreeString(bstrIndexValue);
|
|
return hRes;
|
|
}
|
|
|
|
return WBEM_E_INVALID_OBJECT_PATH;
|
|
*/
|
|
return WBEM_E_INVALID_OBJECT_PATH;
|
|
}
|
|
|
|
|
|
STDMETHODIMP CProvider::CreateInstanceEnumAsync(
|
|
IN const BSTR bstrClass,
|
|
IN long lFlags,
|
|
IN IWbemContext *pCtx,
|
|
IN IWbemObjectSink *pResponseHandler)
|
|
/*++
|
|
Routine Description:
|
|
This method is called by WMI to enumerate all instances
|
|
of a given class. All the instances are indicated to WMI
|
|
using the pResponseHandler interface.
|
|
|
|
Arguments:
|
|
strObjectPath : [in] Name of the class whose instances are required.
|
|
|
|
lFlags : [in] Flags which affect the behavior of this method.
|
|
|
|
pCtx : [in] Typically NULL. Otherwise, this is a pointer to an IWbemContext
|
|
object that may be used by the provider producing the requested class or
|
|
instance.
|
|
|
|
pResponseHandler :[in] Pointer to the caller's implementation of IWbemObjectSink.
|
|
This handler receives the requested objects when it becomes available through the
|
|
IWbemObjectSink::Indicate method.
|
|
|
|
Return Value:
|
|
Status of operation.
|
|
--*/
|
|
{
|
|
|
|
// WBEM_VALIDATE_IN_STRING_PTR( bstrClass );
|
|
// TODO : check lFlags?
|
|
// WBEM_VALIDATE_INTF_PTR( pCtx );
|
|
// WBEM_VALIDATE_INTF_PTR( pResponseHandler );
|
|
|
|
ODS(L"In IWbemServices::CreateInstanceEnumAsync().\n");
|
|
|
|
if ( 0 == lstrcmp( bstrClass, L"MicrosoftFrs_DfsMember"))
|
|
{
|
|
return EnumNtFrsMemberStatus(pCtx, pResponseHandler );
|
|
}
|
|
else if ( 0 == lstrcmp( bstrClass, L"MicrosoftFrs_DfsConnection") )
|
|
{
|
|
return EnumNtFrsConnectionStatus( pCtx, pResponseHandler );
|
|
}
|
|
|
|
return WBEM_E_INVALID_OBJECT_PATH;
|
|
|
|
}
|
|
|
|
HRESULT CProvider::EnumNtFrsMemberStatus(
|
|
IN IWbemContext *pCtx,
|
|
IN IWbemObjectSink *pResponseHandler,
|
|
IN const BSTR bstrFilterValue
|
|
)
|
|
/*++
|
|
Routine Description:
|
|
Enumerates all instances of the Microsoft_NtFrsMemberStatus
|
|
class. Instances are indicated using the pResponseHandler
|
|
interface.
|
|
|
|
Arguments:
|
|
pCtx : [in] Typically NULL. Otherwise, this is a pointer to an IWbemContext
|
|
object that may be used by the provider producing the requested class or
|
|
instance.
|
|
|
|
pResponseHandler : [in] Pointer to the caller's implementation of IWbemObjectSink.
|
|
This handler receives the requested objects when it becomes available through the
|
|
IWbemObjectSink::Indicate method.
|
|
|
|
bstrFilterValue : [in] A filter which limits the returned instances to
|
|
a subset of the actual instances. If NULL, all instances are returned.
|
|
|
|
Return Value:
|
|
Status of operation.
|
|
--*/
|
|
|
|
{
|
|
#undef DEBSUB
|
|
#define DEBSUB "CProvider::EnumNtFrsMemberStatus:"
|
|
|
|
IWbemClassObject *pInstance;
|
|
PVOID Key;
|
|
PREPLICA Replica;
|
|
VARIANT var;
|
|
WCHAR GuidWStr[GUID_CHAR_LEN + 1];
|
|
PWCHAR TempStr = NULL;
|
|
|
|
// WBEM_VALIDATE_INTF_PTR( pCtx );
|
|
// WBEM_VALIDATE_INTF_PTR( pResponseHandler );
|
|
// WBEM_VALIDATE_IN_STRING_PTR_OPTIONAL( bstrFilterValue );
|
|
|
|
HRESULT hRes = WBEM_S_NO_ERROR;
|
|
|
|
ODS(L"Enumerating instances.\n");
|
|
Key = NULL;
|
|
while (Replica = (PREPLICA)GTabNextDatum(ReplicasByGuid, &Key)) {
|
|
|
|
//
|
|
// Spawn an instance of the Microsoft_NtFrsMemberStatus object.
|
|
//
|
|
if (Replica->ReplicaSetType != FRS_RSTYPE_DOMAIN_SYSVOL) {
|
|
m_ipMicrosoftFrs_DfsMemberClassDef->SpawnInstance(0, &pInstance);
|
|
} else {
|
|
continue;
|
|
}
|
|
|
|
//
|
|
// TODO : Fill in the members of this object.
|
|
//
|
|
|
|
// String ReplicaSetGUID;
|
|
//
|
|
// String ReplicaSetName;
|
|
// String ReplicaMemberRoot;
|
|
// String ReplicaMemberStage;
|
|
// String FileFilter;
|
|
// String DirFilter;
|
|
// String ReplicaMemberState;
|
|
// String ReplicaSetType;
|
|
|
|
|
|
//String ReplicaSetGUID;
|
|
/*
|
|
V_VT(&var) = VT_BSTR;
|
|
|
|
GuidToStrW(Replica->ReplicaName->Guid, GuidWStr);
|
|
V_BSTR(&var) = SysAllocString(GuidWStr);
|
|
|
|
hRes = pInstance->Put( L"ReplicaSetGUID", 0, &var, 0 );
|
|
VariantClear(&var);
|
|
|
|
if(hRes != WBEM_S_NO_ERROR)
|
|
break;
|
|
|
|
|
|
//String ReplicaSetName;
|
|
|
|
V_VT(&var) = VT_BSTR;
|
|
V_BSTR(&var) = SysAllocString(Replica->ReplicaName->Name);
|
|
|
|
hRes = pInstance->Put( L"ReplicaSetName", 0, &var, 0 );
|
|
VariantClear(&var);
|
|
if(hRes != WBEM_S_NO_ERROR)
|
|
break;
|
|
|
|
|
|
//String ReplicaMemberRoot;
|
|
|
|
V_VT(&var) = VT_BSTR;
|
|
V_BSTR(&var) = SysAllocString(Replica->Root);
|
|
|
|
hRes = pInstance->Put( L"ReplicaMemberRoot", 0, &var, 0 );
|
|
VariantClear(&var);
|
|
if(hRes != WBEM_S_NO_ERROR)
|
|
break;
|
|
|
|
|
|
//String ReplicaMemberStage;
|
|
|
|
V_VT(&var) = VT_BSTR;
|
|
V_BSTR(&var) = SysAllocString(Replica->Stage);
|
|
|
|
hRes = pInstance->Put( L"ReplicaMemberStage", 0, &var, 0 );
|
|
VariantClear(&var);
|
|
if(hRes != WBEM_S_NO_ERROR)
|
|
break;
|
|
|
|
|
|
//String FileFilter;
|
|
|
|
V_VT(&var) = VT_BSTR;
|
|
V_BSTR(&var) = SysAllocString(Replica->FileFilterList);
|
|
|
|
hRes = pInstance->Put( L"FileFilter", 0, &var, 0 );
|
|
VariantClear(&var);
|
|
if(hRes != WBEM_S_NO_ERROR)
|
|
break;
|
|
|
|
|
|
//String DirFilter;
|
|
|
|
V_VT(&var) = VT_BSTR;
|
|
V_BSTR(&var) = SysAllocString(Replica->DirFilterList);
|
|
|
|
hRes = pInstance->Put( L"DirFilter", 0, &var, 0 );
|
|
VariantClear(&var);
|
|
if(hRes != WBEM_S_NO_ERROR)
|
|
break;
|
|
|
|
//String ReplicaMemberState;
|
|
|
|
V_VT(&var) = VT_BSTR;
|
|
TempStr = (PWCHAR)FrsAlloc((strlen(RSS_NAME(Replica->ServiceState)) + 1) * sizeof(WCHAR));
|
|
wsprintf(TempStr, L"%hs", RSS_NAME(Replica->ServiceState));
|
|
V_BSTR(&var) = SysAllocString(TempStr);
|
|
hRes = pInstance->Put( L"ReplicaMemberState", 0, &var, 0 );
|
|
TempStr = (PWCHAR)FrsFree(TempStr);
|
|
VariantClear(&var);
|
|
if(hRes != WBEM_S_NO_ERROR)
|
|
break;
|
|
|
|
//String ReplicaSetType;
|
|
|
|
V_VT(&var) = VT_BSTR;
|
|
V_BSTR(&var) = SysAllocString(FRS_RSTYPE_IS_SYSVOL(Replica->ReplicaSetType)?
|
|
L"SYSVOL" : L"DFS");
|
|
hRes = pInstance->Put( L"ReplicaSetType", 0, &var, 0 );
|
|
VariantClear(&var);
|
|
if(hRes != WBEM_S_NO_ERROR)
|
|
break;
|
|
|
|
// Default values for other fields.
|
|
*/
|
|
//
|
|
// Send the result to WMI.
|
|
//
|
|
hRes = pResponseHandler->Indicate(1, &pInstance);
|
|
|
|
if(hRes != WBEM_S_NO_ERROR)
|
|
break;
|
|
|
|
pInstance->Release();
|
|
|
|
// TODO : Optimize this by storing all the return objects
|
|
// in an array and then indicating all the objects to
|
|
// WMI in 1 shot.
|
|
}
|
|
|
|
//
|
|
// Indicate to WMI that we are done.
|
|
//
|
|
ODS(L"Completed instance enumeration. Setting status.\n");
|
|
pResponseHandler->SetStatus(WBEM_STATUS_COMPLETE, hRes, NULL, NULL);
|
|
ODS(L"Finished setting status. Returning from EnumNtFrsMemberStatus()\n");
|
|
|
|
return hRes;
|
|
}
|
|
|
|
HRESULT CProvider::EnumNtFrsConnectionStatus(
|
|
IN IWbemContext *pCtx,
|
|
IN IWbemObjectSink *pResponseHandler,
|
|
IN const BSTR bstrFilterValue)
|
|
/*++
|
|
Routine Description:
|
|
Enumerates all instances of the Microsoft_NtFrsConnectionStatus
|
|
class. Instances are indicated using the pResponseHandler
|
|
interface.
|
|
|
|
Arguments:
|
|
pCtx : [in] Typically NULL. Otherwise, this is a pointer to an IWbemContext
|
|
object that may be used by the provider producing the requested class or
|
|
instance.
|
|
|
|
pResponseHandler : [in] Pointer to the caller's implementation of IWbemObjectSink.
|
|
This handler receives the requested objects when it becomes available through the
|
|
IWbemObjectSink::Indicate method.
|
|
|
|
bstrFilterValue : [in] A filter which limits the returned instances to
|
|
a subset of the actual instances. If NULL, all instances are returned.
|
|
|
|
Return Value:
|
|
Status of operation.
|
|
--*/
|
|
|
|
{
|
|
#undef DEBSUB
|
|
#define DEBSUB "CProvider::EnumNtFrsConnectionStatus:"
|
|
|
|
IWbemClassObject *pInstance;
|
|
PVOID Key1;
|
|
PVOID Key2;
|
|
PREPLICA Replica;
|
|
PCXTION Cxtion;
|
|
VARIANT var;
|
|
WCHAR GuidWStr[GUID_CHAR_LEN + 1];
|
|
CHAR TimeStr[TIME_STRING_LENGTH];
|
|
PWCHAR TempStr = NULL;
|
|
|
|
HRESULT hRes = WBEM_S_NO_ERROR;
|
|
|
|
Key1 = NULL;
|
|
while (Replica = (PREPLICA)GTabNextDatum(ReplicasByGuid, &Key1)) {
|
|
if (Replica->Cxtions == NULL) {
|
|
continue;
|
|
}
|
|
|
|
if (Replica->ReplicaSetType == FRS_RSTYPE_DOMAIN_SYSVOL) {
|
|
continue;
|
|
}
|
|
|
|
Key2 = NULL;
|
|
while (Cxtion = (PCXTION)GTabNextDatum(Replica->Cxtions, &Key2)) {
|
|
|
|
if (Cxtion->JrnlCxtion == TRUE) {
|
|
continue;
|
|
}
|
|
//
|
|
// Spawn an instance of the Microsoft_NtFrsConnectionStatus object.
|
|
//
|
|
m_ipMicrosoftFrs_DfsConnectionClassDef->SpawnInstance(0, &pInstance);
|
|
|
|
//
|
|
// TODO : Fill in the members of this object.
|
|
//
|
|
// String ReplicaSetGUID;
|
|
|
|
// String PartnerGUID;
|
|
//
|
|
// String ConnectionName;
|
|
// String ConnectionGUID;
|
|
// String PartnerDnsName;
|
|
// String ConnectionState;
|
|
// DATETIME LastJoinTime;
|
|
// boolean Inbound;
|
|
//
|
|
// String OBPartnerState;
|
|
// uint32 OBPartnerLeadIndex
|
|
// uint32 OBPartnerTrailIndex
|
|
// uint32 OBPartnerOutstandingCOs
|
|
// uint32 OBPartnerOutstandingQuota
|
|
|
|
/*
|
|
//String ReplicaSetGUID;
|
|
|
|
if (Replica->ReplicaName != NULL) {
|
|
V_VT(&var) = VT_BSTR;
|
|
GuidToStrW(Replica->ReplicaName->Guid, GuidWStr);
|
|
V_BSTR(&var) = SysAllocString(GuidWStr);
|
|
|
|
hRes = pInstance->Put( L"ReplicaSetGUID", 0, &var, 0 );
|
|
VariantClear(&var);
|
|
|
|
if(hRes != WBEM_S_NO_ERROR)
|
|
break;
|
|
}
|
|
|
|
//String PartnerGUID;
|
|
|
|
|
|
if (Cxtion->Partner != NULL) {
|
|
V_VT(&var) = VT_BSTR;
|
|
GuidToStrW(Cxtion->Partner->Guid, GuidWStr);
|
|
V_BSTR(&var) = SysAllocString(GuidWStr);
|
|
|
|
hRes = pInstance->Put( L"PartnerGUID", 0, &var, 0 );
|
|
VariantClear(&var);
|
|
|
|
if(hRes != WBEM_S_NO_ERROR)
|
|
break;
|
|
}
|
|
|
|
|
|
//String ConnectionName;
|
|
|
|
if (Cxtion->Name != NULL) {
|
|
V_VT(&var) = VT_BSTR;
|
|
V_BSTR(&var) = SysAllocString(Cxtion->Name->Name);
|
|
|
|
hRes = pInstance->Put( L"ConnectionName", 0, &var, 0 );
|
|
VariantClear(&var);
|
|
|
|
if(hRes != WBEM_S_NO_ERROR)
|
|
break;
|
|
|
|
|
|
//String ConnectionGUID;
|
|
|
|
V_VT(&var) = VT_BSTR;
|
|
GuidToStrW(Cxtion->Name->Guid, GuidWStr);
|
|
V_BSTR(&var) = SysAllocString(GuidWStr);
|
|
|
|
hRes = pInstance->Put( L"ConnectionGUID", 0, &var, 0 );
|
|
VariantClear(&var);
|
|
|
|
if(hRes != WBEM_S_NO_ERROR)
|
|
break;
|
|
}
|
|
|
|
|
|
|
|
|
|
//String PartnerDnsName;
|
|
|
|
V_VT(&var) = VT_BSTR;
|
|
V_BSTR(&var) = SysAllocString(Cxtion->PartnerDnsName);
|
|
|
|
hRes = pInstance->Put( L"PartnerDnsName", 0, &var, 0 );
|
|
VariantClear(&var);
|
|
if(hRes != WBEM_S_NO_ERROR)
|
|
break;
|
|
|
|
|
|
//String ConnectionState;
|
|
|
|
V_VT(&var) = VT_BSTR;
|
|
TempStr = (PWCHAR)FrsAlloc((strlen(CxtionStateNames[Cxtion->State]) + 1) * sizeof(WCHAR));
|
|
wsprintf(TempStr, L"%hs", CxtionStateNames[Cxtion->State]);
|
|
V_BSTR(&var) = SysAllocString(TempStr);
|
|
hRes = pInstance->Put( L"ConnectionState", 0, &var, 0 );
|
|
TempStr = (PWCHAR)FrsFree(TempStr);
|
|
VariantClear(&var);
|
|
if(hRes != WBEM_S_NO_ERROR)
|
|
break;
|
|
|
|
|
|
//String LastJoinTime;
|
|
|
|
V_VT(&var) = VT_BSTR;
|
|
FileTimeToString((PFILETIME) &Cxtion->LastJoinTime, TimeStr);
|
|
TempStr = (PWCHAR)FrsAlloc((strlen(TimeStr) + 1) * sizeof(WCHAR));
|
|
wsprintf(TempStr, L"%hs", TimeStr);
|
|
V_BSTR(&var) = SysAllocString(TempStr);
|
|
hRes = pInstance->Put( L"LastJoinTime", 0, &var, 0 );
|
|
TempStr = (PWCHAR)FrsFree(TempStr);
|
|
VariantClear(&var);
|
|
if(hRes != WBEM_S_NO_ERROR) {
|
|
break;
|
|
}
|
|
|
|
|
|
//boolean Inbound;
|
|
|
|
V_VT(&var) = VT_BOOL;
|
|
V_BOOL(&var) = (Cxtion->Inbound)? VARIANT_TRUE : VARIANT_FALSE ;
|
|
hRes = pInstance->Put( L"Inbound", 0, &var, 0 );
|
|
VariantClear(&var);
|
|
if(hRes != WBEM_S_NO_ERROR)
|
|
break;
|
|
|
|
|
|
if (Cxtion->Inbound == FALSE && Cxtion->OLCtx != NULL) {
|
|
//String OBPartnerState;
|
|
|
|
V_VT(&var) = VT_BSTR;
|
|
TempStr = (PWCHAR)FrsAlloc((strlen(OLPartnerStateNames[Cxtion->OLCtx->State]) + 1) * sizeof(WCHAR));
|
|
wsprintf(TempStr, L"%hs", OLPartnerStateNames[Cxtion->OLCtx->State]);
|
|
V_BSTR(&var) = SysAllocString(TempStr);
|
|
hRes = pInstance->Put( L"OBPartnerState", 0, &var, 0 );
|
|
TempStr = (PWCHAR)FrsFree(TempStr);
|
|
VariantClear(&var);
|
|
if(hRes != WBEM_S_NO_ERROR)
|
|
break;
|
|
|
|
|
|
//uint32 OBPartnerleadIndex;
|
|
|
|
V_VT(&var) = VT_I4;
|
|
V_I4(&var) = Cxtion->OLCtx->COLx;
|
|
hRes = pInstance->Put( L"OBPartnerLeadIndex", 0, &var, 0 );
|
|
VariantClear(&var);
|
|
if(hRes != WBEM_S_NO_ERROR)
|
|
break;
|
|
|
|
|
|
//uint32 OBPartnerTrailIndex;
|
|
|
|
V_VT(&var) = VT_I4;
|
|
V_I4(&var) = Cxtion->OLCtx->COTx;
|
|
hRes = pInstance->Put( L"OBPartnerTrailIndex", 0, &var, 0 );
|
|
VariantClear(&var);
|
|
if(hRes != WBEM_S_NO_ERROR)
|
|
break;
|
|
|
|
|
|
//uint32 OBPartnerOutstandingCOs;
|
|
|
|
V_VT(&var) = VT_I4;
|
|
V_I4(&var) = Cxtion->OLCtx->OutstandingCos;
|
|
hRes = pInstance->Put( L"OBPartnerOutstandingCOs", 0, &var, 0 );
|
|
VariantClear(&var);
|
|
if(hRes != WBEM_S_NO_ERROR)
|
|
break;
|
|
|
|
|
|
//uint32 OBPartnerOutstandingQuota;
|
|
|
|
V_VT(&var) = VT_I4;
|
|
V_I4(&var) = Cxtion->OLCtx->OutstandingQuota;
|
|
hRes = pInstance->Put( L"OBPartnerOutstandingQuota", 0, &var, 0 );
|
|
VariantClear(&var);
|
|
if(hRes != WBEM_S_NO_ERROR)
|
|
break;
|
|
|
|
}
|
|
*/
|
|
//
|
|
// Send the result to WMI.
|
|
//
|
|
hRes = pResponseHandler->Indicate(1, &pInstance);
|
|
|
|
|
|
if(hRes != WBEM_S_NO_ERROR)
|
|
break;
|
|
|
|
pInstance->Release();
|
|
|
|
}
|
|
}
|
|
|
|
//
|
|
// Indicate to WMI that we are done.
|
|
//
|
|
ODS(L"Completed instance enumeration. Setting status.\n");
|
|
pResponseHandler->SetStatus(WBEM_STATUS_COMPLETE, hRes, NULL, NULL);
|
|
ODS(L"Finished setting status. Returning from EnumNtFrsMemberStatus()\n");
|
|
|
|
return hRes;
|
|
}
|
|
|
|
//
|
|
// IWbemEventProvider interface
|
|
//
|
|
|
|
STDMETHODIMP CProvider::ProvideEvents(
|
|
IWbemObjectSink __RPC_FAR *pSink,
|
|
long lFlags )
|
|
{
|
|
ODS(L"IwbemEventProvider::ProvideEvents() called.\n");
|
|
|
|
pSink->AddRef();
|
|
m_pEventSink = pSink;
|
|
|
|
return WBEM_S_NO_ERROR;
|
|
}
|
|
|
|
|
|
//
|
|
// TODO : TO send events to the collector, construct an instance of
|
|
// the required class and then call CProvider::m_pEventSink->Indicate();
|
|
//
|
|
// Note that the any objects sent as an event must be derived from
|
|
// the class __ExtrinsicEvent.
|
|
//
|