|
|
/*++
Copyright (c) 1994-1998 Microsoft Corporation
Module Name :
fscfg.cpp
Abstract:
FTP Configuration Module
Author:
Ronald Meijer (ronaldm)
Project:
Internet Services Manager
Revision History:
--*/
//
// Include Files
//
#include "stdafx.h"
#include "fscfg.h"
#include "fservic.h"
#include "facc.h"
#include "fmessage.h"
#include "vdir.h"
#include "security.h"
#include "wizard.h"
#include "..\mmc\constr.h"
//
// Standard Configuration Information
//
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
#define SVC_ID INET_FTP_SVC_ID
#define INETSLOC_MASK (INET_FTP_SVCLOC_ID)
//
// Service capabilities flags
//
#define SERVICE_INFO_FLAGS (\
ISMI_UNDERSTANDINSTANCE | \ ISMI_INSTANCES | \ ISMI_CHILDREN | \ ISMI_INETSLOCDISCOVER | \ ISMI_CANCONTROLSERVICE | \ ISMI_CANPAUSESERVICE | \ ISMI_TASKPADS | \ ISMI_SECURITYWIZARD | \ ISMI_HASWEBPROTOCOL | \ ISMI_SUPPORTSMETABASE | \ ISMI_SUPPORTSMASTER | \ ISMI_NORMALTBMAPPING)
//
// Name used for this service by the service controller manager.
//
#define SERVICE_SC_NAME _T("MSFTPSVC")
//
// Short descriptive name of the service. This
// is what will show up as the name of the service
// in the internet manager tool.
//
// Issue: I'm assuming here that this name does NOT
// require localisation.
//
#define SERVICE_SHORT_NAME _T("FTP")
//
// Longer name. This is the text that shows up in
// the tooltips text on the internet manager
// tool. This probably should be localised.
//
#define SERVICE_LONG_NAME _T("FTP Service")
//
// Web browser protocol name. e.g. xxxxx://address
// A blank string if this is not supported.
//
#define SERVICE_PROTOCOL _T("ftp")
//
// Toolbar button background mask. This is
// the colour that gets masked out in
// the bitmap file and replaced with the
// actual button background. This setting
// is automatically assumed to be lt. gray
// if NORMAL_TB_MAPPING (above) is TRUE
//
#define BUTTON_BMP_BACKGROUND RGB(192, 192, 192) // Lt. Gray
//
// Resource ID of the toolbar button bitmap.
//
// The bitmap must be 16x16
//
#define BUTTON_BMP_ID IDB_FTP
//
// Similar to BUTTON_BMP_BACKGROUND, this is the
// background mask for the service ID
//
#define SERVICE_BMP_BACKGROUND RGB(255,0,255) // Purple
//
// Bitmap id which is used in the service view
// of the service manager. This may be the same
// bitmap as BUTTON_BMP_BACKGROUND.
//
// The bitmap must be 16x16.
//
#define SERVICE_BMP_ID IDB_FTPVIEW
//
// /* K2 */
//
// Similar to BUTTON_BMP_BACKGROUND, this is the
// background mask for the child bitmap
//
#define CHILD_BMP_BACKGROUND RGB(255, 0, 255) // Purple
//
// /* K2 */
//
// Bitmap id which is used for the child bitmap
//
// The bitmap must be 16x16.
//
#define CHILD_BMP_ID IDB_FTPDIR
#define CHILD_BMP32_ID IDB_FTPDIR32
//
// /* K2 */
//
// Large bitmap (32x32) id
//
#define SERVICE_BMP32_ID IDB_FTPVIEW32
//
// Service Name
//
const LPCTSTR g_cszSvc = _T("MSFTPSVC");
//
// Help IDs
//
#define HIDD_DIRECTORY_PROPERTIES (0x207DB)
#define HIDD_HOME_DIRECTORY_PROPERTIES (HIDD_DIRECTORY_PROPERTIES + 0x20000)
//
// End Of Standard configuration Information
//
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
CFTPInstanceProps::CFTPInstanceProps( IN LPCTSTR lpszServerName, IN DWORD dwInstance OPTIONAL ) /*++
Routine Description:
Constructor for FTP instance properties
Arguments:
LPCTSTR lpszServerName : Server name DWORD dwInstance : Instance number (could be MASTER_INSTANCE)
Return Value:
N/A
--*/ : CInstanceProps(lpszServerName, g_cszSvc, dwInstance, 21U), m_nMaxConnections((LONG)0L), m_nConnectionTimeOut((LONG)0L), m_dwLogType(MD_LOG_TYPE_DISABLED), /**/ m_strUserName(), m_strPassword(), m_fAllowAnonymous(FALSE), m_fOnlyAnonymous(FALSE), m_fPasswordSync(TRUE), m_acl(), /**/ m_strExitMessage(), m_strMaxConMsg(), m_strlWelcome(), /**/ m_fDosDirOutput(TRUE), /**/ m_dwDownlevelInstance(1) { //
// Fetch everything
//
m_dwMDUserType = ALL_METADATA; m_dwMDDataType = ALL_METADATA; }
/* virtual */ void CFTPInstanceProps::ParseFields() /*++
Routine Description:
Break into fields.
Arguments:
None.
Return Value:
None.
--*/ { //
// Fetch base properties
//
CInstanceProps::ParseFields();
BEGIN_PARSE_META_RECORDS(m_dwNumEntries, m_pbMDData) //
// Service Page
//
HANDLE_META_RECORD(MD_MAX_CONNECTIONS, m_nMaxConnections) HANDLE_META_RECORD(MD_CONNECTION_TIMEOUT, m_nConnectionTimeOut) HANDLE_META_RECORD(MD_LOG_TYPE, m_dwLogType) //
// Accounts Page
//
HANDLE_META_RECORD(MD_ANONYMOUS_USER_NAME, m_strUserName) HANDLE_META_RECORD(MD_ANONYMOUS_PWD, m_strPassword) HANDLE_META_RECORD(MD_ANONYMOUS_ONLY, m_fOnlyAnonymous) HANDLE_META_RECORD(MD_ALLOW_ANONYMOUS, m_fAllowAnonymous) HANDLE_META_RECORD(MD_ANONYMOUS_USE_SUBAUTH, m_fPasswordSync) HANDLE_META_RECORD(MD_ADMIN_ACL, m_acl) //
// Message Page
//
HANDLE_META_RECORD(MD_EXIT_MESSAGE, m_strExitMessage) HANDLE_META_RECORD(MD_MAX_CLIENTS_MESSAGE, m_strMaxConMsg) HANDLE_META_RECORD(MD_GREETING_MESSAGE, m_strlWelcome) //
// Directory Properties Page
//
HANDLE_META_RECORD(MD_MSDOS_DIR_OUTPUT, m_fDosDirOutput); END_PARSE_META_RECORDS }
/* virtual */ HRESULT CFTPInstanceProps::WriteDirtyProps() /*++
Routine Description:
Write the dirty properties to the metabase
Arguments:
None
Return Value:
HRESULT
--*/ { CError err(CInstanceProps::WriteDirtyProps());
if (err.Failed()) { return err; }
BEGIN_META_WRITE() //
// Service Page
//
META_WRITE(MD_MAX_CONNECTIONS, m_nMaxConnections) META_WRITE(MD_CONNECTION_TIMEOUT, m_nConnectionTimeOut) META_WRITE(MD_LOG_TYPE, m_dwLogType) //
// Accounts Page
//
META_WRITE(MD_ANONYMOUS_USER_NAME, m_strUserName) META_WRITE(MD_ANONYMOUS_PWD, m_strPassword) META_WRITE(MD_ANONYMOUS_ONLY, m_fOnlyAnonymous) META_WRITE(MD_ALLOW_ANONYMOUS, m_fAllowAnonymous) META_WRITE(MD_ANONYMOUS_USE_SUBAUTH, m_fPasswordSync) META_WRITE(MD_ADMIN_ACL, m_acl) //
// Message Page
//
META_WRITE(MD_EXIT_MESSAGE, m_strExitMessage) META_WRITE(MD_MAX_CLIENTS_MESSAGE, m_strMaxConMsg) META_WRITE(MD_GREETING_MESSAGE, m_strlWelcome) //
// Directory Properties Page
//
META_WRITE(MD_MSDOS_DIR_OUTPUT, m_fDosDirOutput); END_META_WRITE(err);
return err; }
CFTPDirProps::CFTPDirProps( IN LPCTSTR lpszServerName, IN DWORD dwInstance, OPTIONAL IN LPCTSTR lpszParent, OPTIONAL IN LPCTSTR lpszAlias OPTIONAL ) /*++
Routine Description:
FTP Directory properties object
Arguments:
LPCTSTR lpszServerName : Server name DWORD dwInstance : Instance number (could be MASTER_INSTANCE) LPCTSTR lpszParent : Parent path (could be NULL) LPCTSTR lpszAlias : Alias name (could be NULL)
Return Value:
N/A.
--*/ : CChildNodeProps( lpszServerName, g_cszSvc, dwInstance, lpszParent, lpszAlias, WITH_INHERITANCE, FALSE // Complete information
), /**/ m_fDontLog(FALSE), m_ipl() { //
// Fetch everything
//
m_dwMDUserType = ALL_METADATA; m_dwMDDataType = ALL_METADATA; }
/* virtual */ void CFTPDirProps::ParseFields() /*++
Routine Description:
Break into fields.
Arguments:
None.
Return Value:
None.
--*/ { //
// Fetch base properties
//
CChildNodeProps::ParseFields();
BEGIN_PARSE_META_RECORDS(m_dwNumEntries, m_pbMDData) HANDLE_META_RECORD(MD_VR_USERNAME, m_strUserName) HANDLE_META_RECORD(MD_VR_PASSWORD, m_strPassword) HANDLE_META_RECORD(MD_DONT_LOG, m_fDontLog); HANDLE_META_RECORD(MD_IP_SEC, m_ipl); END_PARSE_META_RECORDS }
/* virtual */ HRESULT CFTPDirProps::WriteDirtyProps() /*++
Routine Description:
Write the dirty properties to the metabase
Arguments:
None
Return Value:
HRESULT
--*/ { CError err(CChildNodeProps::WriteDirtyProps()); if (err.Failed()) { return err; }
//
// CODEWORK: Consider DDX/DDV like methods which do both
// ParseFields and WriteDirtyProps in a single method. Must
// take care not to write data which should only be read, not
// written
//
BEGIN_META_WRITE() META_WRITE(MD_VR_USERNAME, m_strUserName) META_WRITE(MD_VR_PASSWORD, m_strPassword) META_WRITE(MD_DONT_LOG, m_fDontLog); META_WRITE(MD_IP_SEC, m_ipl); END_META_WRITE(err);
return err; }
CFtpSheet::CFtpSheet( LPCTSTR pszCaption, LPCTSTR lpszServer, DWORD dwInstance, LPCTSTR lpszParent, LPCTSTR lpszAlias, CWnd * pParentWnd, LPARAM lParam, LONG_PTR handle, UINT iSelectPage ) /*++
Routine Description:
FTP Property sheet constructor
Arguments:
LPCTSTR pszCaption : Sheet caption LPCTSTR lpszServer : Server name DWORD dwInstance : Instance number LPCTSTR lpszParent : Parent path LPCTSTR lpszAlias : Alias name CWnd * pParentWnd : Parent window LPARAM lParam : Parameter for MMC console LONG_PTR handle : MMC console handle UINT iSelectPage : Initial page selected or -1
Return Value:
N/A
--*/ : CInetPropertySheet( pszCaption, lpszServer, g_cszSvc, dwInstance, lpszParent, lpszAlias, pParentWnd, lParam, handle, iSelectPage ), m_ppropInst(NULL), m_ppropDir(NULL) { }
CFtpSheet::~CFtpSheet() /*++
Routine Description:
FTP Sheet destructor
Arguments:
N/A
Return Value:
N/A
--*/ { FreeConfigurationParameters();
//
// Must be deleted by now
//
ASSERT(m_ppropInst == NULL); ASSERT(m_ppropDir == NULL); }
void CFtpSheet::WinHelp( IN DWORD dwData, IN UINT nCmd ) /*++
Routine Description:
FTP Property sheet help handler
Arguments:
DWORD dwData : WinHelp data (dialog ID) UINT nCmd : WinHelp command
Return Value:
None
Notes:
Replace the dialog ID if this is the directory tab. We have different help depending on virtual directory, home, file, directory.
--*/ { ASSERT(m_ppropDir != NULL);
if (::lstrcmpi(m_ppropDir->QueryAlias(), g_cszRoot) == 0 && dwData == HIDD_DIRECTORY_PROPERTIES) { //
// It's a home virtual directory -- change the ID
//
dwData = HIDD_HOME_DIRECTORY_PROPERTIES; }
CInetPropertySheet::WinHelp(dwData, nCmd); }
/* virtual */ HRESULT CFtpSheet::LoadConfigurationParameters() /*++
Routine Description:
Load configuration parameters information
Arguments:
None
Return Value:
HRESULT
--*/ { CError err; if (m_ppropInst == NULL) { ASSERT(m_ppropDir == NULL);
m_ppropInst = new CFTPInstanceProps(m_strServer, m_dwInstance); m_ppropDir = new CFTPDirProps( m_strServer, m_dwInstance, m_strParent, m_strAlias );
if (!m_ppropInst || !m_ppropDir) { err = ERROR_NOT_ENOUGH_MEMORY; return err; }
err = m_ppropInst->LoadData(); if (err.Succeeded()) { err = m_ppropDir->LoadData(); } }
return err; }
/* virtual */ void CFtpSheet::FreeConfigurationParameters() /*++
Routine Description:
Clean up configuration data
Arguments:
None
Return Value:
None
--*/ { //
// Must be deleted by now
//
ASSERT(m_ppropInst != NULL); ASSERT(m_ppropDir != NULL);
SAFE_DELETE(m_ppropInst); SAFE_DELETE(m_ppropDir); }
//
// Message Map
//
BEGIN_MESSAGE_MAP(CFtpSheet, CInetPropertySheet) //{{AFX_MSG_MAP(CInetPropertySheet)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//
// Global DLL instance
//
HINSTANCE hInstance;
//
// ISM API Functions
//
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
extern "C" DWORD APIENTRY ISMQueryServiceInfo( OUT ISMSERVICEINFO * psi ) /*++
Routine Description:
Return service-specific information back to the application. This function is called by the service manager immediately after LoadLibary(); The size element must be set prior to calling this API.
Arguments:
ISMSERVICEINFO * psi : Service information returned.
Return Value:
Error return code
--*/ { AFX_MANAGE_STATE(AfxGetStaticModuleState());
ASSERT(psi != NULL); ASSERT(psi->dwSize == ISMSERVICEINFO_SIZE);
psi->dwSize = ISMSERVICEINFO_SIZE; psi->dwVersion = ISM_VERSION; psi->flServiceInfoFlags = SERVICE_INFO_FLAGS; psi->ullDiscoveryMask = INETSLOC_MASK; psi->rgbButtonBkMask = BUTTON_BMP_BACKGROUND; psi->nButtonBitmapID = BUTTON_BMP_ID; psi->rgbServiceBkMask = SERVICE_BMP_BACKGROUND; psi->nServiceBitmapID = SERVICE_BMP_ID; psi->rgbServiceBkMask = SERVICE_BMP_BACKGROUND; psi->nLargeServiceBitmapID = SERVICE_BMP32_ID;
ASSERT(::lstrlen(SERVICE_LONG_NAME) <= MAX_LNLEN); ASSERT(::lstrlen(SERVICE_SHORT_NAME) <= MAX_SNLEN); ::lstrcpy(psi->atchShortName, SERVICE_SHORT_NAME); ::lstrcpy(psi->atchLongName, SERVICE_LONG_NAME);
//
// /* K2 */
//
psi->rgbChildBkMask = CHILD_BMP_BACKGROUND; psi->nChildBitmapID = CHILD_BMP_ID ; psi->rgbLargeChildBkMask = CHILD_BMP_BACKGROUND; psi->nLargeChildBitmapID = CHILD_BMP32_ID;
//
// IIS 5
//
ASSERT(::lstrlen(SERVICE_PROTOCOL) <= MAX_SNLEN); ASSERT(::lstrlen(g_cszSvc) <= MAX_SNLEN); ::lstrcpy(psi->atchProtocol, SERVICE_PROTOCOL); ::lstrcpy(psi->atchMetaBaseName, g_cszSvc);
return ERROR_SUCCESS; }
DWORD APIENTRY ISMDiscoverServers( OUT ISMSERVERINFO * psi, IN DWORD * pdwBufferSize, IN int * cServers ) /*++
Routine Description:
Discover machines running this service. This is only necessary for services not discovered with inetsloc (which don't give a mask)
Arguments:
ISMSERVERINFO * psi : Server info buffer. DWORD * pdwBufferSize : Size required/available. int * cServers : Number of servers in buffer.
Return Value:
Error return code
--*/ { AFX_MANAGE_STATE(AfxGetStaticModuleState());
*cServers = 0; *pdwBufferSize = 0L;
//
// We're an inetsloc service
//
TRACEEOLID("Warning: service manager called bogus ISMDiscoverServers"); ASSERT(FALSE);
return ERROR_SUCCESS; }
extern "C" DWORD APIENTRY ISMQueryServerInfo( IN LPCTSTR lpszServerName, OUT ISMSERVERINFO * psi ) /*++
Routine Description:
Get information about a specific server with regards to this service.
Arguments:
LPCTSTR lpszServerName : Name of server. ISMSERVERINFO * psi : Server information returned.
Return Value:
Error return code
--*/ { AFX_MANAGE_STATE(AfxGetStaticModuleState());
ASSERT(psi != NULL); ASSERT(psi->dwSize == ISMSERVERINFO_SIZE); ASSERT(::lstrlen(lpszServerName) <= MAX_SERVERNAME_LEN);
psi->dwSize = ISMSERVERINFO_SIZE; ::lstrcpy(psi->atchServerName, lpszServerName);
//
// Start with NULL comment
//
*psi->atchComment = _T('\0');
//
// First look at the SC
//
CError err(::QueryInetServiceStatus( psi->atchServerName, SERVICE_SC_NAME, &(psi->nState) ));
if (err.Failed()) { psi->nState = INetServiceUnknown;
return err; }
//
// Check the metabase to see if the service is installed
//
CMetaKey mk(lpszServerName, METADATA_PERMISSION_READ, g_cszSvc); err = mk.QueryResult(); if (err.Failed()) { if (err == REGDB_E_CLASSNOTREG) { //
// Ok, the service is there, but the metabase is not.
// This must be the old IIS 1-3 version of this service,
// which doesn't count as having the service installed.
//
return ERROR_SERVICE_DOES_NOT_EXIST; }
return err; }
//
// If not exist, return bogus acceptable error
//
return (err.Win32Error() == ERROR_PATH_NOT_FOUND) ? ERROR_SERVICE_DOES_NOT_EXIST : err.Win32Error(); }
extern "C" DWORD APIENTRY ISMChangeServiceState( IN int nNewState, OUT int * pnCurrentState, IN DWORD dwInstance, IN LPCTSTR lpszServers ) /*++
Routine Description:
Change the service state of the servers (to paused/continue, started, stopped, etc)
Arguments:
int nNewState : INetService definition. int * pnCurrentState : Ptr to current state (will be changed DWORD dwInstance : Instance or 0 for the service itself LPCTSTR lpszServers : Double NULL terminated list of servers.
Return Value:
Error return code
--*/ { AFX_MANAGE_STATE(AfxGetStaticModuleState() );
ASSERT(nNewState >= INetServiceStopped && nNewState <= INetServicePaused);
if (IS_MASTER_INSTANCE(dwInstance)) { //
// Service itself is referred to here
//
return ChangeInetServiceState( lpszServers, SERVICE_SC_NAME, nNewState, pnCurrentState ); }
//
// Change the state of the instance
//
CInstanceProps inst(lpszServers, g_cszSvc, dwInstance); inst.LoadData();
CError err(inst.ChangeState(nNewState)); *pnCurrentState = inst.QueryISMState();
return err; }
extern "C" DWORD APIENTRY ISMConfigureServers( IN HWND hWnd, IN DWORD dwInstance, IN LPCTSTR lpszServers ) /*++
Routine Description:
Display configuration property sheet.
Arguments:
HWND hWnd : Main app window handle DWORD dwInstance : Instance number LPCTSTR lpszServers : Double NULL terminated list of servers
Return Value:
Error return code
--*/ { AFX_MANAGE_STATE(::AfxGetStaticModuleState());
DWORD err = ERROR_SUCCESS;
//
// Convert the list of servers to a
// more manageable CStringList.
//
CStringList strlServers; err = ConvertDoubleNullListToStringList(lpszServers, strlServers); if (err != ERROR_SUCCESS) { TRACEEOLID("Error building server string list"); return err; }
CString strCaption;
if (strlServers.GetCount() == 1) { CString str; LPCTSTR lpComputer = PURE_COMPUTER_NAME(lpszServers);
if(IS_MASTER_INSTANCE(dwInstance)) { VERIFY(str.LoadString(IDS_CAPTION_DEFAULT)); strCaption.Format(str, lpComputer); } else { VERIFY(str.LoadString(IDS_CAPTION)); strCaption.Format(str, dwInstance, lpComputer); } } else // Multiple server caption
{ VERIFY(strCaption.LoadString(IDS_CAPTION_MULTIPLE)); }
ASSERT(strlServers.GetCount() == 1);
//
// Get the server name
//
LPCTSTR lpszServer = strlServers.GetHead();
CFtpSheet * pSheet = NULL;
try { pSheet = new CFtpSheet( strCaption, lpszServer, dwInstance, NULL, g_cszRoot, CWnd::FromHandlePermanent(hWnd) );
pSheet->AddRef();
if (SUCCEEDED(pSheet->QueryInstanceResult())) { //
// Add instance pages
//
pSheet->AddPage(new CFtpServicePage(pSheet)); pSheet->AddPage(new CFtpAccountsPage(pSheet)); pSheet->AddPage(new CFtpMessagePage(pSheet)); }
if (SUCCEEDED(pSheet->QueryDirectoryResult())) { //
// Add home directory pages for the home directory
//
pSheet->AddPage(new CFtpDirectoryPage(pSheet, TRUE)); pSheet->AddPage(new CFtpSecurityPage(pSheet)); } } catch(CMemoryException * e) { TRACEEOLID("Aborting because of exception"); err = ERROR_NOT_ENOUGH_MEMORY; e->Delete(); }
if (err == ERROR_SUCCESS) { ASSERT(pSheet != NULL); pSheet->DoModal(); pSheet->Release(); }
//
// Sheet and pages clean themselves up
//
return err; }
//
// K2 Functions
//
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
HRESULT AddMMCPage( IN LPPROPERTYSHEETCALLBACK lpProvider, IN CPropertyPage * pg ) /*++
Routine Description:
Helper function to add MFC property page using callback provider to MMC.
Arguments:
LPPROPERTYSHEETCALLBACK lpProvider : Property sheet provider CPropertyPage * pg : MFC property page object
Return Value:
HRESULT
--*/ { ASSERT(pg != NULL);
//
// Patch MFC property page class.
//
MMCPropPageCallback(&pg->m_psp);
HPROPSHEETPAGE hPage = CreatePropertySheetPage( (LPCPROPSHEETPAGE)&pg->m_psp );
if (hPage == NULL) { return E_UNEXPECTED; }
lpProvider->AddPage(hPage);
return S_OK; }
extern "C" HRESULT APIENTRY ISMBind( IN LPCTSTR lpszServer, OUT HANDLE * phServer ) /*++
Routine Description:
Generate a handle for the server name.
Arguments:
LPCTSTR lpszServer : Server name HANDLE * phServer : Returns a handle
Return Value: HRESULT
--*/ { return COMDLL_ISMBind(lpszServer, phServer); }
extern "C" HRESULT APIENTRY ISMUnbind( IN HANDLE hServer ) /*++
Routine Description:
Free up the server handle
Arguments:
HANDLE hServer : Server handle
Return Value:
HRESULT
--*/ { return COMDLL_ISMUnbind(hServer); }
extern "C" HRESULT APIENTRY ISMMMCConfigureServers( IN HANDLE hServer, IN PVOID lpfnMMCCallbackProvider, IN LPARAM param, IN LONG_PTR handle, IN DWORD dwInstance ) /*++
Routine Description:
Display configuration property sheet.
Arguments:
HANDLE hServer : Server handle PVOID lpfnMMCCallbackProvider : MMC Callback provider LPARAM param : MMC LPARAM LONG_PTR handle : MMC Console handle DWORD dwInstance : Instance number
Return Value:
HRESULT
--*/ { AFX_MANAGE_STATE(::AfxGetStaticModuleState());
CError err; LPPROPERTYSHEETCALLBACK lpProvider = (LPPROPERTYSHEETCALLBACK)lpfnMMCCallbackProvider;
LPCTSTR lpszServer = GetServerNameFromHandle(hServer); ASSERT(lpszServer != NULL);
CString str, strCaption; LPCTSTR lpszComputer = PURE_COMPUTER_NAME(lpszServer);
if(IS_MASTER_INSTANCE(dwInstance)) { VERIFY(str.LoadString(IDS_CAPTION_DEFAULT)); strCaption.Format(str, lpszComputer); } else { VERIFY(str.LoadString(IDS_CAPTION)); strCaption.Format(str, dwInstance, lpszComputer); }
CFtpSheet * pSheet = NULL;
try { pSheet = new CFtpSheet( strCaption, lpszServer, dwInstance, NULL, g_cszRoot, NULL, param, handle );
pSheet->SetModeless();
CFtpServicePage * pServPage = NULL; CFtpAccountsPage * pAccPage = NULL; CFtpMessagePage * pMessPage = NULL; CFtpDirectoryPage * pDirPage = NULL; CFtpSecurityPage * pSecPage = NULL;
if (SUCCEEDED(pSheet->QueryInstanceResult())) { //
// Add instance pages
//
AddMMCPage(lpProvider, new CFtpServicePage(pSheet)); AddMMCPage(lpProvider, new CFtpAccountsPage(pSheet)); AddMMCPage(lpProvider, new CFtpMessagePage(pSheet)); }
if (SUCCEEDED(pSheet->QueryDirectoryResult())) { //
// Add home directory pages for the home directory
//
AddMMCPage(lpProvider, new CFtpDirectoryPage(pSheet, TRUE)); AddMMCPage(lpProvider, new CFtpSecurityPage(pSheet)); }
} catch(CMemoryException * e) { TRACEEOLID("Aborting because of exception"); err = ERROR_NOT_ENOUGH_MEMORY; e->Delete(); }
//
// Sheet and pages clean themselves up
//
return err; }
extern "C" HRESULT APIENTRY ISMMMCConfigureChild( IN HANDLE hServer, IN PVOID lpfnMMCCallbackProvider, IN LPARAM param, IN LONG_PTR handle, IN DWORD dwAttributes, IN DWORD dwInstance, IN LPCTSTR lpszParent, IN LPCTSTR lpszAlias ) /*++
Routine Description:
Display configuration property sheet for child object.
Arguments:
HANDLE hServer : Server handle PVOID lpfnMMCCallbackProvider : MMC Callback provider LPARAM param : MMC parameter passed to sheet LONG_PTR handle : MMC console handle DWORD dwAttributes : Must be FILE_ATTRIBUTE_VIRTUAL_DIRECTORY DWORD dwInstance : Parent instance number LPCTSTR lpszParent : Parent path LPCTSTR lpszAlias : Child to configure
Return Value:
Error return code
--*/ { AFX_MANAGE_STATE(::AfxGetStaticModuleState());
LPCTSTR lpszServer = GetServerNameFromHandle(hServer);
CError err;
LPPROPERTYSHEETCALLBACK lpProvider = (LPPROPERTYSHEETCALLBACK)lpfnMMCCallbackProvider;
CString strCaption; { CString str; VERIFY(str.LoadString(IDS_DIR_TITLE));
strCaption.Format(str, lpszAlias); }
ASSERT(dwAttributes == FILE_ATTRIBUTE_VIRTUAL_DIRECTORY);
//
// Call the APIs and build the property pages
//
CFtpSheet * pSheet = NULL;
try { pSheet = new CFtpSheet( strCaption, lpszServer, dwInstance, lpszParent, lpszAlias, NULL, param, handle );
pSheet->SetModeless();
if (SUCCEEDED(pSheet->QueryDirectoryResult())) { CFtpDirectoryPage * pDirPage = NULL; CFtpSecurityPage * pSecPage = NULL;
//
// Add private pages
//
AddMMCPage(lpProvider, new CFtpDirectoryPage(pSheet)); AddMMCPage(lpProvider, new CFtpSecurityPage(pSheet)); } } catch(CMemoryException * e) { TRACEEOLID("Aborting due to exception"); err = ERROR_NOT_ENOUGH_MEMORY; e->Delete(); }
//
// Sheet and pages clean themselves up
//
return err; }
extern "C" HRESULT APIENTRY ISMEnumerateInstances( IN HANDLE hServer, OUT ISMINSTANCEINFO * pii, OUT IN HANDLE * phEnum ) /*++
Routine Description:
Enumerate Instances. First call with *phEnum == NULL.
Arguments:
HANDLE hServer : Server handle ISMINSTANCEINFO * pii : Instance info buffer HANDLE * phEnum : Enumeration handle.
Return Value:
Error return code
--*/ { AFX_MANAGE_STATE(::AfxGetStaticModuleState());
CError err; CMetaInterface * pInterface = GetMetaKeyFromHandle(hServer); ASSERT(pInterface != NULL);
BEGIN_ASSURE_BINDING_SECTION err = COMDLL_ISMEnumerateInstances( pInterface, pii, phEnum, g_cszSvc ); END_ASSURE_BINDING_SECTION(err, pInterface, ERROR_NO_MORE_ITEMS);
return err; }
extern "C" HRESULT APIENTRY ISMAddInstance( IN HANDLE hServer, IN DWORD dwSourceInstance, OUT ISMINSTANCEINFO * pii, OPTIONAL IN DWORD dwBufferSize ) /*++
Routine Description:
Add an instance.
Arguments:
HANDLE hServer : Server handle DWORD dwSourceInstance : Source instance ID to clone ISMINSTANCEINFO * pii : Instance info buffer. May be NULL DWORD dwBufferSize : Size of buffer
Return Value:
Error return code.
--*/ { AFX_MANAGE_STATE(::AfxGetStaticModuleState());
CIISWizardSheet sheet(IDB_WIZ_LEFT, IDB_WIZ_HEAD);
CIISFtpWizSettings ws(hServer, g_cszSvc);
CIISWizardBookEnd pgWelcome( IDS_SITE_WELCOME, IDS_NEW_SITE_WIZARD, IDS_SITE_BODY );
CVDWPDescription pgDescr(&ws); CVDWPBindings pgBindings(&ws); CVDWPPath pgHome(&ws, FALSE); CVDWPUserName pgUserName(&ws, FALSE); CVDWPPermissions pgPerms(&ws, FALSE);
CIISWizardBookEnd pgCompletion( &ws.m_hrResult, IDS_SITE_SUCCESS, IDS_SITE_FAILURE, IDS_NEW_SITE_WIZARD );
sheet.AddPage(&pgWelcome); sheet.AddPage(&pgDescr); sheet.AddPage(&pgBindings); sheet.AddPage(&pgHome); sheet.AddPage(&pgUserName); sheet.AddPage(&pgPerms); sheet.AddPage(&pgCompletion);
if (sheet.DoModal() == IDCANCEL) { return ERROR_CANCELLED; }
CError err(ws.m_hrResult);
if (err.Succeeded()) { //
// Get info on it to be returned.
//
ISMQueryInstanceInfo( ws.m_pKey, WITHOUT_INHERITANCE, pii, ws.m_dwInstance ); }
return err; }
extern "C" HRESULT APIENTRY ISMDeleteInstance( IN HANDLE hServer, IN DWORD dwInstance ) /*++
Routine Description:
Delete an instance
Arguments:
HANDLE hServer : Server handle DWORD dwInstance : Instance to be deleted
Return Value:
Error return code.
--*/ { AFX_MANAGE_STATE(::AfxGetStaticModuleState());
CError err; CMetaInterface * pInterface = GetMetaKeyFromHandle(hServer);
BEGIN_ASSURE_BINDING_SECTION err = CInstanceProps::Delete( pInterface, g_cszSvc, dwInstance ); END_ASSURE_BINDING_SECTION(err, pInterface, ERROR_CANCELLED);
return err; }
extern "C" HRESULT APIENTRY ISMEnumerateChildren( IN HANDLE hServer, OUT ISMCHILDINFO * pii, OUT IN HANDLE * phEnum, IN DWORD dwInstance, IN LPCTSTR lpszParent ) /*++
Routine Description:
Enumerate children. First call with *phEnum == NULL;
Arguments:
HANDLE hServer : Server handle ISMCHILDINFO * pii : Child info buffer HANDLE * phEnum : Enumeration handle. DWORD dwInstance : Parent instance LPCTSTR lpszParent : Parent path
Return Value:
Error return code.
--*/ { AFX_MANAGE_STATE(::AfxGetStaticModuleState());
CError err; CMetaInterface * pInterface = GetMetaKeyFromHandle(hServer);
BEGIN_ASSURE_BINDING_SECTION err = COMDLL_ISMEnumerateChildren( pInterface, pii, phEnum, g_cszSvc, dwInstance, lpszParent ); END_ASSURE_BINDING_SECTION(err, pInterface, ERROR_NO_MORE_ITEMS);
return err; }
extern "C" HRESULT APIENTRY ISMAddChild( IN HANDLE hServer, OUT ISMCHILDINFO * pii, IN DWORD dwBufferSize, IN DWORD dwInstance, IN LPCTSTR lpszParent ) /*++
Routine Description:
Add a child.
Arguments:
HANDLE hServer : Server handle ISMCHILDINFO * pii : Child info buffer. May be NULL DWORD dwBufferSize : Size of info buffer DWORD dwInstance : Parent instance LPCTSTR lpszParent : Parent path
Return Value:
Error return code.
--*/ { AFX_MANAGE_STATE(::AfxGetStaticModuleState());
CIISFtpWizSettings ws(hServer, g_cszSvc, dwInstance, lpszParent);
CIISWizardSheet sheet(IDB_WIZ_LEFT_DIR, IDB_WIZ_HEAD_DIR);
CIISWizardBookEnd pgWelcome( IDS_VDIR_WELCOME, IDS_NEW_VDIR_WIZARD, IDS_VDIR_BODY );
CVDWPAlias pgAlias(&ws); CVDWPPath pgPath(&ws, TRUE); CVDWPUserName pgUserName(&ws, TRUE); CVDWPPermissions pgPerms(&ws, TRUE);
CIISWizardBookEnd pgCompletion( &ws.m_hrResult, IDS_VDIR_SUCCESS, IDS_VDIR_FAILURE, IDS_NEW_VDIR_WIZARD );
sheet.AddPage(&pgWelcome); sheet.AddPage(&pgAlias); sheet.AddPage(&pgPath); sheet.AddPage(&pgUserName); sheet.AddPage(&pgPerms); sheet.AddPage(&pgCompletion);
if (sheet.DoModal() == IDCANCEL) { return ERROR_CANCELLED; }
CError err(ws.m_hrResult);
if (err.Succeeded()) { //
// Refresh child info
//
err = ISMQueryChildInfo( ws.m_pKey, WITH_INHERITANCE, pii, ws.m_dwInstance, ws.m_strParent, ws.m_strAlias ); }
return err; }
extern "C" HRESULT APIENTRY ISMDeleteChild( IN HANDLE hServer, IN DWORD dwInstance, IN LPCTSTR lpszParent, IN LPCTSTR lpszAlias ) /*++
Routine Description:
Delete a child.
Arguments:
HANDLE hServer : Server handle DWORD dwInstance : Parent instance LPCTSTR lpszParent : Parent path LPCTSTR lpszAlias : Alias of child to be deleted
Return Value:
Error return code.
--*/ { AFX_MANAGE_STATE(::AfxGetStaticModuleState());
CError err; CMetaInterface * pInterface = GetMetaKeyFromHandle(hServer);
BEGIN_ASSURE_BINDING_SECTION err = CChildNodeProps::Delete( pInterface, g_cszSvc, dwInstance, lpszParent, lpszAlias ); END_ASSURE_BINDING_SECTION(err, pInterface, ERROR_CANCELLED);
return err; }
extern "C" HRESULT APIENTRY ISMRenameChild( IN HANDLE hServer, IN DWORD dwInstance, IN LPCTSTR lpszParent, IN LPCTSTR lpszAlias, IN LPCTSTR lpszNewName ) /*++
Routine Description:
Rename a child.
Arguments:
HANDLE hServer : Server handle DWORD dwInstance : Parent instance LPCTSTR lpszParent : Parent path LPCTSTR lpszAlias : Alias of child to be renamed LPCTSTR lpszNewName : New alias name
Return Value:
Error return code.
--*/ { AFX_MANAGE_STATE(::AfxGetStaticModuleState());
CError err; CMetaInterface * pInterface = GetMetaKeyFromHandle(hServer);
BEGIN_ASSURE_BINDING_SECTION err = CChildNodeProps::Rename( pInterface, g_cszSvc, dwInstance, lpszParent, lpszAlias, lpszNewName ); END_ASSURE_BINDING_SECTION(err, pInterface, ERROR_CANCELLED)
return err; }
extern "C" HRESULT APIENTRY ISMQueryInstanceInfo( IN HANDLE hServer, IN BOOL fInherit, OUT ISMINSTANCEINFO * pii, IN DWORD dwInstance ) /*++
Routine Description:
Get instance specific information.
Arguments:
HANDLE hServer : Server handle BOOL fInherit : TRUE to inherit, FALSE otherwise ISMINSTANCEINFO * pii : Instance info buffer LPCTSTR lpszServer : A single server DWORD dwInstance : Instance number
Return Value:
Error return code.
--*/ { AFX_MANAGE_STATE(::AfxGetStaticModuleState());
ASSERT(pii != NULL);
CError err; CMetaKey * pKey = GetMetaKeyFromHandle(hServer); BEGIN_ASSURE_BINDING_SECTION CInstanceProps inst(pKey, g_cszSvc, dwInstance); err = inst.LoadData(); if (err.Succeeded()) { pii->dwSize = ISMINSTANCEINFO_SIZE; inst.FillInstanceInfo(pii); //
// Get properties on the home directory
//
CChildNodeProps home( &inst, g_cszSvc, dwInstance, NULL, g_cszRoot, fInherit, TRUE // Path only
);
err = home.LoadData(); home.FillInstanceInfo(pii); } END_ASSURE_BINDING_SECTION(err, pKey, err);
return err.Failed() ? err : S_OK; }
extern "C" HRESULT APIENTRY ISMQueryChildInfo( IN HANDLE hServer, IN BOOL fInherit, OUT ISMCHILDINFO * pii, IN DWORD dwInstance, IN LPCTSTR lpszParent, IN LPCTSTR lpszAlias ) /*++
Routine Description:
Get child-specific info.
Arguments:
HANDLE hServer : Server handle BOOL fInherit : TRUE to inherit, FALSE otherwise ISMCHILDINFO * pii : Child info buffer DWORD dwInstance : Parent instance LPCTSTR lpszParent : Parent Path ("" for root) LPCTSTR lpszAlias : Alias of child to be deleted
Return Value:
Error return code.
--*/ { AFX_MANAGE_STATE(::AfxGetStaticModuleState());
//
// Get all the inherited properties
//
CChildNodeProps node( GetMetaKeyFromHandle(hServer), g_cszSvc, dwInstance, lpszParent, lpszAlias, fInherit, FALSE // Complete information
); CError err(node.LoadData());
//
// Set the output structure
//
pii->dwSize = ISMCHILDINFO_SIZE; node.FillChildInfo(pii);
//
// Not supported for FTP
//
ASSERT(!node.IsRedirected()); ASSERT(!*pii->szRedirPath); ASSERT(!pii->fEnabledApplication);
return err; }
extern "C" HRESULT APIENTRY ISMConfigureChild( IN HANDLE hServer, IN HWND hWnd, IN DWORD dwAttributes, IN DWORD dwInstance, IN LPCTSTR lpszParent, IN LPCTSTR lpszAlias ) /*++
Routine Description:
Configure child.
Arguments:
HANDLE hServer : Server handle HWND hWnd : Main app window handle DWORD dwAttributes : File attributes DWORD dwInstance : Parent instance LPCTSTR lpszParent : Parent path LPCTSTR lpszAlias : Child to configure or NULL
Return Value:
Error return code.
--*/ { AFX_MANAGE_STATE(::AfxGetStaticModuleState());
CMetaKey * pKey = GetMetaKeyFromHandle(hServer); LPCTSTR lpszServer = GetServerNameFromHandle(hServer);
CError err;
CString strCaption; { CString str; VERIFY(str.LoadString(IDS_DIR_TITLE));
strCaption.Format(str, lpszAlias); }
ASSERT(dwAttributes == FILE_ATTRIBUTE_VIRTUAL_DIRECTORY);
//
// Call the APIs and build the property pages
//
CFtpSheet * pSheet = NULL;
try { pSheet = new CFtpSheet( strCaption, lpszServer, dwInstance, lpszParent, lpszAlias, CWnd::FromHandlePermanent(hWnd) );
pSheet->AddRef();
if (SUCCEEDED(pSheet->QueryDirectoryResult())) { CFtpDirectoryPage * pDirPage = NULL; CFtpSecurityPage * pSecPage = NULL;
//
// Add private pages
//
pSheet->AddPage(new CFtpDirectoryPage(pSheet)); pSheet->AddPage(new CFtpSecurityPage(pSheet)); } } catch(CMemoryException * e) { TRACEEOLID("Aborting due to exception"); err = ERROR_NOT_ENOUGH_MEMORY; e->Delete(); }
if (err.Succeeded()) { ASSERT(pSheet != NULL); pSheet->DoModal(); pSheet->Release(); }
//
// Sheet and pages clean themselves up
//
return err; }
class CFTPSecurityTemplate : public CIISSecurityTemplate /*++
Class Description:
FTP Security template class
Public Interface:
CFTPSecurityTemplate : Constructor
ApplySettings : Apply template to destination path GenerateSummary : Generate text summary
--*/ { //
// Constructor
//
public: CFTPSecurityTemplate( IN const CMetaKey * pKey, IN LPCTSTR lpszMDPath, IN BOOL fInherit );
public: //
// Apply settings to destination path
//
virtual HRESULT ApplySettings( IN BOOL fUseTemplates, IN LPCTSTR lpszServerName, IN LPCTSTR lpszService, IN DWORD dwInstance = MASTER_INSTANCE, IN LPCTSTR lpszParent = NULL, IN LPCTSTR lpszAlias = NULL );
//
// Load and parse source data
//
virtual HRESULT LoadData();
virtual void GenerateSummary( IN BOOL fUseTemplates, IN LPCTSTR lpszServerName, IN LPCTSTR lpszService, IN DWORD dwInstance = MASTER_INSTANCE, IN LPCTSTR lpszParent = NULL, IN LPCTSTR lpszAlias = NULL ); protected: //
// Break out GetAllData() data to data fields
//
virtual void ParseFields();
public: MP_BOOL m_fAllowAnonymous; MP_BOOL m_fAnonymousOnly; };
CFTPSecurityTemplate::CFTPSecurityTemplate( IN const CMetaKey * pKey, IN LPCTSTR lpszMDPath, IN BOOL fInherit ) /*++
Routine Description:
Construct from open key
Arguments:
const CMetaKey * pKey : Open key LPCTSTR lpszMDPath : Path BOOL fInherit : TRUE to inherit values, FALSE if not
Return Value:
N/A
--*/ : CIISSecurityTemplate(pKey, lpszMDPath, fInherit), m_fAllowAnonymous(FALSE), m_fAnonymousOnly(FALSE) { //
// Managed Properties
//
m_dlProperties.AddTail(MD_ALLOW_ANONYMOUS); m_dlProperties.AddTail(MD_ANONYMOUS_ONLY); }
/* virtual */ HRESULT CFTPSecurityTemplate::LoadData() /*++
Routine Description:
LoadData() base class override
Arguments:
None
Return Value:
HRESULT
Notes:
The FTP wizard has an annoying idiosynchrasy: access authentication settings are per site, not per vdir. Therefore, they need to be set and fetched in a separate path, and not be set at all if not setting props on a site. What a pain...
--*/ { TRACEEOLID(m_strMetaPath);
CError err(CIISSecurityTemplate::LoadData());
if (lstrcmpi(m_strMetaRoot, g_cszRoot) == 0) { //
// Fetch the anonymous access settings from
// the instance node. Note: This explicit step
// should only be necessary for templates, because
// this would otherwise be picked up on inheritance.
//
ASSERT(!m_fInherit); m_strMetaRoot.Empty();
err = CIISSecurityTemplate::LoadData(); }
return err; }
/* virtual */ void CFTPSecurityTemplate::ParseFields() /*++
Routine Description:
Break into fields.
Arguments:
None.
Return Value:
None.
--*/ { //
// Fetch base class values
//
CIISSecurityTemplate::ParseFields();
BEGIN_PARSE_META_RECORDS(m_dwNumEntries, m_pbMDData) HANDLE_META_RECORD(MD_ALLOW_ANONYMOUS, m_fAllowAnonymous) HANDLE_META_RECORD(MD_ANONYMOUS_ONLY, m_fAnonymousOnly) END_PARSE_META_RECORDS }
/* virtual */ HRESULT CFTPSecurityTemplate::ApplySettings( IN BOOL fUseTemplate, IN LPCTSTR lpszServerName, IN LPCTSTR lpszService, IN DWORD dwInstance, IN LPCTSTR lpszParent, IN LPCTSTR lpszAlias ) /*++
Routine Description:
Apply the settings to the specified destination path
Arguments: BOOL fUseTemplates : TRUE if the source is from a template, FALSE if using inheritance. LPCTSTR lpszServerName : Server name LPCTSTR lpszService : Service name DWORD dwInstance : Instance LPCTSTR lpszParent : Parent path (or NULL) LPCTSTR lpszAlias : Alias name (or NULL)
Return Value:
HRESULT
--*/ { //
// Write base class properties
//
CError err(CIISSecurityTemplate::ApplySettings( fUseTemplate, lpszServerName, lpszService, dwInstance, lpszParent, lpszAlias ));
if (err.Failed()) { return err; }
BOOL fWriteProperties = TRUE;
CMetaKey mk( lpszServerName, METADATA_PERMISSION_WRITE, lpszService, dwInstance, lpszParent, lpszAlias );
err = mk.QueryResult();
if (err.Win32Error() == ERROR_PATH_NOT_FOUND) { if (!fUseTemplate) { //
// No need to delete properties; everything's already
// inherited. Note that this is the only legit failure
// case. If using a template, the base class must have
// created the path by now.
//
fWriteProperties = FALSE; err.Reset(); } }
if (fWriteProperties) { do { if (mk.IsHomeDirectoryPath()) { BREAK_ON_ERR_FAILURE(err);
//
// Path describes an instance path, which is the only
// time we need to do anything here
//
err = mk.ConvertToParentPath(TRUE);
BREAK_ON_ERR_FAILURE(err);
if (fUseTemplate) { //
// Write values from template
//
err = mk.SetValue( MD_ALLOW_ANONYMOUS, m_fAllowAnonymous );
BREAK_ON_ERR_FAILURE(err);
err = mk.SetValue( MD_ANONYMOUS_ONLY, m_fAnonymousOnly ); } else { //
// Inheritance case: delete authentication
// values
//
mk.DeleteValue(MD_ALLOW_ANONYMOUS); mk.DeleteValue(MD_ANONYMOUS_ONLY); } } } while(FALSE); }
return err; }
/* virtual */ void CFTPSecurityTemplate::GenerateSummary( IN BOOL fUseTemplate, IN LPCTSTR lpszServerName, IN LPCTSTR lpszService, IN DWORD dwInstance, IN LPCTSTR lpszParent, IN LPCTSTR lpszAlias ) /*++
Routine Description:
Generate text summary of what's in the security template, and is about to be applied to the given path.
Arguments: BOOL fUseTemplates : TRUE if the source is from a template, FALSE if using inheritance. LPCTSTR lpszServerName : Server name LPCTSTR lpszService : Service name DWORD dwInstance : Instance LPCTSTR lpszParent : Parent path (or NULL) LPCTSTR lpszAlias : Alias name (or NULL)
Return Value:
None
--*/ { CString strPath;
CMetaKey::BuildMetaPath( strPath, lpszService, dwInstance, lpszParent, lpszAlias );
//
// Authentication methods apply to instances only
//
if (CMetaKey::IsHomeDirectoryPath(strPath)) { //
// Add private summary items
//
AddSummaryString(IDS_AUTHENTICATION_METHODS);
//
// Summarize Authentication Methods:
//
AddSummaryString( m_fAllowAnonymous ? IDS_AUTHENTICATION_ANONYMOUS : IDS_AUTHENTICATION_NO_ANONYMOUS, 1 );
if (m_fAllowAnonymous && m_fAnonymousOnly) { AddSummaryString(IDS_AUTHENTICATION_ANONYMOUS_ONLY, 1); } }
//
// Add base class summary
//
CIISSecurityTemplate::GenerateSummary( fUseTemplate, lpszServerName, lpszService, dwInstance, lpszParent, lpszAlias ); }
CIISSecurityTemplate * AllocateSecurityTemplate( IN const CMetaKey * pKey, IN LPCTSTR lpszMDPath, IN BOOL fInherit ) /*++
Routine Description:
Security template allocator function
Arguments:
IN const CMetaKey * pKey : Open key IN LPCTSTR lpszMDPath : Path IN BOOL fInherit : TRUE to inherit properties
Return Value:
Pointer to newly allocated security object
--*/ { return new CFTPSecurityTemplate(pKey, lpszMDPath, fInherit); }
extern "C" HRESULT APIENTRY ISMSecurityWizard( IN HANDLE hServer, IN DWORD dwInstance, IN LPCTSTR lpszParent, IN LPCTSTR lpszAlias ) /*++
Routine Description:
Launch the security wizard
Arguments:
HANDLE hServer : Server handle DWORD dwInstance : Parent instance LPCTSTR lpszParent : Parent path LPCTSTR lpszAlias : Child to configure or NULL
Return Value:
HRESULT
--*/ { AFX_MANAGE_STATE(::AfxGetStaticModuleState());
return COMDLL_ISMSecurityWizard( &AllocateSecurityTemplate, GetMetaKeyFromHandle(hServer), IDB_WIZ_LEFT_SEC, IDB_WIZ_HEAD_SEC, g_cszSvc, dwInstance, lpszParent, lpszAlias ); }
//
// End of ISM API Functions
//
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
void InitializeDLL() /*++
Routine Description:
Perform additional DLL initialisation as necessary
Arguments:
None
Return Value:
None
--*/ { #ifdef _DEBUG
afxMemDF |= checkAlwaysMemDF;
#endif // _DEBUG
#ifdef UNICODE
TRACEEOLID("Loading UNICODE fscfg.dll");
#else
TRACEEOLID("Loading ANSI fscfg.dll");
#endif UNICODE
::AfxEnableControlContainer();
#ifndef _COMSTATIC
//
// Initialize IISUI extension DLL
//
InitIISUIDll();
#endif // _COMSTATIC
}
//
// Declare the one and only dll object
//
CConfigDll NEAR theApp;
CConfigDll::CConfigDll( IN LPCTSTR pszAppName OPTIONAL ) /*++
Routine Description:
Constructor for USRDLL
Arguments:
LPCTSTR pszAppName : Name of the app or NULL to load from resources
Return Value:
N/A
--*/ : CWinApp(pszAppName), m_lpOldHelpPath(NULL) { }
BOOL CConfigDll::InitInstance() /*++
Routine Description:
Initialise current instance of the DLL
Arguments:
None
Return Value:
TRUE for successful initialisation, FALSE otherwise
--*/ { BOOL bInit = CWinApp::InitInstance();
hInstance = ::AfxGetInstanceHandle(); ASSERT(hInstance); InitializeDLL();
try { //
// Get the help path
//
m_lpOldHelpPath = m_pszHelpFilePath; ASSERT(m_pszHelpFilePath != NULL); CString strFile(_tcsrchr(m_pszHelpFilePath, _T('\\'))); CRMCRegKey rk(REG_KEY, SZ_PARAMETERS, KEY_READ); rk.QueryValue(SZ_HELPPATH, m_strHelpPath, EXPANSION_ON); m_strHelpPath += strFile; } catch(CException * e) { e->ReportError(); e->Delete(); }
if (!m_strHelpPath.IsEmpty()) { m_pszHelpFilePath = m_strHelpPath; }
return bInit; }
int CConfigDll::ExitInstance() /*++
Routine Description:
Clean up current instance
Arguments:
None
Return Value:
The application's exit code; 0 indicates no errors, and values greater than 0 indicate an error.
--*/ { m_pszHelpFilePath = m_lpOldHelpPath; return CWinApp::ExitInstance(); }
//
// Message Map
//
BEGIN_MESSAGE_MAP(CConfigDll, CWinApp) //{{AFX_MSG_MAP(CConfigDll)
//}}AFX_MSG_MAP
//
// Global Help Commands
//
ON_COMMAND(ID_HELP, CWinApp::OnHelp) ON_COMMAND(ID_CONTEXT_HELP, CWinApp::OnContextHelp) END_MESSAGE_MAP()
|