519 lines
17 KiB
C++
519 lines
17 KiB
C++
/******************************************************************************
|
|
|
|
Copyright (c) 2000 Microsoft Corporation
|
|
|
|
Module Name:
|
|
LowLevel.cpp
|
|
|
|
Abstract:
|
|
This file contains the implementation of the CPCHSecurityDescriptor class,
|
|
which is used to represent a security descriptor.
|
|
|
|
Revision History:
|
|
Davide Massarenti (Dmassare) 03/24/2000
|
|
created
|
|
|
|
******************************************************************************/
|
|
|
|
#include "StdAfx.h"
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
HRESULT CPCHSecurityDescriptorDirect::ConvertACEFromCOM( /*[in ]*/ IPCHAccessControlEntry* objACE ,
|
|
/*[out]*/ PACL& pACL )
|
|
{
|
|
__HCP_FUNC_ENTRY( "CPCHSecurityDescriptorDirect::ConvertACEFromCOM" );
|
|
|
|
HRESULT hr;
|
|
GUID guidObjectType;
|
|
GUID guidInheritedObjectType;
|
|
////////////////////////////////////////
|
|
long lAccessMask;
|
|
long lAceFlags;
|
|
long lAceType;
|
|
long lFlags;
|
|
CComBSTR bstrTrustee;
|
|
CComBSTR bstrObjectType;
|
|
CComBSTR bstrInheritedObjectType;
|
|
PSID pPrincipalSid = NULL;
|
|
|
|
|
|
__MPC_PARAMCHECK_BEGIN(hr)
|
|
__MPC_PARAMCHECK_NOTNULL(objACE);
|
|
__MPC_PARAMCHECK_END();
|
|
|
|
|
|
//
|
|
// Read data.
|
|
//
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, objACE->get_AccessMask ( &lAccessMask ));
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, objACE->get_AceType ( &lAceFlags ));
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, objACE->get_AceFlags ( &lAceType ));
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, objACE->get_Flags ( &lFlags ));
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, objACE->get_Trustee ( &bstrTrustee ));
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, objACE->get_ObjectType ( &bstrObjectType ));
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, objACE->get_InheritedObjectType( &bstrInheritedObjectType ));
|
|
|
|
|
|
if(bstrObjectType.Length())
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, ::CLSIDFromString( bstrObjectType, &guidObjectType ));
|
|
}
|
|
|
|
if(bstrInheritedObjectType.Length())
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, ::CLSIDFromString( bstrInheritedObjectType, &guidInheritedObjectType ));
|
|
}
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, ConvertPrincipalToSID( SAFEBSTR(bstrTrustee), pPrincipalSid ));
|
|
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, AddACEToACL( pACL,
|
|
pPrincipalSid ,
|
|
(DWORD)lAceType ,
|
|
(DWORD)lAceFlags ,
|
|
(DWORD)lAccessMask ,
|
|
bstrObjectType ? &guidObjectType : NULL ,
|
|
bstrInheritedObjectType ? &guidInheritedObjectType : NULL ));
|
|
|
|
hr = S_OK;
|
|
|
|
|
|
__HCP_FUNC_CLEANUP;
|
|
|
|
ReleaseMemory( (void*&)pPrincipalSid );
|
|
|
|
__HCP_FUNC_EXIT(hr);
|
|
}
|
|
|
|
HRESULT CPCHSecurityDescriptorDirect::ConvertACEToCOM( /*[in]*/ IPCHAccessControlEntry* objACE ,
|
|
/*[in]*/ const LPVOID pACE )
|
|
{
|
|
__HCP_FUNC_ENTRY( "CPCHSecurityDescriptorDirect::ConvertACEToCOM" );
|
|
|
|
HRESULT hr;
|
|
PSID pSID = NULL;
|
|
LPCWSTR szPrincipal = NULL;
|
|
GUID* guidObjectType = NULL;
|
|
GUID* guidInheritedObjectType = NULL;
|
|
PACE_HEADER aceHeader = (PACE_HEADER)pACE;
|
|
////////////////////////////////////////
|
|
long lAccessMask = 0;
|
|
long lAceFlags = 0;
|
|
long lAceType = 0;
|
|
long lFlags = 0;
|
|
CComBSTR bstrTrustee;
|
|
CComBSTR bstrObjectType;
|
|
CComBSTR bstrInheritedObjectType;
|
|
|
|
__MPC_PARAMCHECK_BEGIN(hr)
|
|
__MPC_PARAMCHECK_NOTNULL(objACE);
|
|
__MPC_PARAMCHECK_NOTNULL(pACE);
|
|
__MPC_PARAMCHECK_END();
|
|
|
|
|
|
lAceType = aceHeader->AceType;
|
|
lAceFlags = aceHeader->AceFlags;
|
|
|
|
|
|
//
|
|
// Extract data from the ACE.
|
|
//
|
|
switch(lAceType)
|
|
{
|
|
case ACCESS_ALLOWED_ACE_TYPE:
|
|
{
|
|
PACCESS_ALLOWED_ACE pRealACE = (PACCESS_ALLOWED_ACE)pACE;
|
|
|
|
lAccessMask = pRealACE->Mask;
|
|
pSID = (PSID)&pRealACE->SidStart;
|
|
}
|
|
break;
|
|
|
|
case ACCESS_ALLOWED_OBJECT_ACE_TYPE:
|
|
{
|
|
PACCESS_ALLOWED_OBJECT_ACE pRealACE = (PACCESS_ALLOWED_OBJECT_ACE)pACE;
|
|
|
|
lAccessMask = pRealACE->Mask;
|
|
lFlags = pRealACE->Flags;
|
|
guidObjectType = &pRealACE->ObjectType;
|
|
guidInheritedObjectType = &pRealACE->InheritedObjectType;
|
|
pSID = (PSID)&pRealACE->SidStart;
|
|
}
|
|
break;
|
|
|
|
case ACCESS_DENIED_ACE_TYPE:
|
|
{
|
|
PACCESS_DENIED_ACE pRealACE = (PACCESS_DENIED_ACE)pACE;
|
|
|
|
lAccessMask = pRealACE->Mask;
|
|
pSID = (PSID)&pRealACE->SidStart;
|
|
}
|
|
break;
|
|
|
|
case ACCESS_DENIED_OBJECT_ACE_TYPE:
|
|
{
|
|
PACCESS_DENIED_OBJECT_ACE pRealACE = (PACCESS_DENIED_OBJECT_ACE)pACE;
|
|
|
|
lAccessMask = pRealACE->Mask;
|
|
lFlags = pRealACE->Flags;
|
|
guidObjectType = &pRealACE->ObjectType;
|
|
guidInheritedObjectType = &pRealACE->InheritedObjectType;
|
|
pSID = (PSID)&pRealACE->SidStart;
|
|
}
|
|
break;
|
|
|
|
case SYSTEM_AUDIT_ACE_TYPE:
|
|
{
|
|
PSYSTEM_AUDIT_ACE pRealACE = (PSYSTEM_AUDIT_ACE)pACE;
|
|
|
|
lAccessMask = pRealACE->Mask;
|
|
pSID = (PSID)&pRealACE->SidStart;
|
|
}
|
|
break;
|
|
|
|
case SYSTEM_AUDIT_OBJECT_ACE_TYPE:
|
|
{
|
|
PSYSTEM_AUDIT_OBJECT_ACE pRealACE = (PSYSTEM_AUDIT_OBJECT_ACE)pACE;
|
|
|
|
lAccessMask = pRealACE->Mask;
|
|
lFlags = pRealACE->Flags;
|
|
guidObjectType = &pRealACE->ObjectType;
|
|
guidInheritedObjectType = &pRealACE->InheritedObjectType;
|
|
pSID = (PSID)&pRealACE->SidStart;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
__MPC_SET_ERROR_AND_EXIT(hr, E_INVALIDARG);
|
|
}
|
|
|
|
|
|
|
|
//
|
|
// Convert GUIDs and SIDs to strings.
|
|
//
|
|
if(pSID)
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, ConvertSIDToPrincipal( pSID, &szPrincipal ));
|
|
|
|
bstrTrustee = szPrincipal;
|
|
}
|
|
|
|
if(guidObjectType)
|
|
{
|
|
LPOLESTR szGuid;
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, ::StringFromCLSID( *guidObjectType, &szGuid ));
|
|
|
|
bstrObjectType = szGuid;
|
|
|
|
::CoTaskMemFree( szGuid );
|
|
}
|
|
|
|
if(guidInheritedObjectType)
|
|
{
|
|
LPOLESTR szGuid;
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, ::StringFromCLSID( *guidInheritedObjectType, &szGuid ));
|
|
|
|
bstrInheritedObjectType = szGuid;
|
|
|
|
::CoTaskMemFree( szGuid );
|
|
}
|
|
|
|
|
|
//
|
|
// Write data.
|
|
//
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, objACE->put_AccessMask ( lAccessMask ));
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, objACE->put_AceType ( lAceFlags ));
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, objACE->put_AceFlags ( lAceType ));
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, objACE->put_Flags ( lFlags ));
|
|
if(bstrTrustee .Length()) __MPC_EXIT_IF_METHOD_FAILS(hr, objACE->put_Trustee ( bstrTrustee ));
|
|
if(bstrObjectType .Length()) __MPC_EXIT_IF_METHOD_FAILS(hr, objACE->put_ObjectType ( bstrObjectType ));
|
|
if(bstrInheritedObjectType.Length()) __MPC_EXIT_IF_METHOD_FAILS(hr, objACE->put_InheritedObjectType( bstrInheritedObjectType ));
|
|
|
|
|
|
hr = S_OK;
|
|
|
|
|
|
__HCP_FUNC_CLEANUP;
|
|
|
|
ReleaseMemory( (void*&)szPrincipal );
|
|
|
|
__HCP_FUNC_EXIT(hr);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
HRESULT CPCHSecurityDescriptorDirect::ConvertACLFromCOM( /*[in ]*/ IPCHAccessControlList* objACL ,
|
|
/*[out]*/ PACL& pACL )
|
|
{
|
|
__HCP_FUNC_ENTRY( "CPCHSecurityDescriptorDirect::ConvertACLFromCOM" );
|
|
|
|
HRESULT hr;
|
|
long lCount;
|
|
long lPos;
|
|
|
|
__MPC_PARAMCHECK_BEGIN(hr)
|
|
__MPC_PARAMCHECK_NOTNULL(objACL);
|
|
__MPC_PARAMCHECK_END();
|
|
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, objACL->get_Count( &lCount ));
|
|
|
|
for(lPos=1; lPos<=lCount; lPos++)
|
|
{
|
|
CComVariant vItem;
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, objACL->get_Item( lPos, &vItem ));
|
|
if(vItem.vt == VT_DISPATCH)
|
|
{
|
|
CComQIPtr<IPCHAccessControlEntry> objACE( vItem.pdispVal );
|
|
|
|
if(objACE)
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, ConvertACEFromCOM( objACE, pACL ));
|
|
}
|
|
}
|
|
}
|
|
|
|
hr = S_OK;
|
|
|
|
|
|
__HCP_FUNC_CLEANUP;
|
|
|
|
__HCP_FUNC_EXIT(hr);
|
|
}
|
|
|
|
HRESULT CPCHSecurityDescriptorDirect::ConvertACLToCOM( /*[in]*/ IPCHAccessControlList* objACL ,
|
|
/*[in]*/ const PACL pACL )
|
|
{
|
|
__HCP_FUNC_ENTRY( "CPCHSecurityDescriptorDirect::ConvertACLToCOM" );
|
|
|
|
HRESULT hr;
|
|
ACL_SIZE_INFORMATION aclSizeInfo;
|
|
|
|
|
|
if(pACL)
|
|
{
|
|
__MPC_EXIT_IF_CALL_RETURNS_FALSE(hr, ::GetAclInformation( pACL, (LPVOID)&aclSizeInfo, sizeof(ACL_SIZE_INFORMATION), AclSizeInformation ));
|
|
|
|
for(DWORD i = 0; i < aclSizeInfo.AceCount; i++)
|
|
{
|
|
CComPtr<CPCHAccessControlEntry> objACE;
|
|
LPVOID pACE;
|
|
|
|
__MPC_EXIT_IF_CALL_RETURNS_FALSE(hr, ::GetAce( pACL, i, (LPVOID*)&pACE ));
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, MPC::CreateInstance( &objACE ));
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, ConvertACEToCOM( objACE, pACE ));
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, objACL->AddAce( objACE ));
|
|
}
|
|
}
|
|
|
|
hr = S_OK;
|
|
|
|
|
|
__HCP_FUNC_CLEANUP;
|
|
|
|
__HCP_FUNC_EXIT(hr);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
HRESULT CPCHSecurityDescriptorDirect::ConvertSDToCOM( IPCHSecurityDescriptor* pObj )
|
|
{
|
|
__HCP_FUNC_ENTRY( "CPCHSecurityDescriptorDirect::ConvertToCOM" );
|
|
|
|
HRESULT hr;
|
|
DWORD dwRevision;
|
|
SECURITY_DESCRIPTOR_CONTROL sdc;
|
|
LPCWSTR szOwner = NULL;
|
|
LPCWSTR szGroup = NULL;
|
|
////////////////////////////////////////
|
|
long lRevision;
|
|
long lControl;
|
|
CComBSTR bstrOwner;
|
|
VARIANT_BOOL fOwnerDefaulted;
|
|
CComBSTR bstrGroup;
|
|
VARIANT_BOOL fGroupDefaulted;
|
|
CComPtr<CPCHAccessControlList> DACL;
|
|
VARIANT_BOOL fDaclDefaulted;
|
|
CComPtr<CPCHAccessControlList> SACL;
|
|
VARIANT_BOOL fSaclDefaulted;
|
|
|
|
__MPC_PARAMCHECK_BEGIN(hr)
|
|
__MPC_PARAMCHECK_NOTNULL(pObj);
|
|
__MPC_PARAMCHECK_END();
|
|
|
|
|
|
//
|
|
// Convert data.
|
|
//
|
|
__MPC_EXIT_IF_CALL_RETURNS_FALSE(hr, ::GetSecurityDescriptorControl( m_pSD, &sdc, &dwRevision ));
|
|
lRevision = dwRevision;
|
|
lControl = sdc;
|
|
|
|
////////////////////
|
|
|
|
if(m_pOwner)
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, ConvertSIDToPrincipal( m_pOwner, &szOwner ));
|
|
|
|
bstrOwner = szOwner;
|
|
}
|
|
fOwnerDefaulted = m_bOwnerDefaulted ? VARIANT_TRUE : VARIANT_FALSE;
|
|
|
|
if(m_pGroup)
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, ConvertSIDToPrincipal( m_pGroup, &szGroup ));
|
|
|
|
bstrGroup = szGroup;
|
|
}
|
|
fGroupDefaulted = m_bGroupDefaulted ? VARIANT_TRUE : VARIANT_FALSE;
|
|
|
|
if(m_pDACL)
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, MPC::CreateInstance( &DACL ));
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, ConvertACLToCOM( DACL, m_pDACL ));
|
|
}
|
|
fDaclDefaulted = m_bDaclDefaulted ? VARIANT_TRUE : VARIANT_FALSE;
|
|
|
|
if(m_pSACL)
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, MPC::CreateInstance( &SACL ));
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, ConvertACLToCOM( SACL, m_pSACL ));
|
|
}
|
|
fSaclDefaulted = m_bSaclDefaulted ? VARIANT_TRUE : VARIANT_FALSE;
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
//
|
|
// Write data.
|
|
//
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pObj->put_Revision ( lRevision ));
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pObj->put_Control ( lControl ));
|
|
if(bstrOwner.Length()) __MPC_EXIT_IF_METHOD_FAILS(hr, pObj->put_Owner ( bstrOwner ));
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pObj->put_OwnerDefaulted ( fOwnerDefaulted ));
|
|
if(bstrGroup.Length()) __MPC_EXIT_IF_METHOD_FAILS(hr, pObj->put_Group ( bstrGroup ));
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pObj->put_GroupDefaulted ( fGroupDefaulted ));
|
|
if(DACL) __MPC_EXIT_IF_METHOD_FAILS(hr, pObj->put_DiscretionaryAcl( DACL ));
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pObj->put_DaclDefaulted ( fDaclDefaulted ));
|
|
if(SACL) __MPC_EXIT_IF_METHOD_FAILS(hr, pObj->put_SystemAcl ( SACL ));
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pObj->put_SaclDefaulted ( fSaclDefaulted ));
|
|
|
|
hr = S_OK;
|
|
|
|
|
|
__HCP_FUNC_CLEANUP;
|
|
|
|
ReleaseMemory( (void*&)szOwner );
|
|
ReleaseMemory( (void*&)szGroup );
|
|
|
|
__HCP_FUNC_EXIT(hr);
|
|
}
|
|
|
|
HRESULT CPCHSecurityDescriptorDirect::ConvertSDFromCOM( IPCHSecurityDescriptor* pObj )
|
|
{
|
|
__HCP_FUNC_ENTRY( "CPCHSecurityDescriptorDirect::ConvertSDFromCOM" );
|
|
|
|
HRESULT hr;
|
|
PSID pOwnerSid = NULL;
|
|
PSID pGroupSid = NULL;
|
|
////////////////////////////////////////
|
|
long lRevision;
|
|
long lControl;
|
|
CComBSTR bstrOwner;
|
|
VARIANT_BOOL fOwnerDefaulted;
|
|
CComBSTR bstrGroup;
|
|
VARIANT_BOOL fGroupDefaulted;
|
|
CComPtr<IPCHAccessControlList> DACL;
|
|
VARIANT_BOOL fDaclDefaulted;
|
|
CComPtr<IPCHAccessControlList> SACL;
|
|
VARIANT_BOOL fSaclDefaulted;
|
|
|
|
__MPC_PARAMCHECK_BEGIN(hr)
|
|
__MPC_PARAMCHECK_NOTNULL(pObj);
|
|
__MPC_PARAMCHECK_END();
|
|
|
|
|
|
//
|
|
// Read data.
|
|
//
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pObj->get_Revision ( &lRevision ));
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pObj->get_Control ( &lControl ));
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pObj->get_Owner ( &bstrOwner ));
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pObj->get_OwnerDefaulted ( &fOwnerDefaulted ));
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pObj->get_Group ( &bstrGroup ));
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pObj->get_GroupDefaulted ( &fGroupDefaulted ));
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pObj->get_DiscretionaryAcl( &DACL ));
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pObj->get_DaclDefaulted ( &fDaclDefaulted ));
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pObj->get_SystemAcl ( &SACL ));
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pObj->get_SaclDefaulted ( &fSaclDefaulted ));
|
|
|
|
|
|
//
|
|
// Convert data.
|
|
//
|
|
if(bstrOwner.Length())
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, ConvertPrincipalToSID( bstrOwner, pOwnerSid ));
|
|
}
|
|
|
|
if(bstrGroup.Length())
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, ConvertPrincipalToSID( bstrGroup, pGroupSid ));
|
|
}
|
|
|
|
|
|
//
|
|
// Write data to security descriptor.
|
|
//
|
|
CleanUp();
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, AllocateMemory( (void*&)m_pSD, sizeof(SECURITY_DESCRIPTOR) ));
|
|
|
|
__MPC_EXIT_IF_CALL_RETURNS_FALSE(hr, ::InitializeSecurityDescriptor( m_pSD, (DWORD)lRevision ));
|
|
|
|
__MPC_EXIT_IF_CALL_RETURNS_FALSE(hr, ::SetSecurityDescriptorControl( m_pSD, s_sdcMask, s_sdcMask & lControl ));
|
|
|
|
////////////////////
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, SetOwner( pOwnerSid, fOwnerDefaulted == VARIANT_TRUE ));
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, SetGroup( pGroupSid, fGroupDefaulted == VARIANT_TRUE ));
|
|
|
|
////////////////////
|
|
|
|
if(DACL)
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, ConvertACLFromCOM( DACL, m_pDACL ));
|
|
}
|
|
__MPC_EXIT_IF_CALL_RETURNS_FALSE(hr, ::SetSecurityDescriptorDacl( m_pSD, m_pDACL ? TRUE : FALSE, m_pDACL, fDaclDefaulted == VARIANT_TRUE ));
|
|
|
|
if(SACL)
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, ConvertACLFromCOM( SACL, m_pSACL ));
|
|
}
|
|
__MPC_EXIT_IF_CALL_RETURNS_FALSE(hr, ::SetSecurityDescriptorSacl( m_pSD, m_pSACL ? TRUE : FALSE, m_pSACL, fSaclDefaulted == VARIANT_TRUE ));
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
hr = S_OK;
|
|
|
|
|
|
__HCP_FUNC_CLEANUP;
|
|
|
|
ReleaseMemory( (void*&)pOwnerSid );
|
|
ReleaseMemory( (void*&)pGroupSid );
|
|
|
|
__HCP_FUNC_EXIT(hr);
|
|
}
|