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.
2037 lines
54 KiB
2037 lines
54 KiB
/*++
|
|
|
|
Copyright (C) 1996-2001 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
Globals.cpp
|
|
|
|
Abstract:
|
|
|
|
|
|
History:
|
|
|
|
--*/
|
|
|
|
#include <precomp.h>
|
|
#include <windows.h>
|
|
#include <objbase.h>
|
|
|
|
#include <initguid.h>
|
|
#ifndef INITGUID
|
|
#define INITGUID
|
|
#endif
|
|
|
|
#include <wbemcli.h>
|
|
#include <wbemint.h>
|
|
#include <winntsec.h>
|
|
#include <callsec.h>
|
|
#include <cominit.h>
|
|
|
|
#include <NCObjApi.h>
|
|
#include "winmgmtr.h"
|
|
|
|
#include <Guids.h>
|
|
|
|
#include <BasicTree.h>
|
|
#include <Thread.h>
|
|
#include <Logging.h>
|
|
|
|
#include "Globals.h"
|
|
#include "CGlobals.h"
|
|
#include "ProvSubS.h"
|
|
|
|
#ifdef WMIASLOCAL
|
|
#include "Main.h"
|
|
#endif
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
LONG ProviderSubSystem_Globals :: s_Initialized = 0 ;
|
|
|
|
WmiAllocator *ProviderSubSystem_Globals :: s_Allocator = NULL ;
|
|
|
|
CriticalSection ProviderSubSystem_Globals :: s_DecoupledRegistrySection(NOTHROW_LOCK) ;
|
|
|
|
HANDLE ProviderSubSystem_Globals :: s_FileMapping = NULL ;
|
|
CServerObject_ProviderSubsystem_Counters *ProviderSubSystem_Globals :: s_SharedCounters = NULL ;
|
|
|
|
StrobeThread *ProviderSubSystem_Globals :: s_StrobeThread = NULL ;
|
|
|
|
HANDLE ProviderSubSystem_Globals :: s_CoFreeUnusedLibrariesEvent = NULL ;
|
|
|
|
HANDLE ProviderSubSystem_Globals :: s_HostJobObject = NULL ;
|
|
LPCWSTR ProviderSubSystem_Globals :: s_HostJobObjectName = L"Global\\WmiProviderSubSystemHostJob" ;
|
|
|
|
LPCWSTR ProviderSubSystem_Globals :: s_ProviderSubsystemEventSourceName = L"WinMgmt" ;
|
|
HANDLE ProviderSubSystem_Globals :: s_NtEventLogSource = NULL ;
|
|
|
|
HostController *ProviderSubSystem_Globals :: s_HostController = NULL ;
|
|
RefresherManagerController *ProviderSubSystem_Globals :: s_RefresherManagerController = NULL ;
|
|
CWbemGlobal_HostedProviderController *ProviderSubSystem_Globals :: s_HostedProviderController = NULL ;
|
|
CWbemGlobal_IWmiProvSubSysController *ProviderSubSystem_Globals :: s_ProvSubSysController = NULL ;
|
|
CWbemGlobal_IWbemSyncProviderController *ProviderSubSystem_Globals :: s_SyncProviderController = NULL ;
|
|
CDecoupled_ProviderSubsystemRegistrar *ProviderSubSystem_Globals :: s_DecoupledRegistrar = NULL ;
|
|
|
|
CriticalSection ProviderSubSystem_Globals :: s_GuidTagSection(NOTHROW_LOCK) ;
|
|
CWbemGlobal_ComServerTagContainer *ProviderSubSystem_Globals :: s_GuidTag = NULL ;
|
|
|
|
LONG ProviderSubSystem_Globals :: s_LocksInProgress = 0 ;
|
|
LONG ProviderSubSystem_Globals :: s_ObjectsInProgress = 0 ;
|
|
|
|
ULONG ProviderSubSystem_Globals :: s_InternalCacheTimeout = DEFAULT_PROVIDER_TIMEOUT ;
|
|
ULONG ProviderSubSystem_Globals :: s_ObjectCacheTimeout = DEFAULT_PROVIDER_TIMEOUT ;
|
|
ULONG ProviderSubSystem_Globals :: s_EventCacheTimeout = DEFAULT_PROVIDER_TIMEOUT ;
|
|
ULONG ProviderSubSystem_Globals :: s_StrobeTimeout = DEFAULT_PROVIDER_TIMEOUT >> 1 ;
|
|
|
|
ULONG ProviderSubSystem_Globals :: s_Quota_ProcessLimitCount = 0x20 ;
|
|
SIZE_T ProviderSubSystem_Globals :: s_Quota_ProcessMemoryLimitCount = 0x10000000 ;
|
|
SIZE_T ProviderSubSystem_Globals :: s_Quota_JobMemoryLimitCount = 0x10000000 ;
|
|
SIZE_T ProviderSubSystem_Globals :: s_Quota_PrivatePageCount = 0x10000000 ;
|
|
ULONG ProviderSubSystem_Globals :: s_Quota_HandleCount = 0x1000 ;
|
|
ULONG ProviderSubSystem_Globals :: s_Quota_NumberOfThreads = 0x1000 ;
|
|
|
|
|
|
LONG ProviderSubSystem_Globals :: s_CAggregator_IWbemProvider_ObjectsInProgress = 0 ;
|
|
LONG ProviderSubSystem_Globals :: s_CInterceptor_IWbemProviderInitSink_ObjectsInProgress = 0 ;
|
|
LONG ProviderSubSystem_Globals :: s_CInterceptor_IWbemServices_Proxy_ObjectsInProgress = 0 ;
|
|
LONG ProviderSubSystem_Globals :: s_CInterceptor_IWbemServices_Stub_ObjectsInProgress = 0 ;
|
|
LONG ProviderSubSystem_Globals :: s_CInterceptor_IEnumWbemClassObject_Stub_ObjectsInProgress = 0 ;
|
|
LONG ProviderSubSystem_Globals :: s_CInterceptor_IEnumWbemClassObject_Proxy_ObjectsInProgress = 0 ;
|
|
LONG ProviderSubSystem_Globals :: s_CInterceptor_IWbemServices_Interceptor_ObjectsInProgress = 0 ;
|
|
LONG ProviderSubSystem_Globals :: s_CInterceptor_IWbemServices_RestrictingInterceptor_ObjectsInProgress = 0 ;
|
|
LONG ProviderSubSystem_Globals :: s_CInterceptor_IWbemObjectSink_ObjectsInProgress = 0 ;
|
|
LONG ProviderSubSystem_Globals :: s_CInterceptor_IWbemObjectSinkEx_ObjectsInProgress = 0 ;
|
|
LONG ProviderSubSystem_Globals :: s_CInterceptor_IWbemFilteringObjectSink_ObjectsInProgress = 0 ;
|
|
LONG ProviderSubSystem_Globals :: s_CInterceptor_IWbemProvider_ObjectsInProgress = 0 ;
|
|
LONG ProviderSubSystem_Globals :: s_CInterceptor_IWbemSyncProvider_ObjectsInProgress = 0 ;
|
|
LONG ProviderSubSystem_Globals :: s_CInterceptor_IWbemSyncObjectSink_ObjectsInProgress = 0 ;
|
|
LONG ProviderSubSystem_Globals :: s_CInterceptor_IWbemSyncObjectSinkEx_ObjectsInProgress = 0 ;
|
|
LONG ProviderSubSystem_Globals :: s_CInterceptor_IWbemSyncFilteringObjectSink_ObjectsInProgress = 0 ;
|
|
LONG ProviderSubSystem_Globals :: s_CInterceptor_IWbemCombiningObjectSink_ObjectsInProgress = 0 ;
|
|
LONG ProviderSubSystem_Globals :: s_CInterceptor_IWbemWaitingObjectSink_ObjectsInProgress = 0 ;
|
|
LONG ProviderSubSystem_Globals :: s_CInterceptor_IWbemUnboundObjectSink_ObjectsInProgress = 0 ;
|
|
LONG ProviderSubSystem_Globals :: s_CInterceptor_IWbemSyncUnboundObjectSink_ObjectsInProgress = 0 ;
|
|
LONG ProviderSubSystem_Globals :: s_CInterceptor_IWbemDecoupledProvider_ObjectsInProgress = 0 ;
|
|
LONG ProviderSubSystem_Globals :: s_CDecoupled_IWbemUnboundObjectSink_ObjectsInProgress = 0 ;
|
|
|
|
LONG ProviderSubSystem_Globals :: s_CServerObject_Host_ObjectsInProgress = 0 ;
|
|
LONG ProviderSubSystem_Globals :: s_CServerObject_HostInterceptor_ObjectsInProgress = 0 ;
|
|
LONG ProviderSubSystem_Globals :: s_CServerObject_BindingFactory_ObjectsInProgress = 0 ;
|
|
LONG ProviderSubSystem_Globals :: s_CServerObject_DynamicPropertyProviderResolver_ObjectsInProgress = 0 ;
|
|
LONG ProviderSubSystem_Globals :: s_CServerObject_IWbemServices_ObjectsInProgress = 0 ;
|
|
LONG ProviderSubSystem_Globals :: s_CServerObject_ProviderSubsystem_Counters_ObjectsInProgress = 0 ;
|
|
LONG ProviderSubSystem_Globals :: s_CServerObject_ProviderSubSystem_ObjectsInProgress = 0 ;
|
|
LONG ProviderSubSystem_Globals :: s_CServerObject_RawFactory_ObjectsInProgress = 0 ;
|
|
LONG ProviderSubSystem_Globals :: s_StaTask_Create_ObjectsInProgress = 0 ;
|
|
LONG ProviderSubSystem_Globals :: s_CServerObject_StaThread_ObjectsInProgress = 0 ;
|
|
LONG ProviderSubSystem_Globals :: s_StrobeThread_ObjectsInProgress = 0 ;
|
|
LONG ProviderSubSystem_Globals :: s_CServerClassFactory_ObjectsInProgress = 0 ;
|
|
LONG ProviderSubSystem_Globals :: s_CDecoupledAggregator_IWbemProvider_ObjectsInProgress = 0 ;
|
|
LONG ProviderSubSystem_Globals :: s_CDecoupled_ProviderSubsystemRegistrar_ObjectsInProgress = 0 ;
|
|
|
|
LONG ProviderSubSystem_Globals :: s_CServerObject_ProviderRefresherManager_ObjectsInProgress = 0 ;
|
|
LONG ProviderSubSystem_Globals :: s_CServerProvRefreshManagerClassFactory_ObjectsInProgress = 0 ;
|
|
LONG ProviderSubSystem_Globals :: s_CServerObject_InterceptorProviderRefresherManager_ObjectsInProgress = 0 ;
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
LPCWSTR ProviderSubSystem_Globals :: s_FileMappingName = L"Global\\Wmi Provider Sub System Counters" ;
|
|
|
|
LPCWSTR ProviderSubSystem_Globals :: s_QueryPrefix = L"Select * from __Win32Provider Where Name = \"" ;
|
|
ULONG ProviderSubSystem_Globals :: s_QueryPrefixLen = wcslen ( ProviderSubSystem_Globals :: s_QueryPrefix ) ;
|
|
|
|
LPCWSTR ProviderSubSystem_Globals :: s_QueryPostfix = L"\"" ;
|
|
ULONG ProviderSubSystem_Globals :: s_QueryPostfixLen = wcslen ( ProviderSubSystem_Globals :: s_QueryPostfix ) ;
|
|
|
|
ULONG ProviderSubSystem_Globals :: s_QueryConstantsLen = ProviderSubSystem_Globals :: s_QueryPrefixLen + ProviderSubSystem_Globals :: s_QueryPostfixLen ;
|
|
|
|
LPCWSTR ProviderSubSystem_Globals :: s_Provider = L"Provider" ;
|
|
ULONG ProviderSubSystem_Globals :: s_ProviderLen = wcslen ( ProviderSubSystem_Globals :: s_Provider ) ;
|
|
|
|
LPCWSTR ProviderSubSystem_Globals :: s_Class = L"__Class" ;
|
|
ULONG ProviderSubSystem_Globals :: s_ClassLen = wcslen ( ProviderSubSystem_Globals :: s_Class ) ;
|
|
|
|
LPCWSTR ProviderSubSystem_Globals :: s_Wql = L"Wql" ;
|
|
|
|
LPCWSTR ProviderSubSystem_Globals :: s_DynProps = L"DynProps" ;
|
|
LPCWSTR ProviderSubSystem_Globals :: s_Dynamic = L"Dynamic" ;
|
|
LPCWSTR ProviderSubSystem_Globals :: s_ClassContext = L"ClassContext" ;
|
|
LPCWSTR ProviderSubSystem_Globals :: s_InstanceContext = L"InstanceContext" ;
|
|
LPCWSTR ProviderSubSystem_Globals :: s_PropertyContext = L"PropertyContext" ;
|
|
|
|
HANDLE ProviderSubSystem_Globals :: s_EventSource = NULL ;
|
|
LPWSTR ProviderSubSystem_Globals :: s_EventPropertySources [] = {
|
|
|
|
L"Msft_WmiProvider_ComServerLoadOperationEvent" ,
|
|
L"Namespace!s! Provider!s! User!s! Locale!s! TransactionIdentifier!s! Clsid!s! ServerName!s! InProcServer!b! LocalServer!b! InProcServerPath!s! LocalServerPath!s!" ,
|
|
|
|
L"Msft_WmiProvider_ComServerOperationFailureEvent" ,
|
|
L"Namespace!s! Provider!s! User!s! Locale!s! TransactionIdentifier!s! Clsid!s! ServerName!s! InProcServer!b! LocalServer!b! InProcServerPath!s! LocalServerPath!s! ResultCode!u!" ,
|
|
|
|
L"Msft_WmiProvider_LoadOperationEvent",
|
|
L"Namespace!s! Provider!s! User!s! Locale!s! TransactionIdentifier!s! Clsid!s! ServerName!s! InProcServer!b! LocalServer!b! InProcServerPath!s! LocalServerPath!s! ThreadingModel!u! Synchronisation!u!" ,
|
|
|
|
L"Msft_WmiProvider_LoadOperationFailureEvent",
|
|
L"Namespace!s! Provider!s! User!s! Locale!s! TransactionIdentifier!s! Clsid!s! ServerName!s! InProcServer!b! LocalServer!b! InProcServerPath!s! LocalServerPath!s! ThreadingModel!u! Synchronisation!u! ResultCode!u!" ,
|
|
|
|
L"Msft_WmiProvider_InitializationOperationFailureEvent" ,
|
|
L"Namespace!s! Provider!s! User!s! Locale!s! TransactionIdentifier!s! ResultCode!u!" ,
|
|
|
|
L"Msft_WmiProvider_InitializationOperationEvent" ,
|
|
L"Namespace!s! Provider!s! User!s! Locale!s! TransactionIdentifier!s!" ,
|
|
|
|
L"Msft_WmiProvider_UnLoadOperationEvent" ,
|
|
L"Namespace!s! Provider!s! User!s! Locale!s! TransactionIdentifier!s!" ,
|
|
|
|
L"Msft_WmiProvider_GetObjectAsyncEvent_Pre" ,
|
|
L"Namespace!s! Provider!s! User!s! Locale!s! TransactionIdentifier!s! Flags!u! ObjectPath!s!" ,
|
|
|
|
L"Msft_WmiProvider_PutClassAsyncEvent_Pre" ,
|
|
L"Namespace!s! Provider!s! User!s! Locale!s! TransactionIdentifier!s! Flags!u! ClassObject!O!" ,
|
|
|
|
L"Msft_WmiProvider_DeleteClassAsyncEvent_Pre" ,
|
|
L"Namespace!s! Provider!s! User!s! Locale!s! TransactionIdentifier!s! Flags!u! ClassName!s!" ,
|
|
|
|
L"Msft_WmiProvider_CreateClassEnumAsyncEvent_Pre" ,
|
|
L"Namespace!s! Provider!s! User!s! Locale!s! TransactionIdentifier!s! Flags!u! SuperclassName!s!" ,
|
|
|
|
L"Msft_WmiProvider_PutInstanceAsyncEvent_Pre" ,
|
|
L"Namespace!s! Provider!s! User!s! Locale!s! TransactionIdentifier!s! Flags!u! InstanceObject!O!" ,
|
|
|
|
L"Msft_WmiProvider_DeleteInstanceAsyncEvent_Pre" ,
|
|
L"Namespace!s! Provider!s! User!s! Locale!s! TransactionIdentifier!s! Flags!u! ObjectPath!s!" ,
|
|
|
|
L"Msft_WmiProvider_CreateInstanceEnumAsyncEvent_Pre" ,
|
|
L"Namespace!s! Provider!s! User!s! Locale!s! TransactionIdentifier!s! Flags!u! ClassName!s!" ,
|
|
|
|
L"Msft_WmiProvider_ExecQueryAsyncEvent_Pre" ,
|
|
L"Namespace!s! Provider!s! User!s! Locale!s! TransactionIdentifier!s! Flags!u! QueryLanguage!s! Query!s!" ,
|
|
|
|
L"Msft_WmiProvider_ExecNotificationQueryAsyncEvent_Pre" ,
|
|
L"Namespace!s! Provider!s! User!s! Locale!s! TransactionIdentifier!s! Flags!u! QueryLanguage!s! Query!s!" ,
|
|
|
|
L"Msft_WmiProvider_ExecMethodAsyncEvent_Pre" ,
|
|
L"Namespace!s! Provider!s! User!s! Locale!s! TransactionIdentifier!s! Flags!u! ObjectPath!s! MethodName!s! InputParameters!O!" ,
|
|
|
|
L"Msft_WmiProvider_ProvideEvents_Pre" ,
|
|
L"Namespace!s! Provider!s! User!s! Locale!s! TransactionIdentifier!s! Flags!u!" ,
|
|
|
|
L"Msft_WmiProvider_AccessCheck_Pre" ,
|
|
L"Namespace!s! Provider!s! User!s! Locale!s! TransactionIdentifier!s! QueryLanguage!s! Query!s! Sid!c[]!" ,
|
|
|
|
L"Msft_WmiProvider_CancelQuery_Pre" ,
|
|
L"Namespace!s! Provider!s! User!s! Locale!s! TransactionIdentifier!s! QueryId!u!" ,
|
|
|
|
L"Msft_WmiProvider_NewQuery_Pre" ,
|
|
L"Namespace!s! Provider!s! User!s! Locale!s! TransactionIdentifier!s! QueryId!u! QueryLanguage!s! Query!s!" ,
|
|
|
|
L"Msft_WmiProvider_GetObjectAsyncEvent_Post" ,
|
|
L"Namespace!s! Provider!s! User!s! Locale!s! TransactionIdentifier!s! Flags!u! ObjectPath!s! ResultCode!u! StringParameter!s! ObjectParameter!O!" ,
|
|
|
|
L"Msft_WmiProvider_PutClassAsyncEvent_Post" ,
|
|
L"Namespace!s! Provider!s! User!s! Locale!s! TransactionIdentifier!s! Flags!u! ClassObject!O! ResultCode!u! StringParameter!s! ObjectParameter!O!" ,
|
|
|
|
L"Msft_WmiProvider_DeleteClassAsyncEvent_Post" ,
|
|
L"Namespace!s! Provider!s! User!s! Locale!s! TransactionIdentifier!s! Flags!u! ClassName!s! ResultCode!u! StringParameter!s! ObjectParameter!O!" ,
|
|
|
|
L"Msft_WmiProvider_CreateClassEnumAsyncEvent_Post" ,
|
|
L"Namespace!s! Provider!s! User!s! Locale!s! TransactionIdentifier!s! Flags!u! SuperclassName!s! ResultCode!u! StringParameter!s! ObjectParameter!O!" ,
|
|
|
|
L"Msft_WmiProvider_PutInstanceAsyncEvent_Post" ,
|
|
L"Namespace!s! Provider!s! User!s! Locale!s! TransactionIdentifier!s! Flags!u! InstanceObject!O! ResultCode!u! StringParameter!s! ObjectParameter!O!" ,
|
|
|
|
L"Msft_WmiProvider_DeleteInstanceAsyncEvent_Post" ,
|
|
L"Namespace!s! Provider!s! User!s! Locale!s! TransactionIdentifier!s! Flags!u! ObjectPath!s! ResultCode!u! StringParameter!s! ObjectParameter!O!" ,
|
|
|
|
L"Msft_WmiProvider_CreateInstanceEnumAsyncEvent_Post" ,
|
|
L"Namespace!s! Provider!s! User!s! Locale!s! TransactionIdentifier!s! Flags!u! ClassName!s! ResultCode!u! StringParameter!s! ObjectParameter!O!" ,
|
|
|
|
L"Msft_WmiProvider_ExecQueryAsyncEvent_Post" ,
|
|
L"Namespace!s! Provider!s! User!s! Locale!s! TransactionIdentifier!s! Flags!u! QueryLanguage!s! Query!s! ResultCode!u! StringParameter!s! ObjectParameter!O!" ,
|
|
|
|
L"Msft_WmiProvider_ExecNotificationQueryAsyncEvent_Post" ,
|
|
L"Namespace!s! Provider!s! User!s! Locale!s! TransactionIdentifier!s! Flags!u! QueryLanguage!s! Query!s! ResultCode!u! StringParameter!s! ObjectParameter!O!" ,
|
|
|
|
L"Msft_WmiProvider_ExecMethodAsyncEvent_Post" ,
|
|
L"Namespace!s! Provider!s! User!s! Locale!s! TransactionIdentifier!s! Flags!u! ObjectPath!s! MethodName!s! InputParameters!O! ResultCode!u! StringParameter!s! ObjectParameter!O!" ,
|
|
|
|
L"Msft_WmiProvider_ProvideEvents_Post" ,
|
|
L"Namespace!s! Provider!s! User!s! Locale!s! TransactionIdentifier!s! Flags!u! Result!u!" ,
|
|
|
|
L"Msft_WmiProvider_AccessCheck_Post" ,
|
|
L"Namespace!s! Provider!s! User!s! Locale!s! TransactionIdentifier!s! QueryLanguage!s! Query!s! Sid!c[]! Result!u!" ,
|
|
|
|
L"Msft_WmiProvider_CancelQuery_Post" ,
|
|
L"Namespace!s! Provider!s! User!s! Locale!s! TransactionIdentifier!s! QueryId!u! Result!u!" ,
|
|
|
|
L"Msft_WmiProvider_NewQuery_Post" ,
|
|
L"Namespace!s! Provider!s! User!s! Locale!s! TransactionIdentifier!s! QueryId!u! QueryLanguage!s! Query!s! Result!u!"
|
|
} ;
|
|
|
|
ULONG ProviderSubSystem_Globals :: s_EventClassHandlesSize = sizeof ( s_EventPropertySources ) / ( sizeof ( wchar_t * ) * 2 ) ;
|
|
HANDLE ProviderSubSystem_Globals :: s_EventClassHandles [ sizeof ( s_EventPropertySources ) / ( sizeof ( wchar_t * ) * 2 ) ] ;
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Globals :: Initialize_Events ()
|
|
{
|
|
HRESULT t_Result = S_OK ;
|
|
|
|
ProviderSubSystem_Globals ::s_EventSource = WmiEventSourceConnect (
|
|
|
|
L"root\\cimv2" ,
|
|
L"ProviderSubSystem" ,
|
|
TRUE ,
|
|
32000 ,
|
|
100 ,
|
|
NULL ,
|
|
NULL
|
|
) ;
|
|
|
|
if ( ProviderSubSystem_Globals :: s_EventSource )
|
|
{
|
|
for ( ULONG t_Index = 0 ; t_Index < ProviderSubSystem_Globals :: s_EventClassHandlesSize ; t_Index ++ )
|
|
{
|
|
ProviderSubSystem_Globals :: s_EventClassHandles [ t_Index ] = WmiCreateObjectWithFormat (
|
|
|
|
ProviderSubSystem_Globals :: s_EventSource ,
|
|
s_EventPropertySources [ t_Index * 2 ] ,
|
|
WMI_CREATEOBJ_LOCKABLE ,
|
|
s_EventPropertySources [ t_Index * 2 + 1 ]
|
|
) ;
|
|
|
|
if ( ProviderSubSystem_Globals :: s_EventClassHandles [ t_Index ] == NULL )
|
|
{
|
|
t_Result = WBEM_E_CRITICAL_ERROR ;
|
|
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_CRITICAL_ERROR ;
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Globals :: UnInitialize_Events ()
|
|
{
|
|
HRESULT t_Result = S_OK ;
|
|
|
|
if ( ProviderSubSystem_Globals ::s_EventSource )
|
|
{
|
|
for ( ULONG t_Index = 0 ; t_Index < ProviderSubSystem_Globals :: s_EventClassHandlesSize ; t_Index ++ )
|
|
{
|
|
HANDLE eventHandle = ProviderSubSystem_Globals :: s_EventClassHandles [ t_Index ];
|
|
ProviderSubSystem_Globals :: s_EventClassHandles [ t_Index ] = NULL;
|
|
WmiDestroyObject ( eventHandle) ;
|
|
}
|
|
|
|
WmiEventSourceDisconnect ( ProviderSubSystem_Globals :: s_EventSource );
|
|
ProviderSubSystem_Globals :: s_EventSource = NULL;
|
|
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT GetSecurityDescriptor ( SECURITY_DESCRIPTOR &a_SecurityDescriptor , DWORD a_Access )
|
|
{
|
|
HRESULT t_Result = S_OK ;
|
|
|
|
BOOL t_BoolResult = InitializeSecurityDescriptor ( & a_SecurityDescriptor , SECURITY_DESCRIPTOR_REVISION ) ;
|
|
if ( t_BoolResult )
|
|
{
|
|
SID_IDENTIFIER_AUTHORITY t_NtAuthoritySid = SECURITY_NT_AUTHORITY ;
|
|
|
|
PSID t_System_Sid = NULL ;
|
|
ACCESS_ALLOWED_ACE *t_System_ACE = NULL ;
|
|
USHORT t_System_ACESize = 0 ;
|
|
|
|
t_BoolResult = AllocateAndInitializeSid (
|
|
|
|
& t_NtAuthoritySid ,
|
|
1 ,
|
|
SECURITY_LOCAL_SYSTEM_RID,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
& t_System_Sid
|
|
);
|
|
|
|
if ( t_BoolResult )
|
|
{
|
|
DWORD t_SidLength = ::GetLengthSid ( t_System_Sid );
|
|
t_System_ACESize = sizeof(ACCESS_ALLOWED_ACE) + (WORD) ( t_SidLength - sizeof(DWORD) ) ;
|
|
t_System_ACE = (ACCESS_ALLOWED_ACE*) new BYTE [ t_System_ACESize ] ;
|
|
if ( t_System_ACE )
|
|
{
|
|
CopySid ( t_SidLength, (PSID) & t_System_ACE->SidStart, t_System_Sid ) ;
|
|
t_System_ACE->Mask = FILE_MAP_ALL_ACCESS;
|
|
t_System_ACE->Header.AceType = 0 ;
|
|
t_System_ACE->Header.AceFlags = 3 ;
|
|
t_System_ACE->Header.AceSize = t_System_ACESize ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
DWORD t_LastError = ::GetLastError();
|
|
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
|
|
PSID t_LocalService_Sid = NULL ;
|
|
ACCESS_ALLOWED_ACE *t_LocalService_ACE = NULL ;
|
|
USHORT t_LocalService_ACESize = 0 ;
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
t_BoolResult = AllocateAndInitializeSid (
|
|
|
|
& t_NtAuthoritySid ,
|
|
1 ,
|
|
SECURITY_LOCAL_SERVICE_RID ,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
& t_LocalService_Sid
|
|
);
|
|
|
|
if ( t_BoolResult )
|
|
{
|
|
DWORD t_SidLength = ::GetLengthSid ( t_LocalService_Sid );
|
|
t_LocalService_ACESize = sizeof(ACCESS_ALLOWED_ACE) + (WORD) ( t_SidLength - sizeof(DWORD) ) ;
|
|
t_LocalService_ACE = (ACCESS_ALLOWED_ACE*) new BYTE [ t_LocalService_ACESize ] ;
|
|
if ( t_LocalService_ACE )
|
|
{
|
|
CopySid ( t_SidLength, (PSID) & t_LocalService_ACE->SidStart, t_LocalService_Sid ) ;
|
|
t_LocalService_ACE->Mask = FILE_MAP_ALL_ACCESS ;
|
|
t_LocalService_ACE->Header.AceType = 0 ;
|
|
t_LocalService_ACE->Header.AceFlags = 3 ;
|
|
t_LocalService_ACE->Header.AceSize = t_LocalService_ACESize ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
DWORD t_LastError = ::GetLastError();
|
|
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
}
|
|
|
|
PSID t_NetworkService_Sid = NULL ;
|
|
ACCESS_ALLOWED_ACE *t_NetworkService_ACE = NULL ;
|
|
USHORT t_NetworkService_ACESize = 0 ;
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
t_BoolResult = AllocateAndInitializeSid (
|
|
|
|
& t_NtAuthoritySid ,
|
|
1 ,
|
|
SECURITY_NETWORK_SERVICE_RID ,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
& t_NetworkService_Sid
|
|
);
|
|
|
|
if ( t_BoolResult )
|
|
{
|
|
DWORD t_SidLength = ::GetLengthSid ( t_NetworkService_Sid );
|
|
t_NetworkService_ACESize = sizeof(ACCESS_ALLOWED_ACE) + (WORD) ( t_SidLength - sizeof(DWORD) ) ;
|
|
t_NetworkService_ACE = (ACCESS_ALLOWED_ACE*) new BYTE [ t_NetworkService_ACESize ] ;
|
|
if ( t_NetworkService_ACE )
|
|
{
|
|
CopySid ( t_SidLength, (PSID) & t_NetworkService_ACE->SidStart, t_NetworkService_Sid ) ;
|
|
t_NetworkService_ACE->Mask = FILE_MAP_ALL_ACCESS ;
|
|
t_NetworkService_ACE->Header.AceType = 0 ;
|
|
t_NetworkService_ACE->Header.AceFlags = 3 ;
|
|
t_NetworkService_ACE->Header.AceSize = t_NetworkService_ACESize ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
DWORD t_LastError = ::GetLastError();
|
|
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
}
|
|
|
|
PSID t_Everyone_Sid = NULL ;
|
|
ACCESS_ALLOWED_ACE *t_Everyone_ACE = NULL ;
|
|
USHORT t_Everyone_ACESize = 0 ;
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
SID_IDENTIFIER_AUTHORITY t_WorldAuthoritySid = SECURITY_WORLD_SID_AUTHORITY ;
|
|
|
|
t_BoolResult = AllocateAndInitializeSid (
|
|
|
|
& t_WorldAuthoritySid ,
|
|
1 ,
|
|
SECURITY_WORLD_RID ,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
& t_Everyone_Sid
|
|
);
|
|
|
|
if ( t_BoolResult )
|
|
{
|
|
DWORD t_SidLength = ::GetLengthSid ( t_Everyone_Sid );
|
|
t_Everyone_ACESize = sizeof(ACCESS_ALLOWED_ACE) + (WORD) ( t_SidLength - sizeof(DWORD) ) ;
|
|
t_Everyone_ACE = (ACCESS_ALLOWED_ACE*) new BYTE [ t_Everyone_ACESize ] ;
|
|
if ( t_Everyone_ACE )
|
|
{
|
|
CopySid ( t_SidLength, (PSID) & t_Everyone_ACE->SidStart, t_Everyone_Sid ) ;
|
|
t_Everyone_ACE->Mask = a_Access ;
|
|
t_Everyone_ACE->Header.AceType = 0 ;
|
|
t_Everyone_ACE->Header.AceFlags = 3 ;
|
|
t_Everyone_ACE->Header.AceSize = t_Everyone_ACESize ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
DWORD t_LastError = ::GetLastError();
|
|
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
}
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
// Now we need to set permissions on the registry: Everyone read; Admins full.
|
|
// We have the sid for admins from the above code. Now get the sid for "Everyone"
|
|
|
|
DWORD t_TotalAclSize = sizeof(ACL) + t_System_ACESize + t_NetworkService_ACESize + t_LocalService_ACESize + t_Everyone_ACESize ;
|
|
PACL t_Dacl = (PACL) new BYTE [ t_TotalAclSize ] ;
|
|
if ( t_Dacl )
|
|
{
|
|
if ( :: InitializeAcl ( t_Dacl, t_TotalAclSize, ACL_REVISION ) )
|
|
{
|
|
DWORD t_AceIndex = 0 ;
|
|
|
|
if ( t_System_ACESize && :: AddAce ( t_Dacl , ACL_REVISION , t_AceIndex , t_System_ACE , t_System_ACESize ) )
|
|
{
|
|
t_AceIndex ++ ;
|
|
}
|
|
|
|
if ( t_NetworkService_ACESize && :: AddAce ( t_Dacl , ACL_REVISION , t_AceIndex , t_NetworkService_ACE , t_NetworkService_ACESize ) )
|
|
{
|
|
t_AceIndex ++ ;
|
|
}
|
|
|
|
if ( t_LocalService_ACESize && :: AddAce ( t_Dacl , ACL_REVISION , t_AceIndex , t_LocalService_ACE , t_LocalService_ACESize ) )
|
|
{
|
|
t_AceIndex ++ ;
|
|
}
|
|
|
|
if ( a_Access )
|
|
{
|
|
if ( t_Everyone_ACESize && :: AddAce ( t_Dacl , ACL_REVISION, t_AceIndex , t_Everyone_ACE , t_Everyone_ACESize ) )
|
|
{
|
|
t_AceIndex ++ ;
|
|
}
|
|
}
|
|
|
|
t_BoolResult = SetSecurityDescriptorDacl (
|
|
|
|
& a_SecurityDescriptor ,
|
|
TRUE ,
|
|
t_Dacl ,
|
|
FALSE
|
|
) ;
|
|
|
|
if ( t_BoolResult == FALSE )
|
|
{
|
|
delete [] ( ( BYTE * ) t_Dacl ) ;
|
|
|
|
t_Result = WBEM_E_CRITICAL_ERROR ;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
}
|
|
|
|
if ( t_System_ACE )
|
|
{
|
|
delete [] ( ( BYTE * ) t_System_ACE ) ;
|
|
}
|
|
|
|
if ( t_NetworkService_ACE )
|
|
{
|
|
delete [] ( ( BYTE * ) t_NetworkService_ACE ) ;
|
|
}
|
|
|
|
if ( t_LocalService_ACE )
|
|
{
|
|
delete [] ( ( BYTE * ) t_LocalService_ACE ) ;
|
|
}
|
|
|
|
if ( t_Everyone_ACE )
|
|
{
|
|
delete [] ( ( BYTE * ) t_Everyone_ACE ) ;
|
|
}
|
|
|
|
if ( t_System_Sid )
|
|
{
|
|
FreeSid ( t_System_Sid ) ;
|
|
}
|
|
|
|
if ( t_NetworkService_Sid )
|
|
{
|
|
FreeSid ( t_NetworkService_Sid ) ;
|
|
}
|
|
|
|
if ( t_LocalService_Sid )
|
|
{
|
|
FreeSid ( t_LocalService_Sid ) ;
|
|
}
|
|
|
|
if ( t_Everyone_Sid )
|
|
{
|
|
FreeSid ( t_Everyone_Sid ) ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_CRITICAL_ERROR ;
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Globals :: Initialize_SharedCounters ()
|
|
{
|
|
HRESULT t_Result = S_OK ;
|
|
|
|
HANDLE t_Handle = OpenFileMapping (
|
|
|
|
FILE_MAP_READ | FILE_MAP_WRITE ,
|
|
FALSE ,
|
|
s_FileMappingName
|
|
) ;
|
|
|
|
if ( t_Handle == NULL )
|
|
{
|
|
if ( GetLastError () == ERROR_FILE_NOT_FOUND )
|
|
{
|
|
SECURITY_DESCRIPTOR t_SecurityDescriptor ;
|
|
|
|
t_Result = GetSecurityDescriptor (
|
|
|
|
t_SecurityDescriptor ,
|
|
0
|
|
// FILE_MAP_ALL_ACCESS
|
|
) ;
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
SECURITY_ATTRIBUTES t_SecurityAttributes ;
|
|
|
|
t_SecurityAttributes.nLength = sizeof ( SECURITY_ATTRIBUTES ) ;
|
|
t_SecurityAttributes.lpSecurityDescriptor = & t_SecurityDescriptor ;
|
|
t_SecurityAttributes.bInheritHandle = FALSE ;
|
|
|
|
t_Handle = CreateFileMapping (
|
|
|
|
INVALID_HANDLE_VALUE ,
|
|
& t_SecurityAttributes ,
|
|
PAGE_READWRITE | SEC_COMMIT ,
|
|
0 ,
|
|
sizeof ( CServerObject_ProviderSubsystem_Counters ) ,
|
|
s_FileMappingName
|
|
) ;
|
|
|
|
if ( t_Handle == NULL )
|
|
{
|
|
t_Result = WBEM_E_ACCESS_DENIED ;
|
|
}
|
|
|
|
delete [] t_SecurityDescriptor.Dacl ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_ACCESS_DENIED ;
|
|
}
|
|
}
|
|
|
|
void *t_Location = NULL ;
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
t_Location = MapViewOfFile (
|
|
|
|
t_Handle ,
|
|
FILE_MAP_READ | FILE_MAP_WRITE ,
|
|
0 ,
|
|
0 ,
|
|
sizeof ( CServerObject_ProviderSubsystem_Counters )
|
|
) ;
|
|
|
|
if ( t_Location )
|
|
{
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_ACCESS_DENIED ;
|
|
}
|
|
}
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
s_FileMapping = t_Handle ;
|
|
s_SharedCounters = ( CServerObject_ProviderSubsystem_Counters * ) t_Location ;
|
|
}
|
|
else
|
|
{
|
|
if ( t_Handle )
|
|
{
|
|
CloseHandle ( t_Handle ) ;
|
|
}
|
|
|
|
SID_IDENTIFIER_AUTHORITY t_NtAuthoritySid = SECURITY_NT_AUTHORITY ;
|
|
|
|
PSID t_System_Sid = NULL ;
|
|
|
|
BOOL t_BoolResult = AllocateAndInitializeSid (
|
|
|
|
& t_NtAuthoritySid ,
|
|
1 ,
|
|
SECURITY_LOCAL_SYSTEM_RID,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
& t_System_Sid
|
|
);
|
|
|
|
if ( t_BoolResult )
|
|
{
|
|
LPCWSTR t_Array [ 1 ] ;
|
|
|
|
t_Array [ 0 ] = s_FileMappingName ;
|
|
|
|
BOOL t_Status = :: ReportEvent (
|
|
|
|
ProviderSubSystem_Globals :: GetNtEventSource () ,
|
|
EVENTLOG_WARNING_TYPE ,
|
|
0 ,
|
|
WBEM_MC_PROVIDER_SUBSYSTEM_LOCALSYSTEM_NAMED_SECTION ,
|
|
t_System_Sid ,
|
|
1 ,
|
|
0 ,
|
|
( LPCWSTR * ) t_Array ,
|
|
NULL
|
|
) ;
|
|
|
|
if ( t_Status == 0 )
|
|
{
|
|
DWORD t_LastError = GetLastError () ;
|
|
}
|
|
|
|
LocalFree ( t_System_Sid ) ;
|
|
}
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Globals :: UnInitialize_SharedCounters ()
|
|
{
|
|
HRESULT t_Result = S_OK ;
|
|
|
|
if ( s_SharedCounters )
|
|
{
|
|
BOOL t_Status = UnmapViewOfFile ( ( void * ) s_SharedCounters ) ;
|
|
s_SharedCounters = NULL ;
|
|
}
|
|
|
|
if ( s_FileMapping )
|
|
{
|
|
CloseHandle ( s_FileMapping ) ;
|
|
s_FileMapping = NULL ;
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Globals :: CreateJobObject ()
|
|
{
|
|
HRESULT t_Result = S_OK ;
|
|
|
|
s_HostJobObject = :: CreateJobObject (
|
|
|
|
NULL ,
|
|
s_HostJobObjectName
|
|
) ;
|
|
|
|
if ( s_HostJobObject == NULL )
|
|
{
|
|
switch ( GetLastError () )
|
|
{
|
|
case ERROR_ALREADY_EXISTS:
|
|
{
|
|
s_HostJobObject = OpenJobObject (
|
|
|
|
JOB_OBJECT_ALL_ACCESS ,
|
|
FALSE ,
|
|
s_HostJobObjectName
|
|
) ;
|
|
|
|
if ( ! s_HostJobObject )
|
|
{
|
|
t_Result = WBEM_E_ACCESS_DENIED ;
|
|
}
|
|
}
|
|
break ;
|
|
|
|
default:
|
|
{
|
|
t_Result = WBEM_E_ACCESS_DENIED ;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
JOBOBJECTINFOCLASS t_JobObjectInfoClass = JobObjectExtendedLimitInformation ;
|
|
JOBOBJECT_EXTENDED_LIMIT_INFORMATION t_JobObjectInfo ;
|
|
DWORD t_JobObjectInfoLength = sizeof ( JOBOBJECT_EXTENDED_LIMIT_INFORMATION ) ;
|
|
ZeroMemory ( & t_JobObjectInfo , sizeof ( JOBOBJECT_EXTENDED_LIMIT_INFORMATION ) ) ;
|
|
|
|
ULONG t_LimitRequirements = s_Quota_ProcessLimitCount > 0 ? JOB_OBJECT_LIMIT_ACTIVE_PROCESS : 0 ;
|
|
t_LimitRequirements = ( s_Quota_ProcessMemoryLimitCount > 0 ? t_LimitRequirements | JOB_OBJECT_LIMIT_JOB_MEMORY : t_LimitRequirements );
|
|
t_LimitRequirements = s_Quota_JobMemoryLimitCount > 0 ? t_LimitRequirements | JOB_OBJECT_LIMIT_PROCESS_MEMORY : t_LimitRequirements ;
|
|
|
|
t_JobObjectInfo.BasicLimitInformation.LimitFlags = t_LimitRequirements | JOB_OBJECT_LIMIT_BREAKAWAY_OK;
|
|
t_JobObjectInfo.BasicLimitInformation.ActiveProcessLimit = s_Quota_ProcessLimitCount ;
|
|
t_JobObjectInfo.ProcessMemoryLimit = s_Quota_ProcessMemoryLimitCount ;
|
|
t_JobObjectInfo.JobMemoryLimit = s_Quota_JobMemoryLimitCount ;
|
|
t_JobObjectInfo.PeakProcessMemoryUsed = s_Quota_ProcessMemoryLimitCount ;
|
|
t_JobObjectInfo.PeakJobMemoryUsed = s_Quota_JobMemoryLimitCount ;
|
|
|
|
OSVERSIONINFOEX t_OsInformationEx ;
|
|
ZeroMemory ( & t_OsInformationEx , sizeof ( t_OsInformationEx ) ) ;
|
|
t_OsInformationEx.dwOSVersionInfoSize = sizeof ( t_OsInformationEx ) ;
|
|
|
|
if ( GetVersionEx ( ( OSVERSIONINFO * ) & t_OsInformationEx ) )
|
|
{
|
|
if ( ( t_OsInformationEx.dwPlatformId == VER_PLATFORM_WIN32_NT ) && ( ( t_OsInformationEx.dwMajorVersion > 5 ) || ( ( t_OsInformationEx.dwMajorVersion == 5 ) && ( t_OsInformationEx.dwMinorVersion >= 1 ) ) ) )
|
|
{
|
|
t_JobObjectInfo.BasicLimitInformation.LimitFlags = t_JobObjectInfo.BasicLimitInformation.LimitFlags | JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE | JOB_OBJECT_LIMIT_BREAKAWAY_OK;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_UNEXPECTED ;
|
|
}
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
BOOL t_Status = SetInformationJobObject (
|
|
|
|
s_HostJobObject ,
|
|
t_JobObjectInfoClass ,
|
|
& t_JobObjectInfo ,
|
|
t_JobObjectInfoLength
|
|
) ;
|
|
|
|
if ( t_Status == FALSE )
|
|
{
|
|
t_Result = WBEM_E_ACCESS_DENIED ;
|
|
}
|
|
}
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Globals :: DeleteJobObject ()
|
|
{
|
|
HRESULT t_Result = S_OK ;
|
|
|
|
if ( s_HostJobObject )
|
|
{
|
|
BOOL t_Status = TerminateJobObject ( s_HostJobObject , 0 ) ;
|
|
CloseHandle ( s_HostJobObject ) ;
|
|
s_HostJobObject = NULL ;
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Globals :: AssignProcessToJobObject ( HANDLE a_Handle )
|
|
{
|
|
HRESULT t_Result = S_OK ;
|
|
|
|
if ( s_HostJobObject )
|
|
{
|
|
BOOL t_Status =:: AssignProcessToJobObject (
|
|
|
|
s_HostJobObject ,
|
|
a_Handle
|
|
) ;
|
|
|
|
if ( t_Status == FALSE )
|
|
{
|
|
t_Result = WBEM_E_ACCESS_DENIED ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_CRITICAL_ERROR ;
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Globals :: Global_Startup ()
|
|
{
|
|
HRESULT t_Result = S_OK ;
|
|
|
|
if ( ! s_Allocator )
|
|
{
|
|
/*
|
|
* Use the global process heap for this particular boot operation
|
|
*/
|
|
|
|
WmiAllocator t_Allocator ;
|
|
WmiStatusCode t_StatusCode = t_Allocator.New (
|
|
|
|
( void ** ) & s_Allocator ,
|
|
sizeof ( WmiAllocator )
|
|
) ;
|
|
|
|
if ( t_StatusCode == e_StatusCode_Success )
|
|
{
|
|
#ifdef DBG
|
|
:: new ( ( void * ) s_Allocator ) WmiAllocator ( WmiAllocator :: e_DefaultAllocation , 0 , 0 ) ;
|
|
#else
|
|
:: new ( ( void * ) s_Allocator ) WmiAllocator ;
|
|
#endif
|
|
|
|
t_StatusCode = s_Allocator->Initialize () ;
|
|
if ( t_StatusCode != e_StatusCode_Success )
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
}
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
WmiStatusCode t_StatusCode = WmiHelper :: InitializeCriticalSection ( & s_DecoupledRegistrySection ) ;
|
|
if ( t_StatusCode != e_StatusCode_Success )
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
}
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
WmiStatusCode t_StatusCode = WmiHelper :: InitializeCriticalSection ( & s_GuidTagSection ) ;
|
|
if ( t_StatusCode == e_StatusCode_Success )
|
|
{
|
|
s_GuidTag = new CWbemGlobal_ComServerTagContainer ( *s_Allocator ) ;
|
|
if ( s_GuidTag )
|
|
{
|
|
t_StatusCode = s_GuidTag->Initialize () ;
|
|
if ( t_StatusCode != e_StatusCode_Success )
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
}
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
s_NtEventLogSource = RegisterEventSource ( NULL , s_ProviderSubsystemEventSourceName ) ;
|
|
if ( s_NtEventLogSource == NULL )
|
|
{
|
|
return WBEM_E_CRITICAL_ERROR ;
|
|
}
|
|
}
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
s_ProvSubSysController = :: new CWbemGlobal_IWmiProvSubSysController ( *s_Allocator ) ;
|
|
if ( s_ProvSubSysController )
|
|
{
|
|
s_ProvSubSysController->AddRef () ;
|
|
|
|
WmiStatusCode t_StatusCode = s_ProvSubSysController->Initialize () ;
|
|
if ( t_StatusCode != e_StatusCode_Success )
|
|
{
|
|
delete s_ProvSubSysController ;
|
|
s_ProvSubSysController = NULL ;
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
}
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
s_SyncProviderController = :: new CWbemGlobal_IWbemSyncProviderController ( *s_Allocator ) ;
|
|
if ( s_SyncProviderController )
|
|
{
|
|
s_SyncProviderController->AddRef () ;
|
|
|
|
WmiStatusCode t_StatusCode = s_SyncProviderController->Initialize () ;
|
|
if ( t_StatusCode != e_StatusCode_Success )
|
|
{
|
|
delete s_SyncProviderController ;
|
|
s_SyncProviderController = NULL ;
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
}
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
s_HostedProviderController = :: new CWbemGlobal_HostedProviderController ( *s_Allocator ) ;
|
|
if ( s_HostedProviderController )
|
|
{
|
|
s_HostedProviderController->AddRef () ;
|
|
|
|
WmiStatusCode t_StatusCode = s_HostedProviderController->Initialize () ;
|
|
if ( t_StatusCode != e_StatusCode_Success )
|
|
{
|
|
delete s_HostedProviderController ;
|
|
s_HostedProviderController = NULL ;
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
}
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
s_HostController = :: new HostController ( *s_Allocator ) ;
|
|
if ( s_HostController )
|
|
{
|
|
s_HostController->AddRef () ;
|
|
|
|
WmiStatusCode t_StatusCode = s_HostController->Initialize () ;
|
|
if ( t_StatusCode != e_StatusCode_Success )
|
|
{
|
|
delete s_HostController ;
|
|
s_HostController = NULL ;
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
}
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
s_RefresherManagerController = :: new RefresherManagerController ( *s_Allocator ) ;
|
|
if ( s_RefresherManagerController )
|
|
{
|
|
s_RefresherManagerController->AddRef () ;
|
|
|
|
WmiStatusCode t_StatusCode = s_RefresherManagerController->Initialize () ;
|
|
if ( t_StatusCode != e_StatusCode_Success )
|
|
{
|
|
delete s_RefresherManagerController ;
|
|
s_RefresherManagerController = NULL ;
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
}
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
WmiStatusCode t_StatusCode = WmiThread <ULONG> :: Static_Initialize ( *s_Allocator ) ;
|
|
}
|
|
|
|
ProviderSubSystem_Common_Globals :: InitializeTransmitSize () ;
|
|
|
|
ProviderSubSystem_Common_Globals :: InitializeDefaultStackSize () ;
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Globals :: Global_Shutdown ()
|
|
{
|
|
HRESULT t_Result = S_OK ;
|
|
|
|
WmiStatusCode t_StatusCode = WmiHelper :: DeleteCriticalSection ( & s_DecoupledRegistrySection ) ;
|
|
|
|
t_StatusCode = WmiHelper :: DeleteCriticalSection ( & s_GuidTagSection ) ;
|
|
|
|
if ( s_GuidTag )
|
|
{
|
|
t_StatusCode = s_GuidTag->UnInitialize () ;
|
|
delete s_GuidTag ;
|
|
s_GuidTag = NULL ;
|
|
}
|
|
|
|
if ( s_ProvSubSysController )
|
|
{
|
|
WmiStatusCode t_StatusCode = s_ProvSubSysController->UnInitialize () ;
|
|
s_ProvSubSysController->Release () ;
|
|
s_ProvSubSysController = NULL ;
|
|
}
|
|
|
|
if ( s_SyncProviderController )
|
|
{
|
|
WmiStatusCode t_StatusCode = s_SyncProviderController->Shutdown () ;
|
|
t_StatusCode = s_SyncProviderController->UnInitialize () ;
|
|
s_SyncProviderController->Release () ;
|
|
s_SyncProviderController = NULL ;
|
|
}
|
|
|
|
if ( s_HostedProviderController )
|
|
{
|
|
WmiStatusCode t_StatusCode = s_HostController->Shutdown () ;
|
|
t_StatusCode = s_HostController->UnInitialize () ;
|
|
s_HostController->Release () ;
|
|
s_HostController = NULL ;
|
|
}
|
|
|
|
if ( s_HostController )
|
|
{
|
|
WmiStatusCode t_StatusCode = s_HostController->Shutdown () ;
|
|
t_StatusCode = s_HostController->UnInitialize () ;
|
|
s_HostController->Release () ;
|
|
s_HostController = NULL ;
|
|
}
|
|
|
|
if ( s_RefresherManagerController )
|
|
{
|
|
WmiStatusCode t_StatusCode = s_RefresherManagerController->Shutdown () ;
|
|
t_StatusCode = s_RefresherManagerController->UnInitialize () ;
|
|
s_RefresherManagerController->Release () ;
|
|
s_RefresherManagerController= NULL ;
|
|
}
|
|
|
|
t_StatusCode = WmiThread <ULONG> :: Static_UnInitialize ( *s_Allocator ) ;
|
|
|
|
if ( s_NtEventLogSource )
|
|
{
|
|
DeregisterEventSource ( s_NtEventLogSource ) ;
|
|
}
|
|
|
|
if ( s_Allocator )
|
|
{
|
|
/*
|
|
* Use the global process heap for this particular boot operation
|
|
*/
|
|
|
|
WmiAllocator t_Allocator ;
|
|
WmiStatusCode t_StatusCode = t_Allocator.Delete (
|
|
|
|
( void * ) s_Allocator
|
|
) ;
|
|
|
|
if ( t_StatusCode != e_StatusCode_Success )
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
CWbemGlobal_ComServerTagContainer *ProviderSubSystem_Globals :: GetGuidTag ()
|
|
{
|
|
return s_GuidTag ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
CWbemGlobal_IWmiProvSubSysController *ProviderSubSystem_Globals :: GetProvSubSysController ()
|
|
{
|
|
return s_ProvSubSysController ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
CWbemGlobal_IWbemSyncProviderController *ProviderSubSystem_Globals :: GetSyncProviderController ()
|
|
{
|
|
return s_SyncProviderController ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HostController *ProviderSubSystem_Globals :: GetHostController ()
|
|
{
|
|
return s_HostController ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
RefresherManagerController *ProviderSubSystem_Globals :: GetRefresherManagerController ()
|
|
{
|
|
return s_RefresherManagerController ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
CWbemGlobal_HostedProviderController *ProviderSubSystem_Globals :: GetHostedProviderController ()
|
|
{
|
|
return s_HostedProviderController ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
CriticalSection *ProviderSubSystem_Globals :: GetGuidTagCriticalSection ()
|
|
{
|
|
return & s_GuidTagSection ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
CriticalSection *ProviderSubSystem_Globals :: GetDecoupledRegistrySection ()
|
|
{
|
|
return & s_DecoupledRegistrySection ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
void * __cdecl operator new ( size_t a_Size )
|
|
{
|
|
void *t_Ptr ;
|
|
WmiStatusCode t_StatusCode = ProviderSubSystem_Globals :: s_Allocator->New (
|
|
|
|
( void ** ) & t_Ptr ,
|
|
a_Size
|
|
) ;
|
|
|
|
if ( t_StatusCode != e_StatusCode_Success )
|
|
{
|
|
#if 1
|
|
t_Ptr = NULL ;
|
|
#else
|
|
throw Wmi_Heap_Exception (
|
|
|
|
Wmi_Heap_Exception::HEAP_ERROR::E_ALLOCATION_ERROR
|
|
) ;
|
|
#endif
|
|
}
|
|
|
|
return t_Ptr ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
void __cdecl operator delete ( void *a_Ptr )
|
|
{
|
|
if ( a_Ptr )
|
|
{
|
|
WmiStatusCode t_StatusCode = ProviderSubSystem_Globals :: s_Allocator->Delete (
|
|
|
|
( void * ) a_Ptr
|
|
) ;
|
|
}
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Globals :: ForwardReload (
|
|
|
|
long a_Flags ,
|
|
IWbemContext *a_Context ,
|
|
LPCWSTR a_Namespace ,
|
|
LPCWSTR a_Provider
|
|
)
|
|
{
|
|
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 ();
|
|
|
|
CServerObject_ProviderSubSystem **t_ControllerElements = new CServerObject_ProviderSubSystem * [ t_Container->Size () ] ;
|
|
if ( t_ControllerElements )
|
|
{
|
|
ULONG t_Count = 0 ;
|
|
while ( ! t_Iterator.Null () )
|
|
{
|
|
HRESULT t_Result = t_Iterator.GetElement ()->QueryInterface ( IID_CWbemProviderSubSystem , ( 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 ]->ForwardReload (
|
|
|
|
0 ,
|
|
NULL ,
|
|
a_Namespace ,
|
|
a_Provider
|
|
) ;
|
|
|
|
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:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
BOOL ProviderSubSystem_Globals :: CheckGuidTag ( const GUID &a_Guid )
|
|
{
|
|
BOOL t_Present = FALSE ;
|
|
|
|
CWbemGlobal_ComServerTagContainer_Iterator t_Iterator ;
|
|
|
|
WmiStatusCode t_StatusCode = WmiHelper :: EnterCriticalSection ( & s_GuidTagSection ) ;
|
|
|
|
t_StatusCode = s_GuidTag->Find ( a_Guid , t_Iterator ) ;
|
|
if ( t_StatusCode == e_StatusCode_Success )
|
|
{
|
|
t_Present = TRUE ;
|
|
}
|
|
|
|
t_StatusCode = WmiHelper :: LeaveCriticalSection ( & s_GuidTagSection ) ;
|
|
|
|
return t_Present ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
void ProviderSubSystem_Globals :: InsertGuidTag ( const GUID &a_Guid )
|
|
{
|
|
CWbemGlobal_ComServerTagContainer_Iterator t_Iterator ;
|
|
|
|
WmiStatusCode t_StatusCode = WmiHelper :: EnterCriticalSection ( & s_GuidTagSection ) ;
|
|
|
|
t_StatusCode = s_GuidTag->Insert ( a_Guid , a_Guid , t_Iterator ) ;
|
|
|
|
t_StatusCode = WmiHelper :: LeaveCriticalSection ( & s_GuidTagSection ) ;
|
|
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
void ProviderSubSystem_Globals :: DeleteGuidTag ( const GUID &a_Guid )
|
|
{
|
|
WmiStatusCode t_StatusCode = WmiHelper :: EnterCriticalSection ( & s_GuidTagSection ) ;
|
|
|
|
t_StatusCode = s_GuidTag->Delete ( a_Guid ) ;
|
|
|
|
t_StatusCode = WmiHelper :: LeaveCriticalSection ( & s_GuidTagSection ) ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
void ProviderSubSystem_Globals :: ClearGuidTag ()
|
|
{
|
|
WmiStatusCode t_StatusCode = WmiHelper :: EnterCriticalSection ( & s_GuidTagSection ) ;
|
|
|
|
CWbemGlobal_ComServerTagContainer_Iterator GuidTagIt = s_GuidTag->Begin();
|
|
while (!GuidTagIt.Null())
|
|
{
|
|
s_GuidTag->Delete (GuidTagIt.GetKey());
|
|
GuidTagIt = s_GuidTag->Begin();
|
|
}
|
|
t_StatusCode = WmiHelper :: LeaveCriticalSection ( & s_GuidTagSection ) ;
|
|
}
|
|
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Globals :: BeginThreadImpersonation (
|
|
|
|
IUnknown *&a_OldContext ,
|
|
IServerSecurity *&a_OldSecurity ,
|
|
BOOL &a_Impersonating
|
|
)
|
|
{
|
|
HRESULT t_Result = S_OK ;
|
|
|
|
IServerSecurity *t_ServerSecurity = NULL ;
|
|
|
|
t_Result = CoGetCallContext ( IID_IUnknown , ( void ** ) & a_OldContext ) ;
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
t_Result = a_OldContext->QueryInterface ( IID_IServerSecurity , ( void ** ) & t_ServerSecurity ) ;
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
a_Impersonating = t_ServerSecurity->IsImpersonating () ;
|
|
}
|
|
else
|
|
{
|
|
a_Impersonating = FALSE ;
|
|
}
|
|
}
|
|
|
|
CWbemCallSecurity *t_CallSecurity = CWbemCallSecurity :: New () ;
|
|
if ( t_CallSecurity )
|
|
{
|
|
t_CallSecurity->AddRef () ;
|
|
|
|
_IWmiThreadSecHandle *t_ThreadSecurity = NULL ;
|
|
t_Result = t_CallSecurity->GetThreadSecurity ( ( WMI_THREAD_SECURITY_ORIGIN ) ( WMI_ORIGIN_THREAD ) , & t_ThreadSecurity ) ;
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
t_Result = t_CallSecurity->SetThreadSecurity ( t_ThreadSecurity ) ;
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
t_Result = t_CallSecurity->QueryInterface ( IID_IServerSecurity , ( void ** ) & a_OldSecurity ) ;
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
if ( a_Impersonating )
|
|
{
|
|
t_ServerSecurity->RevertToSelf () ;
|
|
}
|
|
}
|
|
}
|
|
|
|
t_ThreadSecurity->Release () ;
|
|
}
|
|
|
|
t_CallSecurity->Release () ;
|
|
}
|
|
|
|
if ( t_ServerSecurity )
|
|
{
|
|
t_ServerSecurity->Release () ;
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Globals :: EndThreadImpersonation (
|
|
|
|
IUnknown *a_OldContext ,
|
|
IServerSecurity *a_OldSecurity ,
|
|
BOOL a_Impersonating
|
|
|
|
)
|
|
{
|
|
HRESULT t_Result = S_OK ;
|
|
|
|
IUnknown *t_NewContext = NULL ;
|
|
|
|
t_Result = CoSwitchCallContext ( a_OldContext , & t_NewContext ) ;
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
if ( a_OldContext )
|
|
{
|
|
if ( a_Impersonating )
|
|
{
|
|
IServerSecurity *t_ServerSecurity = NULL ;
|
|
t_Result = a_OldContext->QueryInterface ( IID_IServerSecurity , ( void ** ) & t_ServerSecurity ) ;
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
t_ServerSecurity->ImpersonateClient () ;
|
|
|
|
t_ServerSecurity->Release () ;
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( a_OldSecurity )
|
|
{
|
|
a_OldSecurity->Release() ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
|
|
/*
|
|
* CoGetCallContext AddReffed this thing so now we have to release it.
|
|
*/
|
|
|
|
if ( a_OldContext )
|
|
{
|
|
a_OldContext->Release () ;
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Globals :: Begin_IdentifyCall_PrvHost (
|
|
|
|
WmiInternalContext a_InternalContext ,
|
|
BOOL &a_Impersonating ,
|
|
IUnknown *&a_OldContext ,
|
|
IServerSecurity *&a_OldSecurity
|
|
)
|
|
{
|
|
HRESULT t_Result = WBEM_E_INVALID_PARAMETER ;
|
|
|
|
if ( a_InternalContext.m_IdentifyHandle )
|
|
{
|
|
HANDLE t_IdentifyToken = ( HANDLE ) a_InternalContext.m_IdentifyHandle ;
|
|
BOOL t_Status = SetThreadToken ( NULL , t_IdentifyToken ) ;
|
|
if ( t_Status )
|
|
{
|
|
t_Result = BeginThreadImpersonation ( a_OldContext , a_OldSecurity , a_Impersonating ) ;
|
|
|
|
RevertToSelf () ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_ACCESS_DENIED ;
|
|
}
|
|
|
|
CloseHandle ( t_IdentifyToken ) ;
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Globals :: End_IdentifyCall_PrvHost (
|
|
|
|
WmiInternalContext a_InternalContext ,
|
|
IUnknown *&a_OldContext ,
|
|
IServerSecurity *&a_OldSecurity ,
|
|
BOOL &a_Impersonating
|
|
)
|
|
{
|
|
EndThreadImpersonation ( a_OldContext , a_OldSecurity , a_Impersonating ) ;
|
|
|
|
RevertToSelf () ;
|
|
|
|
return S_OK ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Globals :: Begin_IdentifyCall_SvcHost (
|
|
|
|
WmiInternalContext a_InternalContext ,
|
|
BOOL &a_Impersonating ,
|
|
IUnknown *&a_OldContext ,
|
|
IServerSecurity *&a_OldSecurity
|
|
)
|
|
{
|
|
HRESULT t_Result = WBEM_E_INVALID_PARAMETER ;
|
|
|
|
if ( a_InternalContext.m_IdentifyHandle )
|
|
{
|
|
HANDLE t_IdentifyToken = NULL ;
|
|
|
|
t_Result = CoImpersonateClient () ;
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
HANDLE t_CallerIdentifyToken = ( HANDLE ) a_InternalContext.m_IdentifyHandle ;
|
|
DWORD t_ProcessIdentifier = a_InternalContext.m_ProcessIdentifier ;
|
|
|
|
HANDLE t_ProcessHandle = OpenProcess (
|
|
|
|
PROCESS_DUP_HANDLE ,
|
|
FALSE ,
|
|
t_ProcessIdentifier
|
|
) ;
|
|
|
|
if ( t_ProcessHandle )
|
|
{
|
|
BOOL t_Status = DuplicateHandle (
|
|
|
|
t_ProcessHandle ,
|
|
t_CallerIdentifyToken ,
|
|
GetCurrentProcess () ,
|
|
& t_IdentifyToken ,
|
|
MAXIMUM_ALLOWED | TOKEN_DUPLICATE | TOKEN_IMPERSONATE ,
|
|
TRUE ,
|
|
0
|
|
) ;
|
|
|
|
if ( t_Status )
|
|
{
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_ACCESS_DENIED ;
|
|
}
|
|
|
|
CloseHandle ( t_ProcessHandle ) ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_ACCESS_DENIED ;
|
|
}
|
|
|
|
CoRevertToSelf () ;
|
|
}
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
BOOL t_Status = SetThreadToken ( NULL , t_IdentifyToken ) ;
|
|
if ( t_Status )
|
|
{
|
|
t_Result = BeginThreadImpersonation ( a_OldContext , a_OldSecurity , a_Impersonating ) ;
|
|
|
|
CoRevertToSelf () ;
|
|
|
|
RevertToSelf () ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_ACCESS_DENIED ;
|
|
}
|
|
|
|
CloseHandle ( t_IdentifyToken ) ;
|
|
}
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Globals :: End_IdentifyCall_SvcHost (
|
|
|
|
WmiInternalContext a_InternalContext ,
|
|
IUnknown *&a_OldContext ,
|
|
IServerSecurity *&a_OldSecurity ,
|
|
BOOL &a_Impersonating
|
|
)
|
|
{
|
|
EndThreadImpersonation ( a_OldContext , a_OldSecurity , a_Impersonating ) ;
|
|
|
|
RevertToSelf () ;
|
|
|
|
return S_OK ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
LONG ProviderSubSystem_Globals :: Increment_Global_Object_Count ()
|
|
{
|
|
return InterlockedIncrement ( & ProviderSubSystem_Globals :: s_ObjectsInProgress ) ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
LONG ProviderSubSystem_Globals :: Decrement_Global_Object_Count ()
|
|
{
|
|
LONG t_Count = InterlockedDecrement ( & ProviderSubSystem_Globals :: s_ObjectsInProgress ) ;
|
|
|
|
#ifdef WMIASLOCAL
|
|
#ifdef DBG
|
|
if ( t_Count == 1 )
|
|
{
|
|
SetObjectDestruction () ;
|
|
}
|
|
#else
|
|
if ( ProviderSubSystem_Globals :: s_CServerObject_Host_ObjectsInProgress == 0 )
|
|
{
|
|
SetObjectDestruction () ;
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
return t_Count ;
|
|
}
|
|
|