You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
490 lines
13 KiB
490 lines
13 KiB
//+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation 1996-2001.
|
|
//
|
|
// File: attrprop.cpp
|
|
//
|
|
// Contents: implementation of code for adding property pages
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
#include "stdafx.h"
|
|
#include "wsecmgr.h"
|
|
#include "resource.h"
|
|
#include <accctrl.h>
|
|
#include "servperm.h"
|
|
#include "stdafx.h"
|
|
#include "wsecmgr.h"
|
|
#include "snapmgr.h"
|
|
#include "util.h"
|
|
#include "UIThread.h"
|
|
#include "attr.h"
|
|
#include "aaudit.h"
|
|
#include "aenable.h"
|
|
#include "AMember.h"
|
|
#include "anumber.h"
|
|
#include "AObject.h"
|
|
#include "ARet.h"
|
|
#include "ARight.h"
|
|
#include "aservice.h"
|
|
#include "astring.h"
|
|
#include "CAudit.h"
|
|
#include "CEnable.h"
|
|
#include "CGroup.h"
|
|
#include "CName.h"
|
|
#include "CNumber.h"
|
|
#include "cobject.h"
|
|
#include "CPrivs.h"
|
|
#include "CRet.h"
|
|
#include "cservice.h"
|
|
#include "regvldlg.h"
|
|
#include "perfanal.h"
|
|
#include "applcnfg.h"
|
|
#include "wrapper.h"
|
|
#include "locdesc.h"
|
|
#include "profdesc.h"
|
|
#include "newprof.h"
|
|
#include "laudit.h"
|
|
#include "lenable.h"
|
|
#include "lret.h"
|
|
#include "lnumber.h"
|
|
#include "lstring.h"
|
|
#include "lright.h"
|
|
#include "achoice.h"
|
|
#include "cchoice.h"
|
|
#include "lchoice.h"
|
|
#include "dattrs.h"
|
|
#include "lflags.h"
|
|
#include "aflags.h"
|
|
#include "multisz.h"
|
|
#include "precpage.h"
|
|
|
|
//+--------------------------------------------------------------------------
|
|
//
|
|
// Function: CloneAttrDialog
|
|
//
|
|
// Synopsis: Create a new CAttribute object of the appropriate class for
|
|
// the type and pData passed in
|
|
//
|
|
// Arguments: [type] - The type of data the CAttribute will represent
|
|
// [pData] - More information about the CAttribute
|
|
// [bGP] - True to use CDomain* instead of CConfig* dialogs
|
|
//
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
CAttribute *CloneAttrDialog(CResult *pData, BOOL bGP)
|
|
{
|
|
switch(pData->GetType())
|
|
{
|
|
case ITEM_ANAL_SERV:
|
|
return new CAnalysisService;
|
|
|
|
case ITEM_B2ON:
|
|
return new CAttrAudit;
|
|
|
|
case ITEM_BON:
|
|
case ITEM_BOOL:
|
|
return new CAttrEnable (0);
|
|
|
|
case ITEM_FILESD:
|
|
case ITEM_REGSD:
|
|
return new CAttrObject;
|
|
|
|
case ITEM_DW:
|
|
return new CAttrNumber (0);
|
|
|
|
case ITEM_GROUP:
|
|
// PropertySheet based
|
|
break;
|
|
|
|
case ITEM_PRIVS:
|
|
return new CAttrRight;
|
|
|
|
case ITEM_PROF_B2ON:
|
|
return bGP ? new CDomainAudit : new CConfigAudit (0);
|
|
|
|
case ITEM_PROF_BOOL:
|
|
return bGP ? new CDomainEnable : new CConfigEnable (0);
|
|
|
|
case ITEM_PROF_FILESD:
|
|
case ITEM_PROF_REGSD:
|
|
return bGP ? new CDomainObject : new CConfigObject (0);
|
|
|
|
case ITEM_PROF_DW:
|
|
return bGP ? new CDomainNumber : new CConfigNumber (0);
|
|
|
|
case ITEM_PROF_GROUP:
|
|
return bGP ? new CDomainGroup : new CConfigGroup (0);
|
|
|
|
case ITEM_PROF_PRIVS:
|
|
return bGP ? new CDomainPrivs : new CConfigPrivs (0);
|
|
|
|
case ITEM_PROF_REGVALUE:
|
|
switch(pData->GetID())
|
|
{
|
|
case SCE_REG_DISPLAY_NUMBER:
|
|
return bGP ? new CDomainRegNumber : new CConfigRegNumber (0);
|
|
|
|
case SCE_REG_DISPLAY_STRING:
|
|
return bGP ? new CDomainRegString(0) : new CConfigRegString (0); //Raid #381309, 4/31/2001
|
|
|
|
case SCE_REG_DISPLAY_FLAGS:
|
|
return bGP ? new CDomainRegFlags : new CConfigRegFlags (0);
|
|
|
|
case SCE_REG_DISPLAY_CHOICE:
|
|
return bGP ? new CDomainChoice : new CConfigChoice (0);
|
|
|
|
case SCE_REG_DISPLAY_MULTISZ:
|
|
if ( bGP )
|
|
return new CDomainRegMultiSZ;
|
|
else
|
|
return new CConfigRegMultiSZ;
|
|
|
|
default:
|
|
return bGP ? new CDomainRegEnable : new CConfigRegEnable (0);
|
|
}
|
|
|
|
case ITEM_PROF_RET:
|
|
return bGP ? new CDomainRet : new CConfigRet (0);
|
|
|
|
case ITEM_PROF_SERV:
|
|
return bGP ? new CDomainService : new CConfigService (0);
|
|
|
|
case ITEM_PROF_SZ:
|
|
return bGP ? new CDomainName : new CConfigName (0);
|
|
|
|
case ITEM_REGVALUE:
|
|
switch (pData->GetID())
|
|
{
|
|
case SCE_REG_DISPLAY_NUMBER:
|
|
return new CAttrRegNumber;
|
|
|
|
case SCE_REG_DISPLAY_STRING:
|
|
return new CAttrRegString (0);
|
|
|
|
case SCE_REG_DISPLAY_CHOICE:
|
|
return new CAttrChoice;
|
|
|
|
case SCE_REG_DISPLAY_FLAGS:
|
|
return new CAttrRegFlags;
|
|
|
|
case SCE_REG_DISPLAY_MULTISZ:
|
|
return new CAttrRegMultiSZ;
|
|
|
|
default:
|
|
return new CAttrRegEnable;
|
|
}
|
|
|
|
case ITEM_RET:
|
|
return new CAttrRet (0);
|
|
|
|
case ITEM_SZ:
|
|
return new CAttrString (0);
|
|
|
|
case ITEM_LOCALPOL_RET:
|
|
return new CLocalPolRet;
|
|
|
|
case ITEM_LOCALPOL_SZ:
|
|
return new CLocalPolString;
|
|
|
|
case ITEM_LOCALPOL_B2ON:
|
|
return new CLocalPolAudit;
|
|
|
|
case ITEM_LOCALPOL_BON:
|
|
case ITEM_LOCALPOL_BOOL:
|
|
return new CLocalPolEnable;
|
|
|
|
case ITEM_LOCALPOL_DW:
|
|
return new CLocalPolNumber;
|
|
|
|
case ITEM_LOCALPOL_PRIVS:
|
|
return new CLocalPolRight;
|
|
|
|
case ITEM_LOCALPOL_REGVALUE:
|
|
switch (pData->GetID())
|
|
{
|
|
case SCE_REG_DISPLAY_NUMBER:
|
|
return new CLocalPolRegNumber;
|
|
|
|
case SCE_REG_DISPLAY_STRING:
|
|
return new CLocalPolRegString (0);
|
|
|
|
case SCE_REG_DISPLAY_MULTISZ:
|
|
return new CLocalPolRegMultiSZ;
|
|
|
|
case SCE_REG_DISPLAY_CHOICE:
|
|
return new CLocalPolChoice;
|
|
|
|
case SCE_REG_DISPLAY_FLAGS:
|
|
return new CLocalPolRegFlags;
|
|
|
|
default:
|
|
return new CLocalPolRegEnable;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
BOOL IsPointerType(CResult *pData)
|
|
{
|
|
switch (pData->GetType())
|
|
{
|
|
case ITEM_LOCALPOL_PRIVS:
|
|
case ITEM_LOCALPOL_SZ:
|
|
return TRUE;
|
|
|
|
case ITEM_REGVALUE:
|
|
switch (pData->GetID())
|
|
{
|
|
case SCE_REG_DISPLAY_STRING:
|
|
case SCE_REG_DISPLAY_MULTISZ:
|
|
return TRUE;
|
|
|
|
default:
|
|
return FALSE;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
HRESULT CSnapin::AddAttrPropPages(LPPROPERTYSHEETCALLBACK pCallback,
|
|
CResult *pData,
|
|
LONG_PTR handle)
|
|
{
|
|
ASSERT(pCallback);
|
|
ASSERT(pData);
|
|
if (!pCallback || !pData)
|
|
{
|
|
return E_POINTER;
|
|
}
|
|
|
|
BOOL bGP = ( (GetModeBits() & MB_SINGLE_TEMPLATE_ONLY) == MB_SINGLE_TEMPLATE_ONLY );
|
|
BOOL bReadOnly = ( (GetModeBits() & MB_READ_ONLY) == MB_READ_ONLY );
|
|
RESULT_TYPES type = pData->GetType();
|
|
CAttribute* pAttr = NULL;
|
|
HRESULT hr = S_OK;
|
|
|
|
//
|
|
// If the item has an entry from global policy then treat it as read only
|
|
//
|
|
if ((GetModeBits() & MB_LOCALSEC) == MB_LOCALSEC)
|
|
{
|
|
bGP = FALSE;
|
|
if (type == ITEM_LOCALPOL_REGVALUE)
|
|
{
|
|
SCE_REGISTRY_VALUE_INFO *pRegValue = NULL;
|
|
pRegValue = (PSCE_REGISTRY_VALUE_INFO)pData->GetSetting();
|
|
if ( pRegValue && pRegValue->Status != SCE_STATUS_NOT_CONFIGURED )
|
|
{
|
|
bReadOnly = TRUE;
|
|
}
|
|
}
|
|
else if (IsPointerType(pData))
|
|
{
|
|
//
|
|
// If there is a setting it's a pointer; if not, it is NULL
|
|
//
|
|
if (pData->GetSetting())
|
|
{
|
|
bReadOnly = TRUE;
|
|
}
|
|
}
|
|
else if ((LONG_PTR)ULongToPtr(SCE_NO_VALUE) != pData->GetSetting())
|
|
{
|
|
bReadOnly = TRUE;
|
|
}
|
|
}
|
|
if (type == ITEM_GROUP)
|
|
{
|
|
CAttrMember *pMemberPage = new CAttrMember;
|
|
CAttrMember *pMemberOfPage = new CAttrMember;
|
|
|
|
|
|
if ( pMemberPage && pMemberOfPage)
|
|
{
|
|
pMemberPage->Initialize(pData);
|
|
pMemberPage->SetMemberType(GROUP_MEMBERS);
|
|
pMemberPage->SetSnapin(this);
|
|
pMemberPage->SetSibling(pMemberOfPage);
|
|
HPROPSHEETPAGE hPage = MyCreatePropertySheetPage (&pMemberPage->m_psp);
|
|
if (hPage)
|
|
{
|
|
hr = pCallback->AddPage (hPage);
|
|
ASSERT (SUCCEEDED (hr)); //This is not safe. hr should be checked in order to do pMemberPage = NULL.
|
|
if( SUCCEEDED (hr) ) //Raid #550912, yanggao.
|
|
{
|
|
// the pointer is already added to the sheet
|
|
pMemberPage = NULL;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Oops, fail to create the property sheet page
|
|
hr = E_FAIL;
|
|
}
|
|
|
|
if ( SUCCEEDED(hr) )
|
|
{
|
|
pMemberOfPage->Initialize(pData);
|
|
pMemberOfPage->SetMemberType(GROUP_MEMBER_OF);
|
|
pMemberOfPage->SetSnapin(this);
|
|
pMemberOfPage->SetSibling(pMemberPage);
|
|
hPage = MyCreatePropertySheetPage (&pMemberOfPage->m_psp); //Raid #prefast
|
|
if (hPage)
|
|
{
|
|
hr = pCallback->AddPage (hPage);
|
|
ASSERT (SUCCEEDED (hr)); //This is not safe. hr should be checked in order to do pMemberOfPage = NULL.
|
|
if( SUCCEEDED (hr) )//Raid #550912, yanggao.
|
|
{
|
|
// the pointer is already added to the sheet
|
|
pMemberOfPage = NULL;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
hr = E_FAIL;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
}
|
|
|
|
if ( pMemberPage )
|
|
{
|
|
delete pMemberPage;
|
|
}
|
|
|
|
if ( pMemberOfPage )
|
|
{
|
|
delete pMemberOfPage;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
pAttr = CloneAttrDialog(pData,bGP);
|
|
if (pAttr)
|
|
{
|
|
pAttr->SetSnapin(this);
|
|
pAttr->Initialize(pData);
|
|
pAttr->SetReadOnly(bReadOnly);
|
|
pAttr->SetTitle(pData->GetAttrPretty());
|
|
HPROPSHEETPAGE hPage = MyCreatePropertySheetPage (&pAttr->m_psp);
|
|
if (hPage)
|
|
{
|
|
hr = pCallback->AddPage (hPage);
|
|
ASSERT (SUCCEEDED (hr)); //This is not safe. hr should be checked in order to delete pAttr.
|
|
if( !SUCCEEDED (hr) ) //Raid #550912, yanggao.
|
|
{
|
|
delete pAttr;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//
|
|
// fail to create the property sheet
|
|
//
|
|
delete pAttr;
|
|
hr = E_FAIL;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
}
|
|
}
|
|
|
|
if ( SUCCEEDED(hr) )
|
|
{
|
|
//
|
|
// In RSOP mode we need to add a precedence page too
|
|
//
|
|
if ((GetModeBits() & MB_RSOP) == MB_RSOP)
|
|
{
|
|
CPrecedencePage *ppp = new CPrecedencePage;
|
|
if (ppp)
|
|
{
|
|
ppp->SetTitle(pData->GetAttrPretty());
|
|
ppp->Initialize(pData,GetWMIRsop());
|
|
HPROPSHEETPAGE hPage = MyCreatePropertySheetPage (&ppp->m_psp);
|
|
if (hPage)
|
|
{
|
|
hr = pCallback->AddPage (hPage);
|
|
ASSERT (SUCCEEDED (hr)); //This is not safe. hr should be checked in order to delete ppp.
|
|
if( !SUCCEEDED (hr) )//Raid #550912, yanggao.
|
|
{
|
|
delete ppp;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//
|
|
// if the property sheet fails to be created, should free the buffer
|
|
//
|
|
delete ppp;
|
|
hr = E_FAIL;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
}
|
|
}
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
HRESULT CComponentDataImpl::AddAttrPropPages(LPPROPERTYSHEETCALLBACK pCallback,
|
|
CFolder *pData,
|
|
LONG_PTR handle)
|
|
{
|
|
HRESULT hr=E_FAIL;
|
|
CString strName;
|
|
|
|
ASSERT(pCallback);
|
|
ASSERT(pData);
|
|
if (!pCallback || !pData)
|
|
{
|
|
return E_POINTER;
|
|
}
|
|
|
|
BOOL bReadOnly = ((GetModeBits() & MB_READ_ONLY) == MB_READ_ONLY);
|
|
pData->GetDisplayName(strName,0);
|
|
|
|
CAttrObject *pAttr = new CAttrObject;
|
|
if (pAttr)
|
|
{
|
|
pAttr->Initialize(pData,this);
|
|
pAttr->SetTitle(strName);
|
|
pAttr->SetReadOnly(bReadOnly);
|
|
HPROPSHEETPAGE hPage = MyCreatePropertySheetPage (&pAttr->m_psp);
|
|
if ( hPage )
|
|
{
|
|
hr = pCallback->AddPage (hPage);
|
|
ASSERT (SUCCEEDED (hr)); //This is not safe. hr should be checked in order to delete pAttr.
|
|
if( !SUCCEEDED (hr) )//Raid #550912, yanggao.
|
|
{
|
|
delete pAttr;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
delete pAttr;
|
|
hr = E_FAIL;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
}
|
|
|
|
return hr;
|
|
}
|