// Copyright (c) 2001 Microsoft Corporation // // File: RRASInstallationUnit.cpp // // Synopsis: Defines a RRASInstallationUnit // This object has the knowledge for installing the // RRAS service // // History: 02/06/2001 JeffJon Created #include "pch.h" #include "resource.h" #include "RRASInstallationUnit.h" #include "InstallationUnitProvider.h" #include "NetworkInterface.h" // Finish page help static PCWSTR CYS_RRAS_FINISH_PAGE_HELP = L"cys.chm::/vpn_server_role.htm"; static PCWSTR CYS_RRAS_MILESTONE_HELP = L"cys.chm::/vpn_server_role.htm#vpnsrvsummary"; static PCWSTR CYS_RRAS_AFTER_FINISH_HELP = L"cys.chm::/vpn_server_role.htm#vpnsrvcompletion"; RRASInstallationUnit::RRASInstallationUnit() : rrasWizard(false), installedDescriptionID(IDS_RRAS_SERVER_DESCRIPTION_INSTALLED), ExpressPathInstallationUnitBase( IDS_RRAS_SERVER_TYPE, IDS_RRAS_SERVER_DESCRIPTION2, IDS_RRAS_FINISH_TITLE, IDS_RRAS_FINISH_UNINSTALL_TITLE, IDS_RRAS_FINISH_MESSAGE, IDS_RRAS_INSTALL_FAILED, IDS_RRAS_UNINSTALL_MESSAGE, IDS_RRAS_UNINSTALL_FAILED, IDS_RRAS_UNINSTALL_WARNING, IDS_RRAS_UNINSTALL_CHECKBOX, CYS_RRAS_FINISH_PAGE_HELP, CYS_RRAS_MILESTONE_HELP, CYS_RRAS_AFTER_FINISH_HELP, RRAS_SERVER) { LOG_CTOR(RRASInstallationUnit); } RRASInstallationUnit::~RRASInstallationUnit() { LOG_DTOR(RRASInstallationUnit); } InstallationReturnType RRASInstallationUnit::InstallService(HANDLE logfileHandle, HWND hwnd) { LOG_FUNCTION(RRASInstallationUnit::InstallService); InstallationReturnType result = INSTALL_SUCCESS; if (IsExpressPathInstall()) { result = ExpressPathInstall(logfileHandle, hwnd); LOG_INSTALL_RETURN(result); return result; } // Run the RRAS Wizard CYS_APPEND_LOG(String::load(IDS_LOG_RRAS_HEADING)); CYS_APPEND_LOG(String::load(IDS_LOG_RRAS)); UpdateInstallationProgressText(hwnd, IDS_RRAS_PROGRESS); do { String resultText; HRESULT unused = S_OK; if (!ExecuteWizard(hwnd, CYS_RRAS_SERVICE_NAME, resultText, unused)) { if (!resultText.empty()) { CYS_APPEND_LOG(resultText); } result = INSTALL_FAILURE; break; } if (IsServiceInstalled()) { // The RRAS Wizard completed successfully LOG(L"RRAS server wizard completed successfully"); CYS_APPEND_LOG(String::load(IDS_LOG_RRAS_COMPLETED_SUCCESSFULLY)); } else { // The Configure DHCP Server Wizard did not finish successfully LOG(L"The RRAS wizard failed to run"); CYS_APPEND_LOG(String::load(IDS_LOG_RRAS_WIZARD_ERROR)); result = INSTALL_FAILURE; } } while (false); LOG_INSTALL_RETURN(result); return result; } UnInstallReturnType RRASInstallationUnit::UnInstallService(HANDLE logfileHandle, HWND hwnd) { LOG_FUNCTION(RRASInstallationUnit::UnInstallService); UnInstallReturnType result = UNINSTALL_SUCCESS; // Run the RRAS Wizard CYS_APPEND_LOG(String::load(IDS_LOG_UNINSTALL_RRAS_HEADING)); UpdateInstallationProgressText(hwnd, IDS_RRAS_UNINSTALL_PROGRESS); do { String resultText; HRESULT unused = S_OK; if (!ExecuteWizard(hwnd, CYS_RRAS_UNINSTALL, resultText, unused)) { CYS_APPEND_LOG(String::load(IDS_LOG_UNINSTALL_RRAS_FAILED)); result = UNINSTALL_FAILURE; break; } if (!IsServiceInstalled()) { // The Disable RRAS completed successfully LOG(L"Disable RRAS server completed successfully"); CYS_APPEND_LOG(String::load(IDS_LOG_UNINSTALL_RRAS_COMPLETED_SUCCESSFULLY)); } else { // The Disable RRAS Server did not finish successfully CYS_APPEND_LOG(String::load(IDS_LOG_UNINSTALL_RRAS_FAILED)); LOG(L"The RRAS wizard failed to run"); // CYS_APPEND_LOG(String::load(IDS_LOG_UNINSTALL_RRAS_WIZARD_ERROR)); result = UNINSTALL_FAILURE; } } while (false); LOG_UNINSTALL_RETURN(result); return result; } InstallationReturnType RRASInstallationUnit::ExpressPathInstall(HANDLE logfileHandle, HWND hwnd) { LOG_FUNCTION(RRASInstallationUnit::ExpressPathInstall); InstallationReturnType result = INSTALL_SUCCESS; do { if (rrasWizard) { SafeDLL rrasDLL(L"mprsnap.dll"); FARPROC proc = 0; HRESULT hr = rrasDLL.GetProcAddress(L"SetupWithCYS", proc); if (FAILED(hr)) { LOG(String::format( L"Failed to to GetProcAddress from mprsnap.dll: hr = 0x%1!x!", hr)); CYS_APPEND_LOG(String::format( IDS_LOG_EXPRESS_RRAS_FAILED, GetErrorMessage(hr).c_str())); InstallationUnitProvider::GetInstance(). GetExpressInstallationUnit().SetExpressRoleResult( ExpressInstallationUnit::EXPRESS_RRAS_FAILURE); result = INSTALL_FAILURE; break; } UpdateInstallationProgressText(hwnd, IDS_RRAS_CONFIG_PROGRESS); RRASSNAPPROC rrasproc = reinterpret_cast(proc); hr = CallRRASWizard(rrasproc); if (ERROR_CANCELLED == HRESULT_CODE(hr)) { LOG(L"The RRAS wizard was cancelled by the user"); CYS_APPEND_LOG(String::load(IDS_LOG_EXPRESS_RRAS_CANCELLED)); result = INSTALL_CANCELLED; InstallationUnitProvider::GetInstance(). GetExpressInstallationUnit().SetExpressRoleResult( ExpressInstallationUnit::EXPRESS_RRAS_CANCELLED); break; } else if (FAILED(hr)) { LOG(String::format( L"Failed during call to RRAS Wizard: hr = 0x%1!x!", hr)); CYS_APPEND_LOG(String::format( IDS_LOG_EXPRESS_RRAS_FAILED, GetErrorMessage(hr).c_str())); result = INSTALL_FAILURE; InstallationUnitProvider::GetInstance(). GetExpressInstallationUnit().SetExpressRoleResult( ExpressInstallationUnit::EXPRESS_RRAS_FAILURE); break; } State::GetInstance().SetLocalNIC(localNIC, true); CYS_APPEND_LOG(String::load(IDS_LOG_EXPRESS_RRAS_SUCCESSFUL)); } } while (false); LOG_INSTALL_RETURN(result); return result; } HRESULT RRASInstallationUnit::CallRRASWizard(RRASSNAPPROC proc) { LOG_FUNCTION(RRASInstallationUnit::CallRRASWizard); HRESULT hr = S_OK; do { wchar_t* guidString = 0; hr = proc(CYS_EXPRESS_RRAS, reinterpret_cast(&guidString)); if (FAILED(hr)) { LOG(String::format( L"Failed during call to rrasproc: hr = 0x%1!x!", hr)); break; } localNIC = guidString; HRESULT unused = Win::LocalFree(guidString); ASSERT(SUCCEEDED(unused)); LOG(localNIC); } while (false); LOG_HRESULT(hr); return hr; } bool RRASInstallationUnit::GetMilestoneText(String& message) { LOG_FUNCTION(RRASInstallationUnit::GetMilestoneText); message = String::load(IDS_RRAS_FINISH_TEXT); LOG_BOOL(true); return true; } bool RRASInstallationUnit::GetUninstallMilestoneText(String& message) { LOG_FUNCTION(RRASInstallationUnit::GetUninstallMilestoneText); message = String::load(IDS_RRAS_UNINSTALL_TEXT); LOG_BOOL(true); return true; } void RRASInstallationUnit::SetExpressPathValues( bool runRRASWizard) { LOG_FUNCTION(RRASInstallationUnit::SetExpressPathValues); LOG(String::format( L"runRRASWizard = %1", runRRASWizard ? L"true" : L"false")); rrasWizard = runRRASWizard; } bool RRASInstallationUnit::ShouldRunRRASWizard() const { LOG_FUNCTION(RRASInstallationUnit::ShouldRunRRASWizard); LOG_BOOL(rrasWizard); return rrasWizard; } bool RRASInstallationUnit::IsRoutingOn() const { LOG_FUNCTION(RRASInstallationUnit::IsRoutingOn); return ShouldRunRRASWizard(); } String RRASInstallationUnit::GetServiceDescription() { LOG_FUNCTION(RRASInstallationUnit::GetServiceDescription); String result; unsigned int resultID = descriptionID; if (GetStatus() == STATUS_COMPLETED) { resultID = installedDescriptionID; } result = String::load(resultID); ASSERT(!result.empty()); return result; } void RRASInstallationUnit::ServerRoleLinkSelected(int linkIndex, HWND /*hwnd*/) { LOG_FUNCTION2( RRASInstallationUnit::ServerRoleLinkSelected, String::format( L"linkIndex = %1!d!", linkIndex)); if (IsServiceInstalled()) { ASSERT(linkIndex == 0); LaunchMYS(); } else { ASSERT(linkIndex == 0); LOG(L"Showing configuration help"); ShowHelp(CYS_RRAS_FINISH_PAGE_HELP); } } void RRASInstallationUnit::FinishLinkSelected(int linkIndex, HWND /*hwnd*/) { LOG_FUNCTION2( RRASInstallationUnit::FinishLinkSelected, String::format( L"linkIndex = %1!d!", linkIndex)); if (installing) { if (linkIndex == 0) { if (GetInstallResult() != INSTALL_SUCCESS) { // launch the snapin for success and failure LOG(L"Launching RRAS snapin"); LaunchMMCConsole(L"rrasmgmt.msc"); } else { LOG("Showing after checklist"); ShowHelp(CYS_RRAS_AFTER_FINISH_HELP); } } } else { LOG(L"Launching RRAS snapin"); LaunchMMCConsole(L"rrasmgmt.msc"); } }