///////////////////////////////////////////////////////////////////////////// // // 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 #include #include #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 #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()