652 lines
16 KiB
C++
652 lines
16 KiB
C++
/*
|
|
* paranoia - For paranoid people
|
|
*/
|
|
|
|
#include "tweakui.h"
|
|
|
|
/*
|
|
* OLE.
|
|
*/
|
|
#ifndef BEGIN_INTERFACE
|
|
#define BEGIN_INTERFACE
|
|
#define END_INTERFACE
|
|
#endif
|
|
|
|
#include <urlhist.h>
|
|
|
|
#pragma BEGIN_CONST_DATA
|
|
|
|
KL const c_klParanoia = { &g_hkCUSMWCV, c_tszAppletTweakUI, c_tszParanoia };
|
|
KL const c_klAudioPlay = { &c_hkCR, c_tszAudioCDBSShell, 0 };
|
|
KL const c_klNoAutorun =
|
|
{ &g_hkCUSMWCV, c_tszRestrictions, c_tszNoDriveTypeAutoRun };
|
|
KL const c_klFault = { &g_hkLMSMWCV, c_tszFault, c_tszLogFile };
|
|
KL const c_klHistoryDir = { &g_hkLMSMIE, c_tszMain, c_tszHistoryDir };
|
|
|
|
KL const c_klLastUser = { &c_hkLM, c_tszNetLogon, c_tszUserName };
|
|
KL const c_klNukeUser = { &g_hkLMSMWNTCV, c_tszWinlogon, c_tszDontDisplayLast };
|
|
|
|
GUID const CLSID_CUrlHistory = {
|
|
0x3C374A40, 0xBAE4, 0x11CF, 0xBF, 0x7D, 0x00, 0xAA, 0x00, 0x69, 0x46, 0xEE
|
|
};
|
|
|
|
IID const IID_IUrlHistoryStg = {
|
|
0x3C374A41, 0xBAE4, 0x11CF, 0xBF, 0x7D, 0x00, 0xAA, 0x00, 0x69, 0x46, 0xEE
|
|
};
|
|
|
|
const static DWORD CODESEG rgdwHelp[] = {
|
|
IDC_CLEARGROUP, IDH_GROUP,
|
|
IDC_LISTVIEW, IDH_CLEARLV,
|
|
IDC_CLEARNOW, IDH_CLEARNOW,
|
|
IDC_CDROMGROUP, IDH_GROUP,
|
|
IDC_CDROMAUDIO, IDH_CDROMAUDIO,
|
|
IDC_CDROMDATA, IDH_CDROMDATA,
|
|
IDC_FAULTLOG, IDH_FAULTLOG,
|
|
0, 0,
|
|
};
|
|
|
|
#pragma END_CONST_DATA
|
|
|
|
/*
|
|
* Paranoia flags.
|
|
*
|
|
* These must be less than 64K because we overload the lParam of
|
|
* the checklist structure; if it is above 64K, then it's treated
|
|
* as a function.
|
|
*/
|
|
#define pflRun 0x0001
|
|
#define pflFindDocs 0x0002
|
|
#define pflFindComp 0x0004
|
|
#define pflDoc 0x0008
|
|
#define pflUrl 0x0010
|
|
#define pflNetUse 0x0020
|
|
#define pflTelnet 0x0040
|
|
#define pflToDisk 0x7FFF /* The flags that get written to disk */
|
|
#define pflNukeUser 0x8000 /* Never actually written */
|
|
|
|
typedef UINT PFL;
|
|
|
|
typedef PFL (PASCAL *CANCHANGEPROC)(void);
|
|
|
|
/*****************************************************************************
|
|
*
|
|
* Paranoia_IsIEInstalled
|
|
*
|
|
* Returns nonzero if IE3 is installed.
|
|
*
|
|
*****************************************************************************/
|
|
|
|
PFL PASCAL
|
|
Paranoia_IsIEInstalled(void)
|
|
{
|
|
if (g_hkCUSMIE) {
|
|
return pflUrl;
|
|
} else {
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
/*****************************************************************************
|
|
*
|
|
* Paranoia_CanNukeUser
|
|
*
|
|
* Returns nonzero if the user has permission to mess with the
|
|
* network logon key.
|
|
*
|
|
*****************************************************************************/
|
|
|
|
BOOL PASCAL
|
|
Paranoia_CanNukeUser(void)
|
|
{
|
|
if (RegCanModifyKey(g_hkLMSMWNTCV, c_tszWinlogon)) {
|
|
return pflNukeUser;
|
|
} else {
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
/*****************************************************************************
|
|
*
|
|
* Paranoia_GetPfl
|
|
*
|
|
* Extract a PFL bit from a PFL. If the corresponding PFL is not
|
|
* supported, then return -1.
|
|
*
|
|
* lParam is the pfl bit to test (or the CANCHANGE function).
|
|
*
|
|
* pvRef is the pfl value to test.
|
|
*
|
|
*****************************************************************************/
|
|
|
|
BOOL PASCAL
|
|
Paranoia_GetPfl(LPARAM lParam, LPVOID pvRef)
|
|
{
|
|
PFL pfl = PtrToUlong(pvRef);
|
|
PFL pflTest = (PFL)lParam;
|
|
|
|
if (HIWORD(lParam)) {
|
|
CANCHANGEPROC CanChange = (CANCHANGEPROC)lParam;
|
|
pflTest = CanChange();
|
|
}
|
|
|
|
if (pflTest) {
|
|
if (pfl & pflTest) {
|
|
return 1;
|
|
} else {
|
|
return 0;
|
|
}
|
|
} else {
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
/*****************************************************************************
|
|
*
|
|
* Paranoia_SetPfl
|
|
*
|
|
* Set a PFL bit in a PFL.
|
|
*
|
|
* lParam is the pfl bit to test (or the CANCHANGE function).
|
|
*
|
|
* pvRef is the pfl value receive the bit.
|
|
*
|
|
*****************************************************************************/
|
|
|
|
BOOL PASCAL
|
|
Paranoia_SetPfl(BOOL f, LPARAM lParam, LPVOID pvRef)
|
|
{
|
|
PFL *ppfl = (PFL *)pvRef;
|
|
PFL pflTest = (PFL)lParam;
|
|
|
|
if (HIWORD(lParam)) {
|
|
CANCHANGEPROC CanChange = (CANCHANGEPROC)lParam;
|
|
pflTest = CanChange();
|
|
}
|
|
|
|
/*
|
|
* Note that the right thing happens if pflTest == 0
|
|
* (i.e., nothing).
|
|
*/
|
|
if (f) {
|
|
*ppfl |= pflTest;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
#pragma BEGIN_CONST_DATA
|
|
|
|
/*
|
|
* Note that this needs to be in sync with the IDS_PARANOIA
|
|
* strings.
|
|
*/
|
|
CHECKLISTITEM c_rgcliParanoia[] = {
|
|
{ Paranoia_GetPfl, Paranoia_SetPfl, pflRun, },
|
|
{ Paranoia_GetPfl, Paranoia_SetPfl, pflFindDocs, },
|
|
{ Paranoia_GetPfl, Paranoia_SetPfl, pflFindComp, },
|
|
{ Paranoia_GetPfl, Paranoia_SetPfl, pflDoc, },
|
|
{ Paranoia_GetPfl, Paranoia_SetPfl, (LPARAM)Paranoia_IsIEInstalled, },
|
|
{ Paranoia_GetPfl, Paranoia_SetPfl, pflNetUse, },
|
|
{ Paranoia_GetPfl, Paranoia_SetPfl, (LPARAM)Paranoia_CanNukeUser, },
|
|
{ Paranoia_GetPfl, Paranoia_SetPfl, pflTelnet, },
|
|
};
|
|
|
|
#pragma END_CONST_DATA
|
|
|
|
|
|
/*****************************************************************************
|
|
*
|
|
* Paranoia_ClearUrl
|
|
*
|
|
* Clear the IE URL history.
|
|
*
|
|
*****************************************************************************/
|
|
|
|
void PASCAL
|
|
Paranoia_ClearUrl(void)
|
|
{
|
|
IUrlHistoryStg *phst;
|
|
HRESULT hres;
|
|
|
|
RegDeleteKey(g_hkCUSMIE, c_tszTypedURLs);
|
|
|
|
/*
|
|
* Also wipe out the MSN URL history.
|
|
*
|
|
* Note that MSNVIEWER ignores the WM_SETTINGCHANGE message, so
|
|
* there is nothing we can do to tell it "Hey, I dorked your regkeys!"
|
|
*/
|
|
RegDeleteKey(c_hkCU, c_tszMSNTypedURLs);
|
|
|
|
/*
|
|
* Tell the IE address bar that its history has been wiped.
|
|
*
|
|
* Note that this cannot be a SendNotifyMessage since it contains
|
|
* a string.
|
|
*/
|
|
SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)c_tszIETypedURLs);
|
|
|
|
/*
|
|
* We yielded during that broadcast. Put the hourglass back.
|
|
*/
|
|
SetCursor(LoadCursor(0, IDC_WAIT));
|
|
|
|
/*
|
|
* Now wipe the history cache.
|
|
*/
|
|
hres = mit.SHCoCreateInstance(0, &CLSID_CUrlHistory, 0, IID_IUrlHistoryStg,
|
|
(PPV)&phst);
|
|
if (SUCCEEDED(hres)) {
|
|
IEnumSTATURL *peurl;
|
|
hres = phst->EnumUrls(&peurl);
|
|
if (SUCCEEDED(hres)) {
|
|
STATURL su;
|
|
su.cbSize = cbX(su);
|
|
|
|
while (peurl->Next(1, &su, 0) == S_OK) {
|
|
phst->DeleteUrl(su.pwcsUrl, 0);
|
|
Ole_Free(su.pwcsUrl);
|
|
if (su.pwcsTitle) {
|
|
Ole_Free(su.pwcsTitle);
|
|
}
|
|
}
|
|
|
|
Ole_Release(peurl);
|
|
}
|
|
|
|
Ole_Release(phst);
|
|
} else {
|
|
/*
|
|
* Couldn't do it via OLE. Do it by brute force.
|
|
*/
|
|
TCHAR tszPath[MAX_PATH];
|
|
GetStrPkl(tszPath, cbX(tszPath), &c_klHistoryDir);
|
|
if (tszPath[0]) {
|
|
EmptyDirectory(tszPath, 0, 0);
|
|
}
|
|
}
|
|
}
|
|
|
|
/*****************************************************************************
|
|
*
|
|
* Paranoia_ClearTelnet
|
|
*
|
|
* Clear the telnet history.
|
|
*
|
|
*****************************************************************************/
|
|
|
|
LPCTSTR c_rgptszValD[] = {
|
|
c_tszMachineD, /* Machine1 through Machine8 */
|
|
c_tszServiceD, /* Service1 through Service8 */
|
|
c_tszTermTypeD, /* TermType1 through TermType8 */
|
|
};
|
|
|
|
void PASCAL
|
|
Paranoia_ClearTelnet(void)
|
|
{
|
|
HKEY hk;
|
|
|
|
if (_RegOpenKey(HKEY_CURRENT_USER, c_tszTelnet, &hk) == 0) {
|
|
int i;
|
|
for (i = 1; i <= 8; i++) {
|
|
int iptsz;
|
|
for (iptsz = 0; iptsz < cA(c_rgptszValD); iptsz++) {
|
|
TCHAR tszValue[64];
|
|
wsprintf(tszValue, c_rgptszValD[iptsz], i);
|
|
RegDeleteValue(hk, tszValue);
|
|
}
|
|
}
|
|
|
|
/*
|
|
* And then the LastMumble items.
|
|
*/
|
|
RegDeleteValue(hk, c_tszLastMachine);
|
|
RegDeleteValue(hk, c_tszLastService);
|
|
RegDeleteValue(hk, c_tszLastTermType);
|
|
|
|
RegCloseKey(hk);
|
|
}
|
|
}
|
|
|
|
/*****************************************************************************
|
|
*
|
|
* Paranoia_ClearNow
|
|
*
|
|
* Clear the things that the pfl says.
|
|
*
|
|
* The logon goo is kept in a separate registry key, so we pass it
|
|
* separately.
|
|
*
|
|
* The telnet goo is weird, so we do that separately, too.
|
|
*
|
|
*****************************************************************************/
|
|
|
|
void PASCAL
|
|
Paranoia_ClearNow(PFL pfl)
|
|
{
|
|
HCURSOR hcurPrev = GetCursor();
|
|
|
|
SetCursor(LoadCursor(0, IDC_WAIT));
|
|
|
|
if (pfl & pflRun) {
|
|
RegDeleteValues(pcdii->hkCUExplorer, c_tszRunMRU);
|
|
}
|
|
if (pfl & pflFindDocs) {
|
|
RegDeleteValues(pcdii->hkCUExplorer, c_tszFindDocsMRU);
|
|
}
|
|
if (pfl & pflFindComp) {
|
|
RegDeleteValues(pcdii->hkCUExplorer, c_tszFindCompMRU);
|
|
}
|
|
if (pfl & pflDoc) {
|
|
SHAddToRecentDocs(0, 0);
|
|
}
|
|
if (pfl & pflUrl) {
|
|
if (g_hkCUSMIE && g_hkLMSMIE) {
|
|
Paranoia_ClearUrl();
|
|
}
|
|
}
|
|
|
|
if (pfl & pflNetUse) {
|
|
if (g_fNT) {
|
|
RegDeleteValues(hkCU, c_tszNetHistoryNT);
|
|
} else {
|
|
RegDeleteKey(hkCU, c_tszNetHistory95);
|
|
}
|
|
}
|
|
|
|
if (!g_fNT && (pfl & pflNukeUser)) {
|
|
DelPkl(&c_klLastUser);
|
|
}
|
|
|
|
if (pfl & pflTelnet) {
|
|
Paranoia_ClearTelnet();
|
|
}
|
|
|
|
SetCursor(hcurPrev);
|
|
}
|
|
|
|
/*****************************************************************************
|
|
*
|
|
* Paranoia_GetDlgPfl
|
|
*
|
|
* Compute the pfl for the dialog box.
|
|
*
|
|
*****************************************************************************/
|
|
|
|
PFL PASCAL
|
|
Paranoia_GetDlgPfl(HWND hdlg)
|
|
{
|
|
PFL pfl;
|
|
|
|
pfl = 0;
|
|
Checklist_OnApply(hdlg, c_rgcliParanoia, &pfl, TRUE);
|
|
|
|
return pfl;
|
|
}
|
|
|
|
/*****************************************************************************
|
|
*
|
|
* Paranoia_GetRegPfl
|
|
*
|
|
* Compute the pfl from the registry.
|
|
*
|
|
*****************************************************************************/
|
|
|
|
PFL PASCAL
|
|
Paranoia_GetRegPfl(void)
|
|
{
|
|
PFL pfl;
|
|
|
|
pfl = GetIntPkl(0, &c_klParanoia);
|
|
if (GetIntPkl(0, &c_klNukeUser)) {
|
|
pfl |= pflNukeUser;
|
|
}
|
|
return pfl;
|
|
}
|
|
|
|
/*****************************************************************************
|
|
*
|
|
* Paranoia_CoverTracks
|
|
*
|
|
*****************************************************************************/
|
|
|
|
void PASCAL
|
|
Paranoia_CoverTracks(void)
|
|
{
|
|
Paranoia_ClearNow(Paranoia_GetRegPfl());
|
|
}
|
|
|
|
/*****************************************************************************
|
|
*
|
|
* Paranoia_OnWhatsThis
|
|
*
|
|
*****************************************************************************/
|
|
|
|
void PASCAL
|
|
Paranoia_OnWhatsThis(HWND hwnd, int iItem)
|
|
{
|
|
LV_ITEM lvi;
|
|
|
|
Misc_LV_GetItemInfo(hwnd, &lvi, iItem, LVIF_PARAM);
|
|
|
|
WinHelp(hwnd, c_tszMyHelp, HELP_CONTEXTPOPUP,
|
|
IDH_CLEARRUN + lvi.lParam);
|
|
}
|
|
|
|
|
|
/*****************************************************************************
|
|
*
|
|
* Paranoia_OnCommand
|
|
*
|
|
* Ooh, we got a command.
|
|
*
|
|
*****************************************************************************/
|
|
|
|
void PASCAL
|
|
Paranoia_OnCommand(HWND hdlg, int id, UINT codeNotify)
|
|
{
|
|
switch (id) {
|
|
case IDC_CLEARNOW:
|
|
if (codeNotify == BN_CLICKED) {
|
|
PFL pfl = Paranoia_GetDlgPfl(hdlg);
|
|
if (pfl) {
|
|
Paranoia_ClearNow(pfl);
|
|
} else {
|
|
MessageBoxId(hdlg, IDS_NOTHINGTOCLEAR, g_tszName, MB_OK);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case IDC_CDROMAUDIO:
|
|
case IDC_CDROMDATA:
|
|
case IDC_FAULTLOG:
|
|
if (codeNotify == BN_CLICKED) Common_SetDirty(hdlg);
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/*****************************************************************************
|
|
*
|
|
* Paranoia_OnInitDialog
|
|
*
|
|
* Audio CD play is enabled if HKCR\AudioCD\shell = "play".
|
|
*
|
|
* Fault logging is disabled on NT.
|
|
*
|
|
*****************************************************************************/
|
|
|
|
BOOL PASCAL
|
|
Paranoia_OnInitDialog(HWND hwnd)
|
|
{
|
|
PFL pfl;
|
|
HWND hdlg = GetParent(hwnd);
|
|
TCHAR tsz[MAX_PATH];
|
|
|
|
pfl = Paranoia_GetRegPfl();
|
|
Checklist_OnInitDialog(hwnd, c_rgcliParanoia, cA(c_rgcliParanoia),
|
|
IDS_PARANOIA, IntToPtr(pfl));
|
|
|
|
GetStrPkl(tsz, cbX(tsz), &c_klAudioPlay);
|
|
CheckDlgButton(hdlg, IDC_CDROMAUDIO, tsz[0] ? 1 : 0);
|
|
|
|
CheckDlgButton(hdlg, IDC_CDROMDATA,
|
|
(GetDwordPkl(&c_klNoAutorun, 0) & (1 << DRIVE_CDROM)) ? 0 : 1);
|
|
|
|
if (g_fNT) {
|
|
UINT id;
|
|
for (id = IDC_PARANOIA95ONLYMIN; id < IDC_PARANOIA95ONLYMAX; id++) {
|
|
ShowWindow(GetDlgItem(hdlg, id), SW_HIDE);
|
|
}
|
|
} else {
|
|
TCHAR tszPath[MAX_PATH];
|
|
CheckDlgButton(hdlg, IDC_FAULTLOG,
|
|
GetStrPkl(tszPath, cbX(tszPath), &c_klFault));
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
/*****************************************************************************
|
|
*
|
|
* Paranoia_OnApply
|
|
*
|
|
*****************************************************************************/
|
|
|
|
#pragma BEGIN_CONST_DATA
|
|
|
|
TCHAR c_tszFaultLog[] = TEXT("FAULTLOG.TXT");
|
|
|
|
#pragma END_CONST_DATA
|
|
|
|
void PASCAL
|
|
Paranoia_OnApply(HWND hdlg)
|
|
{
|
|
DWORD fl;
|
|
PFL pfl;
|
|
|
|
pfl = Paranoia_GetDlgPfl(hdlg);
|
|
SetIntPkl(pfl & pflToDisk, &c_klParanoia);
|
|
SetIntPkl((pfl & pflNukeUser) != 0, &c_klNukeUser);
|
|
|
|
SetStrPkl(&c_klAudioPlay, IsDlgButtonChecked(hdlg, IDC_CDROMAUDIO)
|
|
? c_tszPlay : c_tszNil);
|
|
|
|
fl = GetDwordPkl(&c_klNoAutorun, 0) & ~(1 << DRIVE_CDROM);
|
|
if (!IsDlgButtonChecked(hdlg, IDC_CDROMDATA)) {
|
|
fl |= (1 << DRIVE_CDROM);
|
|
}
|
|
SetDwordPkl(&c_klNoAutorun, fl);
|
|
|
|
if (!g_fNT) {
|
|
if (IsDlgButtonChecked(hdlg, IDC_FAULTLOG)) {
|
|
TCHAR tszPath[MAX_PATH];
|
|
GetWindowsDirectory(tszPath, cA(tszPath) - cA(c_tszFaultLog));
|
|
lstrcatnBs(tszPath, c_tszFaultLog, cA(tszPath));
|
|
SetStrPkl(&c_klFault, tszPath);
|
|
} else {
|
|
DelPkl(&c_klFault);
|
|
}
|
|
}
|
|
}
|
|
|
|
#if 0
|
|
/*****************************************************************************
|
|
*
|
|
* Paranoia_OnNotify
|
|
*
|
|
* Ooh, we got a notification.
|
|
*
|
|
*****************************************************************************/
|
|
|
|
BOOL PASCAL
|
|
Paranoia_OnNotify(HWND hdlg, NMHDR FAR *pnm)
|
|
{
|
|
switch (pnm->code) {
|
|
case PSN_APPLY:
|
|
Paranoia_Apply(hdlg);
|
|
break;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
/*****************************************************************************
|
|
*
|
|
* Our window procedure.
|
|
*
|
|
*****************************************************************************/
|
|
|
|
/*
|
|
* The HANDLE_WM_* macros weren't designed to be used from a dialog
|
|
* proc, so we need to handle the messages manually. (But carefully.)
|
|
*/
|
|
|
|
BOOL EXPORT
|
|
Paranoia_DlgProc(HWND hdlg, UINT wm, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
switch (wm) {
|
|
|
|
case WM_INITDIALOG: return Paranoia_OnInitDialog(hdlg);
|
|
|
|
case WM_COMMAND:
|
|
Paranoia_OnCommand(hdlg,
|
|
(int)GET_WM_COMMAND_ID(wParam, lParam),
|
|
(UINT)GET_WM_COMMAND_CMD(wParam, lParam));
|
|
return 0;
|
|
|
|
case WM_NOTIFY:
|
|
return Paranoia_OnNotify(hdlg, (NMHDR FAR *)lParam);
|
|
|
|
case WM_HELP: Common_OnHelp(lParam, &rgdwHelp[0]); break;
|
|
|
|
case WM_CONTEXTMENU: Common_OnContextMenu(wParam, &rgdwHelp[0]); break;
|
|
|
|
default: return 0; /* Unhandled */
|
|
}
|
|
return 1; /* Handled */
|
|
}
|
|
#endif
|
|
|
|
/*****************************************************************************
|
|
*
|
|
* Oh yeah, we need this too.
|
|
*
|
|
*****************************************************************************/
|
|
|
|
#pragma BEGIN_CONST_DATA
|
|
|
|
LVCI lvciParanoia[] = {
|
|
{ IDC_WHATSTHIS, Paranoia_OnWhatsThis },
|
|
{ 0, 0 },
|
|
};
|
|
|
|
LVV lvvParanoia = {
|
|
Paranoia_OnCommand,
|
|
0, /* Paranoia_OnInitContextMenu */
|
|
0, /* Paranoia_Dirtify */
|
|
0, /* Paranoia_GetIcon */
|
|
Paranoia_OnInitDialog,
|
|
Paranoia_OnApply,
|
|
0, /* Paranoia_OnDestroy */
|
|
0, /* Paranoia_OnSelChange */
|
|
5, /* iMenu */
|
|
rgdwHelp,
|
|
0, /* Double-click action */
|
|
lvvflCanCheck, /* We need check boxes */
|
|
lvciParanoia,
|
|
};
|
|
|
|
#pragma END_CONST_DATA
|
|
|
|
/*****************************************************************************
|
|
*
|
|
* Our window procedure.
|
|
*
|
|
*****************************************************************************/
|
|
|
|
INT_PTR EXPORT
|
|
Paranoia_DlgProc(HWND hdlg, UINT wm, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
return LV_DlgProc(&lvvParanoia, hdlg, wm, wParam, lParam);
|
|
}
|