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