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.

416 lines
10 KiB

  1. // Copyright (c) 2001 Microsoft Corporation
  2. //
  3. // File: RRASInstallationUnit.cpp
  4. //
  5. // Synopsis: Defines a RRASInstallationUnit
  6. // This object has the knowledge for installing the
  7. // RRAS service
  8. //
  9. // History: 02/06/2001 JeffJon Created
  10. #include "pch.h"
  11. #include "resource.h"
  12. #include "RRASInstallationUnit.h"
  13. #include "InstallationUnitProvider.h"
  14. #include "NetworkInterface.h"
  15. // Finish page help
  16. static PCWSTR CYS_RRAS_FINISH_PAGE_HELP = L"cys.chm::/vpn_server_role.htm";
  17. static PCWSTR CYS_RRAS_MILESTONE_HELP = L"cys.chm::/vpn_server_role.htm#vpnsrvsummary";
  18. static PCWSTR CYS_RRAS_AFTER_FINISH_HELP = L"cys.chm::/vpn_server_role.htm#vpnsrvcompletion";
  19. RRASInstallationUnit::RRASInstallationUnit() :
  20. rrasWizard(false),
  21. installedDescriptionID(IDS_RRAS_SERVER_DESCRIPTION_INSTALLED),
  22. ExpressPathInstallationUnitBase(
  23. IDS_RRAS_SERVER_TYPE,
  24. IDS_RRAS_SERVER_DESCRIPTION2,
  25. IDS_RRAS_FINISH_TITLE,
  26. IDS_RRAS_FINISH_UNINSTALL_TITLE,
  27. IDS_RRAS_FINISH_MESSAGE,
  28. IDS_RRAS_INSTALL_FAILED,
  29. IDS_RRAS_UNINSTALL_MESSAGE,
  30. IDS_RRAS_UNINSTALL_FAILED,
  31. IDS_RRAS_UNINSTALL_WARNING,
  32. IDS_RRAS_UNINSTALL_CHECKBOX,
  33. CYS_RRAS_FINISH_PAGE_HELP,
  34. CYS_RRAS_MILESTONE_HELP,
  35. CYS_RRAS_AFTER_FINISH_HELP,
  36. RRAS_SERVER)
  37. {
  38. LOG_CTOR(RRASInstallationUnit);
  39. }
  40. RRASInstallationUnit::~RRASInstallationUnit()
  41. {
  42. LOG_DTOR(RRASInstallationUnit);
  43. }
  44. InstallationReturnType
  45. RRASInstallationUnit::InstallService(HANDLE logfileHandle, HWND hwnd)
  46. {
  47. LOG_FUNCTION(RRASInstallationUnit::InstallService);
  48. InstallationReturnType result = INSTALL_SUCCESS;
  49. if (IsExpressPathInstall())
  50. {
  51. result = ExpressPathInstall(logfileHandle, hwnd);
  52. LOG_INSTALL_RETURN(result);
  53. return result;
  54. }
  55. // Run the RRAS Wizard
  56. CYS_APPEND_LOG(String::load(IDS_LOG_RRAS_HEADING));
  57. CYS_APPEND_LOG(String::load(IDS_LOG_RRAS));
  58. UpdateInstallationProgressText(hwnd, IDS_RRAS_PROGRESS);
  59. do
  60. {
  61. String resultText;
  62. HRESULT unused = S_OK;
  63. if (!ExecuteWizard(hwnd, CYS_RRAS_SERVICE_NAME, resultText, unused))
  64. {
  65. if (!resultText.empty())
  66. {
  67. CYS_APPEND_LOG(resultText);
  68. }
  69. result = INSTALL_FAILURE;
  70. break;
  71. }
  72. if (IsServiceInstalled())
  73. {
  74. // The RRAS Wizard completed successfully
  75. LOG(L"RRAS server wizard completed successfully");
  76. CYS_APPEND_LOG(String::load(IDS_LOG_RRAS_COMPLETED_SUCCESSFULLY));
  77. }
  78. else
  79. {
  80. // The Configure DHCP Server Wizard did not finish successfully
  81. LOG(L"The RRAS wizard failed to run");
  82. CYS_APPEND_LOG(String::load(IDS_LOG_RRAS_WIZARD_ERROR));
  83. result = INSTALL_FAILURE;
  84. }
  85. } while (false);
  86. LOG_INSTALL_RETURN(result);
  87. return result;
  88. }
  89. UnInstallReturnType
  90. RRASInstallationUnit::UnInstallService(HANDLE logfileHandle, HWND hwnd)
  91. {
  92. LOG_FUNCTION(RRASInstallationUnit::UnInstallService);
  93. UnInstallReturnType result = UNINSTALL_SUCCESS;
  94. // Run the RRAS Wizard
  95. CYS_APPEND_LOG(String::load(IDS_LOG_UNINSTALL_RRAS_HEADING));
  96. UpdateInstallationProgressText(hwnd, IDS_RRAS_UNINSTALL_PROGRESS);
  97. do
  98. {
  99. String resultText;
  100. HRESULT unused = S_OK;
  101. if (!ExecuteWizard(hwnd, CYS_RRAS_UNINSTALL, resultText, unused))
  102. {
  103. CYS_APPEND_LOG(String::load(IDS_LOG_UNINSTALL_RRAS_FAILED));
  104. result = UNINSTALL_FAILURE;
  105. break;
  106. }
  107. if (!IsServiceInstalled())
  108. {
  109. // The Disable RRAS completed successfully
  110. LOG(L"Disable RRAS server completed successfully");
  111. CYS_APPEND_LOG(String::load(IDS_LOG_UNINSTALL_RRAS_COMPLETED_SUCCESSFULLY));
  112. }
  113. else
  114. {
  115. // The Disable RRAS Server did not finish successfully
  116. CYS_APPEND_LOG(String::load(IDS_LOG_UNINSTALL_RRAS_FAILED));
  117. LOG(L"The RRAS wizard failed to run");
  118. // CYS_APPEND_LOG(String::load(IDS_LOG_UNINSTALL_RRAS_WIZARD_ERROR));
  119. result = UNINSTALL_FAILURE;
  120. }
  121. } while (false);
  122. LOG_UNINSTALL_RETURN(result);
  123. return result;
  124. }
  125. InstallationReturnType
  126. RRASInstallationUnit::ExpressPathInstall(HANDLE logfileHandle, HWND hwnd)
  127. {
  128. LOG_FUNCTION(RRASInstallationUnit::ExpressPathInstall);
  129. InstallationReturnType result = INSTALL_SUCCESS;
  130. do
  131. {
  132. if (rrasWizard)
  133. {
  134. SafeDLL rrasDLL(L"mprsnap.dll");
  135. FARPROC proc = 0;
  136. HRESULT hr = rrasDLL.GetProcAddress(L"SetupWithCYS", proc);
  137. if (FAILED(hr))
  138. {
  139. LOG(String::format(
  140. L"Failed to to GetProcAddress from mprsnap.dll: hr = 0x%1!x!",
  141. hr));
  142. CYS_APPEND_LOG(String::format(
  143. IDS_LOG_EXPRESS_RRAS_FAILED,
  144. GetErrorMessage(hr).c_str()));
  145. InstallationUnitProvider::GetInstance().
  146. GetExpressInstallationUnit().SetExpressRoleResult(
  147. ExpressInstallationUnit::EXPRESS_RRAS_FAILURE);
  148. result = INSTALL_FAILURE;
  149. break;
  150. }
  151. UpdateInstallationProgressText(hwnd, IDS_RRAS_CONFIG_PROGRESS);
  152. RRASSNAPPROC rrasproc = reinterpret_cast<RRASSNAPPROC>(proc);
  153. hr = CallRRASWizard(rrasproc);
  154. if (ERROR_CANCELLED == HRESULT_CODE(hr))
  155. {
  156. LOG(L"The RRAS wizard was cancelled by the user");
  157. CYS_APPEND_LOG(String::load(IDS_LOG_EXPRESS_RRAS_CANCELLED));
  158. result = INSTALL_CANCELLED;
  159. InstallationUnitProvider::GetInstance().
  160. GetExpressInstallationUnit().SetExpressRoleResult(
  161. ExpressInstallationUnit::EXPRESS_RRAS_CANCELLED);
  162. break;
  163. }
  164. else if (FAILED(hr))
  165. {
  166. LOG(String::format(
  167. L"Failed during call to RRAS Wizard: hr = 0x%1!x!",
  168. hr));
  169. CYS_APPEND_LOG(String::format(
  170. IDS_LOG_EXPRESS_RRAS_FAILED,
  171. GetErrorMessage(hr).c_str()));
  172. result = INSTALL_FAILURE;
  173. InstallationUnitProvider::GetInstance().
  174. GetExpressInstallationUnit().SetExpressRoleResult(
  175. ExpressInstallationUnit::EXPRESS_RRAS_FAILURE);
  176. break;
  177. }
  178. State::GetInstance().SetLocalNIC(localNIC, true);
  179. CYS_APPEND_LOG(String::load(IDS_LOG_EXPRESS_RRAS_SUCCESSFUL));
  180. }
  181. } while (false);
  182. LOG_INSTALL_RETURN(result);
  183. return result;
  184. }
  185. HRESULT
  186. RRASInstallationUnit::CallRRASWizard(RRASSNAPPROC proc)
  187. {
  188. LOG_FUNCTION(RRASInstallationUnit::CallRRASWizard);
  189. HRESULT hr = S_OK;
  190. do
  191. {
  192. wchar_t* guidString = 0;
  193. hr = proc(CYS_EXPRESS_RRAS, reinterpret_cast<void**>(&guidString));
  194. if (FAILED(hr))
  195. {
  196. LOG(String::format(
  197. L"Failed during call to rrasproc: hr = 0x%1!x!",
  198. hr));
  199. break;
  200. }
  201. localNIC = guidString;
  202. HRESULT unused = Win::LocalFree(guidString);
  203. ASSERT(SUCCEEDED(unused));
  204. LOG(localNIC);
  205. } while (false);
  206. LOG_HRESULT(hr);
  207. return hr;
  208. }
  209. bool
  210. RRASInstallationUnit::GetMilestoneText(String& message)
  211. {
  212. LOG_FUNCTION(RRASInstallationUnit::GetMilestoneText);
  213. message = String::load(IDS_RRAS_FINISH_TEXT);
  214. LOG_BOOL(true);
  215. return true;
  216. }
  217. bool
  218. RRASInstallationUnit::GetUninstallMilestoneText(String& message)
  219. {
  220. LOG_FUNCTION(RRASInstallationUnit::GetUninstallMilestoneText);
  221. message = String::load(IDS_RRAS_UNINSTALL_TEXT);
  222. LOG_BOOL(true);
  223. return true;
  224. }
  225. void
  226. RRASInstallationUnit::SetExpressPathValues(
  227. bool runRRASWizard)
  228. {
  229. LOG_FUNCTION(RRASInstallationUnit::SetExpressPathValues);
  230. LOG(String::format(
  231. L"runRRASWizard = %1",
  232. runRRASWizard ? L"true" : L"false"));
  233. rrasWizard = runRRASWizard;
  234. }
  235. bool
  236. RRASInstallationUnit::ShouldRunRRASWizard() const
  237. {
  238. LOG_FUNCTION(RRASInstallationUnit::ShouldRunRRASWizard);
  239. LOG_BOOL(rrasWizard);
  240. return rrasWizard;
  241. }
  242. bool
  243. RRASInstallationUnit::IsRoutingOn() const
  244. {
  245. LOG_FUNCTION(RRASInstallationUnit::IsRoutingOn);
  246. return ShouldRunRRASWizard();
  247. }
  248. String
  249. RRASInstallationUnit::GetServiceDescription()
  250. {
  251. LOG_FUNCTION(RRASInstallationUnit::GetServiceDescription);
  252. String result;
  253. unsigned int resultID = descriptionID;
  254. if (GetStatus() == STATUS_COMPLETED)
  255. {
  256. resultID = installedDescriptionID;
  257. }
  258. result = String::load(resultID);
  259. ASSERT(!result.empty());
  260. return result;
  261. }
  262. void
  263. RRASInstallationUnit::ServerRoleLinkSelected(int linkIndex, HWND /*hwnd*/)
  264. {
  265. LOG_FUNCTION2(
  266. RRASInstallationUnit::ServerRoleLinkSelected,
  267. String::format(
  268. L"linkIndex = %1!d!",
  269. linkIndex));
  270. if (IsServiceInstalled())
  271. {
  272. ASSERT(linkIndex == 0);
  273. LaunchMYS();
  274. }
  275. else
  276. {
  277. ASSERT(linkIndex == 0);
  278. LOG(L"Showing configuration help");
  279. ShowHelp(CYS_RRAS_FINISH_PAGE_HELP);
  280. }
  281. }
  282. void
  283. RRASInstallationUnit::FinishLinkSelected(int linkIndex, HWND /*hwnd*/)
  284. {
  285. LOG_FUNCTION2(
  286. RRASInstallationUnit::FinishLinkSelected,
  287. String::format(
  288. L"linkIndex = %1!d!",
  289. linkIndex));
  290. if (installing)
  291. {
  292. if (linkIndex == 0)
  293. {
  294. if (GetInstallResult() != INSTALL_SUCCESS)
  295. {
  296. // launch the snapin for success and failure
  297. LOG(L"Launching RRAS snapin");
  298. LaunchMMCConsole(L"rrasmgmt.msc");
  299. }
  300. else
  301. {
  302. LOG("Showing after checklist");
  303. ShowHelp(CYS_RRAS_AFTER_FINISH_HELP);
  304. }
  305. }
  306. }
  307. else
  308. {
  309. LOG(L"Launching RRAS snapin");
  310. LaunchMMCConsole(L"rrasmgmt.msc");
  311. }
  312. }