167 if (wcsicmp(hwid, L
"ovpn-dco") == 0)
169 base_name = L
"OpenVPN Data Channel Offload";
171 else if (wcsicmp(hwid, L
"root\\" _L(TAP_WIN_COMPONENT_ID)) == 0)
173 base_name = L
"OpenVPN TAP-Windows6";
182 return wcsdup(base_name);
185 size_t name_len = wcslen(base_name) + 10;
186 LPWSTR name = malloc(name_len *
sizeof(WCHAR));
191 for (
int i = 1;
i < 100; ++
i)
193 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)
242 L
"Unknown command \"%ls"
243 L
"\". Please, use \"tapctl help\" to list supported commands.\n",
249 else if (wcsicmp(
argv[1], L
"create") == 0)
251 LPCWSTR szName = NULL;
252 LPCWSTR szHwId = L
"root\\" _L(TAP_WIN_COMPONENT_ID);
255 for (
int i = 2;
i < argc;
i++)
257 if (wcsicmp(
argv[
i], L
"--name") == 0)
261 else if (wcsicmp(
argv[
i], L
"--hwid") == 0)
269 L
"Unknown option \"%ls"
270 L
"\". Please, use \"tapctl help create\" to list supported options. Ignored.\n",
277 LPOLESTR szAdapterId = NULL;
279 tap_create_adapter(NULL, L
"Virtual Ethernet", szHwId, &bRebootRequired, &guidAdapter);
280 if (dwResult != ERROR_SUCCESS)
282 fwprintf(stderr, L
"Creating TUN/TAP adapter failed (error 0x%x).\n", dwResult);
290 if (dwResult != ERROR_SUCCESS)
292 fwprintf(stderr, L
"Enumerating adapters failed (error 0x%x).\n", dwResult);
294 goto create_delete_adapter;
297 LPWSTR adapter_name =
306 goto create_cleanup_pAdapterList;
311 if (dwResult != ERROR_SUCCESS)
313 StringFromIID((REFIID)&guidAdapter, &szAdapterId);
315 L
"Renaming TUN/TAP adapter %ls"
316 L
" to \"%ls\" failed (error 0x%x).\n",
317 szAdapterId, adapter_name, dwResult);
318 CoTaskMemFree(szAdapterId);
326create_cleanup_pAdapterList:
332 goto create_delete_adapter;
336 StringFromIID((REFIID)&guidAdapter, &szAdapterId);
337 fwprintf(stdout, L
"%ls\n", szAdapterId);
338 CoTaskMemFree(szAdapterId);
343create_delete_adapter:
348 else if (wcsicmp(
argv[1], L
"list") == 0)
350 WCHAR szzHwId[0x100] =
351 L
"root\\" _L(TAP_WIN_COMPONENT_ID) L
"\0" _L(TAP_WIN_COMPONENT_ID) L
"\0"
355 for (
int i = 2;
i < argc;
i++)
357 if (wcsicmp(
argv[
i], L
"--hwid") == 0)
359 memset(szzHwId, 0,
sizeof(szzHwId));
362 sizeof(szzHwId) - 2 *
sizeof(WCHAR) ,
369 L
"Unknown option \"%ls"
370 L
"\". Please, use \"tapctl help list\" to list supported options. Ignored.\n",
378 if (dwResult != ERROR_SUCCESS)
380 fwprintf(stderr, L
"Enumerating TUN/TAP adapters failed (error 0x%x).\n", dwResult);
387 LPOLESTR szAdapterId = NULL;
388 StringFromIID((REFIID)&pAdapter->guid, &szAdapterId);
392 szAdapterId, pAdapter->szName);
393 CoTaskMemFree(szAdapterId);
399 else if (wcsicmp(
argv[1], L
"delete") == 0)
405 L
"Missing adapter GUID or name. Please, use \"tapctl help delete\" for usage info.\n");
410 if (FAILED(IIDFromString(
argv[2], (LPIID)&guidAdapter)))
415 if (dwResult != ERROR_SUCCESS)
417 fwprintf(stderr, L
"Enumerating TUN/TAP adapters failed (error 0x%x).\n", dwResult);
424 if (pAdapter == NULL)
426 fwprintf(stderr, L
"\"%ls\" adapter not found.\n",
argv[2]);
428 goto delete_cleanup_pAdapterList;
430 else if (wcsicmp(
argv[2], pAdapter->szName) == 0)
432 memcpy(&guidAdapter, &pAdapter->guid,
sizeof(GUID));
439delete_cleanup_pAdapterList:
449 if (dwResult != ERROR_SUCCESS)
452 L
"Deleting adapter \"%ls"
453 L
"\" failed (error 0x%x).\n",
465 L
"Unknown command \"%ls"
466 L
"\". Please, use \"tapctl help\" to list supported commands.\n",
474 fwprintf(stderr, L
"A system reboot is required.\n");
491x_msg_va(
const unsigned int flags,
const char *format, va_list arglist)
494 vfprintf(stderr, format, arglist);
495 fwprintf(stderr, L
"\n");
500 DWORD dwResult = GetLastError();
501 LPWSTR szErrMessage = NULL;
502 if (FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER
503 | FORMAT_MESSAGE_IGNORE_INSERTS,
504 0, dwResult, 0, (LPWSTR)&szErrMessage, 0, NULL)
509 for (
size_t i = 0, i_last = 0;;
i++)
513 if (!iswspace(szErrMessage[
i]))
520 szErrMessage[i_last] = 0;
526 fwprintf(stderr, L
"Error 0x%x: %ls\n", dwResult, szErrMessage);
528 LocalFree(szErrMessage);
532 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.