windows-nt/Source/XPSP1/NT/admin/snapin/mtfrmwk/aclpag_.cpp
2020-09-26 16:20:57 +08:00

413 lines
10 KiB
C++

//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1998 - 1999
//
// File: aclpag_.cpp
//
//--------------------------------------------------------------------------
#include <aclpage.h>
#include <dssec.h>
///////////////////////////////////////////////////////////////////////
// CDynamicLibraryBase
class CDynamicLibraryBase
{
public:
CDynamicLibraryBase()
{
m_lpszLibraryName = NULL;
m_lpszFunctionName = NULL;
m_lpszFunctionNameEx = NULL;
m_hLibrary = NULL;
m_pfFunction = NULL;
m_pfFunctionEx = NULL;
}
virtual ~CDynamicLibraryBase()
{
if (m_hLibrary != NULL)
{
::FreeLibrary(m_hLibrary);
m_hLibrary = NULL;
}
}
BOOL Load()
{
if (m_hLibrary != NULL)
return TRUE; // already loaded
ASSERT(m_lpszLibraryName != NULL);
m_hLibrary = ::LoadLibrary(m_lpszLibraryName);
if (NULL == m_hLibrary)
{
// The library is not present
return FALSE;
}
ASSERT(m_lpszFunctionName != NULL);
ASSERT(m_pfFunction == NULL);
m_pfFunction = ::GetProcAddress(m_hLibrary, m_lpszFunctionName );
if ( NULL == m_pfFunction )
{
// The library is present but does not have the entry point
::FreeLibrary( m_hLibrary );
m_hLibrary = NULL;
return FALSE;
}
if (m_lpszFunctionNameEx != NULL)
{
ASSERT(m_pfFunctionEx == NULL);
m_pfFunctionEx = ::GetProcAddress(m_hLibrary, m_lpszFunctionNameEx);
if ( NULL == m_pfFunctionEx)
{
::FreeLibrary( m_hLibrary );
m_hLibrary = NULL;
return FALSE;
}
}
ASSERT(m_hLibrary != NULL);
ASSERT(m_pfFunction != NULL);
return TRUE;
}
protected:
LPCSTR m_lpszFunctionName;
LPCSTR m_lpszFunctionNameEx;
LPCTSTR m_lpszLibraryName;
FARPROC m_pfFunction;
FARPROC m_pfFunctionEx;
HMODULE m_hLibrary;
};
///////////////////////////////////////////////////////////////////////
// CDsSecDLL
class CDsSecDLL : public CDynamicLibraryBase
{
public:
CDsSecDLL()
{
m_lpszLibraryName = _T("dssec.dll");
m_lpszFunctionName = "DSCreateISecurityInfoObject";
m_lpszFunctionNameEx = "DSCreateISecurityInfoObjectEx";
}
HRESULT DSCreateISecurityInfoObject(LPCWSTR pwszObjectPath, // in
LPCWSTR pwszObjectClass, // in
LPSECURITYINFO* ppISecurityInfo // out
);
HRESULT DSCreateISecurityInfoObjectEx(LPCWSTR pwszObjectPath, // in
LPCWSTR pwszObjectClass, // in
LPCWSTR pwszServer, // in
LPCWSTR pwszUsername, // in
LPCWSTR pwszPassword, // in
DWORD dwFlags,
LPSECURITYINFO* ppISecurityInfo // out
);
};
HRESULT CDsSecDLL::DSCreateISecurityInfoObject(LPCWSTR pwszObjectPath, // in
LPCWSTR pwszObjectClass, // in
LPSECURITYINFO* ppISecurityInfo // out
)
{
ASSERT(m_hLibrary != NULL);
ASSERT(m_pfFunction != NULL);
return ((PFNDSCREATEISECINFO)m_pfFunction)
(pwszObjectPath,pwszObjectClass, 0, ppISecurityInfo, NULL, NULL, 0);
}
HRESULT CDsSecDLL::DSCreateISecurityInfoObjectEx(LPCWSTR pwszObjectPath, // in
LPCWSTR pwszObjectClass, // in
LPCWSTR pwszServer, // in
LPCWSTR pwszUsername, // in
LPCWSTR pwszPassword, // in
DWORD dwFlags,
LPSECURITYINFO* ppISecurityInfo // out
)
{
ASSERT(m_hLibrary != NULL);
ASSERT(m_pfFunctionEx != NULL);
return ((PFNDSCREATEISECINFOEX)m_pfFunctionEx)
(pwszObjectPath,pwszObjectClass, pwszServer,
pwszUsername, pwszPassword, dwFlags, ppISecurityInfo, NULL, NULL, 0);
}
///////////////////////////////////////////////////////////////////////
// CAclUiDLL
class CAclUiDLL : public CDynamicLibraryBase
{
public:
CAclUiDLL()
{
m_lpszLibraryName = _T("aclui.dll");
m_lpszFunctionName = "CreateSecurityPage";
m_pfFunction = NULL;
m_lpszFunctionNameEx = NULL;
m_pfFunctionEx = NULL;
}
HPROPSHEETPAGE CreateSecurityPage( LPSECURITYINFO psi );
};
typedef HPROPSHEETPAGE (*ACLUICREATESECURITYPAGEPROC) (LPSECURITYINFO);
HPROPSHEETPAGE CAclUiDLL::CreateSecurityPage( LPSECURITYINFO psi )
{
ASSERT(m_hLibrary != NULL);
ASSERT(m_pfFunction != NULL);
return ((ACLUICREATESECURITYPAGEPROC)m_pfFunction) (psi);
}
//////////////////////////////////////////////////////////////////////////
// CISecurityInformationWrapper
class CISecurityInformationWrapper : public ISecurityInformation
{
public:
CISecurityInformationWrapper(CAclEditorPage* pAclEditorPage)
{
m_dwRefCount = 0;
ASSERT(pAclEditorPage != NULL);
m_pAclEditorPage = pAclEditorPage;
m_pISecInfo = NULL;
}
~CISecurityInformationWrapper()
{
ASSERT(m_dwRefCount == 0);
ISecurityInformation* pSecInfo = GetSecInfoPtr();
if (pSecInfo != NULL)
pSecInfo->Release();
}
void SetSecInfoPtr(ISecurityInformation* pSecInfo)
{
ASSERT(pSecInfo != NULL);
m_pISecInfo = pSecInfo;
}
ISecurityInformation* GetSecInfoPtr()
{
return m_pISecInfo;
}
public:
// *** IUnknown methods ***
STDMETHOD(QueryInterface) (REFIID riid, LPVOID * ppvObj)
{
return GetSecInfoPtr()->QueryInterface(riid, ppvObj);
}
STDMETHOD_(ULONG,AddRef) ()
{
// trap the first addref to increment count on page holder
if (m_dwRefCount == 0)
{
m_pAclEditorPage->m_pPageHolder->AddRef();
}
m_dwRefCount++;
return GetSecInfoPtr()->AddRef();
}
STDMETHOD_(ULONG,Release) ()
{
m_dwRefCount--;
// this might be the last release on the page holder
// which would cause the holder to delete itself and
// "this" in the process (i.e. "this" no more valid when
// returning from the m_pPageHolder->Release() call
ISecurityInformation* pISecInfo = GetSecInfoPtr();
// trap the last release to decrement count on page holder
if (m_dwRefCount == 0)
{
m_pAclEditorPage->m_pPageHolder->Release();
}
return pISecInfo->Release();
}
// *** ISecurityInformation methods ***
STDMETHOD(GetObjectInformation) (PSI_OBJECT_INFO pObjectInfo )
{
return GetSecInfoPtr()->GetObjectInformation(pObjectInfo);
}
STDMETHOD(GetSecurity) (SECURITY_INFORMATION RequestedInformation,
PSECURITY_DESCRIPTOR *ppSecurityDescriptor,
BOOL fDefault)
{
return GetSecInfoPtr()->GetSecurity(RequestedInformation,
ppSecurityDescriptor,
fDefault);
}
STDMETHOD(SetSecurity) (SECURITY_INFORMATION SecurityInformation,
PSECURITY_DESCRIPTOR pSecurityDescriptor )
{
return GetSecInfoPtr()->SetSecurity(SecurityInformation,
pSecurityDescriptor);
}
STDMETHOD(GetAccessRights) (const GUID* pguidObjectType,
DWORD dwFlags, // SI_EDIT_AUDITS, SI_EDIT_PROPERTIES
PSI_ACCESS *ppAccess,
ULONG *pcAccesses,
ULONG *piDefaultAccess )
{
return GetSecInfoPtr()->GetAccessRights(pguidObjectType,
dwFlags,
ppAccess,
pcAccesses,
piDefaultAccess);
}
STDMETHOD(MapGeneric) (const GUID *pguidObjectType,
UCHAR *pAceFlags,
ACCESS_MASK *pMask)
{
return GetSecInfoPtr()->MapGeneric(pguidObjectType,
pAceFlags,
pMask);
}
STDMETHOD(GetInheritTypes) (PSI_INHERIT_TYPE *ppInheritTypes,
ULONG *pcInheritTypes )
{
return GetSecInfoPtr()->GetInheritTypes(ppInheritTypes,
pcInheritTypes);
}
STDMETHOD(PropertySheetPageCallback)(HWND hwnd, UINT uMsg, SI_PAGE_TYPE uPage )
{
return GetSecInfoPtr()->PropertySheetPageCallback(hwnd, uMsg, uPage);
}
private:
DWORD m_dwRefCount;
ISecurityInformation* m_pISecInfo; // interface pointer to the wrapped interface
CAclEditorPage* m_pAclEditorPage; // back pointer
//friend class CAclEditorPage;
};
//////////////////////////////////////////////////////////////////////////
// static instances of the dynamically loaded DLL's
CDsSecDLL g_DsSecDLL;
CAclUiDLL g_AclUiDLL;
//////////////////////////////////////////////////////////////////////////
// CAclEditorPage
CAclEditorPage* CAclEditorPage::CreateInstance(LPCTSTR lpszLDAPPath,
CPropertyPageHolderBase* pPageHolder)
{
CAclEditorPage* pAclEditorPage = new CAclEditorPage;
if (pAclEditorPage != NULL)
{
pAclEditorPage->SetHolder(pPageHolder);
if (FAILED(pAclEditorPage->Initialize(lpszLDAPPath)))
{
delete pAclEditorPage;
pAclEditorPage = NULL;
}
}
return pAclEditorPage;
}
CAclEditorPage* CAclEditorPage::CreateInstanceEx(LPCTSTR lpszLDAPPath,
LPCTSTR lpszServer,
LPCTSTR lpszUsername,
LPCTSTR lpszPassword,
DWORD dwFlags,
CPropertyPageHolderBase* pPageHolder)
{
CAclEditorPage* pAclEditorPage = new CAclEditorPage;
if (pAclEditorPage != NULL)
{
pAclEditorPage->SetHolder(pPageHolder);
if (FAILED(pAclEditorPage->InitializeEx(lpszLDAPPath,
lpszServer,
lpszUsername,
lpszPassword,
dwFlags)))
{
delete pAclEditorPage;
pAclEditorPage = NULL;
}
}
return pAclEditorPage;
}
CAclEditorPage::CAclEditorPage()
{
m_pPageHolder = NULL;
m_pISecInfoWrap = new CISecurityInformationWrapper(this);
}
CAclEditorPage::~CAclEditorPage()
{
delete m_pISecInfoWrap;
}
HRESULT CAclEditorPage::Initialize(LPCTSTR lpszLDAPPath)
{
// get ISecurityInfo* from DSSECL.DLL
if (!g_DsSecDLL.Load())
return E_INVALIDARG;
ISecurityInformation* pSecInfo = NULL;
HRESULT hr = g_DsSecDLL.DSCreateISecurityInfoObject(
lpszLDAPPath,
NULL, // pwszObjectClass
&pSecInfo);
if (SUCCEEDED(hr))
m_pISecInfoWrap->SetSecInfoPtr(pSecInfo);
return hr;
}
HRESULT CAclEditorPage::InitializeEx(LPCTSTR lpszLDAPPath,
LPCTSTR lpszServer,
LPCTSTR lpszUsername,
LPCTSTR lpszPassword,
DWORD dwFlags)
{
// get ISecurityInfo* from DSSECL.DLL
if (!g_DsSecDLL.Load())
return E_INVALIDARG;
ISecurityInformation* pSecInfo = NULL;
HRESULT hr = g_DsSecDLL.DSCreateISecurityInfoObjectEx(
lpszLDAPPath,
NULL, // pwszObjectClass
lpszServer,
lpszUsername,
lpszPassword,
dwFlags,
&pSecInfo);
if (SUCCEEDED(hr))
m_pISecInfoWrap->SetSecInfoPtr(pSecInfo);
return hr;
}
HPROPSHEETPAGE CAclEditorPage::CreatePage()
{
if (!g_AclUiDLL.Load())
return NULL;
// call into ACLUI.DLL to create the page
// passing the wrapper interface
return g_AclUiDLL.CreateSecurityPage(m_pISecInfoWrap);
}