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.
 
 
 
 
 
 

959 lines
32 KiB

/******************************************************************************
Copyright (c) 2000 Microsoft Corporation
Module Name:
syscfg.cpp
Abstract:
This file contains SRGetCplPropPage function for System Control Panel.
Revision History:
Seong Kook Khang (SKKhang) 07/19/00
created
******************************************************************************/
#include "stdwin.h"
#include "rstrcore.h"
#include "resource.h"
#include "helpids.h"
#define SRHELPURL L"hcp://services/subsite?node=TopLevelBucket_4/Fixing_a_problem&select=TopLevelBucket_4/Fixing_a_problem/Using_System_Restore_to_undo_changes"
/////////////////////////////////////////////////////////////////////////////
//
// Static Variables
//
/////////////////////////////////////////////////////////////////////////////
WCHAR s_szDrvStatus[5][MAX_STATUS] = { L"---" };
#define SRHELPFILE L"sysrestore.hlp"
static const DWORD MAIN_HELP_MAP[] =
{
IDC_TURN_OFF, IDH_SR_TURN_OFF, // Turn off all drives (check box)
IDC_DRIVE_LIST, IDH_SR_SELECT_VOLUME, // Volume list (list view)
IDC_DRIVE_SETTINGS, IDH_SR_CHANGE_SETTINGS, // Change settings (pushbutton)
0, 0
};
static const DWORD DRIVE_HELP_MAP[] =
{
IDC_TURN_OFF, IDH_SR_TURN_OFF_DRIVE,
IDOK, IDH_SR_CONFIRM_CHANGE, // OK or Apply
IDCANCEL, IDH_SR_CANCEL, // Cancel
0, 0
};
extern CSRClientLoader g_CSRClientLoader;
/////////////////////////////////////////////////////////////////////////////
//
// Helper Functions
//
/////////////////////////////////////////////////////////////////////////////
void
EnableControls( HWND hDlg, int nFirst, int nLast, BOOL fEnable )
{
int i;
for ( i = nFirst; i <= nLast; i++ )
::EnableWindow( ::GetDlgItem( hDlg, i ), fEnable );
}
LPCWSTR
GetDriveStatusText( CRstrDriveInfo *pRDI )
{
if ( pRDI->IsOffline() )
return( s_szDrvStatus[4] );
else if ( pRDI->IsExcluded() )
return( s_szDrvStatus[3] );
else if ( pRDI->IsFrozen() )
return( s_szDrvStatus[2] );
else
return( s_szDrvStatus[1] );
}
void
UpdateDriveStatus( HWND hwndList, CRDIArray *paryDrv )
{
TraceFunctEnter("UpdateDriveStatus");
int i;
WCHAR szStat[256];
LVITEM lvi;
if ( ::UpdateDriveList( *paryDrv ) )
{
for ( i = paryDrv->GetUpperBound(); i >= 0; i-- )
{
::lstrcpy( szStat, ::GetDriveStatusText( paryDrv->GetItem( i ) ) );
lvi.mask = LVIF_TEXT;
lvi.iItem = i;
lvi.iSubItem = 1;
lvi.pszText = szStat;
::SendMessage( hwndList, LVM_SETITEM, 0, (LPARAM)&lvi );
}
}
TraceFunctLeave();
}
void
ApplySettings( CRstrDriveInfo *pRDI )
{
MessageBox(NULL, pRDI->GetMount(), L"SR", MB_OK);
}
/////////////////////////////////////////////////////////////////////////////
//
// Drive Settings Dialog for Multiple Drives
//
/////////////////////////////////////////////////////////////////////////////
BOOL CALLBACK
SRCfgDriveSettingsDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
TraceFunctEnter("SRCfgDriveSettingsDlgProc");
static BOOL s_fDirty = FALSE;
static UINT s_uUsage;
BOOL fRet = FALSE;
CRstrDriveInfo *pRDI;
WCHAR szMsg[MAX_STR+2*MAX_PATH];
WCHAR szDCU[MAX_STR];
HWND hCtrl;
BOOL fCheck;
UINT uPos;
DWORD dwRet;
DWORD dwDSMin;
if ( uMsg == WM_INITDIALOG )
{
::SetWindowLong( hDlg, DWL_USER, lParam );
pRDI = (CRstrDriveInfo*)lParam;
}
else
{
pRDI = (CRstrDriveInfo*)::GetWindowLong( hDlg, DWL_USER );
}
switch ( uMsg )
{
case WM_INITDIALOG :
s_fDirty = FALSE;
// Set Dialog Title
::SRFormatMessage( szMsg, IDS_DRIVEPROP_TITLE, pRDI->GetMount() );
::SetWindowText( hDlg, szMsg );
// Set Dialog Heading
if (lstrlen(pRDI->GetLabel()) != 0)
{
::SRFormatMessage( szMsg, IDS_DRIVE_SUMMARY, pRDI->GetLabel(), pRDI->GetMount(), ::GetDriveStatusText( pRDI ) );
}
else
{
::SRFormatMessage( szMsg, IDS_DRIVE_SUMMARY_NO_LABEL, pRDI->GetMount(), ::GetDriveStatusText( pRDI ) );
}
::SetDlgItemText( hDlg, IDC_DRIVE_SUMMARY, szMsg );
// Read the SR_DEFAULT_DSMIN from the registry
if ( !::SRGetRegDword( HKEY_LOCAL_MACHINE, s_cszSRRegKey, s_cszDSMin, &dwDSMin ) )
dwDSMin = SR_DEFAULT_DSMIN;
if ( pRDI->IsSystem() )
{
// Set Explaination About System Drive Cannot Be Off
if (lstrlen(pRDI->GetLabel()) != 0)
{
::SRFormatMessage( szMsg, IDS_SYSDRV_CANNOT_OFF, pRDI->GetLabel(), pRDI->GetMount() );
}
else
{
::SRFormatMessage( szMsg, IDS_SYSDRV_CANNOT_OFF_NO_LABEL, pRDI->GetMount());
}
::SetDlgItemText( hDlg, IDC_SYSDRV_CANNOT_OFF, szMsg );
//format IDC_SYSTEM_DCU_HOWTO text for the System Drive
if( !::GetDlgItemText( hDlg, IDC_SYSTEM_DCU_HOWTO, szDCU, MAX_STR ) )
ErrorTrace( 0, "GetDlgItemText failed for IDC_SYSTEM_DCU_HOWTO: %s", (LPCSTR)szMsg );
wsprintf( szMsg, szDCU, dwDSMin );
::SetDlgItemText( hDlg, IDC_SYSTEM_DCU_HOWTO, szMsg );
}
else
{
fCheck = pRDI->IsExcluded();
::CheckDlgButton( hDlg, IDC_TURN_OFF, fCheck ? BST_CHECKED : BST_UNCHECKED );
EnableControls( hDlg, IDC_USAGE_GROUPBOX, IDC_USAGE_VALUE, !fCheck );
//format IDC_NORMAL_DCU_HOWTO text for the Normal Drive
if( !::GetDlgItemText( hDlg, IDC_NORMAL_DCU_HOWTO, szDCU, MAX_STR ) )
ErrorTrace( 0, "GetDlgItemText failed for IDC_NORMAL_DCU_HOWTO: %s", (LPCSTR)szMsg );
wsprintf( szMsg, szDCU, dwDSMin );
::SetDlgItemText( hDlg, IDC_NORMAL_DCU_HOWTO, szMsg );
}
hCtrl = ::GetDlgItem( hDlg, IDC_USAGE_SLIDER );
::SendMessage( hCtrl, TBM_SETRANGE, 0, MAKELONG( 0, DSUSAGE_SLIDER_FREQ ) );
//::SendMessage( hCtrl, TBM_SETTICFREQ, 10, 0 );
s_uUsage = pRDI->GetDSUsage();
::SendMessage( hCtrl, TBM_SETPOS, TRUE, s_uUsage );
pRDI->GetUsageText( szMsg );
::SetDlgItemText( hDlg, IDC_USAGE_VALUE, szMsg );
// Check the policy to see if local config is enabled
if ( ::SRGetRegDword( HKEY_LOCAL_MACHINE, s_cszGroupPolicy, s_cszDisableConfig, &dwRet ) )
{
ErrorTrace(0, "Group Policy disables SR configuration...");
EnableControls( hDlg, IDC_USAGE_GROUPBOX, IDC_USAGE_VALUE, FALSE );
::LoadString( g_hInst, IDS_GROUP_POLICY_CONFIG_ON_OFF, szMsg,
sizeof(szMsg)/sizeof(WCHAR) );
::SetDlgItemText( hDlg, IDC_TURN_OFF, szMsg );
EnableWindow( ::GetDlgItem( hDlg, IDC_TURN_OFF ), FALSE );
}
break;
case WM_COMMAND :
switch ( LOWORD(wParam) )
{
case IDC_TURN_OFF :
fCheck = ::IsDlgButtonChecked( hDlg, IDC_TURN_OFF );
EnableControls( hDlg, IDC_USAGE_GROUPBOX, IDC_USAGE_VALUE, !fCheck );
pRDI->SetCfgExcluded( fCheck );
s_fDirty = TRUE;
break;
case IDC_DCU_INVOKE :
if ( HIWORD(wParam) == BN_CLICKED )
{
WCHAR szDrv[4] = L"";
szDrv[0] = (pRDI->GetMount())[0];
szDrv[1] = L'\0';
InvokeDiskCleanup( szDrv );
}
break;
case IDOK :
if ( s_fDirty )
if ( !pRDI->ApplyConfig( hDlg ) )
{
// refresh the on/off button in case the user cancelled
BOOL fCheck = pRDI->IsExcluded();
::CheckDlgButton( hDlg, IDC_TURN_OFF, fCheck ?
BST_CHECKED : BST_UNCHECKED );
}
::EndDialog( hDlg, IDOK );
break;
case IDCANCEL :
::EndDialog( hDlg, IDCANCEL );
break;
}
break;
case WM_HSCROLL :
hCtrl = ::GetDlgItem( hDlg, IDC_USAGE_SLIDER );
uPos = ::SendMessage( hCtrl, TBM_GETPOS, 0, 0 );
if ( uPos != s_uUsage )
{
s_uUsage = uPos;
pRDI->SetCfgDSUsage( uPos );
::SendMessage( hCtrl, TBM_SETPOS, TRUE, uPos );
// Set Usage Text
pRDI->GetUsageText( szMsg );
::SetDlgItemText( hDlg, IDC_USAGE_VALUE, szMsg );
s_fDirty = TRUE;
}
break;
case WM_CONTEXTMENU:
if ( !::WinHelp ( (HWND) wParam,
SRHELPFILE,
HELP_CONTEXTMENU,
(DWORD_PTR) DRIVE_HELP_MAP) )
{
trace (0, "! WinHelp : %ld", GetLastError());
}
break;
case WM_HELP:
if (((LPHELPINFO) lParam)->hItemHandle)
{
if ( !::WinHelp ( (HWND) ((LPHELPINFO) lParam)->hItemHandle,
SRHELPFILE,
HELP_WM_HELP,
(DWORD_PTR) DRIVE_HELP_MAP) )
{
trace (0, "! WinHelp : %ld", GetLastError());
}
}
break;
default:
goto Exit;
}
fRet = TRUE;
Exit:
TraceFunctLeave();
return( fRet );
}
/////////////////////////////////////////////////////////////////////////////
//
// Property Page Proc for Multiple Drives
//
/////////////////////////////////////////////////////////////////////////////
BOOL CALLBACK
SRCfgMultiDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
TraceFunctEnter("SRCfgMultiDlgProc");
BOOL fRet = FALSE;
HWND hCtrl;
LVCOLUMN lvc;
WCHAR szColText[256];
CRDIArray *paryDrv;
CRstrDriveInfo *pRDI;
HIMAGELIST himl;
HICON hIcon;
int i;
int nIdx;
LONG lRet;
LVITEM lvi;
WCHAR szName[2*MAX_PATH];
int nItem;
WCHAR szStat[256];
BOOL fDisable;
DWORD dwRet;
if ( uMsg == WM_INITDIALOG )
{
PROPSHEETPAGE *pPSP;
pPSP = (PROPSHEETPAGE*)lParam;
paryDrv = (CRDIArray*)pPSP->lParam;
::SetWindowLong( hDlg, DWL_USER, (LPARAM)paryDrv );
}
else
{
paryDrv = (CRDIArray*)::GetWindowLong( hDlg, DWL_USER );
}
// if drive info is not available, skip our code.
if ( paryDrv == NULL )
goto Exit;
switch ( uMsg )
{
case WM_INITDIALOG :
hCtrl = ::GetDlgItem( hDlg, IDC_DRIVE_LIST );
// Set full row selection
//::SendMessage( hCtrl, LVM_SETEXTENDEDLISTVIEWSTYLE, LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT );
// Set column headers
lvc.mask = LVCF_TEXT | LVCF_WIDTH;
lvc.cx = 150;
::LoadString( g_hInst, IDS_DRVLIST_COL_NAME, szColText,
sizeof(szColText)/sizeof(WCHAR) );
lvc.pszText = szColText;
::SendMessage( hCtrl, LVM_INSERTCOLUMN, 0, (LPARAM)&lvc );
lvc.mask = LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH;
lvc.cx = 80;
::LoadString( g_hInst, IDS_DRVLIST_COL_STATUS, szColText,
sizeof(szColText)/sizeof(WCHAR) );
lvc.pszText = szColText;
lvc.iSubItem = 1;
::SendMessage( hCtrl, LVM_INSERTCOLUMN, 1, (LPARAM)&lvc );
// Create and set ImageList
himl = ::ImageList_Create( 16, 16, ILC_COLOR | ILC_MASK, paryDrv->GetSize(), 0 );
for ( i = 0; i < paryDrv->GetSize(); i++ )
{
pRDI = paryDrv->GetItem( i );
::ImageList_AddIcon( himl, pRDI->GetIcon( TRUE ) );
::wsprintf( szName, L"%ls (%ls)", pRDI->GetLabel(), pRDI->GetMount() );
::lstrcpy( szStat, ::GetDriveStatusText( pRDI ) );
lvi.mask = LVIF_TEXT | LVIF_IMAGE;
lvi.iItem = i;
lvi.iSubItem = 0;
lvi.pszText = szName;
lvi.iImage = i;
nItem = ::SendMessage( hCtrl, LVM_INSERTITEM, 0, (LPARAM)&lvi );
lvi.mask = LVIF_TEXT;
lvi.iItem = nItem;
lvi.iSubItem = 1;
lvi.pszText = szStat;
::SendMessage( hCtrl, LVM_SETITEM, 0, (LPARAM)&lvi );
}
ListView_SetItemState( hCtrl, 0, LVIS_SELECTED, LVIS_SELECTED );
::SendMessage( hCtrl, LVM_SETIMAGELIST, LVSIL_SMALL, (LPARAM)himl );
::ShowWindow( hCtrl, SW_SHOW );
fDisable = paryDrv->GetItem( 0 )->IsExcluded();
::CheckDlgButton( hDlg, IDC_TURN_OFF, fDisable );
::EnableControls( hDlg, IDC_DRIVE_GROUPBOX, IDC_DRIVE_SETTINGS, !fDisable );
//Group Policy
if ( ::SRGetRegDword( HKEY_LOCAL_MACHINE, s_cszGroupPolicy, s_cszDisableSR, &dwRet ) )
{
::CheckDlgButton( hDlg, IDC_TURN_OFF, dwRet != 0 );
::LoadString( g_hInst, IDS_GROUP_POLICY_ON_OFF, szColText,
sizeof(szColText)/sizeof(WCHAR) );
::SetDlgItemText( hDlg, IDC_TURN_OFF, szColText );
::EnableWindow( ::GetDlgItem( hDlg, IDC_TURN_OFF ), FALSE );
}
// Check the policy to see if local config is enabled
if ( ::SRGetRegDword( HKEY_LOCAL_MACHINE, s_cszGroupPolicy, s_cszDisableConfig, &dwRet ) )
{
ErrorTrace(0, "Group Policy disables SR configuration...");
EnableControls( hDlg, IDC_USAGE_GROUPBOX, IDC_USAGE_VALUE, FALSE );
::LoadString( g_hInst, IDS_GROUP_POLICY_ON_OFF, szColText,
sizeof(szColText)/sizeof(WCHAR) );
::SetDlgItemText( hDlg, IDC_TURN_OFF, szColText );
EnableWindow( ::GetDlgItem( hDlg, IDC_TURN_OFF ), FALSE );
}
break;
case WM_COMMAND :
switch ( LOWORD(wParam ) )
{
case IDC_TURN_OFF :
if ( HIWORD(wParam) == BN_CLICKED )
{
fDisable = ( ::IsDlgButtonChecked( hDlg, IDC_TURN_OFF ) == BST_CHECKED );
//
// if safemode, cannot re-enable
//
if (fDisable == FALSE &&
paryDrv->GetItem(0)->IsExcluded() )
{
if (0 != GetSystemMetrics(SM_CLEANBOOT))
{
ShowSRErrDlg(IDS_ERR_SR_SAFEMODE);
::CheckDlgButton( hDlg, IDC_TURN_OFF, TRUE );
break;
}
}
//::EnableControls( hDlg, IDC_DRIVE_GROUPBOX, IDC_DRIVE_SETTINGS, !fDisable );
paryDrv->GetItem( 0 )->SetCfgExcluded( fDisable );
//::UpdateDriveStatus( ::GetDlgItem( hDlg, IDC_DRIVE_LIST ), paryDrv );
PropSheet_Changed( ::GetParent(hDlg), hDlg );
}
break;
case IDC_DRIVE_SETTINGS :
if ( HIWORD(wParam) == BN_CLICKED )
{
UINT uRet;
UINT uDlgId;
hCtrl = ::GetDlgItem( hDlg, IDC_DRIVE_LIST );
nIdx = ::SendMessage( hCtrl, LVM_GETNEXTITEM, -1, LVNI_SELECTED );
pRDI = paryDrv->GetItem( nIdx );
if ( pRDI->IsFrozen() )
{
if ( pRDI->IsSystem() )
uDlgId = IDD_SYSPROP_SYSTEM_FROZEN;
else
uDlgId = IDD_SYSPROP_NORMAL_FROZEN;
}
else
{
if ( pRDI->IsSystem() )
uDlgId = IDD_SYSPROP_SYSTEM;
else
uDlgId = IDD_SYSPROP_NORMAL;
}
uRet = ::DialogBoxParam( g_hInst,
MAKEINTRESOURCE(uDlgId),
::GetParent( hDlg ),
SRCfgDriveSettingsDlgProc,
(LPARAM)pRDI );
if ( uRet == IDOK )
{
::UpdateDriveStatus( hCtrl, paryDrv );
}
pRDI->SetCfgDSUsage (pRDI->GetDSUsage() );
}
break;
}
break;
case WM_NOTIFY :
switch ( ((LPNMHDR)lParam)->code )
{
case LVN_ITEMCHANGED :
hCtrl = ::GetDlgItem( hDlg, IDC_DRIVE_LIST );
nIdx = ::SendMessage( hCtrl, LVM_GETNEXTITEM, -1, LVNI_SELECTED );
fDisable = ( nIdx < 0 ) ||
paryDrv->GetItem( nIdx )->IsOffline();
::EnableWindow( ::GetDlgItem( hDlg, IDC_DRIVE_SETTINGS ), !fDisable );
break;
case PSN_APPLY :
if ( paryDrv->GetItem( 0 )->ApplyConfig( ::GetParent( hDlg ) ) )
lRet = PSNRET_NOERROR;
else
lRet = PSNRET_INVALID;
fDisable = paryDrv->GetItem( 0 )->IsExcluded();
::UpdateDriveStatus( ::GetDlgItem( hDlg, IDC_DRIVE_LIST ), paryDrv );
::EnableControls( hDlg, IDC_DRIVE_GROUPBOX, IDC_DRIVE_SETTINGS, !fDisable );
// refresh the on/off button in case the user cancelled
::CheckDlgButton( hDlg, IDC_TURN_OFF, fDisable ? BST_CHECKED : BST_UNCHECKED );
::SetWindowLong( hDlg, DWL_MSGRESULT, lRet );
break;
case NM_CLICK:
case NM_RETURN:
if (wParam == IDC_RESTOREHELP_LINK)
{
// launch help
ShellExecuteW(NULL, L"open",
SRHELPURL,
NULL, NULL, SW_SHOW);
}
break;
}
break;
case WM_CONTEXTMENU:
if ( !::WinHelp ( (HWND) wParam,
SRHELPFILE,
HELP_CONTEXTMENU,
(DWORD_PTR) MAIN_HELP_MAP) )
{
trace (0, "! WinHelp : %ld", GetLastError());
}
break;
case WM_HELP:
if (((LPHELPINFO) lParam)->hItemHandle)
{
if ( !::WinHelp ( (HWND) ((LPHELPINFO) lParam)->hItemHandle,
SRHELPFILE,
HELP_WM_HELP,
(DWORD_PTR) MAIN_HELP_MAP) )
{
trace (0, "! WinHelp : %ld", GetLastError());
}
}
break;
case WM_NCDESTROY :
paryDrv->ReleaseAll();
delete paryDrv;
::SetWindowLong( hDlg, DWL_USER, NULL );
break;
default:
goto Exit;
}
fRet = TRUE;
Exit:
TraceFunctLeave();
return( fRet );
}
/////////////////////////////////////////////////////////////////////////////
//
// Property Page Proc for Single Drive
//
/////////////////////////////////////////////////////////////////////////////
BOOL CALLBACK
SRCfgSingleDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
TraceFunctEnter("SRCfgSingleDlgProc");
static UINT s_uUsage;
BOOL fRet = FALSE;
HWND hCtrl;
CRstrDriveInfo *pRDI;
HDC hDC;
PAINTSTRUCT ps;
RECT rcCtrl;
POINT ptIcon;
WCHAR szMsg[MAX_STR+2*MAX_PATH];
WCHAR szDCU[MAX_STR];
BOOL fCheck;
UINT uPos;
LONG lRet;
DWORD dwRet;
DWORD dwDSMin;
if ( uMsg == WM_INITDIALOG )
{
PROPSHEETPAGE *pPSP;
pPSP = (PROPSHEETPAGE*)lParam;
pRDI = (CRstrDriveInfo*)pPSP->lParam;
::SetWindowLong( hDlg, DWL_USER, (LPARAM)pRDI );
}
else
{
pRDI = (CRstrDriveInfo*)::GetWindowLong( hDlg, DWL_USER );
}
// if drive info is not available, skip our code.
if ( pRDI == NULL )
goto Exit;
switch ( uMsg )
{
case WM_INITDIALOG :
// hide DCU if SR is not frozen
if ( !pRDI->IsFrozen() )
{
::ShowWindow( ::GetDlgItem( hDlg, IDC_DCU_HOWTO ), SW_HIDE );
::ShowWindow( ::GetDlgItem( hDlg, IDC_DCU_INVOKE ), SW_HIDE );
}
else // format IDC_DCU_HOWTO if SR is frozen
{
if ( !::SRGetRegDword( HKEY_LOCAL_MACHINE, s_cszSRRegKey, s_cszDSMin, &dwDSMin ) )
dwDSMin = SR_DEFAULT_DSMIN;
if ( !::GetDlgItemText( hDlg, IDC_DCU_HOWTO, szDCU, MAX_STR ) )
ErrorTrace( 0, "GetDlgItemText failed for IDC_DCU_HOWTO: %s", (LPCSTR)szMsg );
wsprintf( szMsg, szDCU, dwDSMin );
::SetDlgItemText( hDlg, IDC_DCU_HOWTO, szMsg );
}
// drive icon
hCtrl = ::GetDlgItem( hDlg, IDC_SD_ICON );
::ShowWindow( hCtrl, SW_HIDE );
// drive status
if (lstrlen(pRDI->GetLabel()) != 0)
{
::SRFormatMessage( szMsg, IDS_DRIVE_SUMMARY, pRDI->GetLabel(), pRDI->GetMount(), ::GetDriveStatusText( pRDI ) );
}
else
{
::SRFormatMessage( szMsg, IDS_DRIVE_SUMMARY_NO_LABEL, pRDI->GetMount(), ::GetDriveStatusText( pRDI ) );
}
::SetDlgItemText( hDlg, IDC_SD_STATUS, szMsg );
hCtrl = ::GetDlgItem( hDlg, IDC_USAGE_SLIDER );
::SendMessage( hCtrl, TBM_SETRANGE, 0, MAKELONG( 0, DSUSAGE_SLIDER_FREQ ) );
//::SendMessage( hCtrl, TBM_SETTICFREQ, 10, 0 );
s_uUsage = pRDI->GetDSUsage();
::SendMessage( hCtrl, TBM_SETPOS, TRUE, s_uUsage );
pRDI->GetUsageText( szMsg );
::SetDlgItemText( hDlg, IDC_USAGE_VALUE, szMsg );
fCheck = pRDI->IsExcluded();
::CheckDlgButton( hDlg, IDC_TURN_OFF, fCheck );
EnableControls( hDlg, IDC_USAGE_GROUPBOX, IDC_USAGE_VALUE, ! fCheck);
//Group Policy
if ( ::SRGetRegDword( HKEY_LOCAL_MACHINE, s_cszGroupPolicy, s_cszDisableSR, &dwRet ))
{
::CheckDlgButton( hDlg, IDC_TURN_OFF, dwRet != 0 );
::LoadString( g_hInst, IDS_GROUP_POLICY_ON_OFF, szMsg,
sizeof(szMsg)/sizeof(WCHAR) );
::SetDlgItemText( hDlg, IDC_TURN_OFF, szMsg );
::EnableWindow( ::GetDlgItem( hDlg, IDC_TURN_OFF ), FALSE );
}
// Check the policy to see if local config is enabled
if ( ::SRGetRegDword( HKEY_LOCAL_MACHINE, s_cszGroupPolicy, s_cszDisableConfig, &dwRet ) )
{
ErrorTrace(0, "Group Policy disables SR configuration...");
EnableControls( hDlg, IDC_USAGE_GROUPBOX, IDC_USAGE_VALUE, FALSE );
::LoadString( g_hInst, IDS_GROUP_POLICY_ON_OFF, szMsg,
sizeof(szMsg)/sizeof(WCHAR) );
::SetDlgItemText( hDlg, IDC_TURN_OFF, szMsg );
EnableWindow( ::GetDlgItem( hDlg, IDC_TURN_OFF ), FALSE );
}
break;
case WM_PAINT :
hDC = ::BeginPaint( hDlg, &ps );
::GetWindowRect( ::GetDlgItem( hDlg, IDC_SD_ICON ), &rcCtrl );
ptIcon.x = rcCtrl.left;
ptIcon.y = rcCtrl.top;
::ScreenToClient( hDlg, &ptIcon );
::DrawIconEx( hDC, ptIcon.x, ptIcon.y, pRDI->GetIcon(TRUE), 0, 0, 0, NULL, DI_NORMAL );
::EndPaint( hDlg, &ps );
case WM_COMMAND :
switch ( LOWORD(wParam ) )
{
case IDC_TURN_OFF :
if ( HIWORD(wParam) == BN_CLICKED )
{
fCheck = ::IsDlgButtonChecked( hDlg, IDC_TURN_OFF );
//
// if safemode, cannot re-enable
//
if (fCheck == FALSE &&
pRDI->IsExcluded())
{
if (0 != GetSystemMetrics(SM_CLEANBOOT))
{
ShowSRErrDlg(IDS_ERR_SR_SAFEMODE);
::CheckDlgButton( hDlg, IDC_TURN_OFF, TRUE );
break;
}
}
EnableControls( hDlg, IDC_USAGE_GROUPBOX, IDC_USAGE_VALUE, !fCheck );
pRDI->SetCfgExcluded( fCheck );
PropSheet_Changed( ::GetParent(hDlg), hDlg );
}
break;
case IDC_DCU_INVOKE :
if ( HIWORD(wParam) == BN_CLICKED )
{
InvokeDiskCleanup( NULL );
}
break;
}
break;
case WM_NOTIFY :
if ( ((LPNMHDR)lParam)->code == PSN_APPLY )
{
if ( pRDI->ApplyConfig( ::GetParent(hDlg) ) )
lRet = PSNRET_NOERROR;
else
lRet = PSNRET_INVALID;
fCheck = pRDI->IsExcluded();
//
// update drive status
//
if (lstrlen(pRDI->GetLabel()) != 0)
{
::SRFormatMessage( szMsg, IDS_DRIVE_SUMMARY, pRDI->GetLabel(), pRDI->GetMount(), ::GetDriveStatusText( pRDI ) );
}
else
{
::SRFormatMessage( szMsg, IDS_DRIVE_SUMMARY_NO_LABEL, pRDI->GetMount(), ::GetDriveStatusText( pRDI ) );
}
::SetDlgItemText( hDlg, IDC_SD_STATUS, szMsg );
::CheckDlgButton( hDlg, IDC_TURN_OFF, fCheck );
EnableControls( hDlg, IDC_USAGE_GROUPBOX, IDC_USAGE_VALUE, ! fCheck);
::SetWindowLong( hDlg, DWL_MSGRESULT, lRet );
}
else if ( ((LPNMHDR)lParam)->code == NM_CLICK ||
((LPNMHDR)lParam)->code == NM_RETURN )
{
if (wParam == IDC_RESTOREHELP_LINK)
{
// launch help
ShellExecuteW(NULL, L"open",
SRHELPURL,
NULL, NULL, SW_SHOW);
}
}
break;
case WM_HSCROLL :
hCtrl = ::GetDlgItem( hDlg, IDC_USAGE_SLIDER );
uPos = ::SendMessage( hCtrl, TBM_GETPOS, 0, 0 );
if ( uPos != s_uUsage )
{
s_uUsage = uPos;
pRDI->SetCfgDSUsage( uPos );
::SendMessage( hCtrl, TBM_SETPOS, TRUE, uPos );
// Set Usage Text
pRDI->GetUsageText( szMsg );
::SetDlgItemText( hDlg, IDC_USAGE_VALUE, szMsg );
PropSheet_Changed( ::GetParent(hDlg), hDlg );
}
break;
case WM_CONTEXTMENU:
if ( !::WinHelp ( (HWND) wParam,
SRHELPFILE,
HELP_CONTEXTMENU,
(DWORD_PTR) MAIN_HELP_MAP) )
{
trace (0, "! WinHelp : %ld", GetLastError());
}
break;
case WM_HELP:
if (((LPHELPINFO) lParam)->hItemHandle)
{
if ( !::WinHelp ( (HWND) ((LPHELPINFO) lParam)->hItemHandle,
SRHELPFILE,
HELP_WM_HELP,
(DWORD_PTR) MAIN_HELP_MAP) )
{
trace (0, "! WinHelp : %ld", GetLastError());
}
}
break;
case WM_NCDESTROY :
pRDI->Release();
::SetWindowLong( hDlg, DWL_USER, NULL );
break;
default:
goto Exit;
}
fRet = TRUE;
Exit:
TraceFunctLeave();
return( fRet );
}
/////////////////////////////////////////////////////////////////////////////
//
// SRGetCplPropPage
//
// This routine creates a property page for System Restore tab of
// System Control Panel.
//
/////////////////////////////////////////////////////////////////////////////
HPROPSHEETPAGE APIENTRY
SRGetCplPropPage()
{
EnsureTrace();
TraceFunctEnter("SRGetCplPropPage");
DWORD dwRet=0;
HPROPSHEETPAGE hPSP = NULL;
LPCWSTR cszErr;
PROPSHEETPAGE psp;
CRDIArray *paryDrv = NULL;
DWORD dwDisable;
// Load SRClient
g_CSRClientLoader.LoadSrClient();
// Check credential
if ( !::CheckPrivilegesForRestore() )
goto Exit;
// Check the policy to see if SR is enabled
if ( ::SRGetRegDword( HKEY_LOCAL_MACHINE, s_cszGroupPolicy, s_cszDisableSR, &dwRet ) )
if ( dwRet != 0 )
{
ErrorTrace(0, "Group Policy disables SR...");
goto Exit;
}
// if the registry says that SR is enabled, make sure we are
// enabled correctly (service is started, startup mode is correct)
// if registry says we are enabled, but service start type is disabled
// disable us now
if (::SRGetRegDword( HKEY_LOCAL_MACHINE,
s_cszSRRegKey,
s_cszDisableSR,
&dwDisable ) )
{
DWORD dwStart;
if (0 == dwDisable)
{
if (ERROR_SUCCESS == GetServiceStartup(s_cszServiceName, &dwStart) &&
(dwStart == SERVICE_DISABLED || dwStart == SERVICE_DEMAND_START))
{
EnableSREx(NULL, TRUE);
DisableSR(NULL);
}
else
{
EnableSR(NULL);
}
}
}
paryDrv = new CRDIArray;
if ( paryDrv == NULL )
{
FatalTrace(0, "Insufficient memory...");
goto Exit;
}
if ( !::CreateDriveList( -1, *paryDrv, TRUE ) )
goto Exit;
if ( paryDrv->GetSize() == 0 )
{
ErrorTrace(0, "Drive List is empty...???");
goto Exit;
}
// Load resource strings for drive status
::LoadString( g_hInst, IDS_DRVSTAT_ACTIVE, s_szDrvStatus[1], MAX_STATUS );
::LoadString( g_hInst, IDS_DRVSTAT_FROZEN, s_szDrvStatus[2], MAX_STATUS );
::LoadString( g_hInst, IDS_DRVSTAT_EXCLUDED, s_szDrvStatus[3], MAX_STATUS );
::LoadString( g_hInst, IDS_DRVSTAT_OFFLINE, s_szDrvStatus[4], MAX_STATUS );
::ZeroMemory( &psp, sizeof(PROPSHEETPAGE) );
psp.dwSize = sizeof(PROPSHEETPAGE);
psp.dwFlags = PSP_DEFAULT;
psp.hInstance = g_hInst;
psp.pszTitle = NULL;
if ( paryDrv->GetSize() > 1 )
{
// property page for multiple drives
psp.lParam = (LPARAM)paryDrv;
psp.pszTemplate = MAKEINTRESOURCE(IDD_SYSPROP_MULTI);
psp.pfnDlgProc = SRCfgMultiDlgProc;
}
else
{
// property page for single drive
psp.lParam = (LPARAM)paryDrv->GetItem( 0 );
psp.pszTemplate = MAKEINTRESOURCE(IDD_SYSPROP_SINGLE);
psp.pfnDlgProc = SRCfgSingleDlgProc;
}
hPSP = ::CreatePropertySheetPage( &psp );
if ( hPSP == NULL )
{
cszErr = ::GetSysErrStr();
ErrorTrace(0, "::CreatePropertySheetPage failed - %ls", cszErr);
goto Exit;
}
Exit:
if ( hPSP == NULL )
SAFE_DELETE(paryDrv);
TraceFunctLeave();
ReleaseTrace();
return( hPSP );
}
// end of file