⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bindinstalldlg.cpp

📁 bind-3.2.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/* * Portions Copyright (C) 2001-2003  Internet Software Consortium. * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL * INTERNET SOFTWARE CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. *//* $Id: BINDInstallDlg.cpp,v 1.6.2.8 2003/09/09 03:47:31 marka Exp $ *//* * Copyright (c) 1999-2000 by Nortel Networks Corporation * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND NORTEL NETWORKS DISCLAIMS * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NORTEL NETWORKS * BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. *//* * Define this to make a standalone installer that will copy msvcrt.dll * and/or msvcrtd.dll during the install */// #define BINARIES_INSTALL/* * msvcrt.dll is the release c-runtime library for MSVC.  msvcrtd.dll is the debug * c-runtime library for MSVC.  If you have debug binaries you want to have DEBUG_BINARIES * defined.  If you have release binaries you want to have RELEASE_BINARIES defined. * If you have both, then define them both. * Of course, you need msvcrt[d].dll present to install it! */#ifdef BINARIES_INSTALL// #  define DEBUG_BINARIES// #  define RELEASE_BINARIES#endif#include "stdafx.h"#include "BINDInstall.h"#include "BINDInstallDlg.h"#include "DirBrowse.h"#include <winsvc.h>#include <named/ntservice.h>#include <isc/bind_registry.h>#include <direct.h>#include "versioninfo.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endiftypedef struct _xexception{	_xexception(UINT string, ...);		CString resString;} Exception;_xexception::_xexception(UINT string, ...){	CString format;	va_list va;	format.LoadString(string);	va_start(va, string);	resString.FormatV(format, va);	va_end(va);}typedef struct _filedata{	enum FileDestinations {TargetDir, BinDir, EtcDir, WinSystem};	enum FileImportance {Trivial, Normal, Critical};	char *filename;	int destination;	int importance;	BOOL checkVer;} FileData;const FileData installFiles[] ={#ifdef BINARIES_INSTALL#  ifdef DEBUG_BINARIES	{"msvcrtd.dll", FileData::WinSystem, FileData::Critical, TRUE},#  endif#  ifdef RELEASE_BINARIES	{"msvcrt.dll", FileData::WinSystem, FileData::Critical, TRUE},#  endif#endif	{"mfc70.dll", FileData::WinSystem, FileData::Critical, TRUE},	{"msvcr70.dll", FileData::WinSystem, FileData::Critical, TRUE},	{"bindevt.dll", FileData::WinSystem, FileData::Normal, FALSE},	{"libisc.dll", FileData::WinSystem, FileData::Critical, FALSE},	{"libisccfg.dll", FileData::WinSystem, FileData::Critical, FALSE},	{"libisccc.dll", FileData::WinSystem, FileData::Critical, FALSE},	{"libdns.dll", FileData::WinSystem, FileData::Critical, FALSE},	{"liblwres.dll", FileData::WinSystem, FileData::Critical, FALSE},	{"libeay32.dll", FileData::BinDir, FileData::Critical, FALSE},	{"named.exe", FileData::BinDir, FileData::Critical, FALSE},	{"nsupdate.exe", FileData::BinDir, FileData::Normal, FALSE},	{"BINDInstall.exe", FileData::BinDir, FileData::Normal, FALSE},	{"rndc.exe", FileData::BinDir, FileData::Normal, FALSE},	{"dig.exe", FileData::BinDir, FileData::Normal, FALSE},	{"host.exe", FileData::BinDir, FileData::Normal, FALSE},	{"nslookup.exe", FileData::BinDir, FileData::Normal, FALSE},	{"rndc-confgen.exe", FileData::BinDir, FileData::Normal, FALSE},	{"dnssec-keygen.exe", FileData::BinDir, FileData::Normal, FALSE},	{"dnssec-makekeyset.exe", FileData::BinDir, FileData::Normal, FALSE},	{"dnssec-signkey.exe", FileData::BinDir, FileData::Normal, FALSE},	{"dnssec-signzone.exe", FileData::BinDir, FileData::Normal, FALSE},	{"named-checkconf.exe", FileData::BinDir, FileData::Normal, FALSE},	{"named-checkzone.exe", FileData::BinDir, FileData::Normal, FALSE},	{"readme1st.txt", FileData::BinDir, FileData::Trivial, FALSE},	{NULL, -1, -1}};/////////////////////////////////////////////////////////////////////////////// CBINDInstallDlg dialogCBINDInstallDlg::CBINDInstallDlg(CWnd* pParent /*=NULL*/)	: CDialog(CBINDInstallDlg::IDD, pParent){	char buf[MAX_PATH];	//{{AFX_DATA_INIT(CBINDInstallDlg)	m_targetDir = _T("");	m_version = _T("");	m_autoStart = FALSE;	m_keepFiles = FALSE;	m_current = _T("");	m_startOnInstall = FALSE;	//}}AFX_DATA_INIT	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);	m_reboot = FALSE;	GetSystemDirectory(buf, MAX_PATH);	m_winSysDir = buf;	m_defaultDir = buf;	m_defaultDir += "\\dns";}void CBINDInstallDlg::DoDataExchange(CDataExchange* pDX){	CDialog::DoDataExchange(pDX);	//{{AFX_DATA_MAP(CBINDInstallDlg)	DDX_Text(pDX, IDC_TARGETDIR, m_targetDir);	DDX_Text(pDX, IDC_VERSION, m_version);	DDX_Check(pDX, IDC_AUTO_START, m_autoStart);	DDX_Check(pDX, IDC_KEEP_FILES, m_keepFiles);	DDX_Text(pDX, IDC_CURRENT, m_current);	DDX_Check(pDX, IDC_START, m_startOnInstall);	//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CBINDInstallDlg, CDialog)	//{{AFX_MSG_MAP(CBINDInstallDlg)	ON_WM_PAINT()	ON_WM_QUERYDRAGICON()	ON_BN_CLICKED(IDC_BROWSE, OnBrowse)	ON_BN_CLICKED(IDC_INSTALL, OnInstall)	ON_BN_CLICKED(IDC_EXIT, OnExit)	ON_BN_CLICKED(IDC_UNINSTALL, OnUninstall)	//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CBINDInstallDlg message handlersBOOL CBINDInstallDlg::OnInitDialog(){	CDialog::OnInitDialog();	// Set the icon for this dialog.  The framework does this automatically	//  when the application's main window is not a dialog	SetIcon(m_hIcon, TRUE);			// Set big icon	SetIcon(m_hIcon, FALSE);		// Set small icon	char filename[MAX_PATH];	char dirname[MAX_PATH];	char *fptr = &filename[0];	GetModuleFileName(NULL, filename, MAX_PATH);	char *dptr = strrchr(filename,'\\');	int index = dptr - fptr;	strncpy(dirname, filename, index);	dirname[index] = '\0';	CString Dirname(dirname);	m_currentDir = Dirname;		CVersionInfo bindInst(filename);	if(bindInst.IsValid())		m_version.Format(IDS_VERSION, bindInst.GetFileVersionString());	else		m_version.LoadString(IDS_NO_VERSION);	DWORD dwBufLen = MAX_PATH;	char buf[MAX_PATH];	HKEY hKey;	m_startOnInstall = CheckBINDService();	/* See if we are installed already */	if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, BIND_SUBKEY, 0, KEY_READ, &hKey) == ERROR_SUCCESS)	{		memset(buf, 0, MAX_PATH);		// Get the install directory		if(RegQueryValueEx(hKey, "InstallDir", NULL, NULL, (LPBYTE)buf, &dwBufLen) == ERROR_SUCCESS)			if(strcmp(buf, ""))				m_defaultDir = buf;				RegCloseKey(hKey);	}	m_targetDir = m_defaultDir;	// Set checkbox defaults	m_autoStart = TRUE;	m_keepFiles = TRUE;	UpdateData(FALSE);	return(TRUE);  // return(TRUE  unless you set the focus to a control}// If you add a minimize button to your dialog, you will need the code below//  to draw the icon.  For MFC applications using the document/view model,//  this is automatically done for you by the framework.void CBINDInstallDlg::OnPaint() {	if (IsIconic())	{		CPaintDC dc(this); // device context for painting		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);		// Center icon in client rectangle		int cxIcon = GetSystemMetrics(SM_CXICON);		int cyIcon = GetSystemMetrics(SM_CYICON);		CRect rect;		GetClientRect(&rect);		int x = (rect.Width() - cxIcon + 1) / 2;		int y = (rect.Height() - cyIcon + 1) / 2;		// Draw the icon		dc.DrawIcon(x, y, m_hIcon);	}	else	{		CDialog::OnPaint();	}}// The system calls this to obtain the cursor to display while the user drags//  the minimized window.HCURSOR CBINDInstallDlg::OnQueryDragIcon(){	return((HCURSOR)m_hIcon);}void CBINDInstallDlg::OnBrowse() {	CDirBrowse browse;	if(browse.DoModal() == IDOK)	{		//m_targetDir = browse.m_selectedDir;		UpdateData(FALSE);	}}/* * User pressed the exit button */void CBINDInstallDlg::OnExit() {	EndDialog(0);	}/* * User pressed the uninstall button.  Make it go. */void CBINDInstallDlg::OnUninstall() {	UpdateData();		if(MsgBox(IDS_UNINSTALL, MB_YESNO) == IDYES)	{		if(CheckBINDService())			StopBINDService();		SC_HANDLE hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);		if(!hSCManager)		{			MsgBox(IDS_ERR_OPEN_SCM, GetErrMessage());			return;		}				SC_HANDLE hService = OpenService(hSCManager, BIND_SERVICE_NAME, SERVICE_ALL_ACCESS);		if(!hService && GetLastError() != ERROR_SERVICE_DOES_NOT_EXIST)		{			MsgBox(IDS_ERR_OPEN_SERVICE, GetErrMessage());			return;		}		SERVICE_STATUS ss;		QueryServiceStatus(hService, &ss);		if(ss.dwCurrentState == SERVICE_RUNNING)		{			BOOL rc = ControlService(hService, SERVICE_CONTROL_STOP, &ss);			if(rc == FALSE || ss.dwCurrentState != SERVICE_STOPPED)			{				MsgBox(IDS_ERR_STOP_SERVICE, GetErrMessage());				return;			}		}		CloseServiceHandle(hService);		CloseServiceHandle(hSCManager);				// Directories		m_etcDir = m_targetDir + "\\etc";		m_binDir = m_targetDir + "\\bin";		UninstallTags();		UnregisterMessages(TRUE);		UnregisterService(TRUE);		DeleteFiles(TRUE);		if(m_keepFiles == FALSE)			RemoveDirs(TRUE);		else			GetDlgItem(IDC_CREATE_DIR)->SetWindowText("Not Removed");				// Delete registry keys for named		RegDeleteKey(HKEY_LOCAL_MACHINE, BIND_SESSION_SUBKEY);		RegDeleteKey(HKEY_LOCAL_MACHINE, BIND_SUBKEY);		RegDeleteKey(HKEY_LOCAL_MACHINE, BIND_UNINSTALL_SUBKEY);			ProgramGroup(FALSE);		SetCurrent(IDS_UNINSTALL_DONE);		MsgBox(IDS_UNINSTALL_DONE);	}}/* * User pressed the install button.  Make it go. */void CBINDInstallDlg::OnInstall() {	BOOL success = FALSE;	if(CheckBINDService())		StopBINDService();	InstallTags();	UpdateData();	// Directories	m_etcDir = m_targetDir + "\\etc";	m_binDir = m_targetDir + "\\bin";	if(m_defaultDir != m_targetDir)	{		if(GetFileAttributes(m_targetDir) != 0xFFFFFFFF)		{			int install = MsgBox(IDS_DIREXIST, MB_YESNO | MB_ICONQUESTION, m_targetDir);			if(install == IDNO)				return;		}		else		{			int createDir = MsgBox(IDS_CREATEDIR, MB_YESNO | MB_ICONQUESTION, m_targetDir);			if(createDir == IDNO)				return;		}	}	try	{		CreateDirs(); 		CopyFiles();		RegisterService();		RegisterMessages();		HKEY hKey;		/* Create a new key for named */		SetCurrent(IDS_CREATE_KEY);		if(RegCreateKey(HKEY_LOCAL_MACHINE, BIND_SUBKEY, &hKey) == ERROR_SUCCESS)		{			// Get the install directory			RegSetValueEx(hKey, "InstallDir", 0, REG_SZ, (LPBYTE)(LPCTSTR)m_targetDir, m_targetDir.GetLength());			RegCloseKey(hKey);		}				SetCurrent(IDS_ADD_REMOVE);		if(RegCreateKey(HKEY_LOCAL_MACHINE, BIND_UNINSTALL_SUBKEY, &hKey) == ERROR_SUCCESS)		{			char winDir[MAX_PATH];			CString buf(BIND_DISPLAY_NAME);			GetWindowsDirectory(winDir, MAX_PATH);			RegSetValueEx(hKey, "DisplayName", 0, REG_SZ, (LPBYTE)(LPCTSTR)buf, buf.GetLength());			buf.Format("%s\\BINDInstall.exe", winDir);			RegSetValueEx(hKey, "UninstallString", 0, REG_SZ, (LPBYTE)(LPCTSTR)buf, buf.GetLength());			RegCloseKey(hKey);		}			if(m_startOnInstall && !m_reboot)			StartBINDService();	}	catch(Exception e)	{		MessageBox(e.resString);		SetCurrent(IDS_CLEANUP);		FailedInstall();		MsgBox(IDS_FAIL);		return;	}	catch(DWORD dw)	{		CString msg;		msg.Format("A fatal error occured\n(%s)", GetErrMessage(dw));		MessageBox(msg);		SetCurrent(IDS_CLEANUP);		FailedInstall();		MsgBox(IDS_FAIL);		return;	}	SetCurrent(IDS_INSTALL_DONE);	MsgBox(IDS_SUCCESS);	if(m_reboot)	{		if(MsgBox(IDS_REBOOT, MB_YESNO) == IDYES)		{			InitiateSystemShutdown(NULL, NULL, 0, TRUE, TRUE);		}	}}/* * Methods to do the work */void CBINDInstallDlg::CreateDirs(){	/* s'OK if the directories already exist */	SetCurrent(IDS_CREATE_DIR, m_targetDir);	if(!CreateDirectory(m_targetDir, NULL) && GetLastError() != ERROR_ALREADY_EXISTS)		throw(Exception(IDS_ERR_CREATE_DIR, m_targetDir, GetErrMessage()));	SetCurrent(IDS_CREATE_DIR, m_etcDir);	if(!CreateDirectory(m_etcDir, NULL) && GetLastError() != ERROR_ALREADY_EXISTS)		throw(Exception(IDS_ERR_CREATE_DIR, m_etcDir, GetErrMessage()));	SetCurrent(IDS_CREATE_DIR, m_binDir);	if(!CreateDirectory(m_binDir, NULL) && GetLastError() != ERROR_ALREADY_EXISTS)		throw(Exception(IDS_ERR_CREATE_DIR, m_binDir, GetErrMessage()));			SetItemStatus(IDC_CREATE_DIR);}void CBINDInstallDlg::RemoveDirs(BOOL uninstall){	if(!m_keepFiles)	{		SetCurrent(IDS_REMOVE_DIR, m_binDir);		// Check for existence then remove if present		if(GetFileAttributes(m_binDir) != 0xFFFFFFFF)			RemoveDirectory(m_binDir);		SetCurrent(IDS_REMOVE_DIR, m_etcDir);		if(GetFileAttributes(m_etcDir) != 0xFFFFFFFF)			RemoveDirectory(m_etcDir);		SetCurrent(IDS_REMOVE_DIR, m_targetDir);		if(GetFileAttributes(m_targetDir) != 0xFFFFFFFF)			RemoveDirectory(m_targetDir);	}	if(uninstall)		SetItemStatus(IDC_CREATE_DIR, TRUE);}void CBINDInstallDlg::CopyFiles(){	CString destFile;	for(int i = 0; installFiles[i].filename; i++)	{		SetCurrent(IDS_COPY_FILE, installFiles[i].filename);		destFile = DestDir(installFiles[i].destination) + "\\" + installFiles[i].filename;		CString filespec = m_currentDir + "\\" + installFiles[i].filename;		CVersionInfo bindFile(destFile);		/* This file doesn't have to exist */				CVersionInfo origFile(filespec);		if(!origFile.IsValid() && installFiles[i].checkVer)		{			if(MsgBox(IDS_FILE_BAD, MB_YESNO, installFiles[i].filename) == IDNO)				throw(Exception(IDS_ERR_COPY_FILE, installFiles[i].filename, GetErrMessage()));		}				try		{/* Ignore Version checking.  We need to make sure that all files get copied regardless   of whether or not they are earlier or later versions since we cannot guarantee   that we have either backward or forward compatibility between versions.*/			bindFile.CopyFileNoVersion(origFile);		}		catch(...)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -