|
|
//+--------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1994 - 2001.
//
// File: cookie.cpp
//
// Contents: Functions for handling SCE cookies for the scope and
// result panes
//
// History:
//
//---------------------------------------------------------------------------
#include "stdafx.h"
#include "cookie.h"
#include "snapmgr.h"
#include "wrapper.h"
#include <sceattch.h>
#include "precdisp.h"
#include "util.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__; #endif
CFolder::~CFolder() { if (m_pScopeItem) { delete m_pScopeItem; m_pScopeItem = NULL; } CoTaskMemFree(m_pszName); CoTaskMemFree(m_pszDesc);
while (!m_resultItemList.IsEmpty () ) { CResult* pResult = m_resultItemList.RemoveHead (); if ( pResult ) pResult->Release (); } }
//+--------------------------------------------------------------------------
//
// Method: SetDesc
//
// Synopsis: Sets the description of the folder
//
// Arguments: [szDesc] - [in] the new description of the folder
//
// Returns: TRUE if successfull, FALSE otherwise
//
// Modifies: m_pszDesc
//
// History:
//
//---------------------------------------------------------------------------
BOOL CFolder::SetDesc(LPCTSTR szDesc) { UINT uiByteLen = 0; LPOLESTR psz = 0;
if (szDesc != NULL) { uiByteLen = (lstrlen(szDesc) + 1) * sizeof(OLECHAR); psz = (LPOLESTR)::CoTaskMemAlloc(uiByteLen);
if (psz != NULL) { //This may not be a safe usage. psz is OLECHAR. Consider fix.
lstrcpy(psz, szDesc); CoTaskMemFree(m_pszDesc); m_pszDesc = psz; } else return FALSE; } else return FALSE; return TRUE; } // --------------------------------------------------------------------------
// Method: SetViewUpdate
//
// Synopsis: Sets and gets update flag of this folder
//
// History: Raid #258237, 4/12/2001
//
//---------------------------------------------------------------------------
void CFolder::SetViewUpdate(BOOL fUpdate) { m_ViewUpdate = fUpdate; }
BOOL CFolder::GetViewUpdate() const { return m_ViewUpdate; } //+--------------------------------------------------------------------------
//
// Method: SetMode
//
// Synopsis: Sets the SCE Mode that this folder is operating under and
// calculates the "Mode Bits" appropriate for that mode
//
// Arguments: [dwMode] - The mode to set
//
// Returns: TRUE if the mode is valid, FALSE otherwise
//
// Modifies: m_dwMode
// m_ModeBits
//
// History: 20-Jan-1998 Robcap created
//
//---------------------------------------------------------------------------
BOOL CFolder::SetMode(DWORD dwMode) { //
// Make sure this is a legitimate mode
//
switch (dwMode) { case SCE_MODE_RSOP_COMPUTER: case SCE_MODE_RSOP_USER: case SCE_MODE_LOCALSEC: case SCE_MODE_COMPUTER_MANAGEMENT: case SCE_MODE_DC_MANAGEMENT: case SCE_MODE_LOCAL_USER: case SCE_MODE_LOCAL_COMPUTER: case SCE_MODE_REMOTE_USER: case SCE_MODE_REMOTE_COMPUTER: case SCE_MODE_DOMAIN_USER: case SCE_MODE_DOMAIN_COMPUTER: case SCE_MODE_OU_USER: case SCE_MODE_OU_COMPUTER: case SCE_MODE_EDITOR: case SCE_MODE_VIEWER: case SCE_MODE_DOMAIN_COMPUTER_ERROR: m_dwMode = dwMode; break; default: return FALSE; break; }
//
// Calculate the mode bits for this mode
//
m_ModeBits = 0; //
// Directory Services not avalible in NT4
//
if ((dwMode == SCE_MODE_DOMAIN_COMPUTER) || (dwMode == SCE_MODE_DC_MANAGEMENT)) { m_ModeBits |= MB_DS_OBJECTS_SECTION; } if ((dwMode == SCE_MODE_OU_USER) || (dwMode == SCE_MODE_DOMAIN_USER) || (dwMode == SCE_MODE_REMOTE_COMPUTER) || (dwMode == SCE_MODE_REMOTE_USER) || (dwMode == SCE_MODE_RSOP_USER) || (dwMode == SCE_MODE_DOMAIN_COMPUTER_ERROR) || (dwMode == SCE_MODE_LOCAL_USER)) { m_ModeBits |= MB_NO_NATIVE_NODES | MB_NO_TEMPLATE_VERBS | MB_WRITE_THROUGH; } if ((dwMode == SCE_MODE_OU_COMPUTER) || (dwMode == SCE_MODE_DOMAIN_COMPUTER) ) { m_ModeBits |= MB_SINGLE_TEMPLATE_ONLY | MB_NO_TEMPLATE_VERBS | MB_GROUP_POLICY | MB_WRITE_THROUGH; } if (dwMode == SCE_MODE_RSOP_COMPUTER) { m_ModeBits |= MB_SINGLE_TEMPLATE_ONLY | MB_NO_TEMPLATE_VERBS | MB_WRITE_THROUGH; }
if (dwMode == SCE_MODE_RSOP_COMPUTER || dwMode == SCE_MODE_RSOP_USER) { m_ModeBits |= MB_READ_ONLY | MB_RSOP; }
if (SCE_MODE_LOCAL_COMPUTER == dwMode) { m_ModeBits |= MB_LOCAL_POLICY | MB_LOCALSEC | MB_NO_TEMPLATE_VERBS | MB_SINGLE_TEMPLATE_ONLY | MB_WRITE_THROUGH;
if (!IsAdmin()) { m_ModeBits |= MB_READ_ONLY; }
if (IsDomainController()) { m_ModeBits |= MB_DS_OBJECTS_SECTION; } }
if ( dwMode == SCE_MODE_EDITOR ) { m_ModeBits |= MB_TEMPLATE_EDITOR; m_ModeBits |= MB_DS_OBJECTS_SECTION;
} else if ( dwMode == SCE_MODE_VIEWER ) { m_ModeBits |= MB_ANALYSIS_VIEWER; if (IsDomainController()) { m_ModeBits |= MB_DS_OBJECTS_SECTION; } } else if (dwMode == SCE_MODE_LOCALSEC) { m_ModeBits |= MB_LOCALSEC; if (!IsAdmin()) { m_ModeBits |= MB_READ_ONLY; } if (IsDomainController()) { m_ModeBits |= MB_DS_OBJECTS_SECTION; } }
return TRUE; }
//+--------------------------------------------------------------------------
//
// Method: Create
//
// Synopsis: Initialize a CFolder Object
//
//
// Arguments: [szName] - The folder's display name
// [szDesc] - The folder's discription
// [infName] - The inf file associated with the folder (optional)
// [nImage] - The folder's closed icon index
// [nOpenImage] - the folder's open icon index
// [type] - The folder' type
// [bHasChildren] - True if the folder has children folders
// [dwMode] - The Mode the folder operates under
// [pData] - Extra data to associate with the folder
//
//
// History:
//
//---------------------------------------------------------------------------
HRESULT CFolder::Create(LPCTSTR szName, // Name
LPCTSTR szDesc, // Description
LPCTSTR infName, // inf file name
int nImage, // closed icon index
int nOpenImage, // open icon index
FOLDER_TYPES type, // folder type
BOOL bHasChildren, // has children
DWORD dwMode, // mode
PVOID pData) // data
{ UINT uiByteLen = 0; LPOLESTR psz = 0; HRESULT hr = S_OK;
//Validate m_pScopeItem is NULL.
ASSERT(m_pScopeItem == NULL); // Calling create twice on this item? Bogus Assert, yanggao.
CString str; //
// Two-stage construction
//
m_pScopeItem = new SCOPEDATAITEM; if (!m_pScopeItem) return E_OUTOFMEMORY; ZeroMemory(m_pScopeItem,sizeof(SCOPEDATAITEM)); //Raid #668270, yanggao, 8/9/2002
//
// Set folder type
//
m_type = type;
//
// Add node name
//
if (szName != NULL || szDesc != NULL ) { m_pScopeItem->mask = SDI_STR; //
// Displayname is a callback (unsigned short*)(-1)
m_pScopeItem->displayname = MMC_CALLBACK; }
if ( szName != NULL ) { uiByteLen = (lstrlen(szName) + 1) * sizeof(OLECHAR); psz = (LPOLESTR)::CoTaskMemAlloc(uiByteLen);
if (psz != NULL) //This may not be a safe usage. psz is OLECHAR. Consider fix.
lstrcpy(psz, szName); else hr = E_OUTOFMEMORY;
CoTaskMemFree(m_pszName); m_pszName = psz; }
if (szDesc != NULL) { uiByteLen = (lstrlen(szDesc) + 1) * sizeof(OLECHAR); psz = (LPOLESTR)::CoTaskMemAlloc(uiByteLen);
if (psz != NULL) //This may not be a safe usage. psz is OLECHAR. Consider fix.
lstrcpy(psz, szDesc); else hr = E_OUTOFMEMORY; CoTaskMemFree(m_pszDesc); m_pszDesc = psz; }
if (infName != NULL) { uiByteLen = (lstrlen(infName) + 1) * sizeof(OLECHAR); psz = (LPOLESTR)::CoTaskMemAlloc(uiByteLen);
if (psz != NULL) //This may not be a safe usage. psz is OLECHAR. Consider fix.
lstrcpy(psz, infName); else hr = E_OUTOFMEMORY; CoTaskMemFree(m_infName); m_infName = psz; }
//
// Add close image
//
m_pScopeItem->mask |= SDI_IMAGE; // no close image for now
// m_pScopeItem->nImage = (int)MMC_CALLBACK;
m_pScopeItem->nImage = nImage;
//
// Add open image
//
if (nOpenImage != -1) { m_pScopeItem->mask |= SDI_OPENIMAGE; m_pScopeItem->nOpenImage = nOpenImage; }
//
// Add button to node if the folder has children
//
if (bHasChildren == TRUE) { m_pScopeItem->mask |= SDI_CHILDREN; //
// The number of children doesn't make any difference now,
// so pick 1 until the node is expanded and the true value
// is known
//
m_pScopeItem->cChildren = 1; }
//
// Set the SCE Mode and calculate the mode bits
//
if (dwMode) SetMode(dwMode); m_pData = pData;
return hr; }
//+------------------------------------------------------------------------------------------------
// CFolder::SetDesc
//
// Translate dwStatus and dwNumChildren to a string and sets m_szDesc
//
// Argumens: [dwStats] - Object status.
// [dwNumChildren] - Number of children for the object.
//
// Returns: TRUE - If successful
// FALSE - If no more memory is available (or dwStatus is greater then 999)
//-------------------------------------------------------------------------------------------------
BOOL CFolder::SetDesc( DWORD dwStatus, DWORD dwNumChildren ) { if(dwStatus > 999) return FALSE;
TCHAR szText[256]; //This is a safe usage.
swprintf(szText, L"%03d%d", dwStatus, dwNumChildren);
SetDesc(szText);
return TRUE; }
//+------------------------------------------------------------------------------------------------
// CFolder::GetObjectInfo
//
// Translate m_szDesc into dwStatus and dwNumChildren
//
// Argumens: [pdwStats] - Object status.
// [pdwNumChildren] - Number of children for the object.
//
// Returns: TRUE - If successful
// FALSE - m_szDesc is NULL
//-------------------------------------------------------------------------------------------------
BOOL CFolder::GetObjectInfo( DWORD *pdwStatus, DWORD *pdwNumChildren ) { if(!m_pszDesc) return FALSE; if( lstrlen(m_pszDesc) < 4) return FALSE;
if(pdwStatus ) *pdwStatus = (m_pszDesc[0]-L'0')*100 + (m_pszDesc[1]-L'0')*10+ (m_pszDesc[2]-L'0');
if(pdwNumChildren) *pdwNumChildren = _wtol( m_pszDesc + 3 );
return TRUE; }
/*--------------------------------------------------------------------------------------------------
Method: GetResultItemHandle()
Synopisi: This function must be called to retreive a valid handle to this folders result items. The handle must be freed by a call to ReleaseResultItemHandle(). If these two functions are not called in conjunction. The behavior fo the result items will be strange.
Arguments: [handle] - [out] The handle value to use for any other functions that require a handle.
Returns: ERROR_SUCCESS - A valid result item was returned ERROR_INVALID_PARAMETER - [handle] is NULL --------------------------------------------------------------------------------------------------*/ DWORD CFolder::GetResultItemHandle( HANDLE *handle) { if(!handle) return ERROR_INVALID_PARAMETER; m_iRefCount++; *handle = (HANDLE)&m_resultItemList; return ERROR_SUCCESS; }
/*--------------------------------------------------------------------------------------------------
Method: GetResultItem()
Synopisi: Returns the result item pointed to by position and sets [pos] to the next item.
Arguments: [handle] - [in] A valid handle returns by GetResultItemHandle() [pos] - [in|out] The position of the result. If this value is NULL, the first result item in the list is returned. [pResult] - [out] A pointer to a result item pointer
Returns: ERROR_SUCCESS - A result item was found for the position. ERROR_INVALID_PARAMETER - [handle] is invalid, or [pResult] is NULL --------------------------------------------------------------------------------------------------*/ DWORD CFolder::GetResultItem( HANDLE handle, POSITION &pos, CResult **pResult) { if(!handle || handle != (HANDLE)&m_resultItemList || !pResult) return ERROR_INVALID_PARAMETER;
if(!pos) { pos = m_resultItemList.GetHeadPosition();
if(!pos) { *pResult = NULL; return ERROR_SUCCESS; } }
*pResult = m_resultItemList.GetNext(pos); return ERROR_SUCCESS; }
/*--------------------------------------------------------------------------------------------------
Method: GetResultItemPosition()
Synopisi: Returns the position of the result item in the result item list for this folder item.
Arguments: [handle] - A valid handle returns by GetResultItemHandle() [pResult] - The retult item position to return.
Returns: NULL - Invalid handle or the result item is not part of this folder. POSITION - A valid position value that can be used in other calls that require the position of the result item. --------------------------------------------------------------------------------------------------*/ POSITION CFolder::GetResultItemPosition( HANDLE handle, CResult *pResult) { if(handle != (HANDLE)&m_resultItemList) return NULL;
POSITION pos = m_resultItemList.GetHeadPosition(); while(pos) { if(pResult == m_resultItemList.GetNext(pos)) break; }
return pos; }
/*--------------------------------------------------------------------------------------------------
Method: RemoveAllResultItems()
Synopisi: Removes all result items from the list. This call sets the ref count to 0 so it could be a very damaging call. --------------------------------------------------------------------------------------------------*/ void CFolder::RemoveAllResultItems() { //
// Very Very dangerous call.
//
m_iRefCount = 1; HANDLE handle = (HANDLE)&m_resultItemList; ReleaseResultItemHandle (handle); }
DWORD CFolder::GetDisplayName( CString &str, int iCol ) { int npos; DWORD dwRet = ERROR_INVALID_PARAMETER;
if(!iCol) { str = GetName(); dwRet = ERROR_SUCCESS; }
switch(m_type) { case PROFILE: case REG_OBJECTS: if(!iCol) { npos = str.ReverseFind(L'\\'); str = GetName() + npos + 1; dwRet = ERROR_SUCCESS; } break; case FILE_OBJECTS: if (0 == iCol) { npos = str.ReverseFind(L'\\'); if (str.GetLength() > npos + 1) { str=GetName() + npos + 1; } dwRet = ERROR_SUCCESS; }
break; case STATIC: if(iCol == 2) { str = GetDesc(); dwRet = ERROR_SUCCESS; } break;
}
if(dwRet != ERROR_SUCCESS) { if( ((m_type >= ANALYSIS && m_type <=AREA_FILESTORE_ANALYSIS) || (m_type >= LOCALPOL_ACCOUNT && m_type <= LOCALPOL_LAST)) && iCol == 1) { str = GetDesc(); dwRet = ERROR_SUCCESS; } else if(iCol <= 3 && GetDesc() != NULL) { LPTSTR szDesc = GetDesc(); switch(iCol) { case 1: // first 3 digits of m_pszDesc
dwRet = 0; GetObjectInfo( &dwRet, NULL );
ObjectStatusToString(dwRet, &str); dwRet = ERROR_SUCCESS; break;
case 2: // first 2 digits of m_pszDesc
dwRet = 0; GetObjectInfo( &dwRet, NULL );
dwRet &= (~SCE_STATUS_PERMISSION_MISMATCH | 0x0F); ObjectStatusToString(dwRet, &str); dwRet = ERROR_SUCCESS; break;
case 3: str = szDesc+3; dwRet = ERROR_SUCCESS; break;
default: break; } } }
return dwRet; }
/*--------------------------------------------------------------------------------------------------
Method: AddResultItem()
Synopisi: Adds a result item to the list.
Arguments: [handle] - [in] A handle returned by GetResultItemHandle(). [pResult] - [in] The result item to add.
Returns: ERROR_SUCCESS - The result item was added. ERROR_INVALID_PARAMETER - [handle] is invalid, or pResult is NULL. --------------------------------------------------------------------------------------------------*/ DWORD CFolder::AddResultItem( HANDLE handle, CResult *pResult) { if(!pResult || handle != (HANDLE)&m_resultItemList) return ERROR_INVALID_PARAMETER;
m_resultItemList.AddHead(pResult); return ERROR_SUCCESS; }
/*--------------------------------------------------------------------------------------------------
Method: RemoveResultItem()
Synopisi: Removes a result item from the list..
Arguments: [handle] - [in] A handle returned by GetResultItemHandle(). [pResult] - [in] The result item to remove.
Returns: ERROR_SUCCESS - The item was removed ERROR_INVALID_PARAMETER - [handle] is invalid, or pResult is NULL. ERROR_RESOURCE_NOT_FOUND - The result item does not exist withen this folder. --------------------------------------------------------------------------------------------------*/ DWORD CFolder::RemoveResultItem ( HANDLE handle, CResult *pItem) { if(!pItem || handle != (HANDLE)&m_resultItemList) return ERROR_INVALID_PARAMETER;
POSITION posCur; POSITION pos = m_resultItemList.GetHeadPosition(); while(pos) { posCur = pos; if ( m_resultItemList.GetNext(pos) == pItem ) { m_resultItemList.RemoveAt(posCur); return ERROR_SUCCESS; } }
return ERROR_RESOURCE_NOT_FOUND; }
/*--------------------------------------------------------------------------------------------------
Method: ReleaseResultItemHandle()
Synopisi: Release associated data with the handle. If the ref count goes to zero then all result items are removed from the list.
Arguments: [handle] - [in] A handle returned by GetResultItemHandle().
Returns: ERROR_SUCCESS - The function succeded ERROR_INVALID_PARAMETER - [handle] is invalid. --------------------------------------------------------------------------------------------------*/ DWORD CFolder::ReleaseResultItemHandle( HANDLE &handle) { if(handle != (HANDLE)&m_resultItemList) return ERROR_INVALID_PARAMETER;
if( !m_iRefCount ) return ERROR_SUCCESS;
m_iRefCount--;
if(!m_iRefCount) { while (!m_resultItemList.IsEmpty () ) { CResult* pResult = m_resultItemList.RemoveHead (); if ( pResult ) pResult->Release (); } }
handle = NULL; return ERROR_SUCCESS; }
///////////////////////////////////////////////////////////////////////////////////////////////////////
// CResult
//
//+--------------------------------------------------------------------------
//
// Method: Create
//
// Synopsis: Initialize a CResult Object
//
//
// Arguments: [szAttr] - The result item's display name
// [dwBase] - The item's template setting
// [dwSetting] - The item's last inspected setting
// [type] - The type of the item's setting
// [status] - The matched status of the item
// [cookie] - The MMC cookie for this item
// [szUnits] - The units this item's setting is measured in
// [nID] - An identifier for the item, dependant on the type
// [pBaseInfo] - The template object this item belongs to
// [pDataObj] - The data object of the scope pane this item belongs to
// [pNotify] - Object to pass notifications through
// History:
//
//---------------------------------------------------------------------------
HRESULT CResult::Create(LPCTSTR szAttr, // attribute's display name
LONG_PTR dwBase, // template setting
LONG_PTR dwSetting, // last inspected setting
RESULT_TYPES type, // type of the item's setting
int status, // matched status of the item
MMC_COOKIE cookie, // the MMC cookie for this item
LPCTSTR szUnits, // units the setting is measured in
LONG_PTR nID, // An identifier for the item, dependant on the type
PEDITTEMPLATE pBaseInfo, // The template object this item belongs to
LPDATAOBJECT pDataObj, // The data object of the scope pane this item belongs to
LPNOTIFY pNotify, // Notification object
CSnapin *pSnapin, // Snapin window which owns this object
long hID) // Identify this item, Raid #510407, 2/25/2002, yanggao
{ HRESULT hr = S_OK;
m_hID = hID; m_type = type; m_status = status; m_cookie = cookie; m_dwBase = dwBase; m_dwSetting = dwSetting; m_nID = nID; m_profBase = pBaseInfo; //m_pDataObj = pDataObj;
m_pNotify = pNotify;
if( !m_pSnapin ) //Raid #479626, Yanggao
{ m_pSnapin = pSnapin; if( m_pSnapin ) { m_pSnapin->AddRef(); } }
UINT uiByteLen = 0; LPTSTR psz = 0;
if ( szAttr != NULL ) { uiByteLen = (lstrlen(szAttr) + 1); psz = new TCHAR[uiByteLen];
if (psz != NULL) { //This is a safe usage.
lstrcpy(psz, szAttr); } else { hr = E_OUTOFMEMORY; }
if (m_szAttr) { delete [] m_szAttr; } m_szAttr = psz; }
if ( szUnits != NULL ) { SetUnits( szUnits ); if(!m_szUnits){ hr = E_OUTOFMEMORY; } }
return hr; }
CResult::~CResult() //Raid #479626, Yanggao
{ if( m_pSnapin ) { m_pSnapin->Release(); m_pSnapin = NULL; }
Empty(); }
void CResult::SetUnits( LPCTSTR sz) { if (ITEM_GROUP == GetType()) { //
// we shouldn't be storing this in a string storage
// This isn't actually a string and shouldn't be copied. Yuck.
//
m_szUnits = (LPTSTR)sz; } else { if(m_szUnits) { LocalFree(m_szUnits); } m_szUnits = NULL; if(sz) { int iLen = lstrlen(sz); m_szUnits = (LPTSTR) LocalAlloc(0, (iLen + 1) * sizeof(TCHAR));
if(!m_szUnits) return; //This is a safe usage.
lstrcpy(m_szUnits, sz); } } }
//+--------------------------------------------------------------------------
//
// Method: Update
//
// Synopsis: Updates a changed result item and broadcasts
// that change appropriately
//
// History:
//
//---------------------------------------------------------------------------
void CResult::Update(CSnapin *pSnapin, BOOL bEntirePane) { LPARAM hint = 0;
//
// Set the appropriate template section as needing to be saved
//
if (m_profBase) { //
// m_profBase will only be set for Configuation templates.
// It will not be set for Analysis items
//
if (m_cookie && ((CFolder *)m_cookie)->GetType() < AREA_POLICY_ANALYSIS ) { switch ( ((CFolder *)m_cookie)->GetType()) { case POLICY_ACCOUNT: case POLICY_LOCAL: case POLICY_EVENTLOG: case POLICY_PASSWORD: case POLICY_KERBEROS: case POLICY_LOCKOUT: case POLICY_AUDIT: case POLICY_OTHER: case POLICY_LOG: m_profBase->SetDirty(AREA_SECURITY_POLICY); break; case AREA_PRIVILEGE: m_profBase->SetDirty(AREA_PRIVILEGES); break; case AREA_GROUPS: m_profBase->SetDirty(AREA_GROUP_MEMBERSHIP); break; case AREA_SERVICE: m_profBase->SetDirty(AREA_SYSTEM_SERVICE); break; case AREA_REGISTRY: m_profBase->SetDirty(AREA_REGISTRY_SECURITY); break; case AREA_FILESTORE: m_profBase->SetDirty(AREA_FILE_SECURITY); break; } } }
//
// Query the snap in data.
//
LPDATAOBJECT pDataObj; if( pSnapin->QueryDataObject( m_cookie, CCT_RESULT, &pDataObj ) != S_OK){ return; }
if(!m_pNotify){ return; }
//
// Update all views.
//
if(bEntirePane) { if(!pSnapin->GetSelectedFolder()) { return; } if( pDataObj && m_pNotify ) //Raid #357968, #354861, 4/25/2001
{ LPNOTIFY pNotify = m_pNotify; pSnapin->GetSelectedFolder()->RemoveAllResultItems(); pNotify->UpdateAllViews( pDataObj, (LPARAM)pSnapin->GetSelectedFolder(), UAV_RESULTITEM_UPDATEALL ); } } else { if (pDataObj && m_pNotify) { m_pNotify->UpdateAllViews( pDataObj, NULL, pSnapin->GetSelectedFolder(), this, UAV_RESULTITEM_UPDATE ); pDataObj->Release(); } } }
//+--------------------------------------------------------------------------
//
// Method: GetAttrPretty
//
// Synopsis: Get the Attribute's display name as it should be displayed
// in the result pane
//
// History:
//
//---------------------------------------------------------------------------
LPCTSTR CResult::GetAttrPretty() { return GetAttr(); }
//+--------------------------------------------------------------------------
//
// Method: CResult::GetStatusErrorString
//
// Synopsis: This function caclulates the error status string to display
// for the CResult item. In LPO mode it always returns
// IDS_NOT_DEFINED, and for MB_TEMPLATE_EDITOR mode it always
// Loads IDS_NOT_CONFIGURED
//
// Arguments: [pStr] - [Optional] CString object to load resource with.
//
// Returns: The resource ID to load. else zero if the error is not
// defined.
//
// History: a-mthoge 11/17/1998
//
//---------------------------------------------------------------------------
DWORD CResult::GetStatusErrorString( CString *pStr ) { DWORD nRes = 0; if( m_cookie ) { if( ((CFolder *)m_cookie)->GetModeBits() & MB_LOCALSEC ) { if (GetType() ==ITEM_LOCALPOL_REGVALUE) { nRes = IDS_NOT_DEFINED; } else { nRes = IDS_NOT_APPLICABLE; } } else if ( ((CFolder *)m_cookie)->GetModeBits() & MB_RSOP ) { nRes = IDS_NO_POLICY; } else if (((CFolder *)m_cookie)->GetModeBits() & MB_ANALYSIS_VIEWER) { nRes = IDS_NOT_ANALYZED; } else if( ((CFolder *)m_cookie)->GetModeBits() & (MB_TEMPLATE_EDITOR | MB_SINGLE_TEMPLATE_ONLY) ) { nRes = IDS_NOT_CONFIGURED; } }
if(!nRes) { nRes = GetStatus(); if(!nRes) { nRes = GetStatus(); } nRes = ObjectStatusToString( nRes, pStr ); } else if(pStr) { pStr->LoadString( nRes ); } return nRes; }
LPCTSTR CResult::GetSourceGPOString() { // ASSERT(pFolder->GetModeBits() & RSOP);
vector<PPRECEDENCEDISPLAY>* vppd = GetPrecedenceDisplays(); if (vppd && !vppd->empty()) { PPRECEDENCEDISPLAY ppd = vppd->front(); return ppd->m_szGPO; } return NULL; }
//+--------------------------------------------------------------------------
//
// Method: CResult::GetDisplayName
//
// Synopsis: Gets the display name for the result item.
//
// Arguments: [pFolder] - [Optional] If this parameter is NULL, m_Cookie
// is used as the CFolder object.
// [str] - [out] On exit this function will contain the
// string to display.
// [iCol] - [in] The column you want to retrieve the string
// for.
//
// Returns: ERROR_SUCCESS - [str] is a valid string for the column.
//
// History: a-mthoge 11/17/1998
//
//---------------------------------------------------------------------------
DWORD CResult::GetDisplayName( CFolder *pFolder, CString &str, int iCol ) { DWORD dwRet = ERROR_INVALID_PARAMETER;
//
// If pFolder is not passed in then use the cookie as the CFolder
// object.
//
if ( pFolder ) { // bogus assertion?
// ASSERT(pFolder != (CFolder *)GetCookie());
} else { pFolder = (CFolder *)GetCookie(); }
LPTSTR pszAlloc = NULL; int npos = 0; if (iCol == 0) { //
// First column strings.
//
str = GetAttr();
if (pFolder && (pFolder->GetType() < AREA_POLICY || pFolder->GetType() > REG_OBJECTS) ) { //
// SCE Object strings
//
npos = str.ReverseFind(L'\\'); } else { npos = 0; }
//
// All other strings.
//
if ( npos > 0 ) { str = GetAttr() + npos + 1; } return ERROR_SUCCESS; }
if ( pFolder ) { //
// Items that are defined by the folder type.
//
if ((pFolder->GetType() == AREA_REGISTRY || pFolder->GetType() == AREA_FILESTORE) && ((pFolder->GetModeBits() & MB_RSOP) == MB_RSOP) && iCol == 1) { str = GetSourceGPOString(); return ERROR_SUCCESS; }
switch (pFolder->GetType()) { case AREA_REGISTRY: case AREA_FILESTORE: //
// profile objects area
//
switch (GetStatus()) { case SCE_STATUS_IGNORE: str.LoadString(IDS_OBJECT_IGNORE); break; case SCE_STATUS_OVERWRITE: str.LoadString(IDS_OBJECT_OVERWRITE); break; } dwRet = ERROR_SUCCESS; break; } if ( pFolder->GetType() >= AREA_REGISTRY_ANALYSIS && pFolder->GetType() < AREA_LOCALPOL ) { switch ( iCol ) { case 1: // permission status
dwRet = GetStatus() & (~SCE_STATUS_AUDIT_MISMATCH | 0x0F); ObjectStatusToString(dwRet, &str); break; case 2: // auditing status
dwRet = GetStatus() & (~SCE_STATUS_PERMISSION_MISMATCH | 0x0F); ObjectStatusToString(dwRet, &str); break; default: str = TEXT("0"); break; } dwRet = ERROR_SUCCESS; }
if (dwRet == ERROR_SUCCESS) { return dwRet; } }
//
// Items determined by result type.
//
switch ( GetType () ) { case ITEM_PROF_GROUP: if ( GetID() ) { //
// Group member ship strings.
//
PSCE_GROUP_MEMBERSHIP pgm; pgm = (PSCE_GROUP_MEMBERSHIP)( GetID() ); if ( iCol == 1) { //
// Members string.
//
ConvertNameListToString(pgm->pMembers, &pszAlloc); } else if (iCol == 2){ //
// Members of string.
//
ConvertNameListToString(pgm->pMemberOf, &pszAlloc); } else if (iCol == 3) { ASSERT(m_pSnapin->GetModeBits() & MB_RSOP); //bogus assertion
str = GetSourceGPOString(); } else { ASSERT(0 && "Illegal column"); } if (pszAlloc) { str = pszAlloc; delete [] pszAlloc; } } dwRet = ERROR_SUCCESS; break; case ITEM_GROUP: if ( GetID() ) { PSCE_GROUP_MEMBERSHIP pgm; pgm = (PSCE_GROUP_MEMBERSHIP)(GetID());
if (iCol == 1) { TranslateSettingToString( GetGroupStatus( pgm->Status, STATUS_GROUP_MEMBERS ), NULL, GetType(), &pszAlloc ); } else if (iCol == 2) {
TranslateSettingToString( GetGroupStatus(pgm->Status, STATUS_GROUP_MEMBEROF), NULL, GetType(), &pszAlloc ); } else { ASSERT(0 && "Illegal column"); } //
// Test to see if the result item already has a string, if it does then
// we will delete the old string.
//
if (pszAlloc) { str = pszAlloc; delete [] pszAlloc; } } dwRet = ERROR_SUCCESS; break; case ITEM_PROF_REGVALUE: if (iCol == 2 && (m_pSnapin->GetModeBits() & MB_RSOP) == MB_RSOP) { str = GetSourceGPOString(); break; } case ITEM_REGVALUE: case ITEM_LOCALPOL_REGVALUE: { PSCE_REGISTRY_VALUE_INFO prv = NULL;
if (iCol == 1) { prv = (PSCE_REGISTRY_VALUE_INFO)(GetBase()); } else if (iCol == 2) { prv = (PSCE_REGISTRY_VALUE_INFO)(GetSetting()); } else { ASSERT(0 && "Illegal column"); }
if ( prv ) { if ( iCol > 1 && !(prv->Value)) { //
// Determine status fron analysis.
//
GetStatusErrorString( &str ); dwRet = ERROR_SUCCESS; break; }
//
// Determine string by the item value.
//
if ( dwRet != ERROR_SUCCESS ) { pszAlloc = NULL; switch ( GetID() ) { case SCE_REG_DISPLAY_NUMBER: if ( prv->Value ) { TranslateSettingToString( _wtol(prv->Value), GetUnits(), ITEM_DW, &pszAlloc ); } break; case SCE_REG_DISPLAY_CHOICE: if ( prv->Value ) { TranslateSettingToString(_wtol(prv->Value), NULL, ITEM_REGCHOICE, &pszAlloc); } break; case SCE_REG_DISPLAY_FLAGS: if ( prv->Value ) { TranslateSettingToString(_wtol(prv->Value), NULL, ITEM_REGFLAGS, &pszAlloc); if( pszAlloc == NULL ) //Raid #286697, 4/4/2001
{ str.LoadString(IDS_NO_MIN); dwRet = ERROR_SUCCESS; } } break;
case SCE_REG_DISPLAY_MULTISZ: case SCE_REG_DISPLAY_STRING: if (prv && prv->Value) { str = prv->Value; dwRet = ERROR_SUCCESS; } break; default: // boolean
if ( prv->Value ) { long val; val = _wtol(prv->Value); TranslateSettingToString( val, NULL, ITEM_BOOL, &pszAlloc ); } break;
} }
if (dwRet != ERROR_SUCCESS) { if ( pszAlloc ) { str = pszAlloc; delete [] pszAlloc; } else { GetStatusErrorString(&str); } } } dwRet = ERROR_SUCCESS; } break; }
if (dwRet != ERROR_SUCCESS) { //
// Other areas.
//
if (iCol == 1) { if( GetBase() == (LONG_PTR)ULongToPtr(SCE_NO_VALUE)){ if( m_pSnapin->GetModeBits() & MB_LOCALSEC){ str.LoadString(IDS_NOT_APPLICABLE); } else { str.LoadString(IDS_NOT_CONFIGURED); } } else { //for compitability with template that has SCE_FOREVER_VALUE value.
if ( IDS_KERBEROS_RENEWAL == m_nID && SCE_FOREVER_VALUE == GetBase() ) { str.LoadString(IDS_NOT_CONFIGURED); } else { //
// Edit template
//
GetBase(pszAlloc); } } } else if (iCol == 2) { if ((m_pSnapin->GetModeBits() & MB_RSOP) == MB_RSOP) { //
// RSOP Mode
//
str = GetSourceGPOString(); } else { //
// Analysis Template.
//
GetSetting(pszAlloc); }
} else { ASSERT(0 && "Illegal column"); }
if (pszAlloc) { str = pszAlloc; delete [] pszAlloc; } dwRet = ERROR_SUCCESS; }
return dwRet; }
//+--------------------------------------------------------------------------
//
// Function: TranslateSettingToString
//
// Synopsis: Convert a result pane setting into a string
//
// Arguments: [setting] - [in] The value to be converted
// [unit] - [in, optiona] The string for the units to use
// [type] - [in] The type of the setting to be converted
// [LPTSTR] - [in|out] the address to store the string at
//
// Returns: *[LPTSTR] - the translated string
//
//---------------------------------------------------------------------------
void CResult::TranslateSettingToString(LONG_PTR setting, LPCTSTR unit, RESULT_TYPES type, LPTSTR* pTmpstr) { DWORD nRes = 0;
if (!pTmpstr) { ASSERT(pTmpstr); return; }
*pTmpstr = NULL;
switch ( (DWORD)setting ) //Raid 665368, yanggao, 8/9/2002.
{ case SCE_KERBEROS_OFF_VALUE: nRes = IDS_OFF; break;
case SCE_FOREVER_VALUE: nRes = IDS_FOREVER; break;
case SCE_ERROR_VALUE: nRes = IDS_ERROR_VALUE; break;
case SCE_NO_VALUE: nRes = GetStatusErrorString( NULL ); break;
case SCE_NOT_ANALYZED_VALUE: nRes = GetStatusErrorString( NULL ); break;
default: switch ( type ) { case ITEM_SZ: case ITEM_PROF_SZ: case ITEM_LOCALPOL_SZ: if (setting && setting != (LONG_PTR)ULongToPtr(SCE_NO_VALUE)) { *pTmpstr = new TCHAR[lstrlen((LPTSTR)setting)+1]; if (*pTmpstr) //This may not be a safe usage. pTmpstr is LPTSTR. Consider fix.
wcscpy(*pTmpstr,(LPTSTR)setting); } else nRes = GetStatusErrorString(NULL); break;
case ITEM_PROF_BOOL: case ITEM_LOCALPOL_BOOL: case ITEM_BOOL: if ( setting ) nRes = IDS_ENABLED; else nRes = IDS_DISABLED; break;
case ITEM_PROF_BON: case ITEM_LOCALPOL_BON: case ITEM_BON: if ( setting ) nRes = IDS_ON; else nRes = IDS_OFF; break;
case ITEM_PROF_B2ON: case ITEM_LOCALPOL_B2ON: case ITEM_B2ON: { CString strAudit; CString strFailure; if ( setting & AUDIT_SUCCESS ) strAudit.LoadString(IDS_SUCCESS);
if ( setting & AUDIT_FAILURE ) { if (setting & AUDIT_SUCCESS) strAudit += TEXT(", "); strFailure.LoadString(IDS_FAILURE); strAudit += strFailure; } if (strAudit.IsEmpty()) strAudit.LoadString(IDS_DO_NOT_AUDIT);
*pTmpstr = new TCHAR [ strAudit.GetLength()+1 ]; if (*pTmpstr) //This may not be a safe usage. pTmpstr is LPTSTR. Consider fix.
wcscpy(*pTmpstr, (LPCTSTR) strAudit); } break;
case ITEM_PROF_RET: case ITEM_LOCALPOL_RET: case ITEM_RET: switch(setting) { case SCE_RETAIN_BY_DAYS: nRes = IDS_BY_DAYS; break;
case SCE_RETAIN_AS_NEEDED: nRes = IDS_AS_NEEDED; break;
case SCE_RETAIN_MANUALLY: nRes = IDS_MANUALLY; break;
default: break; } break;
case ITEM_PROF_REGCHOICE: case ITEM_REGCHOICE: { PREGCHOICE pRegChoice = m_pRegChoices; while(pRegChoice) { if (pRegChoice->dwValue == (DWORD)setting) { if( pRegChoice->szName == NULL ) //Raid #553113, yanggao
{ *pTmpstr = NULL; break; } *pTmpstr = new TCHAR[lstrlen(pRegChoice->szName)+1]; if (*pTmpstr) //This is not a safe usage. Need to validate pRegChoice->szName.
wcscpy(*pTmpstr, (LPCTSTR) pRegChoice->szName); break; } pRegChoice = pRegChoice->pNext; } break; }
case ITEM_REGFLAGS: { TCHAR *pStr = NULL; PREGFLAGS pRegFlags = m_pRegFlags; while(pRegFlags) { if ((pRegFlags->dwValue & (DWORD) setting) == pRegFlags->dwValue) { pStr = *pTmpstr; if( pRegFlags->szName ) //Raid #553113, yanggao
{ *pTmpstr = new TCHAR[(pStr?lstrlen(pStr):0)+lstrlen(pRegFlags->szName)+2]; if (*pTmpstr) { if (pStr) { //This is not a safe usage. Need to validate pRegFlags->szName.
lstrcpy(*pTmpstr, (LPCTSTR) pStr); lstrcat(*pTmpstr,L","); lstrcat(*pTmpstr, pRegFlags->szName); } else //This is not a safe usage. Need to validate pRegFlags->szName.
lstrcpy(*pTmpstr, pRegFlags->szName); } } else { *pTmpstr = NULL; } if (pStr) delete [] pStr; } pRegFlags = pRegFlags->pNext; } break; }
case ITEM_PROF_GROUP: case ITEM_PROF_PRIVS: //Raid #483744, yanggao, reverse RSOP user right assignments order.
if (NULL != setting && (LONG_PTR)ULongToPtr(SCE_NO_VALUE) != setting ) { if( ITEM_PROF_PRIVS == type && (m_pSnapin->GetModeBits() & MB_RSOP) == MB_RSOP ) { ConvertNameListToString((PSCE_NAME_LIST) setting,pTmpstr,TRUE); } else { ConvertNameListToString((PSCE_NAME_LIST) setting,pTmpstr); } } break;
case ITEM_LOCALPOL_PRIVS: if (NULL != setting && (LONG_PTR)ULongToPtr(SCE_NO_VALUE) != setting ) ConvertNameListToString(((PSCE_PRIVILEGE_ASSIGNMENT) setting)->AssignedTo,pTmpstr); break;
case ITEM_PRIVS: if (NULL != setting && (LONG_PTR)ULongToPtr(SCE_NO_VALUE) != setting ) ConvertNameListToString(((PSCE_PRIVILEGE_ASSIGNMENT) setting)->AssignedTo,pTmpstr); else nRes = GetStatusErrorString(NULL); break;
case ITEM_GROUP: //nRes = GetStatusErrorString(NULL);
nRes = ObjectStatusToString((DWORD) setting, NULL);
if ( setting == MY__SCE_MEMBEROF_NOT_APPLICABLE ) nRes = IDS_NOT_APPLICABLE; break;
case ITEM_PROF_DW: case ITEM_LOCALPOL_DW: case ITEM_DW: nRes = 0; if ( unit ) { *pTmpstr = new TCHAR[wcslen(unit)+20]; if (*pTmpstr) //This is a safe usage.
swprintf(*pTmpstr, L"%d %s", setting, unit); } else { *pTmpstr = new TCHAR[20]; if (*pTmpstr) //This is a safe usage.
swprintf(*pTmpstr, L"%d", setting); } break;
default: *pTmpstr = NULL; break; } break; } if (nRes) { CString strRes; if (strRes.LoadString(nRes)) { *pTmpstr = new TCHAR[strRes.GetLength()+1]; if (*pTmpstr) //This may not be a safe usage. pTmpstr is PTSTR. Consider fix.
wcscpy(*pTmpstr, (LPCTSTR) strRes); else { //
// Couldn't allocate string so display will be blank.
//
} } else { //
// Couldn't load string so display will be blank.
//
} } }
//+--------------------------------------------------------------------------
//
// Function: GetProfileDefault()
//
// Synopsis: Find the default values for undefined policies
//
// Returns: The value to assign as the default value for the policy.
//
// SCE_NO_VALUE is returned on error.
//
//+--------------------------------------------------------------------------
DWORD_PTR CResult::GetProfileDefault() { PEDITTEMPLATE pet = NULL; SCE_PROFILE_INFO *pspi = NULL;
if (!m_pSnapin) { return (DWORD_PTR)ULongToPtr(SCE_NO_VALUE); } pet = m_pSnapin->GetTemplate(GT_DEFAULT_TEMPLATE); if (pet && pet->pTemplate) { pspi = pet->pTemplate; }
if( ITEM_PROF_SERV == m_type ) //Raid #485374, yanggao, 11/2/2001
{ if( _wcsicmp(pspi->pServices->ServiceName, L"PlaceHolder") == 0 ) { return (DWORD_PTR)pspi->pServices; } else { return (DWORD_PTR)ULongToPtr(SCE_NO_VALUE); } }
#define PROFILE_DEFAULT(X,Y) ((pspi && (pspi->X != SCE_NO_VALUE)) ? pspi->X : Y)
#define PROFILE_KERB_DEFAULT(X,Y) ((pspi && pspi->pKerberosInfo && (pspi->pKerberosInfo->X != SCE_NO_VALUE)) ? pspi->pKerberosInfo->X : Y)
switch (m_nID) { // L"Maximum passage age", L"Days"
case IDS_MAX_PAS_AGE: return PROFILE_DEFAULT(MaximumPasswordAge,42);
// L"Minimum passage age", L"Days"
case IDS_MIN_PAS_AGE: return PROFILE_DEFAULT(MinimumPasswordAge,0);
// L"Minimum passage length", L"Characters"
case IDS_MIN_PAS_LEN: return PROFILE_DEFAULT(MinimumPasswordLength,0);
// L"Password history size", L"Passwords"
case IDS_PAS_UNIQUENESS: return PROFILE_DEFAULT(PasswordHistorySize,0);
// L"Password complexity", L""
case IDS_PAS_COMPLEX: return PROFILE_DEFAULT(PasswordComplexity,0);
// L"Clear Text Password", L""
case IDS_CLEAR_PASSWORD: return PROFILE_DEFAULT(ClearTextPassword,0);
// L"Require logon to change password", L""
case IDS_REQ_LOGON: return PROFILE_DEFAULT(RequireLogonToChangePassword,0);
case IDS_KERBEROS_MAX_SERVICE: return PROFILE_KERB_DEFAULT(MaxServiceAge,600);
case IDS_KERBEROS_MAX_CLOCK: return PROFILE_KERB_DEFAULT(MaxClockSkew,5);
case IDS_KERBEROS_RENEWAL: return PROFILE_KERB_DEFAULT(MaxRenewAge,10);
case IDS_KERBEROS_MAX_AGE: return PROFILE_KERB_DEFAULT(MaxTicketAge,7);
case IDS_KERBEROS_VALIDATE_CLIENT: return PROFILE_KERB_DEFAULT(TicketValidateClient,1);
// L"Account lockout count", L"Attempts"
case IDS_LOCK_COUNT: return PROFILE_DEFAULT(LockoutBadCount,0);
// L"Reset lockout count after", L"Minutes"
case IDS_LOCK_RESET_COUNT: return PROFILE_DEFAULT(ResetLockoutCount,30);
// L"Lockout duration", L"Minutes"
case IDS_LOCK_DURATION: return PROFILE_DEFAULT(LockoutDuration,30);
// L"Event Auditing Mode",
case IDS_EVENT_ON: return 0;
// L"Audit system events"
case IDS_SYSTEM_EVENT: return PROFILE_DEFAULT(AuditSystemEvents,0);
// L"Audit logon events"
case IDS_LOGON_EVENT: return PROFILE_DEFAULT(AuditLogonEvents,0);
// L"Audit Object Access"
case IDS_OBJECT_ACCESS: return PROFILE_DEFAULT(AuditObjectAccess,0);
// L"Audit Privilege Use"
case IDS_PRIVILEGE_USE: return PROFILE_DEFAULT(AuditPrivilegeUse,0);
// L"Audit policy change"
case IDS_POLICY_CHANGE: return PROFILE_DEFAULT(AuditPolicyChange,0);
// L"Audit Account Manage"
case IDS_ACCOUNT_MANAGE: return PROFILE_DEFAULT(AuditAccountManage,0);
// L"Audit process tracking"
case IDS_PROCESS_TRACK: return PROFILE_DEFAULT(AuditProcessTracking,0); // L"Audit directory service access"
case IDS_DIRECTORY_ACCESS: return PROFILE_DEFAULT(AuditDSAccess,0);
// L"Audit Account Logon"
case IDS_ACCOUNT_LOGON: return PROFILE_DEFAULT(AuditAccountLogon,0);
// L"Network access: Allow anonymous SID/Name translation"
case IDS_LSA_ANON_LOOKUP: return PROFILE_DEFAULT(LSAAnonymousNameLookup,0);
// L"Force logoff when logon hour expire", L""
case IDS_FORCE_LOGOFF: return PROFILE_DEFAULT(ForceLogoffWhenHourExpire,0);
// L"Accounts: Administrator account status"
case IDS_ENABLE_ADMIN: return PROFILE_DEFAULT(EnableAdminAccount,1);
// L"Accounts: Guest account status"
case IDS_ENABLE_GUEST: return PROFILE_DEFAULT(EnableGuestAccount,0);
// L"... Log Maximum Size", L"KBytes"
case IDS_SYS_LOG_MAX: return PROFILE_DEFAULT(MaximumLogSize[0],512); case IDS_SEC_LOG_MAX: return PROFILE_DEFAULT(MaximumLogSize[0],512); case IDS_APP_LOG_MAX: return PROFILE_DEFAULT(MaximumLogSize[0],512); return 512;
// L"... Log Retention Method",
case IDS_SYS_LOG_RET: return PROFILE_DEFAULT(AuditLogRetentionPeriod[0],1); case IDS_SEC_LOG_RET: return PROFILE_DEFAULT(AuditLogRetentionPeriod[0],1); case IDS_APP_LOG_RET: return PROFILE_DEFAULT(AuditLogRetentionPeriod[0],1); return 1;
// L"... Log Retention days", "days"
case IDS_SYS_LOG_DAYS: return PROFILE_DEFAULT(RetentionDays[0],7); case IDS_SEC_LOG_DAYS: return PROFILE_DEFAULT(RetentionDays[0],7); case IDS_APP_LOG_DAYS: return PROFILE_DEFAULT(RetentionDays[0],7);
// L"RestrictGuestAccess", L""
case IDS_SYS_LOG_GUEST: return PROFILE_DEFAULT(RestrictGuestAccess[0],1); case IDS_SEC_LOG_GUEST: return PROFILE_DEFAULT(RestrictGuestAccess[0],1); case IDS_APP_LOG_GUEST: return PROFILE_DEFAULT(RestrictGuestAccess[0],1); }
return (DWORD_PTR)ULongToPtr(SCE_NO_VALUE); }
//+--------------------------------------------------------------------------
//
// Function: GetRegDefault()
//
// Synopsis: Find the default values for undefined policies
//
// Returns: The value to assign as the default value for the policy.
//
// SCE_NO_VALUE is returned on error.
//
//+--------------------------------------------------------------------------
DWORD_PTR CResult::GetRegDefault() { SCE_PROFILE_INFO *pspi = NULL; LPTSTR szValue = NULL; DWORD_PTR dwValue = SCE_NO_VALUE;
if (!m_pSnapin) { return (DWORD_PTR)ULongToPtr(SCE_NO_VALUE); }
PEDITTEMPLATE pet = m_pSnapin->GetTemplate(GT_DEFAULT_TEMPLATE); if (!pet || !pet->pTemplate) { return (DWORD_PTR)ULongToPtr(SCE_NO_VALUE); }
if (pet && pet->pTemplate) { pspi = pet->pTemplate; }
PSCE_REGISTRY_VALUE_INFO regArrayThis = (PSCE_REGISTRY_VALUE_INFO)m_dwBase; if (pspi != NULL) { PSCE_REGISTRY_VALUE_INFO regArray = pspi->aRegValues; DWORD nCount = pspi->RegValueCount;
for(DWORD i=0;i<nCount;i++) { if (0 == lstrcmpi(regArray[i].FullValueName, regArrayThis->FullValueName)) { szValue = regArray[i].Value; break; } } }
switch (regArrayThis->ValueType) { //Raid #652193, using REG value type instead of display type.
case REG_MULTI_SZ: //Raid #413311, 6/11/2001, Yanggao
case REG_SZ: case REG_EXPAND_SZ: if (szValue) { dwValue = (DWORD_PTR)szValue; //Raid #367756, 4/13/2001
} else { dwValue = 0; } break; case REG_BINARY: case REG_DWORD: if (szValue) { dwValue = (DWORD)StrToLong(szValue); } if (dwValue == SCE_NO_VALUE) { dwValue = 1; } break; default: if (szValue) { dwValue = (DWORD)StrToLong(szValue); //Raid #413311, 6/11/2001, Yanggao
} //Some security option in group policy is not defined. Their property pages should not display
//any item checked. It confuses user and creates inconsistence.
break; }
return dwValue; } //+--------------------------------------------------------------------------
//
// Function: GetSnapin()
//
// Synopsis: Find current snapin of result item.
//
// Returns: Pointer of snapin
//
//+--------------------------------------------------------------------------
CSnapin* CResult::GetSnapin() { return m_pSnapin; }
|