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.

585 lines
15 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 = 2048;
  7. LPCTSTR GetUninstallKey() {return _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall");}
  8. //
  9. // ModePage Class
  10. //
  11. /*
  12. void AddHyperLinkToStaticCtl(HWND hDialog, DWORD nTextBox)
  13. {
  14. EXTERN_C BOOL WINAPI LinkWindow_RegisterClass() ;
  15. EXTERN_C BOOL WINAPI LinkWindow_UnregisterClass( HINSTANCE ) ;
  16. #define SIZE_OF_BUFFER( x ) sizeof( x ) / sizeof( x[0] )
  17. #define RECTWIDTH( rc ) ((rc).right - (rc).left)
  18. #define RECTHEIGHT( rc ) ((rc).bottom - (rc).top)
  19. RECT rcTextCtrl;
  20. //Read the text that's already in the control.
  21. TCHAR tchBuffer[512];
  22. GetWindowText(GetDlgItem(hDialog, nTextBox), tchBuffer, SIZE_OF_BUFFER(tchBuffer));
  23. //Get the control dimensions
  24. GetWindowRect(GetDlgItem(hDialog, nTextBox) , &rcTextCtrl);
  25. if (!DestroyWindow(GetDlgItem(hDialog, nTextBox)))
  26. LOGMESSAGE0(_T("failed to destroy window"));
  27. //Registration info for the control
  28. MapWindowPoints(NULL, hDialog, (LPPOINT)&rcTextCtrl, 2);
  29. LinkWindow_RegisterClass();
  30. //Now create the window (using the same dimensions as the
  31. //hidden control) that will contain the link
  32. HWND hLW = CreateWindowEx(0,
  33. _T("Link Window"),
  34. _T("") ,
  35. WS_CLIPSIBLINGS | WS_CHILD | WS_VISIBLE,
  36. rcTextCtrl.left,
  37. rcTextCtrl.top,
  38. RECTWIDTH(rcTextCtrl),
  39. RECTHEIGHT(rcTextCtrl),
  40. hDialog,
  41. (HMENU)nTextBox,
  42. NULL,
  43. NULL);
  44. if (!hLW)
  45. LOGMESSAGE2(_T("failed to create link window. %d, lasterror = %d"), hLW, GetLastError());
  46. //Now write it to the link window
  47. SetWindowText(hLW, tchBuffer);
  48. }
  49. */
  50. AppSrvWarningPage::AppSrvWarningPage (COCPageData* pPageData) : COCPage(pPageData)
  51. {
  52. }
  53. BOOL AppSrvWarningPage ::CanShow ()
  54. {
  55. return (!StateObject.IsUnattended() && StateObject.IsAppServerSelected() && !StateObject.WasItAppServer());
  56. }
  57. BOOL AppSrvWarningPage::OnInitDialog (HWND /* hwndDlg */, WPARAM /* wParam */, LPARAM /* lParam */)
  58. {
  59. HICON hIcon;
  60. hIcon = (HICON)LoadImage(
  61. GetInstance(),
  62. MAKEINTRESOURCE(IDI_SMALLWARN),
  63. IMAGE_ICON,
  64. 0,
  65. 0,
  66. 0
  67. );
  68. ASSERT(hIcon != NULL);
  69. SendMessage(
  70. GetDlgItem(m_hDlgWnd, IDC_WARNING_ICON),
  71. STM_SETICON,
  72. (WPARAM)hIcon,
  73. (LPARAM)0
  74. );
  75. TCHAR szWarningString[WARNING_STRING_LENGTH];
  76. UINT uiWarningId = StateObject.IsFreshInstall() ? IDS_STRING_TSINSTALL_CLEAN : IDS_STRING_TSINSTALL_ARP;
  77. if (LoadString( GetInstance(), uiWarningId, szWarningString, WARNING_STRING_LENGTH ))
  78. {
  79. SetDlgItemText(m_hDlgWnd, IDC_WARNING_MSG, szWarningString);
  80. }
  81. return(TRUE);
  82. }
  83. UINT AppSrvWarningPage::GetHeaderTitleResource ()
  84. {
  85. return IDS_STRING_APPSRV_WARN_TITLE;
  86. }
  87. UINT AppSrvWarningPage::GetHeaderSubTitleResource ()
  88. {
  89. return IDS_STRING_APPSRV_WARN_SUBTITLE;
  90. }
  91. AppSrvUninstallpage::AppSrvUninstallpage (COCPageData* pPageData) : COCPage(pPageData)
  92. {
  93. }
  94. BOOL AppSrvUninstallpage ::CanShow ()
  95. {
  96. return ( StateObject.IsStandAlone() && !StateObject.IsUnattended() && !StateObject.IsAppServerSelected() && StateObject.WasItAppServer());
  97. }
  98. BOOL AppSrvUninstallpage::OnInitDialog (HWND /* hwndDlg */, WPARAM /* wParam */, LPARAM /* lParam */)
  99. {
  100. HICON hIcon;
  101. hIcon = (HICON)LoadImage(
  102. GetInstance(),
  103. MAKEINTRESOURCE(IDI_SMALLWARN),
  104. IMAGE_ICON,
  105. 0,
  106. 0,
  107. 0
  108. );
  109. ASSERT(hIcon != NULL);
  110. SendMessage(
  111. GetDlgItem(m_hDlgWnd, IDC_WARNING_ICON),
  112. STM_SETICON,
  113. (WPARAM)hIcon,
  114. (LPARAM)0
  115. );
  116. TCHAR szWarningString[WARNING_STRING_LENGTH];
  117. if (LoadString( GetInstance(), IDS_STRING_TSREMOVE, szWarningString, WARNING_STRING_LENGTH ))
  118. {
  119. SetDlgItemText(m_hDlgWnd, IDC_WARNING_MSG, szWarningString);
  120. }
  121. // AddHyperLinkToStaticCtl(m_hDlgWnd, IDC_WARNING_MSG);
  122. return(TRUE);
  123. }
  124. UINT AppSrvUninstallpage::GetHeaderTitleResource ()
  125. {
  126. return IDS_STRING_APPSRV_UNINSTALL_WARN_TITLE;
  127. }
  128. VOID AppSrvUninstallpage::OnLink (WPARAM wParam)
  129. {
  130. if (wParam == IDC_WARNING_MSG)
  131. {
  132. /*
  133. // To Execute the link in Help&Support Center
  134. ShellExecute(NULL,TEXT("open"),
  135. TEXT("hcp://services/subsite?node=Administration_and_Scripting_Tools/Remote_Administration_Tools/")
  136. TEXT("Remote_Administration_Using_Terminal_Services&topic=MS-ITS:rdesktop.chm::/rdesktopS_setup_s.htm"),NULL,NULL,SW_SHOW);
  137. */
  138. const TCHAR szHelpDir[] = _T("%windir%\\Help");
  139. const TCHAR szHelpCommand[] = _T("MS-ITS:%windir%\\help\\rdesktop.chm::/rdesktopS_overview.htm");
  140. TCHAR szHelpDirEx[MAX_PATH];
  141. if (!ExpandEnvironmentStrings(
  142. szHelpDir,
  143. szHelpDirEx,
  144. sizeof(szHelpDirEx)/sizeof(szHelpDirEx[0])))
  145. {
  146. return;
  147. }
  148. TCHAR szHelpCommandEx[1024];
  149. if (!ExpandEnvironmentStrings(
  150. szHelpCommand,
  151. szHelpCommandEx,
  152. sizeof(szHelpCommandEx)/sizeof(szHelpCommandEx[0])))
  153. {
  154. return;
  155. }
  156. ShellExecute(NULL, TEXT("open"), _T("hh.exe"), szHelpCommandEx, szHelpDirEx, SW_SHOW);
  157. }
  158. }
  159. UINT AppSrvUninstallpage::GetHeaderSubTitleResource ()
  160. {
  161. return IDS_STRING_APPSRV_UNINSTALL_WARN_SUBTITLE;
  162. }
  163. //
  164. // DefSecPageData Class
  165. //
  166. DefSecPageData::DefSecPageData() : COCPageData()
  167. {
  168. m_cArray = 0;
  169. m_pWinStationArray = NULL;
  170. }
  171. DefSecPageData::~DefSecPageData()
  172. {
  173. CleanArray();
  174. }
  175. VOID DefSecPageData::CleanArray()
  176. {
  177. if (m_pWinStationArray != NULL)
  178. {
  179. for (UINT i = 0; i < m_cArray; i++)
  180. {
  181. if (m_pWinStationArray[i] != NULL)
  182. {
  183. LocalFree(m_pWinStationArray[i]);
  184. }
  185. }
  186. LocalFree(m_pWinStationArray);
  187. m_pWinStationArray = NULL;
  188. }
  189. m_cArray = 0;
  190. }
  191. BOOL DefSecPageData::AlocateWinstationsArray (UINT uiWinstationCount)
  192. {
  193. if (m_pWinStationArray != NULL)
  194. {
  195. CleanArray();
  196. }
  197. ASSERT(m_pWinStationArray == NULL);
  198. if (uiWinstationCount > 0)
  199. {
  200. m_pWinStationArray = (LPTSTR*)LocalAlloc(LPTR, uiWinstationCount * sizeof(LPTSTR));
  201. if (NULL == m_pWinStationArray)
  202. {
  203. return FALSE;
  204. }
  205. }
  206. return TRUE;
  207. }
  208. BOOL DefSecPageData::AddWinstation (LPCTSTR pStr)
  209. {
  210. ASSERT(NULL != m_pWinStationArray);
  211. ASSERT(pStr);
  212. LPTSTR pWinStation = (LPTSTR)LocalAlloc(LPTR, (_tcslen(pStr) + 1) * sizeof(TCHAR));
  213. if (pWinStation == NULL)
  214. {
  215. return FALSE;
  216. }
  217. _tcscpy(pWinStation, pStr);
  218. m_pWinStationArray[m_cArray] = pWinStation;
  219. m_cArray++;
  220. return TRUE;
  221. }
  222. //
  223. // DefaultSecurityPage Class
  224. //
  225. DefaultSecurityPage::DefaultSecurityPage(COCPageData* pPageData) : COCPage(pPageData)
  226. {
  227. m_cWinStations = 0;
  228. m_hListView = NULL;
  229. }
  230. BOOL DefaultSecurityPage::CanShow ()
  231. {
  232. return ((m_cWinStations > 0) && StateObject.IsTSEnableSelected() && StateObject.WasItAppServer() != StateObject.IsAppServerSelected() && !StateObject.IsUnattended());
  233. }
  234. BOOL DefaultSecurityPage::OnInitDialog (HWND /* hwndDlg */, WPARAM /* wParam */, LPARAM /* lParam */)
  235. {
  236. LVCOLUMN lvColumn;
  237. RECT rc;
  238. m_hListView = GetDlgItem(m_hDlgWnd, IDC_SECURITY_LISTVIEW);
  239. ListView_SetExtendedListViewStyleEx(m_hListView, LVS_EX_CHECKBOXES, LVS_EX_CHECKBOXES);
  240. GetClientRect(m_hListView , &rc);
  241. lvColumn.mask = LVCF_FMT | LVCF_WIDTH;
  242. lvColumn.fmt = LVCFMT_LEFT;
  243. lvColumn.cx = rc.right - rc.left - GetSystemMetrics(SM_CXHSCROLL) - 2;
  244. ListView_InsertColumn(m_hListView, 0, &lvColumn);
  245. PopulateWinStationList();
  246. return(TRUE);
  247. }
  248. VOID DefaultSecurityPage::OnActivation ()
  249. {
  250. ASSERT(CanShow());
  251. if (StateObject.IsAppServerSelected())
  252. {
  253. ShowWindow(GetDlgItem(m_hDlgWnd, IDC_SECURITY_DEFAULT_1), SW_HIDE);
  254. ShowWindow(GetDlgItem(m_hDlgWnd, IDC_SECURITY_DEFAULT_2), SW_SHOW);
  255. }
  256. else
  257. {
  258. ShowWindow(GetDlgItem(m_hDlgWnd, IDC_SECURITY_DEFAULT_1), SW_SHOW);
  259. ShowWindow(GetDlgItem(m_hDlgWnd, IDC_SECURITY_DEFAULT_2), SW_HIDE);
  260. }
  261. }
  262. VOID DefaultSecurityPage::OnDeactivation ()
  263. {
  264. GetPageData()->CleanArray();
  265. }
  266. BOOL DefaultSecurityPage::ApplyChanges ()
  267. {
  268. //
  269. // If this page has been processed, then the back button on a succeeding page
  270. // is pressed and this page is returned to the screen, empty out the old
  271. // information.
  272. //
  273. ASSERT(CanShow());
  274. if (m_cWinStations != 0)
  275. {
  276. LOGMESSAGE1(_T("%d WinStations to verify."), m_cWinStations);
  277. //
  278. // Allocate an array big enough to hold all items, even if some are not checked.
  279. // If the allocation fails, set the array size to zero, and continue as if there
  280. // is no error.
  281. //
  282. if (!GetPageData()->AlocateWinstationsArray(m_cWinStations))
  283. {
  284. LOGMESSAGE0(_T("Error: Out of Memory creating WinStation list."));
  285. return(TRUE);
  286. }
  287. for (UINT i = 0; i < m_cWinStations; i++)
  288. {
  289. if (ListView_GetCheckState(m_hListView, i))
  290. {
  291. TCHAR pStr[S_SIZE];
  292. LOGMESSAGE1(_T("Item %d checked"), i);
  293. ListView_GetItemText(m_hListView, i, 0, pStr, S_SIZE);
  294. if (!GetPageData()->AddWinstation (pStr))
  295. {
  296. LOGMESSAGE1(_T("Error: Out of Memory creating %s entry."), pStr);
  297. }
  298. }
  299. else
  300. {
  301. LOGMESSAGE1(_T("Item %d unchecked"), i);
  302. }
  303. }
  304. }
  305. else
  306. {
  307. LOGMESSAGE0(_T("No WinStations to verify."));
  308. }
  309. LOGMESSAGE0(_T("Default Security change-list made.\r\n\r\n"));
  310. return(TRUE);
  311. }
  312. UINT DefaultSecurityPage::GetHeaderTitleResource ()
  313. {
  314. return IDS_STRING_SEC_PAGE_HEADER_TITLE;
  315. }
  316. UINT DefaultSecurityPage::GetHeaderSubTitleResource ()
  317. {
  318. return IDS_STRING_SEC_PAGE_HEADER_SUBTITLE;
  319. }
  320. DefSecPageData* DefaultSecurityPage::GetPageData()
  321. {
  322. return(static_cast <DefSecPageData *> (COCPage::GetPageData()));
  323. }
  324. BOOL DefaultSecurityPage::PopulateWinStationList ()
  325. {
  326. DWORD dwRet;
  327. ULONG cbWinStationName, cEntries, iWinStation;
  328. WINSTATIONNAME WinStationName;
  329. cbWinStationName = sizeof(WINSTATIONNAME);
  330. cEntries = 1;
  331. iWinStation = 0;
  332. m_cWinStations = 0;
  333. GetPageData()->CleanArray();
  334. LOGMESSAGE0(_T("Populating WinStation list."));
  335. while ((dwRet = RegWinStationEnumerate(
  336. SERVERNAME_CURRENT,
  337. &iWinStation,
  338. &cEntries,
  339. WinStationName,
  340. &cbWinStationName)) == ERROR_SUCCESS)
  341. {
  342. LVITEM lvItem;
  343. ULONG cbSecDescLen = 0;
  344. //
  345. // Skip the console winstation.
  346. //
  347. if (_tcsicmp(WinStationName, _T("Console")) == 0)
  348. {
  349. LOGMESSAGE0(_T("Skipping Console winstation."));
  350. continue;
  351. }
  352. LOGMESSAGE1(_T("Checking %s for custom security."), WinStationName);
  353. //
  354. // Check for custom security.
  355. //
  356. dwRet = RegWinStationQuerySecurity(
  357. SERVERNAME_CURRENT,
  358. WinStationName,
  359. NULL,
  360. 0,
  361. &cbSecDescLen
  362. );
  363. if (dwRet == ERROR_INSUFFICIENT_BUFFER)
  364. {
  365. //
  366. // Insufficient buffer means the winstation has custom security.
  367. // cbSecDescLen must be greater than zero.
  368. //
  369. ASSERT(cbSecDescLen > 0);
  370. dwRet = ERROR_SUCCESS;
  371. LOGMESSAGE1(_T("%s has custom security."), WinStationName);
  372. //
  373. // The current winstation has custom security. Add it to the list.
  374. //
  375. lvItem.mask = LVIF_TEXT;
  376. lvItem.pszText = WinStationName;
  377. lvItem.iItem = m_cWinStations;
  378. lvItem.iSubItem = 0;
  379. ListView_InsertItem(m_hListView, &lvItem);
  380. ListView_SetCheckState(m_hListView, m_cWinStations, TRUE);
  381. m_cWinStations++;
  382. }
  383. else
  384. {
  385. LOGMESSAGE2(_T("%s does not have custom security: %ld"), WinStationName, dwRet);
  386. }
  387. }
  388. LOGMESSAGE0(_T("WinStation list populated.\r\n\r\n"));
  389. return(dwRet == ERROR_SUCCESS);
  390. }
  391. //
  392. // PermPage Class
  393. //
  394. PermPage::PermPage(COCPageData* pPageData) : COCPage(pPageData)
  395. {
  396. // Link window registration is required if we are going to use any
  397. // "Link WIndow" controls in our resources
  398. // if (!LinkWindow_RegisterClass())
  399. // {
  400. // LOGMESSAGE0(_T("ERROR:Failed to Register Link Window class"));
  401. // }
  402. }
  403. BOOL PermPage::CanShow()
  404. {
  405. return(!StateObject.IsUnattended() && StateObject.IsAppServerSelected() && !StateObject.WasItAppServer() && StateObject.IsServer());
  406. }
  407. BOOL PermPage::OnInitDialog(HWND /* hwndDlg */, WPARAM /* wParam */, LPARAM /* lParam */)
  408. {
  409. HICON hIcon;
  410. hIcon = (HICON)LoadImage(
  411. GetInstance(),
  412. MAKEINTRESOURCE(IDI_SMALLWARN),
  413. IMAGE_ICON,
  414. 0,
  415. 0,
  416. 0
  417. );
  418. ASSERT(hIcon != NULL);
  419. SendMessage(
  420. GetDlgItem(m_hDlgWnd, IDC_WARNING_ICON),
  421. STM_SETICON,
  422. (WPARAM)hIcon,
  423. (LPARAM)0
  424. );
  425. TCHAR szWarningString[WARNING_STRING_LENGTH];
  426. if (LoadString( GetInstance(), IDS_STRING_TS4_PERM, szWarningString, WARNING_STRING_LENGTH ))
  427. {
  428. SetDlgItemText(m_hDlgWnd, IDC_TS4_SECURITY, szWarningString);
  429. }
  430. if (LoadString( GetInstance(), IDS_STRING_FULL_PERM, szWarningString, WARNING_STRING_LENGTH ))
  431. {
  432. SetDlgItemText(m_hDlgWnd, IDC_FULL_SECURITY, szWarningString);
  433. }
  434. return(TRUE);
  435. }
  436. VOID PermPage::OnActivation()
  437. {
  438. ASSERT(CanShow());
  439. CheckRadioButton(
  440. m_hDlgWnd,
  441. IDC_RADIO_WIN2KPERM,
  442. IDC_RADIO_TS4PERM,
  443. StateObject.CurrentPermMode() == PERM_TS4 ? IDC_RADIO_TS4PERM : IDC_RADIO_WIN2KPERM
  444. );
  445. }
  446. BOOL PermPage::ApplyChanges()
  447. {
  448. ASSERT(CanShow());
  449. if (IsDlgButtonChecked(m_hDlgWnd, IDC_RADIO_TS4PERM) == BST_CHECKED)
  450. {
  451. StateObject.SetCurrentPermMode (PERM_TS4);
  452. }
  453. else
  454. {
  455. StateObject.SetCurrentPermMode (PERM_WIN2K);
  456. }
  457. return(TRUE);
  458. }