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.
4792 lines
99 KiB
4792 lines
99 KiB
/*++
|
|
|
|
Copyright (C) 1996-2001 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
Globals.cpp
|
|
|
|
Abstract:
|
|
|
|
|
|
History:
|
|
|
|
--*/
|
|
|
|
#include <precomp.h>
|
|
#include <windows.h>
|
|
#include <objbase.h>
|
|
#include <sddl.h>
|
|
|
|
#include <initguid.h>
|
|
#ifndef INITGUID
|
|
#define INITGUID
|
|
#endif
|
|
|
|
#include <wbemcli.h>
|
|
#include <wbemint.h>
|
|
#include <winntsec.h>
|
|
#include <wbemcomn.h>
|
|
#include <callsec.h>
|
|
#include <cominit.h>
|
|
|
|
#include <BasicTree.h>
|
|
#include <Thread.h>
|
|
#include <Logging.h>
|
|
#include <PSSException.h>
|
|
#include <Cache.h>
|
|
|
|
#include "DateTime.h"
|
|
#include "CGlobals.h"
|
|
|
|
#include <Allocator.cpp>
|
|
#include <HelperFuncs.cpp>
|
|
#include <Logging.cpp>
|
|
|
|
#include <Cache.cpp>
|
|
|
|
#include <CallSec.h>
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
LPCWSTR ProviderSubSystem_Common_Globals :: s_Wql = L"Wql" ;
|
|
LPCWSTR ProviderSubSystem_Common_Globals :: s_Provider = L"Provider" ;
|
|
|
|
WORD ProviderSubSystem_Common_Globals :: s_System_ACESize = 0 ;
|
|
WORD ProviderSubSystem_Common_Globals :: s_LocalService_ACESize = 0 ;
|
|
WORD ProviderSubSystem_Common_Globals :: s_NetworkService_ACESize = 0 ;
|
|
WORD ProviderSubSystem_Common_Globals :: s_LocalAdmins_ACESize = 0 ;
|
|
|
|
ACCESS_ALLOWED_ACE *ProviderSubSystem_Common_Globals :: s_Provider_System_ACE = NULL ;
|
|
ACCESS_ALLOWED_ACE *ProviderSubSystem_Common_Globals :: s_Provider_LocalService_ACE = NULL ;
|
|
ACCESS_ALLOWED_ACE *ProviderSubSystem_Common_Globals :: s_Provider_NetworkService_ACE = NULL ;
|
|
ACCESS_ALLOWED_ACE *ProviderSubSystem_Common_Globals :: s_Provider_LocalAdmins_ACE = NULL ;
|
|
|
|
ACCESS_ALLOWED_ACE *ProviderSubSystem_Common_Globals :: s_Token_All_Access_System_ACE = NULL ;
|
|
ACCESS_ALLOWED_ACE *ProviderSubSystem_Common_Globals :: s_Token_All_Access_LocalService_ACE = NULL ;
|
|
ACCESS_ALLOWED_ACE *ProviderSubSystem_Common_Globals :: s_Token_All_Access_NetworkService_ACE = NULL ;
|
|
ACCESS_ALLOWED_ACE *ProviderSubSystem_Common_Globals :: s_Token_All_Access_LocalAdmins_ACE = NULL ;
|
|
|
|
SECURITY_DESCRIPTOR *ProviderSubSystem_Common_Globals :: s_MethodSecurityDescriptor = NULL ;
|
|
SECURITY_DESCRIPTOR *ProviderSubSystem_Common_Globals :: s_DefaultDecoupledSD = NULL ;
|
|
ULONG ProviderSubSystem_Common_Globals :: s_TransmitBufferSize = SYNCPROV_BATCH_TRANSMIT_SIZE ;
|
|
ULONG ProviderSubSystem_Common_Globals :: s_DefaultStackSize = 0 ;
|
|
|
|
|
|
|
|
wchar_t * DupString(const wchar_t * src)
|
|
{
|
|
wchar_t * dest = 0;
|
|
size_t len = wcslen(src);
|
|
dest = new wchar_t[len+1];
|
|
if (dest) memcpy(dest,src, (len+1)*sizeof(wchar_t));
|
|
return dest;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Common_Globals :: CreateInstance (
|
|
|
|
const CLSID &a_ReferenceClsid ,
|
|
LPUNKNOWN a_OuterUnknown ,
|
|
const DWORD &a_ClassContext ,
|
|
const UUID &a_ReferenceInterfaceId ,
|
|
void **a_ObjectInterface
|
|
)
|
|
{
|
|
HRESULT t_Result = S_OK ;
|
|
|
|
COAUTHINFO t_AuthenticationInfo ;
|
|
ZeroMemory ( & t_AuthenticationInfo , sizeof ( t_AuthenticationInfo ) ) ;
|
|
|
|
t_AuthenticationInfo.dwAuthnSvc = RPC_C_AUTHN_DEFAULT ;
|
|
t_AuthenticationInfo.dwAuthzSvc = RPC_C_AUTHZ_DEFAULT ;
|
|
t_AuthenticationInfo.pwszServerPrincName = NULL ;
|
|
t_AuthenticationInfo.dwAuthnLevel = RPC_C_AUTHN_LEVEL_DEFAULT ;
|
|
t_AuthenticationInfo.dwImpersonationLevel = RPC_C_IMP_LEVEL_IMPERSONATE ;
|
|
t_AuthenticationInfo.dwCapabilities = EOAC_NONE ;
|
|
t_AuthenticationInfo.pAuthIdentityData = NULL ;
|
|
|
|
COSERVERINFO t_ServerInfo ;
|
|
ZeroMemory ( & t_ServerInfo , sizeof ( t_ServerInfo ) ) ;
|
|
|
|
t_ServerInfo.pwszName = NULL ;
|
|
t_ServerInfo.dwReserved2 = 0 ;
|
|
t_ServerInfo.pAuthInfo = & t_AuthenticationInfo ;
|
|
|
|
IClassFactory *t_ClassFactory = NULL ;
|
|
|
|
t_Result = CoGetClassObject (
|
|
|
|
a_ReferenceClsid ,
|
|
a_ClassContext ,
|
|
& t_ServerInfo ,
|
|
IID_IClassFactory ,
|
|
( void ** ) & t_ClassFactory
|
|
) ;
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
t_Result = t_ClassFactory->CreateInstance (
|
|
|
|
a_OuterUnknown ,
|
|
a_ReferenceInterfaceId ,
|
|
a_ObjectInterface
|
|
);
|
|
|
|
t_ClassFactory->Release () ;
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Common_Globals :: GetNamespaceServerPath (
|
|
|
|
IWbemPath *a_Namespace ,
|
|
wchar_t *&a_ServerNamespacePath
|
|
)
|
|
{
|
|
a_ServerNamespacePath = NULL ;
|
|
|
|
wchar_t *t_Server = NULL ;
|
|
ULONG t_ServerLength = 0 ;
|
|
|
|
HRESULT t_Result = a_Namespace->GetServer (
|
|
|
|
& t_ServerLength ,
|
|
t_Server
|
|
) ;
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
t_Server = new wchar_t [ t_ServerLength + 1 ] ;
|
|
|
|
if (NULL != t_Server)
|
|
{
|
|
t_Result = a_Namespace->GetServer (
|
|
|
|
& t_ServerLength ,
|
|
t_Server
|
|
) ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY;
|
|
}
|
|
|
|
if ( FAILED ( t_Result ) )
|
|
{
|
|
delete [] t_Server ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_INVALID_NAMESPACE ;
|
|
}
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
wchar_t *t_ConcatString = NULL ;
|
|
|
|
WmiStatusCode t_StatusCode = WmiHelper :: ConcatenateStrings_Wchar (
|
|
|
|
2 ,
|
|
& t_ConcatString ,
|
|
L"\\\\" ,
|
|
t_Server
|
|
) ;
|
|
|
|
delete [] t_Server ;
|
|
|
|
if ( t_StatusCode == e_StatusCode_Success )
|
|
{
|
|
a_ServerNamespacePath = t_ConcatString ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
}
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
ULONG t_NamespaceCount = 0 ;
|
|
|
|
t_Result = a_Namespace->GetNamespaceCount (
|
|
|
|
& t_NamespaceCount
|
|
) ;
|
|
|
|
if ( t_NamespaceCount )
|
|
{
|
|
for ( ULONG t_Index = 0 ; t_Index < t_NamespaceCount ; t_Index ++ )
|
|
{
|
|
wchar_t *t_Namespace = NULL ;
|
|
ULONG t_NamespaceLength = 0 ;
|
|
|
|
t_Result = a_Namespace->GetNamespaceAt (
|
|
|
|
t_Index ,
|
|
& t_NamespaceLength ,
|
|
t_Namespace
|
|
) ;
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
t_Namespace = new wchar_t [ t_NamespaceLength + 1 ] ;
|
|
|
|
if (0 != t_Namespace)
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
break;
|
|
}
|
|
|
|
t_Result = a_Namespace->GetNamespaceAt (
|
|
|
|
t_Index ,
|
|
& t_NamespaceLength ,
|
|
t_Namespace
|
|
) ;
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
wchar_t *t_ConcatString = NULL ;
|
|
|
|
WmiStatusCode t_StatusCode = WmiHelper :: ConcatenateStrings_Wchar (
|
|
|
|
3 ,
|
|
& t_ConcatString ,
|
|
a_ServerNamespacePath ,
|
|
L"\\" ,
|
|
t_Namespace
|
|
) ;
|
|
|
|
delete [] t_Namespace ;
|
|
|
|
if ( t_StatusCode == e_StatusCode_Success )
|
|
{
|
|
delete [] a_ServerNamespacePath ;
|
|
a_ServerNamespacePath = t_ConcatString ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
delete [] t_Namespace ;
|
|
t_Result = WBEM_E_CRITICAL_ERROR ;
|
|
break ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_CRITICAL_ERROR ;
|
|
break ;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_INVALID_NAMESPACE ;
|
|
}
|
|
}
|
|
|
|
if ( FAILED ( t_Result ) )
|
|
{
|
|
delete [] a_ServerNamespacePath ;
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Common_Globals :: GetNamespacePath (
|
|
|
|
IWbemPath *a_Namespace ,
|
|
wchar_t *&a_NamespacePath
|
|
)
|
|
{
|
|
a_NamespacePath = NULL ;
|
|
|
|
ULONG t_NamespaceCount = 0 ;
|
|
|
|
HRESULT t_Result = a_Namespace->GetNamespaceCount (
|
|
|
|
& t_NamespaceCount
|
|
) ;
|
|
|
|
if ( t_NamespaceCount )
|
|
{
|
|
for ( ULONG t_Index = 0 ; t_Index < t_NamespaceCount ; t_Index ++ )
|
|
{
|
|
wchar_t *t_Namespace = NULL ;
|
|
ULONG t_NamespaceLength = 0 ;
|
|
|
|
t_Result = a_Namespace->GetNamespaceAt (
|
|
|
|
t_Index ,
|
|
& t_NamespaceLength ,
|
|
t_Namespace
|
|
) ;
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
t_Namespace = new wchar_t [ t_NamespaceLength + 1 ] ;
|
|
|
|
if (NULL != t_Namespace)
|
|
{
|
|
t_Result = a_Namespace->GetNamespaceAt (
|
|
|
|
t_Index ,
|
|
& t_NamespaceLength ,
|
|
t_Namespace
|
|
) ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY;
|
|
}
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
wchar_t *t_ConcatString = NULL ;
|
|
|
|
WmiStatusCode t_StatusCode = WmiHelper :: ConcatenateStrings_Wchar (
|
|
|
|
3 ,
|
|
& t_ConcatString ,
|
|
a_NamespacePath ,
|
|
t_Index ? L"\\" : NULL ,
|
|
t_Namespace
|
|
) ;
|
|
|
|
delete [] t_Namespace ;
|
|
|
|
if ( t_StatusCode == e_StatusCode_Success )
|
|
{
|
|
delete [] a_NamespacePath ;
|
|
a_NamespacePath = t_ConcatString ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_CRITICAL_ERROR ;
|
|
break ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_CRITICAL_ERROR ;
|
|
break ;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_INVALID_NAMESPACE ;
|
|
}
|
|
|
|
if ( FAILED ( t_Result ) )
|
|
{
|
|
delete [] a_NamespacePath ;
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Common_Globals :: GetPathText (
|
|
|
|
IWbemPath *a_Path ,
|
|
wchar_t *&a_ObjectPath
|
|
)
|
|
{
|
|
ULONG t_ObjectPathLength = 0 ;
|
|
|
|
HRESULT t_Result = a_Path->GetText (
|
|
|
|
0 ,
|
|
& t_ObjectPathLength ,
|
|
NULL
|
|
) ;
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
a_ObjectPath = new wchar_t [ t_ObjectPathLength + 1 ] ;
|
|
if ( a_ObjectPath )
|
|
{
|
|
t_Result = a_Path->GetText (
|
|
|
|
0 ,
|
|
& t_ObjectPathLength ,
|
|
a_ObjectPath
|
|
) ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY;
|
|
}
|
|
}
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Common_Globals :: Set_Uint32 (
|
|
|
|
_IWmiObject *a_Instance ,
|
|
wchar_t *a_Name ,
|
|
const DWORD &a_Uint32
|
|
)
|
|
{
|
|
HRESULT t_Result = a_Instance->WriteProp (
|
|
|
|
a_Name ,
|
|
0 ,
|
|
sizeof ( DWORD ) ,
|
|
0 ,
|
|
CIM_UINT32 ,
|
|
( void * ) & a_Uint32
|
|
) ;
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Common_Globals :: Set_String (
|
|
|
|
IWbemClassObject *a_Instance ,
|
|
wchar_t *a_Name ,
|
|
wchar_t *a_String
|
|
)
|
|
{
|
|
VARIANT t_Variant ;
|
|
VariantInit ( & t_Variant ) ;
|
|
t_Variant.vt = VT_BSTR ;
|
|
t_Variant.bstrVal = SysAllocString ( a_String ) ;
|
|
a_Instance->Put ( a_Name , 0 , & t_Variant , 0 ) ;
|
|
VariantClear ( & t_Variant ) ;
|
|
|
|
return S_OK ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Common_Globals :: BeginCallbackImpersonation (
|
|
|
|
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 ;
|
|
}
|
|
}
|
|
|
|
_IWmiCallSec *t_CallSecurity = NULL ;
|
|
|
|
t_Result = ProviderSubSystem_Common_Globals :: CreateInstance (
|
|
|
|
CLSID__IWbemCallSec ,
|
|
NULL ,
|
|
CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER ,
|
|
IID__IWmiCallSec ,
|
|
( void ** ) & t_CallSecurity
|
|
) ;
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
_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_Common_Globals :: BeginImpersonation (
|
|
|
|
IUnknown *&a_OldContext ,
|
|
IServerSecurity *&a_OldSecurity ,
|
|
BOOL &a_Impersonating ,
|
|
DWORD *a_AuthenticationLevel
|
|
)
|
|
{
|
|
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 ;
|
|
}
|
|
}
|
|
|
|
_IWmiCallSec *t_CallSecurity = NULL ;
|
|
|
|
t_Result = ProviderSubSystem_Common_Globals :: CreateInstance (
|
|
|
|
CLSID__IWbemCallSec ,
|
|
NULL ,
|
|
CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER ,
|
|
IID__IWmiCallSec ,
|
|
( void ** ) & t_CallSecurity
|
|
) ;
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
_IWmiThreadSecHandle *t_ThreadSecurity = NULL ;
|
|
t_Result = t_CallSecurity->GetThreadSecurity ( ( WMI_THREAD_SECURITY_ORIGIN ) ( WMI_ORIGIN_THREAD | WMI_ORIGIN_EXISTING | WMI_ORIGIN_RPC ) , & 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_AuthenticationLevel )
|
|
{
|
|
t_Result = t_ThreadSecurity->GetAuthentication ( a_AuthenticationLevel ) ;
|
|
}
|
|
|
|
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_Common_Globals :: EndImpersonation (
|
|
|
|
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 ) ;
|
|
// CoSwitchCallContext cannot fail if the previous one ( in
|
|
// BeginImpersonation succeeds. Leave position of a_OldSecurity release.
|
|
|
|
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_Result = t_ServerSecurity->ImpersonateClient () ;
|
|
|
|
t_ServerSecurity->Release () ;
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( a_OldSecurity )
|
|
{
|
|
a_OldSecurity->Release() ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
|
|
|
|
if ( a_OldContext )
|
|
{
|
|
a_OldContext->Release () ;
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Common_Globals :: GetProxy (
|
|
|
|
REFIID a_InterfaceId ,
|
|
IUnknown *a_Interface ,
|
|
IUnknown *&a_Proxy
|
|
)
|
|
{
|
|
IUnknown *t_Unknown = NULL ;
|
|
|
|
HRESULT t_Result = a_Interface->QueryInterface (
|
|
a_InterfaceId ,
|
|
( void ** ) & t_Unknown
|
|
) ;
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
IClientSecurity *t_ClientSecurity = NULL ;
|
|
|
|
t_Result = a_Interface->QueryInterface (
|
|
IID_IClientSecurity ,
|
|
( void ** ) & t_ClientSecurity
|
|
) ;
|
|
|
|
if ( SUCCEEDED ( t_Result ))
|
|
{
|
|
t_Result = t_ClientSecurity->CopyProxy (
|
|
a_Interface ,
|
|
( IUnknown ** ) & a_Proxy
|
|
) ;
|
|
|
|
t_ClientSecurity->Release () ;
|
|
}
|
|
else if ( t_Result == E_NOINTERFACE)
|
|
{
|
|
t_Result = WBEM_E_NOT_FOUND ;
|
|
}
|
|
|
|
t_Unknown->Release () ;
|
|
}
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Common_Globals :: GetProxy (
|
|
|
|
ProxyContainer &a_Container ,
|
|
ULONG a_ProxyIndex ,
|
|
REFIID a_InterfaceId ,
|
|
IUnknown *a_Interface ,
|
|
IUnknown *&a_Proxy
|
|
)
|
|
{
|
|
IUnknown *t_Unknown = NULL ;
|
|
|
|
HRESULT t_Result = a_Interface->QueryInterface (
|
|
|
|
a_InterfaceId ,
|
|
( void ** ) & t_Unknown
|
|
) ;
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
IClientSecurity *t_ClientSecurity = NULL ;
|
|
|
|
t_Result = a_Interface->QueryInterface (
|
|
|
|
IID_IClientSecurity ,
|
|
( void ** ) & t_ClientSecurity
|
|
) ;
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
WmiHelper :: EnterCriticalSection ( & a_Container.GetCriticalSection () ) ;
|
|
|
|
WmiStatusCode t_StatusCode = a_Container.Top ( a_Proxy , a_ProxyIndex ) ;
|
|
if ( t_StatusCode == e_StatusCode_Success )
|
|
{
|
|
t_StatusCode = a_Container.Reserve ( a_ProxyIndex ) ;
|
|
}
|
|
else
|
|
{
|
|
if ( a_Container.GetCurrentSize () < a_Container.GetTopSize () )
|
|
{
|
|
t_Result = t_ClientSecurity->CopyProxy (
|
|
|
|
a_Interface ,
|
|
( IUnknown ** ) & a_Proxy
|
|
) ;
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
a_Container.SetCurrentSize ( a_Container.GetCurrentSize () + 1 ) ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
}
|
|
|
|
WmiHelper :: LeaveCriticalSection ( & a_Container.GetCriticalSection () ) ;
|
|
t_ClientSecurity->Release () ;
|
|
}
|
|
else if (E_NOINTERFACE == t_Result)
|
|
{
|
|
t_Result = WBEM_E_NOT_FOUND ;
|
|
}
|
|
|
|
t_Unknown->Release () ;
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Common_Globals :: SetCloaking (
|
|
|
|
IUnknown *a_Unknown ,
|
|
DWORD a_AuthenticationLevel ,
|
|
DWORD a_ImpersonationLevel
|
|
)
|
|
{
|
|
IClientSecurity *t_ClientSecurity = NULL ;
|
|
|
|
HRESULT t_Result = a_Unknown->QueryInterface (
|
|
|
|
IID_IClientSecurity ,
|
|
( void ** ) & t_ClientSecurity
|
|
) ;
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
t_Result = t_ClientSecurity->SetBlanket (
|
|
|
|
a_Unknown ,
|
|
RPC_C_AUTHN_WINNT ,
|
|
RPC_C_AUTHZ_NONE ,
|
|
NULL ,
|
|
a_AuthenticationLevel ,
|
|
a_ImpersonationLevel ,
|
|
NULL ,
|
|
EOAC_DYNAMIC_CLOAKING
|
|
) ;
|
|
|
|
t_ClientSecurity->Release () ;
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Common_Globals :: SetCloaking (
|
|
|
|
IUnknown *a_Unknown
|
|
)
|
|
{
|
|
IClientSecurity *t_ClientSecurity = NULL ;
|
|
|
|
HRESULT t_Result = a_Unknown->QueryInterface (
|
|
|
|
IID_IClientSecurity ,
|
|
( void ** ) & t_ClientSecurity
|
|
) ;
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
t_Result = t_ClientSecurity->SetBlanket (
|
|
|
|
a_Unknown ,
|
|
RPC_C_AUTHN_WINNT ,
|
|
RPC_C_AUTHZ_NONE ,
|
|
NULL ,
|
|
RPC_C_AUTHN_LEVEL_DEFAULT ,
|
|
RPC_C_IMP_LEVEL_DEFAULT ,
|
|
NULL ,
|
|
EOAC_DYNAMIC_CLOAKING
|
|
) ;
|
|
|
|
t_ClientSecurity->Release () ;
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
DWORD ProviderSubSystem_Common_Globals :: GetCurrentImpersonationLevel ()
|
|
{
|
|
DWORD t_ImpersonationLevel = RPC_C_IMP_LEVEL_ANONYMOUS ;
|
|
|
|
HANDLE t_ThreadToken = NULL ;
|
|
|
|
BOOL t_Status = OpenThreadToken (
|
|
|
|
GetCurrentThread() ,
|
|
TOKEN_QUERY,
|
|
TRUE ,
|
|
&t_ThreadToken
|
|
) ;
|
|
|
|
if ( t_Status )
|
|
{
|
|
SECURITY_IMPERSONATION_LEVEL t_Level = SecurityAnonymous ;
|
|
DWORD t_Returned = 0 ;
|
|
|
|
t_Status = GetTokenInformation (
|
|
|
|
t_ThreadToken ,
|
|
TokenImpersonationLevel ,
|
|
& t_Level ,
|
|
sizeof ( SECURITY_IMPERSONATION_LEVEL ) ,
|
|
& t_Returned
|
|
) ;
|
|
|
|
CloseHandle ( t_ThreadToken ) ;
|
|
|
|
if ( t_Status == FALSE )
|
|
{
|
|
t_ImpersonationLevel = RPC_C_IMP_LEVEL_ANONYMOUS ;
|
|
}
|
|
else
|
|
{
|
|
switch ( t_Level )
|
|
{
|
|
case SecurityAnonymous:
|
|
{
|
|
t_ImpersonationLevel = RPC_C_IMP_LEVEL_ANONYMOUS ;
|
|
}
|
|
break ;
|
|
|
|
case SecurityIdentification:
|
|
{
|
|
t_ImpersonationLevel = RPC_C_IMP_LEVEL_IDENTIFY ;
|
|
}
|
|
break ;
|
|
|
|
case SecurityImpersonation:
|
|
{
|
|
t_ImpersonationLevel = RPC_C_IMP_LEVEL_IMPERSONATE ;
|
|
}
|
|
break ;
|
|
|
|
case SecurityDelegation:
|
|
{
|
|
t_ImpersonationLevel = RPC_C_IMP_LEVEL_DELEGATE ;
|
|
}
|
|
break ;
|
|
|
|
default:
|
|
{
|
|
t_ImpersonationLevel = RPC_C_IMP_LEVEL_ANONYMOUS ;
|
|
}
|
|
break ;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
ULONG t_LastError = GetLastError () ;
|
|
|
|
if ( t_LastError == ERROR_NO_IMPERSONATION_TOKEN || t_LastError == ERROR_NO_TOKEN )
|
|
{
|
|
t_ImpersonationLevel = RPC_C_IMP_LEVEL_DELEGATE ;
|
|
}
|
|
else
|
|
{
|
|
if ( t_LastError == ERROR_CANT_OPEN_ANONYMOUS )
|
|
{
|
|
t_ImpersonationLevel = RPC_C_IMP_LEVEL_ANONYMOUS ;
|
|
}
|
|
else
|
|
{
|
|
t_ImpersonationLevel = RPC_C_IMP_LEVEL_ANONYMOUS ;
|
|
}
|
|
}
|
|
}
|
|
|
|
return t_ImpersonationLevel ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Common_Globals :: EnableAllPrivileges ( HANDLE a_Token )
|
|
{
|
|
HRESULT t_Result = S_OK ;
|
|
|
|
DWORD t_ReturnedLength = 0 ;
|
|
|
|
BOOL t_Status = GetTokenInformation (
|
|
|
|
a_Token ,
|
|
TokenPrivileges ,
|
|
NULL ,
|
|
0 ,
|
|
& t_ReturnedLength
|
|
) ;
|
|
|
|
UCHAR *t_Buffer = new UCHAR [ t_ReturnedLength ] ;
|
|
if ( t_Buffer )
|
|
{
|
|
t_Status = GetTokenInformation (
|
|
|
|
a_Token ,
|
|
TokenPrivileges ,
|
|
t_Buffer ,
|
|
t_ReturnedLength ,
|
|
& t_ReturnedLength
|
|
) ;
|
|
|
|
if ( t_Status )
|
|
{
|
|
TOKEN_PRIVILEGES *t_Privileges = ( TOKEN_PRIVILEGES * ) t_Buffer ;
|
|
BOOL bNeedToAdjust = FALSE;
|
|
|
|
for ( ULONG t_Index = 0; t_Index < t_Privileges->PrivilegeCount ; t_Index ++ )
|
|
{
|
|
if (!(t_Privileges->Privileges [ t_Index ].Attributes & SE_PRIVILEGE_ENABLED))
|
|
{
|
|
bNeedToAdjust = TRUE;
|
|
t_Privileges->Privileges [ t_Index ].Attributes |= SE_PRIVILEGE_ENABLED ;
|
|
}
|
|
}
|
|
|
|
if (bNeedToAdjust)
|
|
{
|
|
t_Status = AdjustTokenPrivileges (
|
|
|
|
a_Token,
|
|
FALSE,
|
|
t_Privileges ,
|
|
0,
|
|
NULL,
|
|
NULL
|
|
) ;
|
|
}
|
|
|
|
if ( t_Status == FALSE )
|
|
{
|
|
t_Result = WBEM_E_ACCESS_DENIED ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Status = WBEM_E_ACCESS_DENIED ;
|
|
}
|
|
|
|
delete [] t_Buffer ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Common_Globals :: EnableAllPrivileges ()
|
|
{
|
|
HRESULT t_Result = S_OK ;
|
|
|
|
HANDLE t_Token = NULL ;
|
|
|
|
BOOL t_Status = TRUE ;
|
|
|
|
t_Status = OpenThreadToken (
|
|
|
|
GetCurrentThread (),
|
|
TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES ,
|
|
FALSE,
|
|
&t_Token
|
|
) ;
|
|
|
|
if ( t_Status )
|
|
{
|
|
DWORD t_ReturnedLength = 0 ;
|
|
|
|
t_Status = GetTokenInformation (
|
|
|
|
t_Token ,
|
|
TokenPrivileges ,
|
|
NULL ,
|
|
0 ,
|
|
& t_ReturnedLength
|
|
) ;
|
|
|
|
UCHAR *t_Buffer = new UCHAR [ t_ReturnedLength ] ;
|
|
if ( t_Buffer )
|
|
{
|
|
t_Status = GetTokenInformation (
|
|
|
|
t_Token ,
|
|
TokenPrivileges ,
|
|
t_Buffer ,
|
|
t_ReturnedLength ,
|
|
& t_ReturnedLength
|
|
) ;
|
|
|
|
if ( t_Status )
|
|
{
|
|
TOKEN_PRIVILEGES *t_Privileges = ( TOKEN_PRIVILEGES * ) t_Buffer ;
|
|
BOOL bNeedToAdjust = FALSE;
|
|
|
|
for ( ULONG t_Index = 0; t_Index < t_Privileges->PrivilegeCount ; t_Index ++ )
|
|
{
|
|
if (!(t_Privileges->Privileges [ t_Index ].Attributes & SE_PRIVILEGE_ENABLED))
|
|
{
|
|
t_Privileges->Privileges [ t_Index ].Attributes |= SE_PRIVILEGE_ENABLED ;
|
|
bNeedToAdjust = TRUE;
|
|
}
|
|
}
|
|
|
|
if (bNeedToAdjust)
|
|
{
|
|
t_Status = AdjustTokenPrivileges (
|
|
|
|
t_Token,
|
|
FALSE,
|
|
t_Privileges ,
|
|
0,
|
|
NULL,
|
|
NULL
|
|
) ;
|
|
}
|
|
|
|
if ( t_Status == FALSE )
|
|
{
|
|
t_Result = WBEM_E_ACCESS_DENIED ;
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
t_Status = WBEM_E_ACCESS_DENIED ;
|
|
}
|
|
|
|
delete [] t_Buffer ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
|
|
CloseHandle ( t_Token ) ;
|
|
}
|
|
else
|
|
{
|
|
DWORD t_LastError = GetLastError () ;
|
|
t_Result = WBEM_E_ACCESS_DENIED;
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Common_Globals :: SetProxyState (
|
|
|
|
ProxyContainer &a_Container ,
|
|
ULONG a_ProxyIndex ,
|
|
REFIID a_InterfaceId ,
|
|
IUnknown *a_Interface ,
|
|
IUnknown *&a_Proxy ,
|
|
BOOL &a_Revert
|
|
)
|
|
{
|
|
a_Revert = FALSE ;
|
|
|
|
HRESULT t_Result = GetProxy ( a_Container , a_ProxyIndex , a_InterfaceId , a_Interface , a_Proxy ) ;
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
t_Result = CoImpersonateClient () ;
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
a_Revert = TRUE ;
|
|
|
|
// At this point, our thread token contains all the privileges that the
|
|
// client has enabled for us; however, those privileges are not enabled.
|
|
// Since we are calling into a proxied provider, we need to enable all
|
|
// these privileges so that they would propagate to the provider
|
|
// =====================================================================
|
|
|
|
HRESULT t_TempResult = EnableAllPrivileges () ;
|
|
|
|
// Get the token's impersonation level
|
|
// ===================================
|
|
|
|
DWORD t_ImpersonationLevel = GetCurrentImpersonationLevel () ;
|
|
|
|
if ( t_ImpersonationLevel == RPC_C_IMP_LEVEL_IMPERSONATE || t_ImpersonationLevel == RPC_C_IMP_LEVEL_DELEGATE )
|
|
{
|
|
}
|
|
else
|
|
{
|
|
t_Result = SetInterfaceSecurity (
|
|
|
|
a_Proxy ,
|
|
NULL ,
|
|
NULL ,
|
|
NULL ,
|
|
DWORD(RPC_C_AUTHN_LEVEL_DEFAULT),
|
|
RPC_C_IMP_LEVEL_IDENTIFY
|
|
) ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_ACCESS_DENIED ;
|
|
}
|
|
|
|
if ( FAILED ( t_Result ) )
|
|
{
|
|
RevertProxyState (
|
|
|
|
a_Container ,
|
|
a_ProxyIndex ,
|
|
a_Proxy ,
|
|
a_Revert
|
|
) ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ( t_Result == WBEM_E_NOT_FOUND )
|
|
{
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_CRITICAL_ERROR ;
|
|
}
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Common_Globals :: RevertProxyState (
|
|
|
|
ProxyContainer &a_Container ,
|
|
ULONG a_ProxyIndex ,
|
|
IUnknown *a_Proxy ,
|
|
BOOL a_Revert
|
|
)
|
|
{
|
|
HRESULT t_Result = S_OK ;
|
|
|
|
WmiHelper :: EnterCriticalSection ( & a_Container.GetCriticalSection () ) ;
|
|
|
|
WmiStatusCode t_StatusCode = a_Container.Return ( a_Proxy , a_ProxyIndex ) ;
|
|
if ( t_StatusCode == e_StatusCode_Success )
|
|
{
|
|
}
|
|
else
|
|
{
|
|
a_Proxy->Release () ;
|
|
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
|
|
WmiHelper :: LeaveCriticalSection ( & a_Container.GetCriticalSection () ) ;
|
|
|
|
if ( a_Revert )
|
|
{
|
|
t_Result = CoRevertToSelf () ;
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Common_Globals :: SetProxyState_NoImpersonation (
|
|
|
|
ProxyContainer &a_Container ,
|
|
ULONG a_ProxyIndex ,
|
|
REFIID a_InterfaceId ,
|
|
IUnknown *a_Interface ,
|
|
IUnknown *&a_Proxy ,
|
|
BOOL &a_Revert
|
|
)
|
|
{
|
|
a_Revert = FALSE ;
|
|
|
|
HRESULT t_Result = GetProxy ( a_Container , a_ProxyIndex , a_InterfaceId , a_Interface , a_Proxy ) ;
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
t_Result = SetInterfaceSecurity (
|
|
|
|
a_Proxy ,
|
|
NULL ,
|
|
NULL ,
|
|
NULL ,
|
|
DWORD(RPC_C_AUTHN_LEVEL_DEFAULT),
|
|
RPC_C_IMP_LEVEL_IDENTIFY
|
|
) ;
|
|
|
|
if ( FAILED ( t_Result ) )
|
|
{
|
|
RevertProxyState (
|
|
|
|
a_Container ,
|
|
a_ProxyIndex ,
|
|
a_Proxy ,
|
|
a_Revert
|
|
) ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ( t_Result == WBEM_E_NOT_FOUND )
|
|
{
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_CRITICAL_ERROR ;
|
|
}
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Common_Globals :: ConstructIdentifyToken_SvcHost (
|
|
|
|
BOOL &a_Revert ,
|
|
DWORD a_ProcessIdentifier ,
|
|
HANDLE &a_IdentifyToken ,
|
|
ACCESS_ALLOWED_ACE *a_Ace ,
|
|
WORD a_AceSize
|
|
)
|
|
{
|
|
HRESULT t_Result = S_OK ;
|
|
|
|
HANDLE t_ThreadToken = NULL ;
|
|
|
|
BOOL t_Status = OpenThreadToken (
|
|
|
|
GetCurrentThread () ,
|
|
MAXIMUM_ALLOWED ,
|
|
TRUE ,
|
|
& t_ThreadToken
|
|
) ;
|
|
|
|
if ( t_Status )
|
|
{
|
|
CoRevertToSelf () ;
|
|
|
|
a_Revert = FALSE ;
|
|
|
|
SECURITY_DESCRIPTOR *t_SecurityDescriptor = NULL ;
|
|
|
|
DWORD t_LengthRequested = 0 ;
|
|
DWORD t_LengthReturned = 0 ;
|
|
|
|
t_Status = GetKernelObjectSecurity (
|
|
|
|
t_ThreadToken ,
|
|
DACL_SECURITY_INFORMATION ,
|
|
& t_SecurityDescriptor ,
|
|
t_LengthRequested ,
|
|
& t_LengthReturned
|
|
) ;
|
|
|
|
if ( ( t_Status == FALSE ) && ( GetLastError () == ERROR_INSUFFICIENT_BUFFER ) )
|
|
{
|
|
t_SecurityDescriptor = ( SECURITY_DESCRIPTOR * ) new BYTE [ t_LengthReturned ] ;
|
|
if ( t_SecurityDescriptor )
|
|
{
|
|
t_LengthRequested = t_LengthReturned ;
|
|
|
|
t_Status = GetKernelObjectSecurity (
|
|
|
|
t_ThreadToken ,
|
|
DACL_SECURITY_INFORMATION ,
|
|
t_SecurityDescriptor ,
|
|
t_LengthRequested ,
|
|
& t_LengthReturned
|
|
) ;
|
|
|
|
if ( t_LengthRequested != t_LengthReturned )
|
|
{
|
|
t_Result = WBEM_E_UNEXPECTED ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_ACCESS_DENIED ;
|
|
}
|
|
|
|
HANDLE t_AdjustedThreadToken = NULL ;
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
PACL t_ExtraDacl = NULL ;
|
|
|
|
ACL *t_Dacl = NULL ;
|
|
BOOL t_DaclPresent = FALSE ;
|
|
BOOL t_DaclDefaulted = FALSE ;
|
|
|
|
t_Status = GetSecurityDescriptorDacl (
|
|
|
|
t_SecurityDescriptor ,
|
|
& t_DaclPresent ,
|
|
& t_Dacl ,
|
|
& t_DaclDefaulted
|
|
) ;
|
|
|
|
if ( t_Status )
|
|
{
|
|
ACL_SIZE_INFORMATION t_Size ;
|
|
|
|
if ( t_Dacl )
|
|
{
|
|
BOOL t_Status = GetAclInformation (
|
|
|
|
t_Dacl ,
|
|
& t_Size ,
|
|
sizeof ( t_Size ) ,
|
|
AclSizeInformation
|
|
);
|
|
|
|
if ( t_Status )
|
|
{
|
|
DWORD t_ExtraSize = t_Size.AclBytesInUse + t_Size.AclBytesFree + a_AceSize ;
|
|
|
|
t_ExtraDacl = ( PACL ) new BYTE [ t_ExtraSize ] ;
|
|
if ( t_ExtraDacl )
|
|
{
|
|
CopyMemory ( t_ExtraDacl , t_Dacl , t_Size.AclBytesInUse + t_Size.AclBytesFree ) ;
|
|
t_ExtraDacl->AclSize = t_ExtraSize ;
|
|
|
|
BOOL t_Status = :: AddAce ( t_ExtraDacl , ACL_REVISION, t_Size.AceCount , a_Ace , a_AceSize ) ;
|
|
if ( t_Status )
|
|
{
|
|
SECURITY_DESCRIPTOR t_AdjustedSecurityDescriptor ;
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
BOOL t_Status = InitializeSecurityDescriptor ( & t_AdjustedSecurityDescriptor , SECURITY_DESCRIPTOR_REVISION ) ;
|
|
if ( t_Status )
|
|
{
|
|
t_Status = SetSecurityDescriptorDacl (
|
|
|
|
& t_AdjustedSecurityDescriptor ,
|
|
t_DaclPresent ,
|
|
t_ExtraDacl ,
|
|
t_DaclDefaulted
|
|
) ;
|
|
|
|
if ( t_Status )
|
|
{
|
|
SECURITY_ATTRIBUTES t_SecurityAttributes ;
|
|
t_SecurityAttributes.nLength = GetSecurityDescriptorLength ( & t_AdjustedSecurityDescriptor ) ;
|
|
t_SecurityAttributes.lpSecurityDescriptor = & t_AdjustedSecurityDescriptor ;
|
|
t_SecurityAttributes.bInheritHandle = FALSE ;
|
|
|
|
t_Status = DuplicateTokenEx (
|
|
|
|
t_ThreadToken,
|
|
DUPLICATE_SAME_ACCESS ,
|
|
& t_SecurityAttributes ,
|
|
( SECURITY_IMPERSONATION_LEVEL ) SecurityIdentification ,
|
|
TokenImpersonation ,
|
|
& t_AdjustedThreadToken
|
|
) ;
|
|
|
|
if ( t_Status == FALSE )
|
|
{
|
|
t_Result = WBEM_E_ACCESS_DENIED ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_CRITICAL_ERROR ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_UNEXPECTED ;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_CRITICAL_ERROR ;
|
|
}
|
|
|
|
delete [] ( BYTE * ) t_ExtraDacl ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_CRITICAL_ERROR ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_CRITICAL_ERROR ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_CRITICAL_ERROR ;
|
|
}
|
|
}
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
HANDLE t_ProcessHandle = OpenProcess (
|
|
|
|
MAXIMUM_ALLOWED ,
|
|
FALSE ,
|
|
a_ProcessIdentifier
|
|
) ;
|
|
|
|
if ( t_ProcessHandle )
|
|
{
|
|
t_Status = DuplicateHandle (
|
|
|
|
GetCurrentProcess () ,
|
|
t_AdjustedThreadToken ,
|
|
t_ProcessHandle ,
|
|
& a_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 ;
|
|
}
|
|
}
|
|
|
|
if ( t_SecurityDescriptor )
|
|
{
|
|
delete [] ( BYTE * ) t_SecurityDescriptor ;
|
|
}
|
|
|
|
if ( t_AdjustedThreadToken )
|
|
{
|
|
CloseHandle ( t_AdjustedThreadToken ) ;
|
|
}
|
|
|
|
CloseHandle ( t_ThreadToken ) ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_ACCESS_DENIED ;
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Common_Globals :: ConstructIdentifyToken_PrvHost (
|
|
|
|
BOOL &a_Revert ,
|
|
DWORD a_ProcessIdentifier ,
|
|
HANDLE &a_IdentifyToken ,
|
|
ACCESS_ALLOWED_ACE *a_Ace ,
|
|
WORD a_AceSize
|
|
)
|
|
{
|
|
HRESULT t_Result = S_OK ;
|
|
|
|
HANDLE t_ThreadToken = NULL ;
|
|
|
|
BOOL t_Status = OpenThreadToken (
|
|
|
|
GetCurrentThread () ,
|
|
MAXIMUM_ALLOWED ,
|
|
TRUE ,
|
|
& t_ThreadToken
|
|
) ;
|
|
|
|
if ( t_Status )
|
|
{
|
|
CoRevertToSelf () ;
|
|
|
|
a_Revert = FALSE ;
|
|
|
|
SECURITY_DESCRIPTOR *t_SecurityDescriptor = NULL ;
|
|
|
|
DWORD t_LengthRequested = 0 ;
|
|
DWORD t_LengthReturned = 0 ;
|
|
|
|
t_Status = GetKernelObjectSecurity (
|
|
|
|
t_ThreadToken ,
|
|
DACL_SECURITY_INFORMATION ,
|
|
& t_SecurityDescriptor ,
|
|
t_LengthRequested ,
|
|
& t_LengthReturned
|
|
) ;
|
|
|
|
if ( ( t_Status == FALSE ) && ( GetLastError () == ERROR_INSUFFICIENT_BUFFER ) )
|
|
{
|
|
t_SecurityDescriptor = ( SECURITY_DESCRIPTOR * ) new BYTE [ t_LengthReturned ] ;
|
|
if ( t_SecurityDescriptor )
|
|
{
|
|
t_LengthRequested = t_LengthReturned ;
|
|
|
|
t_Status = GetKernelObjectSecurity (
|
|
|
|
t_ThreadToken ,
|
|
DACL_SECURITY_INFORMATION ,
|
|
t_SecurityDescriptor ,
|
|
t_LengthRequested ,
|
|
& t_LengthReturned
|
|
) ;
|
|
|
|
if ( t_LengthRequested != t_LengthReturned )
|
|
{
|
|
t_Result = WBEM_E_UNEXPECTED ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_ACCESS_DENIED ;
|
|
}
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
PACL t_ExtraDacl = NULL ;
|
|
|
|
ACL *t_Dacl = NULL ;
|
|
BOOL t_DaclPresent = FALSE ;
|
|
BOOL t_DaclDefaulted = FALSE ;
|
|
|
|
t_Status = GetSecurityDescriptorDacl (
|
|
|
|
t_SecurityDescriptor ,
|
|
& t_DaclPresent ,
|
|
& t_Dacl ,
|
|
& t_DaclDefaulted
|
|
) ;
|
|
|
|
if ( t_Status )
|
|
{
|
|
ACL_SIZE_INFORMATION t_Size ;
|
|
|
|
if ( t_Dacl )
|
|
{
|
|
BOOL t_Status = GetAclInformation (
|
|
|
|
t_Dacl ,
|
|
& t_Size ,
|
|
sizeof ( t_Size ) ,
|
|
AclSizeInformation
|
|
);
|
|
|
|
if ( t_Status )
|
|
{
|
|
DWORD t_ExtraSize = t_Size.AclBytesInUse + t_Size.AclBytesFree + a_AceSize ;
|
|
|
|
t_ExtraDacl = ( PACL ) new BYTE [ t_ExtraSize ] ;
|
|
if ( t_ExtraDacl )
|
|
{
|
|
CopyMemory ( t_ExtraDacl , t_Dacl , t_Size.AclBytesInUse + t_Size.AclBytesFree ) ;
|
|
t_ExtraDacl->AclSize = t_ExtraSize ;
|
|
|
|
BOOL t_Status = :: AddAce ( t_ExtraDacl , ACL_REVISION, t_Size.AceCount , a_Ace , a_AceSize ) ;
|
|
if ( t_Status )
|
|
{
|
|
SECURITY_DESCRIPTOR t_AdjustedSecurityDescriptor ;
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
BOOL t_Status = InitializeSecurityDescriptor ( & t_AdjustedSecurityDescriptor , SECURITY_DESCRIPTOR_REVISION ) ;
|
|
if ( t_Status )
|
|
{
|
|
t_Status = SetSecurityDescriptorDacl (
|
|
|
|
& t_AdjustedSecurityDescriptor ,
|
|
t_DaclPresent ,
|
|
t_ExtraDacl ,
|
|
t_DaclDefaulted
|
|
) ;
|
|
|
|
if ( t_Status )
|
|
{
|
|
SECURITY_ATTRIBUTES t_SecurityAttributes ;
|
|
t_SecurityAttributes.nLength = GetSecurityDescriptorLength ( & t_AdjustedSecurityDescriptor ) ;
|
|
t_SecurityAttributes.lpSecurityDescriptor = & t_AdjustedSecurityDescriptor ;
|
|
t_SecurityAttributes.bInheritHandle = FALSE ;
|
|
|
|
t_Status = DuplicateTokenEx (
|
|
|
|
t_ThreadToken,
|
|
DUPLICATE_SAME_ACCESS ,
|
|
& t_SecurityAttributes ,
|
|
( SECURITY_IMPERSONATION_LEVEL ) SecurityIdentification ,
|
|
TokenImpersonation ,
|
|
& a_IdentifyToken
|
|
) ;
|
|
|
|
if ( t_Status == FALSE )
|
|
{
|
|
t_Result = WBEM_E_ACCESS_DENIED ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_CRITICAL_ERROR ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_UNEXPECTED ;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_CRITICAL_ERROR ;
|
|
}
|
|
|
|
delete [] ( BYTE * ) t_ExtraDacl ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_CRITICAL_ERROR ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_CRITICAL_ERROR ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_CRITICAL_ERROR ;
|
|
}
|
|
}
|
|
|
|
if ( t_SecurityDescriptor )
|
|
{
|
|
delete [] ( BYTE * ) t_SecurityDescriptor ;
|
|
}
|
|
|
|
CloseHandle ( t_ThreadToken ) ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_ACCESS_DENIED ;
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Common_Globals :: SetProxyState_SvcHost (
|
|
|
|
ProxyContainer &a_Container ,
|
|
ULONG a_ProxyIndex ,
|
|
REFIID a_InterfaceId ,
|
|
IUnknown *a_Interface ,
|
|
IUnknown *&a_Proxy ,
|
|
BOOL &a_Revert ,
|
|
DWORD a_ProcessIdentifier ,
|
|
HANDLE &a_IdentifyToken ,
|
|
ACCESS_ALLOWED_ACE *a_Ace ,
|
|
WORD a_AceSize
|
|
)
|
|
{
|
|
a_Revert = FALSE ;
|
|
|
|
HRESULT t_Result = GetProxy ( a_Container , a_ProxyIndex , a_InterfaceId , a_Interface , a_Proxy ) ;
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
t_Result = CoImpersonateClient () ;
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
a_Revert = TRUE ;
|
|
|
|
// At this point, our thread token contains all the privileges that the
|
|
// client has enabled for us; however, those privileges are not enabled.
|
|
// Since we are calling into a proxied provider, we need to enable all
|
|
// these privileges so that they would propagate to the provider
|
|
// =====================================================================
|
|
|
|
HRESULT t_TempResult = EnableAllPrivileges () ;
|
|
|
|
// Get the token's impersonation level
|
|
// ===================================
|
|
|
|
DWORD t_ImpersonationLevel = GetCurrentImpersonationLevel () ;
|
|
|
|
if ( t_ImpersonationLevel == RPC_C_IMP_LEVEL_IMPERSONATE || t_ImpersonationLevel == RPC_C_IMP_LEVEL_DELEGATE )
|
|
{
|
|
a_IdentifyToken = 0 ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = ConstructIdentifyToken_SvcHost (
|
|
|
|
a_Revert ,
|
|
a_ProcessIdentifier ,
|
|
a_IdentifyToken ,
|
|
a_Ace ,
|
|
a_AceSize
|
|
) ;
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
t_Result = SetInterfaceSecurity (
|
|
|
|
a_Proxy ,
|
|
NULL ,
|
|
NULL ,
|
|
NULL ,
|
|
DWORD(RPC_C_AUTHN_LEVEL_DEFAULT),
|
|
RPC_C_IMP_LEVEL_IDENTIFY
|
|
) ;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_ACCESS_DENIED ;
|
|
}
|
|
|
|
if ( FAILED ( t_Result ) )
|
|
{
|
|
RevertProxyState_SvcHost (
|
|
|
|
a_Container ,
|
|
a_ProxyIndex ,
|
|
a_Proxy ,
|
|
a_Revert ,
|
|
a_ProcessIdentifier ,
|
|
a_IdentifyToken
|
|
) ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ( t_Result == WBEM_E_NOT_FOUND )
|
|
{
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_CRITICAL_ERROR ;
|
|
}
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Common_Globals :: RevertProxyState_SvcHost (
|
|
|
|
ProxyContainer &a_Container ,
|
|
ULONG a_ProxyIndex ,
|
|
IUnknown *a_Proxy ,
|
|
BOOL a_Revert ,
|
|
DWORD a_ProcessIdentifier ,
|
|
HANDLE a_IdentifyToken
|
|
)
|
|
{
|
|
HRESULT t_Result = S_OK ;
|
|
|
|
WmiHelper :: EnterCriticalSection ( & a_Container.GetCriticalSection () ) ;
|
|
|
|
WmiStatusCode t_StatusCode = a_Container.Return ( a_Proxy , a_ProxyIndex ) ;
|
|
if ( t_StatusCode == e_StatusCode_Success )
|
|
{
|
|
}
|
|
else
|
|
{
|
|
a_Proxy->Release () ;
|
|
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
|
|
WmiHelper :: LeaveCriticalSection ( & a_Container.GetCriticalSection () ) ;
|
|
|
|
if ( a_Revert )
|
|
{
|
|
t_Result = CoRevertToSelf () ;
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Common_Globals :: SetProxyState_PrvHost (
|
|
|
|
ProxyContainer &a_Container ,
|
|
ULONG a_ProxyIndex ,
|
|
REFIID a_InterfaceId ,
|
|
IUnknown *a_Interface ,
|
|
IUnknown *&a_Proxy ,
|
|
BOOL &a_Revert ,
|
|
DWORD a_ProcessIdentifier ,
|
|
HANDLE &a_IdentifyToken
|
|
)
|
|
{
|
|
a_Revert = FALSE ;
|
|
|
|
HRESULT t_Result = GetProxy ( a_Container , a_ProxyIndex , a_InterfaceId , a_Interface , a_Proxy ) ;
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
t_Result = CoImpersonateClient () ;
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
a_Revert = TRUE ;
|
|
|
|
// At this point, our thread token contains all the privileges that the
|
|
// client has enabled for us; however, those privileges are not enabled.
|
|
// Since we are calling into a proxied provider, we need to enable all
|
|
// these privileges so that they would propagate to the provider
|
|
// =====================================================================
|
|
|
|
HRESULT t_TempResult = EnableAllPrivileges () ;
|
|
|
|
// Get the token's impersonation level
|
|
// ===================================
|
|
|
|
DWORD t_ImpersonationLevel = GetCurrentImpersonationLevel () ;
|
|
|
|
if ( t_ImpersonationLevel == RPC_C_IMP_LEVEL_IMPERSONATE || t_ImpersonationLevel == RPC_C_IMP_LEVEL_DELEGATE )
|
|
{
|
|
a_IdentifyToken = 0 ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = ConstructIdentifyToken_PrvHost (
|
|
|
|
a_Revert ,
|
|
a_ProcessIdentifier ,
|
|
a_IdentifyToken ,
|
|
s_Token_All_Access_System_ACE ,
|
|
s_System_ACESize
|
|
) ;
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
t_Result = SetInterfaceSecurity (
|
|
|
|
a_Proxy ,
|
|
NULL ,
|
|
NULL ,
|
|
NULL ,
|
|
DWORD(RPC_C_AUTHN_LEVEL_DEFAULT),
|
|
RPC_C_IMP_LEVEL_IDENTIFY
|
|
) ;
|
|
}
|
|
}
|
|
|
|
CoRevertToSelf () ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_ACCESS_DENIED ;
|
|
}
|
|
|
|
if ( FAILED ( t_Result ) )
|
|
{
|
|
RevertProxyState_PrvHost (
|
|
|
|
a_Container ,
|
|
a_ProxyIndex ,
|
|
a_Proxy ,
|
|
a_Revert ,
|
|
a_ProcessIdentifier ,
|
|
a_IdentifyToken
|
|
) ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ( t_Result == WBEM_E_NOT_FOUND )
|
|
{
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_CRITICAL_ERROR ;
|
|
}
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Common_Globals :: RevertProxyState_PrvHost (
|
|
|
|
ProxyContainer &a_Container ,
|
|
ULONG a_ProxyIndex ,
|
|
IUnknown *a_Proxy ,
|
|
BOOL a_Revert ,
|
|
DWORD a_ProcessIdentifier ,
|
|
HANDLE a_IdentifyToken
|
|
)
|
|
{
|
|
HRESULT t_Result = S_OK ;
|
|
|
|
WmiHelper :: EnterCriticalSection ( & a_Container.GetCriticalSection () ) ;
|
|
|
|
WmiStatusCode t_StatusCode = a_Container.Return ( a_Proxy , a_ProxyIndex ) ;
|
|
if ( t_StatusCode == e_StatusCode_Success )
|
|
{
|
|
}
|
|
else
|
|
{
|
|
a_Proxy->Release () ;
|
|
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
|
|
WmiHelper :: LeaveCriticalSection ( & a_Container.GetCriticalSection () ) ;
|
|
|
|
if ( a_Revert )
|
|
{
|
|
t_Result = CoRevertToSelf () ;
|
|
}
|
|
|
|
CloseHandle ( a_IdentifyToken ) ;
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Common_Globals :: SetProxyState_SvcHost (
|
|
|
|
REFIID a_InterfaceId ,
|
|
IUnknown *a_Interface ,
|
|
IUnknown *&a_Proxy ,
|
|
BOOL &a_Revert ,
|
|
DWORD a_ProcessIdentifier ,
|
|
HANDLE &a_IdentifyToken ,
|
|
ACCESS_ALLOWED_ACE *a_Ace ,
|
|
WORD a_AceSize
|
|
)
|
|
{
|
|
a_Revert = FALSE ;
|
|
|
|
HRESULT t_Result = GetProxy ( a_InterfaceId , a_Interface , a_Proxy ) ;
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
t_Result = CoImpersonateClient () ;
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
a_Revert = TRUE ;
|
|
|
|
// At this point, our thread token contains all the privileges that the
|
|
// client has enabled for us; however, those privileges are not enabled.
|
|
// Since we are calling into a proxied provider, we need to enable all
|
|
// these privileges so that they would propagate to the provider
|
|
// =====================================================================
|
|
|
|
HRESULT t_TempResult = EnableAllPrivileges () ;
|
|
|
|
// Get the token's impersonation level
|
|
// ===================================
|
|
|
|
DWORD t_ImpersonationLevel = GetCurrentImpersonationLevel () ;
|
|
|
|
if ( t_ImpersonationLevel == RPC_C_IMP_LEVEL_IMPERSONATE || t_ImpersonationLevel == RPC_C_IMP_LEVEL_DELEGATE )
|
|
{
|
|
a_IdentifyToken = 0 ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = ConstructIdentifyToken_SvcHost (
|
|
|
|
a_Revert ,
|
|
a_ProcessIdentifier ,
|
|
a_IdentifyToken ,
|
|
a_Ace ,
|
|
a_AceSize
|
|
) ;
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
t_Result = SetInterfaceSecurity (
|
|
|
|
a_Proxy ,
|
|
NULL ,
|
|
NULL ,
|
|
NULL ,
|
|
DWORD(RPC_C_AUTHN_LEVEL_DEFAULT),
|
|
RPC_C_IMP_LEVEL_IDENTIFY
|
|
) ;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_ACCESS_DENIED ;
|
|
}
|
|
|
|
if ( FAILED ( t_Result ) )
|
|
{
|
|
RevertProxyState_SvcHost (
|
|
|
|
a_Proxy ,
|
|
a_Revert ,
|
|
a_ProcessIdentifier ,
|
|
a_IdentifyToken
|
|
) ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ( t_Result == WBEM_E_NOT_FOUND )
|
|
{
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_CRITICAL_ERROR ;
|
|
}
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Common_Globals :: RevertProxyState_SvcHost (
|
|
|
|
IUnknown *a_Proxy ,
|
|
BOOL a_Revert ,
|
|
DWORD a_ProcessIdentifier ,
|
|
HANDLE a_IdentifyToken
|
|
)
|
|
{
|
|
HRESULT t_Result = S_OK ;
|
|
|
|
a_Proxy->Release () ;
|
|
|
|
if ( a_Revert )
|
|
{
|
|
t_Result = CoRevertToSelf () ;
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Common_Globals :: SetProxyState_PrvHost (
|
|
|
|
REFIID a_InterfaceId ,
|
|
IUnknown *a_Interface ,
|
|
IUnknown *&a_Proxy ,
|
|
BOOL &a_Revert ,
|
|
DWORD a_ProcessIdentifier ,
|
|
HANDLE &a_IdentifyToken
|
|
)
|
|
{
|
|
a_Revert = FALSE ;
|
|
|
|
HRESULT t_Result = GetProxy ( a_InterfaceId , a_Interface , a_Proxy ) ;
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
t_Result = CoImpersonateClient () ;
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
a_Revert = TRUE ;
|
|
|
|
// At this point, our thread token contains all the privileges that the
|
|
// client has enabled for us; however, those privileges are not enabled.
|
|
// Since we are calling into a proxied provider, we need to enable all
|
|
// these privileges so that they would propagate to the provider
|
|
// =====================================================================
|
|
|
|
HRESULT t_TempResult = EnableAllPrivileges () ;
|
|
|
|
// Get the token's impersonation level
|
|
// ===================================
|
|
|
|
DWORD t_ImpersonationLevel = GetCurrentImpersonationLevel () ;
|
|
|
|
if ( t_ImpersonationLevel == RPC_C_IMP_LEVEL_IMPERSONATE || t_ImpersonationLevel == RPC_C_IMP_LEVEL_DELEGATE )
|
|
{
|
|
a_IdentifyToken = 0 ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = ConstructIdentifyToken_PrvHost (
|
|
|
|
a_Revert ,
|
|
a_ProcessIdentifier ,
|
|
a_IdentifyToken ,
|
|
s_Token_All_Access_System_ACE ,
|
|
s_System_ACESize
|
|
) ;
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
t_Result = SetInterfaceSecurity (
|
|
|
|
a_Proxy ,
|
|
NULL ,
|
|
NULL ,
|
|
NULL ,
|
|
DWORD(RPC_C_AUTHN_LEVEL_DEFAULT),
|
|
RPC_C_IMP_LEVEL_IDENTIFY
|
|
) ;
|
|
}
|
|
}
|
|
|
|
CoRevertToSelf () ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_ACCESS_DENIED ;
|
|
}
|
|
|
|
if ( FAILED ( t_Result ) )
|
|
{
|
|
RevertProxyState_PrvHost (
|
|
|
|
a_Proxy ,
|
|
a_Revert ,
|
|
a_ProcessIdentifier ,
|
|
a_IdentifyToken
|
|
) ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ( t_Result == WBEM_E_NOT_FOUND )
|
|
{
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_CRITICAL_ERROR ;
|
|
}
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Common_Globals :: RevertProxyState_PrvHost (
|
|
|
|
IUnknown *a_Proxy ,
|
|
BOOL a_Revert ,
|
|
DWORD a_ProcessIdentifier ,
|
|
HANDLE a_IdentifyToken
|
|
)
|
|
{
|
|
HRESULT t_Result = S_OK ;
|
|
|
|
a_Proxy->Release () ;
|
|
|
|
if ( a_Revert )
|
|
{
|
|
t_Result = CoRevertToSelf () ;
|
|
}
|
|
|
|
CloseHandle ( a_IdentifyToken ) ;
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Common_Globals :: SetProxyState (
|
|
|
|
REFIID a_InterfaceId ,
|
|
IUnknown *a_Interface ,
|
|
IUnknown *&a_Proxy ,
|
|
BOOL &a_Revert
|
|
)
|
|
{
|
|
a_Revert = FALSE ;
|
|
|
|
HRESULT t_Result = GetProxy ( a_InterfaceId , a_Interface , a_Proxy ) ;
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
t_Result = CoImpersonateClient () ;
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
a_Revert = TRUE ;
|
|
|
|
// At this point, our thread token contains all the privileges that the
|
|
// client has enabled for us; however, those privileges are not enabled.
|
|
// Since we are calling into a proxied provider, we need to enable all
|
|
// these privileges so that they would propagate to the provider
|
|
// =====================================================================
|
|
|
|
HRESULT t_TempResult = EnableAllPrivileges () ;
|
|
|
|
// Get the token's impersonation level
|
|
// ===================================
|
|
|
|
DWORD t_ImpersonationLevel = GetCurrentImpersonationLevel () ;
|
|
|
|
if ( t_ImpersonationLevel == RPC_C_IMP_LEVEL_IMPERSONATE || t_ImpersonationLevel == RPC_C_IMP_LEVEL_DELEGATE )
|
|
{
|
|
}
|
|
else
|
|
{
|
|
t_Result = SetInterfaceSecurity (
|
|
|
|
a_Proxy ,
|
|
NULL ,
|
|
NULL ,
|
|
NULL ,
|
|
DWORD(RPC_C_AUTHN_LEVEL_DEFAULT),
|
|
RPC_C_IMP_LEVEL_IDENTIFY
|
|
) ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_ACCESS_DENIED ;
|
|
}
|
|
|
|
if ( FAILED ( t_Result ) )
|
|
{
|
|
RevertProxyState (
|
|
|
|
a_Proxy ,
|
|
a_Revert
|
|
) ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ( t_Result == WBEM_E_NOT_FOUND )
|
|
{
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_CRITICAL_ERROR ;
|
|
}
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Common_Globals :: SetProxyState_NoImpersonation (
|
|
|
|
REFIID a_InterfaceId ,
|
|
IUnknown *a_Interface ,
|
|
IUnknown *&a_Proxy ,
|
|
BOOL &a_Revert
|
|
)
|
|
{
|
|
a_Revert = FALSE ;
|
|
|
|
HRESULT t_Result = GetProxy ( a_InterfaceId , a_Interface , a_Proxy ) ;
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
t_Result = SetInterfaceSecurity (
|
|
|
|
a_Proxy ,
|
|
NULL ,
|
|
NULL ,
|
|
NULL ,
|
|
DWORD(RPC_C_AUTHN_LEVEL_DEFAULT),
|
|
RPC_C_IMP_LEVEL_IDENTIFY
|
|
) ;
|
|
|
|
if ( FAILED ( t_Result ) )
|
|
{
|
|
RevertProxyState (
|
|
|
|
a_Proxy ,
|
|
a_Revert
|
|
) ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ( t_Result == WBEM_E_NOT_FOUND )
|
|
{
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_CRITICAL_ERROR ;
|
|
}
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Common_Globals :: RevertProxyState ( IUnknown *a_Proxy , BOOL a_Revert )
|
|
{
|
|
HRESULT t_Result = S_OK ;
|
|
|
|
if ( a_Revert )
|
|
{
|
|
t_Result = CoRevertToSelf () ;
|
|
}
|
|
|
|
a_Proxy->Release () ;
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Common_Globals :: Load_DWORD ( HKEY a_Key , LPCWSTR a_Name , DWORD &a_Value )
|
|
{
|
|
HRESULT t_Result = S_OK ;
|
|
|
|
DWORD t_ValueType = REG_DWORD ;
|
|
DWORD t_Data = 0 ;
|
|
DWORD t_DataSize = sizeof ( t_ValueType ) ;
|
|
|
|
LONG t_RegResult = RegQueryValueEx (
|
|
|
|
a_Key ,
|
|
a_Name ,
|
|
0 ,
|
|
& t_ValueType ,
|
|
LPBYTE ( & t_Data ) ,
|
|
& t_DataSize
|
|
) ;
|
|
|
|
if ( ( t_RegResult == ERROR_SUCCESS ) && ( t_ValueType == REG_DWORD ) )
|
|
{
|
|
a_Value = t_Data ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = ERROR_FILE_NOT_FOUND ;
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Common_Globals :: Load_String ( HKEY a_Key , LPCWSTR a_Name , BSTR &a_Value )
|
|
{
|
|
HRESULT t_Result = S_OK ;
|
|
|
|
DWORD t_ValueType = REG_SZ ;
|
|
wchar_t *t_Data = NULL ;
|
|
DWORD t_DataSize = 0 ;
|
|
|
|
LONG t_RegResult = RegQueryValueEx (
|
|
|
|
a_Key ,
|
|
a_Name ,
|
|
0 ,
|
|
& t_ValueType ,
|
|
NULL ,
|
|
& t_DataSize
|
|
) ;
|
|
|
|
if ( ( t_RegResult == ERROR_SUCCESS ) && ( t_ValueType == REG_SZ ) )
|
|
{
|
|
t_Data = new wchar_t [ t_DataSize / sizeof ( wchar_t ) ] ;
|
|
if ( t_Data )
|
|
{
|
|
t_RegResult = RegQueryValueEx (
|
|
|
|
a_Key ,
|
|
a_Name ,
|
|
0 ,
|
|
& t_ValueType ,
|
|
LPBYTE ( t_Data ) ,
|
|
& t_DataSize
|
|
) ;
|
|
|
|
if ( t_RegResult == ERROR_SUCCESS )
|
|
{
|
|
a_Value = SysAllocString ( t_Data ) ;
|
|
if ( a_Value == NULL )
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
|
|
delete [] t_Data ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
DWORD t_LastError = GetLastError () ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = ERROR_FILE_NOT_FOUND ;
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Common_Globals :: Load_ByteArray ( HKEY a_Key , LPCWSTR a_Name , BYTE *&a_Value , DWORD &a_ValueLength )
|
|
{
|
|
HRESULT t_Result = S_OK ;
|
|
|
|
DWORD t_ValueType = REG_BINARY ;
|
|
BYTE *t_Data = NULL ;
|
|
DWORD t_DataSize = 0 ;
|
|
|
|
LONG t_RegResult = RegQueryValueEx (
|
|
|
|
a_Key ,
|
|
a_Name ,
|
|
0 ,
|
|
& t_ValueType ,
|
|
NULL ,
|
|
& t_DataSize
|
|
) ;
|
|
|
|
if ( ( t_RegResult == ERROR_SUCCESS ) && ( t_ValueType == REG_BINARY ) )
|
|
{
|
|
t_Data = new BYTE [ t_DataSize ] ;
|
|
if ( t_Data )
|
|
{
|
|
t_RegResult = RegQueryValueEx (
|
|
|
|
a_Key ,
|
|
a_Name ,
|
|
0 ,
|
|
& t_ValueType ,
|
|
LPBYTE ( t_Data ) ,
|
|
& t_DataSize
|
|
) ;
|
|
|
|
if ( t_RegResult == ERROR_SUCCESS )
|
|
{
|
|
a_Value = t_Data ;
|
|
a_ValueLength = t_DataSize ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
DWORD t_LastError = GetLastError () ;
|
|
_DBG_ASSERT( FALSE ) ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = ERROR_FILE_NOT_FOUND ;
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Common_Globals :: Save_DWORD ( HKEY a_Key , LPCWSTR a_Name , DWORD a_Value )
|
|
{
|
|
HRESULT t_Result = S_OK ;
|
|
|
|
DWORD t_ValueType = REG_DWORD ;
|
|
DWORD t_DataSize = sizeof ( t_ValueType ) ;
|
|
|
|
LONG t_RegResult = RegSetValueEx (
|
|
|
|
a_Key ,
|
|
a_Name ,
|
|
0 ,
|
|
t_ValueType ,
|
|
LPBYTE ( & a_Value ) ,
|
|
t_DataSize
|
|
) ;
|
|
|
|
if ( t_RegResult != ERROR_SUCCESS )
|
|
{
|
|
t_Result = WBEM_E_INVALID_PROVIDER_REGISTRATION ;
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Common_Globals :: Save_String ( HKEY a_Key , LPCWSTR a_Name , BSTR a_Value )
|
|
{
|
|
HRESULT t_Result = S_OK ;
|
|
|
|
DWORD t_ValueType = REG_SZ ;
|
|
DWORD t_DataSize = wcslen ( a_Value ) + 1 ;
|
|
|
|
LONG t_RegResult = RegSetValueEx (
|
|
|
|
a_Key ,
|
|
a_Name ,
|
|
0 ,
|
|
t_ValueType ,
|
|
LPBYTE ( a_Value ) ,
|
|
t_DataSize * sizeof ( wchar_t )
|
|
) ;
|
|
|
|
if ( t_RegResult != ERROR_SUCCESS )
|
|
{
|
|
t_Result = WBEM_E_INVALID_PROVIDER_REGISTRATION ;
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Common_Globals :: Save_ByteArray ( HKEY a_Key , LPCWSTR a_Name , BYTE *a_Value , DWORD a_ValueLength )
|
|
{
|
|
HRESULT t_Result = S_OK ;
|
|
|
|
DWORD t_ValueType = REG_BINARY ;
|
|
|
|
LONG t_RegResult = RegSetValueEx (
|
|
|
|
a_Key ,
|
|
a_Name ,
|
|
0 ,
|
|
t_ValueType ,
|
|
LPBYTE ( a_Value ) ,
|
|
a_ValueLength
|
|
) ;
|
|
|
|
if ( t_RegResult != ERROR_SUCCESS )
|
|
{
|
|
t_Result = WBEM_E_INVALID_PROVIDER_REGISTRATION ;
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Common_Globals :: UnMarshalRegistration (
|
|
|
|
IUnknown **a_Unknown ,
|
|
BYTE *a_MarshaledProxy ,
|
|
DWORD a_MarshaledProxyLength
|
|
)
|
|
{
|
|
HRESULT t_Result = S_OK ;
|
|
|
|
IStream *t_Stream = NULL ;
|
|
|
|
HGLOBAL t_Global = GlobalAlloc (
|
|
|
|
GHND ,
|
|
a_MarshaledProxyLength
|
|
) ;
|
|
|
|
if ( t_Global )
|
|
{
|
|
void *t_Memory = GlobalLock ( t_Global ) ;
|
|
|
|
CopyMemory ( t_Memory , a_MarshaledProxy , a_MarshaledProxyLength ) ;
|
|
|
|
GlobalUnlock ( t_Global ) ;
|
|
|
|
t_Result = CreateStreamOnHGlobal (
|
|
|
|
t_Global ,
|
|
TRUE ,
|
|
& t_Stream
|
|
) ;
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
t_Result = CoUnmarshalInterface (
|
|
|
|
t_Stream ,
|
|
IID_IUnknown ,
|
|
( void ** ) a_Unknown
|
|
) ;
|
|
|
|
t_Stream->Release () ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Common_Globals :: ReleaseRegistration (
|
|
|
|
BYTE *a_MarshaledProxy ,
|
|
DWORD a_MarshaledProxyLength
|
|
)
|
|
{
|
|
HRESULT t_Result = S_OK ;
|
|
|
|
IStream *t_Stream = NULL ;
|
|
|
|
HGLOBAL t_Global = GlobalAlloc (
|
|
|
|
GHND ,
|
|
a_MarshaledProxyLength
|
|
) ;
|
|
|
|
if ( t_Global )
|
|
{
|
|
void *t_Memory = GlobalLock ( t_Global ) ;
|
|
|
|
CopyMemory ( t_Memory , a_MarshaledProxy , a_MarshaledProxyLength ) ;
|
|
|
|
GlobalUnlock ( t_Global ) ;
|
|
|
|
t_Result = CreateStreamOnHGlobal (
|
|
|
|
t_Global ,
|
|
TRUE ,
|
|
& t_Stream
|
|
) ;
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
t_Result = CoReleaseMarshalData (
|
|
|
|
t_Stream
|
|
) ;
|
|
|
|
t_Stream->Release () ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Common_Globals :: MarshalRegistration (
|
|
|
|
IUnknown *a_Unknown ,
|
|
BYTE *&a_MarshaledProxy ,
|
|
DWORD &a_MarshaledProxyLength
|
|
)
|
|
{
|
|
HRESULT t_Result = S_OK ;
|
|
|
|
t_Result = CoGetMarshalSizeMax (
|
|
|
|
& a_MarshaledProxyLength ,
|
|
IID_IUnknown ,
|
|
a_Unknown ,
|
|
MSHCTX_LOCAL ,
|
|
NULL ,
|
|
MSHLFLAGS_TABLESTRONG
|
|
) ;
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
IStream *t_Stream = NULL ;
|
|
|
|
HGLOBAL t_Global = GlobalAlloc (
|
|
|
|
GHND ,
|
|
a_MarshaledProxyLength
|
|
) ;
|
|
|
|
if ( t_Global )
|
|
{
|
|
t_Result = CreateStreamOnHGlobal (
|
|
|
|
t_Global ,
|
|
TRUE ,
|
|
& t_Stream
|
|
) ;
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
|
|
t_Result = CoMarshalInterface (
|
|
|
|
t_Stream ,
|
|
IID_IUnknown ,
|
|
a_Unknown ,
|
|
MSHCTX_LOCAL ,
|
|
NULL ,
|
|
MSHLFLAGS_TABLESTRONG
|
|
) ;
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
a_MarshaledProxy = new BYTE [ a_MarshaledProxyLength ] ;
|
|
if ( a_MarshaledProxy )
|
|
{
|
|
void *t_Memory = GlobalLock ( t_Global ) ;
|
|
|
|
CopyMemory ( a_MarshaledProxy , t_Memory , a_MarshaledProxyLength ) ;
|
|
|
|
GlobalUnlock ( t_Global ) ;
|
|
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
}
|
|
t_Stream->Release();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Common_Globals :: IsDependantCall ( IWbemContext *a_ParentContext , IWbemContext *a_ChildContext , BOOL &a_DependantCall )
|
|
{
|
|
HRESULT t_Result = S_OK ;
|
|
|
|
if ( a_ParentContext )
|
|
{
|
|
if ( a_ChildContext )
|
|
{
|
|
IWbemCausalityAccess *t_ParentCausality = NULL ;
|
|
t_Result = a_ParentContext->QueryInterface ( IID_IWbemCausalityAccess , ( void ** ) & t_ParentCausality ) ;
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
IWbemCausalityAccess *t_ChildCausality = NULL ;
|
|
t_Result = a_ChildContext->QueryInterface ( IID_IWbemCausalityAccess , ( void ** ) & t_ChildCausality ) ;
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
REQUESTID t_ParentId ;
|
|
|
|
t_Result = t_ParentCausality->GetRequestId ( & t_ParentId ) ;
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
t_Result = t_ChildCausality->IsChildOf ( t_ParentId ) ;
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
a_DependantCall = ( t_Result == S_FALSE ) ? FALSE : TRUE ;
|
|
t_Result = S_OK;
|
|
}
|
|
}
|
|
|
|
t_ChildCausality->Release () ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_UNEXPECTED ;
|
|
}
|
|
|
|
t_ParentCausality->Release () ;
|
|
}
|
|
}
|
|
}
|
|
|
|
_DBG_ASSERT( SUCCEEDED(t_Result));
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Common_Globals :: Check_SecurityDescriptor_CallIdentity (
|
|
|
|
SECURITY_DESCRIPTOR *a_SecurityDescriptor ,
|
|
DWORD a_Access ,
|
|
GENERIC_MAPPING *a_Mapping,
|
|
SECURITY_DESCRIPTOR *defaultSD
|
|
)
|
|
{
|
|
HRESULT t_Result = S_OK ;
|
|
|
|
SECURITY_DESCRIPTOR *t_SecurityDescriptor = a_SecurityDescriptor ? a_SecurityDescriptor : defaultSD ;
|
|
|
|
HANDLE t_Token = NULL ;
|
|
|
|
BOOL t_Status = OpenThreadToken (
|
|
|
|
GetCurrentThread () ,
|
|
TOKEN_QUERY ,
|
|
TRUE ,
|
|
& t_Token
|
|
) ;
|
|
|
|
DWORD t_LastError = GetLastError () ;
|
|
if ( ! t_Status && ( t_LastError == ERROR_NO_IMPERSONATION_TOKEN || t_LastError == ERROR_NO_TOKEN ) )
|
|
{
|
|
HANDLE t_ProcessToken = NULL ;
|
|
t_Status = OpenProcessToken (
|
|
|
|
GetCurrentProcess () ,
|
|
TOKEN_QUERY | TOKEN_DUPLICATE ,
|
|
& t_ProcessToken
|
|
) ;
|
|
|
|
if ( t_Status )
|
|
{
|
|
t_Status = ImpersonateLoggedOnUser ( t_ProcessToken ) ;
|
|
if ( t_Status )
|
|
{
|
|
BOOL t_Status = OpenThreadToken (
|
|
|
|
GetCurrentThread () ,
|
|
TOKEN_QUERY ,
|
|
TRUE ,
|
|
& t_Token
|
|
) ;
|
|
|
|
if ( ! t_Status )
|
|
{
|
|
DWORD t_LastError = GetLastError () ;
|
|
|
|
t_Result = WBEM_E_ACCESS_DENIED ;
|
|
}
|
|
|
|
RevertToSelf () ;
|
|
}
|
|
else
|
|
{
|
|
DWORD t_LastError = GetLastError () ;
|
|
|
|
t_Result = WBEM_E_ACCESS_DENIED ;
|
|
}
|
|
|
|
CloseHandle ( t_ProcessToken ) ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_ACCESS_DENIED ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ( ! t_Status )
|
|
{
|
|
t_Result = WBEM_E_ACCESS_DENIED ;
|
|
}
|
|
}
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
DWORD t_Access = 0 ;
|
|
BOOL t_AccessStatus = FALSE ;
|
|
PRIVILEGE_SET *t_PrivilegeSet = NULL ;
|
|
DWORD t_PrivilegeSetSize = 0 ;
|
|
|
|
MapGenericMask (
|
|
|
|
& a_Access ,
|
|
a_Mapping
|
|
) ;
|
|
|
|
t_Status = AccessCheck (
|
|
|
|
t_SecurityDescriptor ,
|
|
t_Token,
|
|
a_Access ,
|
|
a_Mapping ,
|
|
NULL ,
|
|
& t_PrivilegeSetSize ,
|
|
& t_Access ,
|
|
& t_AccessStatus
|
|
) ;
|
|
|
|
if ( t_Status && t_AccessStatus )
|
|
{
|
|
}
|
|
else
|
|
{
|
|
DWORD t_LastError = GetLastError () ;
|
|
if ( t_LastError == ERROR_INSUFFICIENT_BUFFER )
|
|
{
|
|
t_PrivilegeSet = ( PRIVILEGE_SET * ) new BYTE [ t_PrivilegeSetSize ] ;
|
|
if ( t_PrivilegeSet )
|
|
{
|
|
t_Status = AccessCheck (
|
|
|
|
t_SecurityDescriptor ,
|
|
t_Token,
|
|
a_Access ,
|
|
a_Mapping ,
|
|
t_PrivilegeSet ,
|
|
& t_PrivilegeSetSize ,
|
|
& t_Access ,
|
|
& t_AccessStatus
|
|
) ;
|
|
|
|
if ( t_Status && t_AccessStatus )
|
|
{
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_ACCESS_DENIED ;
|
|
}
|
|
|
|
delete [] ( BYTE * ) t_PrivilegeSet ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_ACCESS_DENIED;
|
|
}
|
|
}
|
|
|
|
CloseHandle ( t_Token ) ;
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Common_Globals :: AdjustSecurityDescriptorWithSid (
|
|
|
|
SID *a_OwnerSid ,
|
|
SID *a_GroupSid ,
|
|
DWORD a_Access ,
|
|
SECURITY_DESCRIPTOR *&a_SecurityDescriptor ,
|
|
SECURITY_DESCRIPTOR *&a_AlteredSecurityDescriptor
|
|
)
|
|
{
|
|
HRESULT t_Result = S_OK ;
|
|
|
|
SECURITY_DESCRIPTOR t_CreatedSecurityDescriptor ;
|
|
SECURITY_DESCRIPTOR *t_SecurityDescriptor = NULL ;
|
|
|
|
PACL t_Dacl = NULL ;
|
|
PACL t_Sacl = NULL ;
|
|
PSID t_Owner = NULL ;
|
|
PSID t_PrimaryGroup = NULL ;
|
|
SECURITY_DESCRIPTOR *t_AlteredSecurityDescriptor = NULL ;
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
if ( a_SecurityDescriptor )
|
|
{
|
|
DWORD t_AlteredSecurityDescriptorSize = sizeof ( SECURITY_DESCRIPTOR ) ;
|
|
DWORD t_DaclSize = 0 ;
|
|
DWORD t_SaclSize = 0 ;
|
|
DWORD t_OwnerSize = 0 ;
|
|
DWORD t_PrimaryGroupSize = 0 ;
|
|
|
|
BOOL t_Status = MakeAbsoluteSD (
|
|
|
|
a_SecurityDescriptor ,
|
|
t_AlteredSecurityDescriptor ,
|
|
& t_AlteredSecurityDescriptorSize ,
|
|
t_Dacl,
|
|
& t_DaclSize,
|
|
t_Sacl,
|
|
& t_SaclSize,
|
|
t_Owner,
|
|
& t_OwnerSize,
|
|
t_PrimaryGroup,
|
|
& t_PrimaryGroupSize
|
|
) ;
|
|
|
|
if ( ( t_Status == FALSE ) && GetLastError () == ERROR_INSUFFICIENT_BUFFER )
|
|
{
|
|
DWORD t_SidLength = GetLengthSid ( a_OwnerSid ) ;
|
|
DWORD t_ExtraSize = sizeof(ACCESS_ALLOWED_ACE) + (WORD) ( t_SidLength - sizeof(DWORD) ) ;
|
|
|
|
t_Dacl = ( PACL ) new BYTE [ t_DaclSize + t_ExtraSize ] ;
|
|
t_Sacl = ( PACL ) new BYTE [ t_SaclSize ] ;
|
|
t_Owner = ( PSID ) new BYTE [ t_OwnerSize ] ;
|
|
t_PrimaryGroup = ( PSID ) new BYTE [ t_PrimaryGroupSize ] ;
|
|
|
|
t_AlteredSecurityDescriptor = ( SECURITY_DESCRIPTOR * ) new BYTE [ t_AlteredSecurityDescriptorSize ] ;
|
|
|
|
if ( t_AlteredSecurityDescriptor && t_Dacl && t_Sacl && t_Owner && t_PrimaryGroup )
|
|
{
|
|
BOOL t_Status = InitializeSecurityDescriptor ( t_AlteredSecurityDescriptor , SECURITY_DESCRIPTOR_REVISION ) ;
|
|
if ( t_Status )
|
|
{
|
|
t_Status = MakeAbsoluteSD (
|
|
|
|
a_SecurityDescriptor ,
|
|
t_AlteredSecurityDescriptor ,
|
|
& t_AlteredSecurityDescriptorSize ,
|
|
t_Dacl,
|
|
& t_DaclSize,
|
|
t_Sacl,
|
|
& t_SaclSize,
|
|
t_Owner,
|
|
& t_OwnerSize,
|
|
t_PrimaryGroup,
|
|
& t_PrimaryGroupSize
|
|
) ;
|
|
|
|
if ( t_Status )
|
|
{
|
|
t_SecurityDescriptor = t_AlteredSecurityDescriptor ;
|
|
|
|
if ( t_OwnerSize == 0 )
|
|
{
|
|
t_Status = SetSecurityDescriptorOwner (
|
|
|
|
t_SecurityDescriptor ,
|
|
a_OwnerSid ,
|
|
FALSE
|
|
) ;
|
|
|
|
if ( ! t_Status )
|
|
{
|
|
t_Result = WBEM_E_CRITICAL_ERROR ;
|
|
}
|
|
}
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
if ( t_PrimaryGroupSize == 0 )
|
|
{
|
|
t_Status = SetSecurityDescriptorGroup (
|
|
|
|
t_SecurityDescriptor ,
|
|
a_GroupSid ,
|
|
FALSE
|
|
) ;
|
|
|
|
if ( ! t_Status )
|
|
{
|
|
t_Result = WBEM_E_CRITICAL_ERROR ;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_CRITICAL_ERROR ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_CRITICAL_ERROR ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_CRITICAL_ERROR ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
BOOL t_Status = InitializeSecurityDescriptor ( & t_CreatedSecurityDescriptor , SECURITY_DESCRIPTOR_REVISION ) ;
|
|
if ( t_Status )
|
|
{
|
|
t_Status = SetSecurityDescriptorOwner (
|
|
|
|
& t_CreatedSecurityDescriptor ,
|
|
a_OwnerSid ,
|
|
FALSE
|
|
) ;
|
|
|
|
if ( ! t_Status )
|
|
{
|
|
t_Result = WBEM_E_CRITICAL_ERROR ;
|
|
}
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
t_Status = SetSecurityDescriptorGroup (
|
|
|
|
& t_CreatedSecurityDescriptor ,
|
|
a_GroupSid ,
|
|
FALSE
|
|
) ;
|
|
|
|
if ( ! t_Status )
|
|
{
|
|
t_Result = WBEM_E_CRITICAL_ERROR ;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_CRITICAL_ERROR ;
|
|
}
|
|
|
|
t_SecurityDescriptor = & t_CreatedSecurityDescriptor ;
|
|
}
|
|
}
|
|
|
|
|
|
SID_IDENTIFIER_AUTHORITY t_NtAuthoritySid = SECURITY_NT_AUTHORITY ;
|
|
DWORD t_SidLength = GetLengthSid ( a_OwnerSid ) ;
|
|
|
|
PACL t_ExtraDacl = NULL ;
|
|
ACCESS_ALLOWED_ACE *t_Ace = NULL ;
|
|
DWORD t_AceSize = 0 ;
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
t_AceSize = sizeof(ACCESS_ALLOWED_ACE) + (WORD) ( t_SidLength - sizeof(DWORD) ) ;
|
|
t_Ace = (ACCESS_ALLOWED_ACE*) new BYTE [ t_AceSize ] ;
|
|
if ( t_Ace )
|
|
{
|
|
CopySid ( t_SidLength, (PSID) & t_Ace->SidStart, a_OwnerSid ) ;
|
|
t_Ace->Mask = a_Access ;
|
|
t_Ace->Header.AceType = 0 ;
|
|
t_Ace->Header.AceFlags = CONTAINER_INHERIT_ACE | OBJECT_INHERIT_ACE ;
|
|
t_Ace->Header.AceSize = t_AceSize ;
|
|
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
}
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
ACL_SIZE_INFORMATION t_Size ;
|
|
|
|
if ( t_Dacl )
|
|
{
|
|
BOOL t_Status = GetAclInformation (
|
|
|
|
t_Dacl ,
|
|
& t_Size ,
|
|
sizeof ( t_Size ) ,
|
|
AclSizeInformation
|
|
);
|
|
|
|
if ( t_Status )
|
|
{
|
|
DWORD t_ExtraSize = t_Size.AclBytesInUse + t_Size.AclBytesFree + ( sizeof(ACCESS_ALLOWED_ACE) + (WORD) ( t_SidLength - sizeof(DWORD) ) ) ;
|
|
t_ExtraSize = t_ExtraSize + s_LocalService_ACESize + s_NetworkService_ACESize + s_System_ACESize + s_LocalAdmins_ACESize ;
|
|
|
|
t_ExtraDacl = ( PACL ) new BYTE [ t_ExtraSize ] ;
|
|
if ( t_ExtraDacl )
|
|
{
|
|
CopyMemory ( t_ExtraDacl , t_Dacl , t_Size.AclBytesInUse + t_Size.AclBytesFree ) ;
|
|
t_ExtraDacl->AclSize = t_ExtraSize ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_CRITICAL_ERROR ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
DWORD t_SidLength = GetLengthSid ( a_OwnerSid ) ;
|
|
DWORD t_ExtraSize = sizeof ( ACL ) + ( sizeof(ACCESS_ALLOWED_ACE) + (WORD) ( t_SidLength - sizeof(DWORD) ) ) ;
|
|
t_ExtraSize = t_ExtraSize + s_LocalService_ACESize + s_NetworkService_ACESize + s_System_ACESize + s_LocalAdmins_ACESize ;
|
|
|
|
t_ExtraDacl = ( PACL ) new BYTE [ t_ExtraSize ] ;
|
|
if ( t_ExtraDacl )
|
|
{
|
|
BOOL t_Status = InitializeAcl (
|
|
|
|
t_ExtraDacl ,
|
|
t_ExtraSize ,
|
|
ACL_REVISION
|
|
) ;
|
|
|
|
if ( t_Status )
|
|
{
|
|
BOOL t_Status = GetAclInformation (
|
|
|
|
t_ExtraDacl ,
|
|
& t_Size ,
|
|
sizeof ( t_Size ) ,
|
|
AclSizeInformation
|
|
);
|
|
|
|
if ( ! t_Status )
|
|
{
|
|
t_Result = WBEM_E_CRITICAL_ERROR ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_CRITICAL_ERROR ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
}
|
|
|
|
DWORD t_AceIndex = 0 ;
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
BOOL t_Status = :: AddAce ( t_ExtraDacl , ACL_REVISION, t_Size.AceCount , t_Ace , t_AceSize ) ;
|
|
if ( t_Status )
|
|
{
|
|
t_AceIndex ++ ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_CRITICAL_ERROR ;
|
|
}
|
|
}
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
if ( s_System_ACESize && :: AddAce ( t_ExtraDacl , ACL_REVISION , t_AceIndex , s_Provider_System_ACE , s_System_ACESize ) )
|
|
{
|
|
t_AceIndex ++ ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_CRITICAL_ERROR ;
|
|
}
|
|
}
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
if ( s_LocalService_ACESize && :: AddAce ( t_ExtraDacl , ACL_REVISION , t_AceIndex , s_Provider_LocalService_ACE , s_LocalService_ACESize ) )
|
|
{
|
|
t_AceIndex ++ ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_CRITICAL_ERROR ;
|
|
}
|
|
}
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
if ( s_NetworkService_ACESize && :: AddAce ( t_ExtraDacl , ACL_REVISION , t_AceIndex , s_Provider_NetworkService_ACE , s_NetworkService_ACESize ) )
|
|
{
|
|
t_AceIndex ++ ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_CRITICAL_ERROR ;
|
|
}
|
|
}
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
if ( s_LocalAdmins_ACESize && :: AddAce ( t_ExtraDacl , ACL_REVISION , t_AceIndex , s_Provider_LocalAdmins_ACE , s_LocalAdmins_ACESize ) )
|
|
{
|
|
t_AceIndex ++ ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_CRITICAL_ERROR ;
|
|
}
|
|
}
|
|
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
BOOL t_Status = SetSecurityDescriptorDacl (
|
|
|
|
t_SecurityDescriptor ,
|
|
TRUE ,
|
|
t_ExtraDacl ,
|
|
FALSE
|
|
) ;
|
|
|
|
if ( t_Status )
|
|
{
|
|
DWORD t_FinalLength = 0 ;
|
|
|
|
t_Status = MakeSelfRelativeSD (
|
|
|
|
t_SecurityDescriptor ,
|
|
a_AlteredSecurityDescriptor ,
|
|
& t_FinalLength
|
|
) ;
|
|
|
|
if ( t_Status == FALSE && GetLastError () == ERROR_INSUFFICIENT_BUFFER )
|
|
{
|
|
a_AlteredSecurityDescriptor = ( SECURITY_DESCRIPTOR * ) new BYTE [ t_FinalLength ] ;
|
|
if ( a_AlteredSecurityDescriptor )
|
|
{
|
|
t_Status = MakeSelfRelativeSD (
|
|
|
|
t_SecurityDescriptor ,
|
|
a_AlteredSecurityDescriptor ,
|
|
& t_FinalLength
|
|
) ;
|
|
|
|
if ( t_Status == FALSE )
|
|
{
|
|
t_Result = WBEM_E_CRITICAL_ERROR ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_CRITICAL_ERROR ;
|
|
}
|
|
}
|
|
|
|
delete [] t_Ace ;
|
|
delete [] t_ExtraDacl ;
|
|
}
|
|
|
|
delete [] ( BYTE * ) t_Dacl ;
|
|
delete [] ( BYTE * ) t_Sacl ;
|
|
delete [] ( BYTE * ) t_Owner ;
|
|
delete [] ( BYTE * ) t_PrimaryGroup ;
|
|
delete [] ( BYTE * ) t_AlteredSecurityDescriptor ;
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Common_Globals :: CreateSystemAces ()
|
|
{
|
|
HRESULT t_Result = S_OK ;
|
|
|
|
SID_IDENTIFIER_AUTHORITY t_NtAuthoritySid = SECURITY_NT_AUTHORITY ;
|
|
|
|
PSID t_System_Sid = NULL ;
|
|
PSID t_LocalService_Sid = NULL ;
|
|
PSID t_NetworkService_Sid = NULL ;
|
|
PSID t_LocalAdmins_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 )
|
|
{
|
|
DWORD t_SidLength = ::GetLengthSid ( t_System_Sid );
|
|
s_System_ACESize = sizeof(ACCESS_ALLOWED_ACE) + (WORD) ( t_SidLength - sizeof(DWORD) ) ;
|
|
|
|
s_Provider_System_ACE = (ACCESS_ALLOWED_ACE*) new BYTE [ s_System_ACESize ] ;
|
|
if ( s_Provider_System_ACE )
|
|
{
|
|
CopySid ( t_SidLength, (PSID) & s_Provider_System_ACE->SidStart, t_System_Sid ) ;
|
|
s_Provider_System_ACE->Mask = MASK_PROVIDER_BINDING_BIND ;
|
|
s_Provider_System_ACE->Header.AceType = 0 ;
|
|
s_Provider_System_ACE->Header.AceFlags = CONTAINER_INHERIT_ACE | OBJECT_INHERIT_ACE ;
|
|
s_Provider_System_ACE->Header.AceSize = s_System_ACESize ;
|
|
|
|
s_Token_All_Access_System_ACE = (ACCESS_ALLOWED_ACE*) new BYTE [ s_System_ACESize ] ;
|
|
if ( s_Token_All_Access_System_ACE )
|
|
{
|
|
CopySid ( t_SidLength, (PSID) & s_Token_All_Access_System_ACE->SidStart, t_System_Sid ) ;
|
|
s_Token_All_Access_System_ACE->Mask = TOKEN_ALL_ACCESS ;
|
|
s_Token_All_Access_System_ACE->Header.AceType = 0 ;
|
|
s_Token_All_Access_System_ACE->Header.AceFlags = CONTAINER_INHERIT_ACE | OBJECT_INHERIT_ACE ; ;
|
|
s_Token_All_Access_System_ACE->Header.AceSize = s_System_ACESize ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = E_OUTOFMEMORY ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = E_OUTOFMEMORY ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
DWORD t_LastError = ::GetLastError();
|
|
|
|
t_Result = E_OUTOFMEMORY ;
|
|
}
|
|
|
|
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 );
|
|
s_LocalService_ACESize = sizeof(ACCESS_ALLOWED_ACE) + (WORD) ( t_SidLength - sizeof(DWORD) ) ;
|
|
|
|
s_Provider_LocalService_ACE = (ACCESS_ALLOWED_ACE*) new BYTE [ s_LocalService_ACESize ] ;
|
|
if ( s_Provider_LocalService_ACE )
|
|
{
|
|
CopySid ( t_SidLength, (PSID) & s_Provider_LocalService_ACE->SidStart, t_LocalService_Sid ) ;
|
|
s_Provider_LocalService_ACE->Mask = MASK_PROVIDER_BINDING_BIND ;
|
|
s_Provider_LocalService_ACE->Header.AceType = 0 ;
|
|
s_Provider_LocalService_ACE->Header.AceFlags = CONTAINER_INHERIT_ACE | OBJECT_INHERIT_ACE ; ;
|
|
s_Provider_LocalService_ACE->Header.AceSize = s_LocalService_ACESize ;
|
|
|
|
s_Token_All_Access_LocalService_ACE = (ACCESS_ALLOWED_ACE*) new BYTE [ s_LocalService_ACESize ] ;
|
|
if ( s_Token_All_Access_LocalService_ACE )
|
|
{
|
|
CopySid ( t_SidLength, (PSID) & s_Token_All_Access_LocalService_ACE->SidStart, t_LocalService_Sid ) ;
|
|
s_Token_All_Access_LocalService_ACE->Mask = TOKEN_ALL_ACCESS ;
|
|
s_Token_All_Access_LocalService_ACE->Header.AceType = 0 ;
|
|
s_Token_All_Access_LocalService_ACE->Header.AceFlags = CONTAINER_INHERIT_ACE | OBJECT_INHERIT_ACE ; ;
|
|
s_Token_All_Access_LocalService_ACE->Header.AceSize = s_LocalService_ACESize ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = E_OUTOFMEMORY ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = E_OUTOFMEMORY ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
DWORD t_LastError = ::GetLastError();
|
|
|
|
t_Result = E_OUTOFMEMORY ;
|
|
}
|
|
}
|
|
|
|
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 );
|
|
s_NetworkService_ACESize = sizeof(ACCESS_ALLOWED_ACE) + (WORD) ( t_SidLength - sizeof(DWORD) ) ;
|
|
|
|
s_Provider_NetworkService_ACE = (ACCESS_ALLOWED_ACE*) new BYTE [ s_NetworkService_ACESize ] ;
|
|
if ( s_Provider_NetworkService_ACE )
|
|
{
|
|
CopySid ( t_SidLength, (PSID) & s_Provider_NetworkService_ACE->SidStart, t_NetworkService_Sid ) ;
|
|
s_Provider_NetworkService_ACE->Mask = MASK_PROVIDER_BINDING_BIND ;
|
|
s_Provider_NetworkService_ACE->Header.AceType = 0 ;
|
|
s_Provider_NetworkService_ACE->Header.AceFlags = CONTAINER_INHERIT_ACE | OBJECT_INHERIT_ACE ;
|
|
s_Provider_NetworkService_ACE->Header.AceSize = s_NetworkService_ACESize ;
|
|
|
|
s_Token_All_Access_NetworkService_ACE = (ACCESS_ALLOWED_ACE*) new BYTE [ s_NetworkService_ACESize ] ;
|
|
if ( s_Token_All_Access_NetworkService_ACE )
|
|
{
|
|
CopySid ( t_SidLength, (PSID) & s_Token_All_Access_NetworkService_ACE->SidStart, t_NetworkService_Sid ) ;
|
|
s_Token_All_Access_NetworkService_ACE->Mask = TOKEN_ALL_ACCESS ;
|
|
s_Token_All_Access_NetworkService_ACE->Header.AceType = 0 ;
|
|
s_Token_All_Access_NetworkService_ACE->Header.AceFlags = CONTAINER_INHERIT_ACE | OBJECT_INHERIT_ACE ; ;
|
|
s_Token_All_Access_NetworkService_ACE->Header.AceSize = s_NetworkService_ACESize ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = E_OUTOFMEMORY ;
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
t_Result = E_OUTOFMEMORY ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
DWORD t_LastError = ::GetLastError();
|
|
|
|
t_Result = E_OUTOFMEMORY ;
|
|
}
|
|
}
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
t_BoolResult = AllocateAndInitializeSid (
|
|
|
|
& t_NtAuthoritySid ,
|
|
2 ,
|
|
SECURITY_BUILTIN_DOMAIN_RID ,
|
|
DOMAIN_ALIAS_RID_ADMINS ,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
& t_LocalAdmins_Sid
|
|
);
|
|
|
|
if ( t_BoolResult )
|
|
{
|
|
DWORD t_SidLength = ::GetLengthSid ( t_LocalAdmins_Sid );
|
|
s_LocalAdmins_ACESize = sizeof(ACCESS_ALLOWED_ACE) + (WORD) ( t_SidLength - sizeof(DWORD) ) ;
|
|
|
|
s_Provider_LocalAdmins_ACE = (ACCESS_ALLOWED_ACE*) new BYTE [ s_LocalAdmins_ACESize ] ;
|
|
if ( s_Provider_LocalAdmins_ACE )
|
|
{
|
|
CopySid ( t_SidLength, (PSID) & s_Provider_LocalAdmins_ACE->SidStart, t_LocalAdmins_Sid ) ;
|
|
s_Provider_LocalAdmins_ACE->Mask = MASK_PROVIDER_BINDING_BIND ;
|
|
s_Provider_LocalAdmins_ACE->Header.AceType = 0 ;
|
|
s_Provider_LocalAdmins_ACE->Header.AceFlags = CONTAINER_INHERIT_ACE | OBJECT_INHERIT_ACE ; ;
|
|
s_Provider_LocalAdmins_ACE->Header.AceSize = s_LocalAdmins_ACESize ;
|
|
|
|
s_Token_All_Access_LocalAdmins_ACE = (ACCESS_ALLOWED_ACE*) new BYTE [ s_LocalAdmins_ACESize ] ;
|
|
if ( s_Token_All_Access_LocalAdmins_ACE )
|
|
{
|
|
CopySid ( t_SidLength, (PSID) & s_Token_All_Access_LocalAdmins_ACE->SidStart, t_LocalAdmins_Sid ) ;
|
|
s_Token_All_Access_LocalAdmins_ACE->Mask = TOKEN_ALL_ACCESS ;
|
|
s_Token_All_Access_LocalAdmins_ACE->Header.AceType = 0 ;
|
|
s_Token_All_Access_LocalAdmins_ACE->Header.AceFlags = CONTAINER_INHERIT_ACE | OBJECT_INHERIT_ACE ; ;
|
|
s_Token_All_Access_LocalAdmins_ACE->Header.AceSize = s_LocalAdmins_ACESize ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = E_OUTOFMEMORY ;
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
t_Result = E_OUTOFMEMORY ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
DWORD t_LastError = ::GetLastError();
|
|
|
|
t_Result = E_OUTOFMEMORY ;
|
|
}
|
|
}
|
|
|
|
if ( t_LocalAdmins_Sid )
|
|
{
|
|
FreeSid ( t_LocalAdmins_Sid ) ;
|
|
}
|
|
|
|
if ( t_System_Sid )
|
|
{
|
|
FreeSid ( t_System_Sid ) ;
|
|
}
|
|
|
|
if ( t_LocalService_Sid )
|
|
{
|
|
FreeSid ( t_LocalService_Sid ) ;
|
|
}
|
|
|
|
if ( t_NetworkService_Sid )
|
|
{
|
|
FreeSid ( t_NetworkService_Sid ) ;
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Common_Globals :: DeleteSystemAces ()
|
|
{
|
|
if ( s_Provider_System_ACE )
|
|
{
|
|
delete [] ( ( BYTE * ) s_Provider_System_ACE ) ;
|
|
s_Provider_System_ACE = NULL;
|
|
}
|
|
|
|
if ( s_Provider_LocalService_ACE )
|
|
{
|
|
delete [] ( ( BYTE * ) s_Provider_LocalService_ACE ) ;
|
|
s_Provider_LocalService_ACE = NULL;
|
|
}
|
|
|
|
if ( s_Provider_NetworkService_ACE )
|
|
{
|
|
delete [] ( ( BYTE * ) s_Provider_NetworkService_ACE ) ;
|
|
s_Provider_NetworkService_ACE = NULL;
|
|
}
|
|
|
|
if ( s_Provider_LocalAdmins_ACE )
|
|
{
|
|
delete [] ( ( BYTE * ) s_Provider_LocalAdmins_ACE ) ;
|
|
s_Provider_LocalAdmins_ACE = NULL;
|
|
}
|
|
|
|
if ( s_Token_All_Access_System_ACE )
|
|
{
|
|
delete [] ( ( BYTE * ) s_Token_All_Access_System_ACE ) ;
|
|
s_Token_All_Access_System_ACE = NULL;
|
|
}
|
|
|
|
if ( s_Token_All_Access_LocalService_ACE )
|
|
{
|
|
delete [] ( ( BYTE * ) s_Token_All_Access_LocalService_ACE ) ;
|
|
s_Token_All_Access_LocalService_ACE = NULL;
|
|
}
|
|
|
|
if ( s_Token_All_Access_NetworkService_ACE )
|
|
{
|
|
delete [] ( ( BYTE * ) s_Token_All_Access_NetworkService_ACE ) ;
|
|
s_Token_All_Access_NetworkService_ACE = NULL;
|
|
}
|
|
|
|
if ( s_Token_All_Access_LocalAdmins_ACE )
|
|
{
|
|
delete [] ( ( BYTE * ) s_Token_All_Access_LocalAdmins_ACE ) ;
|
|
s_Token_All_Access_LocalAdmins_ACE = NULL;
|
|
}
|
|
|
|
return S_OK ;
|
|
}
|
|
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Common_Globals :: CheckAccess (
|
|
|
|
SECURITY_DESCRIPTOR *a_SecurityDescriptor ,
|
|
DWORD a_Access ,
|
|
GENERIC_MAPPING *a_Mapping
|
|
)
|
|
{
|
|
HRESULT t_Result = S_OK ;
|
|
|
|
if ( a_SecurityDescriptor )
|
|
{
|
|
t_Result = CoImpersonateClient () ;
|
|
if ( SUCCEEDED ( t_Result ) || t_Result == RPC_E_CALL_COMPLETE )
|
|
{
|
|
t_Result = ProviderSubSystem_Common_Globals :: Check_SecurityDescriptor_CallIdentity (
|
|
|
|
a_SecurityDescriptor ,
|
|
a_Access ,
|
|
a_Mapping
|
|
) ;
|
|
|
|
CoRevertToSelf () ;
|
|
}
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Common_Globals :: GetUserSid (
|
|
|
|
HANDLE a_Token ,
|
|
ULONG *a_Size ,
|
|
PSID &a_Sid
|
|
)
|
|
{
|
|
HRESULT t_Result = WBEM_E_FAILED ;
|
|
|
|
if ( a_Token )
|
|
{
|
|
if ( a_Size )
|
|
{
|
|
TOKEN_USER *t_TokenUser = NULL ;
|
|
DWORD t_ReturnLength = 0 ;
|
|
TOKEN_INFORMATION_CLASS t_TokenInformationClass = TokenUser ;
|
|
|
|
BOOL t_TokenStatus = GetTokenInformation (
|
|
|
|
a_Token ,
|
|
t_TokenInformationClass ,
|
|
t_TokenUser ,
|
|
t_ReturnLength ,
|
|
& t_ReturnLength
|
|
) ;
|
|
|
|
if ( ! t_TokenStatus )
|
|
{
|
|
DWORD t_LastError = GetLastError () ;
|
|
switch ( t_LastError )
|
|
{
|
|
case ERROR_INSUFFICIENT_BUFFER:
|
|
{
|
|
t_TokenUser = ( TOKEN_USER * ) new BYTE [ t_ReturnLength ] ;
|
|
if ( t_TokenUser )
|
|
{
|
|
t_TokenStatus = GetTokenInformation (
|
|
|
|
a_Token ,
|
|
t_TokenInformationClass ,
|
|
t_TokenUser ,
|
|
t_ReturnLength ,
|
|
& t_ReturnLength
|
|
) ;
|
|
|
|
if ( t_TokenStatus )
|
|
{
|
|
DWORD t_SidLength = GetLengthSid ( t_TokenUser->User.Sid ) ;
|
|
*a_Size = t_SidLength ;
|
|
|
|
a_Sid = new BYTE [ t_SidLength ] ;
|
|
if ( a_Sid )
|
|
{
|
|
CopyMemory ( a_Sid , t_TokenUser->User.Sid , t_SidLength ) ;
|
|
|
|
t_Result = S_OK ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
}
|
|
|
|
delete [] t_TokenUser ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
}
|
|
break ;
|
|
|
|
default:
|
|
{
|
|
}
|
|
break ;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_INVALID_PARAMETER ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = ( ERROR_INVALID_HANDLE | 0x80070000 ) ;
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Common_Globals :: GetGroupSid (
|
|
|
|
HANDLE a_Token ,
|
|
ULONG *a_Size ,
|
|
PSID &a_Sid
|
|
)
|
|
{
|
|
HRESULT t_Result = WBEM_E_FAILED ;
|
|
|
|
if ( a_Token )
|
|
{
|
|
if ( a_Size )
|
|
{
|
|
TOKEN_PRIMARY_GROUP *t_TokenGroup = NULL ;
|
|
DWORD t_ReturnLength = 0 ;
|
|
TOKEN_INFORMATION_CLASS t_TokenInformationClass = TokenPrimaryGroup ;
|
|
|
|
BOOL t_TokenStatus = GetTokenInformation (
|
|
|
|
a_Token ,
|
|
t_TokenInformationClass ,
|
|
t_TokenGroup ,
|
|
t_ReturnLength ,
|
|
& t_ReturnLength
|
|
) ;
|
|
|
|
if ( ! t_TokenStatus )
|
|
{
|
|
DWORD t_LastError = GetLastError () ;
|
|
switch ( t_LastError )
|
|
{
|
|
case ERROR_INSUFFICIENT_BUFFER:
|
|
{
|
|
t_TokenGroup = ( TOKEN_PRIMARY_GROUP * ) new BYTE [ t_ReturnLength ] ;
|
|
if ( t_TokenGroup )
|
|
{
|
|
t_TokenStatus = GetTokenInformation (
|
|
|
|
a_Token ,
|
|
t_TokenInformationClass ,
|
|
t_TokenGroup ,
|
|
t_ReturnLength ,
|
|
& t_ReturnLength
|
|
) ;
|
|
|
|
if ( t_TokenStatus )
|
|
{
|
|
DWORD t_SidLength = GetLengthSid ( t_TokenGroup->PrimaryGroup ) ;
|
|
*a_Size = t_SidLength ;
|
|
|
|
a_Sid = new BYTE [ t_SidLength ] ;
|
|
if ( a_Sid )
|
|
{
|
|
CopyMemory ( a_Sid , t_TokenGroup->PrimaryGroup , t_SidLength ) ;
|
|
|
|
t_Result = S_OK ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
}
|
|
|
|
delete [] t_TokenGroup ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
}
|
|
break ;
|
|
|
|
default:
|
|
{
|
|
}
|
|
break ;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_INVALID_PARAMETER ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = ( ERROR_INVALID_HANDLE | 0x80070000 ) ;
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Common_Globals :: GetAceWithProcessTokenUser (
|
|
|
|
DWORD a_ProcessIdentifier ,
|
|
WORD &a_AceSize ,
|
|
ACCESS_ALLOWED_ACE *&a_Ace
|
|
)
|
|
{
|
|
HRESULT t_Result = WBEM_E_ACCESS_DENIED ;
|
|
|
|
HANDLE t_ProcessHandle = OpenProcess (
|
|
|
|
MAXIMUM_ALLOWED ,
|
|
FALSE ,
|
|
a_ProcessIdentifier
|
|
) ;
|
|
|
|
if ( t_ProcessHandle )
|
|
{
|
|
HANDLE t_ProcessToken = NULL ;
|
|
BOOL t_Status = OpenProcessToken (
|
|
t_ProcessHandle ,
|
|
TOKEN_QUERY,
|
|
& t_ProcessToken
|
|
) ;
|
|
|
|
if ( t_Status )
|
|
{
|
|
DWORD t_OwnerSize = 0 ;
|
|
PSID t_OwnerSid = NULL ;
|
|
BOOL t_OwnerDefaulted = FALSE ;
|
|
|
|
t_Result = GetUserSid (
|
|
|
|
t_ProcessToken ,
|
|
& t_OwnerSize ,
|
|
t_OwnerSid
|
|
) ;
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
ACCESS_ALLOWED_ACE *t_Ace = NULL ;
|
|
DWORD t_AceSize = 0 ;
|
|
|
|
t_AceSize = sizeof(ACCESS_ALLOWED_ACE) + (WORD) ( t_OwnerSize - sizeof(DWORD) ) ;
|
|
t_Ace = (ACCESS_ALLOWED_ACE*) new BYTE [ t_AceSize ] ;
|
|
if ( t_Ace )
|
|
{
|
|
CopySid ( t_OwnerSize, (PSID) & t_Ace->SidStart, t_OwnerSid ) ;
|
|
t_Ace->Mask = TOKEN_ALL_ACCESS ;
|
|
t_Ace->Header.AceType = 0 ;
|
|
t_Ace->Header.AceFlags = 0 ;
|
|
t_Ace->Header.AceSize = t_AceSize ;
|
|
|
|
a_Ace = t_Ace ;
|
|
a_AceSize = t_AceSize ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
|
|
delete [] ( BYTE * ) t_OwnerSid ;
|
|
}
|
|
|
|
CloseHandle ( t_ProcessToken ) ;
|
|
}
|
|
|
|
CloseHandle ( t_ProcessHandle ) ;
|
|
}
|
|
else
|
|
t_Result = MAKE_HRESULT(1, FACILITY_WIN32, RPC_S_SERVER_UNAVAILABLE);
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Common_Globals :: SinkAccessInitialize (
|
|
|
|
SECURITY_DESCRIPTOR *a_RegistrationSecurityDescriptor ,
|
|
SECURITY_DESCRIPTOR *&a_SinkSecurityDescriptor
|
|
)
|
|
{
|
|
HRESULT t_Result = CoImpersonateClient () ;
|
|
HANDLE t_Token = NULL ;
|
|
BOOL t_Status = FALSE;
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
t_Status = OpenThreadToken (
|
|
|
|
GetCurrentThread () ,
|
|
TOKEN_QUERY,
|
|
TRUE ,
|
|
&t_Token
|
|
) ;
|
|
|
|
CoRevertToSelf ();
|
|
if (!t_Status)
|
|
{
|
|
t_Result = WBEM_E_ACCESS_DENIED;
|
|
}
|
|
}
|
|
else if ( t_Result == RPC_E_CALL_COMPLETE )
|
|
{
|
|
t_Status = OpenProcessToken(
|
|
|
|
GetCurrentProcess () ,
|
|
TOKEN_QUERY ,
|
|
&t_Token
|
|
);
|
|
|
|
if ( !t_Status )
|
|
{
|
|
t_Result = WBEM_E_ACCESS_DENIED;
|
|
}
|
|
}
|
|
|
|
if ( t_Status )
|
|
{
|
|
DWORD t_OwnerSize = 0 ;
|
|
PSID t_OwnerSid = NULL ;
|
|
BOOL t_OwnerDefaulted = FALSE ;
|
|
|
|
t_Result = GetUserSid (
|
|
|
|
t_Token ,
|
|
& t_OwnerSize ,
|
|
t_OwnerSid
|
|
) ;
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
DWORD t_GroupSize = 0 ;
|
|
PSID t_GroupSid = NULL ;
|
|
BOOL t_GroupDefaulted = FALSE ;
|
|
|
|
t_Result = GetGroupSid (
|
|
|
|
t_Token ,
|
|
& t_GroupSize ,
|
|
t_GroupSid
|
|
) ;
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
t_Result = ProviderSubSystem_Common_Globals :: AdjustSecurityDescriptorWithSid (
|
|
|
|
( SID * ) t_OwnerSid ,
|
|
( SID * ) t_GroupSid ,
|
|
MASK_PROVIDER_BINDING_BIND ,
|
|
a_RegistrationSecurityDescriptor ,
|
|
a_SinkSecurityDescriptor
|
|
) ;
|
|
|
|
delete [] ( BYTE * ) t_GroupSid ;
|
|
}
|
|
|
|
delete [] ( BYTE * ) t_OwnerSid ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_CRITICAL_ERROR ;
|
|
}
|
|
|
|
CloseHandle ( t_Token ) ;
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Common_Globals :: CreateMethodSecurityDescriptor ()
|
|
{
|
|
HRESULT t_Result = S_OK ;
|
|
|
|
BOOL t_Status = ConvertStringSecurityDescriptorToSecurityDescriptor (
|
|
|
|
L"O:BAG:BAD:(A;;0x10000001;;;BA)(A;;0x10000001;;;SY)(A;;0x10000001;;;LA)(A;;0x10000001;;;S-1-5-20)(A;;0x10000001;;;S-1-5-19)" ,
|
|
SDDL_REVISION_1 ,
|
|
( PSECURITY_DESCRIPTOR * ) & s_MethodSecurityDescriptor ,
|
|
NULL
|
|
) ;
|
|
|
|
if ( t_Status )
|
|
{
|
|
t_Status = ConvertStringSecurityDescriptorToSecurityDescriptor (
|
|
|
|
L"O:BAG:BAD:(A;;0x10000001;;;BA)(A;;0x10000001;;;SY)(A;;0x10000001;;;LA)(A;;0x10000001;;;S-1-5-20)(A;;0x10000001;;;S-1-5-19)"
|
|
L"(A;;0x10000001;;;S-1-5-3) (A;;0x10000001;;;S-1-5-6)",
|
|
SDDL_REVISION_1 ,
|
|
( PSECURITY_DESCRIPTOR * ) & s_DefaultDecoupledSD ,
|
|
NULL
|
|
) ;
|
|
if ( t_Status )
|
|
{
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_CRITICAL_ERROR ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_CRITICAL_ERROR ;
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT ProviderSubSystem_Common_Globals :: DeleteMethodSecurityDescriptor ()
|
|
{
|
|
if ( s_MethodSecurityDescriptor )
|
|
{
|
|
LocalFree ( s_MethodSecurityDescriptor ) ;
|
|
s_MethodSecurityDescriptor = NULL;
|
|
|
|
}
|
|
if ( s_DefaultDecoupledSD)
|
|
{
|
|
LocalFree ( s_DefaultDecoupledSD ) ;
|
|
s_DefaultDecoupledSD = NULL;
|
|
}
|
|
|
|
return S_OK ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
DWORD ProviderSubSystem_Common_Globals :: InitializeTransmitSize ()
|
|
{
|
|
s_TransmitBufferSize = SYNCPROV_BATCH_TRANSMIT_SIZE ;
|
|
|
|
HKEY t_ConfigRoot ;
|
|
|
|
LONG t_RegResult = RegOpenKeyEx (
|
|
|
|
HKEY_LOCAL_MACHINE ,
|
|
L"Software\\Microsoft\\WBEM\\CIMOM" ,
|
|
0 ,
|
|
KEY_READ ,
|
|
& t_ConfigRoot
|
|
) ;
|
|
|
|
if ( t_RegResult == ERROR_SUCCESS )
|
|
{
|
|
DWORD t_ValueType = REG_DWORD ;
|
|
DWORD t_DataSize = sizeof ( s_TransmitBufferSize ) ;
|
|
|
|
t_RegResult = RegQueryValueEx (
|
|
|
|
t_ConfigRoot ,
|
|
L"Sink Transmit Buffer Size" ,
|
|
0 ,
|
|
& t_ValueType ,
|
|
LPBYTE ( & s_TransmitBufferSize ) ,
|
|
& t_DataSize
|
|
);
|
|
|
|
if ( t_RegResult == ERROR_SUCCESS )
|
|
{
|
|
}
|
|
|
|
RegCloseKey ( t_ConfigRoot ) ;
|
|
}
|
|
|
|
return s_TransmitBufferSize ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
#ifdef IA64
|
|
#define RPC_STACK_COMMIT_SIZE 8192 * 8
|
|
#else
|
|
#define RPC_STACK_COMMIT_SIZE 4096 * 8
|
|
#endif
|
|
|
|
#define REGSTR_PATH_SVCHOST TEXT("Software\\Microsoft\\Wbem\\Cimom")
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
DWORD ProviderSubSystem_Common_Globals :: InitializeDefaultStackSize ()
|
|
{
|
|
s_DefaultStackSize = RPC_STACK_COMMIT_SIZE ;
|
|
|
|
HKEY t_ConfigRoot ;
|
|
|
|
LONG t_RegResult = RegOpenKeyEx (
|
|
|
|
HKEY_LOCAL_MACHINE ,
|
|
REGSTR_PATH_SVCHOST ,
|
|
0 ,
|
|
KEY_READ ,
|
|
& t_ConfigRoot
|
|
) ;
|
|
|
|
if ( t_RegResult == ERROR_SUCCESS )
|
|
{
|
|
DWORD t_ValueType = REG_DWORD ;
|
|
DWORD t_Value = 0 ;
|
|
DWORD t_DataSize = sizeof ( t_Value ) ;
|
|
|
|
t_RegResult = RegQueryValueEx (
|
|
|
|
t_ConfigRoot ,
|
|
L"DefaultRpcStackSize" ,
|
|
0 ,
|
|
& t_ValueType ,
|
|
LPBYTE ( & t_Value ) ,
|
|
& t_DataSize
|
|
);
|
|
|
|
if ( t_RegResult == ERROR_SUCCESS )
|
|
{
|
|
s_DefaultStackSize = t_Value * 1024 ;
|
|
}
|
|
|
|
RegCloseKey ( t_ConfigRoot ) ;
|
|
}
|
|
|
|
return s_DefaultStackSize ;
|
|
}
|