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

425 lines
9.9 KiB
C++

//---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1995.
//
// File: helpers.cxx
//
// Contents: ADs C Wrappers (Helper functions)
//
// ADsBuildEnumerator
// ADsFreeEnumerator
// ADsEnumerateNext
// ADsBuildVarArrayStr
// ADsBuildVarArrayInt
//
// History:
// 1-March-1995 KrishnaG -- Created
//
//----------------------------------------------------------------------------
#include "oleds.hxx"
#pragma hdrstop
//+---------------------------------------------------------------------------
//
// Function: ADsBuildEnumerator
//
// Synopsis: C wrapper code to create an Enumerator object.
//
// Arguments: [pNetOleCollection] -- The input Collection object.
//
// [ppEnumVariant] -- The created Enumerator object.
//
// Returns: HRESULT
//
//----------------------------------------------------------------------------
HRESULT
ADsBuildEnumerator(
IADsContainer *pADsContainer,
IEnumVARIANT * * ppEnumVariant
)
{
HRESULT hr;
IUnknown *pUnk = NULL;
//
// Get a new enumerator object.
//
hr = pADsContainer->get__NewEnum( &pUnk );
if (FAILED(hr)) {
goto Fail;
}
//
// QueryInterface the IUnknown pointer for an IEnumVARIANT interface,
//
hr = pUnk->QueryInterface(
IID_IEnumVARIANT,
(void FAR* FAR*)ppEnumVariant
);
if (FAILED(hr)) {
goto Fail;
}
//
// Release the IUnknown pointer.
//
pUnk->Release();
return(hr);
Fail:
if (pUnk) {
pUnk->Release();
}
return(hr);
}
//+---------------------------------------------------------------------------
//
// Function: ADsFreeEnumerator
//
// Synopsis: Frees an Enumerator object.
//
// Arguments: [pEnumerator] -- The Enumerator object to be freed.
//
// Returns: HRESULT
//----------------------------------------------------------------------------
HRESULT
ADsFreeEnumerator(
IEnumVARIANT *pEnumVariant
)
{
HRESULT hr = E_ADS_BAD_PARAMETER;
ULONG uRefCount = 0;
if (pEnumVariant) {
uRefCount = pEnumVariant->Release();
return(S_OK);
}
return(hr);
}
//+---------------------------------------------------------------------------
//
// Function: ADsEnumerateNext
//
// Synopsis: C wrapper code for IEnumVARIANT::Next
//
// Arguments: [pEnumVariant] -- Input enumerator object.
//
// [cElements] -- Number of elements to retrieve.
//
// [pvar] -- VARIANT array.
//
// [pcElementFetched] -- Number of elements fetched.
//
// Returns: HRESULT
//
//----------------------------------------------------------------------------
HRESULT
ADsEnumerateNext(
IEnumVARIANT *pEnumVariant,
ULONG cElements,
VARIANT * pvar,
ULONG * pcElementsFetched
)
{
return(pEnumVariant->Next(cElements, pvar, pcElementsFetched));
}
//+---------------------------------------------------------------------------
//
// Function: ADsBuildVarArrayStr
//
// Synopsis: Build a variant array of strings
//
// Arguments: [lppPathNames] -- List of pathnames to be put in the array.
//
// [dwPathNames] -- Number of pathnames in the list.
//
// [ppvar] -- Pointer to a pointer of a Variant array.
//
// Returns: HRESULT
//
//----------------------------------------------------------------------------
HRESULT
ADsBuildVarArrayStr(
LPWSTR * lppPathNames,
DWORD dwPathNames,
VARIANT * pVar
)
{
VARIANT v;
SAFEARRAYBOUND sabNewArray;
DWORD i;
SAFEARRAY *psa = NULL;
HRESULT hr = E_FAIL;
if (!pVar) {
hr = E_ADS_BAD_PARAMETER;
goto Fail;
}
VariantInit(pVar);
sabNewArray.cElements = dwPathNames;
sabNewArray.lLbound = 0;
psa = SafeArrayCreate(VT_VARIANT, 1, &sabNewArray);
if (!psa) {
goto Fail;
}
for (i = 0; i < dwPathNames; i++) {
VariantInit(&v);
V_VT(&v) = VT_BSTR;
V_BSTR(&v) = SysAllocString(*(lppPathNames + i));
hr = SafeArrayPutElement(psa,
(long FAR *)&i,
&v
);
VariantClear( &v );
if (FAILED(hr)) {
goto Fail;
}
}
V_VT(pVar) = VT_ARRAY | VT_VARIANT;
V_ARRAY(pVar) = psa;
return(ResultFromScode(S_OK));
Fail:
if (psa) {
SafeArrayDestroy(psa);
}
return(E_FAIL);
}
//+---------------------------------------------------------------------------
//
// Function: ADsBuildVarArrayInt
//
// Synopsis: Build a variant array of integers
//
// Arguments: [lppObjectTypes] -- List of object types to be put in the array.
//
// [dwObjectTypes] -- Number of object types in the list.
//
// [ppvar] -- Pointer to a pointer of a Variant array.
//
// Returns: HRESULT
//
//----------------------------------------------------------------------------
HRESULT
ADsBuildVarArrayInt(
LPDWORD lpdwObjectTypes,
DWORD dwObjectTypes,
VARIANT * pVar
)
{
VARIANT v;
SAFEARRAYBOUND sabNewArray;
DWORD i;
SAFEARRAY *psa = NULL;
HRESULT hr = E_FAIL;
if (!pVar) {
hr = E_ADS_BAD_PARAMETER;
goto Fail;
}
VariantInit(pVar);
sabNewArray.cElements = dwObjectTypes;
sabNewArray.lLbound = 0;
psa = SafeArrayCreate(VT_VARIANT, 1, &sabNewArray);
if (!psa) {
goto Fail;
}
for (i = 0; i < dwObjectTypes; i++) {
VariantInit(&v);
V_VT(&v) = VT_I4;
V_I4(&v) = *(lpdwObjectTypes + i);
hr = SafeArrayPutElement(psa,
(long FAR *)&i,
&v
);
VariantClear( &v );
if (FAILED(hr)) {
goto Fail;
}
}
V_VT(pVar) = VT_VARIANT | VT_ARRAY;
V_ARRAY(pVar) = psa;
return(ResultFromScode(S_OK));
Fail:
if (psa) {
SafeArrayDestroy(psa);
}
return(E_FAIL);
}
//+---------------------------------------------------------------------------
// Function: BinarySDToSecurityDescriptor.
//
// Synopsis: Convert the given binary blob to an equivalent object
// implementing the IADsSecurityDescriptor interface.
//
// Arguments: pSecurityDescriptor - the binary SD to convert.
// pVarsec - return value.
// pszServerName - serverName the SD was
// retrieved from (optional).
// userName - not used, optional.
// passWord - not used, optional.
// dwFlags - not used, optional.
//
// Returns: HRESULT - S_OK or any failure error code
//
// Modifies: pVarsec to contain a VT_DISPATCH if successful.
//
//----------------------------------------------------------------------------
HRESULT
BinarySDToSecurityDescriptor(
PSECURITY_DESCRIPTOR pSecurityDescriptor,
VARIANT *pVarsec,
LPCWSTR pszServerName, // defaulted to NULL
LPCWSTR userName, // defaulted to NULL
LPCWSTR passWord, // defaulted to NULL
DWORD dwFlags // defaulted to 0
)
{
CCredentials creds((LPWSTR)userName, (LPWSTR)passWord, dwFlags);
//
// Call internal routine in sec2var.cxx that does all the work.
//
RRETURN(ConvertSecDescriptorToVariant(
(LPWSTR)pszServerName,
creds,
pSecurityDescriptor,
pVarsec,
TRUE // we will always expect NT format.
)
);
}
//+---------------------------------------------------------------------------
// Function: SecurityDescriptorToBinarySD.
//
// Synopsis: Convert the given IADsSecurityDescriptor to (in the variant
// to a binary security descriptor blob.
//
// Arguments: vVarSecDes - the binary SD to convert.
// ppSecurityDescriptor - ptr to output binary blob.
// pszServerName - serverName the SD
// is being put on, optional.
// userName - not used, optional.
// passWord - not used, optional.
// dwFlags - not used, optional.
//
// Returns: HRESULT - S_OK or any failure error code
//
// Modifies: pVarsec to contain a VT_DISPATCH if successful.
//
//----------------------------------------------------------------------------
HRESULT
SecurityDescriptorToBinarySD(
VARIANT vVarSecDes,
PSECURITY_DESCRIPTOR * ppSecurityDescriptor,
PDWORD pdwSDLength,
LPCWSTR pszServerName, // defaulted to NULL
LPCWSTR userName, // defaulted to NULL
LPCWSTR passWord, // defaulted to NULL
DWORD dwFlags // defaulted to 0
)
{
HRESULT hr = E_FAIL;
IADsSecurityDescriptor *pIADsSecDesc = NULL;
CCredentials creds((LPWSTR)userName, (LPWSTR)passWord, dwFlags);
//
// Verify it is a VT_DISPATCH and also that ptr is valid.
//
if ((vVarSecDes.vt != VT_DISPATCH)
|| (!V_DISPATCH(&vVarSecDes))
) {
BAIL_ON_FAILURE(hr);
}
//
// Get the interface ptr from the variant (it has to be IDispatch)
//
hr = vVarSecDes.pdispVal->QueryInterface(
IID_IADsSecurityDescriptor,
(void **) &pIADsSecDesc
);
BAIL_ON_FAILURE(hr);
//
// Call the helper routine in sec2var.cxx
//
hr = ConvertSecurityDescriptorToSecDes(
(LPWSTR)pszServerName,
creds,
pIADsSecDesc,
ppSecurityDescriptor,
pdwSDLength,
TRUE // always NT Sec desc mode
);
error:
if (pIADsSecDesc) {
pIADsSecDesc->Release();
}
RRETURN(hr);
}
// end of helpers.cxx