windows-nt/Source/XPSP1/NT/ds/adsi/nds/var2sec.cxx
2020-09-26 16:20:57 +08:00

240 lines
5 KiB
C++

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1995.
//
// File: libmain.cxx
//
// Contents: LibMain for nds.dll
//
// Functions: LibMain, DllGetClassObject
//
// History: 25-Oct-94 KrishnaG Created.
//
//----------------------------------------------------------------------------
#include "nds.hxx"
#pragma hdrstop
HRESULT
ConvertSecDesToNDSAclVarArray(
IADsSecurityDescriptor *pSecDes,
PVARIANT pvarNDSAcl
)
{
IADsAccessControlList FAR * pDiscAcl = NULL;
IDispatch FAR * pDispatch = NULL;
HRESULT hr = S_OK;
hr = pSecDes->get_DiscretionaryAcl(
&pDispatch
);
BAIL_ON_FAILURE(hr);
if (!pDispatch) {
hr = E_FAIL;
goto error;
}
hr = pDispatch->QueryInterface(
IID_IADsAccessControlList,
(void **)&pDiscAcl
);
BAIL_ON_FAILURE(hr);
hr = ConvertAccessControlListToNDSAclVarArray(
pDiscAcl,
pvarNDSAcl
);
BAIL_ON_FAILURE(hr);
error:
if (pDispatch) {
pDispatch->Release();
}
if (pDiscAcl) {
pDiscAcl->Release();
}
RRETURN(hr);
}
HRESULT
ConvertAccessControlListToNDSAclVarArray(
IADsAccessControlList FAR * pAccessList,
PVARIANT pvarNDSAcl
)
{
IUnknown * pUnknown = NULL;
IEnumVARIANT * pEnumerator = NULL;
HRESULT hr = S_OK;
DWORD i = 0;
VARIANT varAce;
DWORD dwAceCount = 0;
DWORD cReturned = 0;
IADsAccessControlEntry FAR * pAccessControlEntry = NULL;
VARIANT varNDSAce;
SAFEARRAY *aList = NULL;
SAFEARRAYBOUND aBound;
hr = pAccessList->get_AceCount((long *)&dwAceCount);
BAIL_ON_FAILURE(hr);
hr = pAccessList->get__NewEnum(
&pUnknown
);
BAIL_ON_FAILURE(hr);
hr = pUnknown->QueryInterface(
IID_IEnumVARIANT,
(void FAR * FAR *)&pEnumerator
);
BAIL_ON_FAILURE(hr);
VariantInit(pvarNDSAcl);
aBound.lLbound = 0;
aBound.cElements = dwAceCount;
aList = SafeArrayCreate( VT_VARIANT, 1, &aBound );
if ( aList == NULL )
{
hr = E_OUTOFMEMORY;
BAIL_ON_FAILURE(hr);
}
for (i = 0; i < dwAceCount; i++) {
VariantInit(&varAce);
hr = pEnumerator->Next(
1,
&varAce,
&cReturned
);
CONTINUE_ON_FAILURE(hr);
hr = (V_DISPATCH(&varAce))->QueryInterface(
IID_IADsAccessControlEntry,
(void **)&pAccessControlEntry
);
CONTINUE_ON_FAILURE(hr);
hr = ConvertAccessControlEntryToAceVariant(
pAccessControlEntry,
&varNDSAce
);
CONTINUE_ON_FAILURE(hr);
//
// Add the NDSAce into your Safe Array
//
hr = SafeArrayPutElement( aList, (long*)&i, &varNDSAce );
VariantClear(&varAce);
if (pAccessControlEntry) {
pAccessControlEntry->Release();
pAccessControlEntry = NULL;
}
//dwCount++;
}
//
// Return the Safe Array back to the caller
//
V_VT(pvarNDSAcl) = VT_ARRAY | VT_VARIANT;
V_ARRAY(pvarNDSAcl) = aList;
if (pUnknown) {
pUnknown->Release();
}
if (pEnumerator) {
pEnumerator->Release();
}
RRETURN(hr);
error:
if ( aList ) {
SafeArrayDestroy( aList );
}
if (pUnknown) {
pUnknown->Release();
}
if (pEnumerator) {
pEnumerator->Release();
}
RRETURN(hr);
}
HRESULT
ConvertAccessControlEntryToAceVariant(
IADsAccessControlEntry * pAccessControlEntry,
PVARIANT pvarNDSAce
)
{
HRESULT hr = S_OK;
BSTR bstrTrustee = NULL;
BSTR bstrObjectTypeClsid = NULL;
IADsAcl * pSecDes = NULL;
IDispatch * pDispatch = NULL;
DWORD dwAccessMask;
VariantInit(pvarNDSAce);
hr = pAccessControlEntry->get_Trustee(&bstrTrustee);
BAIL_ON_FAILURE(hr);
hr = pAccessControlEntry->get_AccessMask((long *)&dwAccessMask);
BAIL_ON_FAILURE(hr);
hr = pAccessControlEntry->get_ObjectType(&bstrObjectTypeClsid);
BAIL_ON_FAILURE(hr);
hr = CAcl::CreateSecurityDescriptor(
IID_IADsAcl,
(void **)&pSecDes
);
BAIL_ON_FAILURE(hr);
hr = pSecDes->put_SubjectName(bstrTrustee);
BAIL_ON_FAILURE(hr);
hr = pSecDes->put_ProtectedAttrName(bstrObjectTypeClsid);
BAIL_ON_FAILURE(hr);
hr = pSecDes->put_Privileges(dwAccessMask);
BAIL_ON_FAILURE(hr);
hr = pSecDes->QueryInterface(IID_IDispatch, (void**)&pDispatch);
BAIL_ON_FAILURE(hr);
V_VT(pvarNDSAce) = VT_DISPATCH;
V_DISPATCH(pvarNDSAce) = pDispatch;
error:
if (pSecDes) {
pSecDes->Release();
}
RRETURN(hr);
}