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.

598 lines
20 KiB

  1. #include "precomp.h"
  2. #include "rsopsec.h"
  3. #include <urlmon.h>
  4. #include <wininet.h>
  5. #ifdef WINNT
  6. #include <winineti.h>
  7. #endif // WINNT
  8. #define REGSTR_PRIVACYPS_PATH TEXT("Software\\Policies\\Microsoft\\Internet Explorer")
  9. #define REGSTR_PRIVACYPS_VALU TEXT("PrivacyAddRemoveSites")
  10. #define ENABLEAPPLY(hDlg) SendMessage( GetParent(hDlg), PSM_CHANGED, (WPARAM)hDlg, 0L )
  11. typedef struct {
  12. DWORD dwType; // what is the type of lParam? is it an unknown passed in with a
  13. // property page addition (0), passed in with a
  14. // DialogBoxParam call (1), or a new IEPROPPAGEINFO2 ptr for RSoP(2)?
  15. LPARAM lParam;
  16. } INETCPL_PPAGE_LPARAM, *LPINETCPL_PPAGE_LPARAM;
  17. // structure to pass info to the control panel
  18. typedef struct {
  19. UINT cbSize; // size of the structure
  20. DWORD dwFlags; // enabled page flags (remove pages)
  21. LPSTR pszCurrentURL; // the current URL (NULL=none)
  22. DWORD dwRestrictMask; // disable sections of the control panel
  23. DWORD dwRestrictFlags; // masking for the above
  24. } IEPROPPAGEINFO, *LPIEPROPPAGEINFO;
  25. // structure to pass info to the control panel
  26. // The RSOP field(s) should eventually be moved to the original
  27. // IEPROPPAGEINFO struct and this structure can be removed
  28. typedef struct {
  29. LPIEPROPPAGEINFO piepi;
  30. BSTR bstrRSOPNamespace;
  31. } IEPROPPAGEINFO2, *LPIEPROPPAGEINFO2;
  32. ///////////////////////////////////////////////////////////////////////////////////////
  33. //
  34. // Advanced privacy settings dialog
  35. //
  36. // We store the advanced settings in the privacy slider struct because it
  37. // can be easily retrieved from the main privacy dlg. Either we need to
  38. // pass RSoP data from the main dlg to the advanced dlg, or we need to query
  39. // WMI twice. Since WMI queries are slow, we'll do the former.
  40. //
  41. ///////////////////////////////////////////////////////////////////////////////////////
  42. typedef struct _privslider {
  43. DWORD_PTR dwLevel;
  44. BOOL fAdvanced;
  45. BOOL fCustom;
  46. HFONT hfontBolded;
  47. BOOL fEditDisabled;
  48. DWORD dwTemplateFirst;
  49. WCHAR szSessionFirst[MAX_PATH];
  50. DWORD dwTemplateThird;
  51. WCHAR szSessionThird[MAX_PATH];
  52. } PRIVSLIDER, *PPRIVSLIDER;
  53. DWORD MapPrefToIndex(WCHAR wcPref)
  54. {
  55. switch(wcPref)
  56. {
  57. case 'r': return 1; // reject
  58. case 'p': return 2; // prompt
  59. default: return 0; // default is accept
  60. }
  61. }
  62. WCHAR MapRadioToPref(HWND hDlg, DWORD dwResource)
  63. {
  64. if(IsDlgButtonChecked(hDlg, dwResource + 1)) // deny
  65. {
  66. return 'r';
  67. }
  68. if(IsDlgButtonChecked(hDlg, dwResource + 2)) // prompt
  69. {
  70. return 'p';
  71. }
  72. // deafult is accept
  73. return 'a';
  74. }
  75. void OnAdvancedInit(HWND hDlg, HWND hwndPrivPage)
  76. {
  77. BOOL fSession = FALSE;
  78. DWORD dwFirst = IDC_FIRST_ACCEPT;
  79. DWORD dwThird = IDC_THIRD_ACCEPT;
  80. PPRIVSLIDER pData = NULL;
  81. // if we're not in RSoP mode, this returns NULL
  82. pData = (PPRIVSLIDER)GetWindowLongPtr(hwndPrivPage, DWLP_USER);
  83. if(NULL != pData && pData->fAdvanced)
  84. {
  85. WCHAR szBuffer[MAX_PATH];
  86. // MAX_PATH is sufficent for advanced mode setting strings, MaxPrivacySettings is overkill.
  87. LPWSTR pszBuffer = szBuffer;
  88. WCHAR *pszAlways;
  89. DWORD dwError = (DWORD)-1L; // anything but ERROR_SUCCESS
  90. //
  91. // turn on advanced check box
  92. //
  93. CheckDlgButton(hDlg, IDC_USE_ADVANCED, TRUE);
  94. //
  95. // Figure out first party setting and session
  96. //
  97. pszBuffer = pData->szSessionFirst;
  98. if (0 != pszBuffer[0])
  99. dwError = ERROR_SUCCESS;
  100. if(ERROR_SUCCESS == dwError)
  101. {
  102. pszAlways = StrStrW(pszBuffer, L"always=");
  103. if(pszAlways)
  104. {
  105. dwFirst = IDC_FIRST_ACCEPT + MapPrefToIndex(*(pszAlways + 7));
  106. }
  107. if(StrStrW(pszBuffer, L"session"))
  108. {
  109. fSession = TRUE;
  110. }
  111. }
  112. //
  113. // Figure out third party setting
  114. //
  115. pszBuffer = pData->szSessionThird;
  116. if (0 != pszBuffer[0])
  117. dwError = ERROR_SUCCESS;
  118. if(ERROR_SUCCESS == dwError)
  119. {
  120. WCHAR *pszAlways;
  121. pszAlways = StrStrW(pszBuffer, L"always=");
  122. if(pszAlways)
  123. {
  124. dwThird = IDC_THIRD_ACCEPT + MapPrefToIndex(*(pszAlways + 7));
  125. }
  126. }
  127. }
  128. CheckRadioButton(hDlg, IDC_FIRST_ACCEPT, IDC_FIRST_PROMPT, dwFirst);
  129. CheckRadioButton(hDlg, IDC_THIRD_ACCEPT, IDC_THIRD_PROMPT, dwThird);
  130. CheckDlgButton( hDlg, IDC_SESSION_OVERRIDE, fSession);
  131. }
  132. void OnAdvancedEnable(HWND hDlg)
  133. {
  134. EnableWindow(GetDlgItem(hDlg, IDC_USE_ADVANCED), FALSE);
  135. EnableWindow(GetDlgItem(hDlg, IDC_FIRST_ACCEPT), FALSE);
  136. EnableWindow(GetDlgItem(hDlg, IDC_FIRST_DENY), FALSE);
  137. EnableWindow(GetDlgItem(hDlg, IDC_FIRST_PROMPT), FALSE);
  138. EnableWindow(GetDlgItem(hDlg, IDC_THIRD_ACCEPT), FALSE);
  139. EnableWindow(GetDlgItem(hDlg, IDC_THIRD_DENY), FALSE);
  140. EnableWindow(GetDlgItem(hDlg, IDC_THIRD_PROMPT), FALSE);
  141. EnableWindow(GetDlgItem(hDlg, IDC_SESSION_OVERRIDE), FALSE);
  142. EnableWindow(GetDlgItem(hDlg, IDC_TX_FIRST), FALSE);
  143. EnableWindow(GetDlgItem(hDlg, IDC_TX_THIRD), FALSE);
  144. EnableWindow(GetDlgItem(hDlg, IDC_PRIVACY_EDIT), FALSE);
  145. }
  146. INT_PTR CALLBACK PrivAdvancedDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam,LPARAM lParam)
  147. {
  148. switch (uMsg)
  149. {
  150. case WM_INITDIALOG:
  151. OnAdvancedInit(hDlg, (HWND)lParam);
  152. OnAdvancedEnable(hDlg);
  153. return TRUE;
  154. case WM_HELP: // F1
  155. // ResWinHelp( (HWND)((LPHELPINFO)lParam)->hItemHandle, IDS_HELPFILE,
  156. // HELP_WM_HELP, (DWORD_PTR)(LPSTR)mapIDCsToIDHs);
  157. break;
  158. case WM_CONTEXTMENU: // right mouse click
  159. // ResWinHelp( (HWND) wParam, IDS_HELPFILE,
  160. // HELP_CONTEXTMENU, (DWORD_PTR)(LPSTR)mapIDCsToIDHs);
  161. break;
  162. case WM_COMMAND:
  163. switch(LOWORD(wParam))
  164. {
  165. case IDOK:
  166. // fall through
  167. case IDCANCEL:
  168. EndDialog(hDlg, IDOK == LOWORD(wParam));
  169. return 0;
  170. case IDC_FIRST_ACCEPT:
  171. case IDC_FIRST_PROMPT:
  172. case IDC_FIRST_DENY:
  173. CheckRadioButton(hDlg, IDC_FIRST_ACCEPT, IDC_FIRST_PROMPT, LOWORD(wParam));
  174. return 0;
  175. case IDC_THIRD_ACCEPT:
  176. case IDC_THIRD_PROMPT:
  177. case IDC_THIRD_DENY:
  178. CheckRadioButton(hDlg, IDC_THIRD_ACCEPT, IDC_THIRD_PROMPT, LOWORD(wParam));
  179. return 0;
  180. case IDC_USE_ADVANCED:
  181. OnAdvancedEnable(hDlg);
  182. return 0;
  183. case IDC_PRIVACY_EDIT:
  184. // DialogBox(MLGetHinst(), MAKEINTRESOURCE(IDD_PRIVACY_PERSITE),
  185. // hDlg, PrivPerSiteDlgProc);
  186. return 0;
  187. }
  188. break;
  189. }
  190. return FALSE;
  191. }
  192. ///////////////////////////////////////////////////////////////////////////////////////
  193. //
  194. // Privacy pane
  195. //
  196. ///////////////////////////////////////////////////////////////////////////////////////
  197. #define PRIVACY_LEVELS 6
  198. #define SLIDER_LEVEL_CUSTOM 6
  199. TCHAR szPrivacyLevel[PRIVACY_LEVELS + 1][30];
  200. TCHAR szPrivacyDescription[PRIVACY_LEVELS + 1][300];
  201. void EnablePrivacyControls(HWND hDlg, BOOL fCustom)
  202. {
  203. WCHAR szBuffer[256];
  204. if( fCustom)
  205. LoadString( g_hInstance, IDS_PRIVACY_SLIDERCOMMANDDEF, szBuffer, ARRAYSIZE( szBuffer));
  206. else
  207. LoadString( g_hInstance, IDS_PRIVACY_SLIDERCOMMANDSLIDE, szBuffer, ARRAYSIZE( szBuffer));
  208. SendMessage(GetDlgItem(hDlg, IDC_PRIVACY_SLIDERCOMMAND), WM_SETTEXT,
  209. 0, (LPARAM)szBuffer);
  210. // slider disabled when custom
  211. EnableWindow(GetDlgItem(hDlg, IDC_LEVEL_SLIDER), !fCustom);
  212. ShowWindow(GetDlgItem(hDlg, IDC_LEVEL_SLIDER), !fCustom);
  213. // disable controls if in read-only mode
  214. EnableWindow(GetDlgItem(hDlg, IDC_LEVEL_SLIDER), FALSE);
  215. EnableWindow(GetDlgItem(hDlg, IDC_PRIVACY_DEFAULT), FALSE);
  216. EnableWindow(GetDlgItem(hDlg, IDC_PRIVACY_IMPORT), FALSE);
  217. EnableWindow(GetDlgItem(hDlg, IDC_PRIVACY_IMPORT), FALSE);
  218. EnableWindow(GetDlgItem(hDlg, IDC_PRIVACY_ADVANCED), fCustom);
  219. if (fCustom)
  220. {
  221. // Give advanced button focus since slider is disabled
  222. SendMessage( hDlg, WM_NEXTDLGCTL,
  223. (WPARAM)GetDlgItem( hDlg, IDC_PRIVACY_ADVANCED),
  224. MAKELPARAM( TRUE, 0));
  225. }
  226. }
  227. /////////////////////////////////////////////////////////////////////
  228. HRESULT OnPrivacyInitRSoP(CDlgRSoPData *pDRD, PPRIVSLIDER pData)
  229. {
  230. HRESULT hr = E_FAIL;
  231. __try
  232. {
  233. pData->fAdvanced = FALSE;
  234. BSTR bstrClass = SysAllocString(L"RSOP_IEPrivacySettings");
  235. BSTR bstrPrecedenceProp = SysAllocString(L"rsopPrecedence");
  236. if (NULL != bstrClass && NULL != bstrPrecedenceProp)
  237. {
  238. WCHAR wszObjPath[128];
  239. DWORD dwCurGPOPrec = pDRD->GetImportedSecZonesPrec();
  240. // create the object path of this privacy instance for this GPO
  241. wnsprintf(wszObjPath, countof(wszObjPath),
  242. L"RSOP_IEPrivacySettings.rsopID=\"IEAK\",rsopPrecedence=%ld", dwCurGPOPrec);
  243. _bstr_t bstrObjPath = wszObjPath;
  244. ComPtr<IWbemClassObject> pPrivObj = NULL;
  245. ComPtr<IWbemServices> pWbemServices = pDRD->GetWbemServices();
  246. hr = pWbemServices->GetObject(bstrObjPath, 0L, NULL, (IWbemClassObject**)&pPrivObj, NULL);
  247. if (SUCCEEDED(hr))
  248. {
  249. BOOL fPrivacyHandled = FALSE; // unused
  250. // useAdvancedSettings field
  251. pData->fAdvanced = GetWMIPropBool(pPrivObj,
  252. L"useAdvancedSettings",
  253. pData->fAdvanced,
  254. fPrivacyHandled);
  255. // firstPartyPrivacyType field
  256. pData->dwTemplateFirst = GetWMIPropUL(pPrivObj,
  257. L"firstPartyPrivacyType",
  258. pData->dwTemplateFirst,
  259. fPrivacyHandled);
  260. // firstPartyPrivacyTypeText field
  261. GetWMIPropPWSTR(pPrivObj, L"firstPartyPrivacyTypeText",
  262. pData->szSessionFirst, ARRAYSIZE(pData->szSessionFirst),
  263. NULL, fPrivacyHandled);
  264. // thirdPartyPrivacyType field
  265. pData->dwTemplateThird = GetWMIPropUL(pPrivObj,
  266. L"thirdPartyPrivacyType",
  267. pData->dwTemplateThird,
  268. fPrivacyHandled);
  269. // thirdPartyPrivacyTypeText field
  270. GetWMIPropPWSTR(pPrivObj, L"thirdPartyPrivacyTypeText",
  271. pData->szSessionThird, ARRAYSIZE(pData->szSessionThird),
  272. NULL, fPrivacyHandled);
  273. }
  274. SysFreeString(bstrClass);
  275. SysFreeString(bstrPrecedenceProp);
  276. }
  277. }
  278. __except(TRUE)
  279. {
  280. }
  281. return hr;
  282. }
  283. /////////////////////////////////////////////////////////////////////
  284. PPRIVSLIDER OnPrivacyInit(HWND hDlg, CDlgRSoPData *pDRD)
  285. {
  286. DWORD i;
  287. PPRIVSLIDER pData;
  288. DWORD dwRet, dwType, dwSize, dwValue;
  289. // allocate storage for the font and current level
  290. pData = new PRIVSLIDER;
  291. if(NULL == pData)
  292. {
  293. // doh
  294. return NULL;
  295. }
  296. pData->dwLevel = (DWORD)-1L;
  297. pData->hfontBolded = NULL;
  298. pData->fAdvanced = FALSE;
  299. pData->fCustom = FALSE;
  300. pData->fEditDisabled = FALSE;
  301. // data stored in slider struct to pass RSoP data to advanced dlg
  302. pData->dwTemplateFirst = PRIVACY_TEMPLATE_CUSTOM;
  303. pData->szSessionFirst[0] = 0;
  304. pData->dwTemplateThird = PRIVACY_TEMPLATE_CUSTOM;
  305. pData->szSessionThird[0] = 0;
  306. //
  307. // Init RSoP variables
  308. //
  309. OnPrivacyInitRSoP(pDRD, pData);
  310. //
  311. // Set the font of the name to the bold font
  312. //
  313. // find current font
  314. HFONT hfontOrig = (HFONT) SendDlgItemMessage(hDlg, IDC_LEVEL, WM_GETFONT, (WPARAM) 0, (LPARAM) 0);
  315. if(hfontOrig == NULL)
  316. hfontOrig = (HFONT) GetStockObject(SYSTEM_FONT);
  317. // build bold font
  318. if(hfontOrig)
  319. {
  320. LOGFONT lfData;
  321. if(GetObject(hfontOrig, sizeof(lfData), &lfData) != 0)
  322. {
  323. // The distance from 400 (normal) to 700 (bold)
  324. lfData.lfWeight += 300;
  325. if(lfData.lfWeight > 1000)
  326. lfData.lfWeight = 1000;
  327. pData->hfontBolded = CreateFontIndirect(&lfData);
  328. if(pData->hfontBolded)
  329. {
  330. // the zone level and zone name text boxes should have the same font, so this is okat
  331. SendDlgItemMessage(hDlg, IDC_LEVEL, WM_SETFONT, (WPARAM) pData->hfontBolded, (LPARAM) MAKELPARAM(FALSE, 0));
  332. }
  333. }
  334. }
  335. // initialize slider
  336. SendDlgItemMessage(hDlg, IDC_LEVEL_SLIDER, TBM_SETRANGE, (WPARAM) (BOOL) FALSE, (LPARAM) MAKELONG(0, PRIVACY_LEVELS - 1));
  337. SendDlgItemMessage(hDlg, IDC_LEVEL_SLIDER, TBM_SETTICFREQ, (WPARAM) 1, (LPARAM) 0);
  338. // initialize strings for levels and descriptions
  339. for(i=0; i<PRIVACY_LEVELS + 1; i++)
  340. {
  341. LoadString(g_hInstance, IDS_PRIVACY_LEVEL_NO_COOKIE + i, szPrivacyLevel[i], ARRAYSIZE(szPrivacyLevel[i]));
  342. LoadString(g_hInstance, IDS_PRIVACY_DESC_NO_COOKIE + i, szPrivacyDescription[i], ARRAYSIZE(szPrivacyDescription[i]));
  343. }
  344. //
  345. // Get current internet privacy level
  346. //
  347. if(pData->dwTemplateFirst == pData->dwTemplateThird &&
  348. pData->dwTemplateFirst != PRIVACY_TEMPLATE_CUSTOM)
  349. {
  350. // matched template values, set slider to template level
  351. pData->dwLevel = pData->dwTemplateFirst;
  352. if(pData->dwTemplateFirst == PRIVACY_TEMPLATE_ADVANCED)
  353. {
  354. pData->fAdvanced = TRUE;
  355. pData->dwLevel = SLIDER_LEVEL_CUSTOM;
  356. }
  357. }
  358. else
  359. {
  360. // make custom end of list
  361. pData->dwLevel = SLIDER_LEVEL_CUSTOM;
  362. pData->fCustom = TRUE;
  363. }
  364. // move slider to right spot
  365. SendDlgItemMessage(hDlg, IDC_LEVEL_SLIDER, TBM_SETPOS, (WPARAM)TRUE, (LPARAM)pData->dwLevel);
  366. // Enable stuff based on mode
  367. EnablePrivacyControls(hDlg, ((pData->fAdvanced) || (pData->fCustom)));
  368. // save off struct
  369. SetWindowLongPtr(hDlg, DWLP_USER, (DWORD_PTR)pData);
  370. dwRet = SHGetValue(HKEY_CURRENT_USER, REGSTR_PRIVACYPS_PATH, REGSTR_PRIVACYPS_VALU, &dwType, &dwValue, &dwSize);
  371. if (ERROR_SUCCESS == dwRet && 1 == dwValue && REG_DWORD == dwType)
  372. {
  373. EnableWindow(GetDlgItem(hDlg, IDC_PRIVACY_EDIT), FALSE);
  374. pData->fEditDisabled = TRUE;
  375. }
  376. return pData;
  377. }
  378. void OnPrivacySlider(HWND hDlg, PPRIVSLIDER pData, CDlgRSoPData *pDRD = NULL)
  379. {
  380. DWORD dwPos;
  381. if(pData->fCustom || pData->fAdvanced)
  382. {
  383. dwPos = SLIDER_LEVEL_CUSTOM;
  384. }
  385. else
  386. {
  387. dwPos = (DWORD)SendDlgItemMessage(hDlg, IDC_LEVEL_SLIDER, TBM_GETPOS, 0, 0);
  388. if(dwPos != pData->dwLevel)
  389. {
  390. ENABLEAPPLY(hDlg);
  391. }
  392. if (NULL == pDRD)
  393. {
  394. EnableWindow(GetDlgItem(hDlg, IDC_PRIVACY_DEFAULT),
  395. (dwPos != PRIVACY_TEMPLATE_MEDIUM) ? TRUE : FALSE);
  396. }
  397. }
  398. if (NULL != pDRD ||
  399. PRIVACY_TEMPLATE_NO_COOKIES == dwPos || PRIVACY_TEMPLATE_LOW == dwPos || pData->fEditDisabled)
  400. {
  401. EnableWindow(GetDlgItem(hDlg, IDC_PRIVACY_EDIT), FALSE);
  402. }
  403. else
  404. {
  405. EnableWindow(GetDlgItem(hDlg, IDC_PRIVACY_EDIT), TRUE);
  406. }
  407. // on Mouse Move, change the level description only
  408. SetDlgItemText(hDlg, IDC_LEVEL_DESCRIPTION, szPrivacyDescription[dwPos]);
  409. SetDlgItemText(hDlg, IDC_LEVEL, szPrivacyLevel[dwPos]);
  410. }
  411. INT_PTR CALLBACK PrivacyDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
  412. {
  413. PPRIVSLIDER pData = (PPRIVSLIDER)GetWindowLongPtr(hDlg, DWLP_USER);
  414. switch (uMsg)
  415. {
  416. case WM_INITDIALOG:
  417. {
  418. // IEAK team needs additional info passed in for RSoP, so they're making
  419. // use of lParam, which doesn't seem to be used as per the comments above
  420. // Retrieve Property Sheet Page info
  421. CDlgRSoPData *pDRD = (CDlgRSoPData*)((LPPROPSHEETPAGE)lParam)->lParam;
  422. // The dlg needs to store the RSoP and other info for later use, particularly
  423. // for the advanced dlg
  424. // On second thought, all the info is stored in the pData variable - never mind.
  425. // HWND hwndPSheet = GetParent(hDlg);
  426. // SetWindowLongPtr(hwndPSheet, GWLP_USERDATA, (LONG_PTR)pDRD);
  427. // initialize slider
  428. pData = OnPrivacyInit(hDlg, pDRD);
  429. if(pData)
  430. OnPrivacySlider(hDlg, pData, pDRD);
  431. return TRUE;
  432. }
  433. case WM_VSCROLL:
  434. // Slider Messages
  435. OnPrivacySlider(hDlg, pData);
  436. return TRUE;
  437. case WM_NOTIFY:
  438. {
  439. NMHDR *lpnm = (NMHDR *) lParam;
  440. ASSERT(lpnm);
  441. switch (lpnm->code)
  442. {
  443. case PSN_QUERYCANCEL:
  444. case PSN_KILLACTIVE:
  445. case PSN_RESET:
  446. return TRUE;
  447. case PSN_APPLY:
  448. break;
  449. }
  450. break;
  451. }
  452. case WM_DESTROY:
  453. {
  454. if(pData)
  455. {
  456. if(pData->hfontBolded)
  457. DeleteObject(pData->hfontBolded);
  458. delete pData;
  459. }
  460. break;
  461. }
  462. case WM_HELP: // F1
  463. // ResWinHelp( (HWND)((LPHELPINFO)lParam)->hItemHandle, IDS_HELPFILE,
  464. // HELP_WM_HELP, (DWORD_PTR)(LPSTR)mapIDCsToIDHs);
  465. break;
  466. case WM_CONTEXTMENU: // right mouse click
  467. // ResWinHelp( (HWND) wParam, IDS_HELPFILE,
  468. // HELP_CONTEXTMENU, (DWORD_PTR)(LPSTR)mapIDCsToIDHs);
  469. break;
  470. case WM_COMMAND:
  471. switch(LOWORD(wParam))
  472. {
  473. case IDC_PRIVACY_DEFAULT:
  474. return 0;
  475. case IDC_PRIVACY_ADVANCED:
  476. {
  477. // show advanced, pass in hDlg as lparam so we can get to this prop page's data
  478. if( DialogBoxParam(g_hInstance, MAKEINTRESOURCE(IDD_PRIVACY_ADVANCED),
  479. hDlg, PrivAdvancedDlgProc, (LPARAM)hDlg))
  480. {
  481. }
  482. return 0;
  483. }
  484. case IDC_PRIVACY_IMPORT:
  485. return 0;
  486. case IDC_PRIVACY_EDIT:
  487. // DialogBox(MLGetHinst(), MAKEINTRESOURCE(IDD_PRIVACY_PERSITE),
  488. // hDlg, PrivPerSiteDlgProc);
  489. return 0;
  490. }
  491. break;
  492. }
  493. return FALSE;
  494. }