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.
1101 lines
28 KiB
1101 lines
28 KiB
// Copyright (c) 1999 Microsoft Corporation
|
|
|
|
#include "precomp.h"
|
|
#include "BackupPage.h"
|
|
#include <chstring1.h>
|
|
#include <util.h>
|
|
#include "resource.h"
|
|
#include "wbemerror.h"
|
|
#include <process.h>
|
|
#include "WMIHelp.h"
|
|
#include "ShlWapi.h"
|
|
#include <cominit.h>
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
|
|
#define REC_WILDCARD _T("*.rec")
|
|
#define ALL_WILDCARD _T("*.*")
|
|
|
|
const static DWORD buPageHelpIDs[] = { // Context Help IDs
|
|
IDC_BACKUP_ENABLED, IDH_WMI_CTRL_BACKUP_AUTOMATIC_CHECKBOX,
|
|
IDC_BACKUPINTERVAL, IDH_WMI_CTRL_BACKUP_TIME,
|
|
IDC_BACKUP_UNITS, IDH_WMI_CTRL_BACKUP_MINUTES_HOURS,
|
|
IDC_LASTBACKUP_LABEL, IDH_WMI_CTRL_BACKUP_LAST,
|
|
IDC_LASTBACKUP, IDH_WMI_CTRL_BACKUP_LAST,
|
|
IDC_RESTORE_FM_AUTO, IDH_WMI_CTRL_BACKUP_RESTORE_AUTO,
|
|
IDC_BACKUP_BTN, IDH_WMI_CTRL_BACKUP_BACKUP_MANUAL,
|
|
IDC_RESTORE_BTN, IDH_WMI_CTRL_BACKUP_RESTORE_MANUAL,
|
|
IDC_DBDIRECTORY_LABEL, IDH_WMI_CTRL_ADVANCED_REPOSITORY_LOC,
|
|
IDC_DB_DIR, IDH_WMI_CTRL_ADVANCED_REPOSITORY_LOC,
|
|
IDC_ADV_NOW_TEXT, -1,
|
|
IDC_ADV_NOW_TEXT2, -1,
|
|
65535, -1,
|
|
0, 0
|
|
};
|
|
|
|
const double WIN2K_CORE_VERSION = 1085.0005; //Win2K Core Version
|
|
|
|
|
|
CBackupPage::CBackupPage(DataSource *ds, bool htmlSupport):
|
|
CUIHelpers(ds, &(ds->m_rootThread), htmlSupport),
|
|
m_AVIbox(NULL),
|
|
m_wszArgs(NULL),
|
|
m_cred(NULL),
|
|
m_bWhistlerCore(false),
|
|
m_hAccessToken(NULL),
|
|
m_fClearToken(false),
|
|
m_cloak(false)
|
|
{
|
|
memset(&m_luid,0,sizeof(LUID));
|
|
}
|
|
|
|
CBackupPage::~CBackupPage(void)
|
|
{
|
|
}
|
|
|
|
//-------------------------------------------------------------------------
|
|
void CBackupPage::InitDlg(HWND hDlg)
|
|
{
|
|
m_hDlg = hDlg;
|
|
|
|
::SendMessage(GetDlgItem(hDlg, IDC_BACKUPINTERVAL),
|
|
EM_LIMITTEXT, 3, 0);
|
|
|
|
HWND hWnd = GetDlgItem(hDlg, IDC_BACKUP_UNITS);
|
|
if(hWnd)
|
|
{
|
|
CHString1 str;
|
|
str.LoadString(IDS_MINUTES);
|
|
ComboBox_AddString(hWnd, str);
|
|
|
|
str.LoadString(IDS_HOURS);
|
|
ComboBox_AddString(hWnd, str);
|
|
}
|
|
|
|
|
|
if(m_DS)
|
|
{
|
|
USES_CONVERSION;
|
|
CHString1 strVersion = _T("0.0");
|
|
m_DS->GetBldNbr(strVersion);
|
|
double ver = _tstof(strVersion);
|
|
if(ver > WIN2K_CORE_VERSION)
|
|
{
|
|
HideAutomaticBackupControls(hDlg);
|
|
}
|
|
}
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
// NOTE: This must match to order of the combobox.
|
|
#define UNIT_MINUTE 0
|
|
#define UNIT_HOUR 1
|
|
#define UNIT_DAY 2
|
|
|
|
#define MINS_IN_HOUR 60
|
|
#define MINS_IN_DAY 1440
|
|
#define DISABLE_BACKUP -1
|
|
|
|
void CBackupPage::SetInterval(HWND hDlg, UINT minutes)
|
|
{
|
|
int m_CBIdx = UNIT_MINUTE;
|
|
UINT value = minutes;
|
|
|
|
if((minutes % MINS_IN_HOUR) == 0)
|
|
{
|
|
m_CBIdx = UNIT_HOUR;
|
|
value = minutes / MINS_IN_HOUR;
|
|
}
|
|
else if((minutes % MINS_IN_DAY) == 0)
|
|
{
|
|
m_CBIdx = UNIT_DAY;
|
|
value = minutes / MINS_IN_DAY;
|
|
}
|
|
|
|
CHString1 temp;
|
|
temp.Format(_T("%d"), value);
|
|
SetWindowText(GetDlgItem(hDlg, IDC_BACKUPINTERVAL), temp);
|
|
ComboBox_SetCurSel(GetDlgItem(hDlg, IDC_BACKUP_UNITS), m_CBIdx);
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
bool CBackupPage::GetInterval(HWND hDlg, UINT &iValue, bool &valid)
|
|
{
|
|
int idx = ComboBox_GetCurSel(GetDlgItem(hDlg, IDC_BACKUP_UNITS));
|
|
TCHAR value[4] = {0};
|
|
valid = false;
|
|
iValue = 0;
|
|
::GetWindowText(GetDlgItem(hDlg, IDC_BACKUPINTERVAL), value, 4);
|
|
iValue = _ttoi(value);
|
|
|
|
// scale to minutes based on the combo box.
|
|
switch(idx)
|
|
{
|
|
case UNIT_HOUR:
|
|
iValue *= MINS_IN_HOUR;
|
|
break;
|
|
case UNIT_DAY:
|
|
iValue *= MINS_IN_DAY;
|
|
break;
|
|
}
|
|
|
|
if((iValue == 0) ||
|
|
((iValue >= 5) && (iValue <= 1440)))
|
|
{
|
|
valid = true;
|
|
}
|
|
else
|
|
{
|
|
CHString1 caption, threat;
|
|
caption.LoadString(IDS_SHORT_NAME);
|
|
threat.LoadString(IDS_BAD_INTERVAL);
|
|
|
|
MessageBox(hDlg, (LPCTSTR)threat, (LPCTSTR)caption,
|
|
MB_OK|MB_ICONEXCLAMATION);
|
|
|
|
}
|
|
|
|
return (m_CBIdx != idx);
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
void CBackupPage::Refresh(HWND hDlg, bool force)
|
|
{
|
|
if(force ||
|
|
(m_DS && m_DS->IsNewConnection(&m_sessionID)))
|
|
{
|
|
CHString1 temp;
|
|
UINT iTemp = 0;
|
|
CHString1 szNotRemoteable, szUnavailable;
|
|
HRESULT hr = S_OK;
|
|
BOOL enable = TRUE;
|
|
|
|
szNotRemoteable.LoadString(IDS_NOT_REMOTEABLE);
|
|
szUnavailable.LoadString(IDS_UNAVAILABLE);
|
|
|
|
PageChanged(PB_BACKUP, false);
|
|
|
|
// - - - - - - - - - - - - - -
|
|
// Interval:
|
|
iTemp = 0;
|
|
hr = m_DS->GetBackupInterval(iTemp);
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
if(iTemp == 0)
|
|
{
|
|
Button_SetCheck(GetDlgItem(hDlg, IDC_BACKUP_ENABLED), BST_UNCHECKED);
|
|
SetWindowText(GetDlgItem(hDlg, IDC_BACKUPINTERVAL), _T("0"));
|
|
ComboBox_SetCurSel(GetDlgItem(hDlg, IDC_BACKUP_UNITS), -1);
|
|
enable = FALSE;
|
|
}
|
|
else
|
|
{
|
|
Button_SetCheck(GetDlgItem(hDlg, IDC_BACKUP_ENABLED), BST_CHECKED);
|
|
SetInterval(hDlg, iTemp);
|
|
enable = TRUE;
|
|
}
|
|
}
|
|
else //failed
|
|
{
|
|
enable = FALSE;
|
|
SetWindowText(GetDlgItem(hDlg, IDC_BACKUPINTERVAL),
|
|
szUnavailable);
|
|
::EnableWindow(GetDlgItem(hDlg, IDC_BACKUP_ENABLED), enable);
|
|
}
|
|
|
|
::EnableWindow(GetDlgItem(hDlg, IDC_BACKUPINTERVAL), enable);
|
|
::EnableWindow(GetDlgItem(hDlg, IDC_BACKUP_UNITS), enable);
|
|
|
|
// - - - - - - - - - - - - - -
|
|
// DB dir:
|
|
HWND hWnd = GetDlgItem(hDlg, IDC_DB_DIR);
|
|
if(hWnd)
|
|
{
|
|
CHString1 dir;
|
|
hr = m_DS->GetDBLocation(dir);
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
enable = TRUE;
|
|
TCHAR shortPath[40] = {0};
|
|
PathCompactPathEx(shortPath, dir, 35,0);
|
|
Edit_SetText(hWnd, (LPCTSTR)shortPath);
|
|
}
|
|
else
|
|
{
|
|
enable = FALSE;
|
|
SetWindowText(hWnd,szUnavailable);
|
|
}
|
|
|
|
::EnableWindow(hWnd, enable);
|
|
::EnableWindow (GetDlgItem(hDlg, IDC_DBDIRECTORY_LABEL), enable);
|
|
|
|
}
|
|
|
|
// - - - - - - - - - - - - - -
|
|
// Last backup:
|
|
temp.Empty();
|
|
|
|
hr = m_DS->GetLastBackup(temp);
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
enable = (hr != WBEM_S_FALSE);
|
|
SetWindowText(GetDlgItem(hDlg, IDC_LASTBACKUP),
|
|
temp);
|
|
}
|
|
else //failed
|
|
{
|
|
enable = FALSE;
|
|
SetWindowText(GetDlgItem(hDlg, IDC_LASTBACKUP),
|
|
szUnavailable);
|
|
}
|
|
::EnableWindow(GetDlgItem(hDlg, IDC_LASTBACKUP_LABEL), enable);
|
|
::EnableWindow(GetDlgItem(hDlg, IDC_LASTBACKUP), enable);
|
|
}
|
|
}
|
|
|
|
//------------------------------------------------------------------------
|
|
void CBackupPage::OnApply(HWND hDlg, bool bClose)
|
|
{
|
|
if(m_bWhistlerCore == false)
|
|
{
|
|
HWND intervalHWND = GetDlgItem(hDlg, IDC_BACKUPINTERVAL);
|
|
bool needToPut = false;
|
|
UINT iValue = 0;
|
|
bool valid = false;
|
|
|
|
bool changed = GetInterval(hDlg, iValue, valid);
|
|
|
|
if((changed || Edit_GetModify(intervalHWND)) && valid)
|
|
{
|
|
m_DS->SetBackupInterval(iValue);
|
|
needToPut = true;
|
|
}
|
|
|
|
if(needToPut)
|
|
{
|
|
NeedToPut(PB_BACKUP, !bClose);
|
|
if(!bClose)
|
|
Refresh(hDlg);
|
|
}
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------
|
|
void CBackupPage::Reconnect(void)
|
|
{
|
|
HRESULT hr = 0;
|
|
|
|
LOGIN_CREDENTIALS *credentials = m_DS->GetCredentials();
|
|
|
|
m_DS->Disconnect();
|
|
|
|
hr = m_DS->Connect(credentials);
|
|
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
m_alreadyAsked = false;
|
|
|
|
if(ServiceIsReady(NO_UI, 0,0))
|
|
{
|
|
m_DS->Initialize(0);
|
|
}
|
|
else
|
|
{
|
|
TCHAR caption[100] = {0}, msg[256] = {0};
|
|
|
|
::LoadString(_Module.GetModuleInstance(), IDS_SHORT_NAME,
|
|
caption, 100);
|
|
|
|
::LoadString(_Module.GetModuleInstance(), IDS_CONNECTING,
|
|
msg, 256);
|
|
|
|
if(DisplayAVIBox(m_hDlg, caption, msg, &m_AVIbox) == IDCANCEL)
|
|
{
|
|
g_serviceThread->Cancel();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------
|
|
void CBackupPage::Reconnect2(void)
|
|
{
|
|
m_DS->Disconnect();
|
|
|
|
TCHAR caption[100] = {0}, msg[256] = {0};
|
|
|
|
::LoadString(_Module.GetModuleInstance(), IDS_SHORT_NAME,
|
|
caption, 100);
|
|
|
|
::LoadString(_Module.GetModuleInstance(), IDS_POST_RESTORE,
|
|
msg, 256);
|
|
|
|
MessageBox(m_hDlg, (LPCTSTR)msg, (LPCTSTR)caption,
|
|
MB_OK|MB_DEFBUTTON1|MB_ICONEXCLAMATION);
|
|
|
|
PropSheet_SetCurSel(GetParent(m_hDlg), 0, 0);
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
void CBackupPage::OnFinishConnected(HWND hDlg, LPARAM lParam)
|
|
{
|
|
if(m_AVIbox)
|
|
{
|
|
PostMessage(m_AVIbox,
|
|
WM_ASYNC_CIMOM_CONNECTED,
|
|
0, 0);
|
|
m_AVIbox = 0;
|
|
}
|
|
|
|
IStream *pStream = (IStream *)lParam;
|
|
IWbemServices *pServices = 0;
|
|
HRESULT hr = CoGetInterfaceAndReleaseStream(pStream,
|
|
IID_IWbemServices,
|
|
(void**)&pServices);
|
|
SetWbemService(pServices);
|
|
|
|
if(ServiceIsReady(NO_UI, 0,0))
|
|
{
|
|
m_DS->Initialize(pServices);
|
|
}
|
|
|
|
}
|
|
|
|
//---------------------------------------------------------------
|
|
void CBackupPage::SetPriv(LPCTSTR privName, IWbemBackupRestore *br)
|
|
{
|
|
if (ImpersonateSelf(SecurityImpersonation))
|
|
{
|
|
if(OpenThreadToken( GetCurrentThread(),
|
|
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
|
|
FALSE, &m_hAccessToken ) )
|
|
{
|
|
m_fClearToken = true;
|
|
|
|
// Now, get the LUID for the privilege from the local system
|
|
ZeroMemory(&m_luid, sizeof(m_luid));
|
|
|
|
LookupPrivilegeValue(NULL, privName, &m_luid);
|
|
// m_cloak = true;
|
|
EnablePriv(true, br);
|
|
}
|
|
else
|
|
{
|
|
DWORD err = GetLastError();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
DWORD err = GetLastError();
|
|
}
|
|
}
|
|
|
|
//---------------------------------------------------------------------
|
|
bool CBackupPage::IsClientNT5OrMore(void)
|
|
{
|
|
OSVERSIONINFO os;
|
|
os.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
|
|
if(!GetVersionEx(&os))
|
|
return FALSE; // should never happen
|
|
return ( os.dwPlatformId == VER_PLATFORM_WIN32_NT ) && ( os.dwMajorVersion >= 5 ) ;
|
|
}
|
|
|
|
|
|
//---------------------------------------------------------------
|
|
DWORD CBackupPage::EnablePriv(bool fEnable, IWbemBackupRestore *br)
|
|
{
|
|
DWORD dwError = ERROR_SUCCESS;
|
|
TOKEN_PRIVILEGES tokenPrivileges;
|
|
|
|
tokenPrivileges.PrivilegeCount = 1;
|
|
tokenPrivileges.Privileges[0].Luid = m_luid;
|
|
tokenPrivileges.Privileges[0].Attributes = ( fEnable ? SE_PRIVILEGE_ENABLED : 0 );
|
|
|
|
if(AdjustTokenPrivileges(m_hAccessToken,
|
|
FALSE,
|
|
&tokenPrivileges,
|
|
0, NULL, NULL) != 0)
|
|
{
|
|
HRESULT hr = E_FAIL;
|
|
if(br)
|
|
{
|
|
//Privileges for backup/restore are only set for the local box
|
|
//case, so in this case we need to set cloaking on the
|
|
//interface for the privileges to be transfered with the call.
|
|
//Make sure this is never called remotely, since in that case
|
|
//the authident needs to be used and privileges are transferred
|
|
//remotely so cloaking is NOT needed for remote (and if set
|
|
//will null the user authident out !!)
|
|
try
|
|
{
|
|
|
|
hr = SetInterfaceSecurityEx(
|
|
br,
|
|
m_cred->authIdent, //for local this is actually not relevant...
|
|
NULL,
|
|
RPC_C_AUTHN_LEVEL_DEFAULT,
|
|
RPC_C_IMP_LEVEL_IMPERSONATE,
|
|
IsClientNT5OrMore() ? EOAC_DYNAMIC_CLOAKING :
|
|
EOAC_NONE);
|
|
|
|
}
|
|
catch( ... )
|
|
{
|
|
hr = E_FAIL;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
dwError = ::GetLastError();
|
|
}
|
|
|
|
return dwError;
|
|
}
|
|
|
|
//---------------------------------------------------------------
|
|
void CBackupPage::ClearPriv(void)
|
|
{
|
|
// m_cloak = true;
|
|
EnablePriv(false);
|
|
|
|
if(m_fClearToken)
|
|
{
|
|
CloseHandle(m_hAccessToken);
|
|
m_hAccessToken = 0;
|
|
m_fClearToken = false;
|
|
}
|
|
|
|
RevertToSelf(); //to make sure token is removed from thread (counterpart to ImpersonateSelf() in SetPriv())
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------
|
|
void __cdecl BackupRestoreThread(LPVOID lpParameter)
|
|
{
|
|
CBackupPage *me = (CBackupPage *)lpParameter;
|
|
|
|
MULTI_QI qi = {&IID_IWbemBackupRestore, 0, 0};
|
|
|
|
CoInitialize(0);
|
|
|
|
if(me->m_DS->IsLocal())
|
|
{
|
|
me->m_backupHr = CoCreateInstanceEx(CLSID_WbemBackupRestore, 0,
|
|
CLSCTX_LOCAL_SERVER, 0, 1, &qi);
|
|
}
|
|
else
|
|
{
|
|
COSERVERINFO server = {0,0,0,0};
|
|
WCHAR machine[MAXCOMPUTER_NAME + 1] = {0};
|
|
|
|
#ifdef UNICODE
|
|
wcscpy(machine, me->m_DS->m_whackedMachineName);
|
|
#else
|
|
mbstowcs(machine,
|
|
(LPCTSTR)me->m_DS->m_whackedMachineName,
|
|
_tcslen(me->m_DS->m_whackedMachineName) + 1);
|
|
#endif
|
|
|
|
server.pwszName = machine;
|
|
|
|
COAUTHINFO authInfo = {10,0, 0, RPC_C_AUTHN_LEVEL_DEFAULT,
|
|
RPC_C_IMP_LEVEL_IMPERSONATE,
|
|
me->m_cred->authIdent, 0};
|
|
|
|
server.pAuthInfo = &authInfo;
|
|
|
|
me->m_backupHr = CoCreateInstanceEx(CLSID_WbemBackupRestore, 0,
|
|
CLSCTX_REMOTE_SERVER,
|
|
&server, 1, &qi);
|
|
}
|
|
|
|
if(SUCCEEDED(me->m_backupHr) && SUCCEEDED(qi.hr))
|
|
{
|
|
IWbemBackupRestore *pBR = (IWbemBackupRestore *)qi.pItf;
|
|
|
|
SetInterfaceSecurityEx(pBR,
|
|
me->m_cred->authIdent,
|
|
NULL,
|
|
RPC_C_AUTHN_LEVEL_DEFAULT,
|
|
RPC_C_IMP_LEVEL_IMPERSONATE,
|
|
0);
|
|
|
|
ATLTRACE(_T("begin backup/restore\n"));
|
|
|
|
//Sleep(1000);
|
|
|
|
CHString1 verStr;
|
|
bool TgtisNT5 = true;
|
|
if(me->m_DS)
|
|
{
|
|
me->m_DS->GetOSVersion(verStr);
|
|
if(verStr[0] == _T('4'))
|
|
TgtisNT5 = false;
|
|
}
|
|
|
|
if(me->m_doingBackup)
|
|
{
|
|
//Only set the privilege if we are local - otherwise the privilege is there already
|
|
//in the thread token...
|
|
if( me->m_DS->IsLocal() && TgtisNT5)
|
|
me->SetPriv(SE_BACKUP_NAME, pBR);
|
|
|
|
me->m_backupHr = pBR->Backup(me->m_wszArgs, 0);
|
|
}
|
|
else
|
|
{
|
|
//Only set the privilege if we are local - otherwise the privilege is there already
|
|
//in the thread token...
|
|
if( me->m_DS->IsLocal() && TgtisNT5)
|
|
me->SetPriv(SE_RESTORE_NAME, pBR);
|
|
|
|
me->m_backupHr = pBR->Restore(me->m_wszArgs,
|
|
WBEM_FLAG_BACKUP_RESTORE_FORCE_SHUTDOWN);
|
|
}
|
|
|
|
if(TgtisNT5)
|
|
me->ClearPriv();
|
|
|
|
ATLTRACE(_T("done backup/restore\n"));
|
|
|
|
qi.pItf->Release();
|
|
}
|
|
|
|
CoUninitialize();
|
|
|
|
// kill the distraction.
|
|
if(me->m_AVIbox)
|
|
{
|
|
::PostMessage(me->m_AVIbox, WM_ASYNC_CIMOM_CONNECTED, 0, 0);
|
|
}
|
|
|
|
_endthread();
|
|
}
|
|
|
|
|
|
//------------------------------------------------------------------------
|
|
void CBackupPage::DealWithPath(LPCTSTR pathFile)
|
|
{
|
|
#ifdef UNICODE
|
|
if (m_wszArgs != NULL)
|
|
delete m_wszArgs;
|
|
|
|
m_wszArgs = new TCHAR[lstrlen(pathFile) + 1];
|
|
|
|
if (m_wszArgs != NULL)
|
|
lstrcpy(m_wszArgs, pathFile);
|
|
#else
|
|
size_t nSize = mbstowcs(NULL, (LPCTSTR)pathFile, _tcslen(pathFile) + 1);
|
|
m_wszArgs = new wchar_t[nSize + 1];
|
|
mbstowcs(m_wszArgs, (LPCTSTR)pathFile, _tcslen(pathFile) + 1);
|
|
#endif
|
|
}
|
|
|
|
//------------------------------------------------------------------------
|
|
void CBackupPage::DealWithDomain(void)
|
|
{
|
|
m_cred = m_DS->GetCredentials();
|
|
|
|
// 54062- Nt 4.0 rpc crashes if given a null domain name along with a valid user name
|
|
|
|
if((m_cred->authIdent != 0) &&
|
|
(m_cred->authIdent->DomainLength == 0) &&
|
|
(m_cred->authIdent->UserLength > 0) && IsNT(4))
|
|
{
|
|
LPTSTR pNTDomain = NULL;
|
|
|
|
CNtSid sid(CNtSid::CURRENT_USER);
|
|
|
|
DWORD dwRet = sid.GetInfo(NULL, &pNTDomain, NULL);
|
|
|
|
if(dwRet == 0)
|
|
{
|
|
#ifdef UNICODE
|
|
if(m_cred->authIdent->Flags == SEC_WINNT_AUTH_IDENTITY_ANSI)
|
|
{
|
|
// convert UNICODE to ansi.
|
|
int size = wcstombs(NULL, pNTDomain, 0);
|
|
|
|
m_cred->authIdent->Domain =
|
|
(LPWSTR)CoTaskMemAlloc((size+1) * sizeof(TCHAR));
|
|
if (m_cred->authIdent->Domain != NULL)
|
|
{
|
|
memset(m_cred->authIdent->Domain, 0,
|
|
(size+1) * sizeof(TCHAR));
|
|
wcstombs((char *)m_cred->authIdent->Domain, pNTDomain,
|
|
size);
|
|
m_cred->authIdent->DomainLength = size;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//straight unicode copy.
|
|
m_cred->authIdent->DomainLength = wcslen(pNTDomain);
|
|
m_cred->authIdent->Domain = (LPWSTR)pNTDomain;
|
|
}
|
|
#else // ANSI
|
|
if(m_cred->authIdent->Flags == SEC_WINNT_AUTH_IDENTITY_ANSI)
|
|
{
|
|
//straight ansi copy.
|
|
m_cred->authIdent->DomainLength = strlen(pNTDomain);
|
|
m_cred->authIdent->Domain = (LPWSTR)pNTDomain;
|
|
}
|
|
else
|
|
{
|
|
// convert ansi to UNICODE.
|
|
int size = mbstowcs(NULL, pNTDomain, 0);
|
|
WCHAR temp[100] = {0};
|
|
m_cred->authIdent->Domain =
|
|
(LPWSTR)CoTaskMemAlloc((size+1) * sizeof(WCHAR));
|
|
if (m_cred->authIdent->Domain != NULL)
|
|
{
|
|
memset(m_cred->authIdent->Domain, 0,
|
|
(size+1) * sizeof(WCHAR));
|
|
mbstowcs(temp, pNTDomain, min(99, size)); //so it's always null terminated
|
|
wcscpy(m_cred->authIdent->Domain, temp);
|
|
m_cred->authIdent->DomainLength = size;
|
|
}
|
|
}
|
|
|
|
#endif UNICODE
|
|
}
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------
|
|
BOOL CBackupPage::BackupMethod(HWND hDlg, LPCTSTR pathFile)
|
|
{
|
|
UINT prompt = IDYES;
|
|
|
|
TCHAR drive[_MAX_DRIVE] = {0}, path[_MAX_DIR] = {0},
|
|
temp[_MAX_PATH] = {0};
|
|
|
|
// rip it apart.
|
|
_tsplitpath(pathFile, drive, path, NULL, NULL);
|
|
|
|
_tcscpy(temp, drive);
|
|
_tcscat(temp, path);
|
|
|
|
if(!m_DS->IsValidDir(CHString1(temp)))
|
|
{
|
|
CHString1 caption, threat;
|
|
caption.LoadString(IDS_SHORT_NAME);
|
|
threat.LoadString(IDS_NEED_EXISTING_DIR);
|
|
|
|
MessageBox(hDlg, (LPCTSTR)threat, (LPCTSTR)caption,
|
|
MB_OK|MB_DEFBUTTON1|MB_ICONEXCLAMATION);
|
|
|
|
return FALSE;
|
|
}
|
|
else if(m_DS->IsValidFile(pathFile))
|
|
{
|
|
CHString1 caption, threat;
|
|
caption.LoadString(IDS_SHORT_NAME);
|
|
threat.LoadString(IDS_BACKUP_OVERWRITE);
|
|
|
|
prompt = MessageBox(hDlg, (LPCTSTR)threat, (LPCTSTR)caption,
|
|
MB_YESNO|MB_DEFBUTTON2|MB_ICONEXCLAMATION);
|
|
|
|
}
|
|
|
|
if(prompt == IDYES)
|
|
{
|
|
DealWithPath(pathFile);
|
|
|
|
// UI
|
|
CHString1 title, msg, fmt;
|
|
m_AVIbox = 0;
|
|
TCHAR shortPath[33] = {0};
|
|
m_backupHr = S_OK;
|
|
|
|
title.LoadString(IDS_BACKUP_TITLE);
|
|
fmt.LoadString(IDS_BACKUP_FMT);
|
|
|
|
PathCompactPathEx(shortPath, pathFile, 32,0);
|
|
msg.Format(fmt, shortPath);
|
|
DealWithDomain();
|
|
// m_DS->m_rootThread.m_WbemServices.SetPriv(SE_BACKUP_NAME);
|
|
m_doingBackup = true;
|
|
|
|
if(_beginthread(BackupRestoreThread, 0,
|
|
(LPVOID)this) != -1)
|
|
{
|
|
DisplayAVIBox(hDlg, title, msg, &m_AVIbox, FALSE);
|
|
}
|
|
|
|
if(FAILED(m_backupHr))
|
|
{
|
|
TCHAR msg[256] = {0};
|
|
if(ErrorStringEx(m_backupHr, msg, 256))
|
|
{
|
|
CHString1 caption;
|
|
caption.LoadString(IDS_SHORT_NAME);
|
|
MessageBox(hDlg, msg, caption, MB_OK| MB_ICONWARNING);
|
|
}
|
|
}
|
|
// m_DS->m_rootThread.m_WbemServices.ClearPriv();
|
|
} //endif doIt
|
|
|
|
return SUCCEEDED(m_backupHr);
|
|
}
|
|
|
|
//------------------------------------------------------------------------
|
|
HRESULT CBackupPage::RestoreMethod(HWND hDlg, LPCTSTR pathFile)
|
|
{
|
|
HRESULT hr = WBEM_E_NOT_FOUND;
|
|
if(m_DS->IsValidFile(pathFile))
|
|
{
|
|
DealWithPath(pathFile);
|
|
|
|
// UI
|
|
CHString1 title, msg, fmt;
|
|
m_AVIbox = 0;
|
|
TCHAR shortPath[33] = {0};
|
|
|
|
title.LoadString(IDS_RESTORE_TITLE);
|
|
fmt.LoadString(IDS_RESTORE_FMT);
|
|
|
|
PathCompactPathEx(shortPath, pathFile, 32,0);
|
|
msg.Format(fmt, shortPath);
|
|
DealWithDomain();
|
|
|
|
m_doingBackup = false;
|
|
if(_beginthread(BackupRestoreThread, 0,
|
|
(LPVOID)this) != -1)
|
|
{
|
|
DisplayAVIBox(hDlg, title, msg, &m_AVIbox, FALSE);
|
|
Reconnect2();
|
|
}
|
|
|
|
if(FAILED(m_backupHr))
|
|
{
|
|
TCHAR msg[256] = {0};
|
|
if(ErrorStringEx(m_backupHr, msg, 256))
|
|
{
|
|
CHString1 caption;
|
|
caption.LoadString(IDS_SHORT_NAME);
|
|
MessageBox(hDlg, msg, caption, MB_OK| MB_ICONWARNING);
|
|
}
|
|
}
|
|
hr = m_backupHr;
|
|
}
|
|
else
|
|
{
|
|
// NOTE: shouldn't ever get here... but..
|
|
CHString1 caption, threat;
|
|
caption.LoadString(IDS_SHORT_NAME);
|
|
threat.LoadString(IDS_NO_BACKUP_FILE);
|
|
|
|
MessageBox(hDlg, (LPCTSTR)threat, (LPCTSTR)caption,
|
|
MB_OK|MB_ICONEXCLAMATION);
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
//------------------------------------------------------------------------
|
|
BOOL CBackupPage::DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
TCHAR * pszFilter;
|
|
|
|
switch(uMsg)
|
|
{
|
|
case WM_INITDIALOG:
|
|
InitDlg(hDlg);
|
|
break;
|
|
|
|
case WM_ASYNC_CIMOM_CONNECTED:
|
|
{
|
|
OnFinishConnected(hDlg, lParam);
|
|
Refresh(hDlg);
|
|
}
|
|
break;
|
|
|
|
case WM_NOTIFY:
|
|
switch(((LPNMHDR)lParam)->code)
|
|
{
|
|
case PSN_SETACTIVE:
|
|
Refresh(hDlg);
|
|
break;
|
|
|
|
case PSN_HELP:
|
|
HTMLHelper(hDlg);
|
|
break;
|
|
|
|
case PSN_APPLY:
|
|
OnApply(hDlg, (((LPPSHNOTIFY)lParam)->lParam == 1));
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
switch(LOWORD(wParam))
|
|
{
|
|
case IDC_BACKUPINTERVAL:
|
|
if(HIWORD(wParam) == EN_KILLFOCUS)
|
|
{
|
|
TCHAR buf[4] = {0};
|
|
int iVal = 0;
|
|
::GetWindowText((HWND)lParam, buf, ARRAYSIZE(buf));
|
|
iVal = _ttoi(buf);
|
|
|
|
if(iVal == 0)
|
|
{
|
|
BOOL enable = TRUE;
|
|
CHString1 caption, threat;
|
|
caption.LoadString(IDS_SHORT_NAME);
|
|
threat.LoadString(IDS_BACKUP_THREAT);
|
|
|
|
if(MessageBox(hDlg, (LPCTSTR)threat, (LPCTSTR)caption,
|
|
MB_YESNO|MB_DEFBUTTON2|MB_ICONEXCLAMATION) == IDYES)
|
|
{
|
|
ComboBox_SetCurSel(GetDlgItem(hDlg, IDC_BACKUP_UNITS), -1);
|
|
::EnableWindow((HWND)lParam, FALSE);
|
|
::EnableWindow(GetDlgItem(hDlg, IDC_BACKUP_UNITS), FALSE);
|
|
Button_SetCheck(GetDlgItem(hDlg, IDC_BACKUP_ENABLED), BST_UNCHECKED);
|
|
}
|
|
else
|
|
{
|
|
Button_SetCheck(GetDlgItem(hDlg, IDC_BACKUP_ENABLED), BST_CHECKED);
|
|
Refresh(hDlg, true);
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
PageChanged(PB_BACKUP, true);
|
|
}
|
|
else if((HIWORD(wParam) == EN_CHANGE) &&
|
|
Edit_GetModify((HWND)lParam))
|
|
{
|
|
PageChanged(PB_BACKUP, true);
|
|
return TRUE;
|
|
}
|
|
break;
|
|
|
|
case IDC_BACKUP_UNITS:
|
|
if(HIWORD(wParam) == CBN_SELCHANGE)
|
|
{
|
|
PageChanged(PB_BACKUP, true);
|
|
return TRUE;
|
|
}
|
|
break;
|
|
|
|
case IDC_RESTORE_FM_AUTO:
|
|
if(HIWORD(wParam) == BN_CLICKED)
|
|
{
|
|
CHString1 dbPath;
|
|
|
|
m_DS->GetDBDir(dbPath);
|
|
dbPath += _T("\\Cim.rec");
|
|
|
|
CHString1 caption, threat;
|
|
caption.LoadString(IDS_AUTORESTORE);
|
|
threat.LoadString(IDS_SURE);
|
|
|
|
if(MessageBox(hDlg, threat, caption,
|
|
MB_YESNO|MB_DEFBUTTON2|MB_ICONQUESTION) == IDYES)
|
|
{
|
|
RestoreMethod(hDlg, dbPath);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case IDC_BACKUP_BTN:
|
|
if(HIWORD(wParam) == BN_CLICKED)
|
|
{
|
|
TCHAR pathFile[MAX_PATH] = {0};
|
|
CHString1 dbPath;
|
|
|
|
TCHAR recFilter[200] = {0}, all[100] = {0};
|
|
|
|
TCHAR *pTemp = recFilter;
|
|
|
|
m_DS->GetDBDir(dbPath);
|
|
|
|
int recSize = ::LoadString(_Module.GetModuleInstance(), IDS_REC_FILTER,
|
|
recFilter, 100);
|
|
|
|
int allSize = ::LoadString(_Module.GetModuleInstance(), IDS_ALL_FILTER,
|
|
all, 100);
|
|
|
|
// Build this string with the words coming from the string table.
|
|
//_T("WMI Recovery Files (*.rec)\0*.rec\0All Files (*.*)\0*.*\0\0");
|
|
|
|
pszFilter = new TCHAR[_tcslen(recFilter) + 1 +
|
|
ARRAYSIZE(REC_WILDCARD) +
|
|
_tcslen(all) + 1 +
|
|
ARRAYSIZE(ALL_WILDCARD) + 1];
|
|
|
|
if (pszFilter != NULL)
|
|
{
|
|
TCHAR * psz = pszFilter;
|
|
_tcscpy(psz, recFilter);
|
|
psz += recSize + 1;
|
|
_tcscpy(psz,REC_WILDCARD);
|
|
psz += ARRAYSIZE(REC_WILDCARD);
|
|
_tcscpy(psz, all);
|
|
psz += allSize + 1;
|
|
_tcscpy(psz, ALL_WILDCARD);
|
|
psz += ARRAYSIZE(ALL_WILDCARD);
|
|
*psz = _T('\0');
|
|
|
|
if(BrowseForFile(hDlg,
|
|
IDS_OPEN_BACKUP,
|
|
recFilter,
|
|
(LPCTSTR)dbPath,
|
|
pathFile,
|
|
MAX_PATH))
|
|
{
|
|
BackupMethod(hDlg, pathFile);
|
|
}
|
|
|
|
delete pszFilter;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case IDC_RESTORE_BTN:
|
|
if(HIWORD(wParam) == BN_CLICKED)
|
|
{
|
|
TCHAR pathFile[MAX_PATH] = {0};
|
|
CHString1 dbPath, title;
|
|
TCHAR recFilter[100] = {0}, all[100] = {0};
|
|
|
|
m_DS->GetDBDir(dbPath);
|
|
|
|
int recSize = ::LoadString(_Module.GetModuleInstance(), IDS_REC_FILTER,
|
|
recFilter, 100);
|
|
|
|
int allSize = ::LoadString(_Module.GetModuleInstance(), IDS_ALL_FILTER,
|
|
all, 100);
|
|
|
|
// Build this string with the words coming from the string table.
|
|
//_T("WMI Recovery Files (*.rec)\0*.rec\0All Files (*.*)\0*.*\0\0");
|
|
|
|
pszFilter = new TCHAR[_tcslen(recFilter) + 1 +
|
|
ARRAYSIZE(REC_WILDCARD) +
|
|
_tcslen(all) + 1 +
|
|
ARRAYSIZE(ALL_WILDCARD) + 1];
|
|
|
|
if (pszFilter != NULL)
|
|
{
|
|
TCHAR * psz = pszFilter;
|
|
_tcscpy(psz, recFilter);
|
|
psz += recSize + 1;
|
|
_tcscpy(psz,REC_WILDCARD);
|
|
psz += ARRAYSIZE(REC_WILDCARD);
|
|
_tcscpy(psz, all);
|
|
psz += allSize + 1;
|
|
_tcscpy(psz, ALL_WILDCARD);
|
|
psz += ARRAYSIZE(ALL_WILDCARD);
|
|
*psz = _T('\0');
|
|
|
|
if(BrowseForFile(hDlg,
|
|
IDS_OPEN_RESTORE,
|
|
pszFilter,
|
|
(LPCTSTR)dbPath,
|
|
pathFile,
|
|
MAX_PATH,
|
|
0))
|
|
{
|
|
RestoreMethod(hDlg, pathFile);
|
|
}
|
|
|
|
delete pszFilter;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case IDC_BACKUP_ENABLED:
|
|
if(HIWORD(wParam) == BN_CLICKED)
|
|
{
|
|
int x = Button_GetState((HWND)lParam);
|
|
BOOL checked = (x & BST_CHECKED);
|
|
BOOL enable = FALSE;
|
|
if(checked)
|
|
{
|
|
// turn on and repopulate the edit fields.
|
|
CHString1 temp;
|
|
UINT iTemp = 30;
|
|
SetInterval(hDlg, iTemp);
|
|
enable = TRUE;
|
|
}
|
|
else // turning off.
|
|
{
|
|
CHString1 caption, threat;
|
|
caption.LoadString(IDS_SHORT_NAME);
|
|
threat.LoadString(IDS_BACKUP_THREAT);
|
|
|
|
if(MessageBox(hDlg, (LPCTSTR)threat, (LPCTSTR)caption,
|
|
MB_YESNO|MB_DEFBUTTON2|MB_ICONEXCLAMATION) == IDYES)
|
|
{
|
|
SetWindowText(GetDlgItem(hDlg, IDC_BACKUPINTERVAL), _T("0"));
|
|
ComboBox_SetCurSel(GetDlgItem(hDlg, IDC_BACKUP_UNITS), -1);
|
|
enable = FALSE;
|
|
}
|
|
else
|
|
{
|
|
Button_SetCheck(GetDlgItem(hDlg, IDC_BACKUP_ENABLED), BST_CHECKED);
|
|
Refresh(hDlg);
|
|
return TRUE;
|
|
}
|
|
}
|
|
::EnableWindow(GetDlgItem(hDlg, IDC_BACKUPINTERVAL), enable);
|
|
::EnableWindow(GetDlgItem(hDlg, IDC_BACKUP_UNITS), enable);
|
|
|
|
PageChanged(PB_BACKUP, true);
|
|
return TRUE;
|
|
}
|
|
break;
|
|
|
|
default: break;
|
|
} //endswitch(LOWORD(wParam))
|
|
|
|
break;
|
|
|
|
case WM_HELP:
|
|
if (IsWindowEnabled(hDlg))
|
|
{
|
|
WinHelp((HWND)((LPHELPINFO)lParam)->hItemHandle,
|
|
c_HelpFile,
|
|
HELP_WM_HELP,
|
|
(ULONG_PTR)buPageHelpIDs);
|
|
}
|
|
break;
|
|
|
|
case WM_CONTEXTMENU:
|
|
if (IsWindowEnabled(hDlg))
|
|
{
|
|
WinHelp(hDlg, c_HelpFile,
|
|
HELP_CONTEXTMENU,
|
|
(ULONG_PTR)buPageHelpIDs);
|
|
}
|
|
break;
|
|
|
|
default:
|
|
return FALSE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
void CBackupPage::HideAutomaticBackupControls(HWND hDlg)
|
|
{
|
|
ShowWindow(GetDlgItem(hDlg,IDC_AUTOMATIC_GROUPBOX),SW_HIDE);
|
|
ShowWindow(GetDlgItem(hDlg,IDC_ADV_NOW_TEXT),SW_HIDE);
|
|
ShowWindow(GetDlgItem(hDlg,IDC_BACKUP_ENABLED),SW_HIDE);
|
|
ShowWindow(GetDlgItem(hDlg,IDC_BACKUPINTERVAL),SW_HIDE);
|
|
ShowWindow(GetDlgItem(hDlg,IDC_BACKUP_UNITS),SW_HIDE);
|
|
ShowWindow(GetDlgItem(hDlg,IDC_LASTBACKUP_LABEL),SW_HIDE);
|
|
ShowWindow(GetDlgItem(hDlg,IDC_LASTBACKUP),SW_HIDE);
|
|
ShowWindow(GetDlgItem(hDlg,IDC_RESTORE_FM_AUTO),SW_HIDE);
|
|
ShowWindow(GetDlgItem(hDlg,IDC_BACKUP_UNITS),SW_HIDE);
|
|
ShowWindow(GetDlgItem(hDlg,IDC_DBDIRECTORY_LABEL),SW_HIDE);
|
|
ShowWindow(GetDlgItem(hDlg,IDC_DB_DIR),SW_HIDE);
|
|
|
|
SetWindowPos(GetDlgItem(hDlg,IDC_MANUAL_GROUPBOX),NULL,7,12,0,0,SWP_NOSIZE | SWP_NOZORDER);
|
|
SetWindowPos(GetDlgItem(hDlg,IDC_ADV_NOW_TEXT2),NULL,32,35,0,0,SWP_NOSIZE | SWP_NOZORDER);
|
|
SetWindowPos(GetDlgItem(hDlg,IDC_BACKUP_BTN),NULL,40,97,87,14,SWP_NOSIZE | SWP_NOZORDER);
|
|
SetWindowPos(GetDlgItem(hDlg,IDC_RESTORE_BTN),NULL,195,97,87,14,SWP_NOSIZE | SWP_NOZORDER);
|
|
m_bWhistlerCore = true;
|
|
}
|