Leaked source code of windows server 2003
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.
 
 
 
 
 
 

1024 lines
30 KiB

/////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 1996-2002 Microsoft Corporation
//
// Module Name:
// SmbShare.cpp
//
// Abstract:
// Implementation of the CFileShareParamsPage classes.
//
// Author:
// David Potter (davidp) June 28, 1996
//
// Revision History:
//
// Notes:
//
/////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include <lmcons.h>
#include <lmaccess.h>
#include <clusudef.h>
#include "CluAdmX.h"
#include "ExtObj.h"
#include "SmbShare.h"
#include "DDxDDv.h"
#include "PropList.h"
#include "HelpData.h"
#include "FSAdv.h"
#include "FSCache.h"
#include "ExcOper.h"
#include <sddl.h>
#include "SmbSSht.h"
#include "AclUtils.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CFileShareParamsPage property page
/////////////////////////////////////////////////////////////////////////////
IMPLEMENT_DYNCREATE(CFileShareParamsPage, CBasePropertyPage)
/////////////////////////////////////////////////////////////////////////////
// Message Maps
BEGIN_MESSAGE_MAP(CFileShareParamsPage, CBasePropertyPage)
//{{AFX_MSG_MAP(CFileShareParamsPage)
ON_EN_CHANGE(IDC_PP_FILESHR_PARAMS_SHARE_NAME, OnChangeRequiredField)
ON_EN_CHANGE(IDC_PP_FILESHR_PARAMS_PATH, OnChangeRequiredField)
ON_BN_CLICKED(IDC_PP_FILESHR_PARAMS_MAX_USERS_ALLOWED_RB, OnBnClickedMaxUsers)
ON_BN_CLICKED(IDC_PP_FILESHR_PARAMS_MAX_USERS_RB, OnBnClickedMaxUsers)
ON_EN_CHANGE(IDC_PP_FILESHR_PARAMS_MAX_USERS, OnEnChangeMaxUsers)
ON_BN_CLICKED(IDC_PP_FILESHR_PARAMS_PERMISSIONS, OnBnClickedPermissions)
ON_BN_CLICKED(IDC_PP_FILESHR_PARAMS_ADVANCED, OnBnClickedAdvanced)
ON_BN_CLICKED(IDC_PP_FILESHR_PARAMS_CACHING, OnBnClickedCaching)
//}}AFX_MSG_MAP
// TODO: Modify the following lines to represent the data displayed on this page.
ON_EN_CHANGE(IDC_PP_FILESHR_PARAMS_REMARK, CBasePropertyPage::OnChangeCtrl)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CFileShareParamsPage::CFileShareParamsPage
//
// Routine Description:
// Default constructor.
//
// Arguments:
// None.
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
CFileShareParamsPage::CFileShareParamsPage( void )
: CBasePropertyPage(g_aHelpIDs_IDD_PP_FILESHR_PARAMETERS, g_aHelpIDs_IDD_WIZ_FILESHR_PARAMETERS)
{
// TODO: Modify the following lines to represent the data displayed on this page.
//{{AFX_DATA_INIT(CFileShareParamsPage)
m_strShareName = _T("");
m_strPath = _T("");
m_strRemark = _T("");
//}}AFX_DATA_INIT
m_psec = NULL;
m_psecNT4 = NULL;
m_psecNT5 = NULL;
m_psecPrev = NULL;
m_dwMaxUsers = (DWORD) -1;
m_bShareSubDirs = FALSE;
m_bPrevShareSubDirs = FALSE;
m_bHideSubDirShares = FALSE;
m_bPrevHideSubDirShares = FALSE;
m_bIsDfsRoot = FALSE;
m_bPrevIsDfsRoot = FALSE;
// Setup the property array.
{
m_rgProps[epropShareName].Set(REGPARAM_FILESHR_SHARE_NAME, m_strShareName, m_strPrevShareName);
m_rgProps[epropPath].Set(REGPARAM_FILESHR_PATH, m_strPath, m_strPrevPath);
m_rgProps[epropRemark].Set(REGPARAM_FILESHR_REMARK, m_strRemark, m_strPrevRemark);
m_rgProps[epropMaxUsers].Set(REGPARAM_FILESHR_MAX_USERS, m_dwMaxUsers, m_dwPrevMaxUsers);
m_rgProps[epropShareSubDirs].Set(REGPARAM_FILESHR_SHARE_SUBDIRS, m_bShareSubDirs, m_bPrevShareSubDirs, CObjectProperty::opfNew);
m_rgProps[epropHideSubDirShares].Set(REGPARAM_FILESHR_HIDE_SUBDIR_SHARES, m_bHideSubDirShares, m_bPrevHideSubDirShares, CObjectProperty::opfNew);
m_rgProps[epropIsDfsRoot].Set(REGPARAM_FILESHR_IS_DFS_ROOT, m_bIsDfsRoot, m_bPrevIsDfsRoot, CObjectProperty::opfNew);
m_rgProps[epropCSCCache].Set(REGPARAM_FILESHR_CSC_CACHE, m_dwCSCCache, m_dwPrevCSCCache, CObjectProperty::opfNew);
} // Setup the property array
m_iddPropertyPage = IDD_PP_FILESHR_PARAMETERS;
m_iddWizardPage = IDD_WIZ_FILESHR_PARAMETERS;
} //*** CFileShareParamsPage::CFileShareParamsPage()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CFileShareParamsPage::~CFileShareParamsPage
//
// Routine Description:
// Destructor.
//
// Arguments:
// None.
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
CFileShareParamsPage::~CFileShareParamsPage(
void
)
{
::LocalFree(m_psec);
::LocalFree(m_psecNT4);
::LocalFree(m_psecNT5);
::LocalFree(m_psecPrev);
} //*** CFileShareParamsPage::~CFileShareParamsPage()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CFileShareParamsPage::ScParseUnknownProperty
//
// Routine Description:
// Parse a property that is not in the array of automatically-parsed
// properties.
//
// Arguments:
// pwszName [IN] Name of the property.
// rvalue [IN] CLUSPROP property value.
// cbBuf [IN] Total size of the value buffer.
//
// Return Value:
// ERROR_SUCCESS Properties were parsed successfully.
//
// Exceptions Thrown:
//
//--
/////////////////////////////////////////////////////////////////////////////
DWORD
CFileShareParamsPage::ScParseUnknownProperty(
IN LPCWSTR pwszName,
IN const CLUSPROP_BUFFER_HELPER & rvalue,
IN DWORD cbBuf
)
{
ASSERT(pwszName != NULL);
ASSERT(rvalue.pb != NULL);
DWORD sc = ERROR_SUCCESS;
if ( ClRtlStrNICmp( pwszName, REGPARAM_FILESHR_SD, RTL_NUMBER_OF( REGPARAM_FILESHR_SD ) ) == 0 )
{
sc = ScConvertPropertyToSD(rvalue, cbBuf, &m_psecNT5);
} // if: new security descriptor
if (sc == ERROR_SUCCESS)
{
if ( ClRtlStrNICmp( pwszName, REGPARAM_FILESHR_SECURITY, RTL_NUMBER_OF( REGPARAM_FILESHR_SECURITY ) ) == 0 )
{
sc = ScConvertPropertyToSD(rvalue, cbBuf, &m_psecNT4);
} // if: old security descriptor
} // if:
return sc;
} //*** CFileShareParamsPage::ScParseUnknownProperty()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CFileShareParamsPage::DoDataExchange
//
// Routine Description:
// Do data exchange between the dialog and the class.
//
// Arguments:
// pDX [IN OUT] Data exchange object
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
void
CFileShareParamsPage::DoDataExchange(
CDataExchange * pDX
)
{
if (!pDX->m_bSaveAndValidate || !BSaved())
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO: Modify the following lines to represent the data displayed on this page.
//{{AFX_DATA_MAP(CFileShareParamsPage)
DDX_Control(pDX, IDC_PP_FILESHR_PARAMS_PERMISSIONS, m_pbPermissions);
DDX_Control(pDX, IDC_PP_FILESHR_PARAMS_MAX_USERS_SPIN, m_spinMaxUsers);
DDX_Control(pDX, IDC_PP_FILESHR_PARAMS_MAX_USERS_RB, m_rbMaxUsers);
DDX_Control(pDX, IDC_PP_FILESHR_PARAMS_MAX_USERS_ALLOWED_RB, m_rbMaxUsersAllowed);
DDX_Control(pDX, IDC_PP_FILESHR_PARAMS_MAX_USERS, m_editMaxUsers);
DDX_Control(pDX, IDC_PP_FILESHR_PARAMS_REMARK, m_editRemark);
DDX_Control(pDX, IDC_PP_FILESHR_PARAMS_PATH, m_editPath);
DDX_Control(pDX, IDC_PP_FILESHR_PARAMS_SHARE_NAME, m_editShareName);
DDX_Text(pDX, IDC_PP_FILESHR_PARAMS_SHARE_NAME, m_strShareName);
DDX_Text(pDX, IDC_PP_FILESHR_PARAMS_PATH, m_strPath);
DDX_Text(pDX, IDC_PP_FILESHR_PARAMS_REMARK, m_strRemark);
//}}AFX_DATA_MAP
#ifndef UDM_SETRANGE32
#define UDM_SETRANGE32 (WM_USER+111)
#endif
#ifndef UD_MAXVAL32
#define UD_MAXVAL32 0x7fffffff
#endif
if (pDX->m_bSaveAndValidate)
{
if (!BBackPressed())
{
DDV_MaxChars(pDX, m_strShareName, NNLEN);
DDV_MaxChars(pDX, m_strPath, MAX_PATH);
DDV_MaxChars(pDX, m_strRemark, MAXCOMMENTSZ);
DDV_RequiredText(pDX, IDC_PP_FILESHR_PARAMS_SHARE_NAME, IDC_PP_FILESHR_PARAMS_SHARE_NAME_LABEL, m_strShareName);
DDV_RequiredText(pDX, IDC_PP_FILESHR_PARAMS_PATH, IDC_PP_FILESHR_PARAMS_PATH_LABEL, m_strPath);
} // if: Back button not pressed
// Get the max # users.
if (m_rbMaxUsersAllowed.GetCheck() == BST_CHECKED)
m_dwMaxUsers = (DWORD) -1;
else if (BBackPressed())
DDX_Text(pDX, IDC_PP_FILESHR_PARAMS_MAX_USERS, m_dwMaxUsers);
else
#ifdef UD32
DDX_Number(pDX, IDC_PP_FILESHR_PARAMS_MAX_USERS, m_dwMaxUsers, 1, UD_MAXVAL32, FALSE /*bSigned*/);
#else
DDX_Number(pDX, IDC_PP_FILESHR_PARAMS_MAX_USERS, m_dwMaxUsers, 1, UD_MAXVAL, FALSE /*bSigned*/);
#endif
} // if: saving data from dialog
else
{
#ifdef UD32
DDX_Number(pDX, IDC_PP_FILESHR_PARAMS_MAX_USERS, m_dwMaxUsers, 1, UD_MAXVAL32, FALSE /*bSigned*/);
#else
DDX_Number(pDX, IDC_PP_FILESHR_PARAMS_MAX_USERS, m_dwMaxUsers, 1, UD_MAXVAL, FALSE /*bSigned*/);
#endif
if (m_dwMaxUsers == (DWORD) -1)
{
m_rbMaxUsersAllowed.SetCheck(BST_CHECKED);
m_rbMaxUsers.SetCheck(BST_UNCHECKED);
m_editMaxUsers.SetWindowText(_T(""));
} // if: unlimited specified
else
{
m_rbMaxUsersAllowed.SetCheck(BST_UNCHECKED);
m_rbMaxUsers.SetCheck(BST_CHECKED);
} // else: a maximum was specified
} // else: setting data to dialog
} // if: not saving or haven't saved yet
CBasePropertyPage::DoDataExchange(pDX);
} //*** CFileShareParamsPage::DoDataExchange()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CFileShareParamsPage::OnInitDialog
//
// Routine Description:
// Handler for the WM_INITDIALOG message.
//
// Arguments:
// None.
//
// Return Value:
// TRUE We need the focus to be set for us.
// FALSE We already set the focus to the proper control.
//
//--
/////////////////////////////////////////////////////////////////////////////
BOOL
CFileShareParamsPage::OnInitDialog(
void
)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CBasePropertyPage::OnInitDialog();
// Set limits on the edit controls.
m_editShareName.SetLimitText(NNLEN);
m_editPath.SetLimitText(MAX_PATH);
m_editRemark.SetLimitText(MAXCOMMENTSZ);
// Set the spin control limits.
#ifdef UD32
m_spinMaxUsers.SendMessage(UDM_SETRANGE32, 1, UD_MAXVAL32);
#else
m_spinMaxUsers.SetRange(1, UD_MAXVAL);
#endif
m_pbPermissions.EnableWindow(TRUE);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
} //*** CFileShareParamsPage::OnInitDialog()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CFileShareParamsPage::OnSetActive
//
// Routine Description:
// Handler for the PSN_SETACTIVE message.
//
// Arguments:
// None.
//
// Return Value:
// TRUE Page successfully initialized.
// FALSE Page not initialized.
//
//--
/////////////////////////////////////////////////////////////////////////////
BOOL
CFileShareParamsPage::OnSetActive(
void
)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// Enable/disable the Next/Finish button.
if (BWizard())
{
if ((m_strShareName.GetLength() == 0) || (m_strPath.GetLength() == 0))
EnableNext(FALSE);
else
EnableNext(TRUE);
} // if: enable/disable the Next button
return CBasePropertyPage::OnSetActive();
} //*** CFileShareParamsPage::OnSetActive()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CFileShareParamsPage::BApplyChanges
//
// Routine Description:
// Apply changes made on the page.
//
// Arguments:
// None.
//
// Return Value:
// TRUE Page successfully applied.
// FALSE Error applying page.
//
//--
/////////////////////////////////////////////////////////////////////////////
BOOL
CFileShareParamsPage::BApplyChanges(
void
)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CWaitCursor wc;
return CBasePropertyPage::BApplyChanges();
} //*** CFileShareParamsPage::BApplyChanges()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CFileShareParamsPage::BBuildPropList
//
// Routine Description:
// Build the property list.
//
// Arguments:
// rcpl [IN OUT] Cluster property list.
// bNoNewProps [IN] TRUE = exclude properties marked with opfNew.
//
// Return Value:
// None.
//
// Exceptions Thrown:
// Any exceptions thrown by CClusPropList::ScAddProp().
//
//--
/////////////////////////////////////////////////////////////////////////////
BOOL CFileShareParamsPage::BBuildPropList(
IN OUT CClusPropList & rcpl,
IN BOOL bNoNewProps // = FALSE
)
{
BOOL bSuccess = FALSE;
DWORD sc = ERROR_SUCCESS;
//
// Call the base class method.
//
bSuccess = CBasePropertyPage::BBuildPropList(rcpl, bNoNewProps);
if (bSuccess)
{
//
// We are creating the file share resource when we are a wizard page. So when we
// are creating a file share resource and the security descriptor is NULL then
// we need to create an SD that has everyone read only.
//
if ((Peo()->BWizard()) && (m_psec == NULL))
{
sc = ScCreateDefaultSD(&m_psec);
} // if:
if (sc == ERROR_SUCCESS)
{
if (!bNoNewProps)
{
rcpl.ScAddProp(
REGPARAM_FILESHR_SD,
(LPBYTE) m_psec,
(m_psec == NULL ? 0 : ::GetSecurityDescriptorLength(m_psec)),
(LPBYTE) m_psecPrev,
(m_psecPrev == NULL ? 0 : ::GetSecurityDescriptorLength(m_psecPrev))
);
}
PSECURITY_DESCRIPTOR psd = ::ClRtlConvertFileShareSDToNT4Format(m_psec);
rcpl.ScAddProp(
REGPARAM_FILESHR_SECURITY,
(LPBYTE) psd,
(psd == NULL ? 0 : ::GetSecurityDescriptorLength(psd)),
(LPBYTE) m_psecPrev,
(m_psecPrev == NULL ? 0 : ::GetSecurityDescriptorLength(m_psecPrev))
);
::LocalFree(psd);
} // if:
else
{
bSuccess = FALSE;
} // else:
} // if: rest of property list build successfully
return bSuccess;
} //*** CFileShareParamsPage::BBuildPropList()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CFileShareParamsPage::OnChangeRequiredField
//
// Routine Description:
// Handler for the EN_CHANGE message on the Share name or Path edit
// controls.
//
// Arguments:
// None.
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
void CFileShareParamsPage::OnChangeRequiredField(void)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
OnChangeCtrl();
if (BWizard())
{
if ((m_editShareName.GetWindowTextLength() == 0)
|| (m_editPath.GetWindowTextLength() == 0))
{
EnableNext(FALSE);
}
else
{
EnableNext(TRUE);
}
} // if: in a wizard
} //*** CFileShareParamsPage::OnChangeRequiredField()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CFileShareParamsPage::OnBnClickedMaxUsers
//
// Routine Description:
// Handler for the BN_CLICKED message on the Max Users radio buttons.
//
// Arguments:
// None.
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
void CFileShareParamsPage::OnBnClickedMaxUsers(void)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
SetModified(TRUE);
if (m_rbMaxUsersAllowed.GetCheck() == BST_CHECKED)
{
m_editMaxUsers.SetWindowText(_T(""));
}
else
{
m_editMaxUsers.SetFocus();
}
} //*** CFileShareParamsPage::OnBnClickedMaxUsers()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CFileShareParamsPage::OnEnChangeMaxUsers
//
// Routine Description:
// Handler for the EN_CHANGE message on the Max Users edit control.
//
// Arguments:
// None.
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
void CFileShareParamsPage::OnEnChangeMaxUsers(void)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
OnChangeCtrl();
if (m_editMaxUsers.m_hWnd != NULL)
{
if (m_editMaxUsers.GetWindowTextLength() == 0)
{
m_rbMaxUsersAllowed.SetCheck(BST_CHECKED);
m_rbMaxUsers.SetCheck(BST_UNCHECKED);
} // if: maximum # users has not been specified
else
{
m_rbMaxUsersAllowed.SetCheck(BST_UNCHECKED);
m_rbMaxUsers.SetCheck(BST_CHECKED);
} // if: maximum # users has been specified
} // if: control variables have been initialized
} //*** CFileShareParamsPage::OnEnChangeMaxUsers()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CFileShareParamsPage::OnBnClickedPermissions
//
// Routine Description:
// Handler for the BN_CLICKED message on the Permissions push button.
//
// Arguments:
// None.
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
void CFileShareParamsPage::OnBnClickedPermissions(void)
{
AFX_MANAGE_STATE( AfxGetStaticModuleState() );
HRESULT hr = S_OK;
INT_PTR nRet = 0;
CString strNode;
CString strShareName;
//
// Get the node on which the Cluster Name resource is online.
//
if ( BGetClusterNetworkNameNode( strNode ) == FALSE )
{
return;
} // if:
CWaitCursor wc;
try
{
m_editShareName.GetWindowText( strShareName );
m_strCaption.Format(
IDS_ACLEDIT_PERMISSIONS,
(LPCTSTR) strShareName,
(LPCTSTR) Peo()->RrdResData().m_strName
);
CFileShareSecuritySheet fsSecurity( this, m_strCaption );
hr = fsSecurity.HrInit( this, Peo(), strNode, strShareName );
if ( SUCCEEDED( hr ) )
{
nRet = fsSecurity.DoModal();
m_strCaption.Empty();
} // if:
} // try:
catch ( CMemoryException * pme )
{
pme->Delete();
} // catch: MFC memory exception...
} //*** CFileShareParamsPage::OnBnClickedPermissions()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CFileShareParamsPage::OnBnClickedAdvanced
//
// Routine Description:
// Handler for the BN_CLICKED message on the Advanced push button.
//
// Arguments:
// None.
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
void CFileShareParamsPage::OnBnClickedAdvanced(void)
{
CFileShareAdvancedDlg dlg(m_bShareSubDirs, m_bHideSubDirShares, m_bIsDfsRoot, this);
AFX_MANAGE_STATE(AfxGetStaticModuleState());
if (dlg.DoModal() == IDOK)
{
if ( (m_bHideSubDirShares != dlg.m_bHideSubDirShares)
|| (m_bShareSubDirs != dlg.m_bShareSubDirs)
|| (m_bIsDfsRoot != dlg.m_bIsDfsRoot))
{
m_bHideSubDirShares = dlg.m_bHideSubDirShares;
m_bShareSubDirs = dlg.m_bShareSubDirs;
m_bIsDfsRoot = dlg.m_bIsDfsRoot;
SetModified(TRUE);
} // if: data changed
} // if: user accepted the dialog
} //*** CFileShareParamsPage::OnBnClickedAdvanced()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CFileShareParamsPage::OnBnClickedCaching
//
// Routine Description:
// Handler for the BN_CLICKED message on the Caching push button.
//
// Arguments:
// None.
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
void CFileShareParamsPage::OnBnClickedCaching(void)
{
CFileShareCachingDlg dlg(m_dwCSCCache, this);
AFX_MANAGE_STATE(AfxGetStaticModuleState());
if (dlg.DoModal() == IDOK)
{
if (m_dwCSCCache != dlg.m_dwFlags)
{
m_dwCSCCache = dlg.m_dwFlags;
SetModified(TRUE);
} // if: data changed
} // if: user accepted the dialog
} //*** CFileShareParamsPage::OnBnClickedCaching()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CFileShareParamsPage::SetSecurityDescriptor
//
// Routine Description:
// Save the passed in descriptor into m_psec.
//
// Arguments:
// psec [IN] new security descriptor
//
// Return Value:
//
//
//--
/////////////////////////////////////////////////////////////////////////////
HRESULT CFileShareParamsPage::SetSecurityDescriptor(
IN PSECURITY_DESCRIPTOR psec
)
{
ASSERT( psec != NULL );
AFX_MANAGE_STATE( AfxGetStaticModuleState() );
HRESULT hr = S_OK;
DWORD sc = ERROR_SUCCESS;
try
{
if ( psec != NULL )
{
ASSERT( IsValidSecurityDescriptor( psec ) );
if ( IsValidSecurityDescriptor( psec ) )
{
LocalFree( m_psecPrev );
m_psecPrev = NULL;
if ( m_psec == NULL )
{
m_psecPrev = NULL;
} // if: no previous value
else
{
m_psecPrev = ::ClRtlCopySecurityDescriptor( m_psec );
if ( m_psecPrev == NULL )
{
sc = GetLastError(); // Get the last error
hr = HRESULT_FROM_WIN32( sc ); // Convert to HRESULT
goto Cleanup;
} // if: error copying the security descriptor
} // else: previous value exists
LocalFree( m_psec );
m_psec = NULL;
m_psec = ::ClRtlCopySecurityDescriptor( psec );
if ( m_psec == NULL )
{
sc = GetLastError(); // Get the last error
hr = HRESULT_FROM_WIN32( sc ); // Convert to HRESULT
goto Cleanup;
} // if: error copying the security descriptor
SetModified( TRUE );
hr = S_OK;
} // if: security descriptor is valid
} // if: non-NULL security descriptor specified
else
{
TRACE( _T("CFileShareParamsPage::SetSecurityDescriptor() - ACLUI handed us back a NULL SD!\r") );
hr = E_UNEXPECTED;
}
} // try:
catch ( ... )
{
hr = E_FAIL;
} // catch: everything...
Cleanup:
return hr;
} //*** CFileShareParamsPage::SetSecurityDescriptor()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CFileShareParamsPage::ScConvertPropertyToSD
//
// Routine Description:
// Convert the property into an SD.
//
// Arguments:
// rvalue [IN] CLUSPROP property value.
// cbBuf [IN] Total size of the value buffer.
// ppsec [IN] SD to save the property to.
//
// Return Value:
// none.
//
// Exceptions Thrown:
// Any exceptions from CString::operator=().
//
//--
/////////////////////////////////////////////////////////////////////////////
DWORD CFileShareParamsPage::ScConvertPropertyToSD(
IN const CLUSPROP_BUFFER_HELPER & rvalue,
IN DWORD cbBuf,
IN PSECURITY_DESCRIPTOR *ppsec
)
{
ASSERT(rvalue.pSyntax->wFormat == CLUSPROP_FORMAT_BINARY);
ASSERT(cbBuf >= sizeof(*rvalue.pBinaryValue) + ALIGN_CLUSPROP(rvalue.pValue->cbLength));
ASSERT(ppsec);
DWORD sc = ERROR_SUCCESS;
if ((ppsec != NULL) && (rvalue.pBinaryValue->cbLength != 0))
{
*ppsec = ::LocalAlloc(LMEM_ZEROINIT, rvalue.pBinaryValue->cbLength);
if (*ppsec == NULL)
{
return ERROR_NOT_ENOUGH_MEMORY;
}
::CopyMemory(*ppsec, rvalue.pBinaryValue->rgb, rvalue.pBinaryValue->cbLength);
ASSERT(::IsValidSecurityDescriptor(*ppsec));
if (!::IsValidSecurityDescriptor(*ppsec))
{
::LocalFree(*ppsec);
*ppsec = NULL;
} // if: invalid security descriptor
} // if: security descriptor specified
else
{
if ( ppsec != NULL )
{
::LocalFree(*ppsec);
*ppsec = NULL;
}
} // else: no security descriptor specified
return sc;
} //*** CFileShareParamsPage::ScConvertPropertyToSD()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CFileShareParamsPage::Psec
//
// Routine Description:
// Return the SD for the FileShare. Since we may have two different
// SDs we have to choose one and go with it... Since AclUi can use
// the NT4 one without change it's OK to use it as is if the NT5 one
// is not present...
//
// Arguments:
// none.
//
// Return Value:
// The SD...
//
// Exceptions Thrown:
//
//--
/////////////////////////////////////////////////////////////////////////////
const PSECURITY_DESCRIPTOR CFileShareParamsPage::Psec(
void
)
{
//
// If we are in the wizard and m_psec is still NULL then the permissions
// button was clicked and we need a proper default SD to hand to ACLUI...
//
if ((Peo()->BWizard()) && (m_psec == NULL))
{
DWORD sc;
sc = ScCreateDefaultSD(&m_psec);
if (sc == ERROR_SUCCESS)
{
ASSERT(m_psec != NULL);
ASSERT(m_psecPre == NULL);
} // if:
else
{
//
// If this fails then there really isn't anything much to do...
// ACLUI will show everyone FULL control...
//
ASSERT(m_psec == NULL);
ASSERT(m_psecPre == NULL);
} // else:
} // if:
else
{
if (m_psec == NULL)
{
//
// try the NT5 one first...
//
if (m_psecNT5 != NULL)
{
m_psec = ::ClRtlCopySecurityDescriptor(m_psecNT5);
if ( m_psec == NULL )
{
goto Cleanup;
} // if: error copying the security descriptor
} // if: we have an NT5 SD...
else
{
if (m_psecNT4 != NULL)
{
m_psec = ::ClRtlCopySecurityDescriptor(m_psecNT4);
if ( m_psec == NULL )
{
goto Cleanup;
} // if: error copying the security descriptor
} // if: we have an NT4 SD...
} // else: we don't have an NT5 SD...
//
// Set current values as the previous values to track changes.
//
m_psecPrev = ::ClRtlCopySecurityDescriptor(m_psec);
} // if: we have an SD...
} // else:
Cleanup:
return m_psec;
} //*** CFileShareParamsPage::Psec()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CFileShareParamsPage::ScCreateDefaultSD
//
// Routine Description:
// When we are creating a new file share resource we need to create a
// default SD that has everyone read only in its ACL.
//
// Arguments:
// ppSecOut
//
// Return Value:
// ERROR_SUCCESS
//
// Exceptions Thrown:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
DWORD
CFileShareParamsPage::ScCreateDefaultSD(
PSECURITY_DESCRIPTOR * ppSecOut
)
{
ASSERT( ppSecOut != NULL );
BOOL fRet = TRUE;
DWORD sc = ERROR_SUCCESS;
PSECURITY_DESCRIPTOR pSec = NULL;
//
// Create a default SD and hand it out...
//
fRet = ConvertStringSecurityDescriptorToSecurityDescriptorW(
L"D:(A;;GRGX;;;WD)"
, SDDL_REVISION_1
, &pSec
, NULL
);
if ( fRet )
{
sc = ERROR_SUCCESS;
*ppSecOut = pSec;
} // if:
else
{
sc = GetLastError();
TRACE( _T( "CFileShareParamsPage::ScCreateDefaultSD() - ConvertStringSecurityDescriptorToSecurityDescriptorW() failed. (sc = %#08x)\r" ), sc );
} // else:
return sc;
} //*** CFileShareParamsPage::ScCreateDefaultSD()