windows-nt/Source/XPSP1/NT/ds/netapi/svcimgs/ntrepl/frswmipv/frswmipv.cpp

977 lines
28 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
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.
//