|
|
//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation 1996-2001.
//
// File: regvldlg.cpp
//
// Contents: implementation of CSceRegistryValueInfo, CConfigRegEnable,
// CAttrRegEnable, CLocalPolRegEnable, CConfigRegNumber,
// CAttrRegNumber, CLocalPolRegNumber, CConfigRegString,
// CAttrRegString, CLocalPolRegString, CConfigRegChoice
// CAttrRegChoice, CLocalPolRegChoice
//
//----------------------------------------------------------------------------
#include "stdafx.h"
#include "wsecmgr.h"
#include "regvldlg.h"
#include "util.h"
#include "snapmgr.h"
#include "defaults.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__; #endif
extern PCWSTR g_pcszNEWLINE;
/*-----------------------------------------------------------------------------------------
Method: CRegistryValueInfo::CRegistryValueInfo
Synopsis: Constructor for CRegistryValueInfo, sets m_pRegInfo.
Arguments: [pInfo] - A pointer toa SCE_REGISTRY_VALUE_INFO struct.
-----------------------------------------------------------------------------------------*/ CSceRegistryValueInfo::CSceRegistryValueInfo( PSCE_REGISTRY_VALUE_INFO pInfo) { m_pRegInfo = pInfo; }
/*-----------------------------------------------------------------------------------------
Method: CRegistryValueInfo::GetBoolValue
Synopsis: Returns a boolean TRUE or false depending on the data and data type of this object
Returns: TRUE if the data is equal to a TRUE value, FALSE otherwise. -----------------------------------------------------------------------------------------*/ DWORD CSceRegistryValueInfo::GetBoolValue() { if (GetValue() == NULL) return SCE_NO_VALUE;
return GetValue()[0] == L'1'; }
/*-----------------------------------------------------------------------------------------
Method: CRegistryValueInfo::SetValueBool
Synopsis: Sets the value to the types equivalent boolean value, SCE_NO_VALUE if [dwVal] is equal to SCE_NO_VALUE.
Arguments: [bVal] - TRUE or FALSE.
Returns: ERROR_SUCCESS - Successfull E_OUTOFMEMORY - Out of memory. -----------------------------------------------------------------------------------------*/ DWORD CSceRegistryValueInfo::SetBoolValue( DWORD dwVal) {
if(dwVal == SCE_NO_VALUE) { if(m_pRegInfo->Value) { LocalFree( m_pRegInfo->Value ); } m_pRegInfo->Value = NULL; return ERROR_SUCCESS; }
//
// Set the length of the string.
//
int nLen = 2;
if ( m_pRegInfo->Value == NULL ) { // allocate buffer
m_pRegInfo->Value = (PWSTR)LocalAlloc(0, nLen*sizeof(WCHAR)); if(m_pRegInfo->Value == NULL) return (DWORD)E_OUTOFMEMORY; }
if ( m_pRegInfo->Value ) { //
// Convert and set the data.
//
m_pRegInfo->Value[0] = (int)dwVal + L'0'; m_pRegInfo->Value[nLen-1] = L'\0'; } return ERROR_SUCCESS; }
/////////////////////////////////////////////////////////////////////////////
// CConfigRegEnable message handlers
void CConfigRegEnable::Initialize(CResult *pResult) { // Class hieirarchy is bad - call CAttribute base method directly
CAttribute::Initialize(pResult);
CSceRegistryValueInfo prv( (PSCE_REGISTRY_VALUE_INFO)pResult->GetBase() );
DWORD dw = prv.GetBoolValue();
if ( dw != SCE_NO_VALUE ) { m_bConfigure = TRUE; SetInitialValue(dw);
} else m_bConfigure = FALSE; }
BOOL CConfigRegEnable::OnApply() { if ( !m_bReadOnly ) { UpdateData(TRUE); DWORD dw = 0;
if (!m_bConfigure) dw = SCE_NO_VALUE; else { switch(m_nEnabledRadio) { // ENABLED
case 0: dw = 1; break; // DISABLED
case 1: dw = 0; break; // Not really configured
default: dw = -1; break; } }
CSceRegistryValueInfo prv( (PSCE_REGISTRY_VALUE_INFO)(m_pData->GetBase()) ); DWORD prvdw = prv.GetBoolValue(); //Bug211219, Yanggao, 3/15/2001
prv.SetBoolValue(dw);
if(!UpdateProfile()) prv.SetBoolValue(prvdw); } // Class hieirarchy is bad - call CAttribute base method directly
return CAttribute::OnApply(); }
BOOL CConfigRegEnable::UpdateProfile() { if ( m_pData->GetBaseProfile() ) //Bug211219, Yanggao, 3/15/2001
{ if( !(m_pData->GetBaseProfile()->SetDirty(AREA_SECURITY_POLICY)) ) { m_pData->Update(m_pSnapin); return FALSE; } else { m_pData->Update(m_pSnapin); return TRUE; } } m_pData->Update(m_pSnapin); return FALSE; }
/////////////////////////////////////////////////////////////////////////////
// CAttrRegEnable message handlers
void CAttrRegEnable::Initialize(CResult * pResult) { // Class hieirarchy is bad - call CAttribute base method directly
CAttribute::Initialize(pResult); CSceRegistryValueInfo prv(NULL);
//
// Edit template settings.
//
prv.Attach( (PSCE_REGISTRY_VALUE_INFO)pResult->GetBase() );
DWORD dw = prv.GetBoolValue(); if(dw != SCE_NO_VALUE) { m_bConfigure = TRUE; m_EnabledRadio = !dw; } else m_bConfigure = FALSE;
pResult->GetDisplayName( NULL, m_Current, 2 ); }
BOOL CAttrRegEnable::OnApply() { if ( !m_bReadOnly ) { UpdateData(TRUE); DWORD dw = 0;
if (!m_bConfigure) dw = SCE_NO_VALUE; else { switch(m_EnabledRadio) { // ENABLED
case 0: dw = 1; break; // DISABLED
case 1: dw = 0; break; // Not really configured
default: dw = -1; break; } }
CSceRegistryValueInfo prv( (PSCE_REGISTRY_VALUE_INFO)(m_pData->GetBase()) );
prv.SetBoolValue(dw); //
// this address should never be NULL
//
int status = CEditTemplate::ComputeStatus( (PSCE_REGISTRY_VALUE_INFO)m_pData->GetBase(), (PSCE_REGISTRY_VALUE_INFO)m_pData->GetSetting() ); UpdateProfile( status ); }
// Class hieirarchy is bad - call CAttribute base method directly
return CAttribute::OnApply();
}
void CAttrRegEnable::UpdateProfile( DWORD status ) { if ( m_pData->GetBaseProfile() ) m_pData->GetBaseProfile()->SetDirty(AREA_SECURITY_POLICY);
m_pData->SetStatus(status); m_pData->Update(m_pSnapin); }
/////////////////////////////////////////////////////////////////////////////
// CLocalPolRegEnable message handlers
BOOL CLocalPolRegEnable::UpdateProfile( ) { return m_pSnapin->UpdateLocalPolRegValue(m_pData); }
void CLocalPolRegEnable::Initialize(CResult * pResult) { CConfigRegEnable::Initialize(pResult); if (!m_bConfigure) { //
// Since we don't have a UI to change configuration
// fake it by "configuring" with an invalid setting
//
m_bConfigure = TRUE; m_nEnabledRadio = -1; m_fNotDefine = FALSE; //Raid #413225, 6/11/2001, Yanggao
} }
////////////////////////////////////////////////////////////
// CConfigRegNumber message handlers
//
CConfigRegNumber::CConfigRegNumber(UINT nTemplateID) : CConfigNumber(nTemplateID ? nTemplateID : IDD) { };
void CConfigRegNumber::Initialize(CResult * pResult) { LONG_PTR dw = 0;
// Class hieirarchy is bad - call CAttribute base method directly
CAttribute::Initialize(pResult); m_strUnits = pResult->GetUnits();
m_cMinutes = 0; m_nLow = 0; m_nHigh = 999; m_nSave = 0; m_iNeverId = 0; m_iAccRate = 1; m_iStaticId = 0;
m_strStatic = _T(""); dw = pResult->GetBase(); PSCE_REGISTRY_VALUE_INFO prv=(PSCE_REGISTRY_VALUE_INFO)dw;
//
// HACKHACK: since we don't have a way to specify these values
// in the inf file to get them to the registry where we could
// read and use them here we need to hard code the limits and
// strings for the values we know about.
//
// For the next version we really need this in the inf file &
// registry
//
if (0 == lstrcmpi(prv->FullValueName,RNH_AUTODISCONNECT_NAME)) { m_nLow = RNH_AUTODISCONNECT_LOW; m_nHigh = RNH_AUTODISCONNECT_HIGH; m_cMinutes = RNH_AUTODISCONNECT_FLAGS; m_iNeverId = RNH_AUTODISCONNECT_SPECIAL_STRING; m_iStaticId = RNH_AUTODISCONNECT_STATIC_STRING; } if (0 == lstrcmpi(prv->FullValueName,RNH_CACHED_LOGONS_NAME)) { m_nLow = RNH_CACHED_LOGONS_LOW; m_nHigh = RNH_CACHED_LOGONS_HIGH; m_cMinutes = RNH_CACHED_LOGONS_FLAGS; m_iNeverId = RNH_CACHED_LOGONS_SPECIAL_STRING; m_iStaticId = RNH_CACHED_LOGONS_STATIC_STRING; } if (0 == lstrcmpi(prv->FullValueName,RNH_PASSWORD_WARNINGS_NAME)) { m_nLow = RNH_PASSWORD_WARNINGS_LOW; m_nHigh = RNH_PASSWORD_WARNINGS_HIGH; m_cMinutes = RNH_PASSWORD_WARNINGS_FLAGS; m_iNeverId = RNH_PASSWORD_WARNINGS_SPECIAL_STRING; m_iStaticId = RNH_PASSWORD_WARNINGS_STATIC_STRING; } //
// End HACKHACK
//
dw = (DWORD)pResult->GetBase();
if ( prv && prv->Value ) { m_bConfigure = TRUE; m_nSave = _wtol(prv->Value);
SetInitialValue(m_nSave);
} else m_bConfigure = FALSE; }
BOOL CConfigRegNumber::OnApply() { if ( !m_bReadOnly ) { UpdateData(TRUE); DWORD dw = 0; if (!m_bConfigure) dw = SCE_NO_VALUE; else dw = CurrentEditValue();
PWSTR sz = NULL; if ( dw != SCE_NO_VALUE ) { CString strTmp; // allocate buffer
strTmp.Format(TEXT("%d"), dw); sz = (PWSTR)LocalAlloc(0, (strTmp.GetLength()+1)*sizeof(WCHAR)); if (!sz) { //
// Display a message?
//
return FALSE; } lstrcpy(sz,strTmp); } PSCE_REGISTRY_VALUE_INFO prv=(PSCE_REGISTRY_VALUE_INFO)(m_pData->GetBase()); //
// this address should never be NULL
//
ASSERT(prv); if (prv) { if ( prv->Value ) LocalFree(prv->Value);
prv->Value = sz; } else if (sz) LocalFree(sz);
UpdateProfile(); }
// Class hieirarchy is bad - call CAttribute base method directly
return CAttribute::OnApply(); }
void CConfigRegNumber::UpdateProfile() { m_pData->Update(m_pSnapin); }
/////////////////////////////////////////////////////////////////////////////
// CAttrRegNumber message handlers
CAttrRegNumber::CAttrRegNumber() : CAttrNumber(IDD) { };
void CAttrRegNumber::Initialize(CResult * pResult) { // Class hieirarchy is bad - call CAttribute base method directly
CAttribute::Initialize(pResult); m_strUnits = pResult->GetUnits();
m_strTemplateTitle = _T(""); m_strLastInspectTitle = _T("");
m_cMinutes = 0; m_nLow = 0; m_nHigh = 999; m_nSave = 0; m_iNeverId = 0; m_iAccRate = 1; m_iStaticId = 0;
LONG_PTR dw = pResult->GetBase(); PSCE_REGISTRY_VALUE_INFO prv=(PSCE_REGISTRY_VALUE_INFO)dw;
//
// HACKHACK: since we don't have a way to specify these values
// in the inf file to get them to the registry where we could
// read and use them here we need to hard code the limits and
// strings for the values we know about.
//
// For the next version we really need this in the inf file &
// registry
//
if (0 == lstrcmpi(prv->FullValueName,RNH_AUTODISCONNECT_NAME)) { m_nLow = RNH_AUTODISCONNECT_LOW; m_nHigh = RNH_AUTODISCONNECT_HIGH; m_cMinutes = RNH_AUTODISCONNECT_FLAGS; m_iNeverId = RNH_AUTODISCONNECT_SPECIAL_STRING; m_iStaticId = RNH_AUTODISCONNECT_STATIC_STRING; } if (0 == lstrcmpi(prv->FullValueName,RNH_CACHED_LOGONS_NAME)) { m_nLow = RNH_CACHED_LOGONS_LOW; m_nHigh = RNH_CACHED_LOGONS_HIGH; m_cMinutes = RNH_CACHED_LOGONS_FLAGS; m_iNeverId = RNH_CACHED_LOGONS_SPECIAL_STRING; m_iStaticId = RNH_CACHED_LOGONS_STATIC_STRING; } if (0 == lstrcmpi(prv->FullValueName,RNH_PASSWORD_WARNINGS_NAME)) { m_nLow = RNH_PASSWORD_WARNINGS_LOW; m_nHigh = RNH_PASSWORD_WARNINGS_HIGH; m_cMinutes = RNH_PASSWORD_WARNINGS_FLAGS; m_iNeverId = RNH_PASSWORD_WARNINGS_SPECIAL_STRING; m_iStaticId = RNH_PASSWORD_WARNINGS_STATIC_STRING; } //
// End HACKHACK
//
if ( prv && prv->Value ) { m_bConfigure = TRUE;
m_nSave = _wtol(prv->Value); SetInitialValue(m_nSave); } else m_bConfigure = FALSE;
pResult->GetDisplayName( NULL, m_strSetting, 2 ); }
BOOL CAttrRegNumber::OnApply() { if ( !m_bReadOnly ) { DWORD dw = 0; int status = 0;
UpdateData(TRUE);
if (!m_bConfigure) { dw = SCE_NO_VALUE; } else { dw = CurrentEditValue(); }
PSCE_REGISTRY_VALUE_INFO prv=(PSCE_REGISTRY_VALUE_INFO)(m_pData->GetBase()); PSCE_REGISTRY_VALUE_INFO prv2=(PSCE_REGISTRY_VALUE_INFO)(m_pData->GetSetting());
//
// this address should never be NULL
//
if ( prv ) { DWORD dw2=SCE_NO_VALUE; if ( prv2 ) { //
// if there is analysis setting (should always have)
//
if (prv2->Value ) { dw2 = _wtol(prv2->Value); } else { dw2 = SCE_NO_VALUE; } }
if ( prv->Value ) LocalFree(prv->Value); prv->Value = NULL;
if ( dw != SCE_NO_VALUE ) { CString strTmp;
// allocate buffer
strTmp.Format(TEXT("%d"), dw); prv->Value = (PWSTR)LocalAlloc(0, (strTmp.GetLength()+1)*sizeof(TCHAR));
if ( prv->Value ) wcscpy(prv->Value,(LPCTSTR)strTmp); else { // can't allocate buffer, error!!
} }
status = CEditTemplate::ComputeStatus (prv, prv2);
UpdateProfile( status ); } }
// Class hieirarchy is bad - call CAttribute base method directly
return CAttribute::OnApply(); }
void CAttrRegNumber::UpdateProfile( DWORD status ) { if ( m_pData->GetBaseProfile() ) m_pData->GetBaseProfile()->SetDirty(AREA_SECURITY_POLICY);
m_pData->SetStatus(status); m_pData->Update(m_pSnapin); }
/////////////////////////////////////////////////////////////////////////////
// CLocalPolRegNumber message handlers
CLocalPolRegNumber::CLocalPolRegNumber() : CConfigRegNumber(IDD), m_bInitialValueSet(FALSE)
{ m_pHelpIDs = (DWORD_PTR)a228HelpIDs; m_uTemplateResID = IDD; }
void CLocalPolRegNumber::UpdateProfile() { m_pSnapin->UpdateLocalPolRegValue(m_pData); }
void CLocalPolRegNumber::Initialize(CResult * pResult) { CConfigRegNumber::Initialize(pResult); if (!m_bConfigure) { //
// Since we don't have a UI to change configuration
// fake it by "configuring" with an invalid setting
//
m_bConfigure = TRUE; m_bInitialValueSet = TRUE; m_nSave = 0; } } void CLocalPolRegNumber::SetInitialValue(DWORD_PTR dw) { if (m_bConfigure && !m_bInitialValueSet) { CConfigRegNumber::SetInitialValue(dw); m_bInitialValueSet = TRUE; } }
/////////////////////////////////////////////////////////////////////////////
// CConfigRegString message handlers
void CConfigRegString::Initialize(CResult * pResult) { // Class hieirarchy is bad - call CAttribute base method directly
CAttribute::Initialize(pResult);
PSCE_REGISTRY_VALUE_INFO prv = (PSCE_REGISTRY_VALUE_INFO)(pResult->GetBase());
if ( prv && prv->Value ) {
m_bConfigure = TRUE;
if (QueryMultiSZ()) { LPTSTR sz = SZToMultiSZ(prv->Value); m_strName = sz; LocalFree(sz); if( REG_SZ == prv->ValueType ) //Raid #376218, 4/25/2001
{ prv->ValueType = REG_MULTI_SZ; } } else { m_strName = (LPTSTR) prv->Value; } } else { m_strName = _T(""); m_bConfigure = FALSE; } }
BOOL CConfigRegString::OnApply() { if ( !m_bReadOnly ) { DWORD dw = 0; UpdateData(TRUE);
m_strName.TrimRight();
// 249188 SCE UI: allows adding empty lines to REG_MULTI_SZ fields
// Replace all double newlines with single newlines. This has the effect
// of deleting empty lines.
CString szDoubleNewLine (g_pcszNEWLINE); szDoubleNewLine += g_pcszNEWLINE; while (m_strName.Replace (szDoubleNewLine, g_pcszNEWLINE) != 0);
UpdateData (FALSE); // put the corrected string back in the control
PSCE_REGISTRY_VALUE_INFO prv = (PSCE_REGISTRY_VALUE_INFO)(m_pData->GetBase());
if ( prv ) { if (!m_bConfigure) { if ( prv->Value ) LocalFree(prv->Value); prv->Value = NULL; this->UpdateProfile(); } else { LPTSTR prvpt = NULL; LPTSTR pt = 0; if (QueryMultiSZ()) pt = MultiSZToSZ(m_strName); else { pt = (PWSTR)LocalAlloc(0, (m_strName.GetLength()+1)*sizeof(TCHAR)); if ( pt ) wcscpy(pt, (LPCTSTR)m_strName); }
if ( pt ) { if ( prv->Value ) prvpt = prv->Value; prv->Value = pt; } else { // can't allocate buffer error!!
}
if( !(this->UpdateProfile()) ) { if ( prv->Value ) LocalFree(prv->Value); prv->Value = prvpt; } else { if( prvpt) LocalFree(prvpt); } } } }
// Class hieirarchy is bad - call CAttribute base method directly
return CAttribute::OnApply(); }
BOOL CConfigRegString::UpdateProfile() { if ( m_pData->GetBaseProfile() ) { if( !(m_pData->GetBaseProfile()->SetDirty(AREA_SECURITY_POLICY)) ) { m_pData->Update(m_pSnapin); return FALSE; } else { m_pData->Update(m_pSnapin); return TRUE; } } m_pData->Update(m_pSnapin); return FALSE; }
/////////////////////////////////////////////////////////////////////////////
// CAttrString message handlers
void CAttrRegString::Initialize(CResult * pResult) { // Class hieirarchy is bad - call CAttribute base method directly
CAttribute::Initialize(pResult);
m_strBase.Empty(); m_strSetting.Empty();
PSCE_REGISTRY_VALUE_INFO prv; prv = (PSCE_REGISTRY_VALUE_INFO)(pResult->GetSetting());
pResult->GetDisplayName( NULL, m_strSetting, 2 );
prv = (PSCE_REGISTRY_VALUE_INFO)(pResult->GetBase()); if ( prv && prv->Value ) { m_bConfigure = TRUE; if (QueryMultiSZ()) { LPTSTR sz = SZToMultiSZ(prv->Value); m_strBase = sz; LocalFree(sz); } else { m_strBase = (LPTSTR) prv->Value; } } else m_bConfigure = FALSE; }
BOOL CAttrRegString::OnApply() { if ( !m_bReadOnly ) { DWORD dw = 0; UpdateData(TRUE);
int status=SCE_STATUS_GOOD;
PSCE_REGISTRY_VALUE_INFO prv = (PSCE_REGISTRY_VALUE_INFO)(m_pData->GetBase()); PSCE_REGISTRY_VALUE_INFO prv2 = (PSCE_REGISTRY_VALUE_INFO)(m_pData->GetSetting());
m_strBase.TrimRight();
if ( prv ) { if (!m_bConfigure) { if ( prv->Value ) LocalFree(prv->Value); prv->Value = NULL; } else { LPTSTR pt = 0; if (QueryMultiSZ()) pt = MultiSZToSZ(m_strBase); else { pt = (PWSTR)LocalAlloc(0, (m_strBase.GetLength()+1)*sizeof(TCHAR)); if ( pt ) wcscpy(pt, (LPCTSTR)m_strBase); } if ( pt ) { if ( prv->Value ) LocalFree(prv->Value); prv->Value = pt; } else { // can't allocate buffer error!!
} }
status = CEditTemplate::ComputeStatus(prv, prv2); UpdateProfile( status ); } }
// Class hieirarchy is bad - call CAttribute base method directly
return CAttribute::OnApply(); }
//+----------------------------------------------------------------------------------------------
// CAttrRegString::UpdateProfile
//
// This function is called by OnApply after all the data has been retrieved from the dialog.
// Inherited classes can overload this function to update the data as needed.
//
// Arguments: [status] - The status of [m_pData] from OnApply();
//
//----------------------------------------------------------------------------------------------
void CAttrRegString::UpdateProfile( DWORD status ) { if ( m_pData->GetBaseProfile() ) m_pData->GetBaseProfile()->SetDirty(AREA_SECURITY_POLICY);
m_pData->SetStatus(status); m_pData->Update(m_pSnapin); }
/////////////////////////////////////////////////////////////////////////////
// CLocalPolRegString message handlers
//+----------------------------------------------------------------------------------------------
// CLocalPolRegString::UpdateProfile
//
// This function is called by OnApply after all the data has been retrieved from the dialog.
// Inherited classes can overload this function to update the data as needed.
//
// Arguments: [status] - The status of [m_pData] from OnApply();
//
//----------------------------------------------------------------------------------------------
BOOL CLocalPolRegString::UpdateProfile( ) { return m_pSnapin->UpdateLocalPolRegValue(m_pData); }
void CLocalPolRegString::Initialize(CResult * pResult) { CConfigRegString::Initialize(pResult); if (!m_bConfigure) { //
// Since we don't have a UI to change configuration
// fake it by "configuring" with an invalid setting
//
m_bConfigure = TRUE; m_strName = _T(""); } }
/////////////////////////////////////////////////////////////////////////////
// CConfigRegChoice message handlers
void CConfigRegChoice::Initialize(CResult * pResult) { // Class hieirarchy is bad - call CAttribute base method directly
CAttribute::Initialize(pResult);
m_strAttrName = pResult->GetAttrPretty(); m_StartIds=IDS_LM_FULL;
PSCE_REGISTRY_VALUE_INFO prv = (PSCE_REGISTRY_VALUE_INFO)(pResult->GetBase());
if ( prv && prv->Value ) { m_bConfigure = TRUE; switch(_wtol(prv->Value)) { case SCE_RETAIN_ALWAYS: m_rabRetention = 0; break; case SCE_RETAIN_AS_REQUEST: m_rabRetention = 1; break; case SCE_RETAIN_NC: m_rabRetention = 2; break; } } else m_bConfigure = FALSE; }
BOOL CConfigRegChoice::OnInitDialog() { CConfigRet::OnInitDialog();
//
// load static text for the radio buttons
//
CString strText; strText.LoadString(m_StartIds); SetDlgItemText( IDC_RETENTION, strText );
strText.LoadString(m_StartIds+1); SetDlgItemText( IDC_RADIO2, strText );
strText.LoadString(m_StartIds+2); SetDlgItemText( IDC_RADIO3, strText );
OnConfigure();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
BOOL CConfigRegChoice::OnApply() { if ( !m_bReadOnly ) { DWORD dw = 0;
UpdateData(TRUE);
PSCE_REGISTRY_VALUE_INFO prv = (PSCE_REGISTRY_VALUE_INFO)(m_pData->GetBase());
if ( prv ) { if (!m_bConfigure) { if ( prv->Value ) LocalFree(prv->Value); prv->Value = NULL;
} else { switch(m_rabRetention) { case 0: dw = SCE_RETAIN_ALWAYS; break; case 1: dw = SCE_RETAIN_AS_REQUEST; break; case 2: dw = SCE_RETAIN_NC; break; }
if ( prv->Value == NULL ) { // allocate buffer
prv->Value = (PWSTR)LocalAlloc(0, 4); } if ( prv->Value ) { prv->Value[0] = (int)dw + L'0'; prv->Value[1] = L'\0'; } else { // can't allocate buffer, error!!
} }
m_pData->Update(m_pSnapin); } }
// Class hieirarchy is bad - call CAttribute base method directly
return CAttribute::OnApply(); }
/////////////////////////////////////////////////////////////////////////////
// CAttrRegChoice message handlers
void CAttrRegChoice::Initialize(CResult * pData) { DWORD dw = 0; // Class hieirarchy is bad - call CAttribute base method directly
CAttribute::Initialize(pData);
// Display the last inspected setting in its static box
pData->GetDisplayName( NULL, m_strLastInspect, 2 );
// Set the template setting radio button appropriately
m_strAttrName = pData->GetAttrPretty(); m_StartIds=IDS_LM_FULL;
PSCE_REGISTRY_VALUE_INFO prv = (PSCE_REGISTRY_VALUE_INFO)(pData->GetBase());
if ( prv && prv->Value ) { m_bConfigure = TRUE;
switch(_wtol(prv->Value)) { case SCE_RETAIN_ALWAYS: m_rabRetention = 0; break; case SCE_RETAIN_AS_REQUEST: m_rabRetention = 1; break; case SCE_RETAIN_NC: m_rabRetention = 2; break; } } else { m_bConfigure = FALSE; }
}
BOOL CAttrRegChoice::OnInitDialog() {
CAttrRet::OnInitDialog();
//
// load static text for the radio buttons
//
CString strText; strText.LoadString(m_StartIds); SetDlgItemText( IDC_RETENTION, strText );
strText.LoadString(m_StartIds+1); SetDlgItemText( IDC_RADIO2, strText );
strText.LoadString(m_StartIds+2); SetDlgItemText( IDC_RADIO3, strText );
CAttrRet::OnInitDialog(); return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
BOOL CAttrRegChoice::OnApply() { if ( !m_bReadOnly ) { DWORD dw = 0; int status = 0;
UpdateData(TRUE);
if (!m_bConfigure) dw = SCE_NO_VALUE; else { switch(m_rabRetention) { case 0: dw = SCE_RETAIN_ALWAYS; break; case 1: dw = SCE_RETAIN_AS_REQUEST; break; case 2: dw = SCE_RETAIN_NC; break; } }
PSCE_REGISTRY_VALUE_INFO prv=(PSCE_REGISTRY_VALUE_INFO)(m_pData->GetBase()); PSCE_REGISTRY_VALUE_INFO prv2=(PSCE_REGISTRY_VALUE_INFO)(m_pData->GetSetting());
//
// this address should never be NULL
//
if ( prv ) { DWORD dw2=SCE_NO_VALUE; if ( prv2 ) { //
// if there is analysis setting (should always have)
//
if (prv2->Value ) dw2 = _wtol(prv2->Value); else dw2 = SCE_NO_VALUE; }
status = CEditTemplate::ComputeStatus (prv, prv2); if ( dw == SCE_NO_VALUE ) { if ( prv->Value ) LocalFree(prv->Value); prv->Value = NULL; } else { if ( prv->Value == NULL ) { // allocate buffer
prv->Value = (PWSTR)LocalAlloc(0, 4); } if ( prv->Value ) { prv->Value[0] = (int)dw + L'0'; prv->Value[1] = L'\0'; } else { // can't allocate buffer, error!!
} }
UpdateProfile( status ); } }
// Class hieirarchy is bad - call CAttribute base method directly
return CAttribute::OnApply(); }
void CAttrRegChoice::UpdateProfile( DWORD status ) { if ( m_pData->GetBaseProfile() ) m_pData->GetBaseProfile()->SetDirty(AREA_SECURITY_POLICY);
m_pData->SetStatus(status); m_pData->Update(m_pSnapin); }
/////////////////////////////////////////////////////////////////////////////
// CLocalPolRegChoice message handlers
void CLocalPolRegChoice::UpdateProfile(DWORD status) { m_pSnapin->UpdateLocalPolRegValue(m_pData); }
void CLocalPolRegChoice::Initialize(CResult * pResult) { CConfigRegChoice::Initialize(pResult); if (!m_bConfigure) { //
// Since we don't have a UI to change configuration
// fake it by "configuring" with an invalid setting
//
m_bConfigure = TRUE; m_rabRetention = 0; } }
BOOL CSnapin::UpdateLocalPolRegValue( CResult *pResult ) {
if ( !pResult) return FALSE;
PEDITTEMPLATE pLocalDeltaTemplate = GetTemplate(GT_LOCAL_POLICY_DELTA,AREA_SECURITY_POLICY); if (!pLocalDeltaTemplate) return FALSE; PSCE_PROFILE_INFO pLocalDelta = pLocalDeltaTemplate->pTemplate;
pLocalDelta->RegValueCount = 1; pLocalDelta->aRegValues = (PSCE_REGISTRY_VALUE_INFO)pResult->GetBase();
if( pLocalDeltaTemplate->SetDirty(AREA_SECURITY_POLICY) ) { //
// Set the status of the item.
//
PSCE_REGISTRY_VALUE_INFO pRviEffective = (PSCE_REGISTRY_VALUE_INFO)pResult->GetSetting(); DWORD status = pResult->GetStatus(); if(!pRviEffective || !pRviEffective->Value) status = SCE_STATUS_NOT_ANALYZED; else status = CEditTemplate::ComputeStatus( (PSCE_REGISTRY_VALUE_INFO)pResult->GetBase(), pRviEffective ); pResult->SetStatus(status); pResult->Update(this); return TRUE; }
return FALSE; }
|