135 if (wcsicmp(name, a->szName) == 0)
139 LPOLESTR adapter_id = NULL;
140 StringFromIID((REFIID)&a->guid, &adapter_id);
141 fwprintf(stderr, L
"Adapter \"%ls\" already exists (GUID %"
142 L
"ls).\n", a->szName, adapter_id);
143 CoTaskMemFree(adapter_id);
166 if (wcsicmp(hwid, L
"ovpn-dco") == 0)
168 base_name = L
"OpenVPN Data Channel Offload";
172 base_name = L
"OpenVPN TAP-Windows6";
181 return wcsdup(base_name);
184 size_t name_len = wcslen(base_name) + 10;
185 LPWSTR name = malloc(name_len *
sizeof(WCHAR));
190 for (
int i = 1; i < 100; ++i)
192 swprintf_s(name, name_len, L
"%ls #%d", base_name, i);
210 BOOL bRebootRequired = FALSE;
213 SetupSetNonInteractiveMode(TRUE);
220 else if (wcsicmp(
argv[1], L
"help") == 0)
227 else if (wcsicmp(
argv[2], L
"create") == 0)
231 else if (wcsicmp(
argv[2], L
"list") == 0)
235 else if (wcsicmp(
argv[2], L
"delete") == 0)
241 fwprintf(stderr, L
"Unknown command \"%ls"
242 L
"\". Please, use \"tapctl help\" to list supported commands.\n",
argv[2]);
247 else if (wcsicmp(
argv[1], L
"create") == 0)
249 LPCWSTR szName = NULL;
253 for (
int i = 2; i < argc; i++)
255 if (wcsicmp(
argv[i], L
"--name") == 0)
259 else if (wcsicmp(
argv[i], L
"--hwid") == 0)
265 fwprintf(stderr, L
"Unknown option \"%ls"
266 L
"\". Please, use \"tapctl help create\" to list supported options. Ignored.\n",
273 LPOLESTR szAdapterId = NULL;
280 if (dwResult != ERROR_SUCCESS)
282 fwprintf(stderr, L
"Creating TUN/TAP adapter failed (error 0x%x).\n", dwResult);
283 iResult = 1;
goto quit;
289 if (dwResult != ERROR_SUCCESS)
291 fwprintf(stderr, L
"Enumerating adapters failed (error 0x%x).\n", dwResult);
293 goto create_delete_adapter;
304 goto create_cleanup_pAdapterList;
309 if (dwResult != ERROR_SUCCESS)
311 StringFromIID((REFIID)&guidAdapter, &szAdapterId);
312 fwprintf(stderr, L
"Renaming TUN/TAP adapter %ls"
313 L
" to \"%ls\" failed (error 0x%x).\n",
314 szAdapterId, adapter_name, dwResult);
315 CoTaskMemFree(szAdapterId);
316 iResult = 1;
goto quit;
322create_cleanup_pAdapterList:
328 goto create_delete_adapter;
332 StringFromIID((REFIID)&guidAdapter, &szAdapterId);
333 fwprintf(stdout, L
"%ls\n", szAdapterId);
334 CoTaskMemFree(szAdapterId);
336 iResult = 0;
goto quit;
338create_delete_adapter:
343 iResult = 1;
goto quit;
345 else if (wcsicmp(
argv[1], L
"list") == 0)
347 WCHAR szzHwId[0x100] =
353 for (
int i = 2; i < argc; i++)
355 if (wcsicmp(
argv[i], L
"--hwid") == 0)
357 memset(szzHwId, 0,
sizeof(szzHwId));
359 memcpy_s(szzHwId,
sizeof(szzHwId) - 2*
sizeof(WCHAR) ,
argv[i], wcslen(
argv[i])*
sizeof(WCHAR));
363 fwprintf(stderr, L
"Unknown option \"%ls"
364 L
"\". Please, use \"tapctl help list\" to list supported options. Ignored.\n",
372 if (dwResult != ERROR_SUCCESS)
374 fwprintf(stderr, L
"Enumerating TUN/TAP adapters failed (error 0x%x).\n", dwResult);
375 iResult = 1;
goto quit;
380 LPOLESTR szAdapterId = NULL;
381 StringFromIID((REFIID)&pAdapter->guid, &szAdapterId);
382 fwprintf(stdout, L
"%ls\t%"
383 L
"ls\n", szAdapterId, pAdapter->szName);
384 CoTaskMemFree(szAdapterId);
390 else if (wcsicmp(
argv[1], L
"delete") == 0)
394 fwprintf(stderr, L
"Missing adapter GUID or name. Please, use \"tapctl help delete\" for usage info.\n");
399 if (FAILED(IIDFromString(
argv[2], (LPIID)&guidAdapter)))
404 if (dwResult != ERROR_SUCCESS)
406 fwprintf(stderr, L
"Enumerating TUN/TAP adapters failed (error 0x%x).\n", dwResult);
407 iResult = 1;
goto quit;
412 if (pAdapter == NULL)
414 fwprintf(stderr, L
"\"%ls\" adapter not found.\n",
argv[2]);
415 iResult = 1;
goto delete_cleanup_pAdapterList;
417 else if (wcsicmp(
argv[2], pAdapter->szName) == 0)
419 memcpy(&guidAdapter, &pAdapter->guid,
sizeof(GUID));
426delete_cleanup_pAdapterList:
439 if (dwResult != ERROR_SUCCESS)
441 fwprintf(stderr, L
"Deleting adapter \"%ls"
442 L
"\" failed (error 0x%x).\n",
argv[2], dwResult);
443 iResult = 1;
goto quit;
446 iResult = 0;
goto quit;
450 fwprintf(stderr, L
"Unknown command \"%ls"
451 L
"\". Please, use \"tapctl help\" to list supported commands.\n",
argv[1]);
458 fwprintf(stderr, L
"A system reboot is required.\n");
475x_msg_va(
const unsigned int flags,
const char *format, va_list arglist)
478 vfprintf(stderr, format, arglist);
479 fwprintf(stderr, L
"\n");
484 DWORD dwResult = GetLastError();
485 LPWSTR szErrMessage = NULL;
487 FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS,
491 (LPWSTR)&szErrMessage,
493 NULL) && szErrMessage)
496 for (
size_t i = 0, i_last = 0;; i++)
500 if (!iswspace(szErrMessage[i]))
507 szErrMessage[i_last] = 0;
513 fwprintf(stderr, L
"Error 0x%x: %ls\n", dwResult, szErrMessage);
515 LocalFree(szErrMessage);
519 fwprintf(stderr, L
"Error 0x%x\n", dwResult);
int __cdecl wmain(int argc, LPCWSTR argv[])
Program entry point.
static const WCHAR usage_message_delete[]
static BOOL is_adapter_name_available(LPCWSTR name, struct tap_adapter_node *adapter_list, BOOL log)
Checks if adapter with given name doesn't already exist.
static const WCHAR usage_message_list[]
bool dont_mute(unsigned int flags)
Check muting filter.
void x_msg_va(const unsigned int flags, const char *format, va_list arglist)
static LPWSTR get_unique_adapter_name(LPCWSTR hwid, struct tap_adapter_node *adapter_list)
Returns unique adapter name based on hwid or NULL if name cannot be generated.
const WCHAR title_string[]
static const WCHAR usage_message_create[]
static const WCHAR usage_message[]
DWORD tap_list_adapters(_In_opt_ HWND hwndParent, _In_opt_ LPCWSTR szzHwIDs, _Out_ struct tap_adapter_node **ppAdapter)
Creates a list of existing network adapters.
DWORD tap_create_adapter(_In_opt_ HWND hwndParent, _In_opt_ LPCWSTR szDeviceDescription, _In_ LPCWSTR szHwId, _Inout_ LPBOOL pbRebootRequired, _Out_ LPGUID pguidAdapter)
Creates a TUN/TAP adapter.