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.
462 lines
9.6 KiB
462 lines
9.6 KiB
/*++
|
|
|
|
Copyright (C) 1996-2001 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
ProvSubS.cpp
|
|
|
|
Abstract:
|
|
|
|
|
|
History:
|
|
|
|
--*/
|
|
|
|
#include <precomp.h>
|
|
#include <wbemint.h>
|
|
|
|
#include <HelperFuncs.h>
|
|
|
|
#include "Guids.h"
|
|
#include "Globals.h"
|
|
#include "CGlobals.h"
|
|
#include "ProvSubS.h"
|
|
#include "ProvFact.h"
|
|
#include "ProvAggr.h"
|
|
#include "ProvLoad.h"
|
|
#include "ProvWsv.h"
|
|
#include "ProvObSk.h"
|
|
|
|
#include "ProvCache.h"
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
LONG CompareElement ( const HostCacheKey &a_Arg1 , const HostCacheKey &a_Arg2 )
|
|
{
|
|
return a_Arg1.Compare ( a_Arg2 ) ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
LONG CompareElement ( const BindingFactoryCacheKey &a_Arg1 , const BindingFactoryCacheKey &a_Arg2 )
|
|
{
|
|
return a_Arg1.Compare ( a_Arg2 ) ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
LONG CompareElement ( const ProviderCacheKey &a_Arg1 , const ProviderCacheKey &a_Arg2 )
|
|
{
|
|
return a_Arg1.Compare ( a_Arg2 ) ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
LONG CompareElement ( const GUID &a_Guid1 , const GUID &a_Guid2 )
|
|
{
|
|
return memcmp ( & a_Guid1, & a_Guid2 , sizeof ( GUID ) ) ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
LONG CompareElement ( const LONG &a_Arg1 , const LONG &a_Arg2 )
|
|
{
|
|
return a_Arg1 - a_Arg2 ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HostController :: HostController ( WmiAllocator &a_Allocator ) : CWbemGlobal_IWmiHostController ( a_Allocator )
|
|
{
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
WmiStatusCode HostController :: StrobeBegin ( const ULONG &a_Period )
|
|
{
|
|
ULONG t_Timeout = ProviderSubSystem_Globals :: GetStrobeThread ().GetTimeout () ;
|
|
ProviderSubSystem_Globals :: GetStrobeThread ().SetTimeout ( t_Timeout < a_Period ? t_Timeout : a_Period ) ;
|
|
return e_StatusCode_Success ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
RefresherManagerController :: RefresherManagerController ( WmiAllocator &a_Allocator ) : CWbemGlobal_IWbemRefresherMgrController ( a_Allocator )
|
|
{
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
WmiStatusCode RefresherManagerController :: StrobeBegin ( const ULONG &a_Period )
|
|
{
|
|
ULONG t_Timeout = ProviderSubSystem_Globals :: GetStrobeThread ().GetTimeout () ;
|
|
ProviderSubSystem_Globals :: GetStrobeThread ().SetTimeout ( t_Timeout < a_Period ? t_Timeout : a_Period ) ;
|
|
return e_StatusCode_Success ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
ProviderController :: ProviderController (
|
|
|
|
WmiAllocator &a_Allocator ,
|
|
CWbemGlobal_HostedProviderController *a_Controller ,
|
|
DWORD a_ProcessIdentifier
|
|
|
|
) : m_Container ( a_Allocator ) ,
|
|
m_CriticalSection(NOTHROW_LOCK),
|
|
HostedProviderContainerElement (
|
|
|
|
a_Controller ,
|
|
a_ProcessIdentifier
|
|
)
|
|
{
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
ProviderController :: ~ProviderController ()
|
|
{
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
STDMETHODIMP_( ULONG ) ProviderController :: AddRef ()
|
|
{
|
|
return HostedProviderContainerElement :: AddRef () ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
STDMETHODIMP_( ULONG ) ProviderController :: Release ()
|
|
{
|
|
return HostedProviderContainerElement :: Release () ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
STDMETHODIMP ProviderController :: QueryInterface (
|
|
|
|
REFIID iid ,
|
|
LPVOID FAR *iplpv
|
|
)
|
|
{
|
|
*iplpv = NULL ;
|
|
|
|
if ( iid == IID_IUnknown )
|
|
{
|
|
*iplpv = ( LPVOID ) this ;
|
|
}
|
|
else if ( iid == IID_ProviderController )
|
|
{
|
|
*iplpv = ( LPVOID ) ( ProviderController * ) this ;
|
|
}
|
|
|
|
if ( *iplpv )
|
|
{
|
|
( ( LPUNKNOWN ) *iplpv )->AddRef () ;
|
|
|
|
return ResultFromScode ( S_OK ) ;
|
|
}
|
|
else
|
|
{
|
|
return ResultFromScode ( E_NOINTERFACE ) ;
|
|
}
|
|
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
WmiStatusCode ProviderController :: Initialize ()
|
|
{
|
|
WmiStatusCode t_StatusCode = m_Container.Initialize () ;
|
|
if ( t_StatusCode == e_StatusCode_Success )
|
|
{
|
|
t_StatusCode = m_CriticalSection.valid() ? e_StatusCode_Success : e_StatusCode_OutOfMemory;
|
|
}
|
|
|
|
return t_StatusCode ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
WmiStatusCode ProviderController :: UnInitialize ()
|
|
{
|
|
WmiStatusCode t_StatusCode = m_Container.UnInitialize () ;
|
|
return t_StatusCode ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
WmiStatusCode ProviderController :: Insert (
|
|
|
|
CInterceptor_IWbemProvider *a_Element ,
|
|
Container_Iterator &a_Iterator
|
|
)
|
|
{
|
|
Lock () ;
|
|
|
|
Container_Iterator t_Iterator ;
|
|
WmiStatusCode t_StatusCode = m_Container.Insert ( a_Element , a_Element , t_Iterator ) ;
|
|
if ( t_StatusCode == e_StatusCode_Success )
|
|
{
|
|
a_Element->NonCyclicAddRef () ;
|
|
}
|
|
|
|
UnLock () ;
|
|
|
|
return t_StatusCode ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
WmiStatusCode ProviderController :: Delete (
|
|
|
|
CInterceptor_IWbemProvider * const &a_Key
|
|
)
|
|
{
|
|
Lock () ;
|
|
|
|
WmiStatusCode t_StatusCode = m_Container.Delete ( a_Key ) ;
|
|
|
|
UnLock () ;
|
|
|
|
return t_StatusCode ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
WmiStatusCode ProviderController :: Find (
|
|
|
|
CInterceptor_IWbemProvider * const &a_Key ,
|
|
Container_Iterator &a_Iterator
|
|
)
|
|
{
|
|
Lock () ;
|
|
|
|
WmiStatusCode t_StatusCode = m_Container.Find ( a_Key , a_Iterator ) ;
|
|
if ( t_StatusCode == e_StatusCode_Success )
|
|
{
|
|
a_Iterator.GetElement ()->NonCyclicAddRef ( ) ;
|
|
}
|
|
|
|
UnLock () ;
|
|
|
|
return t_StatusCode ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
WmiStatusCode ProviderController :: Lock ()
|
|
{
|
|
if (!m_CriticalSection.valid())
|
|
return e_StatusCode_OutOfMemory;
|
|
|
|
while (!m_CriticalSection.acquire())
|
|
Sleep(1000);
|
|
|
|
return e_StatusCode_Success ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
WmiStatusCode ProviderController :: UnLock ()
|
|
{
|
|
m_CriticalSection.release();
|
|
return e_StatusCode_Success ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
WmiStatusCode ProviderController :: Shutdown ()
|
|
{
|
|
Lock () ;
|
|
|
|
Container_Iterator t_Iterator = m_Container.Root ();
|
|
|
|
while ( ! t_Iterator.Null () )
|
|
{
|
|
m_Container.Delete ( t_Iterator.GetKey () ) ;
|
|
t_Iterator = m_Container.Root () ;
|
|
}
|
|
|
|
UnLock () ;
|
|
|
|
return e_StatusCode_Success ;
|
|
}
|