VirtualBox

source: vbox/trunk/src/VBox/HostDrivers/VBoxNetFlt/win/tools/VBoxNetAdpInstall.cpp@ 79409

Last change on this file since 79409 was 79409, checked in by vboxsync, 6 years ago

VBoxNetAdpInstall.cpp: Use same fallback as the others.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 10.9 KB
Line 
1/* $Id: VBoxNetAdpInstall.cpp 79409 2019-06-28 11:45:54Z vboxsync $ */
2/** @file
3 * NetAdpInstall - VBoxNetAdp installer command line tool.
4 */
5
6/*
7 * Copyright (C) 2009-2019 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 *
17 * The contents of this file may alternatively be used under the terms
18 * of the Common Development and Distribution License Version 1.0
19 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
20 * VirtualBox OSE distribution, in which case the provisions of the
21 * CDDL are applicable instead of those of the GPL.
22 *
23 * You may elect to license modified versions of this file under the
24 * terms and conditions of either the GPL or the CDDL or both.
25 */
26
27
28/*********************************************************************************************************************************
29* Header Files *
30*********************************************************************************************************************************/
31#include <VBox/VBoxNetCfg-win.h>
32#include <VBox/VBoxDrvCfg-win.h>
33#include <stdio.h>
34#include <devguid.h>
35
36
37/*********************************************************************************************************************************
38* Defined Constants And Macros *
39*********************************************************************************************************************************/
40#define VBOX_NETADP_APP_NAME L"NetAdpInstall"
41
42#define VBOX_NETADP_HWID L"sun_VBoxNetAdp"
43#ifdef NDIS60
44# define VBOX_NETADP_INF L"VBoxNetAdp6.inf"
45#else
46# define VBOX_NETADP_INF L"VBoxNetAdp.inf"
47#endif
48
49
50static VOID winNetCfgLogger(LPCSTR szString)
51{
52 printf("%s\n", szString);
53}
54
55
56/** Wrapper around GetfullPathNameW that will try an alternative INF location.
57 *
58 * The default location is the current directory. If not found there, the
59 * alternative location is the executable directory. If not found there either,
60 * the first alternative is present to the caller.
61 */
62static DWORD MyGetfullPathNameW(LPCWSTR pwszName, size_t cchFull, LPWSTR pwszFull)
63{
64 LPWSTR pwszFilePart;
65 DWORD dwSize = GetFullPathNameW(pwszName, (DWORD)cchFull, pwszFull, &pwszFilePart);
66 if (dwSize <= 0)
67 return dwSize;
68
69 /* if it doesn't exist, see if the file exists in the same directory as the executable. */
70 if (GetFileAttributesW(pwszFull) == INVALID_FILE_ATTRIBUTES)
71 {
72 WCHAR wsz[512];
73 DWORD cch = GetModuleFileNameW(GetModuleHandle(NULL), &wsz[0], sizeof(wsz) / sizeof(wsz[0]));
74 if (cch > 0)
75 {
76 while (cch > 0 && wsz[cch - 1] != '/' && wsz[cch - 1] != '\\' && wsz[cch - 1] != ':')
77 cch--;
78 unsigned i = 0;
79 while (cch < sizeof(wsz) / sizeof(wsz[0]))
80 {
81 wsz[cch] = pwszFilePart[i++];
82 if (!wsz[cch])
83 {
84 dwSize = GetFullPathNameW(wsz, (DWORD)cchFull, pwszFull, NULL);
85 if (dwSize > 0 && GetFileAttributesW(pwszFull) != INVALID_FILE_ATTRIBUTES)
86 return dwSize;
87 break;
88 }
89 cch++;
90 }
91 }
92 }
93
94 /* fallback */
95 return GetFullPathNameW(pwszName, (DWORD)cchFull, pwszFull, NULL);
96}
97
98
99static int VBoxNetAdpInstall(void)
100{
101 VBoxNetCfgWinSetLogging(winNetCfgLogger);
102
103 HRESULT hr = CoInitialize(NULL);
104 if (SUCCEEDED(hr))
105 {
106 wprintf(L"adding host-only interface..\n");
107
108 WCHAR wszInfFile[MAX_PATH];
109 DWORD cwcInfFile = MyGetfullPathNameW(VBOX_NETADP_INF, sizeof(wszInfFile) / sizeof(wszInfFile[0]), wszInfFile);
110 if (cwcInfFile > 0)
111 {
112 INetCfg *pnc;
113 LPWSTR lpszLockedBy = NULL;
114 hr = VBoxNetCfgWinQueryINetCfg(&pnc, TRUE, VBOX_NETADP_APP_NAME, 10000, &lpszLockedBy);
115 if (hr == S_OK)
116 {
117
118 hr = VBoxNetCfgWinNetAdpInstall(pnc, wszInfFile);
119
120 if (hr == S_OK)
121 {
122 wprintf(L"installed successfully\n");
123 }
124 else
125 {
126 wprintf(L"error installing VBoxNetAdp (0x%x)\n", hr);
127 }
128
129 VBoxNetCfgWinReleaseINetCfg(pnc, TRUE);
130 }
131 else
132 wprintf(L"VBoxNetCfgWinQueryINetCfg failed: hr = 0x%x\n", hr);
133 /*
134 hr = VBoxDrvCfgInfInstall(MpInf);
135 if (FAILED(hr))
136 printf("VBoxDrvCfgInfInstall failed %#x\n", hr);
137
138 GUID guid;
139 BSTR name, errMsg;
140
141 hr = VBoxNetCfgWinCreateHostOnlyNetworkInterface (MpInf, true, &guid, &name, &errMsg);
142 if (SUCCEEDED(hr))
143 {
144 ULONG ip, mask;
145 hr = VBoxNetCfgWinGenHostOnlyNetworkNetworkIp(&ip, &mask);
146 if (SUCCEEDED(hr))
147 {
148 // ip returned by VBoxNetCfgWinGenHostOnlyNetworkNetworkIp is a network ip,
149 // i.e. 192.168.xxx.0, assign 192.168.xxx.1 for the hostonly adapter
150 ip = ip | (1 << 24);
151 hr = VBoxNetCfgWinEnableStaticIpConfig(&guid, ip, mask);
152 if (SUCCEEDED(hr))
153 {
154 printf("installation successful\n");
155 }
156 else
157 printf("VBoxNetCfgWinEnableStaticIpConfig failed: hr = 0x%x\n", hr);
158 }
159 else
160 printf("VBoxNetCfgWinGenHostOnlyNetworkNetworkIp failed: hr = 0x%x\n", hr);
161 }
162 else
163 printf("VBoxNetCfgWinCreateHostOnlyNetworkInterface failed: hr = 0x%x\n", hr);
164 */
165 }
166 else
167 {
168 DWORD dwErr = GetLastError();
169 wprintf(L"GetFullPathNameW failed: winEr = %d\n", dwErr);
170 hr = HRESULT_FROM_WIN32(dwErr);
171 }
172 CoUninitialize();
173 }
174 else
175 wprintf(L"Error initializing COM (0x%x)\n", hr);
176
177 VBoxNetCfgWinSetLogging(NULL);
178
179 return SUCCEEDED(hr) ? 0 : 1;
180}
181
182static int VBoxNetAdpUninstall(void)
183{
184 VBoxNetCfgWinSetLogging(winNetCfgLogger);
185
186 printf("uninstalling all host-only interfaces..\n");
187
188 HRESULT hr = CoInitialize(NULL);
189 if (SUCCEEDED(hr))
190 {
191 hr = VBoxNetCfgWinRemoveAllNetDevicesOfId(VBOX_NETADP_HWID);
192 if (SUCCEEDED(hr))
193 {
194 hr = VBoxDrvCfgInfUninstallAllSetupDi(&GUID_DEVCLASS_NET, L"Net", VBOX_NETADP_HWID, 0/* could be SUOI_FORCEDELETE */);
195 if (SUCCEEDED(hr))
196 {
197 printf("uninstallation successful\n");
198 }
199 else
200 printf("uninstalled successfully, but failed to remove infs\n");
201 }
202 else
203 printf("uninstall failed, hr = 0x%x\n", hr);
204 CoUninitialize();
205 }
206 else
207 printf("Error initializing COM (0x%x)\n", hr);
208
209 VBoxNetCfgWinSetLogging(NULL);
210
211 return SUCCEEDED(hr) ? 0 : 1;
212}
213
214static int VBoxNetAdpUpdate(void)
215{
216 VBoxNetCfgWinSetLogging(winNetCfgLogger);
217
218 printf("uninstalling all host-only interfaces..\n");
219
220 HRESULT hr = CoInitialize(NULL);
221 if (SUCCEEDED(hr))
222 {
223 BOOL fRebootRequired = FALSE;
224 /*
225 * Before we can update the driver for existing adapters we need to remove
226 * all old driver packages from the driver cache. Otherwise we may end up
227 * with both NDIS5 and NDIS6 versions of VBoxNetAdp in the cache which
228 * will cause all sorts of trouble.
229 */
230 VBoxDrvCfgInfUninstallAllF(L"Net", VBOX_NETADP_HWID, SUOI_FORCEDELETE);
231 hr = VBoxNetCfgWinUpdateHostOnlyNetworkInterface(VBOX_NETADP_INF, &fRebootRequired, VBOX_NETADP_HWID);
232 if (SUCCEEDED(hr))
233 {
234 if (fRebootRequired)
235 printf("!!REBOOT REQUIRED!!\n");
236 printf("updated successfully\n");
237 }
238 else
239 printf("update failed, hr = 0x%x\n", hr);
240
241 CoUninitialize();
242 }
243 else
244 printf("Error initializing COM (0x%x)\n", hr);
245
246 VBoxNetCfgWinSetLogging(NULL);
247
248 return SUCCEEDED(hr) ? 0 : 1;
249}
250
251static int VBoxNetAdpDisable(void)
252{
253 VBoxNetCfgWinSetLogging(winNetCfgLogger);
254
255 printf("disabling all host-only interfaces..\n");
256
257 HRESULT hr = CoInitialize(NULL);
258 if (SUCCEEDED(hr))
259 {
260 hr = VBoxNetCfgWinPropChangeAllNetDevicesOfId(VBOX_NETADP_HWID, VBOXNECTFGWINPROPCHANGE_TYPE_DISABLE);
261 if (SUCCEEDED(hr))
262 {
263 printf("disabling successful\n");
264 }
265 else
266 printf("disable failed, hr = 0x%x\n", hr);
267
268 CoUninitialize();
269 }
270 else
271 printf("Error initializing COM (0x%x)\n", hr);
272
273 VBoxNetCfgWinSetLogging(NULL);
274
275 return SUCCEEDED(hr) ? 0 : 1;
276}
277
278static int VBoxNetAdpEnable(void)
279{
280 VBoxNetCfgWinSetLogging(winNetCfgLogger);
281
282 printf("enabling all host-only interfaces..\n");
283
284 HRESULT hr = CoInitialize(NULL);
285 if (SUCCEEDED(hr))
286 {
287 hr = VBoxNetCfgWinPropChangeAllNetDevicesOfId(VBOX_NETADP_HWID, VBOXNECTFGWINPROPCHANGE_TYPE_ENABLE);
288 if (SUCCEEDED(hr))
289 {
290 printf("enabling successful\n");
291 }
292 else
293 printf("enabling failed, hr = 0x%x\n", hr);
294
295 CoUninitialize();
296 }
297 else
298 printf("Error initializing COM (0x%x)\n", hr);
299
300 VBoxNetCfgWinSetLogging(NULL);
301
302 return SUCCEEDED(hr) ? 0 : 1;
303}
304
305static void printUsage(void)
306{
307 printf("host-only network adapter configuration tool\n"
308 " Usage: VBoxNetAdpInstall [cmd]\n"
309 " cmd can be one of the following values:\n"
310 " i - install a new host-only interface (default command)\n"
311 " u - uninstall all host-only interfaces\n"
312 " a - update the host-only driver\n"
313 " d - disable all host-only interfaces\n"
314 " e - enable all host-only interfaces\n"
315 " h - print this message\n");
316}
317
318int __cdecl main(int argc, char **argv)
319{
320 if (argc < 2)
321 return VBoxNetAdpInstall();
322 if (argc > 2)
323 {
324 printUsage();
325 return 1;
326 }
327
328 if (!strcmp(argv[1], "i"))
329 return VBoxNetAdpInstall();
330 if (!strcmp(argv[1], "u"))
331 return VBoxNetAdpUninstall();
332 if (!strcmp(argv[1], "a"))
333 return VBoxNetAdpUpdate();
334 if (!strcmp(argv[1], "d"))
335 return VBoxNetAdpDisable();
336 if (!strcmp(argv[1], "e"))
337 return VBoxNetAdpEnable();
338
339 printUsage();
340 return !strcmp(argv[1], "h");
341}
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette