Fixed #47, support any TAP device name

This commit is contained in:
Erik Ekman 2009-06-14 19:50:35 +00:00
parent 3476343051
commit 0b695e5a96
4 changed files with 40 additions and 12 deletions

View File

@ -7,6 +7,7 @@ CHANGES:
20xx-xx-xx: x.y.z
- Fixed tunnel not working on Windows.
- Any device name is now supported on Windows, fixes #47.
2009-06-01: 0.5.2 "WifiFree"
- Fixed client segfault on OS X, #57

View File

@ -15,14 +15,12 @@ Extra README file for Win32 related stuff
2. Have one TAP32 interface installed
3. Name the interface "dns"
3. Make sure the interface does not have a default gateway set
4. Make sure the interface does not have a default gateway set
5. Run iodine/iodined as normal (see the main README file).
4. Run iodine/iodined as normal (see the main README file).
You may have to run it as administrator depending on user privileges.
6. Enjoy!
5. Enjoy!
== Building on Windows:
@ -50,7 +48,6 @@ cross-compile.
== Results of crappy Win32 API:
The following fixable limitations apply:
- Exactly one TAP32 interface must be installed
- The TAP32 interface must be named "dns" and be version 0801 or 0901
- Server cannot read packet destination address
The following (probably) un-fixable limitations apply:

View File

@ -740,7 +740,8 @@ handshake_raw_udp(int dns_fd, int seed)
r = select(dns_fd + 1, &fds, NULL, NULL, &tv);
if(r > 0) {
len = read(dns_fd, in, sizeof(in));
/* recv() needed for windows, dont change to read() */
len = recv(dns_fd, in, sizeof(in), 0);
if (len >= (17 + RAW_HDR_LEN)) {
char hash[16];
login_calculate(hash, 16, password, seed - 1);

View File

@ -37,6 +37,7 @@ struct tun_data data;
#define TAP_IOCTL_SET_MEDIA_STATUS TAP_CONTROL_CODE(6, METHOD_BUFFERED)
#define TAP_ADAPTER_KEY "SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E972-E325-11CE-BFC1-08002BE10318}"
#define NETWORK_KEY "SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}"
#define TAP_DEVICE_SPACE "\\\\.\\Global\\"
#define TAP_VERSION_ID_0801 "tap0801"
#define TAP_VERSION_ID_0901 "tap0901"
@ -53,7 +54,7 @@ struct tun_data data;
#include "tun.h"
#include "common.h"
char if_name[50];
char if_name[250];
#ifndef WINDOWS32
#ifdef LINUX
@ -227,6 +228,36 @@ next:
RegCloseKey(adapter_key);
}
static void
get_name(char *dev_name)
{
char path[256];
char name_str[256] = "Name";
LONG status;
HKEY conn_key;
DWORD len;
DWORD datatype;
memset(if_name, 0, sizeof(if_name));
snprintf(path, sizeof(path), NETWORK_KEY "\\%s\\Connection", dev_name);
status = RegOpenKeyEx(HKEY_LOCAL_MACHINE, path, 0, KEY_READ, &conn_key);
printf("%s ?? %s\n", path, dev_name);
if (status != ERROR_SUCCESS) {
fprintf(stderr, "Could not look up name of interface %s: error opening key\n", dev_name);
RegCloseKey(conn_key);
return;
}
len = sizeof(if_name);
status = RegQueryValueEx(conn_key, name_str, NULL, &datatype, (LPBYTE)if_name, &len);
if (status != ERROR_SUCCESS || datatype != REG_SZ) {
fprintf(stderr, "Could not look up name of interface %s: error reading value\n", dev_name);
RegCloseKey(conn_key);
return;
}
RegCloseKey(conn_key);
}
DWORD WINAPI tun_reader(LPVOID arg)
{
struct tun_data *tun = arg;
@ -265,8 +296,9 @@ open_tun(const char *tun_device)
memset(adapter, 0, sizeof(adapter));
get_device(adapter, sizeof(adapter));
get_name(adapter); /* Copies interface 'human name' to if_name */
if (strlen(adapter) == 0) {
if (strlen(adapter) == 0 || strlen(if_name) == 0) {
warnx("No TAP adapters found. See README-win32.txt for help.\n");
return -1;
}
@ -278,9 +310,6 @@ open_tun(const char *tun_device)
return -1;
}
/* TODO get name of interface */
strncpy(if_name, "dns", MIN(4, sizeof(if_name)));
/* Use a UDP connection to forward packets from tun,
* so we can still use select() in main code.
* A thread does blocking reads on tun device and