Fixed #47, support any TAP device name

This commit is contained in:
Erik Ekman 2009-06-14 19:50:35 +00:00 committed by Erik Ekman
parent f20b3c9511
commit e59aaa523e
4 changed files with 40 additions and 12 deletions

View File

@ -7,6 +7,7 @@ CHANGES:
20xx-xx-xx: x.y.z 20xx-xx-xx: x.y.z
- Fixed tunnel not working on Windows. - Fixed tunnel not working on Windows.
- Any device name is now supported on Windows, fixes #47.
2009-06-01: 0.5.2 "WifiFree" 2009-06-01: 0.5.2 "WifiFree"
- Fixed client segfault on OS X, #57 - 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 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 4. Run iodine/iodined as normal (see the main README file).
5. Run iodine/iodined as normal (see the main README file).
You may have to run it as administrator depending on user privileges. You may have to run it as administrator depending on user privileges.
6. Enjoy! 5. Enjoy!
== Building on Windows: == Building on Windows:
@ -50,7 +48,6 @@ cross-compile.
== Results of crappy Win32 API: == Results of crappy Win32 API:
The following fixable limitations apply: The following fixable limitations apply:
- Exactly one TAP32 interface must be installed - 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 - Server cannot read packet destination address
The following (probably) un-fixable limitations apply: 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); r = select(dns_fd + 1, &fds, NULL, NULL, &tv);
if(r > 0) { 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)) { if (len >= (17 + RAW_HDR_LEN)) {
char hash[16]; char hash[16];
login_calculate(hash, 16, password, seed - 1); 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_IOCTL_SET_MEDIA_STATUS TAP_CONTROL_CODE(6, METHOD_BUFFERED)
#define TAP_ADAPTER_KEY "SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E972-E325-11CE-BFC1-08002BE10318}" #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_DEVICE_SPACE "\\\\.\\Global\\"
#define TAP_VERSION_ID_0801 "tap0801" #define TAP_VERSION_ID_0801 "tap0801"
#define TAP_VERSION_ID_0901 "tap0901" #define TAP_VERSION_ID_0901 "tap0901"
@ -53,7 +54,7 @@ struct tun_data data;
#include "tun.h" #include "tun.h"
#include "common.h" #include "common.h"
char if_name[50]; char if_name[250];
#ifndef WINDOWS32 #ifndef WINDOWS32
#ifdef LINUX #ifdef LINUX
@ -227,6 +228,36 @@ next:
RegCloseKey(adapter_key); 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) DWORD WINAPI tun_reader(LPVOID arg)
{ {
struct tun_data *tun = arg; struct tun_data *tun = arg;
@ -265,8 +296,9 @@ open_tun(const char *tun_device)
memset(adapter, 0, sizeof(adapter)); memset(adapter, 0, sizeof(adapter));
get_device(adapter, 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"); warnx("No TAP adapters found. See README-win32.txt for help.\n");
return -1; return -1;
} }
@ -278,9 +310,6 @@ open_tun(const char *tun_device)
return -1; 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, /* Use a UDP connection to forward packets from tun,
* so we can still use select() in main code. * so we can still use select() in main code.
* A thread does blocking reads on tun device and * A thread does blocking reads on tun device and