Source code of Windows XP (NT5)
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.

483 lines
11 KiB

  1. //Copyright (c) 1998 - 1999 Microsoft Corporation
  2. // pages.cpp
  3. #include "stdafx.h"
  4. #include "hydraoc.h"
  5. #include "pages.h"
  6. const WARNING_STRING_LENGTH = 1024;
  7. LPCTSTR GetUninstallKey() {return _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall");}
  8. //
  9. // ModePage Class
  10. //
  11. AppSrvWarningPage::AppSrvWarningPage (COCPageData* pPageData) : COCPage(pPageData)
  12. {
  13. }
  14. BOOL AppSrvWarningPage ::CanShow ()
  15. {
  16. return (!StateObject.IsUnattended() && StateObject.IsAppServerSelected() && !StateObject.WasItAppServer());
  17. }
  18. BOOL AppSrvWarningPage::OnInitDialog (HWND /* hwndDlg */, WPARAM /* wParam */, LPARAM /* lParam */)
  19. {
  20. HICON hIcon;
  21. hIcon = (HICON)LoadImage(
  22. GetInstance(),
  23. MAKEINTRESOURCE(IDI_SMALLWARN),
  24. IMAGE_ICON,
  25. 0,
  26. 0,
  27. 0
  28. );
  29. ASSERT(hIcon != NULL);
  30. SendMessage(
  31. GetDlgItem(m_hDlgWnd, IDC_WARNING_ICON),
  32. STM_SETICON,
  33. (WPARAM)hIcon,
  34. (LPARAM)0
  35. );
  36. TCHAR szWarningString[WARNING_STRING_LENGTH];
  37. UINT uiWarningId = StateObject.IsFreshInstall() ? IDS_STRING_TSINSTALL_CLEAN : IDS_STRING_TSINSTALL_ARP;
  38. if (LoadString( GetInstance(), uiWarningId, szWarningString, WARNING_STRING_LENGTH ))
  39. {
  40. SetDlgItemText(m_hDlgWnd, IDC_WARNING_MSG, szWarningString);
  41. }
  42. return(TRUE);
  43. }
  44. UINT AppSrvWarningPage::GetHeaderTitleResource ()
  45. {
  46. return IDS_STRING_APPSRV_WARN_TITLE;
  47. }
  48. UINT AppSrvWarningPage::GetHeaderSubTitleResource ()
  49. {
  50. return IDS_STRING_APPSRV_WARN_SUBTITLE;
  51. }
  52. AppSrvUninstallpage::AppSrvUninstallpage (COCPageData* pPageData) : COCPage(pPageData)
  53. {
  54. }
  55. BOOL AppSrvUninstallpage ::CanShow ()
  56. {
  57. return ( StateObject.IsStandAlone() && !StateObject.IsUnattended() && !StateObject.IsAppServerSelected() && StateObject.WasItAppServer());
  58. }
  59. BOOL AppSrvUninstallpage::OnInitDialog (HWND /* hwndDlg */, WPARAM /* wParam */, LPARAM /* lParam */)
  60. {
  61. HICON hIcon;
  62. hIcon = (HICON)LoadImage(
  63. GetInstance(),
  64. MAKEINTRESOURCE(IDI_SMALLWARN),
  65. IMAGE_ICON,
  66. 0,
  67. 0,
  68. 0
  69. );
  70. ASSERT(hIcon != NULL);
  71. SendMessage(
  72. GetDlgItem(m_hDlgWnd, IDC_WARNING_ICON),
  73. STM_SETICON,
  74. (WPARAM)hIcon,
  75. (LPARAM)0
  76. );
  77. TCHAR szWarningString[WARNING_STRING_LENGTH];
  78. if (LoadString( GetInstance(), IDS_STRING_TSREMOVE, szWarningString, WARNING_STRING_LENGTH ))
  79. {
  80. SetDlgItemText(m_hDlgWnd, IDC_WARNING_MSG, szWarningString);
  81. }
  82. return(TRUE);
  83. }
  84. UINT AppSrvUninstallpage::GetHeaderTitleResource ()
  85. {
  86. return IDS_STRING_APPSRV_UNINSTALL_WARN_TITLE;
  87. }
  88. UINT AppSrvUninstallpage::GetHeaderSubTitleResource ()
  89. {
  90. return IDS_STRING_APPSRV_UNINSTALL_WARN_SUBTITLE;
  91. }
  92. //
  93. // DefSecPageData Class
  94. //
  95. DefSecPageData::DefSecPageData() : COCPageData()
  96. {
  97. m_cArray = 0;
  98. m_pWinStationArray = NULL;
  99. }
  100. DefSecPageData::~DefSecPageData()
  101. {
  102. CleanArray();
  103. }
  104. VOID DefSecPageData::CleanArray()
  105. {
  106. if (m_pWinStationArray != NULL)
  107. {
  108. for (UINT i = 0; i < m_cArray; i++)
  109. {
  110. if (m_pWinStationArray[i] != NULL)
  111. {
  112. LocalFree(m_pWinStationArray[i]);
  113. }
  114. }
  115. LocalFree(m_pWinStationArray);
  116. m_pWinStationArray = NULL;
  117. }
  118. m_cArray = 0;
  119. }
  120. BOOL DefSecPageData::AlocateWinstationsArray (UINT uiWinstationCount)
  121. {
  122. if (m_pWinStationArray != NULL)
  123. {
  124. CleanArray();
  125. }
  126. ASSERT(m_pWinStationArray == NULL);
  127. if (uiWinstationCount > 0)
  128. {
  129. m_pWinStationArray = (LPTSTR*)LocalAlloc(LPTR, uiWinstationCount * sizeof(LPTSTR));
  130. if (NULL == m_pWinStationArray)
  131. {
  132. return FALSE;
  133. }
  134. }
  135. return TRUE;
  136. }
  137. BOOL DefSecPageData::AddWinstation (LPCTSTR pStr)
  138. {
  139. ASSERT(NULL != m_pWinStationArray);
  140. ASSERT(pStr);
  141. LPTSTR pWinStation = (LPTSTR)LocalAlloc(LPTR, (_tcslen(pStr) + 1) * sizeof(TCHAR));
  142. if (pWinStation == NULL)
  143. {
  144. return FALSE;
  145. }
  146. _tcscpy(pWinStation, pStr);
  147. m_pWinStationArray[m_cArray] = pWinStation;
  148. m_cArray++;
  149. return TRUE;
  150. }
  151. //
  152. // DefaultSecurityPage Class
  153. //
  154. DefaultSecurityPage::DefaultSecurityPage(COCPageData* pPageData) : COCPage(pPageData)
  155. {
  156. m_cWinStations = 0;
  157. m_hListView = NULL;
  158. }
  159. BOOL DefaultSecurityPage::CanShow ()
  160. {
  161. return ((m_cWinStations > 0) && StateObject.IsTSEnableSelected() && StateObject.WasItAppServer() != StateObject.IsAppServerSelected() && !StateObject.IsUnattended());
  162. }
  163. BOOL DefaultSecurityPage::OnInitDialog (HWND /* hwndDlg */, WPARAM /* wParam */, LPARAM /* lParam */)
  164. {
  165. LVCOLUMN lvColumn;
  166. RECT rc;
  167. m_hListView = GetDlgItem(m_hDlgWnd, IDC_SECURITY_LISTVIEW);
  168. ListView_SetExtendedListViewStyleEx(m_hListView, LVS_EX_CHECKBOXES, LVS_EX_CHECKBOXES);
  169. GetClientRect(m_hListView , &rc);
  170. lvColumn.mask = LVCF_FMT | LVCF_WIDTH;
  171. lvColumn.fmt = LVCFMT_LEFT;
  172. lvColumn.cx = rc.right - rc.left - GetSystemMetrics(SM_CXHSCROLL) - 2;
  173. ListView_InsertColumn(m_hListView, 0, &lvColumn);
  174. PopulateWinStationList();
  175. return(TRUE);
  176. }
  177. VOID DefaultSecurityPage::OnActivation ()
  178. {
  179. ASSERT(CanShow());
  180. if (StateObject.IsAppServerSelected())
  181. {
  182. ShowWindow(GetDlgItem(m_hDlgWnd, IDC_SECURITY_DEFAULT_1), SW_HIDE);
  183. ShowWindow(GetDlgItem(m_hDlgWnd, IDC_SECURITY_DEFAULT_2), SW_SHOW);
  184. }
  185. else
  186. {
  187. ShowWindow(GetDlgItem(m_hDlgWnd, IDC_SECURITY_DEFAULT_1), SW_SHOW);
  188. ShowWindow(GetDlgItem(m_hDlgWnd, IDC_SECURITY_DEFAULT_2), SW_HIDE);
  189. }
  190. }
  191. VOID DefaultSecurityPage::OnDeactivation ()
  192. {
  193. GetPageData()->CleanArray();
  194. }
  195. BOOL DefaultSecurityPage::ApplyChanges ()
  196. {
  197. //
  198. // If this page has been processed, then the back button on a succeeding page
  199. // is pressed and this page is returned to the screen, empty out the old
  200. // information.
  201. //
  202. ASSERT(CanShow());
  203. if (m_cWinStations != 0)
  204. {
  205. LOGMESSAGE1(_T("%d WinStations to verify."), m_cWinStations);
  206. //
  207. // Allocate an array big enough to hold all items, even if some are not checked.
  208. // If the allocation fails, set the array size to zero, and continue as if there
  209. // is no error.
  210. //
  211. if (!GetPageData()->AlocateWinstationsArray(m_cWinStations))
  212. {
  213. LOGMESSAGE0(_T("Error: Out of Memory creating WinStation list."));
  214. return(TRUE);
  215. }
  216. for (UINT i = 0; i < m_cWinStations; i++)
  217. {
  218. if (ListView_GetCheckState(m_hListView, i))
  219. {
  220. TCHAR pStr[S_SIZE];
  221. LOGMESSAGE1(_T("Item %d checked"), i);
  222. ListView_GetItemText(m_hListView, i, 0, pStr, S_SIZE);
  223. if (!GetPageData()->AddWinstation (pStr))
  224. {
  225. LOGMESSAGE1(_T("Error: Out of Memory creating %s entry."), pStr);
  226. }
  227. }
  228. else
  229. {
  230. LOGMESSAGE1(_T("Item %d unchecked"), i);
  231. }
  232. }
  233. }
  234. else
  235. {
  236. LOGMESSAGE0(_T("No WinStations to verify."));
  237. }
  238. LOGMESSAGE0(_T("Default Security change-list made.\r\n\r\n"));
  239. return(TRUE);
  240. }
  241. UINT DefaultSecurityPage::GetHeaderTitleResource ()
  242. {
  243. return IDS_STRING_SEC_PAGE_HEADER_TITLE;
  244. }
  245. UINT DefaultSecurityPage::GetHeaderSubTitleResource ()
  246. {
  247. return IDS_STRING_SEC_PAGE_HEADER_SUBTITLE;
  248. }
  249. DefSecPageData* DefaultSecurityPage::GetPageData()
  250. {
  251. return(static_cast <DefSecPageData *> (COCPage::GetPageData()));
  252. }
  253. BOOL DefaultSecurityPage::PopulateWinStationList ()
  254. {
  255. DWORD dwRet;
  256. ULONG cbWinStationName, cEntries, iWinStation;
  257. WINSTATIONNAME WinStationName;
  258. cbWinStationName = sizeof(WINSTATIONNAME);
  259. cEntries = 1;
  260. iWinStation = 0;
  261. m_cWinStations = 0;
  262. GetPageData()->CleanArray();
  263. LOGMESSAGE0(_T("Populating WinStation list."));
  264. while ((dwRet = RegWinStationEnumerate(
  265. SERVERNAME_CURRENT,
  266. &iWinStation,
  267. &cEntries,
  268. WinStationName,
  269. &cbWinStationName)) == ERROR_SUCCESS)
  270. {
  271. LVITEM lvItem;
  272. ULONG cbSecDescLen = 0;
  273. //
  274. // Skip the console winstation.
  275. //
  276. if (_tcsicmp(WinStationName, _T("Console")) == 0)
  277. {
  278. LOGMESSAGE0(_T("Skipping Console winstation."));
  279. continue;
  280. }
  281. LOGMESSAGE1(_T("Checking %s for custom security."), WinStationName);
  282. //
  283. // Check for custom security.
  284. //
  285. dwRet = RegWinStationQuerySecurity(
  286. SERVERNAME_CURRENT,
  287. WinStationName,
  288. NULL,
  289. 0,
  290. &cbSecDescLen
  291. );
  292. if (dwRet == ERROR_INSUFFICIENT_BUFFER)
  293. {
  294. //
  295. // Insufficient buffer means the winstation has custom security.
  296. // cbSecDescLen must be greater than zero.
  297. //
  298. ASSERT(cbSecDescLen > 0);
  299. dwRet = ERROR_SUCCESS;
  300. LOGMESSAGE1(_T("%s has custom security."), WinStationName);
  301. //
  302. // The current winstation has custom security. Add it to the list.
  303. //
  304. lvItem.mask = LVIF_TEXT;
  305. lvItem.pszText = WinStationName;
  306. lvItem.iItem = m_cWinStations;
  307. lvItem.iSubItem = 0;
  308. ListView_InsertItem(m_hListView, &lvItem);
  309. ListView_SetCheckState(m_hListView, m_cWinStations, TRUE);
  310. m_cWinStations++;
  311. }
  312. else
  313. {
  314. LOGMESSAGE2(_T("%s does not have custom security: %ld"), WinStationName, dwRet);
  315. }
  316. }
  317. LOGMESSAGE0(_T("WinStation list populated.\r\n\r\n"));
  318. return(dwRet == ERROR_SUCCESS);
  319. }
  320. //
  321. // PermPage Class
  322. //
  323. PermPage::PermPage(COCPageData* pPageData) : COCPage(pPageData)
  324. {
  325. // Link window registration is required if we are going to use any
  326. // "Link WIndow" controls in our resources
  327. // if (!LinkWindow_RegisterClass())
  328. // {
  329. // LOGMESSAGE0(_T("ERROR:Failed to Register Link Window class"));
  330. // }
  331. }
  332. BOOL PermPage::CanShow()
  333. {
  334. return(!StateObject.IsUnattended() && StateObject.IsAppServerSelected() && !StateObject.WasItAppServer() && StateObject.IsServer());
  335. }
  336. BOOL PermPage::OnInitDialog(HWND /* hwndDlg */, WPARAM /* wParam */, LPARAM /* lParam */)
  337. {
  338. HICON hIcon;
  339. hIcon = (HICON)LoadImage(
  340. GetInstance(),
  341. MAKEINTRESOURCE(IDI_SMALLWARN),
  342. IMAGE_ICON,
  343. 0,
  344. 0,
  345. 0
  346. );
  347. ASSERT(hIcon != NULL);
  348. SendMessage(
  349. GetDlgItem(m_hDlgWnd, IDC_WARNING_ICON),
  350. STM_SETICON,
  351. (WPARAM)hIcon,
  352. (LPARAM)0
  353. );
  354. return(TRUE);
  355. }
  356. VOID PermPage::OnActivation()
  357. {
  358. ASSERT(CanShow());
  359. CheckRadioButton(
  360. m_hDlgWnd,
  361. IDC_RADIO_WIN2KPERM,
  362. IDC_RADIO_TS4PERM,
  363. StateObject.CurrentPermMode() == PERM_TS4 ? IDC_RADIO_TS4PERM : IDC_RADIO_WIN2KPERM
  364. );
  365. }
  366. BOOL PermPage::ApplyChanges()
  367. {
  368. ASSERT(CanShow());
  369. if (IsDlgButtonChecked(m_hDlgWnd, IDC_RADIO_TS4PERM) == BST_CHECKED)
  370. {
  371. StateObject.SetCurrentPermMode (PERM_TS4);
  372. }
  373. else
  374. {
  375. StateObject.SetCurrentPermMode (PERM_WIN2K);
  376. }
  377. return(TRUE);
  378. }