245 lines
5.6 KiB
C++
245 lines
5.6 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
|
|
ConvertNDSAclVArrayToSecDesVar(
|
|
PVARIANT pVarArrayNDSAcl,
|
|
PVARIANT pVarSecDes
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
IADsSecurityDescriptor * pSecDes = NULL;
|
|
IDispatch * pDispatch = NULL;
|
|
VARIANT varDACL;
|
|
|
|
VariantInit(pVarSecDes);
|
|
memset(&varDACL, 0, sizeof(VARIANT));
|
|
|
|
hr = ConvertNDSAclVArrayToAclVariant(
|
|
pVarArrayNDSAcl,
|
|
&varDACL
|
|
);
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
hr = CoCreateInstance(
|
|
CLSID_SecurityDescriptor,
|
|
NULL,
|
|
CLSCTX_INPROC_SERVER,
|
|
IID_IADsSecurityDescriptor,
|
|
(void **)&pSecDes
|
|
);
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
hr = pSecDes->put_DiscretionaryAcl(V_DISPATCH(&varDACL));
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
hr = pSecDes->QueryInterface(IID_IDispatch, (void**)&pDispatch);
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
V_VT(pVarSecDes) = VT_DISPATCH;
|
|
V_DISPATCH(pVarSecDes) = pDispatch;
|
|
|
|
error:
|
|
|
|
if (pSecDes) {
|
|
pSecDes->Release();
|
|
}
|
|
|
|
VariantClear(&varDACL);
|
|
|
|
RRETURN(hr);
|
|
}
|
|
|
|
|
|
|
|
|
|
HRESULT
|
|
ConvertNDSAclVArrayToAclVariant(
|
|
PVARIANT pVarArrayNDSACL,
|
|
PVARIANT pVarACL
|
|
)
|
|
{
|
|
IADsAccessControlList *pAccessControlList = NULL;
|
|
IDispatch *pDispatch = NULL;
|
|
VARIANT *pVarArray = NULL;
|
|
VARIANT varAce;
|
|
DWORD i = 0;
|
|
HRESULT hr = S_OK;
|
|
DWORD dwNumValues = 0;
|
|
DWORD dwNewAceCount = 0;
|
|
|
|
VariantInit(pVarACL);
|
|
|
|
hr = CoCreateInstance(
|
|
CLSID_AccessControlList,
|
|
NULL,
|
|
CLSCTX_INPROC_SERVER,
|
|
IID_IADsAccessControlList,
|
|
(void **)&pAccessControlList
|
|
);
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
hr = ConvertSafeArrayToVariantArray(
|
|
*pVarArrayNDSACL,
|
|
&pVarArray,
|
|
&dwNumValues
|
|
);
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
for (i = 0; i < dwNumValues; i++) {
|
|
hr = ConvertNDSAclVariantToAceVariant(
|
|
&(pVarArray[i]),
|
|
(PVARIANT)&varAce
|
|
);
|
|
|
|
hr = pAccessControlList->AddAce(V_DISPATCH(&varAce));
|
|
if (SUCCEEDED(hr)) {
|
|
dwNewAceCount++;
|
|
}
|
|
|
|
VariantClear(&varAce);
|
|
}
|
|
|
|
pAccessControlList->put_AceCount(dwNewAceCount);
|
|
|
|
hr = pAccessControlList->QueryInterface(
|
|
IID_IDispatch,
|
|
(void **)&pDispatch
|
|
);
|
|
V_VT(pVarACL) = VT_DISPATCH;
|
|
V_DISPATCH(pVarACL) = pDispatch;
|
|
|
|
error:
|
|
|
|
if (pAccessControlList) {
|
|
pAccessControlList->Release();
|
|
}
|
|
|
|
if (pVarArray) {
|
|
|
|
for (DWORD i=0; i < dwNumValues; i++) {
|
|
VariantClear(&(pVarArray[i]));
|
|
}
|
|
FreeADsMem(pVarArray);
|
|
}
|
|
RRETURN(hr);
|
|
}
|
|
|
|
|
|
|
|
HRESULT
|
|
ConvertNDSAclVariantToAceVariant(
|
|
PVARIANT pvarNDSAce,
|
|
PVARIANT pvarAce
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
IADsAccessControlEntry *pAccessControlEntry = NULL;
|
|
IDispatch *pDispatch = NULL;
|
|
IADsAcl *pSecDes = NULL;
|
|
DWORD dwPrivileges = 0;
|
|
BSTR bstrProtectedAttrName = NULL;
|
|
BSTR bstrSubjectName = NULL;
|
|
|
|
if (V_VT(pvarNDSAce) != VT_DISPATCH){
|
|
hr = E_FAIL;
|
|
BAIL_ON_FAILURE(hr);
|
|
}
|
|
|
|
pDispatch = V_DISPATCH(pvarNDSAce);
|
|
|
|
hr = pDispatch->QueryInterface(
|
|
IID_IADsAcl,
|
|
(void **)&pSecDes
|
|
);
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
hr = pSecDes->get_ProtectedAttrName(
|
|
&bstrProtectedAttrName
|
|
);
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
hr = pSecDes->get_SubjectName(
|
|
&bstrSubjectName
|
|
);
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
hr = pSecDes->get_Privileges(
|
|
(LONG *)&dwPrivileges);
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
VariantInit(pvarAce);
|
|
|
|
hr = CoCreateInstance(
|
|
CLSID_AccessControlEntry,
|
|
NULL,
|
|
CLSCTX_INPROC_SERVER,
|
|
IID_IADsAccessControlEntry,
|
|
(void **)&pAccessControlEntry
|
|
);
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
hr = pAccessControlEntry->put_AccessMask(dwPrivileges);
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
hr = pAccessControlEntry->put_Trustee(bstrSubjectName);
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
hr = pAccessControlEntry->put_ObjectType(bstrProtectedAttrName);
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
|
|
hr = pAccessControlEntry->QueryInterface(
|
|
IID_IDispatch,
|
|
(void **)&pDispatch
|
|
);
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
V_DISPATCH(pvarAce) = pDispatch;
|
|
V_VT(pvarAce) = VT_DISPATCH;
|
|
|
|
cleanup:
|
|
|
|
if (pSecDes) {
|
|
pSecDes->Release();
|
|
}
|
|
|
|
if (pAccessControlEntry) {
|
|
pAccessControlEntry->Release();
|
|
}
|
|
|
|
if (bstrSubjectName) {
|
|
ADsFreeString(bstrSubjectName);
|
|
}
|
|
|
|
if (bstrProtectedAttrName) {
|
|
ADsFreeString(bstrProtectedAttrName);
|
|
}
|
|
|
|
RRETURN(hr);
|
|
|
|
|
|
error:
|
|
|
|
if (pDispatch) {
|
|
pDispatch->Release();
|
|
}
|
|
|
|
goto cleanup;
|
|
}
|