2025-04-27 07:49:33 -04:00

683 lines
20 KiB
C++

#include "stdafx.h"
#include <ole2.h>
#undef UNICODE
#include "iadm.h"
#define UNICODE
#include "iiscnfg.h"
#include "mdkey.h"
#include "mdentry.h"
#include "utils.h"
#include "regctrl.h"
#include "userenv.h"
#include "userenvp.h"
GUID g_SMTPGuid = { 0x475e3e80, 0x3193, 0x11cf, 0xa7, 0xd8,
0x00, 0x80, 0x5f, 0x48, 0xa1, 0x35 };
// MCIS SMTP SnapIn CLSID - {135930f2-4689-11d1-8021-00c04fc307bd}
const WCHAR * wszMCISSmtp_SnapIn = _T("{135930f2-4689-11d1-8021-00c04fc307bd}");
// NTOP SMTP SnapIn CLSID - {03f1f940-a0f2-11d0-bb77-00aa00a1eab7}
const WCHAR * wszNt5Smtp_SnapIn = _T("{03f1f940-a0f2-11d0-bb77-00aa00a1eab7}");
const WCHAR * wszNt5Smtp_SnapInName = _T("SMTP Snapin Extension");
static TCHAR szShortSvcName[] = _T("SMTP");
static char szTimebombName[] = "SMTP";
INT Register_iis_smtp_nt5(BOOL fUpgrade, BOOL fReinstall)
{
INT err = NERR_Success;
CString csBinPath;
BOOL fSvcExist = FALSE;
BOOL fIISADMINExists = DetectExistingIISADMIN();
if (fReinstall)
return err;
do {
// set up registry values
CRegKey regMachine = HKEY_LOCAL_MACHINE;
// System\CurrentControlSet\Services\SMTPSVC\Parameters
InsertSetupString( (LPCSTR) REG_SMTPPARAMETERS );
// Software\Microsoft\Keyring\Parameters
CString csSmtpkeyDll;
CRegKey regKeyring( REG_KEYRING, regMachine );
if ((HKEY) regKeyring )
{
csSmtpkeyDll = theApp.m_csPathInetsrv;
csSmtpkeyDll += _T("\\smtpkey.dll");
regKeyring.SetValue( szShortSvcName, csSmtpkeyDll );
}
// If we are upgrading, we will first delete the service and re-register
if (fUpgrade)
{
InetDeleteService(SZ_SMTPSERVICENAME);
InetRegisterService( theApp.m_csMachineName,
SZ_SMTPSERVICENAME,
&g_SMTPGuid, 0, 25, FALSE );
}
// Create or Config SMTP service
CString csDisplayName;
CString csDescription;
MyLoadString( IDS_SMTPDISPLAYNAME, csDisplayName );
MyLoadString(IDS_SMTPDESCRIPTION, csDescription);
csBinPath = theApp.m_csPathInetsrv + _T("\\inetinfo.exe") ;
err = InetCreateService(SZ_SMTPSERVICENAME,
(LPCTSTR)csDisplayName,
(LPCTSTR)csBinPath,
theApp.m_fSuppressSmtp ? SERVICE_DISABLED : SERVICE_AUTO_START,
SZ_SVC_DEPEND,
(LPCTSTR)csDescription);
if ( err != NERR_Success )
{
if (err == ERROR_SERVICE_EXISTS)
{
fSvcExist = TRUE;
err = InetConfigService(SZ_SMTPSERVICENAME,
(LPCTSTR)csDisplayName,
(LPCTSTR)csBinPath,
SZ_SVC_DEPEND,
(LPCTSTR)csDescription);
if (err != NERR_Success)
{
SetErrMsg(_T("SMTP InetConfigService failed"), err);
}
}
}
if (fIISADMINExists)
{
// Migrate registry keys to the metabase. Or create from default values
// if fresh install
MigrateIMSToMD(theApp.m_hInfHandle[MC_IMS],
SZ_SMTPSERVICENAME,
_T("SMTP_REG"),
MDID_SMTP_ROUTING_SOURCES,
fUpgrade);
// bugbug: x5 bug 72284, nt bug 202496 Uncomment this when NT
// is ready to accept these changes
SetAdminACL_wrap(_T("LM/SMTPSVC/1"), (MD_ACR_READ | MD_ACR_ENUM_KEYS), TRUE);
}
// Create key \System\CurrentControlSet\Services\SmtpSvc\Performance:
// Add the following values:
// Library = smtpctrs.DLL
// Open = OpenSMTPPerformanceData
// Close = CloseSMTPPerformanceData
// Collect = CollectSMTPPerformanceData
InstallPerformance(REG_SMTPPERFORMANCE,
_T("smtpctrs.DLL"),
_T("OpenSmtpPerformanceData"),
_T("CloseSmtpPerformanceData"),
_T("CollectSmtpPerformanceData"));
InstallPerformance(REG_NTFSPERFORMANCE,
_T("snprfdll.DLL"),
_T("NTFSDrvOpen"),
_T("NTFSDrvClose"),
_T("NTFSDrvCollect"));
//
// We used to register the SMTPB agent here. Now we unregister it in
// case we're upgrading since it's no longer supported
//
RemoveAgent( SZ_SMTPSERVICENAME );
// Create key \System\CurrentControlSet\Services\EventLog\System\SmtpSvc:
// Add the following values:
// EventMessageFile = ..\smtpmsg.dll
// TypesSupported = 7
csBinPath = theApp.m_csPathInetsrv + _T("\\smtpsvc.dll");
AddEventLog( SZ_SMTPSERVICENAME, csBinPath, 0x07 );
if (!fSvcExist)
{
InetRegisterService( theApp.m_csMachineName,
SZ_SMTPSERVICENAME,
&g_SMTPGuid, 0, 25, TRUE );
}
// Unload the counters and then reload them
err = unlodctr( SZ_SMTPSERVICENAME );
err = unlodctr( SZ_NTFSDRVSERVICENAME );
err = lodctr(_T("smtpctrs.ini"));
err = lodctr(_T("ntfsdrct.ini"));
// copy the anonpwd from w3svc
if (fIISADMINExists)
{
CMDKey cmdW3SvcKey;
CMDKey cmdSMTPSvcKey;
cmdW3SvcKey.OpenNode(_T("LM/w3svc"));
cmdSMTPSvcKey.OpenNode(_T("LM/smtpsvc"));
if ((METADATA_HANDLE) cmdW3SvcKey && (METADATA_HANDLE) cmdSMTPSvcKey) {
DWORD dwAttr;
DWORD dwUType;
DWORD dwDType;
DWORD cbLen;
BYTE pbData[2*(LM20_PWLEN+1)];
if (cmdW3SvcKey.GetData(MD_ANONYMOUS_PWD, &dwAttr, &dwUType, &dwDType,
&cbLen, pbData))
{
cmdSMTPSvcKey.SetData(MD_ANONYMOUS_PWD, dwAttr, dwUType,
dwDType, cbLen, pbData);
}
cmdW3SvcKey.Close();
cmdSMTPSvcKey.Close();
}
}
// register OLE objects
SetEnvironmentVariable(_T("__SYSDIR"), theApp.m_csSysDir);
SetEnvironmentVariable(_T("__INETSRV"), theApp.m_csPathInetsrv);
err = (INT)RegisterOLEControlsFromInfSection(theApp.m_hInfHandle[MC_IMS],
_T("SMTP_REGISTER"),
TRUE);
// NT5 - Enable snapin extension in iis.msc and compmgmt.msc
CString csMMCFile = theApp.m_csPathInetsrv + _T("\\iis.msc");
EnableSnapInExtension( csMMCFile, wszNt5Smtp_SnapIn, TRUE );
//csMMCFile = theApp.m_csSysDir + _T("\\compmgmt.msc");
//EnableSnapInExtension( csMMCFile, wszNt5Smtp_SnapIn, TRUE );
#if 0
// BINLIN 11/3/98 - fix 75049
// NT5 - do something special in compmgmt
EnableCompMgmtExtension( wszNt5Smtp_SnapIn, wszNt5Smtp_SnapInName, TRUE );
#endif
SetEnvironmentVariable(_T("__SYSDIR"), NULL);
SetEnvironmentVariable(_T("__INETSRV"), NULL);
// Server Events: We are clean installing MCIS, so we make sure we set up
// everything, including the source type and event types.
RegisterSEOForSmtp(TRUE);
#if 0
// Create program group
CreateInternetShortcut(MC_IMS,
IDS_PROGITEM_MAIL_SMTP_WEBADMIN,
IDS_ITEMPATH_MAIL_SMTP_WEBADMIN,
FALSE);
CreateInternetShortcut(MC_IMS,
IDS_PROGITEM_MAIL_README,
IDS_ITEMPATH_MAIL_README,
FALSE);
#endif
#if 0
// fix 299130/299131 - no webadmin link
//
// Create the one and only Webadmin link under "administrative tools"
//
CreateNt5InternetShortcut(MC_IMS,
IDS_PROGITEM_MAIL_SMTP_WEBADMIN,
IDS_ITEMPATH_MAIL_SMTP_WEBADMIN);
#endif
if (!theApp.m_fMailGroupInstalled)
{
theApp.m_fMailGroupInstalled = TRUE;
}
} while ( 0 );
return err;
}
INT Unregister_iis_smtp()
{
CRegKey regMachine = HKEY_LOCAL_MACHINE;
INT err = NERR_Success;
// Unregister all of the NNTP sources in the SEO binding database
UnregisterSEOSourcesForSMTP();
// Unregister the OLE objets
SetEnvironmentVariable(_T("__SYSDIR"), theApp.m_csSysDir);
SetEnvironmentVariable(_T("__INETSRV"), theApp.m_csPathInetsrv);
err = (INT)RegisterOLEControlsFromInfSection(theApp.m_hInfHandle[MC_IMS],
_T("SMTP_K2_UNREGISTER"),
FALSE);
err = RegisterOLEControlsFromInfSection(theApp.m_hInfHandle[MC_IMS],
_T("SMTP_UNREGISTER"),
FALSE);
SetEnvironmentVariable(_T("__SYSDIR"), NULL);
SetEnvironmentVariable(_T("__INETSRV"), NULL);
// Bug 51537: Remove MIB from K2 SMTP
RemoveAgent( SZ_SMTPSERVICENAME );
RemoveEventLog( SZ_SMTPSERVICENAME );
err = unlodctr( SZ_SMTPSERVICENAME );
err = unlodctr( SZ_NTFSDRVSERVICENAME );
InetDeleteService(SZ_SMTPSERVICENAME);
InetRegisterService( theApp.m_csMachineName,
SZ_SMTPSERVICENAME,
&g_SMTPGuid, 0, 25, FALSE );
// Blow away the Services\SMTPSVC registry key
CRegKey RegSvcs(HKEY_LOCAL_MACHINE, REG_SERVICES);
if ((HKEY)RegSvcs)
{
RegSvcs.DeleteTree(SZ_SMTPSERVICENAME);
RegSvcs.DeleteTree(SZ_NTFSDRVSERVICENAME);
}
// Blow away SMTP key manager
CRegKey regKeyring( HKEY_LOCAL_MACHINE, REG_KEYRING );
if ((HKEY) regKeyring )
{
regKeyring.DeleteValue(szShortSvcName);
}
// remove LM/SMTPSVC in the metabase
if (DetectExistingIISADMIN())
{
CMDKey cmdKey;
cmdKey.OpenNode(_T("LM"));
if ( (METADATA_HANDLE)cmdKey ) {
cmdKey.DeleteNode(SZ_SMTPSERVICENAME);
cmdKey.Close();
}
}
// remove K2 items from the program groups
RemoveInternetShortcut(MC_IMS,
IDS_PROGITEM_MAIL_SMTP_WEBADMIN,
FALSE);
RemoveInternetShortcut(MC_IMS,
IDS_PROGITEM_MAIL_README,
FALSE);
RemoveInternetShortcut(MC_IMS,
IDS_PROGITEM_MAIL_README_K2,
FALSE);
RemoveInternetShortcut(MC_IMS,
IDS_PROGITEM_MCIS_MAIL_README,
TRUE);
RemoveInternetShortcut(MC_IMS,
IDS_PROGITEM_MAIL_SMTP_WEBADMIN,
TRUE);
//
// remove the one and only webadmin link from "administrative tools"
//
RemoveNt5InternetShortcut(MC_IMS,
IDS_PROGITEM_MAIL_SMTP_WEBADMIN);
CString csMMCFile = theApp.m_csPathInetsrv + _T("\\iis.msc");
EnableSnapInExtension( csMMCFile, wszNt5Smtp_SnapIn, FALSE );
#if 0
// BINLIN 11/3/98 - fix 75049
// NT5 - do something special in compmgmt
EnableCompMgmtExtension( wszNt5Smtp_SnapIn, wszNt5Smtp_SnapInName, FALSE );
#endif
return(err);
}
INT Upgrade_iis_smtp_nt5_fromk2(BOOL fFromK2)
{
// This function handles upgrade from NT4 K2, or MCIS 2.0
INT err = NERR_Success;
CString csBinPath;
DebugOutput(_T("Upgrading from %s to B3 ..."), (fFromK2)? "NT4 K2" : "MCIS 2.0");
BOOL fSvcExist = FALSE;
BOOL fIISADMINExists = DetectExistingIISADMIN();
// set up registry values
CRegKey regMachine = HKEY_LOCAL_MACHINE;
// System\CurrentControlSet\Services\SMTPSVC\Parameters
InsertSetupString( (LPCSTR) REG_SMTPPARAMETERS );
if (fIISADMINExists)
{
// Migrate registry keys to the metabase. Or create from default values
// if fresh install
MigrateIMSToMD(theApp.m_hInfHandle[MC_IMS],
SZ_SMTPSERVICENAME,
_T("SMTP_REG_UPGRADEK2"),
MDID_SMTP_ROUTING_SOURCES,
TRUE);
// bugbug: x5 bug 72284, nt bug 202496 Uncomment this when NT
// is ready to accept these changes
SetAdminACL_wrap(_T("LM/SMTPSVC/1"), (MD_ACR_READ | MD_ACR_ENUM_KEYS), TRUE);
}
// Unload the counters and then reload them
err = unlodctr( SZ_SMTPSERVICENAME );
err = unlodctr( SZ_NTFSDRVSERVICENAME );
err = lodctr(_T("smtpctrs.ini"));
err = lodctr(_T("ntfsdrct.ini"));
SetEnvironmentVariable(_T("__SYSDIR"), theApp.m_csSysDir);
SetEnvironmentVariable(_T("__INETSRV"), theApp.m_csPathInetsrv);
err = (INT)RegisterOLEControlsFromInfSection(theApp.m_hInfHandle[MC_IMS],
_T("SMTP_K2_UNREGISTER"),
FALSE);
err = (INT)RegisterOLEControlsFromInfSection(theApp.m_hInfHandle[MC_IMS],
_T("SMTP_REGISTER"),
TRUE);
// NT5 - Enable snapin extension in iis.msc and compmgmt.msc
CString csMMCFile = theApp.m_csPathInetsrv + _T("\\iis.msc");
EnableSnapInExtension( csMMCFile, wszNt5Smtp_SnapIn, TRUE );
//csMMCFile = theApp.m_csSysDir + _T("\\compmgmt.msc");
//EnableSnapInExtension( csMMCFile, wszNt5Smtp_SnapIn, TRUE );
SetEnvironmentVariable(_T("__SYSDIR"), NULL);
SetEnvironmentVariable(_T("__INETSRV"), NULL);
// Server Events: We are clean installing MCIS, so we make sure we set up
// everything, including the source type and event types.
RegisterSEOForSmtp(TRUE);
if (fFromK2)
{
// upgrade from K2, remove those K2 links
RemoveInternetShortcut(MC_IMS,
IDS_PROGITEM_MAIL_SMTP_WEBADMIN,
FALSE);
RemoveInternetShortcut(MC_IMS,
IDS_PROGITEM_MAIL_README,
FALSE);
RemoveInternetShortcut(MC_IMS,
IDS_PROGITEM_MAIL_README_K2,
FALSE);
}
else
{
// upgrade from MCIS 2.0, remove those MCIS links
RemoveInternetShortcut(MC_IMS,
IDS_PROGITEM_MCIS_MAIL_README,
TRUE);
RemoveInternetShortcut(MC_IMS,
IDS_PROGITEM_MAIL_SMTP_WEBADMIN,
TRUE);
RemoveISMLink();
}
#if 0
// fix 299130/299131 - no webadmin link
//
// Create the one and only Webadmin link under "administrative tools"
//
CreateNt5InternetShortcut(MC_IMS,
IDS_PROGITEM_MAIL_SMTP_WEBADMIN,
IDS_ITEMPATH_MAIL_SMTP_WEBADMIN);
#endif
if (!theApp.m_fMailGroupInstalled)
{
theApp.m_fMailGroupInstalled = TRUE;
}
return err;
}
INT Upgrade_iis_smtp_nt5_fromb2(BOOL fFromB2)
{
INT err = NERR_Success;
DebugOutput(_T("Upgrading from NT5 %s to B3 ..."), (fFromB2)? "B2" : "B3");
BOOL fIISADMINExists = DetectExistingIISADMIN();
// set the K2 Upgrade key to true.
if (fIISADMINExists)
{
MigrateIMSToMD( theApp.m_hInfHandle[MC_IMS],
NULL,
_T("SMTP_REG_K2_TO_EE"),
0,
FALSE,
TRUE );
MigrateIMSToMD( theApp.m_hInfHandle[MC_IMS],
SZ_SMTPSERVICENAME,
_T("SMTP_REG_UPGRADEB2"),
MDID_SMTP_ROUTING_SOURCES,
FALSE );
// bugbug: x5 bug 72284, nt bug 202496 Uncomment this when NT
// is ready to accept these changes
SetAdminACL_wrap(_T("LM/SMTPSVC/1"), (MD_ACR_READ | MD_ACR_ENUM_KEYS), TRUE);
}
SetEnvironmentVariable(_T("__SYSDIR"), theApp.m_csSysDir);
SetEnvironmentVariable(_T("__INETSRV"), theApp.m_csPathInetsrv);
err = (INT)RegisterOLEControlsFromInfSection(theApp.m_hInfHandle[MC_IMS],
_T("SMTP_K2_UNREGISTER"),
FALSE);
err = (INT)RegisterOLEControlsFromInfSection(theApp.m_hInfHandle[MC_IMS],
_T("SMTP_REGISTER"),
TRUE);
SetEnvironmentVariable(_T("__SYSDIR"), NULL);
SetEnvironmentVariable(_T("__INETSRV"), NULL);
// NT5 - Enable snapin extension in iis.msc and compmgmt.msc
CString csMMCFile = theApp.m_csPathInetsrv + _T("\\iis.msc");
EnableSnapInExtension( csMMCFile, wszNt5Smtp_SnapIn, TRUE );
//csMMCFile = theApp.m_csSysDir + _T("\\compmgmt.msc");
//EnableSnapInExtension( csMMCFile, wszNt5Smtp_SnapIn, TRUE );
// Server Events: We are upgrading from K2, so we will register the
// default site (instance) and the MBXSINK binding.
RegisterSEOForSmtp(FALSE);
// System\CurrentControlSet\Services\SMTPSVC\Parameters
InsertSetupString( (LPCSTR) REG_SMTPPARAMETERS );
#if 0
// fix 299130/299131 - no webadmin link
//
// Create the one and only Webadmin link under "administrative tools"
//
CreateNt5InternetShortcut(MC_IMS,
IDS_PROGITEM_MAIL_SMTP_WEBADMIN,
IDS_ITEMPATH_MAIL_SMTP_WEBADMIN);
#endif
return err;
}
INT Upgrade_iis_smtp_from_b2()
{
INT err = NERR_Success;
DebugOutput(_T("Upgrading from K2 B2 to B3 ..."));
do {
// set up registry values
CRegKey regMachine = HKEY_LOCAL_MACHINE;
// Active Messaging
if (theApp.m_fIsMcis)
{
CRegKey regActiveMsg( REG_ACTIVEMSG, regMachine );
if ((HKEY) regActiveMsg )
{
regActiveMsg.SetValue( _T("Use Express"), (DWORD)0x1);
}
}
// System\CurrentControlSet\Services\SMTPSVC\Parameters
CRegKey regSMTPParam( REG_SMTPPARAMETERS, regMachine );
if ((HKEY) regSMTPParam )
{
regSMTPParam.SetValue( _T("MajorVersion"), (DWORD)STACKSMAJORVERSION );
regSMTPParam.SetValue( _T("MinorVersion"), (DWORD)STACKSMINORVERSION );
regSMTPParam.SetValue( _T("InstallPath"), theApp.m_csPathInetsrv );
if (!theApp.m_fIsMcis)
{
regSMTPParam.SetValue( _T("SetupString"), REG_SETUP_STRING );
}
else
{
regSMTPParam.SetValue( _T("SetupString"), REG_SETUP_STRING_MCIS );
}
}
// Move all the parameters to the instance level.
UpdateServiceParameters(SZ_SMTPSERVICENAME);
// We also need to remap all the metabase IDs
RemapServiceParameters(SZ_SMTPSERVICENAME, 8000, 1000, 0x9000);
// Setup the extra metabase keys that were not in B2, such as ADSI Keys
MigrateIMSToMD(theApp.m_hInfHandle[MC_IMS],
SZ_SMTPSERVICENAME,
_T("SMTP_REG_B2_UPGRADE"),
MDID_SMTP_ROUTING_SOURCES,
FALSE);
// register the OLE objects
SetEnvironmentVariable(_T("__SYSDIR"), theApp.m_csSysDir);
SetEnvironmentVariable(_T("__INETSRV"), theApp.m_csPathInetsrv);
err = (INT)RegisterOLEControlsFromInfSection(theApp.m_hInfHandle[MC_IMS],
_T("SMTP_REGISTER"),
TRUE);
SetEnvironmentVariable(_T("__SYSDIR"), NULL);
SetEnvironmentVariable(_T("__INETSRV"), NULL);
// Create program group, the old group would be removed by IIS setup
CreateInternetShortcut(MC_IMS,
IDS_PROGITEM_MAIL_SMTP_WEBADMIN,
IDS_ITEMPATH_MAIL_SMTP_WEBADMIN,
theApp.m_fIsMcis);
CreateInternetShortcut(MC_IMS,
theApp.m_fIsMcis?
IDS_PROGITEM_MCIS_MAIL_README:
IDS_PROGITEM_MAIL_README,
IDS_ITEMPATH_MAIL_README,
theApp.m_fIsMcis);
if (!theApp.m_fMailGroupInstalled)
{
// Set up the uninstall entries for MCIS
if (theApp.m_fIsMcis)
CreateUninstallEntries(SZ_IMS_INF_FILE, SZ_IMS_DISPLAY_NAME);
theApp.m_fMailGroupInstalled = TRUE;
}
} while ( 0 );
return err;
}
INT Upgrade_iis_smtp_from_b3()
{
INT err = NERR_Success;
DebugOutput(_T("Upgrading from K2 B3 to RTM ..."));
do {
// set up registry values
CRegKey regMachine = HKEY_LOCAL_MACHINE;
// Active Messaging
if (theApp.m_fIsMcis)
{
CRegKey regActiveMsg( REG_ACTIVEMSG, regMachine );
if ((HKEY) regActiveMsg )
{
regActiveMsg.SetValue( _T("Use Express"), (DWORD)0x1);
}
}
// System\CurrentControlSet\Services\SMTPSVC\Parameters
CRegKey regSMTPParam( REG_SMTPPARAMETERS, regMachine );
if ((HKEY) regSMTPParam )
{
regSMTPParam.SetValue( _T("MajorVersion"), (DWORD)STACKSMAJORVERSION );
regSMTPParam.SetValue( _T("MinorVersion"), (DWORD)STACKSMINORVERSION );
regSMTPParam.SetValue( _T("InstallPath"), theApp.m_csPathInetsrv );
if (!theApp.m_fIsMcis)
{
regSMTPParam.SetValue( _T("SetupString"), REG_SETUP_STRING );
}
else
{
regSMTPParam.SetValue( _T("SetupString"), REG_SETUP_STRING_MCIS );
}
}
// Convert the domain routing entries from the B3 format to the
// new format ...
ReformatDomainRoutingEntries(SZ_SMTPSERVICENAME);
// register the OLE objects
SetEnvironmentVariable(_T("__SYSDIR"), theApp.m_csSysDir);
SetEnvironmentVariable(_T("__INETSRV"), theApp.m_csPathInetsrv);
err = (INT)RegisterOLEControlsFromInfSection(theApp.m_hInfHandle[MC_IMS],
_T("SMTP_REGISTER"),
TRUE);
SetEnvironmentVariable(_T("__SYSDIR"), NULL);
SetEnvironmentVariable(_T("__INETSRV"), NULL);
// Create program group, the old group would be removed by IIS setup
CreateInternetShortcut(MC_IMS,
IDS_PROGITEM_MAIL_SMTP_WEBADMIN,
IDS_ITEMPATH_MAIL_SMTP_WEBADMIN,
theApp.m_fIsMcis);
CreateInternetShortcut(MC_IMS,
theApp.m_fIsMcis?
IDS_PROGITEM_MCIS_MAIL_README:
IDS_PROGITEM_MAIL_README,
IDS_ITEMPATH_MAIL_README,
theApp.m_fIsMcis);
if (!theApp.m_fMailGroupInstalled)
{
// Set up the uninstall entries for MCIS
if (theApp.m_fIsMcis)
CreateUninstallEntries(SZ_IMS_INF_FILE, SZ_IMS_DISPLAY_NAME);
theApp.m_fMailGroupInstalled = TRUE;
}
} while ( 0 );
return err;
}