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.
 
 
 
 
 
 

1882 lines
40 KiB

/*++
Copyright (C) 1996-2001 Microsoft Corporation
Module Name:
XXXX
Abstract:
History:
--*/
#include <PreComp.h>
#include <wbemint.h>
#include "Globals.h"
#include "CGlobals.h"
#include "ProvResv.h"
#include "ProvFact.h"
#include "ProvSubS.h"
#include "ProvRegInfo.h"
#include "ProvSelf.h"
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
CServerObject_IWbemServices :: CServerObject_IWbemServices (
WmiAllocator &a_Allocator
) :
m_ReferenceCount ( 0 ) ,
m_Service ( NULL )
{
InterlockedIncrement ( & ProviderSubSystem_Globals :: s_CServerObject_IWbemServices_ObjectsInProgress ) ;
ProviderSubSystem_Globals :: Increment_Global_Object_Count () ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
CServerObject_IWbemServices :: ~CServerObject_IWbemServices ()
{
if ( m_Service )
{
m_Service->Release () ;
}
InterlockedDecrement ( & ProviderSubSystem_Globals :: s_CServerObject_IWbemServices_ObjectsInProgress ) ;
ProviderSubSystem_Globals :: Decrement_Global_Object_Count () ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
STDMETHODIMP_(ULONG) CServerObject_IWbemServices :: AddRef ( void )
{
return InterlockedIncrement ( & m_ReferenceCount ) ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
STDMETHODIMP_(ULONG) CServerObject_IWbemServices :: Release ( void )
{
LONG t_ReferenceCount = InterlockedDecrement ( & m_ReferenceCount ) ;
if ( t_ReferenceCount == 0 )
{
delete this ;
return 0 ;
}
else
{
return t_ReferenceCount ;
}
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
STDMETHODIMP CServerObject_IWbemServices :: QueryInterface (
REFIID iid ,
LPVOID FAR *iplpv
)
{
*iplpv = NULL ;
if ( iid == IID_IUnknown )
{
*iplpv = ( LPVOID ) this ;
}
else if ( iid == IID_IWbemServices )
{
*iplpv = ( LPVOID ) ( IWbemServices * ) this ;
}
else if ( iid == IID_IWbemProviderInit )
{
*iplpv = ( LPVOID ) ( IWbemProviderInit * ) this ;
}
else if ( iid == IID_IWbemShutdown )
{
*iplpv = ( LPVOID ) ( IWbemShutdown * ) this ;
}
if ( *iplpv )
{
( ( LPUNKNOWN ) *iplpv )->AddRef () ;
return ResultFromScode ( S_OK ) ;
}
else
{
return ResultFromScode ( E_NOINTERFACE ) ;
}
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
HRESULT CServerObject_IWbemServices::OpenNamespace (
const BSTR a_ObjectPath,
long a_Flags,
IWbemContext *a_Context,
IWbemServices **a_NamespaceService,
IWbemCallResult **a_CallResult
)
{
return WBEM_E_NOT_AVAILABLE ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
HRESULT CServerObject_IWbemServices :: CancelAsyncCall (
IWbemObjectSink *a_Sink
)
{
return WBEM_E_NOT_AVAILABLE ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
HRESULT CServerObject_IWbemServices :: QueryObjectSink (
long a_Flags,
IWbemObjectSink **a_Sink
)
{
return WBEM_E_NOT_AVAILABLE ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
HRESULT CServerObject_IWbemServices :: GetObject (
const BSTR a_ObjectPath,
long a_Flags,
IWbemContext *a_Context,
IWbemClassObject **a_Object,
IWbemCallResult **a_CallResult
)
{
return WBEM_E_NOT_AVAILABLE ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
HRESULT CServerObject_IWbemServices :: Write_Msft_WmiProvider_Counters (
IWbemClassObject *a_Object
)
{
if ( ProviderSubSystem_Globals :: GetSharedCounters () )
{
_IWmiObject *t_FastObject = NULL ;
HRESULT t_Result = a_Object->QueryInterface ( IID__IWmiObject , ( void ** ) & t_FastObject ) ;
if ( SUCCEEDED ( t_Result ) )
{
t_FastObject->WriteProp (
L"ProviderOperation_GetObjectAsync" ,
0 ,
sizeof ( UINT64 ) ,
1 ,
CIM_UINT64 ,
& ProviderSubSystem_Globals :: GetSharedCounters ()->m_ProviderOperation_GetObjectAsync
) ;
t_FastObject->WriteProp (
L"ProviderOperation_PutClassAsync" ,
0 ,
sizeof ( UINT64 ) ,
1 ,
CIM_UINT64 ,
& ProviderSubSystem_Globals :: GetSharedCounters ()->m_ProviderOperation_PutClassAsync
) ;
t_FastObject->WriteProp (
L"ProviderOperation_DeleteClassAsync" ,
0 ,
sizeof ( UINT64 ) ,
1 ,
CIM_UINT64 ,
& ProviderSubSystem_Globals :: GetSharedCounters ()->m_ProviderOperation_DeleteClassAsync
) ;
t_FastObject->WriteProp (
L"ProviderOperation_CreateClassEnumAsync" ,
0 ,
sizeof ( UINT64 ) ,
1 ,
CIM_UINT64 ,
& ProviderSubSystem_Globals :: GetSharedCounters ()->m_ProviderOperation_CreateClassEnumAsync
) ;
t_FastObject->WriteProp (
L"ProviderOperation_PutInstanceAsync" ,
0 ,
sizeof ( UINT64 ) ,
1 ,
CIM_UINT64 ,
& ProviderSubSystem_Globals :: GetSharedCounters ()->m_ProviderOperation_PutInstanceAsync
) ;
t_FastObject->WriteProp (
L"ProviderOperation_CreateInstanceEnumAsync" ,
0 ,
sizeof ( UINT64 ) ,
1 ,
CIM_UINT64 ,
& ProviderSubSystem_Globals :: GetSharedCounters ()->m_ProviderOperation_CreateInstanceEnumAsync
) ;
t_FastObject->WriteProp (
L"ProviderOperation_ExecQueryAsync" ,
0 ,
sizeof ( UINT64 ) ,
1 ,
CIM_UINT64 ,
& ProviderSubSystem_Globals :: GetSharedCounters ()->m_ProviderOperation_ExecQueryAsync
) ;
t_FastObject->WriteProp (
L"ProviderOperation_ExecNotificationQueryAsync" ,
0 ,
sizeof ( UINT64 ) ,
1 ,
CIM_UINT64 ,
& ProviderSubSystem_Globals :: GetSharedCounters ()->m_ProviderOperation_ExecNotificationQueryAsync
) ;
t_FastObject->WriteProp (
L"ProviderOperation_DeleteInstanceAsync" ,
0 ,
sizeof ( UINT64 ) ,
1 ,
CIM_UINT64 ,
& ProviderSubSystem_Globals :: GetSharedCounters ()->m_ProviderOperation_DeleteInstanceAsync
) ;
t_FastObject->WriteProp (
L"ProviderOperation_ExecMethodAsync" ,
0 ,
sizeof ( UINT64 ) ,
1 ,
CIM_UINT64 ,
& ProviderSubSystem_Globals :: GetSharedCounters ()->m_ProviderOperation_ExecMethodAsync
) ;
t_FastObject->WriteProp (
L"ProviderOperation_QueryInstances" ,
0 ,
sizeof ( UINT64 ) ,
1 ,
CIM_UINT64,
& ProviderSubSystem_Globals :: GetSharedCounters ()->m_ProviderOperation_QueryInstances
) ;
t_FastObject->WriteProp (
L"ProviderOperation_CreateRefresher" ,
0 ,
sizeof ( UINT64 ) ,
1 ,
CIM_UINT64,
& ProviderSubSystem_Globals :: GetSharedCounters ()->m_ProviderOperation_CreateRefresher
) ;
t_FastObject->WriteProp (
L"ProviderOperation_CreateRefreshableObject" ,
0 ,
sizeof ( UINT64 ) ,
1 ,
CIM_UINT64,
& ProviderSubSystem_Globals :: GetSharedCounters ()->m_ProviderOperation_CreateRefreshableObject
) ;
t_FastObject->WriteProp (
L"ProviderOperation_StopRefreshing" ,
0 ,
sizeof ( UINT64 ) ,
1 ,
CIM_UINT64,
& ProviderSubSystem_Globals :: GetSharedCounters ()->m_ProviderOperation_StopRefreshing
) ;
t_FastObject->WriteProp (
L"ProviderOperation_CreateRefreshableEnum" ,
0 ,
sizeof ( UINT64 ) ,
1 ,
CIM_UINT64,
& ProviderSubSystem_Globals :: GetSharedCounters ()->m_ProviderOperation_CreateRefreshableEnum
) ;
t_FastObject->WriteProp (
L"ProviderOperation_GetObjects" ,
0 ,
sizeof ( UINT64 ) ,
1 ,
CIM_UINT64,
& ProviderSubSystem_Globals :: GetSharedCounters ()->m_ProviderOperation_GetObjects
) ;
t_FastObject->WriteProp (
L"ProviderOperation_GetProperty" ,
0 ,
sizeof ( UINT64 ) ,
1 ,
CIM_UINT64,
& ProviderSubSystem_Globals :: GetSharedCounters ()->m_ProviderOperation_GetProperty
) ;
t_FastObject->WriteProp (
L"ProviderOperation_PutProperty" ,
0 ,
sizeof ( UINT64 ) ,
1 ,
CIM_UINT64,
& ProviderSubSystem_Globals :: GetSharedCounters ()->m_ProviderOperation_PutProperty
) ;
t_FastObject->WriteProp (
L"ProviderOperation_ProvideEvents" ,
0 ,
sizeof ( UINT64 ) ,
1 ,
CIM_UINT64,
& ProviderSubSystem_Globals :: GetSharedCounters ()->m_ProviderOperation_ProvideEvents
) ;
t_FastObject->WriteProp (
L"ProviderOperation_NewQuery" ,
0 ,
sizeof ( UINT64 ) ,
1 ,
CIM_UINT64,
& ProviderSubSystem_Globals :: GetSharedCounters ()->m_ProviderOperation_NewQuery
) ;
t_FastObject->WriteProp (
L"ProviderOperation_CancelQuery" ,
0 ,
sizeof ( UINT64 ) ,
1 ,
CIM_UINT64,
& ProviderSubSystem_Globals :: GetSharedCounters ()->m_ProviderOperation_CancelQuery
) ;
t_FastObject->WriteProp (
L"ProviderOperation_AccessCheck" ,
0 ,
sizeof ( UINT64 ) ,
1 ,
CIM_UINT64,
& ProviderSubSystem_Globals :: GetSharedCounters ()->m_ProviderOperation_AccessCheck
) ;
t_FastObject->WriteProp (
L"ProviderOperation_SetRegistrationObject" ,
0 ,
sizeof ( UINT64 ) ,
1 ,
CIM_UINT64,
& ProviderSubSystem_Globals :: GetSharedCounters ()->m_ProviderOperation_SetRegistrationObject
) ;
t_FastObject->WriteProp (
L"ProviderOperation_FindConsumer" ,
0 ,
sizeof ( UINT64 ) ,
1 ,
CIM_UINT64,
& ProviderSubSystem_Globals :: GetSharedCounters ()->m_ProviderOperation_FindConsumer
) ;
t_FastObject->WriteProp (
L"ProviderOperation_ValidateSubscription" ,
0 ,
sizeof ( UINT64 ) ,
1 ,
CIM_UINT64,
& ProviderSubSystem_Globals :: GetSharedCounters ()->m_ProviderOperation_ValidateSubscription
) ;
t_FastObject->Release () ;
}
return t_Result ;
}
return WBEM_E_NOT_AVAILABLE ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
HRESULT CServerObject_IWbemServices :: GetObjectAsync_Msft_WmiProvider_Counters (
IWbemPath *a_Path,
BSTR a_Class ,
const BSTR a_ObjectPath,
long a_Flags,
IWbemContext *a_Context,
IWbemObjectSink *a_Sink
)
{
HRESULT t_Result = S_OK ;
ULONGLONG t_Information = 0 ;
t_Result = a_Path->GetInfo (
0 ,
& t_Information
) ;
if ( t_Information & WBEMPATH_INFO_IS_SINGLETON )
{
IWbemClassObject *t_Object = NULL ;
t_Result = m_Service->GetObject (
a_Class ,
0 ,
a_Context ,
& t_Object ,
NULL
) ;
if ( SUCCEEDED ( t_Result ) )
{
IWbemClassObject *t_Instance = NULL ;
t_Result = t_Object->SpawnInstance (
0 ,
& t_Instance
) ;
if ( SUCCEEDED ( t_Result ) )
{
t_Result = Write_Msft_WmiProvider_Counters (
t_Instance
) ;
if ( SUCCEEDED ( t_Result ) )
{
t_Result = a_Sink->Indicate ( 1 , & t_Instance ) ;
t_Instance->Release () ;
}
}
}
}
else
{
t_Result = WBEM_E_INVALID_OBJECT_PATH ;
}
return t_Result ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
HRESULT CServerObject_IWbemServices :: GetObjectAsync_Msft_Providers (
IWbemPath *a_Path,
BSTR a_Class ,
const BSTR a_ObjectPath,
long a_Flags,
IWbemContext *a_Context,
IWbemObjectSink *a_Sink
)
{
HRESULT t_Result = S_OK ;
CWbemGlobal_IWmiProvSubSysController *t_SubSystemController = ProviderSubSystem_Globals :: GetProvSubSysController () ;
if ( t_SubSystemController )
{
t_SubSystemController->Lock () ;
CWbemGlobal_IWmiProvSubSysController_Container *t_Container = NULL ;
t_SubSystemController->GetContainer ( t_Container ) ;
if ( t_Container->Size () )
{
CWbemGlobal_IWmiProvSubSysController_Container_Iterator t_Iterator = t_Container->Begin ();
_IWmiProviderConfiguration **t_ControllerElements = new _IWmiProviderConfiguration * [ t_Container->Size () ] ;
if ( t_ControllerElements )
{
ULONG t_Count = 0 ;
while ( ! t_Iterator.Null () )
{
HRESULT t_Result = t_Iterator.GetElement ()->QueryInterface ( IID__IWmiProviderConfiguration , ( void ** ) & t_ControllerElements [ t_Count ] ) ;
t_Iterator.Increment () ;
t_Count ++ ;
}
t_SubSystemController->UnLock () ;
for ( ULONG t_Index = 0 ; t_Index < t_Count ; t_Index ++ )
{
if ( t_ControllerElements [ t_Index ] )
{
t_Result = t_ControllerElements [ t_Index ]->Get (
m_Service ,
a_Flags,
a_Context,
a_Class ,
a_ObjectPath,
a_Sink
) ;
t_ControllerElements [ t_Index ]->Release () ;
}
}
delete [] t_ControllerElements ;
}
else
{
t_SubSystemController->UnLock () ;
}
}
else
{
t_SubSystemController->UnLock () ;
}
}
else
{
t_Result = WBEM_E_CRITICAL_ERROR ;
}
return t_Result ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
HRESULT CServerObject_IWbemServices :: GetObjectAsync (
const BSTR a_ObjectPath,
long a_Flags,
IWbemContext *a_Context,
IWbemObjectSink *a_Sink
)
{
HRESULT t_Result = S_OK ;
IWbemPath *t_Path = NULL ;
if ( a_ObjectPath )
{
t_Result = CoCreateInstance (
CLSID_WbemDefPath ,
NULL ,
CLSCTX_INPROC_SERVER ,
IID_IWbemPath ,
( void ** ) & t_Path
) ;
if ( SUCCEEDED ( t_Result ) )
{
t_Result = t_Path->SetText ( WBEMPATH_CREATE_ACCEPT_ALL , a_ObjectPath ) ;
if ( SUCCEEDED ( t_Result ) )
{
ULONG t_Length = 32 ; // None of supported classes is longer than this length
BSTR t_Class = SysAllocStringLen ( NULL , t_Length ) ;
if ( t_Class )
{
t_Result = t_Path->GetClassName (
& t_Length ,
t_Class
) ;
if ( SUCCEEDED ( t_Result ) )
{
if ( wbem_wcsicmp ( t_Class , L"Msft_WmiProvider_Counters" ) == 0 )
{
t_Result = GetObjectAsync_Msft_WmiProvider_Counters (
t_Path ,
t_Class ,
a_ObjectPath,
a_Flags,
a_Context,
a_Sink
) ;
}
else if ( wbem_wcsicmp ( t_Class , L"Msft_Providers" ) == 0 )
{
t_Result = GetObjectAsync_Msft_Providers (
t_Path ,
t_Class ,
a_ObjectPath,
a_Flags,
a_Context,
a_Sink
) ;
}
else
{
t_Result = WBEM_E_INVALID_CLASS ;
}
}
else
{
t_Result = WBEM_E_INVALID_CLASS ;
}
SysFreeString ( t_Class ) ;
}
else
{
t_Result = WBEM_E_OUT_OF_MEMORY ;
}
}
}
t_Path->Release () ;
}
else
{
t_Result = WBEM_E_INVALID_PARAMETER ;
}
a_Sink->SetStatus ( 0 , t_Result , NULL , NULL ) ;
return t_Result ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
HRESULT CServerObject_IWbemServices :: PutClass (
IWbemClassObject *a_Object,
long a_Flags,
IWbemContext *a_Context,
IWbemCallResult **a_CallResult
)
{
return WBEM_E_NOT_AVAILABLE ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
HRESULT CServerObject_IWbemServices :: PutClassAsync (
IWbemClassObject *a_Object,
long a_Flags,
IWbemContext *a_Context,
IWbemObjectSink *a_Sink
)
{
return WBEM_E_NOT_AVAILABLE ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
HRESULT CServerObject_IWbemServices :: DeleteClass (
const BSTR a_Class,
long a_Flags,
IWbemContext *a_Context,
IWbemCallResult **a_CallResult
)
{
return WBEM_E_NOT_AVAILABLE ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
HRESULT CServerObject_IWbemServices :: DeleteClassAsync (
const BSTR a_Class,
long a_Flags,
IWbemContext *a_Context,
IWbemObjectSink *a_Sink
)
{
return WBEM_E_NOT_AVAILABLE ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
HRESULT CServerObject_IWbemServices :: CreateClassEnum (
const BSTR a_Superclass,
long a_Flags,
IWbemContext *a_Context,
IEnumWbemClassObject **a_Enum
)
{
return WBEM_E_NOT_AVAILABLE ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
SCODE CServerObject_IWbemServices :: CreateClassEnumAsync (
const BSTR a_Superclass,
long a_Flags,
IWbemContext *a_Context,
IWbemObjectSink *a_Sink
)
{
return WBEM_E_NOT_AVAILABLE ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
HRESULT CServerObject_IWbemServices :: PutInstance (
IWbemClassObject *a_Instance,
long a_Flags,
IWbemContext *a_Context,
IWbemCallResult **a_CallResult
)
{
return WBEM_E_NOT_AVAILABLE ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
HRESULT CServerObject_IWbemServices :: PutInstanceAsync (
IWbemClassObject *a_Instance,
long a_Flags,
IWbemContext *a_Context,
IWbemObjectSink *a_Sink
)
{
return WBEM_E_NOT_AVAILABLE ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
HRESULT CServerObject_IWbemServices :: DeleteInstance (
const BSTR a_ObjectPath,
long a_Flags,
IWbemContext *a_Context,
IWbemCallResult **a_CallResult
)
{
return WBEM_E_NOT_AVAILABLE ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
HRESULT CServerObject_IWbemServices :: DeleteInstanceAsync (
const BSTR a_ObjectPath,
long a_Flags,
IWbemContext *a_Context,
IWbemObjectSink *a_Sink
)
{
return WBEM_E_NOT_AVAILABLE ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
HRESULT CServerObject_IWbemServices :: CreateInstanceEnum (
const BSTR a_Class,
long a_Flags,
IWbemContext FAR *a_Context,
IEnumWbemClassObject **a_Enum
)
{
return WBEM_E_NOT_AVAILABLE ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
HRESULT CServerObject_IWbemServices :: CreateInstanceEnumAsync_Msft_Providers (
const BSTR a_Class,
long a_Flags,
IWbemContext *a_Context,
IWbemObjectSink *a_Sink
)
{
HRESULT t_Result = S_OK ;
CWbemGlobal_IWmiProvSubSysController *t_SubSystemController = ProviderSubSystem_Globals :: GetProvSubSysController () ;
if ( t_SubSystemController )
{
t_SubSystemController->Lock () ;
CWbemGlobal_IWmiProvSubSysController_Container *t_Container = NULL ;
t_SubSystemController->GetContainer ( t_Container ) ;
if ( t_Container->Size () )
{
CWbemGlobal_IWmiProvSubSysController_Container_Iterator t_Iterator = t_Container->Begin ();
_IWmiProviderConfiguration **t_ControllerElements = new _IWmiProviderConfiguration * [ t_Container->Size () ] ;
if ( t_ControllerElements )
{
ULONG t_Count = 0 ;
while ( ! t_Iterator.Null () )
{
HRESULT t_Result = t_Iterator.GetElement ()->QueryInterface ( IID__IWmiProviderConfiguration , ( void ** ) & t_ControllerElements [ t_Count ] ) ;
t_Iterator.Increment () ;
t_Count ++ ;
}
t_SubSystemController->UnLock () ;
for ( ULONG t_Index = 0 ; t_Index < t_Count ; t_Index ++ )
{
if ( t_ControllerElements [ t_Index ] )
{
HRESULT t_Result = t_ControllerElements [ t_Index ]->Enumerate (
m_Service ,
a_Flags,
a_Context,
a_Class,
a_Sink
) ;
t_ControllerElements [ t_Index ]->Release () ;
}
}
delete [] t_ControllerElements ;
}
else
{
t_SubSystemController->UnLock () ;
}
}
else
{
t_SubSystemController->UnLock () ;
}
}
else
{
t_Result = WBEM_E_CRITICAL_ERROR ;
}
return t_Result ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
HRESULT CServerObject_IWbemServices :: CreateInstanceEnumAsync_Msft_WmiProvider_Counters (
const BSTR a_Class,
long a_Flags,
IWbemContext *a_Context,
IWbemObjectSink *a_Sink
)
{
IWbemClassObject *t_Object = NULL ;
HRESULT t_Result = m_Service->GetObject (
a_Class ,
0 ,
a_Context ,
& t_Object ,
NULL
) ;
if ( SUCCEEDED ( t_Result ) )
{
IWbemClassObject *t_Instance = NULL ;
t_Result = t_Object->SpawnInstance (
0 ,
& t_Instance
) ;
if ( SUCCEEDED ( t_Result ) )
{
t_Result = Write_Msft_WmiProvider_Counters (
t_Instance
) ;
if ( SUCCEEDED ( t_Result ) )
{
t_Result = a_Sink->Indicate ( 1 , & t_Instance ) ;
}
t_Instance->Release () ;
}
t_Object->Release () ;
}
return t_Result ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
HRESULT CServerObject_IWbemServices :: CreateInstanceEnumAsync (
const BSTR a_Class,
long a_Flags,
IWbemContext *a_Context,
IWbemObjectSink *a_Sink
)
{
HRESULT t_Result = S_OK ;
if ( wbem_wcsicmp ( a_Class , L"Msft_WmiProvider_Counters" ) == 0 )
{
t_Result = CreateInstanceEnumAsync_Msft_WmiProvider_Counters (
a_Class,
a_Flags,
a_Context,
a_Sink
) ;
}
else if ( wbem_wcsicmp ( a_Class , L"Msft_Providers" ) == 0 )
{
t_Result = CreateInstanceEnumAsync_Msft_Providers (
a_Class,
a_Flags,
a_Context,
a_Sink
) ;
}
a_Sink->SetStatus ( 0 , t_Result , NULL , NULL ) ;
return t_Result ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
HRESULT CServerObject_IWbemServices :: ExecQuery (
const BSTR a_QueryLanguage,
const BSTR a_Query,
long a_Flags,
IWbemContext *a_Context,
IEnumWbemClassObject **a_Enum
)
{
return WBEM_E_NOT_AVAILABLE ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
HRESULT CServerObject_IWbemServices :: ExecQueryAsync (
const BSTR a_QueryLanguage,
const BSTR a_Query,
long a_Flags,
IWbemContext *a_Context,
IWbemObjectSink *a_Sink
)
{
return WBEM_E_NOT_AVAILABLE ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
HRESULT CServerObject_IWbemServices :: ExecNotificationQuery (
const BSTR a_QueryLanguage,
const BSTR a_Query,
long a_Flags,
IWbemContext *a_Context,
IEnumWbemClassObject **a_Enum
)
{
return WBEM_E_NOT_AVAILABLE ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
HRESULT CServerObject_IWbemServices :: ExecNotificationQueryAsync (
const BSTR a_QueryLanguage,
const BSTR a_Query,
long a_Flags,
IWbemContext *a_Context,
IWbemObjectSink *a_Sink
)
{
return WBEM_E_NOT_AVAILABLE ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
HRESULT STDMETHODCALLTYPE CServerObject_IWbemServices :: ExecMethod (
const BSTR a_ObjectPath,
const BSTR a_MethodName,
long a_Flags,
IWbemContext *a_Context,
IWbemClassObject *a_InParams,
IWbemClassObject **a_OutParams,
IWbemCallResult **a_CallResult
)
{
return WBEM_E_NOT_AVAILABLE ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
HRESULT CServerObject_IWbemServices :: Helper_ExecMethodAsync_Suspend (
IWbemPath *a_Path ,
const BSTR a_ObjectPath,
const BSTR a_MethodName,
long a_Flags,
IWbemContext *a_Context,
IWbemClassObject *a_InParams,
IWbemObjectSink *a_Sink
)
{
HRESULT t_Result = S_OK ;
CWbemGlobal_IWmiProvSubSysController *t_SubSystemController = ProviderSubSystem_Globals :: GetProvSubSysController () ;
if ( t_SubSystemController )
{
t_SubSystemController->Lock () ;
CWbemGlobal_IWmiProvSubSysController_Container *t_Container = NULL ;
t_SubSystemController->GetContainer ( t_Container ) ;
if ( t_Container->Size () )
{
CWbemGlobal_IWmiProvSubSysController_Container_Iterator t_Iterator = t_Container->Begin ();
_IWmiProviderConfiguration **t_ControllerElements = new _IWmiProviderConfiguration * [ t_Container->Size () ] ;
if ( t_ControllerElements )
{
ULONG t_Count = 0 ;
while ( ! t_Iterator.Null () )
{
HRESULT t_Result = t_Iterator.GetElement ()->QueryInterface ( IID__IWmiProviderConfiguration , ( void ** ) & t_ControllerElements [ t_Count ] ) ;
t_Iterator.Increment () ;
t_Count ++ ;
}
t_SubSystemController->UnLock () ;
for ( ULONG t_Index = 0 ; t_Index < t_Count ; t_Index ++ )
{
if ( t_ControllerElements [ t_Index ] )
{
t_Result = t_ControllerElements [ t_Index ]->Call (
m_Service ,
a_Flags ,
a_Context ,
L"Msft_Providers" ,
a_ObjectPath ,
a_MethodName ,
a_InParams,
a_Sink
) ;
t_ControllerElements [ t_Index ]->Release () ;
}
}
delete [] t_ControllerElements ;
}
else
{
t_SubSystemController->UnLock () ;
}
}
else
{
t_SubSystemController->UnLock () ;
}
}
else
{
t_Result = WBEM_E_CRITICAL_ERROR ;
}
return t_Result ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
HRESULT CServerObject_IWbemServices :: Helper_ExecMethodAsync_Resume (
IWbemPath *a_Path ,
const BSTR a_ObjectPath,
const BSTR a_MethodName,
long a_Flags,
IWbemContext *a_Context,
IWbemClassObject *a_InParams,
IWbemObjectSink *a_Sink
)
{
HRESULT t_Result = S_OK ;
CWbemGlobal_IWmiProvSubSysController *t_SubSystemController = ProviderSubSystem_Globals :: GetProvSubSysController () ;
if ( t_SubSystemController )
{
t_SubSystemController->Lock () ;
CWbemGlobal_IWmiProvSubSysController_Container *t_Container = NULL ;
t_SubSystemController->GetContainer ( t_Container ) ;
if ( t_Container->Size () )
{
CWbemGlobal_IWmiProvSubSysController_Container_Iterator t_Iterator = t_Container->Begin ();
_IWmiProviderConfiguration **t_ControllerElements = new _IWmiProviderConfiguration * [ t_Container->Size () ] ;
if ( t_ControllerElements )
{
ULONG t_Count = 0 ;
while ( ! t_Iterator.Null () )
{
HRESULT t_Result = t_Iterator.GetElement ()->QueryInterface ( IID__IWmiProviderConfiguration , ( void ** ) & t_ControllerElements [ t_Count ] ) ;
t_Iterator.Increment () ;
t_Count ++ ;
}
t_SubSystemController->UnLock () ;
for ( ULONG t_Index = 0 ; t_Index < t_Count ; t_Index ++ )
{
if ( t_ControllerElements [ t_Index ] )
{
t_Result = t_ControllerElements [ t_Index ]->Call (
m_Service ,
a_Flags ,
a_Context ,
L"Msft_Providers" ,
a_ObjectPath ,
a_MethodName ,
a_InParams,
a_Sink
) ;
t_ControllerElements [ t_Index ]->Release () ;
}
}
delete [] t_ControllerElements ;
}
else
{
t_SubSystemController->UnLock () ;
}
}
else
{
t_SubSystemController->UnLock () ;
}
}
else
{
t_Result = WBEM_E_CRITICAL_ERROR ;
}
return t_Result ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
HRESULT CServerObject_IWbemServices :: Helper_ExecMethodAsync_Load (
IWbemPath *a_Path ,
const BSTR a_ObjectPath,
const BSTR a_MethodName,
long a_Flags,
IWbemContext *a_Context,
IWbemClassObject *a_InParams,
IWbemObjectSink *a_Sink
)
{
HRESULT t_Result = S_OK ;
CWbemGlobal_IWmiProvSubSysController *t_SubSystemController = ProviderSubSystem_Globals :: GetProvSubSysController () ;
if ( t_SubSystemController )
{
t_SubSystemController->Lock () ;
CWbemGlobal_IWmiProvSubSysController_Container *t_Container = NULL ;
t_SubSystemController->GetContainer ( t_Container ) ;
if ( t_Container->Size () )
{
CWbemGlobal_IWmiProvSubSysController_Container_Iterator t_Iterator = t_Container->Begin ();
_IWmiProviderConfiguration **t_ControllerElements = new _IWmiProviderConfiguration * [ t_Container->Size () ] ;
if ( t_ControllerElements )
{
ULONG t_Count = 0 ;
while ( ! t_Iterator.Null () )
{
HRESULT t_Result = t_Iterator.GetElement ()->QueryInterface ( IID__IWmiProviderConfiguration , ( void ** ) & t_ControllerElements [ t_Count ] ) ;
t_Iterator.Increment () ;
t_Count ++ ;
}
t_SubSystemController->UnLock () ;
for ( ULONG t_Index = 0 ; t_Index < t_Count ; t_Index ++ )
{
if ( t_ControllerElements [ t_Index ] )
{
t_Result = t_ControllerElements [ t_Index ]->Call (
m_Service ,
a_Flags ,
a_Context ,
L"Msft_Providers" ,
a_ObjectPath ,
a_MethodName ,
a_InParams,
a_Sink
) ;
t_ControllerElements [ t_Index ]->Release () ;
}
}
delete [] t_ControllerElements ;
}
else
{
t_SubSystemController->UnLock () ;
}
}
else
{
t_SubSystemController->UnLock () ;
}
}
else
{
t_Result = WBEM_E_CRITICAL_ERROR ;
}
return t_Result ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
HRESULT CServerObject_IWbemServices :: Helper_ExecMethodAsync_UnLoad (
IWbemPath *a_Path ,
const BSTR a_ObjectPath,
const BSTR a_MethodName,
long a_Flags,
IWbemContext *a_Context,
IWbemClassObject *a_InParams,
IWbemObjectSink *a_Sink
)
{
HRESULT t_Result = S_OK ;
CWbemGlobal_IWmiProvSubSysController *t_SubSystemController = ProviderSubSystem_Globals :: GetProvSubSysController () ;
if ( t_SubSystemController )
{
t_SubSystemController->Lock () ;
CWbemGlobal_IWmiProvSubSysController_Container *t_Container = NULL ;
t_SubSystemController->GetContainer ( t_Container ) ;
if ( t_Container->Size () )
{
CWbemGlobal_IWmiProvSubSysController_Container_Iterator t_Iterator = t_Container->Begin ();
_IWmiProviderConfiguration **t_ControllerElements = new _IWmiProviderConfiguration * [ t_Container->Size () ] ;
if ( t_ControllerElements )
{
ULONG t_Count = 0 ;
while ( ! t_Iterator.Null () )
{
HRESULT t_Result = t_Iterator.GetElement ()->QueryInterface ( IID__IWmiProviderConfiguration , ( void ** ) & t_ControllerElements [ t_Count ] ) ;
t_Iterator.Increment () ;
t_Count ++ ;
}
t_SubSystemController->UnLock () ;
for ( ULONG t_Index = 0 ; t_Index < t_Count ; t_Index ++ )
{
if ( t_ControllerElements [ t_Index ] )
{
t_Result = t_ControllerElements [ t_Index ]->Call (
m_Service ,
a_Flags ,
a_Context ,
L"Msft_Providers" ,
a_ObjectPath ,
a_MethodName ,
a_InParams,
a_Sink
) ;
t_ControllerElements [ t_Index ]->Release () ;
}
}
delete [] t_ControllerElements ;
}
else
{
t_SubSystemController->UnLock () ;
}
}
else
{
t_SubSystemController->UnLock () ;
}
}
else
{
t_Result = WBEM_E_CRITICAL_ERROR ;
}
return t_Result ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
HRESULT CServerObject_IWbemServices :: ExecMethodAsync (
const BSTR a_ObjectPath,
const BSTR a_MethodName,
long a_Flags,
IWbemContext *a_Context,
IWbemClassObject *a_InParams,
IWbemObjectSink *a_Sink
)
{
HRESULT t_Result = S_OK ;
t_Result = CoImpersonateClient () ;
if ( SUCCEEDED ( t_Result ) )
{
t_Result = ProviderSubSystem_Common_Globals :: Check_SecurityDescriptor_CallIdentity (
ProviderSubSystem_Common_Globals :: GetMethodSecurityDescriptor () ,
MASK_PROVIDER_BINDING_BIND ,
& g_ProviderBindingMapping
) ;
CoRevertToSelf () ;
}
if ( SUCCEEDED ( t_Result ) )
{
IWbemPath *t_Path = NULL ;
if ( a_ObjectPath && a_MethodName )
{
t_Result = CoCreateInstance (
CLSID_WbemDefPath ,
NULL ,
CLSCTX_INPROC_SERVER ,
IID_IWbemPath ,
( void ** ) & t_Path
) ;
if ( SUCCEEDED ( t_Result ) )
{
t_Result = t_Path->SetText ( WBEMPATH_CREATE_ACCEPT_ALL , a_ObjectPath ) ;
if ( SUCCEEDED ( t_Result ) )
{
ULONG t_Length = 32 ; // None of supported classes is longer than this length
BSTR t_Class = SysAllocStringLen ( NULL , t_Length ) ;
if ( t_Class )
{
t_Result = t_Path->GetClassName (
& t_Length ,
t_Class
) ;
if ( SUCCEEDED ( t_Result ) )
{
if ( wbem_wcsicmp ( t_Class , L"Msft_Providers" ) == 0 )
{
if ( wbem_wcsicmp ( a_MethodName , L"Suspend" ) == 0 )
{
t_Result = Helper_ExecMethodAsync_Suspend (
t_Path ,
a_ObjectPath,
a_MethodName,
a_Flags,
a_Context,
a_InParams,
a_Sink
) ;
}
else if ( wbem_wcsicmp ( a_MethodName , L"Resume" ) == 0 )
{
t_Result = Helper_ExecMethodAsync_Resume (
t_Path ,
a_ObjectPath,
a_MethodName,
a_Flags,
a_Context,
a_InParams,
a_Sink
) ;
}
else if ( wbem_wcsicmp ( a_MethodName , L"Load" ) == 0 )
{
t_Result = Helper_ExecMethodAsync_Load (
t_Path ,
a_ObjectPath,
a_MethodName,
a_Flags,
a_Context,
a_InParams,
a_Sink
) ;
}
else if ( wbem_wcsicmp ( a_MethodName , L"UnLoad" ) == 0 )
{
t_Result = Helper_ExecMethodAsync_UnLoad (
t_Path ,
a_ObjectPath,
a_MethodName,
a_Flags,
a_Context,
a_InParams,
a_Sink
) ;
}
}
else
{
t_Result = WBEM_E_INVALID_CLASS ;
}
}
SysFreeString ( t_Class ) ;
}
}
t_Path->Release () ;
}
}
else
{
t_Result = WBEM_E_INVALID_PARAMETER ;
t_Result = WBEM_E_INVALID_OBJECT_PATH ;
}
}
a_Sink->SetStatus ( 0 , t_Result , NULL , NULL ) ;
return t_Result ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
HRESULT CServerObject_IWbemServices :: Initialize (
LPWSTR a_User,
LONG a_Flags,
LPWSTR a_Namespace,
LPWSTR a_Locale,
IWbemServices *a_Core ,
IWbemContext *a_Context ,
IWbemProviderInitSink *a_Sink
)
{
HRESULT t_Result = S_OK ;
m_Service = a_Core ;
if ( m_Service )
{
m_Service->AddRef () ;
}
else
{
t_Result = WBEM_E_INVALID_PARAMETER ;
}
a_Sink->SetStatus ( t_Result , 0 ) ;
return t_Result ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
HRESULT CServerObject_IWbemServices :: Shutdown (
LONG a_Flags ,
ULONG a_MaxMilliSeconds ,
IWbemContext *a_Context
)
{
return S_OK ;
}