diff options
author | Christian Pointner <equinox@anytun.org> | 2009-01-19 20:13:43 +0000 |
---|---|---|
committer | Christian Pointner <equinox@anytun.org> | 2009-01-19 20:13:43 +0000 |
commit | 1e12add3e66522b94a5d0eea603c15f93f7dd8cd (patch) | |
tree | 2e73a74953e4a813b75e3e22d8da5b230e34f2a2 /src | |
parent | some cleanup (diff) |
started to implement windows tunDevice
updated LogErrno to support Windows Error Codes
Diffstat (limited to 'src')
-rw-r--r-- | src/anytun.suo | bin | 44544 -> 48128 bytes | |||
-rw-r--r-- | src/datatypes.h | 3 | ||||
-rw-r--r-- | src/log.h | 4 | ||||
-rw-r--r-- | src/tunDevice.h | 8 | ||||
-rw-r--r-- | src/win32/common.h | 76 | ||||
-rw-r--r-- | src/win32/tunDevice.cpp | 15 |
6 files changed, 104 insertions, 2 deletions
diff --git a/src/anytun.suo b/src/anytun.suo Binary files differindex dcee7a5..2c70692 100644 --- a/src/anytun.suo +++ b/src/anytun.suo diff --git a/src/datatypes.h b/src/datatypes.h index 7025528..27fac4b 100644 --- a/src/datatypes.h +++ b/src/datatypes.h @@ -54,8 +54,11 @@ typedef u_int16_t mux_t; #ifndef _MSC_VER #define ATTR_PACKED __attribute__((__packed__)) +typedef int system_error_t; #else +#include <windows.h> #define ATTR_PACKED +typedef DWORD system_error_t; #endif #endif @@ -60,8 +60,8 @@ std::ostream& operator<<(std::ostream& stream, LogGpgError const& value); class LogErrno { public: - LogErrno(int e) : err_(e) {}; - int err_; + LogErrno(system_error_t e) : err_(e) {}; + system_error_t err_; }; std::ostream& operator<<(std::ostream& stream, LogErrno const& value); diff --git a/src/tunDevice.h b/src/tunDevice.h index 99f3d4b..c07f813 100644 --- a/src/tunDevice.h +++ b/src/tunDevice.h @@ -36,6 +36,10 @@ #include "deviceConfig.hpp" #include "threadUtils.hpp" +#ifdef _MSC_VER +#include <windows.h> +#endif + class TunDevice { public: @@ -71,6 +75,10 @@ private: int fix_return(int ret, size_t pi_length); int fd_; +#ifdef _MSC_VER + HANDLE handle_; +#endif + DeviceConfig conf_; bool with_pi_; std::string actual_name_; diff --git a/src/win32/common.h b/src/win32/common.h new file mode 100644 index 0000000..39a8349 --- /dev/null +++ b/src/win32/common.h @@ -0,0 +1,76 @@ +/* + * TAP-Win32 -- A kernel driver to provide virtual tap device functionality + * on Windows. Originally derived from the CIPE-Win32 + * project by Damion K. Wilson, with extensive modifications by + * James Yonan. + * + * All source code which derives from the CIPE-Win32 project is + * Copyright (C) Damion K. Wilson, 2003, and is released under the + * GPL version 2 (see below). + * + * All other source code is Copyright (C) James Yonan, 2003-2004, + * and is released under the GPL version 2 (see below). + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program (see the file COPYING included with this + * distribution); if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +//=============================================== +// This file is included both by OpenVPN and +// the TAP-Win32 driver and contains definitions +// common to both. +//=============================================== + +//============= +// TAP IOCTLs +//============= + +#define TAP_CONTROL_CODE(request,method) \ + CTL_CODE (FILE_DEVICE_UNKNOWN, request, method, FILE_ANY_ACCESS) + +#define TAP_IOCTL_GET_MAC TAP_CONTROL_CODE (1, METHOD_BUFFERED) +#define TAP_IOCTL_GET_VERSION TAP_CONTROL_CODE (2, METHOD_BUFFERED) +#define TAP_IOCTL_GET_MTU TAP_CONTROL_CODE (3, METHOD_BUFFERED) +#define TAP_IOCTL_GET_INFO TAP_CONTROL_CODE (4, METHOD_BUFFERED) +#define TAP_IOCTL_CONFIG_POINT_TO_POINT TAP_CONTROL_CODE (5, METHOD_BUFFERED) +#define TAP_IOCTL_SET_MEDIA_STATUS TAP_CONTROL_CODE (6, METHOD_BUFFERED) +#define TAP_IOCTL_CONFIG_DHCP_MASQ TAP_CONTROL_CODE (7, METHOD_BUFFERED) +#define TAP_IOCTL_GET_LOG_LINE TAP_CONTROL_CODE (8, METHOD_BUFFERED) +#define TAP_IOCTL_CONFIG_DHCP_SET_OPT TAP_CONTROL_CODE (9, METHOD_BUFFERED) + +//================= +// Registry keys +//================= + +#define ADAPTER_KEY "SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E972-E325-11CE-BFC1-08002BE10318}" + +#define NETWORK_CONNECTIONS_KEY "SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}" + +//====================== +// Filesystem prefixes +//====================== + +#define USERMODEDEVICEDIR "\\\\.\\Global\\" +#define SYSDEVICEDIR "\\Device\\" +#define USERDEVICEDIR "\\DosDevices\\Global\\" +#define TAPSUFFIX ".tap" + +//========================================================= +// TAP_COMPONENT_ID -- This string defines the TAP driver +// type -- different component IDs can reside in the system +// simultaneously. +//========================================================= + +#define TAP_COMPONENT_ID "tap0801" diff --git a/src/win32/tunDevice.cpp b/src/win32/tunDevice.cpp index c162ac3..86c99ba 100644 --- a/src/win32/tunDevice.cpp +++ b/src/win32/tunDevice.cpp @@ -30,15 +30,30 @@ */ #include <string.h> +#include <sstream> #include "../tunDevice.h" #include "../threadUtils.hpp" +#include "../log.h" +#include "common.h" +#include <windows.h> +#include <winioctl.h> TunDevice::TunDevice(std::string dev_name, std::string dev_type, std::string ifcfg_lp, std::string ifcfg_rnmp) : conf_(dev_name, dev_type, ifcfg_lp, ifcfg_rnmp, 1400) { + handle_ = INVALID_HANDLE_VALUE; + HKEY key; + LONG err = RegOpenKeyEx(HKEY_LOCAL_MACHINE, NETWORK_CONNECTIONS_KEY, 0, KEY_READ, &key); + if(err) { + std::stringstream msg; + msg << "Unable to read registry: " << LogErrno(err); + throw std::runtime_error(msg.str()); + } + RegCloseKey(key); + if(ifcfg_lp != "" && ifcfg_rnmp != "") do_ifconfig(); } |