xref: /minix3/external/bsd/bind/dist/bin/win32/BINDInstall/BINDInstallDlg.cpp (revision 00b67f09dd46474d133c95011a48590a8e8f94c7)
1*00b67f09SDavid van Moolenbroek /*
2*00b67f09SDavid van Moolenbroek  * Portions Copyright (C) 2004-2010, 2013, 2014  Internet Systems Consortium, Inc. ("ISC")
3*00b67f09SDavid van Moolenbroek  * Portions Copyright (C) 2001, 2003  Internet Software Consortium.
4*00b67f09SDavid van Moolenbroek  *
5*00b67f09SDavid van Moolenbroek  * Permission to use, copy, modify, and/or distribute this software for any
6*00b67f09SDavid van Moolenbroek  * purpose with or without fee is hereby granted, provided that the above
7*00b67f09SDavid van Moolenbroek  * copyright notice and this permission notice appear in all copies.
8*00b67f09SDavid van Moolenbroek  *
9*00b67f09SDavid van Moolenbroek  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
10*00b67f09SDavid van Moolenbroek  * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
11*00b67f09SDavid van Moolenbroek  * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
12*00b67f09SDavid van Moolenbroek  * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
13*00b67f09SDavid van Moolenbroek  * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
14*00b67f09SDavid van Moolenbroek  * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
15*00b67f09SDavid van Moolenbroek  * PERFORMANCE OF THIS SOFTWARE.
16*00b67f09SDavid van Moolenbroek  */
17*00b67f09SDavid van Moolenbroek 
18*00b67f09SDavid van Moolenbroek /* Id: BINDInstallDlg.cpp,v 1.48 2010/01/07 23:48:54 tbox Exp  */
19*00b67f09SDavid van Moolenbroek 
20*00b67f09SDavid van Moolenbroek /*
21*00b67f09SDavid van Moolenbroek  * Copyright (c) 1999-2000 by Nortel Networks Corporation
22*00b67f09SDavid van Moolenbroek  *
23*00b67f09SDavid van Moolenbroek  * Permission to use, copy, modify, and distribute this software for any
24*00b67f09SDavid van Moolenbroek  * purpose with or without fee is hereby granted, provided that the above
25*00b67f09SDavid van Moolenbroek  * copyright notice and this permission notice appear in all copies.
26*00b67f09SDavid van Moolenbroek  *
27*00b67f09SDavid van Moolenbroek  * THE SOFTWARE IS PROVIDED "AS IS" AND NORTEL NETWORKS DISCLAIMS
28*00b67f09SDavid van Moolenbroek  * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
29*00b67f09SDavid van Moolenbroek  * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NORTEL NETWORKS
30*00b67f09SDavid van Moolenbroek  * BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES
31*00b67f09SDavid van Moolenbroek  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
32*00b67f09SDavid van Moolenbroek  * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
33*00b67f09SDavid van Moolenbroek  * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
34*00b67f09SDavid van Moolenbroek  * SOFTWARE.
35*00b67f09SDavid van Moolenbroek  */
36*00b67f09SDavid van Moolenbroek 
37*00b67f09SDavid van Moolenbroek /*
38*00b67f09SDavid van Moolenbroek  * Define this to make a standalone installer that will copy msvcrt.dll
39*00b67f09SDavid van Moolenbroek  * and/or msvcrtd.dll during the install
40*00b67f09SDavid van Moolenbroek  */
41*00b67f09SDavid van Moolenbroek // #define BINARIES_INSTALL
42*00b67f09SDavid van Moolenbroek 
43*00b67f09SDavid van Moolenbroek /*
44*00b67f09SDavid van Moolenbroek  * msvcrt.dll is the release c-runtime library for MSVC.  msvcrtd.dll
45*00b67f09SDavid van Moolenbroek  * is the debug c-runtime library for MSVC.  If you have debug
46*00b67f09SDavid van Moolenbroek  * binaries you want to have DEBUG_BINARIES defined.  If you have
47*00b67f09SDavid van Moolenbroek  * release binaries you want to have RELEASE_BINARIES defined.
48*00b67f09SDavid van Moolenbroek  * If you have both, then define them both.
49*00b67f09SDavid van Moolenbroek  * Of course, you need msvcrt[d].dll present to install it!
50*00b67f09SDavid van Moolenbroek  */
51*00b67f09SDavid van Moolenbroek #ifdef BINARIES_INSTALL
52*00b67f09SDavid van Moolenbroek // #  define DEBUG_BINARIES
53*00b67f09SDavid van Moolenbroek // #  define RELEASE_BINARIES
54*00b67f09SDavid van Moolenbroek #endif
55*00b67f09SDavid van Moolenbroek 
56*00b67f09SDavid van Moolenbroek #include "stdafx.h"
57*00b67f09SDavid van Moolenbroek #include "BINDInstall.h"
58*00b67f09SDavid van Moolenbroek #include "BINDInstallDlg.h"
59*00b67f09SDavid van Moolenbroek #include "DirBrowse.h"
60*00b67f09SDavid van Moolenbroek #include <winsvc.h>
61*00b67f09SDavid van Moolenbroek #include <shlobj.h>
62*00b67f09SDavid van Moolenbroek #include <named/ntservice.h>
63*00b67f09SDavid van Moolenbroek #include <isc/bind_registry.h>
64*00b67f09SDavid van Moolenbroek #include <isc/ntgroups.h>
65*00b67f09SDavid van Moolenbroek #include <direct.h>
66*00b67f09SDavid van Moolenbroek #include "AccountInfo.h"
67*00b67f09SDavid van Moolenbroek #include "versioninfo.h"
68*00b67f09SDavid van Moolenbroek 
69*00b67f09SDavid van Moolenbroek #include <config.h>
70*00b67f09SDavid van Moolenbroek 
71*00b67f09SDavid van Moolenbroek #define MAX_GROUPS	100
72*00b67f09SDavid van Moolenbroek #define MAX_PRIVS	 50
73*00b67f09SDavid van Moolenbroek 
74*00b67f09SDavid van Moolenbroek #define LOCAL_SERVICE "NT AUTHORITY\\LocalService"
75*00b67f09SDavid van Moolenbroek 
76*00b67f09SDavid van Moolenbroek #ifdef _DEBUG
77*00b67f09SDavid van Moolenbroek #define new DEBUG_NEW
78*00b67f09SDavid van Moolenbroek #undef THIS_FILE
79*00b67f09SDavid van Moolenbroek static char THIS_FILE[] = __FILE__;
80*00b67f09SDavid van Moolenbroek #endif
81*00b67f09SDavid van Moolenbroek 
82*00b67f09SDavid van Moolenbroek typedef struct _xexception
83*00b67f09SDavid van Moolenbroek {
84*00b67f09SDavid van Moolenbroek 	_xexception(UINT string, ...);
85*00b67f09SDavid van Moolenbroek 
86*00b67f09SDavid van Moolenbroek 	CString resString;
87*00b67f09SDavid van Moolenbroek } Exception;
88*00b67f09SDavid van Moolenbroek 
_xexception(UINT string,...)89*00b67f09SDavid van Moolenbroek _xexception::_xexception(UINT string, ...)
90*00b67f09SDavid van Moolenbroek {
91*00b67f09SDavid van Moolenbroek 	CString format;
92*00b67f09SDavid van Moolenbroek 	va_list va;
93*00b67f09SDavid van Moolenbroek 
94*00b67f09SDavid van Moolenbroek 	format.LoadString(string);
95*00b67f09SDavid van Moolenbroek 
96*00b67f09SDavid van Moolenbroek 	va_start(va, string);
97*00b67f09SDavid van Moolenbroek 	resString.FormatV(format, va);
98*00b67f09SDavid van Moolenbroek 	va_end(va);
99*00b67f09SDavid van Moolenbroek }
100*00b67f09SDavid van Moolenbroek 
101*00b67f09SDavid van Moolenbroek typedef struct _filedata {
102*00b67f09SDavid van Moolenbroek 	enum FileDestinations {TargetDir, BinDir, EtcDir, WinSystem};
103*00b67f09SDavid van Moolenbroek 	enum FileImportance {Trivial, Normal, Critical};
104*00b67f09SDavid van Moolenbroek 
105*00b67f09SDavid van Moolenbroek 	char *filename;
106*00b67f09SDavid van Moolenbroek 	int destination;
107*00b67f09SDavid van Moolenbroek 	int importance;
108*00b67f09SDavid van Moolenbroek 	BOOL checkVer;
109*00b67f09SDavid van Moolenbroek 	BOOL withTools;
110*00b67f09SDavid van Moolenbroek } FileData;
111*00b67f09SDavid van Moolenbroek 
112*00b67f09SDavid van Moolenbroek const FileData installFiles[] =
113*00b67f09SDavid van Moolenbroek {
114*00b67f09SDavid van Moolenbroek #ifdef BINARIES_INSTALL
115*00b67f09SDavid van Moolenbroek #  ifdef DEBUG_BINARIES
116*00b67f09SDavid van Moolenbroek 	{"msvcrtd.dll", FileData::WinSystem, FileData::Critical, TRUE, TRUE},
117*00b67f09SDavid van Moolenbroek #  endif
118*00b67f09SDavid van Moolenbroek #  ifdef RELEASE_BINARIES
119*00b67f09SDavid van Moolenbroek 	{"msvcrt.dll", FileData::WinSystem, FileData::Critical, TRUE, TRUE},
120*00b67f09SDavid van Moolenbroek #  endif
121*00b67f09SDavid van Moolenbroek #endif
122*00b67f09SDavid van Moolenbroek #if _MSC_VER < 1400
123*00b67f09SDavid van Moolenbroek #if _MSC_VER >= 1310
124*00b67f09SDavid van Moolenbroek 	{"mfc71.dll", FileData::WinSystem, FileData::Critical, TRUE, TRUE},
125*00b67f09SDavid van Moolenbroek 	{"msvcr71.dll", FileData::WinSystem, FileData::Critical, TRUE, TRUE},
126*00b67f09SDavid van Moolenbroek #elif _MSC_VER > 1200 && _MSC_VER < 1310
127*00b67f09SDavid van Moolenbroek 	{"mfc70.dll", FileData::WinSystem, FileData::Critical, TRUE, TRUE},
128*00b67f09SDavid van Moolenbroek 	{"msvcr70.dll", FileData::WinSystem, FileData::Critical, TRUE, TRUE},
129*00b67f09SDavid van Moolenbroek #endif
130*00b67f09SDavid van Moolenbroek #endif
131*00b67f09SDavid van Moolenbroek 	{"bindevt.dll", FileData::BinDir, FileData::Normal, FALSE, TRUE},
132*00b67f09SDavid van Moolenbroek 	{"libbind9.dll", FileData::BinDir, FileData::Critical, FALSE, TRUE},
133*00b67f09SDavid van Moolenbroek 	{"libisc.dll", FileData::BinDir, FileData::Critical, FALSE, TRUE},
134*00b67f09SDavid van Moolenbroek 	{"libisccfg.dll", FileData::BinDir, FileData::Critical, FALSE, TRUE},
135*00b67f09SDavid van Moolenbroek 	{"libisccc.dll", FileData::BinDir, FileData::Critical, FALSE, TRUE},
136*00b67f09SDavid van Moolenbroek 	{"libdns.dll", FileData::BinDir, FileData::Critical, FALSE, TRUE},
137*00b67f09SDavid van Moolenbroek 	{"liblwres.dll", FileData::BinDir, FileData::Critical, FALSE, TRUE},
138*00b67f09SDavid van Moolenbroek 	{"libirs.dll", FileData::BinDir, FileData::Critical, FALSE, TRUE},
139*00b67f09SDavid van Moolenbroek #ifdef OPENSSL
140*00b67f09SDavid van Moolenbroek 	{"libeay32.dll", FileData::BinDir, FileData::Critical, FALSE, TRUE},
141*00b67f09SDavid van Moolenbroek #endif
142*00b67f09SDavid van Moolenbroek #ifdef HAVE_LIBXML2
143*00b67f09SDavid van Moolenbroek 	{"libxml2.dll", FileData::BinDir, FileData::Critical, FALSE, TRUE},
144*00b67f09SDavid van Moolenbroek #endif
145*00b67f09SDavid van Moolenbroek #ifdef USE_GSSAPI
146*00b67f09SDavid van Moolenbroek #ifndef _WIN64
147*00b67f09SDavid van Moolenbroek 	{"gssapi32.dll", FileData::BinDir, FileData::Critical, FALSE, TRUE},
148*00b67f09SDavid van Moolenbroek 	{"krb5_32.dll", FileData::BinDir, FileData::Critical, FALSE, TRUE},
149*00b67f09SDavid van Moolenbroek #else
150*00b67f09SDavid van Moolenbroek 	{"gssapi64.dll", FileData::BinDir, FileData::Critical, FALSE, TRUE},
151*00b67f09SDavid van Moolenbroek 	{"krb5_64.dll", FileData::BinDir, FileData::Critical, FALSE, TRUE},
152*00b67f09SDavid van Moolenbroek #endif
153*00b67f09SDavid van Moolenbroek #endif
154*00b67f09SDavid van Moolenbroek #ifdef HAVE_GEOIP
155*00b67f09SDavid van Moolenbroek 	{"libgeoip.dll", FileData::BinDir, FileData::Critical, FALSE, TRUE},
156*00b67f09SDavid van Moolenbroek #endif
157*00b67f09SDavid van Moolenbroek #ifdef WITH_IDN
158*00b67f09SDavid van Moolenbroek 	{"idnkit.dll", FileData::BinDir, FileData::Critical, FALSE, TRUE},
159*00b67f09SDavid van Moolenbroek 	{"iconv.dll", FileData::BinDir, FileData::Critical, FALSE, TRUE},
160*00b67f09SDavid van Moolenbroek #endif
161*00b67f09SDavid van Moolenbroek 	{"named.exe", FileData::BinDir, FileData::Critical, FALSE, FALSE},
162*00b67f09SDavid van Moolenbroek 	{"nsupdate.exe", FileData::BinDir, FileData::Normal, FALSE, TRUE},
163*00b67f09SDavid van Moolenbroek 	{"BINDInstall.exe", FileData::BinDir, FileData::Normal, FALSE, TRUE},
164*00b67f09SDavid van Moolenbroek 	{"rndc.exe", FileData::BinDir, FileData::Normal, FALSE, FALSE},
165*00b67f09SDavid van Moolenbroek 	{"dig.exe", FileData::BinDir, FileData::Normal, FALSE, TRUE},
166*00b67f09SDavid van Moolenbroek 	{"host.exe", FileData::BinDir, FileData::Normal, FALSE, TRUE},
167*00b67f09SDavid van Moolenbroek 	{"nslookup.exe", FileData::BinDir, FileData::Normal, FALSE, TRUE},
168*00b67f09SDavid van Moolenbroek 	{"delv.exe", FileData::BinDir, FileData::Normal, FALSE, TRUE},
169*00b67f09SDavid van Moolenbroek 	{"arpaname.exe", FileData::BinDir, FileData::Normal, FALSE, TRUE},
170*00b67f09SDavid van Moolenbroek 	{"nsec3hash.exe", FileData::BinDir, FileData::Normal, FALSE, FALSE},
171*00b67f09SDavid van Moolenbroek 	{"genrandom.exe", FileData::BinDir, FileData::Normal, FALSE, FALSE},
172*00b67f09SDavid van Moolenbroek 	{"rndc-confgen.exe", FileData::BinDir, FileData::Normal, FALSE, FALSE},
173*00b67f09SDavid van Moolenbroek 	{"ddns-confgen.exe", FileData::BinDir, FileData::Normal, FALSE, FALSE},
174*00b67f09SDavid van Moolenbroek 	{"tsig-keygen.exe", FileData::BinDir, FileData::Normal, FALSE, FALSE},
175*00b67f09SDavid van Moolenbroek 	{"dnssec-keygen.exe", FileData::BinDir, FileData::Normal, FALSE, FALSE},
176*00b67f09SDavid van Moolenbroek 	{"dnssec-signzone.exe", FileData::BinDir, FileData::Normal, FALSE, FALSE},
177*00b67f09SDavid van Moolenbroek 	{"dnssec-dsfromkey.exe", FileData::BinDir, FileData::Normal, FALSE, FALSE},
178*00b67f09SDavid van Moolenbroek 	{"dnssec-importkey.exe", FileData::BinDir, FileData::Normal, FALSE, FALSE},
179*00b67f09SDavid van Moolenbroek 	{"dnssec-keyfromlabel.exe", FileData::BinDir, FileData::Normal, FALSE, FALSE},
180*00b67f09SDavid van Moolenbroek 	{"dnssec-revoke.exe", FileData::BinDir, FileData::Normal, FALSE, FALSE},
181*00b67f09SDavid van Moolenbroek 	{"dnssec-settime.exe", FileData::BinDir, FileData::Normal, FALSE, FALSE},
182*00b67f09SDavid van Moolenbroek 	{"dnssec-verify.exe", FileData::BinDir, FileData::Normal, FALSE, FALSE},
183*00b67f09SDavid van Moolenbroek 	{"named-checkconf.exe", FileData::BinDir, FileData::Normal, FALSE, FALSE},
184*00b67f09SDavid van Moolenbroek 	{"named-checkzone.exe", FileData::BinDir, FileData::Normal, FALSE, FALSE},
185*00b67f09SDavid van Moolenbroek 	{"named-compilezone.exe", FileData::BinDir, FileData::Normal, FALSE, FALSE},
186*00b67f09SDavid van Moolenbroek 	{"named-journalprint.exe", FileData::BinDir, FileData::Normal, FALSE, FALSE},
187*00b67f09SDavid van Moolenbroek 	{"named-rrchecker.exe", FileData::BinDir, FileData::Normal, FALSE, FALSE},
188*00b67f09SDavid van Moolenbroek 	{"isc-hmax-fixup.exe", FileData::BinDir, FileData::Normal, FALSE, FALSE},
189*00b67f09SDavid van Moolenbroek #ifdef USE_PKCS11
190*00b67f09SDavid van Moolenbroek 	{"pkcs11-destroy.exe", FileData::BinDir, FileData::Normal, FALSE, FALSE},
191*00b67f09SDavid van Moolenbroek 	{"pkcs11-keygen.exe", FileData::BinDir, FileData::Normal, FALSE, FALSE},
192*00b67f09SDavid van Moolenbroek 	{"pkcs11-list.exe", FileData::BinDir, FileData::Normal, FALSE, FALSE},
193*00b67f09SDavid van Moolenbroek 	{"pkcs11-tokens.exe", FileData::BinDir, FileData::Normal, FALSE, FALSE},
194*00b67f09SDavid van Moolenbroek #endif
195*00b67f09SDavid van Moolenbroek #ifdef USE_PYTHON
196*00b67f09SDavid van Moolenbroek 	{"dnssec-checkds.py", FileData::BinDir, FileData::Normal, FALSE, FALSE},
197*00b67f09SDavid van Moolenbroek 	{"dnssec-coverage.py", FileData::BinDir, FileData::Normal, FALSE, FALSE},
198*00b67f09SDavid van Moolenbroek #endif
199*00b67f09SDavid van Moolenbroek 	{"readme1st.txt", FileData::BinDir, FileData::Trivial, FALSE, TRUE},
200*00b67f09SDavid van Moolenbroek 	{NULL, -1, -1}
201*00b67f09SDavid van Moolenbroek };
202*00b67f09SDavid van Moolenbroek 
203*00b67f09SDavid van Moolenbroek /////////////////////////////////////////////////////////////////////////////
204*00b67f09SDavid van Moolenbroek // CBINDInstallDlg dialog
205*00b67f09SDavid van Moolenbroek 
CBINDInstallDlg(CWnd * pParent)206*00b67f09SDavid van Moolenbroek CBINDInstallDlg::CBINDInstallDlg(CWnd* pParent /*=NULL*/)
207*00b67f09SDavid van Moolenbroek 	: CDialog(CBINDInstallDlg::IDD, pParent) {
208*00b67f09SDavid van Moolenbroek 	char winsys[MAX_PATH];
209*00b67f09SDavid van Moolenbroek 	char progfiles[MAX_PATH];
210*00b67f09SDavid van Moolenbroek 
211*00b67f09SDavid van Moolenbroek 	//{{AFX_DATA_INIT(CBINDInstallDlg)
212*00b67f09SDavid van Moolenbroek 	m_targetDir = _T("");
213*00b67f09SDavid van Moolenbroek 	m_version = _T("");
214*00b67f09SDavid van Moolenbroek 	m_toolsOnly = FALSE;
215*00b67f09SDavid van Moolenbroek 	m_autoStart = FALSE;
216*00b67f09SDavid van Moolenbroek 	m_keepFiles = FALSE;
217*00b67f09SDavid van Moolenbroek 	m_current = _T("");
218*00b67f09SDavid van Moolenbroek 	m_startOnInstall = FALSE;
219*00b67f09SDavid van Moolenbroek 	m_accountName = _T("");
220*00b67f09SDavid van Moolenbroek 	m_accountPassword = _T("");
221*00b67f09SDavid van Moolenbroek 	m_accountName = _T("");
222*00b67f09SDavid van Moolenbroek 	//}}AFX_DATA_INIT
223*00b67f09SDavid van Moolenbroek 	// Note that LoadIcon does not require a subsequent
224*00b67f09SDavid van Moolenbroek 	// DestroyIcon in Win32
225*00b67f09SDavid van Moolenbroek 	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
226*00b67f09SDavid van Moolenbroek 
227*00b67f09SDavid van Moolenbroek 	GetSystemDirectory(winsys, MAX_PATH);
228*00b67f09SDavid van Moolenbroek 	m_winSysDir = winsys;
229*00b67f09SDavid van Moolenbroek 
230*00b67f09SDavid van Moolenbroek #ifndef _WIN64
231*00b67f09SDavid van Moolenbroek 	SHGetFolderPath(NULL, CSIDL_FLAG_CREATE|CSIDL_PROGRAM_FILESX86,
232*00b67f09SDavid van Moolenbroek 			NULL, SHGFP_TYPE_CURRENT, progfiles);
233*00b67f09SDavid van Moolenbroek #else
234*00b67f09SDavid van Moolenbroek 	SHGetFolderPath(NULL, CSIDL_FLAG_CREATE|CSIDL_PROGRAM_FILES,
235*00b67f09SDavid van Moolenbroek 			NULL, SHGFP_TYPE_CURRENT, progfiles);
236*00b67f09SDavid van Moolenbroek #endif
237*00b67f09SDavid van Moolenbroek 
238*00b67f09SDavid van Moolenbroek 	m_defaultDir = progfiles;
239*00b67f09SDavid van Moolenbroek 	m_defaultDir += "\\ISC BIND 9";
240*00b67f09SDavid van Moolenbroek 	m_installed = FALSE;
241*00b67f09SDavid van Moolenbroek 	m_accountExists = FALSE;
242*00b67f09SDavid van Moolenbroek 	m_accountUsed = FALSE;
243*00b67f09SDavid van Moolenbroek 	m_serviceExists = TRUE;
244*00b67f09SDavid van Moolenbroek 	GetCurrentServiceAccountName();
245*00b67f09SDavid van Moolenbroek 	m_currentAccount = m_accountName;
246*00b67f09SDavid van Moolenbroek 	if (m_accountName == "") {
247*00b67f09SDavid van Moolenbroek 		m_accountName = "named";
248*00b67f09SDavid van Moolenbroek 	}
249*00b67f09SDavid van Moolenbroek }
250*00b67f09SDavid van Moolenbroek 
DoDataExchange(CDataExchange * pDX)251*00b67f09SDavid van Moolenbroek void CBINDInstallDlg::DoDataExchange(CDataExchange* pDX) {
252*00b67f09SDavid van Moolenbroek 	CDialog::DoDataExchange(pDX);
253*00b67f09SDavid van Moolenbroek 	//{{AFX_DATA_MAP(CBINDInstallDlg)
254*00b67f09SDavid van Moolenbroek 	DDX_Text(pDX, IDC_TARGETDIR, m_targetDir);
255*00b67f09SDavid van Moolenbroek 	DDX_Text(pDX, IDC_VERSION, m_version);
256*00b67f09SDavid van Moolenbroek 	DDX_Text(pDX, IDC_ACCOUNT_NAME, m_accountName);
257*00b67f09SDavid van Moolenbroek 	DDX_Text(pDX, IDC_ACCOUNT_PASSWORD, m_accountPassword);
258*00b67f09SDavid van Moolenbroek 	DDX_Text(pDX, IDC_ACCOUNT_PASSWORD_CONFIRM, m_accountPasswordConfirm);
259*00b67f09SDavid van Moolenbroek 	DDX_Check(pDX, IDC_TOOLS_ONLY, m_toolsOnly);
260*00b67f09SDavid van Moolenbroek 	DDX_Check(pDX, IDC_AUTO_START, m_autoStart);
261*00b67f09SDavid van Moolenbroek 	DDX_Check(pDX, IDC_KEEP_FILES, m_keepFiles);
262*00b67f09SDavid van Moolenbroek 	DDX_Text(pDX, IDC_CURRENT, m_current);
263*00b67f09SDavid van Moolenbroek 	DDX_Check(pDX, IDC_START, m_startOnInstall);
264*00b67f09SDavid van Moolenbroek 	//}}AFX_DATA_MAP
265*00b67f09SDavid van Moolenbroek }
266*00b67f09SDavid van Moolenbroek 
BEGIN_MESSAGE_MAP(CBINDInstallDlg,CDialog)267*00b67f09SDavid van Moolenbroek BEGIN_MESSAGE_MAP(CBINDInstallDlg, CDialog)
268*00b67f09SDavid van Moolenbroek 	//{{AFX_MSG_MAP(CBINDInstallDlg)
269*00b67f09SDavid van Moolenbroek 	ON_WM_PAINT()
270*00b67f09SDavid van Moolenbroek 	ON_WM_QUERYDRAGICON()
271*00b67f09SDavid van Moolenbroek 	ON_BN_CLICKED(IDC_BROWSE, OnBrowse)
272*00b67f09SDavid van Moolenbroek 	ON_BN_CLICKED(IDC_INSTALL, OnInstall)
273*00b67f09SDavid van Moolenbroek 	ON_BN_CLICKED(IDC_EXIT, OnExit)
274*00b67f09SDavid van Moolenbroek 	ON_BN_CLICKED(IDC_UNINSTALL, OnUninstall)
275*00b67f09SDavid van Moolenbroek 	//}}AFX_MSG_MAP
276*00b67f09SDavid van Moolenbroek END_MESSAGE_MAP()
277*00b67f09SDavid van Moolenbroek 
278*00b67f09SDavid van Moolenbroek /////////////////////////////////////////////////////////////////////////////
279*00b67f09SDavid van Moolenbroek // CBINDInstallDlg message handlers
280*00b67f09SDavid van Moolenbroek 
281*00b67f09SDavid van Moolenbroek BOOL CBINDInstallDlg::OnInitDialog() {
282*00b67f09SDavid van Moolenbroek 	CDialog::OnInitDialog();
283*00b67f09SDavid van Moolenbroek 
284*00b67f09SDavid van Moolenbroek 	// Set the icon for this dialog.  The framework does this automatically
285*00b67f09SDavid van Moolenbroek 	//  when the application's main window is not a dialog
286*00b67f09SDavid van Moolenbroek 	SetIcon(m_hIcon, TRUE);			// Set big icon
287*00b67f09SDavid van Moolenbroek 	SetIcon(m_hIcon, FALSE);		// Set small icon
288*00b67f09SDavid van Moolenbroek 
289*00b67f09SDavid van Moolenbroek 	char filename[MAX_PATH];
290*00b67f09SDavid van Moolenbroek 	char dirname[MAX_PATH];
291*00b67f09SDavid van Moolenbroek 	char *fptr = &filename[0];
292*00b67f09SDavid van Moolenbroek 	GetModuleFileName(NULL, filename, MAX_PATH);
293*00b67f09SDavid van Moolenbroek 	char *dptr = strrchr(filename,'\\');
294*00b67f09SDavid van Moolenbroek 	size_t index = dptr - fptr;
295*00b67f09SDavid van Moolenbroek 	strncpy(dirname, filename, index);
296*00b67f09SDavid van Moolenbroek 	dirname[index] = '\0';
297*00b67f09SDavid van Moolenbroek 	CString Dirname(dirname);
298*00b67f09SDavid van Moolenbroek 	m_currentDir = Dirname;
299*00b67f09SDavid van Moolenbroek 
300*00b67f09SDavid van Moolenbroek 	CVersionInfo bindInst(filename);
301*00b67f09SDavid van Moolenbroek 	if(bindInst.IsValid())
302*00b67f09SDavid van Moolenbroek 		m_version.Format(IDS_VERSION, bindInst.GetFileVersionString());
303*00b67f09SDavid van Moolenbroek 	else
304*00b67f09SDavid van Moolenbroek 		m_version.LoadString(IDS_NO_VERSION);
305*00b67f09SDavid van Moolenbroek 
306*00b67f09SDavid van Moolenbroek 	DWORD dwBufLen = MAX_PATH;
307*00b67f09SDavid van Moolenbroek 	char buf[MAX_PATH];
308*00b67f09SDavid van Moolenbroek 	HKEY hKey;
309*00b67f09SDavid van Moolenbroek 
310*00b67f09SDavid van Moolenbroek 	m_startOnInstall = CheckBINDService();
311*00b67f09SDavid van Moolenbroek 
312*00b67f09SDavid van Moolenbroek 	/* See if we are installed already */
313*00b67f09SDavid van Moolenbroek 	if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, BIND_SUBKEY, 0, KEY_READ, &hKey)
314*00b67f09SDavid van Moolenbroek 			== ERROR_SUCCESS) {
315*00b67f09SDavid van Moolenbroek 		m_installed = TRUE;
316*00b67f09SDavid van Moolenbroek 		memset(buf, 0, MAX_PATH);
317*00b67f09SDavid van Moolenbroek 		// Get the install directory
318*00b67f09SDavid van Moolenbroek 		if (RegQueryValueEx(hKey, "InstallDir", NULL, NULL, (LPBYTE)buf,
319*00b67f09SDavid van Moolenbroek 			&dwBufLen) == ERROR_SUCCESS)
320*00b67f09SDavid van Moolenbroek 			if (strcmp(buf, ""))
321*00b67f09SDavid van Moolenbroek 				m_defaultDir = buf;
322*00b67f09SDavid van Moolenbroek 
323*00b67f09SDavid van Moolenbroek 		RegCloseKey(hKey);
324*00b67f09SDavid van Moolenbroek 	}
325*00b67f09SDavid van Moolenbroek 	m_targetDir = m_defaultDir;
326*00b67f09SDavid van Moolenbroek 
327*00b67f09SDavid van Moolenbroek 	// Set checkbox defaults
328*00b67f09SDavid van Moolenbroek 	m_autoStart = TRUE;
329*00b67f09SDavid van Moolenbroek 	m_keepFiles = TRUE;
330*00b67f09SDavid van Moolenbroek 
331*00b67f09SDavid van Moolenbroek 	UpdateData(FALSE);
332*00b67f09SDavid van Moolenbroek 
333*00b67f09SDavid van Moolenbroek 	return (TRUE); /* return(TRUE) unless you set the focus to a control */
334*00b67f09SDavid van Moolenbroek }
335*00b67f09SDavid van Moolenbroek 
336*00b67f09SDavid van Moolenbroek /*
337*00b67f09SDavid van Moolenbroek  *  If you add a minimize button to your dialog, you will need the code below
338*00b67f09SDavid van Moolenbroek  *  to draw the icon.  For MFC applications using the document/view model,
339*00b67f09SDavid van Moolenbroek  *  this is automatically done for you by the framework.
340*00b67f09SDavid van Moolenbroek  */
341*00b67f09SDavid van Moolenbroek 
OnPaint()342*00b67f09SDavid van Moolenbroek void CBINDInstallDlg::OnPaint() {
343*00b67f09SDavid van Moolenbroek 	if (IsIconic())	{
344*00b67f09SDavid van Moolenbroek 		CPaintDC dc(this); // device context for painting
345*00b67f09SDavid van Moolenbroek 
346*00b67f09SDavid van Moolenbroek 		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
347*00b67f09SDavid van Moolenbroek 
348*00b67f09SDavid van Moolenbroek 		// Center icon in client rectangle
349*00b67f09SDavid van Moolenbroek 		int cxIcon = GetSystemMetrics(SM_CXICON);
350*00b67f09SDavid van Moolenbroek 		int cyIcon = GetSystemMetrics(SM_CYICON);
351*00b67f09SDavid van Moolenbroek 		CRect rect;
352*00b67f09SDavid van Moolenbroek 		GetClientRect(&rect);
353*00b67f09SDavid van Moolenbroek 		int x = (rect.Width() - cxIcon + 1) / 2;
354*00b67f09SDavid van Moolenbroek 		int y = (rect.Height() - cyIcon + 1) / 2;
355*00b67f09SDavid van Moolenbroek 
356*00b67f09SDavid van Moolenbroek 		// Draw the icon
357*00b67f09SDavid van Moolenbroek 		dc.DrawIcon(x, y, m_hIcon);
358*00b67f09SDavid van Moolenbroek 	}
359*00b67f09SDavid van Moolenbroek 	else {
360*00b67f09SDavid van Moolenbroek 		CDialog::OnPaint();
361*00b67f09SDavid van Moolenbroek 	}
362*00b67f09SDavid van Moolenbroek }
363*00b67f09SDavid van Moolenbroek 
364*00b67f09SDavid van Moolenbroek // The system calls this to obtain the cursor to display while the user drags
365*00b67f09SDavid van Moolenbroek //  the minimized window.
OnQueryDragIcon()366*00b67f09SDavid van Moolenbroek HCURSOR CBINDInstallDlg::OnQueryDragIcon() {
367*00b67f09SDavid van Moolenbroek 	return((HCURSOR)m_hIcon);
368*00b67f09SDavid van Moolenbroek }
369*00b67f09SDavid van Moolenbroek 
OnBrowse()370*00b67f09SDavid van Moolenbroek void CBINDInstallDlg::OnBrowse() {
371*00b67f09SDavid van Moolenbroek 
372*00b67f09SDavid van Moolenbroek 	CDirBrowse browse;
373*00b67f09SDavid van Moolenbroek 
374*00b67f09SDavid van Moolenbroek 	if (browse.DoModal() == IDOK) 	{
375*00b67f09SDavid van Moolenbroek 		//m_targetDir = browse.m_selectedDir;
376*00b67f09SDavid van Moolenbroek 		UpdateData(FALSE);
377*00b67f09SDavid van Moolenbroek 	}
378*00b67f09SDavid van Moolenbroek }
379*00b67f09SDavid van Moolenbroek 
380*00b67f09SDavid van Moolenbroek /*
381*00b67f09SDavid van Moolenbroek  * User pressed the exit button
382*00b67f09SDavid van Moolenbroek  */
OnExit()383*00b67f09SDavid van Moolenbroek void CBINDInstallDlg::OnExit() {
384*00b67f09SDavid van Moolenbroek 	EndDialog(0);
385*00b67f09SDavid van Moolenbroek }
386*00b67f09SDavid van Moolenbroek 
387*00b67f09SDavid van Moolenbroek /*
388*00b67f09SDavid van Moolenbroek  * User pressed the uninstall button.  Make it go.
389*00b67f09SDavid van Moolenbroek  */
OnUninstall()390*00b67f09SDavid van Moolenbroek void CBINDInstallDlg::OnUninstall() {
391*00b67f09SDavid van Moolenbroek 	UpdateData();
392*00b67f09SDavid van Moolenbroek 
393*00b67f09SDavid van Moolenbroek 	if (MsgBox(IDS_UNINSTALL, MB_YESNO) == IDYES) {
394*00b67f09SDavid van Moolenbroek 		if (CheckBINDService())
395*00b67f09SDavid van Moolenbroek 			StopBINDService();
396*00b67f09SDavid van Moolenbroek 
397*00b67f09SDavid van Moolenbroek 		SC_HANDLE hSCManager = OpenSCManager(NULL, NULL,
398*00b67f09SDavid van Moolenbroek 					SC_MANAGER_ALL_ACCESS);
399*00b67f09SDavid van Moolenbroek 		if (!hSCManager) {
400*00b67f09SDavid van Moolenbroek 			MsgBox(IDS_ERR_OPEN_SCM, GetErrMessage());
401*00b67f09SDavid van Moolenbroek 			return;
402*00b67f09SDavid van Moolenbroek 		}
403*00b67f09SDavid van Moolenbroek 
404*00b67f09SDavid van Moolenbroek 		SC_HANDLE hService = OpenService(hSCManager, BIND_SERVICE_NAME,
405*00b67f09SDavid van Moolenbroek 					      SERVICE_ALL_ACCESS);
406*00b67f09SDavid van Moolenbroek 		if (!hService && GetLastError() != ERROR_SERVICE_DOES_NOT_EXIST){
407*00b67f09SDavid van Moolenbroek 			MsgBox(IDS_ERR_OPEN_SERVICE, GetErrMessage());
408*00b67f09SDavid van Moolenbroek 			return;
409*00b67f09SDavid van Moolenbroek 		}
410*00b67f09SDavid van Moolenbroek 
411*00b67f09SDavid van Moolenbroek 		SERVICE_STATUS ss;
412*00b67f09SDavid van Moolenbroek 		QueryServiceStatus(hService, &ss);
413*00b67f09SDavid van Moolenbroek 		if (ss.dwCurrentState == SERVICE_RUNNING) {
414*00b67f09SDavid van Moolenbroek 			BOOL rc = ControlService(hService,
415*00b67f09SDavid van Moolenbroek 						 SERVICE_CONTROL_STOP, &ss);
416*00b67f09SDavid van Moolenbroek 			if (rc == FALSE || ss.dwCurrentState != SERVICE_STOPPED) {
417*00b67f09SDavid van Moolenbroek 				MsgBox(IDS_ERR_STOP_SERVICE, GetErrMessage());
418*00b67f09SDavid van Moolenbroek 				return;
419*00b67f09SDavid van Moolenbroek 			}
420*00b67f09SDavid van Moolenbroek 
421*00b67f09SDavid van Moolenbroek 		}
422*00b67f09SDavid van Moolenbroek 		CloseServiceHandle(hService);
423*00b67f09SDavid van Moolenbroek 		CloseServiceHandle(hSCManager);
424*00b67f09SDavid van Moolenbroek 
425*00b67f09SDavid van Moolenbroek 		// Directories
426*00b67f09SDavid van Moolenbroek 		m_etcDir = m_targetDir + "\\etc";
427*00b67f09SDavid van Moolenbroek 		m_binDir = m_targetDir + "\\bin";
428*00b67f09SDavid van Moolenbroek 
429*00b67f09SDavid van Moolenbroek 		UninstallTags();
430*00b67f09SDavid van Moolenbroek 		UnregisterMessages(TRUE);
431*00b67f09SDavid van Moolenbroek 		UnregisterService(TRUE);
432*00b67f09SDavid van Moolenbroek 		DeleteFiles(TRUE);
433*00b67f09SDavid van Moolenbroek 		if (m_keepFiles == FALSE)
434*00b67f09SDavid van Moolenbroek 			RemoveDirs(TRUE);
435*00b67f09SDavid van Moolenbroek 		else
436*00b67f09SDavid van Moolenbroek 			GetDlgItem(IDC_CREATE_DIR)->SetWindowText("Not Removed");
437*00b67f09SDavid van Moolenbroek 
438*00b67f09SDavid van Moolenbroek 
439*00b67f09SDavid van Moolenbroek 		// Delete registry keys for named
440*00b67f09SDavid van Moolenbroek 		RegDeleteKey(HKEY_LOCAL_MACHINE, BIND_SESSION_SUBKEY);
441*00b67f09SDavid van Moolenbroek 		RegDeleteKey(HKEY_LOCAL_MACHINE, BIND_SUBKEY);
442*00b67f09SDavid van Moolenbroek 		RegDeleteKey(HKEY_LOCAL_MACHINE, BIND_UNINSTALL_SUBKEY);
443*00b67f09SDavid van Moolenbroek 
444*00b67f09SDavid van Moolenbroek 		ProgramGroup(FALSE);
445*00b67f09SDavid van Moolenbroek 
446*00b67f09SDavid van Moolenbroek 		SetCurrent(IDS_UNINSTALL_DONE);
447*00b67f09SDavid van Moolenbroek 		MsgBox(IDS_UNINSTALL_DONE);
448*00b67f09SDavid van Moolenbroek 	}
449*00b67f09SDavid van Moolenbroek }
450*00b67f09SDavid van Moolenbroek 
451*00b67f09SDavid van Moolenbroek /*
452*00b67f09SDavid van Moolenbroek  * User pressed the install button.  Make it go.
453*00b67f09SDavid van Moolenbroek  */
OnInstall()454*00b67f09SDavid van Moolenbroek void CBINDInstallDlg::OnInstall() {
455*00b67f09SDavid van Moolenbroek #if _MSC_VER >= 1400
456*00b67f09SDavid van Moolenbroek 	char Vcredist_x86[MAX_PATH];
457*00b67f09SDavid van Moolenbroek #endif
458*00b67f09SDavid van Moolenbroek 	BOOL success = FALSE;
459*00b67f09SDavid van Moolenbroek 	int oldlen;
460*00b67f09SDavid van Moolenbroek 
461*00b67f09SDavid van Moolenbroek 	if (CheckBINDService())
462*00b67f09SDavid van Moolenbroek 		StopBINDService();
463*00b67f09SDavid van Moolenbroek 
464*00b67f09SDavid van Moolenbroek 	InstallTags();
465*00b67f09SDavid van Moolenbroek 
466*00b67f09SDavid van Moolenbroek 	UpdateData();
467*00b67f09SDavid van Moolenbroek 
468*00b67f09SDavid van Moolenbroek 	if (!m_toolsOnly && m_accountName != LOCAL_SERVICE) {
469*00b67f09SDavid van Moolenbroek 		/*
470*00b67f09SDavid van Moolenbroek 		 * Check that the Passwords entered match.
471*00b67f09SDavid van Moolenbroek 		 */
472*00b67f09SDavid van Moolenbroek 		if (m_accountPassword != m_accountPasswordConfirm) {
473*00b67f09SDavid van Moolenbroek 			MsgBox(IDS_ERR_PASSWORD);
474*00b67f09SDavid van Moolenbroek 			return;
475*00b67f09SDavid van Moolenbroek 		}
476*00b67f09SDavid van Moolenbroek 
477*00b67f09SDavid van Moolenbroek 		/*
478*00b67f09SDavid van Moolenbroek 		 * Check that there is not leading / trailing whitespace.
479*00b67f09SDavid van Moolenbroek 		 * This is for compatibility with the standard password dialog.
480*00b67f09SDavid van Moolenbroek 		 * Passwords really should be treated as opaque blobs.
481*00b67f09SDavid van Moolenbroek 		 */
482*00b67f09SDavid van Moolenbroek 		oldlen = m_accountPassword.GetLength();
483*00b67f09SDavid van Moolenbroek 		m_accountPassword.TrimLeft();
484*00b67f09SDavid van Moolenbroek 		m_accountPassword.TrimRight();
485*00b67f09SDavid van Moolenbroek 		if (m_accountPassword.GetLength() != oldlen) {
486*00b67f09SDavid van Moolenbroek 			MsgBox(IDS_ERR_WHITESPACE);
487*00b67f09SDavid van Moolenbroek 			return;
488*00b67f09SDavid van Moolenbroek 		}
489*00b67f09SDavid van Moolenbroek 
490*00b67f09SDavid van Moolenbroek 		/*
491*00b67f09SDavid van Moolenbroek 		 * Check the entered account name.
492*00b67f09SDavid van Moolenbroek 		 */
493*00b67f09SDavid van Moolenbroek 		if (ValidateServiceAccount() == FALSE)
494*00b67f09SDavid van Moolenbroek 			return;
495*00b67f09SDavid van Moolenbroek 
496*00b67f09SDavid van Moolenbroek 		/*
497*00b67f09SDavid van Moolenbroek 		 * For Registration we need to know if account was changed.
498*00b67f09SDavid van Moolenbroek 		 */
499*00b67f09SDavid van Moolenbroek 		if (m_accountName != m_currentAccount)
500*00b67f09SDavid van Moolenbroek 			m_accountUsed = FALSE;
501*00b67f09SDavid van Moolenbroek 
502*00b67f09SDavid van Moolenbroek 		if (m_accountUsed == FALSE && m_serviceExists == FALSE)
503*00b67f09SDavid van Moolenbroek 		{
504*00b67f09SDavid van Moolenbroek 		/*
505*00b67f09SDavid van Moolenbroek 		 * Check that the Password is not null.
506*00b67f09SDavid van Moolenbroek 		 */
507*00b67f09SDavid van Moolenbroek 			if (m_accountPassword.GetLength() == 0) {
508*00b67f09SDavid van Moolenbroek 				MsgBox(IDS_ERR_NULLPASSWORD);
509*00b67f09SDavid van Moolenbroek 				return;
510*00b67f09SDavid van Moolenbroek 			}
511*00b67f09SDavid van Moolenbroek 		}
512*00b67f09SDavid van Moolenbroek 	} else if (m_accountName == LOCAL_SERVICE) {
513*00b67f09SDavid van Moolenbroek 		/* The LocalService always exists. */
514*00b67f09SDavid van Moolenbroek 		m_accountExists = TRUE;
515*00b67f09SDavid van Moolenbroek 		if (m_accountName != m_currentAccount)
516*00b67f09SDavid van Moolenbroek 			m_accountUsed = FALSE;
517*00b67f09SDavid van Moolenbroek 	}
518*00b67f09SDavid van Moolenbroek 
519*00b67f09SDavid van Moolenbroek 	/* Directories */
520*00b67f09SDavid van Moolenbroek 	m_etcDir = m_targetDir + "\\etc";
521*00b67f09SDavid van Moolenbroek 	m_binDir = m_targetDir + "\\bin";
522*00b67f09SDavid van Moolenbroek 
523*00b67f09SDavid van Moolenbroek 	if (m_defaultDir != m_targetDir) {
524*00b67f09SDavid van Moolenbroek 		if (GetFileAttributes(m_targetDir) != 0xFFFFFFFF)
525*00b67f09SDavid van Moolenbroek 		{
526*00b67f09SDavid van Moolenbroek 			int install = MsgBox(IDS_DIREXIST,
527*00b67f09SDavid van Moolenbroek 					MB_YESNO | MB_ICONQUESTION, m_targetDir);
528*00b67f09SDavid van Moolenbroek 			if (install == IDNO)
529*00b67f09SDavid van Moolenbroek 				return;
530*00b67f09SDavid van Moolenbroek 		}
531*00b67f09SDavid van Moolenbroek 		else {
532*00b67f09SDavid van Moolenbroek 			int createDir = MsgBox(IDS_CREATEDIR,
533*00b67f09SDavid van Moolenbroek 					MB_YESNO | MB_ICONQUESTION, m_targetDir);
534*00b67f09SDavid van Moolenbroek 			if (createDir == IDNO)
535*00b67f09SDavid van Moolenbroek 				return;
536*00b67f09SDavid van Moolenbroek 		}
537*00b67f09SDavid van Moolenbroek 	}
538*00b67f09SDavid van Moolenbroek 
539*00b67f09SDavid van Moolenbroek 	if (!m_toolsOnly) {
540*00b67f09SDavid van Moolenbroek 		if (m_accountExists == FALSE) {
541*00b67f09SDavid van Moolenbroek 			success = CreateServiceAccount(m_accountName.GetBuffer(30),
542*00b67f09SDavid van Moolenbroek 						       m_accountPassword.GetBuffer(30));
543*00b67f09SDavid van Moolenbroek 			if (success == FALSE) {
544*00b67f09SDavid van Moolenbroek 				MsgBox(IDS_CREATEACCOUNT_FAILED);
545*00b67f09SDavid van Moolenbroek 				return;
546*00b67f09SDavid van Moolenbroek 			}
547*00b67f09SDavid van Moolenbroek 			m_accountExists = TRUE;
548*00b67f09SDavid van Moolenbroek 		}
549*00b67f09SDavid van Moolenbroek 	}
550*00b67f09SDavid van Moolenbroek 
551*00b67f09SDavid van Moolenbroek 	ProgramGroup(FALSE);
552*00b67f09SDavid van Moolenbroek 
553*00b67f09SDavid van Moolenbroek #if _MSC_VER >= 1400
554*00b67f09SDavid van Moolenbroek 	/*
555*00b67f09SDavid van Moolenbroek 	 * Install Visual Studio libraries.  As per:
556*00b67f09SDavid van Moolenbroek 	 * http://blogs.msdn.com/astebner/archive/2006/08/23/715755.aspx
557*00b67f09SDavid van Moolenbroek 	 *
558*00b67f09SDavid van Moolenbroek 	 * Vcredist_x86.exe /q:a /c:"msiexec /i vcredist.msi /qn /l*v %temp%\vcredist_x86.log"
559*00b67f09SDavid van Moolenbroek 	 */
560*00b67f09SDavid van Moolenbroek 	/*system(".\\Vcredist_x86.exe /q:a /c:\"msiexec /i vcredist.msi /qn /l*v %temp%\vcredist_x86.log\"");*/
561*00b67f09SDavid van Moolenbroek 
562*00b67f09SDavid van Moolenbroek 	/*
563*00b67f09SDavid van Moolenbroek 	 * Enclose full path to Vcredist_x86.exe in quotes as
564*00b67f09SDavid van Moolenbroek 	 * m_currentDir may contain spaces.
565*00b67f09SDavid van Moolenbroek 	 */
566*00b67f09SDavid van Moolenbroek #ifndef _WIN64
567*00b67f09SDavid van Moolenbroek 	sprintf(Vcredist_x86, "\"%s\\Vcredist_x86.exe\"",
568*00b67f09SDavid van Moolenbroek 		(LPCTSTR) m_currentDir);
569*00b67f09SDavid van Moolenbroek #else
570*00b67f09SDavid van Moolenbroek 	sprintf(Vcredist_x86, "\"%s\\Vcredist_x64.exe\"",
571*00b67f09SDavid van Moolenbroek 		(LPCTSTR) m_currentDir);
572*00b67f09SDavid van Moolenbroek #endif
573*00b67f09SDavid van Moolenbroek 	system(Vcredist_x86);
574*00b67f09SDavid van Moolenbroek #endif
575*00b67f09SDavid van Moolenbroek 	try {
576*00b67f09SDavid van Moolenbroek 		CreateDirs();
577*00b67f09SDavid van Moolenbroek 		CopyFiles();
578*00b67f09SDavid van Moolenbroek 		if (!m_toolsOnly)
579*00b67f09SDavid van Moolenbroek 			RegisterService();
580*00b67f09SDavid van Moolenbroek 		RegisterMessages();
581*00b67f09SDavid van Moolenbroek 
582*00b67f09SDavid van Moolenbroek 		HKEY hKey;
583*00b67f09SDavid van Moolenbroek 
584*00b67f09SDavid van Moolenbroek 		/* Create a new key for named */
585*00b67f09SDavid van Moolenbroek 		SetCurrent(IDS_CREATE_KEY);
586*00b67f09SDavid van Moolenbroek 		if (RegCreateKey(HKEY_LOCAL_MACHINE, BIND_SUBKEY,
587*00b67f09SDavid van Moolenbroek 			&hKey) == ERROR_SUCCESS) {
588*00b67f09SDavid van Moolenbroek 			// Get the install directory
589*00b67f09SDavid van Moolenbroek 			RegSetValueEx(hKey, "InstallDir", 0, REG_SZ,
590*00b67f09SDavid van Moolenbroek 					(LPBYTE)(LPCTSTR)m_targetDir,
591*00b67f09SDavid van Moolenbroek 					m_targetDir.GetLength());
592*00b67f09SDavid van Moolenbroek 			RegCloseKey(hKey);
593*00b67f09SDavid van Moolenbroek 		}
594*00b67f09SDavid van Moolenbroek 
595*00b67f09SDavid van Moolenbroek 
596*00b67f09SDavid van Moolenbroek 		SetCurrent(IDS_ADD_REMOVE);
597*00b67f09SDavid van Moolenbroek 		if (RegCreateKey(HKEY_LOCAL_MACHINE, BIND_UNINSTALL_SUBKEY,
598*00b67f09SDavid van Moolenbroek 				 &hKey) == ERROR_SUCCESS) {
599*00b67f09SDavid van Moolenbroek 			CString buf(BIND_DISPLAY_NAME);
600*00b67f09SDavid van Moolenbroek 
601*00b67f09SDavid van Moolenbroek 			RegSetValueEx(hKey, "DisplayName", 0, REG_SZ,
602*00b67f09SDavid van Moolenbroek 					(LPBYTE)(LPCTSTR)buf, buf.GetLength());
603*00b67f09SDavid van Moolenbroek 
604*00b67f09SDavid van Moolenbroek 			buf.Format("%s\\BINDInstall.exe", m_binDir);
605*00b67f09SDavid van Moolenbroek 			RegSetValueEx(hKey, "UninstallString", 0, REG_SZ,
606*00b67f09SDavid van Moolenbroek 					(LPBYTE)(LPCTSTR)buf, buf.GetLength());
607*00b67f09SDavid van Moolenbroek 			RegCloseKey(hKey);
608*00b67f09SDavid van Moolenbroek 		}
609*00b67f09SDavid van Moolenbroek 
610*00b67f09SDavid van Moolenbroek 		ProgramGroup(FALSE);
611*00b67f09SDavid van Moolenbroek 
612*00b67f09SDavid van Moolenbroek 		if (m_startOnInstall)
613*00b67f09SDavid van Moolenbroek 			StartBINDService();
614*00b67f09SDavid van Moolenbroek 	}
615*00b67f09SDavid van Moolenbroek 	catch(Exception e) {
616*00b67f09SDavid van Moolenbroek 		MessageBox(e.resString);
617*00b67f09SDavid van Moolenbroek 		SetCurrent(IDS_CLEANUP);
618*00b67f09SDavid van Moolenbroek 		FailedInstall();
619*00b67f09SDavid van Moolenbroek 		MsgBox(IDS_FAIL);
620*00b67f09SDavid van Moolenbroek 		return;
621*00b67f09SDavid van Moolenbroek 	}
622*00b67f09SDavid van Moolenbroek 	catch(DWORD dw)	{
623*00b67f09SDavid van Moolenbroek 		CString msg;
624*00b67f09SDavid van Moolenbroek 		msg.Format("A fatal error occured\n(%s)", GetErrMessage(dw));
625*00b67f09SDavid van Moolenbroek 		MessageBox(msg);
626*00b67f09SDavid van Moolenbroek 		SetCurrent(IDS_CLEANUP);
627*00b67f09SDavid van Moolenbroek 		FailedInstall();
628*00b67f09SDavid van Moolenbroek 		MsgBox(IDS_FAIL);
629*00b67f09SDavid van Moolenbroek 		return;
630*00b67f09SDavid van Moolenbroek 	}
631*00b67f09SDavid van Moolenbroek 
632*00b67f09SDavid van Moolenbroek 	SetCurrent(IDS_INSTALL_DONE);
633*00b67f09SDavid van Moolenbroek 	MsgBox(IDS_SUCCESS);
634*00b67f09SDavid van Moolenbroek }
635*00b67f09SDavid van Moolenbroek 
636*00b67f09SDavid van Moolenbroek /*
637*00b67f09SDavid van Moolenbroek  * Methods to do the work
638*00b67f09SDavid van Moolenbroek  */
CreateDirs()639*00b67f09SDavid van Moolenbroek void CBINDInstallDlg::CreateDirs() {
640*00b67f09SDavid van Moolenbroek 	/* s'OK if the directories already exist */
641*00b67f09SDavid van Moolenbroek 	SetCurrent(IDS_CREATE_DIR, m_targetDir);
642*00b67f09SDavid van Moolenbroek 	if (!CreateDirectory(m_targetDir, NULL) && GetLastError() != ERROR_ALREADY_EXISTS)
643*00b67f09SDavid van Moolenbroek 		throw(Exception(IDS_ERR_CREATE_DIR, m_targetDir, GetErrMessage()));
644*00b67f09SDavid van Moolenbroek 
645*00b67f09SDavid van Moolenbroek 	SetCurrent(IDS_CREATE_DIR, m_etcDir);
646*00b67f09SDavid van Moolenbroek 	if (!CreateDirectory(m_etcDir, NULL) && GetLastError() != ERROR_ALREADY_EXISTS)
647*00b67f09SDavid van Moolenbroek 		throw(Exception(IDS_ERR_CREATE_DIR, m_etcDir, GetErrMessage()));
648*00b67f09SDavid van Moolenbroek 
649*00b67f09SDavid van Moolenbroek 	SetCurrent(IDS_CREATE_DIR, m_binDir);
650*00b67f09SDavid van Moolenbroek 	if (!CreateDirectory(m_binDir, NULL) && GetLastError() != ERROR_ALREADY_EXISTS)
651*00b67f09SDavid van Moolenbroek 		throw(Exception(IDS_ERR_CREATE_DIR, m_binDir, GetErrMessage()));
652*00b67f09SDavid van Moolenbroek 
653*00b67f09SDavid van Moolenbroek 	SetItemStatus(IDC_CREATE_DIR);
654*00b67f09SDavid van Moolenbroek }
655*00b67f09SDavid van Moolenbroek 
RemoveDirs(BOOL uninstall)656*00b67f09SDavid van Moolenbroek void CBINDInstallDlg::RemoveDirs(BOOL uninstall) {
657*00b67f09SDavid van Moolenbroek 	if (!m_keepFiles) {
658*00b67f09SDavid van Moolenbroek 		SetCurrent(IDS_REMOVE_DIR, m_binDir);
659*00b67f09SDavid van Moolenbroek 		// Check for existence then remove if present
660*00b67f09SDavid van Moolenbroek 		if (GetFileAttributes(m_binDir) != 0xFFFFFFFF)
661*00b67f09SDavid van Moolenbroek 			RemoveDirectory(m_binDir);
662*00b67f09SDavid van Moolenbroek 
663*00b67f09SDavid van Moolenbroek 		SetCurrent(IDS_REMOVE_DIR, m_etcDir);
664*00b67f09SDavid van Moolenbroek 		if (GetFileAttributes(m_etcDir) != 0xFFFFFFFF)
665*00b67f09SDavid van Moolenbroek 			RemoveDirectory(m_etcDir);
666*00b67f09SDavid van Moolenbroek 
667*00b67f09SDavid van Moolenbroek 		SetCurrent(IDS_REMOVE_DIR, m_targetDir);
668*00b67f09SDavid van Moolenbroek 		if (GetFileAttributes(m_targetDir) != 0xFFFFFFFF)
669*00b67f09SDavid van Moolenbroek 			RemoveDirectory(m_targetDir);
670*00b67f09SDavid van Moolenbroek 	}
671*00b67f09SDavid van Moolenbroek 
672*00b67f09SDavid van Moolenbroek 	if (uninstall)
673*00b67f09SDavid van Moolenbroek 		SetItemStatus(IDC_CREATE_DIR, TRUE);
674*00b67f09SDavid van Moolenbroek }
675*00b67f09SDavid van Moolenbroek 
CopyFiles()676*00b67f09SDavid van Moolenbroek void CBINDInstallDlg::CopyFiles() {
677*00b67f09SDavid van Moolenbroek 	CString destFile;
678*00b67f09SDavid van Moolenbroek 
679*00b67f09SDavid van Moolenbroek 	for (int i = 0; installFiles[i].filename; i++) {
680*00b67f09SDavid van Moolenbroek 		if (m_toolsOnly && !installFiles[i].withTools)
681*00b67f09SDavid van Moolenbroek 			continue;
682*00b67f09SDavid van Moolenbroek 		SetCurrent(IDS_COPY_FILE, installFiles[i].filename);
683*00b67f09SDavid van Moolenbroek 
684*00b67f09SDavid van Moolenbroek 		destFile = DestDir(installFiles[i].destination) + "\\" +
685*00b67f09SDavid van Moolenbroek 				   installFiles[i].filename;
686*00b67f09SDavid van Moolenbroek 		CString filespec = m_currentDir + "\\" + installFiles[i].filename;
687*00b67f09SDavid van Moolenbroek 		CVersionInfo bindFile(destFile);
688*00b67f09SDavid van Moolenbroek 
689*00b67f09SDavid van Moolenbroek 		CVersionInfo origFile(filespec);
690*00b67f09SDavid van Moolenbroek 		if (!origFile.IsValid() && installFiles[i].checkVer) {
691*00b67f09SDavid van Moolenbroek 			if (MsgBox(IDS_FILE_BAD, MB_YESNO,
692*00b67f09SDavid van Moolenbroek 				  installFiles[i].filename) == IDNO)
693*00b67f09SDavid van Moolenbroek 				throw(Exception(IDS_ERR_COPY_FILE,
694*00b67f09SDavid van Moolenbroek 					installFiles[i].filename,
695*00b67f09SDavid van Moolenbroek 					GetErrMessage()));
696*00b67f09SDavid van Moolenbroek 		}
697*00b67f09SDavid van Moolenbroek 
698*00b67f09SDavid van Moolenbroek 		try {
699*00b67f09SDavid van Moolenbroek /*
700*00b67f09SDavid van Moolenbroek  * Ignore Version checking.  We need to make sure that all files get
701*00b67f09SDavid van Moolenbroek  * copied regardless of whether or not they are earlier or later
702*00b67f09SDavid van Moolenbroek  * versions since we cannot guarantee that we have either backward or
703*00b67f09SDavid van Moolenbroek  * forward compatibility between versions.
704*00b67f09SDavid van Moolenbroek  */
705*00b67f09SDavid van Moolenbroek 			bindFile.CopyFileNoVersion(origFile);
706*00b67f09SDavid van Moolenbroek 		}
707*00b67f09SDavid van Moolenbroek 		catch(...) {
708*00b67f09SDavid van Moolenbroek 			if (installFiles[i].importance != FileData::Trivial) {
709*00b67f09SDavid van Moolenbroek 				if (installFiles[i].importance ==
710*00b67f09SDavid van Moolenbroek 					FileData::Critical ||
711*00b67f09SDavid van Moolenbroek 					MsgBox(IDS_ERR_NONCRIT_FILE, MB_YESNO,
712*00b67f09SDavid van Moolenbroek 					installFiles[i].filename,
713*00b67f09SDavid van Moolenbroek 					GetErrMessage()) == IDNO)
714*00b67f09SDavid van Moolenbroek 				{
715*00b67f09SDavid van Moolenbroek 					SetItemStatus(IDC_COPY_FILE, FALSE);
716*00b67f09SDavid van Moolenbroek 					throw(Exception(IDS_ERR_COPY_FILE,
717*00b67f09SDavid van Moolenbroek 						installFiles[i].filename,
718*00b67f09SDavid van Moolenbroek 						GetErrMessage()));
719*00b67f09SDavid van Moolenbroek 				}
720*00b67f09SDavid van Moolenbroek 			}
721*00b67f09SDavid van Moolenbroek 		}
722*00b67f09SDavid van Moolenbroek 	}
723*00b67f09SDavid van Moolenbroek 
724*00b67f09SDavid van Moolenbroek 	SetItemStatus(IDC_COPY_FILE);
725*00b67f09SDavid van Moolenbroek }
726*00b67f09SDavid van Moolenbroek 
DeleteFiles(BOOL uninstall)727*00b67f09SDavid van Moolenbroek void CBINDInstallDlg::DeleteFiles(BOOL uninstall) {
728*00b67f09SDavid van Moolenbroek 	CString destFile;
729*00b67f09SDavid van Moolenbroek 
730*00b67f09SDavid van Moolenbroek 	for (int i = 0; installFiles[i].filename; i++) {
731*00b67f09SDavid van Moolenbroek 		if (installFiles[i].checkVer)
732*00b67f09SDavid van Moolenbroek 			continue;
733*00b67f09SDavid van Moolenbroek 
734*00b67f09SDavid van Moolenbroek 		destFile = DestDir(installFiles[i].destination) + "\\" +
735*00b67f09SDavid van Moolenbroek 				   installFiles[i].filename;
736*00b67f09SDavid van Moolenbroek 
737*00b67f09SDavid van Moolenbroek 		if (uninstall)
738*00b67f09SDavid van Moolenbroek 			SetCurrent(IDS_DELETE_FILE, installFiles[i].filename);
739*00b67f09SDavid van Moolenbroek 
740*00b67f09SDavid van Moolenbroek 		DeleteFile(destFile);
741*00b67f09SDavid van Moolenbroek 	}
742*00b67f09SDavid van Moolenbroek 
743*00b67f09SDavid van Moolenbroek 	if (!m_keepFiles) {
744*00b67f09SDavid van Moolenbroek 		WIN32_FIND_DATA findData;
745*00b67f09SDavid van Moolenbroek 		CString file = m_etcDir + "\\*.*";
746*00b67f09SDavid van Moolenbroek 		BOOL rc;
747*00b67f09SDavid van Moolenbroek 		HANDLE hFile;
748*00b67f09SDavid van Moolenbroek 
749*00b67f09SDavid van Moolenbroek 		hFile = FindFirstFile(file, &findData);
750*00b67f09SDavid van Moolenbroek 		rc = hFile != INVALID_HANDLE_VALUE;
751*00b67f09SDavid van Moolenbroek 
752*00b67f09SDavid van Moolenbroek 		while (rc == TRUE) {
753*00b67f09SDavid van Moolenbroek 			if (strcmp(findData.cFileName, ".") &&
754*00b67f09SDavid van Moolenbroek 			    strcmp(findData.cFileName, "..")) {
755*00b67f09SDavid van Moolenbroek 				file = m_etcDir + "\\" + findData.cFileName;
756*00b67f09SDavid van Moolenbroek 				SetCurrent(IDS_DELETE_FILE, file);
757*00b67f09SDavid van Moolenbroek 				DeleteFile(file);
758*00b67f09SDavid van Moolenbroek 			}
759*00b67f09SDavid van Moolenbroek 			rc = FindNextFile(hFile, &findData);
760*00b67f09SDavid van Moolenbroek 		}
761*00b67f09SDavid van Moolenbroek 		FindClose(hFile);
762*00b67f09SDavid van Moolenbroek 	}
763*00b67f09SDavid van Moolenbroek 
764*00b67f09SDavid van Moolenbroek 	if (uninstall)
765*00b67f09SDavid van Moolenbroek 		SetItemStatus(IDC_COPY_FILE, TRUE);
766*00b67f09SDavid van Moolenbroek }
767*00b67f09SDavid van Moolenbroek 
768*00b67f09SDavid van Moolenbroek /*
769*00b67f09SDavid van Moolenbroek  * Get the service account name out of the registry, if any
770*00b67f09SDavid van Moolenbroek  */
771*00b67f09SDavid van Moolenbroek void
GetCurrentServiceAccountName()772*00b67f09SDavid van Moolenbroek CBINDInstallDlg::GetCurrentServiceAccountName() {
773*00b67f09SDavid van Moolenbroek 	HKEY hKey;
774*00b67f09SDavid van Moolenbroek 	BOOL keyFound = FALSE;
775*00b67f09SDavid van Moolenbroek 	char accountName[MAX_PATH];
776*00b67f09SDavid van Moolenbroek 	DWORD nameLen = MAX_PATH;
777*00b67f09SDavid van Moolenbroek 	CString Tmp;
778*00b67f09SDavid van Moolenbroek 	m_accountUsed = FALSE;
779*00b67f09SDavid van Moolenbroek 
780*00b67f09SDavid van Moolenbroek 	memset(accountName, 0, nameLen);
781*00b67f09SDavid van Moolenbroek 	if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, BIND_SERVICE_SUBKEY, 0, KEY_READ,
782*00b67f09SDavid van Moolenbroek 		&hKey) == ERROR_SUCCESS) {
783*00b67f09SDavid van Moolenbroek 		keyFound = TRUE;
784*00b67f09SDavid van Moolenbroek 	}
785*00b67f09SDavid van Moolenbroek 	else {
786*00b67f09SDavid van Moolenbroek 		m_serviceExists = FALSE;
787*00b67f09SDavid van Moolenbroek 	}
788*00b67f09SDavid van Moolenbroek 
789*00b67f09SDavid van Moolenbroek 	if (keyFound == TRUE) {
790*00b67f09SDavid van Moolenbroek 		/* Get the named service account, if one was specified */
791*00b67f09SDavid van Moolenbroek 		if (RegQueryValueEx(hKey, "ObjectName", NULL, NULL,
792*00b67f09SDavid van Moolenbroek 			(LPBYTE)accountName, &nameLen) != ERROR_SUCCESS)
793*00b67f09SDavid van Moolenbroek 			keyFound = FALSE;
794*00b67f09SDavid van Moolenbroek 	}
795*00b67f09SDavid van Moolenbroek 
796*00b67f09SDavid van Moolenbroek 	RegCloseKey(hKey);
797*00b67f09SDavid van Moolenbroek 	if (keyFound == FALSE)
798*00b67f09SDavid van Moolenbroek 		m_accountName = "";
799*00b67f09SDavid van Moolenbroek 	else if (!strcmp(accountName, LOCAL_SERVICE)) {
800*00b67f09SDavid van Moolenbroek 		m_accountName = LOCAL_SERVICE;
801*00b67f09SDavid van Moolenbroek 		m_accountUsed = TRUE;
802*00b67f09SDavid van Moolenbroek 	} else {
803*00b67f09SDavid van Moolenbroek 		/*
804*00b67f09SDavid van Moolenbroek 		 * LocalSystem is not a regular account and is equivalent
805*00b67f09SDavid van Moolenbroek 		 * to no account but with lots of privileges
806*00b67f09SDavid van Moolenbroek 		 */
807*00b67f09SDavid van Moolenbroek 		Tmp = accountName;
808*00b67f09SDavid van Moolenbroek 		if (Tmp == ".\\LocalSystem")
809*00b67f09SDavid van Moolenbroek 			m_accountName = "";
810*00b67f09SDavid van Moolenbroek 		/* Found account strip any ".\" from it */
811*00b67f09SDavid van Moolenbroek 		if (Tmp.Left(2) == ".\\") {
812*00b67f09SDavid van Moolenbroek 			m_accountName = Tmp.Mid(2);
813*00b67f09SDavid van Moolenbroek 			m_accountUsed = TRUE;
814*00b67f09SDavid van Moolenbroek 		}
815*00b67f09SDavid van Moolenbroek 	}
816*00b67f09SDavid van Moolenbroek }
817*00b67f09SDavid van Moolenbroek 
818*00b67f09SDavid van Moolenbroek BOOL
ValidateServiceAccount()819*00b67f09SDavid van Moolenbroek CBINDInstallDlg::ValidateServiceAccount() {
820*00b67f09SDavid van Moolenbroek 	wchar_t *PrivList[MAX_PRIVS];
821*00b67f09SDavid van Moolenbroek 	unsigned int PrivCount = 0;
822*00b67f09SDavid van Moolenbroek 	char *Groups[MAX_GROUPS];
823*00b67f09SDavid van Moolenbroek 	unsigned int totalGroups = 0;
824*00b67f09SDavid van Moolenbroek 	int status;
825*00b67f09SDavid van Moolenbroek 	char *name;
826*00b67f09SDavid van Moolenbroek 
827*00b67f09SDavid van Moolenbroek 	name = m_accountName.GetBuffer(30);
828*00b67f09SDavid van Moolenbroek 
829*00b67f09SDavid van Moolenbroek 	status = GetAccountPrivileges(name, PrivList, &PrivCount,
830*00b67f09SDavid van Moolenbroek 		 Groups, &totalGroups, MAX_GROUPS);
831*00b67f09SDavid van Moolenbroek 	if (status == RTN_NOACCOUNT) {
832*00b67f09SDavid van Moolenbroek 		m_accountExists = FALSE;
833*00b67f09SDavid van Moolenbroek 		/* We need to do this in case an account was previously used */
834*00b67f09SDavid van Moolenbroek 		m_accountUsed = FALSE;
835*00b67f09SDavid van Moolenbroek 		return (TRUE);
836*00b67f09SDavid van Moolenbroek 	}
837*00b67f09SDavid van Moolenbroek 	if (status != RTN_OK) {
838*00b67f09SDavid van Moolenbroek 		MsgBox(IDS_ERR_BADACCOUNT);
839*00b67f09SDavid van Moolenbroek 		return (FALSE);
840*00b67f09SDavid van Moolenbroek 	}
841*00b67f09SDavid van Moolenbroek 
842*00b67f09SDavid van Moolenbroek 	m_accountExists = TRUE;
843*00b67f09SDavid van Moolenbroek 	if (PrivCount > 1) {
844*00b67f09SDavid van Moolenbroek 		if (MsgBox(IDS_ERR_TOOPRIVED, MB_YESNO) == IDYES)
845*00b67f09SDavid van Moolenbroek 			return (FALSE);
846*00b67f09SDavid van Moolenbroek 		else
847*00b67f09SDavid van Moolenbroek 			return (TRUE);
848*00b67f09SDavid van Moolenbroek 	}
849*00b67f09SDavid van Moolenbroek 
850*00b67f09SDavid van Moolenbroek 	/* See if we have the correct privilege */
851*00b67f09SDavid van Moolenbroek 	if (wcscmp(PrivList[0], SE_SERVICE_LOGON_PRIV) != 0) {
852*00b67f09SDavid van Moolenbroek 		MsgBox(IDS_ERR_WRONGPRIV, PrivList[0]);
853*00b67f09SDavid van Moolenbroek 		return (FALSE);
854*00b67f09SDavid van Moolenbroek 	}
855*00b67f09SDavid van Moolenbroek 	return (TRUE);
856*00b67f09SDavid van Moolenbroek }
857*00b67f09SDavid van Moolenbroek 
858*00b67f09SDavid van Moolenbroek void
RegisterService()859*00b67f09SDavid van Moolenbroek CBINDInstallDlg::RegisterService() {
860*00b67f09SDavid van Moolenbroek 	SC_HANDLE hSCManager;
861*00b67f09SDavid van Moolenbroek 	SC_HANDLE hService;
862*00b67f09SDavid van Moolenbroek 	CString StartName;
863*00b67f09SDavid van Moolenbroek 
864*00b67f09SDavid van Moolenbroek 	if (m_accountName == LOCAL_SERVICE)
865*00b67f09SDavid van Moolenbroek 		StartName = LOCAL_SERVICE;
866*00b67f09SDavid van Moolenbroek 	else
867*00b67f09SDavid van Moolenbroek 		StartName = ".\\" + m_accountName;
868*00b67f09SDavid van Moolenbroek 	/*
869*00b67f09SDavid van Moolenbroek 	 * We need to change the service rather than create it
870*00b67f09SDavid van Moolenbroek 	 * if the service already exists. Do nothing if we are already
871*00b67f09SDavid van Moolenbroek 	 * using that account
872*00b67f09SDavid van Moolenbroek 	 */
873*00b67f09SDavid van Moolenbroek 	if (m_serviceExists == TRUE) {
874*00b67f09SDavid van Moolenbroek 		if (m_accountUsed == FALSE) {
875*00b67f09SDavid van Moolenbroek 			UpdateService(StartName);
876*00b67f09SDavid van Moolenbroek 			SetItemStatus(IDC_REG_SERVICE);
877*00b67f09SDavid van Moolenbroek 			return;
878*00b67f09SDavid van Moolenbroek 		} else {
879*00b67f09SDavid van Moolenbroek 			SetItemStatus(IDC_REG_SERVICE);
880*00b67f09SDavid van Moolenbroek 			return;
881*00b67f09SDavid van Moolenbroek 		}
882*00b67f09SDavid van Moolenbroek 	}
883*00b67f09SDavid van Moolenbroek 
884*00b67f09SDavid van Moolenbroek 	SetCurrent(IDS_OPEN_SCM);
885*00b67f09SDavid van Moolenbroek 	hSCManager= OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
886*00b67f09SDavid van Moolenbroek 	if (!hSCManager)
887*00b67f09SDavid van Moolenbroek 		throw(Exception(IDS_ERR_OPEN_SCM, GetErrMessage()));
888*00b67f09SDavid van Moolenbroek 
889*00b67f09SDavid van Moolenbroek 	DWORD dwStart = SERVICE_DEMAND_START;
890*00b67f09SDavid van Moolenbroek 	if (m_autoStart)
891*00b67f09SDavid van Moolenbroek 		dwStart = SERVICE_AUTO_START;
892*00b67f09SDavid van Moolenbroek 
893*00b67f09SDavid van Moolenbroek 	DWORD dwServiceType = SERVICE_WIN32_OWN_PROCESS;
894*00b67f09SDavid van Moolenbroek 
895*00b67f09SDavid van Moolenbroek 	CString namedLoc;
896*00b67f09SDavid van Moolenbroek 	namedLoc.Format("%s\\bin\\named.exe", m_targetDir);
897*00b67f09SDavid van Moolenbroek 
898*00b67f09SDavid van Moolenbroek 	SetCurrent(IDS_CREATE_SERVICE);
899*00b67f09SDavid van Moolenbroek 	hService = CreateService(hSCManager, BIND_SERVICE_NAME,
900*00b67f09SDavid van Moolenbroek 		BIND_DISPLAY_NAME, SERVICE_ALL_ACCESS, dwServiceType, dwStart,
901*00b67f09SDavid van Moolenbroek 		SERVICE_ERROR_NORMAL, namedLoc, NULL, NULL, NULL, StartName,
902*00b67f09SDavid van Moolenbroek 		m_accountPassword);
903*00b67f09SDavid van Moolenbroek 
904*00b67f09SDavid van Moolenbroek 	if (!hService && GetLastError() != ERROR_SERVICE_EXISTS)
905*00b67f09SDavid van Moolenbroek 		throw(Exception(IDS_ERR_CREATE_SERVICE, GetErrMessage()));
906*00b67f09SDavid van Moolenbroek 
907*00b67f09SDavid van Moolenbroek 	if (hService)
908*00b67f09SDavid van Moolenbroek 		CloseServiceHandle(hService);
909*00b67f09SDavid van Moolenbroek 
910*00b67f09SDavid van Moolenbroek 	if (hSCManager)
911*00b67f09SDavid van Moolenbroek 		CloseServiceHandle(hSCManager);
912*00b67f09SDavid van Moolenbroek 
913*00b67f09SDavid van Moolenbroek 	SetItemStatus(IDC_REG_SERVICE);
914*00b67f09SDavid van Moolenbroek }
915*00b67f09SDavid van Moolenbroek 
916*00b67f09SDavid van Moolenbroek void
UpdateService(CString StartName)917*00b67f09SDavid van Moolenbroek CBINDInstallDlg::UpdateService(CString StartName) {
918*00b67f09SDavid van Moolenbroek 	SC_HANDLE hSCManager;
919*00b67f09SDavid van Moolenbroek 	SC_HANDLE hService;
920*00b67f09SDavid van Moolenbroek 
921*00b67f09SDavid van Moolenbroek 	if(m_toolsOnly)
922*00b67f09SDavid van Moolenbroek 		return;
923*00b67f09SDavid van Moolenbroek 
924*00b67f09SDavid van Moolenbroek 	SetCurrent(IDS_OPEN_SCM);
925*00b67f09SDavid van Moolenbroek 	hSCManager= OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
926*00b67f09SDavid van Moolenbroek 	if (!hSCManager) {
927*00b67f09SDavid van Moolenbroek 		MsgBox(IDS_ERR_OPEN_SCM, GetErrMessage());
928*00b67f09SDavid van Moolenbroek 		return;
929*00b67f09SDavid van Moolenbroek 	}
930*00b67f09SDavid van Moolenbroek 
931*00b67f09SDavid van Moolenbroek 	DWORD dwStart = SERVICE_DEMAND_START;
932*00b67f09SDavid van Moolenbroek 	if (m_autoStart)
933*00b67f09SDavid van Moolenbroek 		dwStart = SERVICE_AUTO_START;
934*00b67f09SDavid van Moolenbroek 
935*00b67f09SDavid van Moolenbroek 	DWORD dwServiceType = SERVICE_WIN32_OWN_PROCESS;
936*00b67f09SDavid van Moolenbroek 
937*00b67f09SDavid van Moolenbroek 	CString namedLoc;
938*00b67f09SDavid van Moolenbroek 	namedLoc.Format("%s\\bin\\named.exe", m_targetDir);
939*00b67f09SDavid van Moolenbroek 
940*00b67f09SDavid van Moolenbroek 	SetCurrent(IDS_OPEN_SERVICE);
941*00b67f09SDavid van Moolenbroek 	hService = OpenService(hSCManager, BIND_SERVICE_NAME,
942*00b67f09SDavid van Moolenbroek 			       SERVICE_CHANGE_CONFIG);
943*00b67f09SDavid van Moolenbroek 	if (!hService)
944*00b67f09SDavid van Moolenbroek 	{
945*00b67f09SDavid van Moolenbroek 		MsgBox(IDS_ERR_OPEN_SERVICE, GetErrMessage());
946*00b67f09SDavid van Moolenbroek 		if (hSCManager)
947*00b67f09SDavid van Moolenbroek 			CloseServiceHandle(hSCManager);
948*00b67f09SDavid van Moolenbroek 		return;
949*00b67f09SDavid van Moolenbroek 	} else {
950*00b67f09SDavid van Moolenbroek 		if (ChangeServiceConfig(hService, dwServiceType, dwStart,
951*00b67f09SDavid van Moolenbroek 			SERVICE_ERROR_NORMAL, namedLoc, NULL, NULL, NULL,
952*00b67f09SDavid van Moolenbroek 			StartName, m_accountPassword, BIND_DISPLAY_NAME)
953*00b67f09SDavid van Moolenbroek 			!= TRUE) {
954*00b67f09SDavid van Moolenbroek 			DWORD err = GetLastError();
955*00b67f09SDavid van Moolenbroek 			MsgBox(IDS_ERR_UPDATE_SERVICE, GetErrMessage());
956*00b67f09SDavid van Moolenbroek 		}
957*00b67f09SDavid van Moolenbroek 	}
958*00b67f09SDavid van Moolenbroek 
959*00b67f09SDavid van Moolenbroek 	if (hService)
960*00b67f09SDavid van Moolenbroek 		CloseServiceHandle(hService);
961*00b67f09SDavid van Moolenbroek 
962*00b67f09SDavid van Moolenbroek 	if (hSCManager)
963*00b67f09SDavid van Moolenbroek 		CloseServiceHandle(hSCManager);
964*00b67f09SDavid van Moolenbroek 
965*00b67f09SDavid van Moolenbroek 	SetItemStatus(IDC_REG_SERVICE);
966*00b67f09SDavid van Moolenbroek }
967*00b67f09SDavid van Moolenbroek 
UnregisterService(BOOL uninstall)968*00b67f09SDavid van Moolenbroek void CBINDInstallDlg::UnregisterService(BOOL uninstall) {
969*00b67f09SDavid van Moolenbroek 	BOOL rc = FALSE;
970*00b67f09SDavid van Moolenbroek 	SC_HANDLE hSCManager;
971*00b67f09SDavid van Moolenbroek 	SC_HANDLE hService;
972*00b67f09SDavid van Moolenbroek 
973*00b67f09SDavid van Moolenbroek 	while(1) {
974*00b67f09SDavid van Moolenbroek 		SetCurrent(IDS_OPEN_SCM);
975*00b67f09SDavid van Moolenbroek 		hSCManager= OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
976*00b67f09SDavid van Moolenbroek 		if (!hSCManager && uninstall == TRUE) {
977*00b67f09SDavid van Moolenbroek 			MsgBox(IDS_ERR_OPEN_SCM, GetErrMessage());
978*00b67f09SDavid van Moolenbroek 			break;
979*00b67f09SDavid van Moolenbroek 		}
980*00b67f09SDavid van Moolenbroek 
981*00b67f09SDavid van Moolenbroek 		SetCurrent(IDS_OPEN_SERVICE);
982*00b67f09SDavid van Moolenbroek 		hService = OpenService(hSCManager, BIND_SERVICE_NAME,
983*00b67f09SDavid van Moolenbroek 				       STANDARD_RIGHTS_REQUIRED);
984*00b67f09SDavid van Moolenbroek 		if (!hService && uninstall == TRUE)
985*00b67f09SDavid van Moolenbroek 		{
986*00b67f09SDavid van Moolenbroek 			if (GetLastError() != ERROR_SERVICE_DOES_NOT_EXIST) {
987*00b67f09SDavid van Moolenbroek 				MsgBox(IDS_ERR_OPEN_SERVICE, GetErrMessage());
988*00b67f09SDavid van Moolenbroek 				break;
989*00b67f09SDavid van Moolenbroek 			}
990*00b67f09SDavid van Moolenbroek 		}
991*00b67f09SDavid van Moolenbroek 		else {
992*00b67f09SDavid van Moolenbroek 			SetCurrent(IDS_REMOVE_SERVICE);
993*00b67f09SDavid van Moolenbroek 			if (!DeleteService(hService) && uninstall == TRUE) {
994*00b67f09SDavid van Moolenbroek 				DWORD err = GetLastError();
995*00b67f09SDavid van Moolenbroek 				if (err != ERROR_SERVICE_MARKED_FOR_DELETE &&
996*00b67f09SDavid van Moolenbroek 				   err != ERROR_SERVICE_DOES_NOT_EXIST) {
997*00b67f09SDavid van Moolenbroek 					MsgBox(IDS_ERR_REMOVE_SERVICE,
998*00b67f09SDavid van Moolenbroek 					       GetErrMessage());
999*00b67f09SDavid van Moolenbroek 					break;
1000*00b67f09SDavid van Moolenbroek 				}
1001*00b67f09SDavid van Moolenbroek 			}
1002*00b67f09SDavid van Moolenbroek 		}
1003*00b67f09SDavid van Moolenbroek 
1004*00b67f09SDavid van Moolenbroek 		rc = TRUE;
1005*00b67f09SDavid van Moolenbroek 		break;
1006*00b67f09SDavid van Moolenbroek 	}
1007*00b67f09SDavid van Moolenbroek 
1008*00b67f09SDavid van Moolenbroek 	if (hService)
1009*00b67f09SDavid van Moolenbroek 		CloseServiceHandle(hService);
1010*00b67f09SDavid van Moolenbroek 
1011*00b67f09SDavid van Moolenbroek 	if (hSCManager)
1012*00b67f09SDavid van Moolenbroek 		CloseServiceHandle(hSCManager);
1013*00b67f09SDavid van Moolenbroek 
1014*00b67f09SDavid van Moolenbroek 	if (uninstall)
1015*00b67f09SDavid van Moolenbroek 		SetItemStatus(IDC_REG_SERVICE, rc);
1016*00b67f09SDavid van Moolenbroek }
1017*00b67f09SDavid van Moolenbroek 
RegisterMessages()1018*00b67f09SDavid van Moolenbroek void CBINDInstallDlg::RegisterMessages() {
1019*00b67f09SDavid van Moolenbroek 	HKEY hKey;
1020*00b67f09SDavid van Moolenbroek 	DWORD dwData;
1021*00b67f09SDavid van Moolenbroek 	char pszMsgDLL[MAX_PATH];
1022*00b67f09SDavid van Moolenbroek 
1023*00b67f09SDavid van Moolenbroek 	sprintf(pszMsgDLL, "%s\\%s", (LPCTSTR)m_binDir, "bindevt.dll");
1024*00b67f09SDavid van Moolenbroek 
1025*00b67f09SDavid van Moolenbroek 	SetCurrent(IDS_REGISTER_MESSAGES);
1026*00b67f09SDavid van Moolenbroek 	/* Create a new key for named */
1027*00b67f09SDavid van Moolenbroek 	if (RegCreateKey(HKEY_LOCAL_MACHINE, BIND_MESSAGE_SUBKEY, &hKey)
1028*00b67f09SDavid van Moolenbroek 		!= ERROR_SUCCESS)
1029*00b67f09SDavid van Moolenbroek 		throw(Exception(IDS_ERR_CREATE_KEY, GetErrMessage()));
1030*00b67f09SDavid van Moolenbroek 
1031*00b67f09SDavid van Moolenbroek 	/* Add the Event-ID message-file name to the subkey. */
1032*00b67f09SDavid van Moolenbroek 	if (RegSetValueEx(hKey, "EventMessageFile", 0, REG_EXPAND_SZ,
1033*00b67f09SDavid van Moolenbroek 		(LPBYTE)pszMsgDLL, (DWORD)(strlen(pszMsgDLL) + 1)) != ERROR_SUCCESS)
1034*00b67f09SDavid van Moolenbroek 		throw(Exception(IDS_ERR_SET_VALUE, GetErrMessage()));
1035*00b67f09SDavid van Moolenbroek 
1036*00b67f09SDavid van Moolenbroek 	/* Set the supported types flags and addit to the subkey. */
1037*00b67f09SDavid van Moolenbroek 	dwData = EVENTLOG_ERROR_TYPE | EVENTLOG_WARNING_TYPE | EVENTLOG_INFORMATION_TYPE;
1038*00b67f09SDavid van Moolenbroek 	if (RegSetValueEx(hKey, "TypesSupported", 0, REG_DWORD,
1039*00b67f09SDavid van Moolenbroek 		(LPBYTE)&dwData, sizeof(DWORD)) != ERROR_SUCCESS)
1040*00b67f09SDavid van Moolenbroek 		throw(Exception(IDS_ERR_SET_VALUE, GetErrMessage()));
1041*00b67f09SDavid van Moolenbroek 
1042*00b67f09SDavid van Moolenbroek 	RegCloseKey(hKey);
1043*00b67f09SDavid van Moolenbroek 
1044*00b67f09SDavid van Moolenbroek 	SetItemStatus(IDC_REG_MESSAGE);
1045*00b67f09SDavid van Moolenbroek }
1046*00b67f09SDavid van Moolenbroek 
UnregisterMessages(BOOL uninstall)1047*00b67f09SDavid van Moolenbroek void CBINDInstallDlg::UnregisterMessages(BOOL uninstall) {
1048*00b67f09SDavid van Moolenbroek 	BOOL rc = FALSE;
1049*00b67f09SDavid van Moolenbroek 	HKEY hKey = NULL;
1050*00b67f09SDavid van Moolenbroek 
1051*00b67f09SDavid van Moolenbroek 	while(1) {
1052*00b67f09SDavid van Moolenbroek 		SetCurrent(IDS_UNREGISTER_MESSAGES);
1053*00b67f09SDavid van Moolenbroek 		/* Open key for Application Event Log */
1054*00b67f09SDavid van Moolenbroek 		if (RegOpenKey(HKEY_LOCAL_MACHINE, EVENTLOG_APP_SUBKEY, &hKey)
1055*00b67f09SDavid van Moolenbroek 			!= ERROR_SUCCESS)
1056*00b67f09SDavid van Moolenbroek 			break;
1057*00b67f09SDavid van Moolenbroek 
1058*00b67f09SDavid van Moolenbroek 		/* Remove named from the list of messages sources */
1059*00b67f09SDavid van Moolenbroek 		if (RegDeleteKey(hKey, BIND_MESSAGE_NAME) != ERROR_SUCCESS)
1060*00b67f09SDavid van Moolenbroek 			break;
1061*00b67f09SDavid van Moolenbroek 
1062*00b67f09SDavid van Moolenbroek 		rc = TRUE;
1063*00b67f09SDavid van Moolenbroek 		break;
1064*00b67f09SDavid van Moolenbroek 	}
1065*00b67f09SDavid van Moolenbroek 
1066*00b67f09SDavid van Moolenbroek 	if (hKey)
1067*00b67f09SDavid van Moolenbroek 		RegCloseKey(hKey);
1068*00b67f09SDavid van Moolenbroek 
1069*00b67f09SDavid van Moolenbroek 	if (uninstall)
1070*00b67f09SDavid van Moolenbroek 		SetItemStatus(IDC_REG_MESSAGE, rc);
1071*00b67f09SDavid van Moolenbroek }
1072*00b67f09SDavid van Moolenbroek 
1073*00b67f09SDavid van Moolenbroek /*
1074*00b67f09SDavid van Moolenbroek  * Install failed - clean up quietly
1075*00b67f09SDavid van Moolenbroek  */
FailedInstall()1076*00b67f09SDavid van Moolenbroek void CBINDInstallDlg::FailedInstall() {
1077*00b67f09SDavid van Moolenbroek 	UnregisterMessages(FALSE);
1078*00b67f09SDavid van Moolenbroek 	UnregisterService(FALSE);
1079*00b67f09SDavid van Moolenbroek 	DeleteFiles(FALSE);
1080*00b67f09SDavid van Moolenbroek 	RemoveDirs(FALSE);
1081*00b67f09SDavid van Moolenbroek }
1082*00b67f09SDavid van Moolenbroek 
1083*00b67f09SDavid van Moolenbroek /*
1084*00b67f09SDavid van Moolenbroek  * Set the checklist tags for install
1085*00b67f09SDavid van Moolenbroek  */
InstallTags()1086*00b67f09SDavid van Moolenbroek void CBINDInstallDlg::InstallTags() {
1087*00b67f09SDavid van Moolenbroek 	CString tag;
1088*00b67f09SDavid van Moolenbroek 
1089*00b67f09SDavid van Moolenbroek 	tag.LoadString(IDS_INSTALL_FILE);
1090*00b67f09SDavid van Moolenbroek 	GetDlgItem(IDC_COPY_TAG)->SetWindowText(tag);
1091*00b67f09SDavid van Moolenbroek 	GetDlgItem(IDC_COPY_FILE)->SetWindowText("");
1092*00b67f09SDavid van Moolenbroek 
1093*00b67f09SDavid van Moolenbroek 	tag.LoadString(IDS_INSTALL_DIR);
1094*00b67f09SDavid van Moolenbroek 	GetDlgItem(IDC_DIR_TAG)->SetWindowText(tag);
1095*00b67f09SDavid van Moolenbroek 	GetDlgItem(IDC_CREATE_DIR)->SetWindowText("");
1096*00b67f09SDavid van Moolenbroek 	GetDlgItem(IDC_REG_SERVICE)->SetWindowText("");
1097*00b67f09SDavid van Moolenbroek 
1098*00b67f09SDavid van Moolenbroek 	tag.LoadString(IDS_INSTALL_SERVICE);
1099*00b67f09SDavid van Moolenbroek 	GetDlgItem(IDC_SERVICE_TAG)->SetWindowText(tag);
1100*00b67f09SDavid van Moolenbroek 
1101*00b67f09SDavid van Moolenbroek 	tag.LoadString(IDS_INSTALL_MESSAGE);
1102*00b67f09SDavid van Moolenbroek 	GetDlgItem(IDC_MESSAGE_TAG)->SetWindowText(tag);
1103*00b67f09SDavid van Moolenbroek 	GetDlgItem(IDC_REG_MESSAGE)->SetWindowText("");
1104*00b67f09SDavid van Moolenbroek }
1105*00b67f09SDavid van Moolenbroek 
1106*00b67f09SDavid van Moolenbroek /*
1107*00b67f09SDavid van Moolenbroek  * Set the checklist tags for uninstall
1108*00b67f09SDavid van Moolenbroek  */
UninstallTags()1109*00b67f09SDavid van Moolenbroek void CBINDInstallDlg::UninstallTags() {
1110*00b67f09SDavid van Moolenbroek 	CString tag;
1111*00b67f09SDavid van Moolenbroek 
1112*00b67f09SDavid van Moolenbroek 	tag.LoadString(IDS_UNINSTALL_FILES);
1113*00b67f09SDavid van Moolenbroek 	GetDlgItem(IDC_COPY_TAG)->SetWindowText(tag);
1114*00b67f09SDavid van Moolenbroek 	GetDlgItem(IDC_COPY_FILE)->SetWindowText("");
1115*00b67f09SDavid van Moolenbroek 
1116*00b67f09SDavid van Moolenbroek 	tag.LoadString(IDS_UNINSTALL_DIR);
1117*00b67f09SDavid van Moolenbroek 	GetDlgItem(IDC_DIR_TAG)->SetWindowText(tag);
1118*00b67f09SDavid van Moolenbroek 	GetDlgItem(IDC_CREATE_DIR)->SetWindowText("");
1119*00b67f09SDavid van Moolenbroek 
1120*00b67f09SDavid van Moolenbroek 	tag.LoadString(IDS_UNINSTALL_SERVICE);
1121*00b67f09SDavid van Moolenbroek 	GetDlgItem(IDC_SERVICE_TAG)->SetWindowText(tag);
1122*00b67f09SDavid van Moolenbroek 	GetDlgItem(IDC_REG_SERVICE)->SetWindowText("");
1123*00b67f09SDavid van Moolenbroek 
1124*00b67f09SDavid van Moolenbroek 	tag.LoadString(IDS_UNINSTALL_MESSAGE);
1125*00b67f09SDavid van Moolenbroek 	GetDlgItem(IDC_MESSAGE_TAG)->SetWindowText(tag);
1126*00b67f09SDavid van Moolenbroek 	GetDlgItem(IDC_REG_MESSAGE)->SetWindowText("");
1127*00b67f09SDavid van Moolenbroek }
1128*00b67f09SDavid van Moolenbroek 
SetItemStatus(UINT nID,BOOL bSuccess)1129*00b67f09SDavid van Moolenbroek void CBINDInstallDlg::SetItemStatus(UINT nID, BOOL bSuccess) {
1130*00b67f09SDavid van Moolenbroek 	GetDlgItem(nID)->SetWindowText(bSuccess == TRUE ? "Done" : "Failed");
1131*00b67f09SDavid van Moolenbroek }
1132*00b67f09SDavid van Moolenbroek 
1133*00b67f09SDavid van Moolenbroek 
1134*00b67f09SDavid van Moolenbroek /*
1135*00b67f09SDavid van Moolenbroek  * Set the text in the current operation field - use a string table string
1136*00b67f09SDavid van Moolenbroek  */
SetCurrent(int id,...)1137*00b67f09SDavid van Moolenbroek void CBINDInstallDlg::SetCurrent(int id, ...) {
1138*00b67f09SDavid van Moolenbroek 	CString format;
1139*00b67f09SDavid van Moolenbroek 	va_list va;
1140*00b67f09SDavid van Moolenbroek 	char buf[128];
1141*00b67f09SDavid van Moolenbroek 
1142*00b67f09SDavid van Moolenbroek 	format.LoadString(id);
1143*00b67f09SDavid van Moolenbroek 	memset(buf, 0, 128);
1144*00b67f09SDavid van Moolenbroek 
1145*00b67f09SDavid van Moolenbroek 	va_start(va, id);
1146*00b67f09SDavid van Moolenbroek 	vsprintf(buf, format, va);
1147*00b67f09SDavid van Moolenbroek 	va_end(va);
1148*00b67f09SDavid van Moolenbroek 
1149*00b67f09SDavid van Moolenbroek 	m_current.Format("%s", buf);
1150*00b67f09SDavid van Moolenbroek 	UpdateData(FALSE);
1151*00b67f09SDavid van Moolenbroek }
1152*00b67f09SDavid van Moolenbroek 
1153*00b67f09SDavid van Moolenbroek /*
1154*00b67f09SDavid van Moolenbroek  * Stop the BIND service
1155*00b67f09SDavid van Moolenbroek  */
StopBINDService()1156*00b67f09SDavid van Moolenbroek void CBINDInstallDlg::StopBINDService() {
1157*00b67f09SDavid van Moolenbroek 	SERVICE_STATUS svcStatus;
1158*00b67f09SDavid van Moolenbroek 
1159*00b67f09SDavid van Moolenbroek 	SetCurrent(IDS_STOP_SERVICE);
1160*00b67f09SDavid van Moolenbroek 
1161*00b67f09SDavid van Moolenbroek 	SC_HANDLE hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
1162*00b67f09SDavid van Moolenbroek 	if (!hSCManager) {
1163*00b67f09SDavid van Moolenbroek 		MsgBox(IDS_ERR_OPEN_SCM, GetErrMessage());
1164*00b67f09SDavid van Moolenbroek 	}
1165*00b67f09SDavid van Moolenbroek 
1166*00b67f09SDavid van Moolenbroek 	SC_HANDLE hBINDSvc = OpenService(hSCManager, BIND_SERVICE_NAME,
1167*00b67f09SDavid van Moolenbroek 				      SERVICE_ALL_ACCESS);
1168*00b67f09SDavid van Moolenbroek 	if (!hBINDSvc) {
1169*00b67f09SDavid van Moolenbroek 		MsgBox(IDS_ERR_OPEN_SERVICE, GetErrMessage());
1170*00b67f09SDavid van Moolenbroek 	}
1171*00b67f09SDavid van Moolenbroek 
1172*00b67f09SDavid van Moolenbroek 	BOOL rc = ControlService(hBINDSvc, SERVICE_CONTROL_STOP, &svcStatus);
1173*00b67f09SDavid van Moolenbroek }
1174*00b67f09SDavid van Moolenbroek 
1175*00b67f09SDavid van Moolenbroek /*
1176*00b67f09SDavid van Moolenbroek  * Start the BIND service
1177*00b67f09SDavid van Moolenbroek  */
StartBINDService()1178*00b67f09SDavid van Moolenbroek void CBINDInstallDlg::StartBINDService() {
1179*00b67f09SDavid van Moolenbroek 	SetCurrent(IDS_START_SERVICE);
1180*00b67f09SDavid van Moolenbroek 
1181*00b67f09SDavid van Moolenbroek 	SC_HANDLE hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
1182*00b67f09SDavid van Moolenbroek 	if (!hSCManager) {
1183*00b67f09SDavid van Moolenbroek 		MsgBox(IDS_ERR_OPEN_SCM, GetErrMessage());
1184*00b67f09SDavid van Moolenbroek 	}
1185*00b67f09SDavid van Moolenbroek 
1186*00b67f09SDavid van Moolenbroek 	SC_HANDLE hBINDSvc = OpenService(hSCManager, BIND_SERVICE_NAME,
1187*00b67f09SDavid van Moolenbroek 				      SERVICE_ALL_ACCESS);
1188*00b67f09SDavid van Moolenbroek 	if (!hBINDSvc) {
1189*00b67f09SDavid van Moolenbroek 		MsgBox(IDS_ERR_OPEN_SERVICE, GetErrMessage());
1190*00b67f09SDavid van Moolenbroek 	}
1191*00b67f09SDavid van Moolenbroek 	BOOL rc = StartService(hBINDSvc, 0, NULL);
1192*00b67f09SDavid van Moolenbroek }
1193*00b67f09SDavid van Moolenbroek 
1194*00b67f09SDavid van Moolenbroek /*
1195*00b67f09SDavid van Moolenbroek  * Check to see if the BIND service is running or not
1196*00b67f09SDavid van Moolenbroek  */
CheckBINDService()1197*00b67f09SDavid van Moolenbroek BOOL CBINDInstallDlg::CheckBINDService() {
1198*00b67f09SDavid van Moolenbroek 	SERVICE_STATUS svcStatus;
1199*00b67f09SDavid van Moolenbroek 
1200*00b67f09SDavid van Moolenbroek 	SC_HANDLE hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
1201*00b67f09SDavid van Moolenbroek 	if (hSCManager) {
1202*00b67f09SDavid van Moolenbroek 		SC_HANDLE hBINDSvc = OpenService(hSCManager, BIND_SERVICE_NAME,
1203*00b67f09SDavid van Moolenbroek 					      SERVICE_ALL_ACCESS);
1204*00b67f09SDavid van Moolenbroek 		if (hBINDSvc) {
1205*00b67f09SDavid van Moolenbroek 			BOOL rc = ControlService(hBINDSvc,
1206*00b67f09SDavid van Moolenbroek 				  SERVICE_CONTROL_INTERROGATE, &svcStatus);
1207*00b67f09SDavid van Moolenbroek 			if (!rc)
1208*00b67f09SDavid van Moolenbroek 				DWORD err = GetLastError();
1209*00b67f09SDavid van Moolenbroek 
1210*00b67f09SDavid van Moolenbroek 			return (svcStatus.dwCurrentState == SERVICE_RUNNING);
1211*00b67f09SDavid van Moolenbroek 		}
1212*00b67f09SDavid van Moolenbroek 	}
1213*00b67f09SDavid van Moolenbroek 	return (FALSE);
1214*00b67f09SDavid van Moolenbroek }
1215*00b67f09SDavid van Moolenbroek 
1216*00b67f09SDavid van Moolenbroek /*
1217*00b67f09SDavid van Moolenbroek  * Display message boxes with variable args, using string table strings
1218*00b67f09SDavid van Moolenbroek  * for the format specifiers
1219*00b67f09SDavid van Moolenbroek  */
MsgBox(int id,...)1220*00b67f09SDavid van Moolenbroek int CBINDInstallDlg::MsgBox(int id, ...) {
1221*00b67f09SDavid van Moolenbroek 	CString format;
1222*00b67f09SDavid van Moolenbroek 	va_list va;
1223*00b67f09SDavid van Moolenbroek 	char buf[BUFSIZ];
1224*00b67f09SDavid van Moolenbroek 
1225*00b67f09SDavid van Moolenbroek 	format.LoadString(id);
1226*00b67f09SDavid van Moolenbroek 	memset(buf, 0, BUFSIZ);
1227*00b67f09SDavid van Moolenbroek 
1228*00b67f09SDavid van Moolenbroek 	va_start(va, id);
1229*00b67f09SDavid van Moolenbroek 	vsprintf(buf, format, va);
1230*00b67f09SDavid van Moolenbroek 	va_end(va);
1231*00b67f09SDavid van Moolenbroek 
1232*00b67f09SDavid van Moolenbroek 	return (MessageBox(buf));
1233*00b67f09SDavid van Moolenbroek }
1234*00b67f09SDavid van Moolenbroek 
MsgBox(int id,UINT type,...)1235*00b67f09SDavid van Moolenbroek int CBINDInstallDlg::MsgBox(int id, UINT type, ...) {
1236*00b67f09SDavid van Moolenbroek 	CString format;
1237*00b67f09SDavid van Moolenbroek 	va_list va;
1238*00b67f09SDavid van Moolenbroek 	char buf[BUFSIZ];
1239*00b67f09SDavid van Moolenbroek 
1240*00b67f09SDavid van Moolenbroek 	format.LoadString(id);
1241*00b67f09SDavid van Moolenbroek 	memset(buf, 0, BUFSIZ);
1242*00b67f09SDavid van Moolenbroek 
1243*00b67f09SDavid van Moolenbroek 	va_start(va, type);
1244*00b67f09SDavid van Moolenbroek 	vsprintf(buf, format, va);
1245*00b67f09SDavid van Moolenbroek 	va_end(va);
1246*00b67f09SDavid van Moolenbroek 
1247*00b67f09SDavid van Moolenbroek 	return(MessageBox(buf, NULL, type));
1248*00b67f09SDavid van Moolenbroek }
1249*00b67f09SDavid van Moolenbroek 
1250*00b67f09SDavid van Moolenbroek /*
1251*00b67f09SDavid van Moolenbroek  * Call GetLastError(), retrieve the message associated with the error
1252*00b67f09SDavid van Moolenbroek  */
GetErrMessage(DWORD err)1253*00b67f09SDavid van Moolenbroek CString CBINDInstallDlg::GetErrMessage(DWORD err) {
1254*00b67f09SDavid van Moolenbroek 	LPVOID msgBuf;
1255*00b67f09SDavid van Moolenbroek 	static char buf[BUFSIZ];
1256*00b67f09SDavid van Moolenbroek 
1257*00b67f09SDavid van Moolenbroek 	DWORD len = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
1258*00b67f09SDavid van Moolenbroek 		NULL, err == -1 ? GetLastError() : err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &msgBuf, 0, NULL );
1259*00b67f09SDavid van Moolenbroek 
1260*00b67f09SDavid van Moolenbroek 
1261*00b67f09SDavid van Moolenbroek 	strcpy(buf, (LPTSTR)msgBuf);
1262*00b67f09SDavid van Moolenbroek 	LocalFree(msgBuf);
1263*00b67f09SDavid van Moolenbroek 	/* Strip off the period and the \n */
1264*00b67f09SDavid van Moolenbroek 	buf[len - 3] = 0;
1265*00b67f09SDavid van Moolenbroek 	return(buf);
1266*00b67f09SDavid van Moolenbroek }
1267*00b67f09SDavid van Moolenbroek 
ProgramGroup(BOOL create)1268*00b67f09SDavid van Moolenbroek void CBINDInstallDlg::ProgramGroup(BOOL create) {
1269*00b67f09SDavid van Moolenbroek 	TCHAR path[MAX_PATH], commonPath[MAX_PATH], fileloc[MAX_PATH], linkpath[MAX_PATH];
1270*00b67f09SDavid van Moolenbroek 	HRESULT hres;
1271*00b67f09SDavid van Moolenbroek 	IShellLink *psl = NULL;
1272*00b67f09SDavid van Moolenbroek 	LPMALLOC pMalloc = NULL;
1273*00b67f09SDavid van Moolenbroek 	ITEMIDLIST *itemList = NULL;
1274*00b67f09SDavid van Moolenbroek 
1275*00b67f09SDavid van Moolenbroek 	HRESULT hr = SHGetMalloc(&pMalloc);
1276*00b67f09SDavid van Moolenbroek 	if (hr != NOERROR) {
1277*00b67f09SDavid van Moolenbroek 		MessageBox("Could not get a handle to Shell memory object");
1278*00b67f09SDavid van Moolenbroek 		return;
1279*00b67f09SDavid van Moolenbroek 	}
1280*00b67f09SDavid van Moolenbroek 
1281*00b67f09SDavid van Moolenbroek 	hr = SHGetSpecialFolderLocation(m_hWnd, CSIDL_COMMON_PROGRAMS, &itemList);
1282*00b67f09SDavid van Moolenbroek 	if (hr != NOERROR) {
1283*00b67f09SDavid van Moolenbroek 		MessageBox("Could not get a handle to the Common Programs folder");
1284*00b67f09SDavid van Moolenbroek 		if (itemList) {
1285*00b67f09SDavid van Moolenbroek 			pMalloc->Free(itemList);
1286*00b67f09SDavid van Moolenbroek 		}
1287*00b67f09SDavid van Moolenbroek 		return;
1288*00b67f09SDavid van Moolenbroek 	}
1289*00b67f09SDavid van Moolenbroek 
1290*00b67f09SDavid van Moolenbroek 	hr = SHGetPathFromIDList(itemList, commonPath);
1291*00b67f09SDavid van Moolenbroek 	pMalloc->Free(itemList);
1292*00b67f09SDavid van Moolenbroek 
1293*00b67f09SDavid van Moolenbroek 	if (create) {
1294*00b67f09SDavid van Moolenbroek 		sprintf(path, "%s\\ISC", commonPath);
1295*00b67f09SDavid van Moolenbroek 		CreateDirectory(path, NULL);
1296*00b67f09SDavid van Moolenbroek 
1297*00b67f09SDavid van Moolenbroek 		sprintf(path, "%s\\ISC\\BIND", commonPath);
1298*00b67f09SDavid van Moolenbroek 		CreateDirectory(path, NULL);
1299*00b67f09SDavid van Moolenbroek 
1300*00b67f09SDavid van Moolenbroek 		hres = CoInitialize(NULL);
1301*00b67f09SDavid van Moolenbroek 
1302*00b67f09SDavid van Moolenbroek 		if (SUCCEEDED(hres)) {
1303*00b67f09SDavid van Moolenbroek 			// Get a pointer to the IShellLink interface.
1304*00b67f09SDavid van Moolenbroek 			hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID *)&psl);
1305*00b67f09SDavid van Moolenbroek 			if (SUCCEEDED(hres))
1306*00b67f09SDavid van Moolenbroek 			{
1307*00b67f09SDavid van Moolenbroek 				IPersistFile* ppf;
1308*00b67f09SDavid van Moolenbroek 				sprintf(linkpath, "%s\\BINDCtrl.lnk", path);
1309*00b67f09SDavid van Moolenbroek 				sprintf(fileloc, "%s\\BINDCtrl.exe", m_binDir);
1310*00b67f09SDavid van Moolenbroek 
1311*00b67f09SDavid van Moolenbroek 				psl->SetPath(fileloc);
1312*00b67f09SDavid van Moolenbroek 				psl->SetDescription("BIND Control Panel");
1313*00b67f09SDavid van Moolenbroek 
1314*00b67f09SDavid van Moolenbroek 				hres = psl->QueryInterface(IID_IPersistFile, (void **)&ppf);
1315*00b67f09SDavid van Moolenbroek 				if (SUCCEEDED(hres)) {
1316*00b67f09SDavid van Moolenbroek 					WCHAR wsz[MAX_PATH];
1317*00b67f09SDavid van Moolenbroek 
1318*00b67f09SDavid van Moolenbroek 					MultiByteToWideChar(CP_ACP, 0, linkpath, -1, wsz, MAX_PATH);
1319*00b67f09SDavid van Moolenbroek 					hres = ppf->Save(wsz, TRUE);
1320*00b67f09SDavid van Moolenbroek 					ppf->Release();
1321*00b67f09SDavid van Moolenbroek 				}
1322*00b67f09SDavid van Moolenbroek 
1323*00b67f09SDavid van Moolenbroek 				if (GetFileAttributes("readme.txt") != -1) {
1324*00b67f09SDavid van Moolenbroek 					sprintf(fileloc, "%s\\Readme.txt", m_targetDir);
1325*00b67f09SDavid van Moolenbroek 					sprintf(linkpath, "%s\\Readme.lnk", path);
1326*00b67f09SDavid van Moolenbroek 
1327*00b67f09SDavid van Moolenbroek 					psl->SetPath(fileloc);
1328*00b67f09SDavid van Moolenbroek 					psl->SetDescription("BIND Readme");
1329*00b67f09SDavid van Moolenbroek 
1330*00b67f09SDavid van Moolenbroek 					hres = psl->QueryInterface(IID_IPersistFile, (void **)&ppf);
1331*00b67f09SDavid van Moolenbroek 					if (SUCCEEDED(hres)) {
1332*00b67f09SDavid van Moolenbroek 						WCHAR wsz[MAX_PATH];
1333*00b67f09SDavid van Moolenbroek 
1334*00b67f09SDavid van Moolenbroek 						MultiByteToWideChar(CP_ACP, 0, linkpath, -1, wsz, MAX_PATH);
1335*00b67f09SDavid van Moolenbroek 						hres = ppf->Save(wsz, TRUE);
1336*00b67f09SDavid van Moolenbroek 						ppf->Release();
1337*00b67f09SDavid van Moolenbroek 					}
1338*00b67f09SDavid van Moolenbroek 					psl->Release();
1339*00b67f09SDavid van Moolenbroek 				}
1340*00b67f09SDavid van Moolenbroek 			}
1341*00b67f09SDavid van Moolenbroek 			CoUninitialize();
1342*00b67f09SDavid van Moolenbroek 		}
1343*00b67f09SDavid van Moolenbroek 	}
1344*00b67f09SDavid van Moolenbroek 	else {
1345*00b67f09SDavid van Moolenbroek 		TCHAR filename[MAX_PATH];
1346*00b67f09SDavid van Moolenbroek 		WIN32_FIND_DATA fd;
1347*00b67f09SDavid van Moolenbroek 
1348*00b67f09SDavid van Moolenbroek 		sprintf(path, "%s\\ISC\\BIND", commonPath);
1349*00b67f09SDavid van Moolenbroek 
1350*00b67f09SDavid van Moolenbroek 		sprintf(filename, "%s\\*.*", path);
1351*00b67f09SDavid van Moolenbroek 		HANDLE hFind = FindFirstFile(filename, &fd);
1352*00b67f09SDavid van Moolenbroek 		if (hFind != INVALID_HANDLE_VALUE) {
1353*00b67f09SDavid van Moolenbroek 			do {
1354*00b67f09SDavid van Moolenbroek 				if (strcmp(fd.cFileName, ".") && strcmp(fd.cFileName, "..")) {
1355*00b67f09SDavid van Moolenbroek 					sprintf(filename, "%s\\%s", path, fd.cFileName);
1356*00b67f09SDavid van Moolenbroek 					DeleteFile(filename);
1357*00b67f09SDavid van Moolenbroek 				}
1358*00b67f09SDavid van Moolenbroek 			} while (FindNextFile(hFind, &fd));
1359*00b67f09SDavid van Moolenbroek 			FindClose(hFind);
1360*00b67f09SDavid van Moolenbroek 		}
1361*00b67f09SDavid van Moolenbroek 		RemoveDirectory(path);
1362*00b67f09SDavid van Moolenbroek 		sprintf(path, "%s\\ISC", commonPath);
1363*00b67f09SDavid van Moolenbroek 		RemoveDirectory(path);
1364*00b67f09SDavid van Moolenbroek 	}
1365*00b67f09SDavid van Moolenbroek }
1366*00b67f09SDavid van Moolenbroek 
DestDir(int destination)1367*00b67f09SDavid van Moolenbroek CString CBINDInstallDlg::DestDir(int destination) {
1368*00b67f09SDavid van Moolenbroek 	switch(destination) {
1369*00b67f09SDavid van Moolenbroek 		case FileData::TargetDir:
1370*00b67f09SDavid van Moolenbroek 			return m_targetDir;
1371*00b67f09SDavid van Moolenbroek 		case FileData::BinDir:
1372*00b67f09SDavid van Moolenbroek 			return m_binDir;
1373*00b67f09SDavid van Moolenbroek 		case FileData::EtcDir:
1374*00b67f09SDavid van Moolenbroek 			return m_etcDir;
1375*00b67f09SDavid van Moolenbroek 		case FileData::WinSystem:
1376*00b67f09SDavid van Moolenbroek 			return m_winSysDir;
1377*00b67f09SDavid van Moolenbroek 	}
1378*00b67f09SDavid van Moolenbroek 	return("");
1379*00b67f09SDavid van Moolenbroek }
1380