Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

490 lines
9.8 KiB

/*++
Copyright (C) 1996-2001 Microsoft Corporation
Module Name:
XXXX
Abstract:
History:
--*/
#include "precomp.h"
#include <objbase.h>
#include <wbemint.h>
#include <wbemcli.h>
#include "Globals.h"
#include "ProvRegDeCoupled.h"
#include <wmiutils.h>
#include "CGlobals.h"
#include "provcache.h"
#include "aggregator.h"
#include "ProvWsvS.h"
#include <assertbreak.h>
#include <dothrow.h>
#include <os.h>
class DCProxyAggr;
DC_reg::DC_reg( const DC_reg& rhs ):
service_(rhs.service_), context_(rhs.context_),
flags_( rhs.flags_),
CServerObject_DecoupledClientRegistration_Element()
{
*(CServerObject_DecoupledClientRegistration_Element *)(this) = rhs;
};
HRESULT
DC_reg::Load(
long a_Flags,
IWbemContext *a_Context ,
LPCWSTR a_User ,
LPCWSTR a_Locale ,
LPCWSTR a_Scope ,
LPCWSTR a_Registration ,
IUnknown *a_Unknown ,
GUID a_Identity )
{
wchar_t identity[] = L"{00000000-0000-0000-0000-000000000000}";
StringFromGUID2 ( a_Identity, identity, sizeof(identity)/sizeof(identity[0]) ) ;
HRESULT t_Result;
if (
FAILED ( t_Result = SetScope( const_cast<LPWSTR>(a_Scope) ) ) ||
FAILED ( t_Result = SetProvider( const_cast<LPWSTR>(a_Registration) ) ) ||
FAILED ( t_Result = SetUser ( const_cast<LPWSTR>(a_User) ) ) ||
FAILED ( t_Result = SetLocale( const_cast<LPWSTR>(a_Locale) ) ) ||
FAILED ( t_Result = SetClsid( const_cast<LPWSTR>(identity) ) )
)
return t_Result;
flags_ = a_Flags;
service_ = a_Unknown;
context_ = a_Context;
return t_Result;
};
const DC_reg&
DC_reg::operator=(const DC_reg& rhs)
{
CServerObject_DecoupledClientRegistration_Element(*this) = rhs;
service_ = rhs.service_;
context_ = rhs.context_;
return *this;
};
GUID
DC_reg::identity()
{
GUID t_Identity ;
CLSIDFromString ( GetClsid () , & t_Identity ) ;
return t_Identity;
};
IUnknownPtr
DC_reg::service()
{
if( service_ )
return service_;
BSTR t_CreationTime = GetCreationTime () ;
DWORD t_ProcessIdentifier = GetProcessIdentifier () ;
BYTE *t_MarshaledProxy = GetMarshaledProxy () ;
DWORD t_MarshaledProxyLength = GetMarshaledProxyLength () ;
HRESULT t_Result;
if ( t_CreationTime && t_MarshaledProxy )
{
IUnknown *t_Unknown = NULL ;
t_Result = DecoupledProviderSubSystem_Globals :: UnMarshalRegistration ( & t_Unknown , t_MarshaledProxy , t_MarshaledProxyLength ) ;
if ( SUCCEEDED ( t_Result ) ) service_.Attach( t_Unknown );
}
return service_;
};
// Register a requested provider
// on waiting list for the decoupled partner
void
DC_DBReg::Register( const DC_DBkey& key, auto_ref<DCProxyAggr>& ptr)
{
LockGuard<CriticalSection> t_guard(m_Mutex);
aggregators_.regist(ptr, key);
};
// UnRegister a Pseudo Provider
void DC_DBReg::UnRegister( auto_ref<DCProxyAggr>& ptr)
{
LockGuard<CriticalSection> t_guard(m_Mutex);
aggregators_.unregist(ptr);
};
// a a Decoupled provider
HRESULT DC_DBReg::Register( DC_reg& reg )
{
LockGuard<CriticalSection> t_guard(m_Mutex);
if (t_guard.locked() == false)
return WBEM_E_OUT_OF_MEMORY;
// Search for the provider on the namespace
for(requested_providers::iterator it=aggregators_.begin(); it!=aggregators_.end(); ++it)
if(it->key_.equal( reg ) )
break;
if ( it != aggregators_.end() )
return it->client_->Register(reg);
return S_OK;
};
// Unregister a Decoupled provider
HRESULT DC_DBReg::UnRegister( const DC_DBkey& key, const GUID identity )
{
LockGuard<CriticalSection> t_guard(m_Mutex);
if (t_guard.locked() == false)
return WBEM_E_OUT_OF_MEMORY;
for(requested_providers::iterator it=aggregators_.begin(); it!=aggregators_.end(); ++it)
if( it->key_ == key )
{
it->client_->UnRegister(identity);
return S_OK;
}
return S_OK;
};
auto_ref<DCProxyAggr>
DC_DBReg::find(const DC_DBkey& reg) const
{
LockGuard<CriticalSection> t_guard(m_Mutex);
for(requested_providers::iterator it=aggregators_.begin(); it!=aggregators_.end(); ++it)
if( it->key_ == reg )
{
return it->client_;
};
return auto_ref<DCProxyAggr>(NULL);
};
auto_ref<DCProxyAggr>
DC_DBReg::GetAggregator(const DC_DBkey& key) const
{
auto_ref<DCProxyAggr> tmp = find( key );
if( tmp )
return tmp;
return auto_ref<DCProxyAggr>( new DCProxyAggr() );
};
DC_registrar * DC_registrar::instance_ = NULL;
CriticalSection DC_registrar::m_Mutex(NOTHROW_LOCK);
DC_registrar::DC_registrar ():m_ReferenceCount(1)
{
InterlockedIncrement(&DecoupledProviderSubSystem_Globals::s_RegistrarUsers);
CServerObject_DecoupledClientRegistration_Element::VerifyClientKey();
}
DC_registrar::~DC_registrar ()
{
instance_ = NULL;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
HRESULT
DC_registrar::QueryInterface (REFIID iid ,
LPVOID FAR *iplpv)
{
if (iplpv == NULL)
return E_POINTER;
if (iid == IID_IUnknown)
*iplpv = static_cast<IUnknown *>(this);
else if (iid == IID__IWmiProviderSubsystemRegistrar)
*iplpv = static_cast<_IWmiProviderSubsystemRegistrar *>(this);
else
{
*iplpv = NULL;
return E_NOINTERFACE;
}
AddRef ();
return S_OK;
}
ULONG
DC_registrar::AddRef ()
{
LONG counter = InterlockedIncrement(&m_ReferenceCount);
InterlockedIncrement(&DecoupledProviderSubSystem_Globals::s_RegistrarUsers);
return counter;
}
ULONG
DC_registrar::Release ()
{
InterlockedDecrement (&DecoupledProviderSubSystem_Globals::s_RegistrarUsers);
LONG t_Reference = InterlockedDecrement(&m_ReferenceCount);
if (0 == t_Reference)
{
delete this ;
}
return t_Reference ;
}
HRESULT
DC_registrar :: Register (
long a_Flags ,
IWbemContext *a_Context ,
LPCWSTR a_User ,
LPCWSTR a_Locale ,
LPCWSTR a_Scope ,
LPCWSTR a_Registration ,
DWORD a_ProcessIdentifier ,
IUnknown *a_Unknown ,
GUID a_Identity
)
{
try
{
DC_reg t_Element;
t_Element.Load( a_Flags, a_Context, a_User, a_Locale, a_Scope, a_Registration, a_Unknown, a_Identity );
return mapping_database_.Register(t_Element);
}
catch(...){
return WBEM_E_PROVIDER_FAILURE ;
};
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
HRESULT
DC_registrar::UnRegister (
long a_Flags ,
IWbemContext *a_Context ,
LPCWSTR a_User ,
LPCWSTR a_Locale ,
LPCWSTR a_Scope ,
LPCWSTR a_Registration ,
GUID a_Identity
)
{
try
{
DC_DBkey key( a_User, a_Locale, a_Scope, a_Registration);
return mapping_database_.UnRegister(key, a_Identity);
}
catch(...)
{
return WBEM_E_PROVIDER_FAILURE ;
};
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
HRESULT DC_registrar :: SaveToRegistry (
IUnknown *a_Unknown ,
BYTE *a_MarshaledProxy ,
DWORD a_MarshaledProxyLength
)
{
HRESULT t_Result = S_OK ;
CServerObject_DecoupledServerRegistration t_Element ( *DecoupledProviderSubSystem_Globals :: s_Allocator ) ;
BSTR t_CreationTime = NULL ;
FILETIME t_CreationFileTime ;
FILETIME t_ExitFileTime ;
FILETIME t_KernelFileTime ;
FILETIME t_UserFileTime ;
BOOL t_Status = OS::GetProcessTimes (
GetCurrentProcess (),
& t_CreationFileTime,
& t_ExitFileTime,
& t_KernelFileTime,
& t_UserFileTime
);
if ( t_Status )
{
CWbemDateTime t_Time ;
t_Time.SetFileTimeDate ( t_CreationFileTime , VARIANT_FALSE ) ;
t_Result = t_Time.GetValue ( & t_CreationTime ) ;
if ( SUCCEEDED ( t_Result ) )
{
t_Result = t_Element.SetProcessIdentifier ( GetCurrentProcessId () ) ;
if ( SUCCEEDED ( t_Result ) )
{
t_Result = t_Element.SetCreationTime ( ( BSTR ) t_CreationTime ) ;
}
if ( SUCCEEDED ( t_Result ) )
{
t_Result = t_Element.SetMarshaledProxy ( a_MarshaledProxy , a_MarshaledProxyLength ) ;
}
if ( SUCCEEDED ( t_Result ) )
{
t_Result = t_Element.Save () ;
}
SysFreeString ( t_CreationTime ) ;
}
else
{
t_Result = WBEM_E_UNEXPECTED ;
}
}
else
{
t_Result = WBEM_E_UNEXPECTED ;
}
return t_Result ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
HRESULT DC_registrar :: Save ()
{
HRESULT t_Result = S_OK ;
try
{
BYTE *t_MarshaledProxy = NULL ;
DWORD t_MarshaledProxyLength = 0 ;
t_Result = DecoupledProviderSubSystem_Globals :: MarshalRegistration (
this ,
t_MarshaledProxy ,
t_MarshaledProxyLength
) ;
if ( SUCCEEDED ( t_Result ) )
{
t_Result = SaveToRegistry (
this ,
t_MarshaledProxy ,
t_MarshaledProxyLength
) ;
delete [] t_MarshaledProxy ;
}
}
catch ( ... )
{
t_Result = WBEM_E_PROVIDER_FAILURE ;
}
return t_Result ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
HRESULT
DC_registrar :: Delete ()
{
HRESULT t_Result = S_OK ;
try
{
CServerObject_DecoupledServerRegistration t_Element ( *DecoupledProviderSubSystem_Globals :: s_Allocator ) ;
t_Result = t_Element.Delete () ;
}
catch ( ... )
{
t_Result = WBEM_E_PROVIDER_FAILURE ;
}
return t_Result ;
}