Introduce tap-windows.h which is modified tap-win32/common.h.
Except of function rename, it is the same without the tap_id.
This file should be provided as part of tap-win32 MSI.
For now we hold a copy.

Signed-off-by: Alon Bar-Lev <alon.bar...@gmail.com>
---
 Makefile.am                    |    3 +-
 configure.ac                   |   14 +-
 tap-win32/MAKEFILE             |    6 -
 tap-win32/SOURCES.in           |   64 -
 tap-win32/common.h             |   82 --
 tap-win32/constants.h          |   52 -
 tap-win32/dhcp.c               |  599 --------
 tap-win32/dhcp.h               |  164 ---
 tap-win32/endian.h             |   35 -
 tap-win32/error.c              |  378 -----
 tap-win32/error.h              |   88 --
 tap-win32/hexdump.c            |   69 -
 tap-win32/hexdump.h            |   63 -
 tap-win32/i386/OemWin2k.inf.in |  195 ---
 tap-win32/instance.c           |  241 ---
 tap-win32/lock.h               |   75 -
 tap-win32/macinfo.c            |  154 --
 tap-win32/macinfo.h            |   38 -
 tap-win32/mem.c                |  186 ---
 tap-win32/proto.h              |  224 ---
 tap-win32/prototypes.h         |  260 ----
 tap-win32/resource.rc          |   58 -
 tap-win32/tapdrvr.c            | 3146 ----------------------------------------
 tap-win32/types.h              |  178 ---
 tap-windows.h                  |   68 +
 tun.h                          |    2 +-
 win/autodefs.h.in              |    2 +-
 27 files changed, 78 insertions(+), 6366 deletions(-)
 delete mode 100755 tap-win32/MAKEFILE
 delete mode 100755 tap-win32/SOURCES.in
 delete mode 100755 tap-win32/common.h
 delete mode 100755 tap-win32/constants.h
 delete mode 100755 tap-win32/dhcp.c
 delete mode 100755 tap-win32/dhcp.h
 delete mode 100755 tap-win32/endian.h
 delete mode 100755 tap-win32/error.c
 delete mode 100755 tap-win32/error.h
 delete mode 100755 tap-win32/hexdump.c
 delete mode 100755 tap-win32/hexdump.h
 delete mode 100755 tap-win32/i386/OemWin2k.inf.in
 delete mode 100755 tap-win32/instance.c
 delete mode 100755 tap-win32/lock.h
 delete mode 100755 tap-win32/macinfo.c
 delete mode 100755 tap-win32/macinfo.h
 delete mode 100755 tap-win32/mem.c
 delete mode 100755 tap-win32/proto.h
 delete mode 100755 tap-win32/prototypes.h
 delete mode 100755 tap-win32/resource.rc
 delete mode 100755 tap-win32/tapdrvr.c
 delete mode 100755 tap-win32/types.h
 create mode 100644 tap-windows.h

diff --git a/Makefile.am b/Makefile.am
index b6fcfbb..74f388a 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -44,7 +44,6 @@ EXTRA_DIST = \
        sample-keys \
        sample-scripts \
        suse \
-       tap-win32 \
        contrib \
        debug \
        plugins \
@@ -147,7 +146,7 @@ openvpn_SOURCES = \
        ssl_verify_polarssl.c ssl_verify_polarssl.h \
        status.c status.h \
        syshead.h \
-       tun.c tun.h \
+       tun.c tun.h tap-windows.h \
        win32.h win32.c \
        cryptoapi.h cryptoapi.c

diff --git a/configure.ac b/configure.ac
index 747c7b4..937ce1f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -959,15 +959,15 @@ if test "$SELINUX" = "yes"; then
    )
 fi

-TAP_ID="PRODUCT_TAP_ID"
+TAP_COMPONENT_ID="PRODUCT_TAP_ID"
 TAP_WIN32_MIN_MAJOR="PRODUCT_TAP_WIN32_MIN_MAJOR"
 TAP_WIN32_MIN_MINOR="PRODUCT_TAP_WIN32_MIN_MINOR"
-AC_DEFINE_UNQUOTED(TAP_ID, "${TAP_ID}", [The TAP-Win32 id defined in 
tap-win32/SOURCES])
-AC_DEFINE_UNQUOTED(TAP_WIN32_MIN_MAJOR, ${TAP_WIN32_MIN_MAJOR}, [The TAP-Win32 
version number is defined in tap-win32/SOURCES])
-AC_DEFINE_UNQUOTED(TAP_WIN32_MIN_MINOR, ${TAP_WIN32_MIN_MINOR}, [The TAP-Win32 
version number is defined in tap-win32/SOURCES])
-AC_SUBST(TAP_ID)
-AC_SUBST(TAP_WIN32_MIN_MAJOR)
-AC_SUBST(TAP_WIN32_MIN_MINOR)
+AC_DEFINE_UNQUOTED([TAP_ID], ["${TAP_ID}"], [The TAP-Win32 id])
+AC_DEFINE_UNQUOTED([TAP_WIN32_MIN_MAJOR], [${TAP_WIN32_MIN_MAJOR}], [The 
TAP-Win32 version number is defined in tap-win32/SOURCES])
+AC_DEFINE_UNQUOTED([TAP_WIN32_MIN_MINOR], [${TAP_WIN32_MIN_MINOR}], [The 
TAP-Win32 version number is defined in tap-win32/SOURCES])
+AC_SUBST([TAP_COMPONENT_ID])
+AC_SUBST([TAP_WIN32_MIN_MAJOR])
+AC_SUBST([TAP_WIN32_MIN_MINOR])

 win32datadir="\${datadir}/${PACKAGE}-win32"
 AC_SUBST(win32datadir)
diff --git a/tap-win32/MAKEFILE b/tap-win32/MAKEFILE
deleted file mode 100755
index 6ee4f43..0000000
--- a/tap-win32/MAKEFILE
+++ /dev/null
@@ -1,6 +0,0 @@
-#
-# DO NOT EDIT THIS FILE!!!  Edit .\sources. if you want to add a new source
-# file to this component.  This file merely indirects to the real make file
-# that is shared by all the components of NT OS/2
-#
-!INCLUDE $(NTMAKEENV)\makefile.def
diff --git a/tap-win32/SOURCES.in b/tap-win32/SOURCES.in
deleted file mode 100755
index cf030f4..0000000
--- a/tap-win32/SOURCES.in
+++ /dev/null
@@ -1,64 +0,0 @@
-# Build TAP-Win32 driver.
-# Build Command: build -cef
-
-MAJORCOMP=ntos
-MINORCOMP=ndis
-
-TARGETNAME=@@PRODUCT_TAP_ID@@
-TARGETTYPE=DRIVER
-TARGETPATH=.
-TARGETLIBS=$(DDK_LIB_PATH)\ndis.lib $(DDK_LIB_PATH)\ntstrsafe.lib
-INCLUDES=$(DDK_INCLUDE_PATH) ..
-
-# The TAP version numbers here must be >=
-# PRODUCT_TAP_WIN32_MIN_x values defined in version.m4
-C_DEFINES=
-C_DEFINES=$(C_DEFINES) -DTAP_DRIVER_MAJOR_VERSION=@@PRODUCT_TAP_MAJOR_VER@@
-C_DEFINES=$(C_DEFINES) -DTAP_DRIVER_MINOR_VERSION=@@PRODUCT_TAP_MINOR_VER@@
-
-# Produce the same symbolic information for both free & checked builds.
-# This will allow us to perform full source-level debugging on both
-# builds without affecting the free build's performance.
-!IF "$(DDKBUILDENV)" != "chk"
-NTDEBUGTYPE=both
-USE_PDB=1
-!ELSE
-NTDEBUGTYPE=both
-USE_PDB=1
-!ENDIF
-
-# Set compiler optimizations:
-# /Ox - Full optimization enabled
-# /Os - favor speed over size when optimizing
-# /Od - Disable all optimizations
-# /Oi - Enable optimization for intrinsic functions
-# /Fc - Generate mixed assembler/source code files
-#
-# For both checked and free builds, make sure that any intrinsic
-# functions are compiled correctly. To do this, ensure that /Oi
-# is selected for both free and checked builds. There is a bug in
-# VC++ 6.0 (at least through SP4) where, if you specify any
-# intrinsic functions in your code with "#pragma intrinsic" but
-# you don't have the /Oi optimization enabled, neither a call
-# to the function, nor the intrinsic inline version of the function
-# will end up in your object code. This bug only applies to free
-# builds, but just to be safe we'll make sure that the flag is
-# enabled for all builds.
-
-!IF "$(DDKBUILDENV)" != "chk"
-MSC_OPTIMIZATION=/Ox /Oi /Fc
-!ELSE
-MSC_OPTIMIZATION=/Od /Oi /Fc
-!ENDIF
-
-# Generate a linker map file just in case we need one for debugging
-LINKER_FLAGS=$(LINKER_FLAGS) /INCREMENTAL:NO /MAP /MAPINFO:EXPORTS
-
-# Generate a browser information file for use in IDE development
-#BROWSER_INFO=1
-#BROWSERFILE=$(TARGETNAME).BSC -n
-
-# Abort compilation on warnings by adding /WX
-MSC_WARNING_LEVEL=/W3
-
-SOURCES=tapdrvr.c resource.rc
diff --git a/tap-win32/common.h b/tap-win32/common.h
deleted file mode 100755
index bb8ab90..0000000
--- a/tap-win32/common.h
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- *  TAP-Win32/TAP-Win64 -- A kernel driver to provide virtual tap
- *                         device functionality on Windows.
- *
- *  This code was inspired by the CIPE-Win32 driver by Damion K. Wilson.
- *
- *  This source code is Copyright (C) 2002-2010 OpenVPN Technologies, Inc.,
- *  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 version 2
- *  as published by the Free Software Foundation.
- *
- *  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.
-//===============================================
-
-#ifndef HAVE_CONFIG_H
-#include "autodefs.h"
-#endif
-
-//=============
-// TAP IOCTLs
-//=============
-
-#define TAP_CONTROL_CODE(request,method) \
-  CTL_CODE (FILE_DEVICE_UNKNOWN, request, method, FILE_ANY_ACCESS)
-
-// Present in 8.1
-
-#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)
-
-// Added in 8.2
-
-/* obsoletes TAP_IOCTL_CONFIG_POINT_TO_POINT */
-#define TAP_IOCTL_CONFIG_TUN            TAP_CONTROL_CODE (10, 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 TAP_ID
diff --git a/tap-win32/constants.h b/tap-win32/constants.h
deleted file mode 100755
index 9bbd7ee..0000000
--- a/tap-win32/constants.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- *  TAP-Win32/TAP-Win64 -- A kernel driver to provide virtual tap
- *                         device functionality on Windows.
- *
- *  This code was inspired by the CIPE-Win32 driver by Damion K. Wilson.
- *
- *  This source code is Copyright (C) 2002-2010 OpenVPN Technologies, Inc.,
- *  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 version 2
- *  as published by the Free Software Foundation.
- *
- *  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
- */
-
-//====================================================================
-//                        Product and Version public settings
-//====================================================================
-
-#define PRODUCT_STRING PRODUCT_TAP_DEVICE_DESCRIPTION
-
-#define TAP_NDIS_MAJOR_VERSION 5
-#define TAP_NDIS_MINOR_VERSION 0
-
-//===========================================================
-// Driver constants
-//===========================================================
-
-#define ETHERNET_HEADER_SIZE     (sizeof (ETH_HEADER))
-#define ETHERNET_MTU             1500
-#define ETHERNET_PACKET_SIZE     (ETHERNET_MTU + ETHERNET_HEADER_SIZE)
-#define DEFAULT_PACKET_LOOKAHEAD (ETHERNET_PACKET_SIZE)
-
-#define NIC_MAX_MCAST_LIST 32  // Max length of multicast address list
-
-#define MINIMUM_MTU 576        // USE TCP Minimum MTU
-#define MAXIMUM_MTU 65536      // IP maximum MTU
-
-#define PACKET_QUEUE_SIZE   64 // tap -> userspace queue size
-#define IRP_QUEUE_SIZE      16 // max number of simultaneous i/o operations 
from userspace
-#define INJECT_QUEUE_SIZE   16 // DHCP/ARP -> tap injection queue
-
-#define TAP_LITTLE_ENDIAN      // affects ntohs, htonl, etc. functions
diff --git a/tap-win32/dhcp.c b/tap-win32/dhcp.c
deleted file mode 100755
index 3891d42..0000000
--- a/tap-win32/dhcp.c
+++ /dev/null
@@ -1,599 +0,0 @@
-/*
- *  TAP-Win32/TAP-Win64 -- A kernel driver to provide virtual tap
- *                         device functionality on Windows.
- *
- *  This code was inspired by the CIPE-Win32 driver by Damion K. Wilson.
- *
- *  This source code is Copyright (C) 2002-2010 OpenVPN Technologies, Inc.,
- *  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 version 2
- *  as published by the Free Software Foundation.
- *
- *  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
- */
-
-//=========================
-// Code to set DHCP options
-//=========================
-
-VOID
-SetDHCPOpt (DHCPMsg *m, void *data, unsigned int len)
-{
-  if (!m->overflow)
-    {
-      if (m->optlen + len <= DHCP_OPTIONS_BUFFER_SIZE)
-       {
-         if (len)
-           {
-             NdisMoveMemory (m->msg.options + m->optlen, data, len);
-             m->optlen += len;
-           }
-       }
-      else
-       {
-         m->overflow = TRUE;
-       }
-    }
-}
-
-VOID
-SetDHCPOpt0 (DHCPMsg *msg, int type)
-{
-  DHCPOPT0 opt;
-  opt.type = (UCHAR) type;
-  SetDHCPOpt (msg, &opt, sizeof (opt));
-}
-
-VOID
-SetDHCPOpt8 (DHCPMsg *msg, int type, ULONG data)
-{
-  DHCPOPT8 opt;
-  opt.type = (UCHAR) type;
-  opt.len = sizeof (opt.data);
-  opt.data = (UCHAR) data;
-  SetDHCPOpt (msg, &opt, sizeof (opt));
-}
-
-VOID
-SetDHCPOpt32 (DHCPMsg *msg, int type, ULONG data)
-{
-  DHCPOPT32 opt;
-  opt.type = (UCHAR) type;
-  opt.len = sizeof (opt.data);
-  opt.data = data;
-  SetDHCPOpt (msg, &opt, sizeof (opt));
-}
-
-//==============
-// Checksum code
-//==============
-
-USHORT
-ip_checksum (const UCHAR *buf, const int len_ip_header)
-{
-  USHORT word16;
-  ULONG sum = 0;
-  int i;
-    
-  // make 16 bit words out of every two adjacent 8 bit words in the packet
-  // and add them up
-  for (i = 0; i < len_ip_header - 1; i += 2) {
-    word16 = ((buf[i] << 8) & 0xFF00) + (buf[i+1] & 0xFF);
-    sum += (ULONG) word16;
-  }
-
-  // take only 16 bits out of the 32 bit sum and add up the carries
-  while (sum >> 16)
-    sum = (sum & 0xFFFF) + (sum >> 16);
-
-  // one's complement the result
-  return ((USHORT) ~sum);
-}
-
-USHORT
-udp_checksum (const UCHAR *buf,
-             const int len_udp,
-             const UCHAR *src_addr,
-             const UCHAR *dest_addr)
-{
-  USHORT word16;
-  ULONG sum = 0;
-  int i;
-       
-  // make 16 bit words out of every two adjacent 8 bit words and 
-  // calculate the sum of all 16 bit words
-  for (i = 0; i < len_udp; i += 2){
-    word16 = ((buf[i] << 8) & 0xFF00) + ((i + 1 < len_udp) ? (buf[i+1] & 0xFF) 
: 0);
-    sum += word16;
-  }
-
-  // add the UDP pseudo header which contains the IP source and destination 
addresses
-  for (i = 0; i < 4; i += 2){
-    word16 =((src_addr[i] << 8) & 0xFF00) + (src_addr[i+1] & 0xFF);
-    sum += word16;
-  }
-  for (i = 0; i < 4; i += 2){
-    word16 =((dest_addr[i] << 8) & 0xFF00) + (dest_addr[i+1] & 0xFF);
-    sum += word16;     
-  }
-
-  // the protocol number and the length of the UDP packet
-  sum += (USHORT) IPPROTO_UDP + (USHORT) len_udp;
-
-  // keep only the last 16 bits of the 32 bit calculated sum and add the 
carries
-  while (sum >> 16)
-    sum = (sum & 0xFFFF) + (sum >> 16);
-               
-  // Take the one's complement of sum
-  return ((USHORT) ~sum);
-}
-
-//================================
-// Set IP and UDP packet checksums
-//================================
-
-VOID
-SetChecksumDHCPMsg (DHCPMsg *m)
-{
-  // Set IP checksum
-  m->msg.pre.ip.check = htons (ip_checksum ((UCHAR *) &m->msg.pre.ip, sizeof 
(IPHDR)));
-
-  // Set UDP Checksum
-  m->msg.pre.udp.check = htons (udp_checksum ((UCHAR *) &m->msg.pre.udp, 
-                                             sizeof (UDPHDR) + sizeof (DHCP) + 
m->optlen,
-                                             (UCHAR *)&m->msg.pre.ip.saddr,
-                                             (UCHAR *)&m->msg.pre.ip.daddr));
-}
-
-//===================
-// DHCP message tests
-//===================
-
-int
-GetDHCPMessageType (const DHCP *dhcp, const int optlen)
-{
-  const UCHAR *p = (UCHAR *) (dhcp + 1);
-  int i;
-
-  for (i = 0; i < optlen; ++i)
-    {
-      const UCHAR type = p[i];
-      const int room = optlen - i - 1;
-      if (type == DHCP_END)           // didn't find what we were looking for
-       return -1;
-      else if (type == DHCP_PAD)      // no-operation
-       ;
-      else if (type == DHCP_MSG_TYPE) // what we are looking for
-       {
-         if (room >= 2)
-           {
-             if (p[i+1] == 1)        // message length should be 1
-               return p[i+2];        // return message type
-           }
-         return -1;
-       }
-      else                            // some other message
-       {
-         if (room >= 1)
-           {
-             const int len = p[i+1]; // get message length
-             i += (len + 1);         // advance to next message
-           }
-       }
-    }
-  return -1;
-}
-
-BOOLEAN
-DHCPMessageOurs (const TapAdapterPointer p_Adapter,
-                const ETH_HEADER *eth,
-                const IPHDR *ip,
-                const UDPHDR *udp,
-                const DHCP *dhcp)
-{
-  // Must be UDPv4 protocol
-  if (!(eth->proto == htons (ETH_P_IP) && ip->protocol == IPPROTO_UDP))
-    return FALSE;
-
-  // Source MAC must be our adapter
-  if (!MAC_EQUAL (eth->src, p_Adapter->m_MAC))
-    return FALSE;
-
-  // Dest MAC must be either broadcast or our virtual DHCP server
-  if (!(MAC_EQUAL (eth->dest, p_Adapter->m_MAC_Broadcast)
-       || MAC_EQUAL (eth->dest, p_Adapter->m_dhcp_server_mac)))
-    return FALSE;
-
-  // Port numbers must be correct
-  if (!(udp->dest == htons (BOOTPS_PORT)
-       && udp->source == htons (BOOTPC_PORT)))
-    return FALSE;
-
-  // Hardware address must be MAC addr sized
-  if (!(dhcp->hlen == sizeof (MACADDR)))
-    return FALSE;
-
-  // Hardware address must match our adapter
-  if (!MAC_EQUAL (eth->src, dhcp->chaddr))
-    return FALSE;
-
-  return TRUE;
-}
-
-
-//=====================================================
-// Build all of DHCP packet except for DHCP options.
-// Assume that *p has been zeroed before we are called.
-//=====================================================
-
-VOID
-BuildDHCPPre (const TapAdapterPointer a,
-             DHCPPre *p,
-             const ETH_HEADER *eth,
-             const IPHDR *ip,
-             const UDPHDR *udp,
-             const DHCP *dhcp,
-             const int optlen,
-             const int type)
-{
-  // Should we broadcast or direct to a specific MAC / IP address?
-  const BOOLEAN broadcast = (type == DHCPNAK
-                            || MAC_EQUAL (eth->dest, a->m_MAC_Broadcast));
-  // Build ethernet header
-
-  COPY_MAC (p->eth.src, a->m_dhcp_server_mac);
-
-  if (broadcast)
-    COPY_MAC (p->eth.dest, a->m_MAC_Broadcast);
-  else
-    COPY_MAC (p->eth.dest, eth->src);
-
-  p->eth.proto = htons (ETH_P_IP);
-
-  // Build IP header
-
-  p->ip.version_len = (4 << 4) | (sizeof (IPHDR) >> 2);
-  p->ip.tos = 0;
-  p->ip.tot_len = htons (sizeof (IPHDR) + sizeof (UDPHDR) + sizeof (DHCP) + 
optlen);
-  p->ip.id = 0;
-  p->ip.frag_off = 0;
-  p->ip.ttl = 16;
-  p->ip.protocol = IPPROTO_UDP;
-  p->ip.check = 0;
-  p->ip.saddr = a->m_dhcp_server_ip;
-
-  if (broadcast)
-    p->ip.daddr = ~0;
-  else
-    p->ip.daddr = a->m_dhcp_addr;
-
-  // Build UDP header
-
-  p->udp.source = htons (BOOTPS_PORT);
-  p->udp.dest = htons (BOOTPC_PORT);
-  p->udp.len = htons (sizeof (UDPHDR) + sizeof (DHCP) + optlen);
-  p->udp.check = 0;
-
-  // Build DHCP response
-
-  p->dhcp.op = BOOTREPLY;
-  p->dhcp.htype = 1;
-  p->dhcp.hlen = sizeof (MACADDR);
-  p->dhcp.hops = 0;
-  p->dhcp.xid = dhcp->xid;
-  p->dhcp.secs = 0;
-  p->dhcp.flags = 0;
-  p->dhcp.ciaddr = 0;
-
-  if (type == DHCPNAK)
-    p->dhcp.yiaddr = 0;
-  else
-    p->dhcp.yiaddr = a->m_dhcp_addr;
-
-  p->dhcp.siaddr = a->m_dhcp_server_ip;
-  p->dhcp.giaddr = 0;
-  COPY_MAC (p->dhcp.chaddr, eth->src);
-  p->dhcp.magic = htonl (0x63825363);
-}
-//=============================
-// Build specific DHCP messages
-//=============================
-
-VOID
-SendDHCPMsg (const TapAdapterPointer a,
-            const int type,
-            const ETH_HEADER *eth,
-            const IPHDR *ip,
-            const UDPHDR *udp,
-            const DHCP *dhcp)
-{
-  DHCPMsg *pkt;
-
-  if (!(type == DHCPOFFER || type == DHCPACK || type == DHCPNAK))
-    {
-      DEBUGP (("[TAP] SendDHCPMsg: Bad DHCP type: %d\n", type));
-      return;
-    }
-
-  pkt = (DHCPMsg *) MemAlloc (sizeof (DHCPMsg), TRUE);
-
-  if (pkt)
-    {
-      //-----------------------
-      // Build DHCP options
-      //-----------------------
-
-      // Message Type
-      SetDHCPOpt8 (pkt, DHCP_MSG_TYPE, type);
-
-      // Server ID
-      SetDHCPOpt32 (pkt, DHCP_SERVER_ID, a->m_dhcp_server_ip);
-
-      if (type == DHCPOFFER || type == DHCPACK)
-       {
-         // Lease Time
-         SetDHCPOpt32 (pkt, DHCP_LEASE_TIME, htonl (a->m_dhcp_lease_time));
-
-         // Netmask
-         SetDHCPOpt32 (pkt, DHCP_NETMASK, a->m_dhcp_netmask);
-
-         // Other user-defined options
-         SetDHCPOpt (pkt,
-                     a->m_dhcp_user_supplied_options_buffer,
-                     a->m_dhcp_user_supplied_options_buffer_len);
-       }
-
-      // End
-      SetDHCPOpt0 (pkt, DHCP_END);
-
-      if (!DHCPMSG_OVERFLOW (pkt))
-       {
-         // The initial part of the DHCP message (not including options) gets 
built here
-         BuildDHCPPre (a,
-                       &pkt->msg.pre,
-                       eth,
-                       ip,
-                       udp,
-                       dhcp,
-                       DHCPMSG_LEN_OPT (pkt),
-                       type);
-
-         SetChecksumDHCPMsg (pkt);
-
-         DUMP_PACKET ("DHCPMsg",
-                      DHCPMSG_BUF (pkt),
-                      DHCPMSG_LEN_FULL (pkt));
-
-         // Return DHCP response to kernel
-         InjectPacketDeferred (a,
-                               DHCPMSG_BUF (pkt),
-                               DHCPMSG_LEN_FULL (pkt));
-       }
-      else
-       {
-         DEBUGP (("[TAP] SendDHCPMsg: DHCP buffer overflow\n"));
-       }
-
-      MemFree (pkt, sizeof (DHCPMsg));
-    }
-}
-
-//===================================================================
-// Handle a BOOTPS packet produced by the local system to
-// resolve the address/netmask of this adapter.
-// If we are in TAP_IOCTL_CONFIG_DHCP_MASQ mode, reply
-// to the message.  Return TRUE if we processed the passed
-// message, so that downstream stages can ignore it.
-//===================================================================
-
-BOOLEAN
-ProcessDHCP (TapAdapterPointer p_Adapter,
-            const ETH_HEADER *eth,
-            const IPHDR *ip,
-            const UDPHDR *udp,
-            const DHCP *dhcp,
-            int optlen)
-{
-  int msg_type;
-
-  // Sanity check IP header
-  if (!(ntohs (ip->tot_len) == sizeof (IPHDR) + sizeof (UDPHDR) + sizeof 
(DHCP) + optlen
-       && (ntohs (ip->frag_off) & IP_OFFMASK) == 0))
-    return TRUE;
-
-  // Does this message belong to us?
-  if (!DHCPMessageOurs (p_Adapter, eth, ip, udp, dhcp))
-    return FALSE;
-
-  msg_type = GetDHCPMessageType (dhcp, optlen);
-
-  // Drop non-BOOTREQUEST messages
-  if (dhcp->op != BOOTREQUEST)
-    return TRUE;
-
-  // Drop any messages except DHCPDISCOVER or DHCPREQUEST
-  if (!(msg_type == DHCPDISCOVER || msg_type == DHCPREQUEST))
-    return TRUE;
-
-  // Should we reply with DHCPOFFER, DHCPACK, or DHCPNAK?
-  if (msg_type == DHCPREQUEST
-      && ((dhcp->ciaddr && dhcp->ciaddr != p_Adapter->m_dhcp_addr)
-         || !p_Adapter->m_dhcp_received_discover
-         || p_Adapter->m_dhcp_bad_requests >= BAD_DHCPREQUEST_NAK_THRESHOLD))
-    SendDHCPMsg (p_Adapter,
-                DHCPNAK,
-                eth, ip, udp, dhcp);
-  else
-    SendDHCPMsg (p_Adapter,
-                (msg_type == DHCPDISCOVER ? DHCPOFFER : DHCPACK),
-                eth, ip, udp, dhcp);
-
-  // Remember if we received a DHCPDISCOVER
-  if (msg_type == DHCPDISCOVER)
-    p_Adapter->m_dhcp_received_discover = TRUE;
-
-  // Is this a bad DHCPREQUEST?
-  if (msg_type == DHCPREQUEST && dhcp->ciaddr != p_Adapter->m_dhcp_addr)
-    ++p_Adapter->m_dhcp_bad_requests;
-
-  return TRUE;
-}
-
-#if DBG
-
-const char *
-message_op_text (int op)
-{
-  switch (op)
-    {
-    case BOOTREQUEST:
-      return "BOOTREQUEST";
-    case BOOTREPLY:
-      return "BOOTREPLY";
-    default:
-      return "???";
-    }
-}
-
-const char *
-message_type_text (int type)
-{
-  switch (type)
-    {
-    case DHCPDISCOVER:
-      return "DHCPDISCOVER";
-    case DHCPOFFER:
-      return "DHCPOFFER";
-    case DHCPREQUEST:
-      return "DHCPREQUEST";
-    case DHCPDECLINE:
-      return "DHCPDECLINE";
-    case DHCPACK:
-      return "DHCPACK";
-    case DHCPNAK:
-      return "DHCPNAK";
-    case DHCPRELEASE:
-      return "DHCPRELEASE";
-    case DHCPINFORM:
-      return "DHCPINFORM";
-    default:
-      return "???";
-    }
-}
-
-const char *
-port_name (int port)
-{
-  switch (port)
-    {
-    case BOOTPS_PORT:
-      return "BOOTPS";
-    case BOOTPC_PORT:
-      return "BOOTPC";
-    default:
-      return "unknown";
-    }
-}
-
-VOID
-DumpDHCP (const ETH_HEADER *eth,
-         const IPHDR *ip,
-         const UDPHDR *udp,
-         const DHCP *dhcp,
-         const int optlen)
-{
-  DEBUGP ((" %s", message_op_text (dhcp->op)));
-  DEBUGP ((" %s ", message_type_text (GetDHCPMessageType (dhcp, optlen))));
-  PrIP (ip->saddr);
-  DEBUGP ((":%s[", port_name (ntohs (udp->source))));
-  PrMac (eth->src);
-  DEBUGP (("] -> "));
-  PrIP (ip->daddr);
-  DEBUGP ((":%s[", port_name (ntohs (udp->dest))));
-  PrMac (eth->dest);
-  DEBUGP (("]"));
-  if (dhcp->ciaddr)
-    {
-      DEBUGP ((" ci="));
-      PrIP (dhcp->ciaddr);
-    }
-  if (dhcp->yiaddr)
-    {
-      DEBUGP ((" yi="));
-      PrIP (dhcp->yiaddr);
-    }
-  if (dhcp->siaddr)
-    {
-      DEBUGP ((" si="));
-      PrIP (dhcp->siaddr);
-    }
-  if (dhcp->hlen == sizeof (MACADDR))
-    {
-      DEBUGP ((" ch="));
-      PrMac (dhcp->chaddr);
-    }
-
-  DEBUGP ((" xid=0x%08x", ntohl (dhcp->xid)));
-
-  if (ntohl (dhcp->magic) != 0x63825363)
-    DEBUGP ((" ma=0x%08x", ntohl (dhcp->magic)));
-  if (dhcp->htype != 1)
-    DEBUGP ((" htype=%d", dhcp->htype));
-  if (dhcp->hops)
-    DEBUGP ((" hops=%d", dhcp->hops));
-  if (ntohs (dhcp->secs))
-    DEBUGP ((" secs=%d", ntohs (dhcp->secs)));
-  if (ntohs (dhcp->flags))
-    DEBUGP ((" flags=0x%04x", ntohs (dhcp->flags)));
-
-  // extra stuff
-  
-  if (ip->version_len != 0x45)
-    DEBUGP ((" vl=0x%02x", ip->version_len));
-  if (ntohs (ip->tot_len) != sizeof (IPHDR) + sizeof (UDPHDR) + sizeof (DHCP) 
+ optlen)
-    DEBUGP ((" tl=%d", ntohs (ip->tot_len)));
-  if (ntohs (udp->len) != sizeof (UDPHDR) + sizeof (DHCP) + optlen)
-    DEBUGP ((" ul=%d", ntohs (udp->len)));
-
-  if (ip->tos)
-    DEBUGP ((" tos=0x%02x", ip->tos));
-  if (ntohs (ip->id))
-    DEBUGP ((" id=0x%04x", ntohs (ip->id)));
-  if (ntohs (ip->frag_off))
-    DEBUGP ((" frag_off=0x%04x", ntohs (ip->frag_off)));
-  
-  DEBUGP ((" ttl=%d", ip->ttl));
-  DEBUGP ((" ic=0x%04x [0x%04x]", ntohs (ip->check),
-           ip_checksum ((UCHAR*)ip, sizeof (IPHDR))));
-  DEBUGP ((" uc=0x%04x [0x%04x/%d]", ntohs (udp->check),
-           udp_checksum ((UCHAR *) udp,
-                         sizeof (UDPHDR) + sizeof (DHCP) + optlen,
-                         (UCHAR *) &ip->saddr,
-                         (UCHAR *) &ip->daddr),
-           optlen));
-
-  // Options
-  {
-    const UCHAR *opt = (UCHAR *) (dhcp + 1);
-    int i;
-
-    DEBUGP ((" OPT"));
-    for (i = 0; i < optlen; ++i)
-      {
-       const UCHAR data = opt[i];
-       DEBUGP ((".%d", data));
-      }
-  }
-}
-
-#endif /* DBG */
diff --git a/tap-win32/dhcp.h b/tap-win32/dhcp.h
deleted file mode 100755
index 4215f81..0000000
--- a/tap-win32/dhcp.h
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- *  TAP-Win32/TAP-Win64 -- A kernel driver to provide virtual tap
- *                         device functionality on Windows.
- *
- *  This code was inspired by the CIPE-Win32 driver by Damion K. Wilson.
- *
- *  This source code is Copyright (C) 2002-2010 OpenVPN Technologies, Inc.,
- *  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 version 2
- *  as published by the Free Software Foundation.
- *
- *  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
- */
-
-#pragma pack(1)
-
-//===================================================
-// How many bad DHCPREQUESTs do we receive before we
-// return a NAK?
-//
-// A bad DHCPREQUEST is defined to be one where the
-// requestor doesn't know its IP address.
-//===================================================
-
-#define BAD_DHCPREQUEST_NAK_THRESHOLD 3
-
-//==============================================
-// Maximum number of DHCP options bytes supplied
-//==============================================
-
-#define DHCP_USER_SUPPLIED_OPTIONS_BUFFER_SIZE 256
-#define DHCP_OPTIONS_BUFFER_SIZE               256
-
-//===================================
-// UDP port numbers of DHCP messages.
-//===================================
-
-#define BOOTPS_PORT 67
-#define BOOTPC_PORT 68
-
-//===========================
-// The DHCP message structure
-//===========================
-
-typedef struct {
-# define BOOTREQUEST 1
-# define BOOTREPLY   2
-  UCHAR op;          /* message op */
-
-  UCHAR  htype;      /* hardware address type (e.g. '1' = 10Mb Ethernet) */
-  UCHAR  hlen;       /* hardware address length (e.g. '6' for 10Mb Ethernet) */
-  UCHAR  hops;       /* client sets to 0, may be used by relay agents */
-  ULONG  xid;        /* transaction ID, chosen by client */
-  USHORT secs;       /* seconds since request process began, set by client */
-  USHORT flags;
-  ULONG  ciaddr;     /* client IP address, client sets if known */
-  ULONG  yiaddr;     /* 'your' IP address -- server's response to client */
-  ULONG  siaddr;     /* server IP address */
-  ULONG  giaddr;     /* relay agent IP address */
-  UCHAR  chaddr[16]; /* client hardware address */
-  UCHAR  sname[64];  /* optional server host name */
-  UCHAR  file[128];  /* boot file name */
-  ULONG  magic;      /* must be 0x63825363 (network order) */
-} DHCP;
-
-typedef struct {
-  ETH_HEADER eth;
-  IPHDR ip;
-  UDPHDR udp;
-  DHCP dhcp;
-} DHCPPre;
-
-typedef struct {
-  DHCPPre pre;
-  UCHAR options[DHCP_OPTIONS_BUFFER_SIZE];
-} DHCPFull;
-
-typedef struct {
-  unsigned int optlen;
-  BOOLEAN overflow;
-  DHCPFull msg;
-} DHCPMsg;
-
-//===================
-// Macros for DHCPMSG
-//===================
-
-#define DHCPMSG_LEN_BASE(p) (sizeof (DHCPPre))
-#define DHCPMSG_LEN_OPT(p)  ((p)->optlen)
-#define DHCPMSG_LEN_FULL(p) (DHCPMSG_LEN_BASE(p) + DHCPMSG_LEN_OPT(p))
-#define DHCPMSG_BUF(p)      ((UCHAR*) &(p)->msg)
-#define DHCPMSG_OVERFLOW(p) ((p)->overflow)
-
-//========================================
-// structs to hold individual DHCP options
-//========================================
-
-typedef struct {
-  UCHAR type;
-} DHCPOPT0;
-
-typedef struct {
-  UCHAR type;
-  UCHAR len;
-  UCHAR data;
-} DHCPOPT8;
-
-typedef struct {
-  UCHAR type;
-  UCHAR len;
-  ULONG data;
-} DHCPOPT32;
-
-#pragma pack()
-
-//==================
-// DHCP Option types
-//==================
-
-#define DHCP_MSG_TYPE    53  /* message type (u8) */
-#define DHCP_PARM_REQ    55  /* parameter request list: c1 (u8), ... */
-#define DHCP_CLIENT_ID   61  /* client ID: type (u8), i1 (u8), ... */
-#define DHCP_IP          50  /* requested IP addr (u32) */
-#define DHCP_NETMASK      1  /* subnet mask (u32) */
-#define DHCP_LEASE_TIME  51  /* lease time sec (u32) */
-#define DHCP_RENEW_TIME  58  /* renewal time sec (u32) */
-#define DHCP_REBIND_TIME 59  /* rebind time sec (u32) */
-#define DHCP_SERVER_ID   54  /* server ID: IP addr (u32) */
-#define DHCP_PAD          0
-#define DHCP_END        255
-
-//====================
-// DHCP Messages types
-//====================
-
-#define DHCPDISCOVER 1
-#define DHCPOFFER    2
-#define DHCPREQUEST  3
-#define DHCPDECLINE  4
-#define DHCPACK      5
-#define DHCPNAK      6
-#define DHCPRELEASE  7
-#define DHCPINFORM   8
-
-#if DBG
-
-VOID
-DumpDHCP (const ETH_HEADER *eth,
-         const IPHDR *ip,
-         const UDPHDR *udp,
-         const DHCP *dhcp,
-         const int optlen);
-
-#endif
diff --git a/tap-win32/endian.h b/tap-win32/endian.h
deleted file mode 100755
index 128029a..0000000
--- a/tap-win32/endian.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- *  TAP-Win32/TAP-Win64 -- A kernel driver to provide virtual tap
- *                         device functionality on Windows.
- *
- *  This code was inspired by the CIPE-Win32 driver by Damion K. Wilson.
- *
- *  This source code is Copyright (C) 2002-2010 OpenVPN Technologies, Inc.,
- *  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 version 2
- *  as published by the Free Software Foundation.
- *
- *  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
- */
-
-#ifdef TAP_LITTLE_ENDIAN
-#define ntohs(x) RtlUshortByteSwap(x)
-#define htons(x) RtlUshortByteSwap(x)
-#define ntohl(x) RtlUlongByteSwap(x)
-#define htonl(x) RtlUlongByteSwap(x)
-#else
-#define ntohs(x) ((USHORT)(x))
-#define htons(x) ((USHORT)(x))
-#define ntohl(x) ((ULONG)(x))
-#define htonl(x) ((ULONG)(x))
-#endif
diff --git a/tap-win32/error.c b/tap-win32/error.c
deleted file mode 100755
index 5b25f48..0000000
--- a/tap-win32/error.c
+++ /dev/null
@@ -1,378 +0,0 @@
-/*
- *  TAP-Win32/TAP-Win64 -- A kernel driver to provide virtual tap
- *                         device functionality on Windows.
- *
- *  This code was inspired by the CIPE-Win32 driver by Damion K. Wilson.
- *
- *  This source code is Copyright (C) 2002-2010 OpenVPN Technologies, Inc.,
- *  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 version 2
- *  as published by the Free Software Foundation.
- *
- *  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
- */
-
-//-----------------
-// DEBUGGING OUTPUT
-//-----------------
-
-const char *g_LastErrorFilename;
-int g_LastErrorLineNumber;
-
-#if DBG
-
-DebugOutput g_Debug;
-
-BOOLEAN
-NewlineExists (const char *str, int len)
-{
-  while (len-- > 0)
-    {
-      const char c = *str++;
-      if (c == '\n')
-       return TRUE;
-      else if (c == '\0')
-       break;
-    }
-  return FALSE;
-}
-
-VOID
-MyDebugInit (unsigned int bufsiz)
-{
-  NdisZeroMemory (&g_Debug, sizeof (g_Debug));
-  g_Debug.text = (char *) MemAlloc (bufsiz, FALSE);
-  if (g_Debug.text)
-    g_Debug.capacity = bufsiz;
-}
-
-VOID
-MyDebugFree ()
-{
-  if (g_Debug.text)
-    MemFree (g_Debug.text, g_Debug.capacity);
-  NdisZeroMemory (&g_Debug, sizeof (g_Debug));
-}
-
-VOID
-MyDebugPrint (const unsigned char* format, ...)
-{
-  if (g_Debug.text && g_Debug.capacity > 0 && CAN_WE_PRINT)
-    {
-      BOOLEAN owned;
-      ACQUIRE_MUTEX_ADAPTIVE (&g_Debug.lock, owned);
-      if (owned)
-       {
-         const int remaining = (int)g_Debug.capacity - (int)g_Debug.out;
-
-         if (remaining > 0)
-           {
-             va_list args;
-             NTSTATUS status;
-             char *end;
-
-             va_start (args, format);
-             status = RtlStringCchVPrintfExA (g_Debug.text + g_Debug.out,
-                                              remaining,
-                                              &end,
-                                              NULL,
-                                              STRSAFE_NO_TRUNCATION | 
STRSAFE_IGNORE_NULLS,
-                                              format,
-                                              args);
-             va_end (args);
-
-             if (status == STATUS_SUCCESS)
-               g_Debug.out = (unsigned int) (end - g_Debug.text);
-             else
-               g_Debug.error = TRUE;
-           }
-         else
-           g_Debug.error = TRUE;
-
-         RELEASE_MUTEX (&g_Debug.lock);
-       }
-      else
-       g_Debug.error = TRUE;
-    }
-}
-
-BOOLEAN
-GetDebugLine (char *buf, const int len)
-{
-  static const char *truncated = "[OUTPUT TRUNCATED]\n";
-  BOOLEAN ret = FALSE;
-
-  NdisZeroMemory (buf, len);
-
-  if (g_Debug.text && g_Debug.capacity > 0)
-    {
-      BOOLEAN owned;
-      ACQUIRE_MUTEX_ADAPTIVE (&g_Debug.lock, owned);
-      if (owned)
-       {
-         int i = 0;
-
-         if (g_Debug.error || NewlineExists (g_Debug.text + g_Debug.in, 
(int)g_Debug.out - (int)g_Debug.in))
-           {
-             while (i < (len - 1) && g_Debug.in < g_Debug.out)
-               {
-                 const char c = g_Debug.text[g_Debug.in++];
-                 if (c == '\n')
-                   break;
-                 buf[i++] = c;
-               }
-             if (i < len)
-               buf[i] = '\0';
-           }
-
-         if (!i)
-           {
-             if (g_Debug.in == g_Debug.out)
-               {
-                 g_Debug.in = g_Debug.out = 0;
-                 if (g_Debug.error)
-                   {
-                     const unsigned int tlen = strlen (truncated);
-                     if (tlen < g_Debug.capacity)
-                       {
-                         NdisMoveMemory (g_Debug.text, truncated, tlen+1);
-                         g_Debug.out = tlen;
-                       }
-                     g_Debug.error = FALSE;
-                   }
-               }
-           }
-         else
-           ret = TRUE;
-
-         RELEASE_MUTEX (&g_Debug.lock);
-       }      
-    }
-  return ret;
-}
-
-VOID
-MyAssert (const unsigned char *file, int line)
-{
-      DEBUGP (("MYASSERT failed %s/%d\n", file, line));
-      KeBugCheckEx (0x0F00BABA,
-                   (ULONG_PTR) line,
-                   (ULONG_PTR) 0,
-                   (ULONG_PTR) 0,
-                   (ULONG_PTR) 0);
-}
-
-VOID
-PrMac (const MACADDR mac)
-{
-  DEBUGP (("%x:%x:%x:%x:%x:%x",
-           mac[0], mac[1], mac[2],
-           mac[3], mac[4], mac[5]));
-}
-
-VOID
-PrIP (IPADDR ip_addr)
-{
-  const unsigned char *ip = (const unsigned char *) &ip_addr;
-
-  DEBUGP (("%d.%d.%d.%d",
-           ip[0], ip[1], ip[2], ip[3]));
-}
-
-const char *
-PrIPProto (int proto)
-{
-  switch (proto)
-    {
-    case IPPROTO_UDP:
-      return "UDP";
-    case IPPROTO_TCP:
-      return "TCP";
-    case IPPROTO_ICMP:
-      return "ICMP";
-    case IPPROTO_IGMP:
-      return "IGMP";
-    default:
-      return "???";
-    }
-}
-
-VOID
-DumpARP (const char *prefix, const ARP_PACKET *arp)
-{
-  DEBUGP (("%s ARP src=", prefix));
-  PrMac (arp->m_MAC_Source);
-  DEBUGP ((" dest="));
-  PrMac (arp->m_MAC_Destination);
-  DEBUGP ((" OP=0x%04x",
-           (int)ntohs(arp->m_ARP_Operation)));
-  DEBUGP ((" M=0x%04x(%d)",
-           (int)ntohs(arp->m_MAC_AddressType),
-           (int)arp->m_MAC_AddressSize));
-  DEBUGP ((" P=0x%04x(%d)",
-           (int)ntohs(arp->m_PROTO_AddressType),
-           (int)arp->m_PROTO_AddressSize));
-
-  DEBUGP ((" MacSrc="));
-  PrMac (arp->m_ARP_MAC_Source);
-  DEBUGP ((" MacDest="));
-  PrMac (arp->m_ARP_MAC_Destination);
-
-  DEBUGP ((" IPSrc="));
-  PrIP (arp->m_ARP_IP_Source);
-  DEBUGP ((" IPDest="));
-  PrIP (arp->m_ARP_IP_Destination);
-
-  DEBUGP (("\n"));
-}
-
-struct ethpayload {
-  ETH_HEADER eth;
-  UCHAR payload[DEFAULT_PACKET_LOOKAHEAD];
-};
-
-VOID
-DumpPacket2 (const char *prefix,
-            const ETH_HEADER *eth,
-            const unsigned char *data,
-            unsigned int len)
-{
-  struct ethpayload *ep = (struct ethpayload *) MemAlloc (sizeof (struct 
ethpayload), TRUE);
-  if (ep)
-    {
-      if (len > DEFAULT_PACKET_LOOKAHEAD)
-       len = DEFAULT_PACKET_LOOKAHEAD;
-      ep->eth = *eth;
-      NdisMoveMemory (ep->payload, data, len);
-      DumpPacket (prefix, (unsigned char *) ep, sizeof (ETH_HEADER) + len);
-      MemFree (ep, sizeof (struct ethpayload));
-    }
-}
-
-VOID
-DumpPacket (const char *prefix,
-           const unsigned char *data,
-           unsigned int len)
-{
-  const ETH_HEADER *eth = (const ETH_HEADER *) data;
-  const IPHDR *ip = (const IPHDR *) (data + sizeof (ETH_HEADER));
-
-  if (len < sizeof (ETH_HEADER))
-    {
-      DEBUGP (("%s TRUNCATED PACKET LEN=%d\n", prefix, len));
-      return;
-    }
-
-  // ARP Packet?
-  if (len >= sizeof (ARP_PACKET) && eth->proto == htons (ETH_P_ARP))
-    {
-      DumpARP (prefix, (const ARP_PACKET *) data);
-      return;
-    }
-
-  // IPv4 packet?
-  if (len >= (sizeof (IPHDR) + sizeof (ETH_HEADER))
-      && eth->proto == htons (ETH_P_IP)
-      && IPH_GET_VER (ip->version_len) == 4)
-    {
-      const int hlen = IPH_GET_LEN (ip->version_len);
-      const int blen = len - sizeof (ETH_HEADER);
-      BOOLEAN did = FALSE;
-
-      DEBUGP (("%s IPv4 %s[%d]", prefix, PrIPProto (ip->protocol), len));
-
-      if (!(ntohs (ip->tot_len) == blen && hlen <= blen))
-       {
-         DEBUGP ((" XXX"));
-         return;
-       }
-      
-      // TCP packet?
-      if (ip->protocol == IPPROTO_TCP
-         && blen - hlen >= (sizeof (TCPHDR)))
-       {
-         const TCPHDR *tcp = (TCPHDR *) (data + sizeof (ETH_HEADER) + hlen);
-         DEBUGP ((" "));
-         PrIP (ip->saddr);
-         DEBUGP ((":%d", ntohs (tcp->source)));
-         DEBUGP ((" -> "));
-         PrIP (ip->daddr);
-         DEBUGP ((":%d", ntohs (tcp->dest)));
-         did = TRUE;
-       }
-
-      // UDP packet?
-      else if ((ntohs (ip->frag_off) & IP_OFFMASK) == 0
-              && ip->protocol == IPPROTO_UDP
-              && blen - hlen >= (sizeof (UDPHDR)))
-       {
-         const UDPHDR *udp = (UDPHDR *) (data + sizeof (ETH_HEADER) + hlen);
-         
-         // DHCP packet?
-         if ((udp->dest == htons (BOOTPC_PORT) || udp->dest == htons 
(BOOTPS_PORT))
-             && blen - hlen >= (sizeof (UDPHDR) + sizeof (DHCP)))
-           {
-             const DHCP *dhcp = (DHCP *) (data
-                                          + hlen
-                                          + sizeof (ETH_HEADER)
-                                          + sizeof (UDPHDR));
-             
-             int optlen = len
-               - sizeof (ETH_HEADER)
-               - hlen
-               - sizeof (UDPHDR)
-               - sizeof (DHCP);
-
-             if (optlen < 0)
-               optlen = 0;
-
-             DumpDHCP (eth, ip, udp, dhcp, optlen);
-             did = TRUE;
-           }
-
-         if (!did)
-           {
-             DEBUGP ((" "));
-             PrIP (ip->saddr);
-             DEBUGP ((":%d", ntohs (udp->source)));
-             DEBUGP ((" -> "));
-             PrIP (ip->daddr);
-             DEBUGP ((":%d", ntohs (udp->dest)));
-             did = TRUE;
-           }
-       }
-
-      if (!did)
-       {
-         DEBUGP ((" ipproto=%d ", ip->protocol));
-         PrIP (ip->saddr);
-         DEBUGP ((" -> "));
-         PrIP (ip->daddr);
-       }
-
-      DEBUGP (("\n"));
-      return;
-    }
-
-  {
-    DEBUGP (("%s ??? src=", prefix));
-    PrMac (eth->src);
-    DEBUGP ((" dest="));
-    PrMac (eth->dest);
-    DEBUGP ((" proto=0x%04x len=%d\n",
-             (int) ntohs(eth->proto),
-             len));
-  }
-}
-
-#endif
diff --git a/tap-win32/error.h b/tap-win32/error.h
deleted file mode 100755
index d8436dc..0000000
--- a/tap-win32/error.h
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- *  TAP-Win32/TAP-Win64 -- A kernel driver to provide virtual tap
- *                         device functionality on Windows.
- *
- *  This code was inspired by the CIPE-Win32 driver by Damion K. Wilson.
- *
- *  This source code is Copyright (C) 2002-2010 OpenVPN Technologies, Inc.,
- *  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 version 2
- *  as published by the Free Software Foundation.
- *
- *  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
- */
-
-//-----------------
-// DEBUGGING OUTPUT
-//-----------------
-
-#define NOTE_ERROR() \
-{ \
-  g_LastErrorFilename = __FILE__; \
-  g_LastErrorLineNumber = __LINE__; \
-}
-
-#if DBG
-
-typedef struct {
-  unsigned int in;
-  unsigned int out;
-  unsigned int capacity;
-  char *text;
-  BOOLEAN error;
-  MUTEX lock;
-} DebugOutput;
-
-VOID MyDebugPrint (const unsigned char* format, ...);
-
-VOID MyAssert (const unsigned char *file, int line);
-
-VOID DumpPacket (const char *prefix,
-                const unsigned char *data,
-                unsigned int len);
-
-VOID DumpPacket2 (const char *prefix,
-                 const ETH_HEADER *eth,
-                 const unsigned char *data,
-                 unsigned int len);
-
-#define CAN_WE_PRINT (DEBUGP_AT_DISPATCH || KeGetCurrentIrql () < 
DISPATCH_LEVEL)
-
-#if ALSO_DBGPRINT
-#define DEBUGP(fmt) { MyDebugPrint fmt; if (CAN_WE_PRINT) DbgPrint fmt; }
-#else
-#define DEBUGP(fmt) { MyDebugPrint fmt; }
-#endif
-
-#define MYASSERT(exp) \
-{ \
-  if (!(exp)) \
-    { \
-      MyAssert(__FILE__, __LINE__); \
-    } \
-}
-
-#define DUMP_PACKET(prefix, data, len) \
-  DumpPacket (prefix, data, len)
-
-#define DUMP_PACKET2(prefix, eth, data, len) \
-  DumpPacket2 (prefix, eth, data, len)
-
-#else 
-
-#define DEBUGP(fmt)
-#define MYASSERT(exp)
-#define DUMP_PACKET(prefix, data, len)
-#define DUMP_PACKET2(prefix, eth, data, len)
-
-#endif
diff --git a/tap-win32/hexdump.c b/tap-win32/hexdump.c
deleted file mode 100755
index 49bc38c..0000000
--- a/tap-win32/hexdump.c
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- *  TAP-Win32/TAP-Win64 -- A kernel driver to provide virtual tap
- *                         device functionality on Windows.
- *
- *  This code was inspired by the CIPE-Win32 driver by Damion K. Wilson.
- *
- *  This source code is Copyright (C) 2002-2010 OpenVPN Technologies, Inc.,
- *  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 version 2
- *  as published by the Free Software Foundation.
- *
- *  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
- */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include "hexdump.h"
-
-#ifndef NDIS_MINIPORT_DRIVER
-
-VOID (*DbgMessage)(char *p_Format, ...) = DisplayDebugString;
-
-VOID DisplayDebugString (char *p_Format, ...)
-   {
-    static char l_Buffer [4096];
-
-    va_list l_ArgumentList; 
-    va_start (l_ArgumentList, p_Format); 
-    vsprintf (l_Buffer, p_Format, l_ArgumentList); 
-    va_end (l_ArgumentList); 
-
-    OutputDebugStringA (l_Buffer);
-   }
-
-#endif
-
-VOID HexDump (unsigned char *p_Buffer, unsigned long p_Size)
-   {
-    unsigned long l_Index, l_Idx;
-    unsigned char l_Row [17];
-
-    for (l_Index = l_Row [16] = 0; l_Index < p_Size || l_Index % 16; ++l_Index)
-       {
-        if (l_Index % 16 == 0)
-         DEBUGP (("%05x   ", l_Index));
-        DEBUGP (("%02x ", l_Row [l_Index % 16] = (l_Index < p_Size ? p_Buffer 
[l_Index] : 0)));
-        l_Row [l_Index % 16] = IfPrint (l_Row [l_Index % 16]);
-        if ((l_Index + 1) % 16 == 0)
-         DEBUGP (("   %s\n", l_Row));
-       }
-
-    DEBUGP (("\n"));
-   }
-
-#ifdef __cplusplus
-}
-#endif
diff --git a/tap-win32/hexdump.h b/tap-win32/hexdump.h
deleted file mode 100755
index c1af705..0000000
--- a/tap-win32/hexdump.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- *  TAP-Win32/TAP-Win64 -- A kernel driver to provide virtual tap
- *                         device functionality on Windows.
- *
- *  This code was inspired by the CIPE-Win32 driver by Damion K. Wilson.
- *
- *  This source code is Copyright (C) 2002-2010 OpenVPN Technologies, Inc.,
- *  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 version 2
- *  as published by the Free Software Foundation.
- *
- *  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
- */
-
-#ifndef HEXDUMP_DEFINED
-#define HEXDUMP_DEFINED
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-//=====================================================================================
-//                                   Debug Routines
-//=====================================================================================
-
-#ifndef NDIS_MINIPORT_DRIVER
-#   include <stdio.h>
-#   include <ctype.h>
-#   include <windows.h>
-#   include <winnt.h>
-#   include <memory.h>
-
-#   ifndef DEBUGP
-#      define DEBUGP(fmt) { DbgMessage fmt; }
-#   endif
-
-    extern VOID (*DbgMessage)(char *p_Format, ...);
-
-    VOID DisplayDebugString (char *p_Format, ...);
-#endif
-
-//===================================================================================
-//                              Reporting / Debugging
-//===================================================================================
-#define IfPrint(c) (c >= 32 && c < 127 ? c : '.')
-
-VOID HexDump (unsigned char *p_Buffer, unsigned long p_Size);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/tap-win32/i386/OemWin2k.inf.in b/tap-win32/i386/OemWin2k.inf.in
deleted file mode 100755
index 031b06c..0000000
--- a/tap-win32/i386/OemWin2k.inf.in
+++ /dev/null
@@ -1,195 +0,0 @@
-; ****************************************************************************
-; * Copyright (C) 2002-2010 OpenVPN Technologies, Inc.                         
   *
-; *  This program is free software; you can redistribute it and/or modify    *
-; *  it under the terms of the GNU General Public License version 2          *
-; *  as published by the Free Software Foundation.                           *
-; ****************************************************************************
-
-; SYNTAX CHECKER
-; cd \WINDDK\3790\tools\chkinf
-; chkinf c:\src\openvpn\tap-win32\i386\oemwin2k.inf
-; OUTPUT -> 
file:///c:/WINDDK/3790/tools/chkinf/htm/c%23+src+openvpn+tap-win32+i386+__OemWin2k.htm
-
-; INSTALL/REMOVE DRIVER
-;   tapinstall install OemWin2k.inf TAP0901
-;   tapinstall update OemWin2k.inf TAP0901
-;   tapinstall remove TAP0901
-
-;*********************************************************
-; Note to Developers:
-;
-; If you are bundling the TAP-Win32 driver with your app,
-; you should try to rename it in such a way that it will
-; not collide with other instances of TAP-Win32 defined
-; by other apps.  Multiple versions of the TAP-Win32
-; driver, each installed by different apps, can coexist
-; on the same machine if you follow these guidelines.
-; NOTE: these instructions assume you are editing the
-; generated OemWin2k.inf file, not the source
-; OemWin2k.inf.in file which is preprocessed by winconfig
-; and uses macro definitions from settings.in.
-;
-; (1) Rename all tapXXXX instances in this file to
-;     something different (use at least 5 characters
-;     for this name!)
-; (2) Change the "!define TAP" definition in openvpn.nsi
-;     to match what you changed tapXXXX to.
-; (3) Change TARGETNAME in SOURCES to match what you
-;     changed tapXXXX to.
-; (4) Change TAP_COMPONENT_ID in common.h to match what
-;     you changed tapXXXX to.
-; (5) Change SZDEPENDENCIES in service.h to match what
-;     you changed tapXXXX to.
-; (6) Change DeviceDescription and Provider strings.
-; (7) Change PRODUCT_STRING in constants.h to what you
-;     set DeviceDescription to.
-;
-;*********************************************************
-
-[Version]
-   Signature = "$Windows NT$"
-   CatalogFile = @@PRODUCT_TAP_ID@@.cat
-   ClassGUID = {4d36e972-e325-11ce-bfc1-08002be10318}
-   Provider = %Provider%
-   Class = Net
-
-; This version number should match the version
-; number given in SOURCES.
-   
DriverVer=@@PRODUCT_TAP_RELDATE@@,@@PRODUCT_TAP_MAJOR_VER@@.00.00.@@PRODUCT_TAP_MINOR_VER@@
-
-[Strings]
-   DeviceDescription = "@@PRODUCT_TAP_DEVICE_DESCRIPTION@@"
-   Provider = "@@PRODUCT_TAP_PROVIDER@@"
-
-;----------------------------------------------------------------
-;                      Manufacturer + Product Section (Done)
-;----------------------------------------------------------------
-[Manufacturer]
-!ifdef AMD64
-   %Provider% = @@PRODUCT_TAP_ID@@, NTamd64
-!else
-   %Provider% = @@PRODUCT_TAP_ID@@
-!endif
-
-!ifdef AMD64
-[@@PRODUCT_TAP_ID@@.NTamd64]
-!else
-[@@PRODUCT_TAP_ID@@]
-!endif
-   %DeviceDescription% = @@PRODUCT_TAP_ID@@.ndi, @@PRODUCT_TAP_ID@@
-
-;---------------------------------------------------------------
-;                             Driver Section (Done)
-;---------------------------------------------------------------
-
-;----------------- Characteristics ------------
-;    NCF_PHYSICAL = 0x04
-;    NCF_VIRTUAL = 0x01
-;    NCF_SOFTWARE_ENUMERATED = 0x02
-;    NCF_HIDDEN = 0x08
-;    NCF_NO_SERVICE = 0x10
-;    NCF_HAS_UI = 0x80
-;----------------- Characteristics ------------
-
-[@@PRODUCT_TAP_ID@@.ndi]
-   CopyFiles       = @@PRODUCT_TAP_ID@@.driver, @@PRODUCT_TAP_ID@@.files
-   AddReg          = @@PRODUCT_TAP_ID@@.reg
-   AddReg          = @@PRODUCT_TAP_ID@@.params.reg
-   Characteristics = @@PRODUCT_TAP_CHARACTERISTICS@@
-
-[@@PRODUCT_TAP_ID@@.ndi.Services]
-   AddService = @@PRODUCT_TAP_ID@@,        2, @@PRODUCT_TAP_ID@@.service
-
-[@@PRODUCT_TAP_ID@@.reg]
-   HKR, Ndi,            Service,      0, "@@PRODUCT_TAP_ID@@"
-   HKR, Ndi\Interfaces, UpperRange,   0, "ndis5"
-   HKR, Ndi\Interfaces, LowerRange,   0, "ethernet"
-   HKR, ,               Manufacturer, 0, "%Provider%"
-   HKR, ,               ProductName,  0, "%DeviceDescription%"
-
-[@@PRODUCT_TAP_ID@@.params.reg]
-   HKR, Ndi\params\MTU,                  ParamDesc, 0, "MTU"
-   HKR, Ndi\params\MTU,                  Type,      0, "int"
-   HKR, Ndi\params\MTU,                  Default,   0, "1500"
-   HKR, Ndi\params\MTU,                  Optional,  0, "0"
-   HKR, Ndi\params\MTU,                  Min,       0, "100"
-   HKR, Ndi\params\MTU,                  Max,       0, "1500"
-   HKR, Ndi\params\MTU,                  Step,      0, "1"
-   HKR, Ndi\params\MediaStatus,          ParamDesc, 0, "Media Status"
-   HKR, Ndi\params\MediaStatus,          Type,      0, "enum"
-   HKR, Ndi\params\MediaStatus,          Default,   0, "0"
-   HKR, Ndi\params\MediaStatus,          Optional,  0, "0"
-   HKR, Ndi\params\MediaStatus\enum,     "0",       0, "Application Controlled"
-   HKR, Ndi\params\MediaStatus\enum,     "1",       0, "Always Connected"
-   HKR, Ndi\params\MAC,                  ParamDesc, 0, "MAC Address"
-   HKR, Ndi\params\MAC,                  Type,      0, "edit"
-   HKR, Ndi\params\MAC,                  Optional,  0, "1"
-   HKR, Ndi\params\AllowNonAdmin,        ParamDesc, 0, "Non-Admin Access"
-   HKR, Ndi\params\AllowNonAdmin,        Type,      0, "enum"
-   HKR, Ndi\params\AllowNonAdmin,        Default,   0, "1"
-   HKR, Ndi\params\AllowNonAdmin,        Optional,  0, "0"
-   HKR, Ndi\params\AllowNonAdmin\enum,   "0",       0, "Not Allowed"
-   HKR, Ndi\params\AllowNonAdmin\enum,   "1",       0, "Allowed"
-
-;----------------------------------------------------------------
-;                             Service Section
-;----------------------------------------------------------------
-
-;---------- Service Type -------------
-;    SERVICE_KERNEL_DRIVER     = 0x01
-;    SERVICE_WIN32_OWN_PROCESS = 0x10
-;---------- Service Type -------------
-
-;---------- Start Mode ---------------
-;    SERVICE_BOOT_START   = 0x0
-;    SERVICE_SYSTEM_START = 0x1
-;    SERVICE_AUTO_START   = 0x2
-;    SERVICE_DEMAND_START = 0x3
-;    SERVICE_DISABLED     = 0x4
-;---------- Start Mode ---------------
-
-[@@PRODUCT_TAP_ID@@.service]
-   DisplayName = %DeviceDescription%
-   ServiceType = 1
-   StartType = 3
-   ErrorControl = 1
-   LoadOrderGroup = NDIS
-   ServiceBinary = %12%\@@PRODUCT_TAP_ID@@.sys
-
-;-----------------------------------------------------------------
-;                                File Installation
-;-----------------------------------------------------------------
-
-;----------------- Copy Flags ------------
-;    COPYFLG_NOSKIP = 0x02
-;    COPYFLG_NOVERSIONCHECK = 0x04
-;----------------- Copy Flags ------------
-
-; SourceDisksNames
-; diskid = description[, [tagfile] [, <unused>, subdir]]
-; 1 = "Intel Driver Disk 1",e100bex.sys,,
-
-[SourceDisksNames]
-   1 = %DeviceDescription%, @@PRODUCT_TAP_ID@@.sys
-
-; SourceDisksFiles
-; filename_on_source = diskID[, [subdir][, size]]
-; e100bex.sys = 1,, ; on distribution disk 1
-
-[SourceDisksFiles]
-@@PRODUCT_TAP_ID@@.sys = 1
-
-[DestinationDirs]
-   @@PRODUCT_TAP_ID@@.files  = 11
-   @@PRODUCT_TAP_ID@@.driver = 12
-
-[@@PRODUCT_TAP_ID@@.files]
-;   TapPanel.cpl,,,6   ; COPYFLG_NOSKIP | COPYFLG_NOVERSIONCHECK
-;   cipsrvr.exe,,,6     ; COPYFLG_NOSKIP | COPYFLG_NOVERSIONCHECK
-
-[@@PRODUCT_TAP_ID@@.driver]
-   @@PRODUCT_TAP_ID@@.sys,,,6     ; COPYFLG_NOSKIP | COPYFLG_NOVERSIONCHECK
-
-;---------------------------------------------------------------
-;                                      End
-;---------------------------------------------------------------
diff --git a/tap-win32/instance.c b/tap-win32/instance.c
deleted file mode 100755
index 182cee8..0000000
--- a/tap-win32/instance.c
+++ /dev/null
@@ -1,241 +0,0 @@
-/*
- *  TAP-Win32/TAP-Win64 -- A kernel driver to provide virtual tap
- *                         device functionality on Windows.
- *
- *  This code was inspired by the CIPE-Win32 driver by Damion K. Wilson.
- *
- *  This source code is Copyright (C) 2002-2010 OpenVPN Technologies, Inc.,
- *  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 version 2
- *  as published by the Free Software Foundation.
- *
- *  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
- */
-
-#define INSTANCE_KEY(a) ((PVOID)((a)->m_Extension.m_TapDevice))
-
-#define N_INSTANCE_BUCKETS 256
-
-typedef struct _INSTANCE {
-  struct _INSTANCE *next;
-  TapAdapterPointer m_Adapter;
-} INSTANCE;
-
-typedef struct {
-  INSTANCE *list;
-  MUTEX lock;
-} INSTANCE_BUCKET;
-
-typedef struct {
-  INSTANCE_BUCKET buckets[N_INSTANCE_BUCKETS];
-} INSTANCE_HASH;
-
-INSTANCE_HASH *g_InstanceHash = NULL;
-
-// must return a hash >= 0 and < N_INSTANCE_BUCKETS
-int
-InstanceHashValue (PVOID addr)
-{
-  UCHAR *p = (UCHAR *) &addr;
-
-  if (sizeof (addr) == 4)
-    return p[0] ^ p[1] ^ p[2] ^ p[3];
-  else if (sizeof (addr) == 8)
-    return p[0] ^ p[1] ^ p[2] ^ p[3] ^ p[4] ^ p[5] ^ p[6] ^ p[7];
-  else
-    {
-      MYASSERT (0);
-    }
-}
-
-BOOLEAN
-InitInstanceList (VOID)
-{
-  MYASSERT (g_InstanceHash == NULL);
-  g_InstanceHash = MemAlloc (sizeof (INSTANCE_HASH), TRUE);
-  if (g_InstanceHash)
-    {
-      int i;
-      for (i = 0; i < N_INSTANCE_BUCKETS; ++i)
-       INIT_MUTEX (&g_InstanceHash->buckets[i].lock);
-      return TRUE;
-    }
-  else
-    return FALSE;
-}
-
-int
-NInstances (VOID)
-{
-  int i, n = 0;
-
-  if (g_InstanceHash)
-    {
-      for (i = 0; i < N_INSTANCE_BUCKETS; ++i)
-       {
-         BOOLEAN got_lock;
-         INSTANCE_BUCKET *ib = &g_InstanceHash->buckets[i];
-         ACQUIRE_MUTEX_ADAPTIVE (&ib->lock, got_lock);
-
-         if (got_lock)
-           {
-             INSTANCE *current;
-             for (current = ib->list; current != NULL; current = current->next)
-               ++n;
-             RELEASE_MUTEX (&ib->lock);
-           }
-         else
-           return -1;
-       }
-    }
-
-  return n;
-}
-
-int
-InstanceMaxBucketSize (VOID)
-{
-  int i, n = 0;
-
-  if (g_InstanceHash)
-    {
-      for (i = 0; i < N_INSTANCE_BUCKETS; ++i)
-       {
-         BOOLEAN got_lock;
-         int bucket_size = 0;
-         INSTANCE_BUCKET *ib = &g_InstanceHash->buckets[i];
-         ACQUIRE_MUTEX_ADAPTIVE (&ib->lock, got_lock);
-
-         if (got_lock)
-           {
-             INSTANCE *current;
-             for (current = ib->list; current != NULL; current = current->next)
-                 ++bucket_size;
-             if (bucket_size > n)
-               n = bucket_size;
-             RELEASE_MUTEX (&ib->lock);
-           }
-         else
-           return -1;
-       }
-    }
-
-  return n;
-}
-
-VOID
-FreeInstanceList (VOID)
-{
-  if (g_InstanceHash)
-    {
-      MYASSERT (NInstances() == 0);
-      MemFree (g_InstanceHash, sizeof (INSTANCE_HASH));
-      g_InstanceHash = NULL;
-    }
-}
-
-BOOLEAN
-AddAdapterToInstanceList (TapAdapterPointer p_Adapter)
-{
-  BOOLEAN got_lock;
-  BOOLEAN ret = FALSE;
-  const int hash = InstanceHashValue(INSTANCE_KEY(p_Adapter));
-  INSTANCE_BUCKET *ib = &g_InstanceHash->buckets[hash];
-
-  DEBUGP (("[TAP] AddAdapterToInstanceList hash=%d\n", hash));
-
-  ACQUIRE_MUTEX_ADAPTIVE (&ib->lock, got_lock);
-
-  if (got_lock)
-    {
-      INSTANCE *i = MemAlloc (sizeof (INSTANCE), FALSE);
-      if (i)
-       {
-         MYASSERT (p_Adapter);
-         i->m_Adapter = p_Adapter;
-         i->next = ib->list;
-         ib->list = i;
-         ret = TRUE;
-       }
-      RELEASE_MUTEX (&ib->lock);
-    }
-
-  return ret;
-}
-
-BOOLEAN
-RemoveAdapterFromInstanceList (TapAdapterPointer p_Adapter)
-{
-  BOOLEAN got_lock;
-  BOOLEAN ret = FALSE;
-  INSTANCE_BUCKET *ib = 
&g_InstanceHash->buckets[InstanceHashValue(INSTANCE_KEY(p_Adapter))];
-
-  ACQUIRE_MUTEX_ADAPTIVE (&ib->lock, got_lock);
-
-  if (got_lock)
-    {
-      INSTANCE *current, *prev=NULL;
-      for (current = ib->list; current != NULL; current = current->next)
-       {
-         if (current->m_Adapter == p_Adapter) // found match
-           {
-             if (prev)
-               prev->next = current->next;
-             else
-               ib->list = current->next;
-             MemFree (current->m_Adapter, sizeof (TapAdapter));
-             MemFree (current, sizeof (INSTANCE));
-             ret = TRUE;
-             break;
-           }
-         prev = current;
-       }
-      RELEASE_MUTEX (&ib->lock);
-    }
-
-  return ret;
-}
-
-TapAdapterPointer
-LookupAdapterInInstanceList (PDEVICE_OBJECT p_DeviceObject)
-{
-  BOOLEAN got_lock;
-  TapAdapterPointer ret = NULL;
-  INSTANCE_BUCKET *ib = 
&g_InstanceHash->buckets[InstanceHashValue((PVOID)p_DeviceObject)];
-
-  ACQUIRE_MUTEX_ADAPTIVE (&ib->lock, got_lock);
-
-  if (got_lock)
-    {
-      INSTANCE *current, *prev=NULL;
-      for (current = ib->list; current != NULL; current = current->next)
-       {
-         if (p_DeviceObject == INSTANCE_KEY (current->m_Adapter)) // found 
match
-           {
-             // move it to head of list
-             if (prev)
-               {
-                 prev->next = current->next;
-                 current->next = ib->list;
-                 ib->list = current;
-               }
-             ret = ib->list->m_Adapter;
-             break;
-           }
-         prev = current;
-       }
-      RELEASE_MUTEX (&ib->lock);
-    }
-
-  return ret;
-}
diff --git a/tap-win32/lock.h b/tap-win32/lock.h
deleted file mode 100755
index ea75414..0000000
--- a/tap-win32/lock.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- *  TAP-Win32/TAP-Win64 -- A kernel driver to provide virtual tap
- *                         device functionality on Windows.
- *
- *  This code was inspired by the CIPE-Win32 driver by Damion K. Wilson.
- *
- *  This source code is Copyright (C) 2002-2010 OpenVPN Technologies, Inc.,
- *  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 version 2
- *  as published by the Free Software Foundation.
- *
- *  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
- */
-
-typedef struct
-{
-  volatile long count;
-} MUTEX;
-
-#define MUTEX_SLEEP_TIME  10000 // microseconds
-
-#define INIT_MUTEX(m) { (m)->count = 0; }
-
-#define ACQUIRE_MUTEX_BLOCKING(m)                         \
-{                                                         \
-    while (NdisInterlockedIncrement (&((m)->count)) != 1) \
-    {                                                     \
-        NdisInterlockedDecrement(&((m)->count));          \
-        NdisMSleep(MUTEX_SLEEP_TIME);                     \
-    }                                                     \
-}
-
-#define RELEASE_MUTEX(m)                                  \
-{                                                         \
-        NdisInterlockedDecrement(&((m)->count));          \
-}
-
-#define ACQUIRE_MUTEX_NONBLOCKING(m, result)              \
-{                                                         \
-    if (NdisInterlockedIncrement (&((m)->count)) != 1)    \
-    {                                                     \
-        NdisInterlockedDecrement(&((m)->count));          \
-        result = FALSE;                                   \
-    }                                                     \
-    else                                                  \
-    {                                                     \
-       result = TRUE;                                    \
-    }                                                     \
-}
-
-#define ACQUIRE_MUTEX_ADAPTIVE(m, result)                 \
-{                                                         \
-    result = TRUE;                                        \
-    while (NdisInterlockedIncrement (&((m)->count)) != 1) \
-    {                                                     \
-        NdisInterlockedDecrement(&((m)->count));          \
-        if (KeGetCurrentIrql () < DISPATCH_LEVEL)         \
-            NdisMSleep(MUTEX_SLEEP_TIME);                 \
-        else                                              \
-        {                                                 \
-           result = FALSE;                               \
-           break;                                        \
-        }                                                 \
-    }                                                     \
-}
diff --git a/tap-win32/macinfo.c b/tap-win32/macinfo.c
deleted file mode 100755
index 8d512ec..0000000
--- a/tap-win32/macinfo.c
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- *  TAP-Win32/TAP-Win64 -- A kernel driver to provide virtual tap
- *                         device functionality on Windows.
- *
- *  This code was inspired by the CIPE-Win32 driver by Damion K. Wilson.
- *
- *  This source code is Copyright (C) 2002-2010 OpenVPN Technologies, Inc.,
- *  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 version 2
- *  as published by the Free Software Foundation.
- *
- *  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
- */
-
-#include "macinfo.h"
-
-int
-HexStringToDecimalInt (const int p_Character)
-{
-  int l_Value = 0;
-
-  if (p_Character >= 'A' && p_Character <= 'F')
-    l_Value = (p_Character - 'A') + 10;
-  else if (p_Character >= 'a' && p_Character <= 'f')
-    l_Value = (p_Character - 'a') + 10;
-  else if (p_Character >= '0' && p_Character <= '9')
-    l_Value = p_Character - '0';
-
-  return l_Value;
-}
-
-BOOLEAN
-ParseMAC (MACADDR dest, const char *src)
-{
-  int c;
-  int mac_index = 0;
-  BOOLEAN high_digit = FALSE;
-  int delim_action = 1;
-
-  MYASSERT (src);
-  MYASSERT (dest);
-
-  CLEAR_MAC (dest);
-
-  while (c = *src++)
-    {
-      if (IsMacDelimiter (c))
-       {
-         mac_index += delim_action;
-         high_digit = FALSE;
-         delim_action = 1;
-       }
-      else if (IsHexDigit (c))
-       {
-         const int digit = HexStringToDecimalInt (c);
-         if (mac_index < sizeof (MACADDR))
-           {
-             if (!high_digit)
-               {
-                 dest[mac_index] = (char)(digit);
-                 high_digit = TRUE;
-                 delim_action = 1;
-               }
-             else
-               {
-                 dest[mac_index] = (char)(dest[mac_index] * 16 + digit);
-                 ++mac_index;
-                 high_digit = FALSE;
-                 delim_action = 0;
-               }
-           }
-         else
-           return FALSE;
-       }
-      else
-       return FALSE;
-    }
-
-  return (mac_index + delim_action) >= sizeof (MACADDR);
-}
-
-/*
- * Generate a MAC using the GUID in the adapter name.
- *
- * The mac is constructed as 00:FF:xx:xx:xx:xx where
- * the Xs are taken from the first 32 bits of the GUID in the
- * adapter name.  This is similar to the Linux 2.4 tap MAC
- * generator, except linux uses 32 random bits for the Xs.
- *
- * In general, this solution is reasonable for most
- * applications except for very large bridged TAP networks,
- * where the probability of address collisions becomes more
- * than infintesimal.
- *
- * Using the well-known "birthday paradox", on a 1000 node
- * network the probability of collision would be
- * 0.000116292153.  On a 10,000 node network, the probability
- * of collision would be 0.01157288998621678766.
- */
-
-VOID GenerateRandomMac (MACADDR mac, const unsigned char *adapter_name)
-{
-  unsigned const char *cp = adapter_name;
-  unsigned char c;
-  unsigned int i = 2;
-  unsigned int byte = 0;
-  int brace = 0;
-  int state = 0;
-
-  CLEAR_MAC (mac);
-
-  mac[0] = 0x00;
-  mac[1] = 0xFF;
-
-  while (c = *cp++)
-    {
-      if (i >= sizeof (MACADDR))
-       break;
-      if (c == '{')
-       brace = 1;
-      if (IsHexDigit (c) && brace)
-       {
-         const unsigned int digit = HexStringToDecimalInt (c);
-         if (state)
-           {
-             byte <<= 4;
-             byte |= digit;
-             mac[i++] = (unsigned char) byte;
-             state = 0;
-           }
-         else
-           {
-             byte = digit;
-             state = 1;
-           }
-       }
-    }
-}
-
-VOID GenerateRelatedMAC (MACADDR dest, const MACADDR src, const int delta)
-{
-  COPY_MAC (dest, src);
-  dest[2] += (UCHAR) delta;
-}
diff --git a/tap-win32/macinfo.h b/tap-win32/macinfo.h
deleted file mode 100755
index 51e930d..0000000
--- a/tap-win32/macinfo.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- *  TAP-Win32/TAP-Win64 -- A kernel driver to provide virtual tap
- *                         device functionality on Windows.
- *
- *  This code was inspired by the CIPE-Win32 driver by Damion K. Wilson.
- *
- *  This source code is Copyright (C) 2002-2010 OpenVPN Technologies, Inc.,
- *  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 version 2
- *  as published by the Free Software Foundation.
- *
- *  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
- */
-
-#ifndef MacInfoDefined
-#define MacInfoDefined
-
-//===================================================================================
-//                                      Macros
-//===================================================================================
-#define IsMacDelimiter(a) (a == ':' || a == '-' || a == '.')
-#define IsHexDigit(c) ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c 
>= 'a' && c <= 'f'))
-
-#define COPY_MAC(dest, src) NdisMoveMemory ((dest), (src), sizeof (MACADDR))
-#define CLEAR_MAC(dest)     NdisZeroMemory ((dest), sizeof (MACADDR))
-#define MAC_EQUAL(a,b)      (memcmp ((a), (b), sizeof (MACADDR)) == 0)
-
-#endif
diff --git a/tap-win32/mem.c b/tap-win32/mem.c
deleted file mode 100755
index 6fbbed5..0000000
--- a/tap-win32/mem.c
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- *  TAP-Win32/TAP-Win64 -- A kernel driver to provide virtual tap
- *                         device functionality on Windows.
- *
- *  This code was inspired by the CIPE-Win32 driver by Damion K. Wilson.
- *
- *  This source code is Copyright (C) 2002-2010 OpenVPN Technologies, Inc.,
- *  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 version 2
- *  as published by the Free Software Foundation.
- *
- *  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
- */
-
-//------------------
-// Memory Management
-//------------------
-
-PVOID
-MemAlloc (ULONG p_Size, BOOLEAN zero)
-{
-  PVOID l_Return = NULL;
-
-  if (p_Size)
-    {
-      __try
-      {
-       if (NdisAllocateMemoryWithTag (&l_Return, p_Size, 'APAT')
-           == NDIS_STATUS_SUCCESS)
-         {
-           if (zero)
-             NdisZeroMemory (l_Return, p_Size);
-         }
-       else
-         l_Return = NULL;
-      }
-      __except (EXCEPTION_EXECUTE_HANDLER)
-      {
-       l_Return = NULL;
-      }
-    }
-
-  return l_Return;
-}
-
-VOID
-MemFree (PVOID p_Addr, ULONG p_Size)
-{
-  if (p_Addr && p_Size)
-    {
-      __try
-      {
-#if DBG
-       NdisZeroMemory (p_Addr, p_Size);
-#endif
-       NdisFreeMemory (p_Addr, p_Size, 0);
-      }
-      __except (EXCEPTION_EXECUTE_HANDLER)
-      {
-      }
-    }
-}
-
-/*
- * Circular queue management routines.
- */
-
-#define QUEUE_BYTE_ALLOCATION(size) \
-  (sizeof (Queue) + (size * sizeof (PVOID)))
-
-#define QUEUE_ADD_INDEX(var, inc) \
-{ \
-  var += inc; \
-  if (var >= q->capacity) \
-    var -= q->capacity; \
-  MYASSERT (var < q->capacity); \
-}
-
-#define QUEUE_SANITY_CHECK() \
-  MYASSERT (q != NULL && q->base < q->capacity && q->size <= q->capacity)
-
-#define QueueCount(q) (q->size)
-
-#define UPDATE_MAX_SIZE() \
-{ \
-  if (q->size > q->max_size) \
-    q->max_size = q->size; \
-}
-
-Queue *
-QueueInit (ULONG capacity)
-{
-  Queue *q;
-
-  MYASSERT (capacity > 0);
-  q = (Queue *) MemAlloc (QUEUE_BYTE_ALLOCATION (capacity), TRUE);
-  if (!q)
-    return NULL;
-
-  q->base = q->size = 0;
-  q->capacity = capacity;
-  q->max_size = 0;
-  return q;
-}
-
-VOID
-QueueFree (Queue *q)
-{
-  if (q)
-    {
-      QUEUE_SANITY_CHECK ();
-      MemFree (q, QUEUE_BYTE_ALLOCATION (q->capacity));
-    }
-}
-
-PVOID
-QueuePush (Queue *q, PVOID item)
-{
-  ULONG dest;
-  QUEUE_SANITY_CHECK ();
-  if (q->size == q->capacity)
-    return NULL;
-  dest = q->base;
-  QUEUE_ADD_INDEX (dest, q->size);
-  q->data[dest] = item;
-  ++q->size;
-  UPDATE_MAX_SIZE();
-  return item;
-}
-
-PVOID
-QueuePop (Queue *q)
-{
-  ULONG oldbase;
-  QUEUE_SANITY_CHECK ();
-  if (!q->size)
-    return NULL;
-  oldbase = q->base;
-  QUEUE_ADD_INDEX (q->base, 1);
-  --q->size;
-  UPDATE_MAX_SIZE();
-  return q->data[oldbase];
-}
-
-PVOID
-QueueExtract (Queue *q, PVOID item)
-{
-  ULONG src, dest, count, n;
-  QUEUE_SANITY_CHECK ();
-  n = 0;
-  src = dest = q->base;
-  count = q->size;
-  while (count--)
-    {
-      if (item == q->data[src])
-       {
-         ++n;
-         --q->size;
-       }
-      else
-       {
-         q->data[dest] = q->data[src];
-         QUEUE_ADD_INDEX (dest, 1);      
-       }
-      QUEUE_ADD_INDEX (src, 1);
-    }
-  if (n)
-    return item;
-  else
-    return NULL;
-}
-
-#undef QUEUE_BYTE_ALLOCATION
-#undef QUEUE_ADD_INDEX
-#undef QUEUE_SANITY_CHECK
-#undef UPDATE_MAX_SIZE
diff --git a/tap-win32/proto.h b/tap-win32/proto.h
deleted file mode 100755
index 894a37f..0000000
--- a/tap-win32/proto.h
+++ /dev/null
@@ -1,224 +0,0 @@
-/*
- *  TAP-Win32/TAP-Win64 -- A kernel driver to provide virtual tap
- *                         device functionality on Windows.
- *
- *  This code was inspired by the CIPE-Win32 driver by Damion K. Wilson.
- *
- *  This source code is Copyright (C) 2002-2010 OpenVPN Technologies, Inc.,
- *  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 version 2
- *  as published by the Free Software Foundation.
- *
- *  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
- */
-
-//============================================================
-// MAC address, Ethernet header, and ARP
-//============================================================
-
-#pragma pack(1)
-
-#define IP_HEADER_SIZE 20
-#define IPV6_HEADER_SIZE 40
-
-typedef unsigned char MACADDR [6];
-typedef unsigned long IPADDR;
-typedef unsigned char IPV6ADDR [16];
-
-//-----------------
-// Ethernet address
-//-----------------
-
-typedef struct {
-  MACADDR addr;
-} ETH_ADDR;
-
-typedef struct {
-  ETH_ADDR list[NIC_MAX_MCAST_LIST];
-} MC_LIST;
-
-//----------------
-// Ethernet header
-//----------------
-
-typedef struct
-{
-  MACADDR dest;               /* destination eth addr  */
-  MACADDR src;                /* source ether addr     */
-
-# define ETH_P_IP   0x0800    /* IPv4 protocol */
-# define ETH_P_IPV6 0x86DD    /* IPv6 protocol */
-# define ETH_P_ARP  0x0806    /* ARP protocol */
-  USHORT proto;               /* packet type ID field  */
-} ETH_HEADER, *PETH_HEADER;
-
-//----------------
-// ARP packet
-//----------------
-
-typedef struct
-   {
-    MACADDR        m_MAC_Destination;        // Reverse these two
-    MACADDR        m_MAC_Source;             // to answer ARP requests
-    USHORT         m_Proto;                  // 0x0806
-
-#   define MAC_ADDR_TYPE 0x0001
-    USHORT         m_MAC_AddressType;        // 0x0001
-
-    USHORT         m_PROTO_AddressType;      // 0x0800
-    UCHAR          m_MAC_AddressSize;        // 0x06
-    UCHAR          m_PROTO_AddressSize;      // 0x04
-
-#   define ARP_REQUEST 0x0001
-#   define ARP_REPLY   0x0002
-    USHORT         m_ARP_Operation;          // 0x0001 for ARP request, 0x0002 
for ARP reply
-
-    MACADDR        m_ARP_MAC_Source;
-    IPADDR         m_ARP_IP_Source;
-    MACADDR        m_ARP_MAC_Destination;
-    IPADDR         m_ARP_IP_Destination;
-   }
-ARP_PACKET, *PARP_PACKET;
-
-//----------
-// IP Header
-//----------
-
-typedef struct {
-# define IPH_GET_VER(v) (((v) >> 4) & 0x0F)
-# define IPH_GET_LEN(v) (((v) & 0x0F) << 2)
-  UCHAR    version_len;
-
-  UCHAR    tos;
-  USHORT   tot_len;
-  USHORT   id;
-
-# define IP_OFFMASK 0x1fff
-  USHORT   frag_off;
-
-  UCHAR    ttl;
-
-# define IPPROTO_UDP  17  /* UDP protocol */
-# define IPPROTO_TCP   6  /* TCP protocol */
-# define IPPROTO_ICMP  1  /* ICMP protocol */
-# define IPPROTO_IGMP  2  /* IGMP protocol */
-  UCHAR    protocol;
-
-  USHORT   check;
-  ULONG    saddr;
-  ULONG    daddr;
-  /* The options start here. */
-} IPHDR;
-
-//-----------
-// UDP header
-//-----------
-
-typedef struct {
-  USHORT   source;
-  USHORT   dest;
-  USHORT   len;
-  USHORT   check;
-} UDPHDR;
-
-//--------------------------
-// TCP header, per RFC 793.
-//--------------------------
-
-typedef struct {
-  USHORT      source;    /* source port */
-  USHORT      dest;      /* destination port */
-  ULONG       seq;       /* sequence number */
-  ULONG       ack_seq;   /* acknowledgement number */
-
-# define TCPH_GET_DOFF(d) (((d) & 0xF0) >> 2)
-  UCHAR       doff_res;
-
-# define TCPH_FIN_MASK (1<<0)
-# define TCPH_SYN_MASK (1<<1)
-# define TCPH_RST_MASK (1<<2)
-# define TCPH_PSH_MASK (1<<3)
-# define TCPH_ACK_MASK (1<<4)
-# define TCPH_URG_MASK (1<<5)
-# define TCPH_ECE_MASK (1<<6)
-# define TCPH_CWR_MASK (1<<7)
-  UCHAR       flags;
-
-  USHORT      window;
-  USHORT      check;
-  USHORT      urg_ptr;
-} TCPHDR;
-
-#define        TCPOPT_EOL     0
-#define        TCPOPT_NOP     1
-#define        TCPOPT_MAXSEG  2
-#define TCPOLEN_MAXSEG 4
-
-//------------
-// IPv6 Header
-//------------
-
-typedef struct {
-  UCHAR    version_prio;
-  UCHAR    flow_lbl[3];
-  USHORT   payload_len;
-# define IPPROTO_ICMPV6  0x3a  /* ICMP protocol v6 */
-  UCHAR    nexthdr;
-  UCHAR    hop_limit;
-  IPV6ADDR saddr;
-  IPV6ADDR daddr;
-} IPV6HDR;
-
-//--------------------------------------------
-// IPCMPv6 NS/NA Packets (RFC4443 and RFC4861)
-//--------------------------------------------
-
-// Neighbor Solictiation - RFC 4861, 4.3
-// (this is just the ICMPv6 part of the packet)
-typedef struct {
-  UCHAR    type;
-# define ICMPV6_TYPE_NS        135             // neighbour solicitation
-  UCHAR    code;
-# define ICMPV6_CODE_0 0               // no specific sub-code for NS/NA
-  USHORT   checksum;
-  ULONG    reserved;
-  IPV6ADDR target_addr;
-} ICMPV6_NS;
-
-// Neighbor Advertisement - RFC 4861, 4.4 + 4.6/4.6.1
-// (this is just the ICMPv6 payload)
-typedef struct {
-  UCHAR    type;
-# define ICMPV6_TYPE_NA        136             // neighbour advertisement
-  UCHAR    code;
-# define ICMPV6_CODE_0 0               // no specific sub-code for NS/NA
-  USHORT   checksum;
-  UCHAR    rso_bits;                   // Router(0), Solicited(2), Ovrrd(4)
-  UCHAR           reserved[3];
-  IPV6ADDR target_addr;
-// always include "Target Link-layer Address" option (RFC 4861 4.6.1)
-  UCHAR    opt_type;
-#define ICMPV6_OPTION_TLLA 2
-  UCHAR    opt_length;
-#define ICMPV6_LENGTH_TLLA 1           // multiplied by 8 -> 1 = 8 bytes
-  MACADDR  target_macaddr;
-} ICMPV6_NA;
-
-// this is the complete packet with Ethernet and IPv6 headers
-typedef struct {
-  ETH_HEADER eth;
-  IPV6HDR    ipv6;
-  ICMPV6_NA  icmpv6;
-} ICMPV6_NA_PKT;
-
-#pragma pack()
diff --git a/tap-win32/prototypes.h b/tap-win32/prototypes.h
deleted file mode 100755
index 55454d5..0000000
--- a/tap-win32/prototypes.h
+++ /dev/null
@@ -1,260 +0,0 @@
-/*
- *  TAP-Win32/TAP-Win64 -- A kernel driver to provide virtual tap
- *                         device functionality on Windows.
- *
- *  This code was inspired by the CIPE-Win32 driver by Damion K. Wilson.
- *
- *  This source code is Copyright (C) 2002-2010 OpenVPN Technologies, Inc.,
- *  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 version 2
- *  as published by the Free Software Foundation.
- *
- *  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
- */
-
-#ifndef TAP_PROTOTYPES_DEFINED
-#define TAP_PROTOTYPES_DEFINED
-
-NTSTATUS DriverEntry
-   (
-    IN PDRIVER_OBJECT p_DriverObject,
-    IN PUNICODE_STRING p_RegistryPath
-   );
-
-VOID TapDriverUnload
-   (
-    IN PDRIVER_OBJECT p_DriverObject
-   );
-
-NDIS_STATUS AdapterCreate
-   (
-    OUT PNDIS_STATUS p_ErrorStatus,
-    OUT PUINT p_MediaIndex,
-    IN PNDIS_MEDIUM p_Media,
-    IN UINT p_MediaCount,
-    IN NDIS_HANDLE p_AdapterHandle,
-    IN NDIS_HANDLE p_ConfigurationHandle
-   );
-
-VOID AdapterHalt
-   (
-    IN NDIS_HANDLE p_AdapterContext
-   );
-
-VOID AdapterFreeResources
-   (
-    TapAdapterPointer p_Adapter
-   );
-
-NDIS_STATUS AdapterReset
-   (
-    OUT PBOOLEAN p_AddressingReset,
-    IN NDIS_HANDLE p_AdapterContext
-   );
-
-NDIS_STATUS AdapterQuery
-   (
-    IN NDIS_HANDLE p_AdapterContext,
-    IN NDIS_OID p_OID,
-    IN PVOID p_Buffer,
-    IN ULONG p_BufferLength,
-    OUT PULONG p_BytesWritten,
-    OUT PULONG p_BytesNeeded
-   );
-
-NDIS_STATUS AdapterModify
-   (
-    IN NDIS_HANDLE p_AdapterContext,
-    IN NDIS_OID p_OID,
-    IN PVOID p_Buffer,
-    IN ULONG p_BufferLength,
-    OUT PULONG p_BytesRead,
-    OUT PULONG p_BytesNeeded
-   );
-
-NDIS_STATUS AdapterTransmit
-   (
-    IN NDIS_HANDLE p_AdapterContext,
-    IN PNDIS_PACKET p_Packet,
-    IN UINT p_Flags
-   );
-
-NDIS_STATUS AdapterReceive
-   (
-    OUT PNDIS_PACKET p_Packet,
-    OUT PUINT p_Transferred,
-    IN NDIS_HANDLE p_AdapterContext,
-    IN NDIS_HANDLE p_ReceiveContext,
-    IN UINT p_Offset,
-    IN UINT p_ToTransfer
-   );
-
-NTSTATUS TapDeviceHook
-   (
-    IN PDEVICE_OBJECT p_DeviceObject,
-    IN PIRP p_IRP
-   );
-
-NDIS_STATUS CreateTapDevice
-   (
-    TapExtensionPointer p_Extension,
-    const char *p_Name
-   );
-
-VOID DestroyTapDevice
-   (
-    TapExtensionPointer p_Extension
-   );
-
-VOID TapDeviceFreeResources
-   (
-    TapExtensionPointer p_Extension
-    );
-
-NTSTATUS CompleteIRP
-   (
-    IN PIRP p_IRP,
-    IN TapPacketPointer p_PacketBuffer,
-    IN CCHAR PriorityBoost
-   );
-
-VOID CancelIRPCallback
-   (
-    IN PDEVICE_OBJECT p_DeviceObject,
-    IN PIRP p_IRP
-   );
-
-VOID CancelIRP
-   (
-    TapExtensionPointer p_Extension,
-    IN PIRP p_IRP,
-    BOOLEAN callback
-   );
-
-VOID FlushQueues
-   (
-    TapExtensionPointer p_Extension
-   );
-
-VOID ResetTapAdapterState
-   (
-    TapAdapterPointer p_Adapter
-   );
-
-BOOLEAN ProcessARP
-   (
-    TapAdapterPointer p_Adapter,
-    const PARP_PACKET src,
-    const IPADDR adapter_ip,
-    const IPADDR ip_network,
-    const IPADDR ip_netmask,
-    const MACADDR mac
-   );
-
-VOID SetMediaStatus
-   (
-    TapAdapterPointer p_Adapter,
-    BOOLEAN state
-   );
-
-VOID InjectPacketDeferred
-   (
-    TapAdapterPointer p_Adapter,
-    UCHAR *packet,
-    const unsigned int len
-   );
-
-VOID InjectPacketNow
-   (
-    TapAdapterPointer p_Adapter,
-    UCHAR *packet,
-    const unsigned int len
-   );
-
-// for KDEFERRED_ROUTINE and Static Driver Verifier
-//#include <wdm.h>
-//KDEFERRED_ROUTINE InjectPacketDpc;
-
-VOID InjectPacketDpc
-   (
-    KDPC *Dpc,
-    PVOID DeferredContext,
-    PVOID SystemArgument1,
-    PVOID SystemArgument2
-    );
-
-VOID CheckIfDhcpAndTunMode
-   (
-    TapAdapterPointer p_Adapter
-   );
-
-VOID HookDispatchFunctions();
-
-#if ENABLE_NONADMIN
-
-#if DDKVER_MAJOR < 5600
-/*
- * Better solution for use on Vista DDK, but possibly not compatible with
- * earlier DDKs:
- *
- * Eliminate the definition of SECURITY_DESCRIPTOR (and even 
ZwSetSecurityObject),
- * and at the top of tapdrv.c change:
- *
- * #include <ndis.h>
- * #include <ntstrsafe.h>
- * #include <ntddk.h>
- *
- * To
- *
- * #include <ntifs.h>
- * #include <ndis.h>
- * #include <ntstrsafe.h>
- */
-typedef struct _SECURITY_DESCRIPTOR {
-  unsigned char opaque[64];
-} SECURITY_DESCRIPTOR;
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-ZwSetSecurityObject (
-  IN HANDLE  Handle,
-  IN SECURITY_INFORMATION  SecurityInformation,
-  IN PSECURITY_DESCRIPTOR  SecurityDescriptor);
-
-#endif
-
-VOID AllowNonAdmin (TapExtensionPointer p_Extension);
-
-#endif
-
-struct WIN2K_NDIS_MINIPORT_BLOCK
-{
-  unsigned char  opaque[16];
-  UNICODE_STRING MiniportName;       // how mini-port refers to us
-};
-
-#if PACKET_TRUNCATION_CHECK
-
-VOID IPv4PacketSizeVerify
-   (
-    const UCHAR *data,
-    ULONG length,
-    BOOLEAN tun,
-    const char *prefix,
-    LONG *counter
-   );
-
-#endif
-
-#endif
diff --git a/tap-win32/resource.rc b/tap-win32/resource.rc
deleted file mode 100755
index 84884cf..0000000
--- a/tap-win32/resource.rc
+++ /dev/null
@@ -1,58 +0,0 @@
-#include <windows.h>
-#include <ntverp.h>
-
-/* get VERSION */
-#include "common.h"
-
-/* VER_FILETYPE, VER_FILESUBTYPE, VER_FILEDESCRIPTION_STR
- * and VER_INTERNALNAME_STR must be defined before including COMMON.VER
- * The strings don't need a '\0', since common.ver has them.
- */
-
-#define        VER_FILETYPE    VFT_DRV
-/* possible values:            VFT_UNKNOWN
-                               VFT_APP
-                               VFT_DLL
-                               VFT_DRV
-                               VFT_FONT
-                               VFT_VXD
-                               VFT_STATIC_LIB
-*/
-#define        VER_FILESUBTYPE VFT2_DRV_NETWORK
-/* possible values             VFT2_UNKNOWN
-                               VFT2_DRV_PRINTER
-                               VFT2_DRV_KEYBOARD
-                               VFT2_DRV_LANGUAGE
-                               VFT2_DRV_DISPLAY
-                               VFT2_DRV_MOUSE
-                               VFT2_DRV_NETWORK
-                               VFT2_DRV_SYSTEM
-                               VFT2_DRV_INSTALLABLE
-                               VFT2_DRV_SOUND
-                               VFT2_DRV_COMM
-*/
-
-#define VER_COMPANYNAME_STR         "The OpenVPN Project"
-#define VER_FILEDESCRIPTION_STR     "TAP-Win32 Virtual Network Driver"
-#define VER_ORIGINALFILENAME_STR    TAP_COMPONENT_ID ".sys"
-#define VER_LEGALCOPYRIGHT_YEARS    "2003-2010"
-#define VER_LEGALCOPYRIGHT_STR      "OpenVPN Technologies, Inc."
-
-
-#define VER_PRODUCTNAME_STR         VER_FILEDESCRIPTION_STR
-#define VER_PRODUCTVERSION         
TAP_DRIVER_MAJOR_VERSION,00,00,TAP_DRIVER_MINOR_VERSION
-
-#define XSTR(s) STR(s)
-#define STR(s) #s
-
-#define VSTRING PACKAGE_VERSION " " XSTR(TAP_DRIVER_MAJOR_VERSION) "/" 
XSTR(TAP_DRIVER_MINOR_VERSION)
-
-#ifdef DBG
-#define VER_PRODUCTVERSION_STR      VSTRING " (DEBUG)"
-#else
-#define VER_PRODUCTVERSION_STR      VSTRING
-#endif
-
-#define VER_INTERNALNAME_STR        VER_ORIGINALFILENAME_STR
-
-#include "common.ver"
diff --git a/tap-win32/tapdrvr.c b/tap-win32/tapdrvr.c
deleted file mode 100755
index e5760dc..0000000
--- a/tap-win32/tapdrvr.c
+++ /dev/null
@@ -1,3146 +0,0 @@
-/*
- *  TAP-Win32/TAP-Win64 -- A kernel driver to provide virtual tap
- *                         device functionality on Windows.
- *
- *  This code was inspired by the CIPE-Win32 driver by Damion K. Wilson.
- *
- *  This source code is Copyright (C) 2002-2010 OpenVPN Technologies, Inc.,
- *  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 version 2
- *  as published by the Free Software Foundation.
- *
- *  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 driver is designed to work on Win 2000 or higher
-// versions of Windows.
-//
-// It is SMP-safe and handles NDIS 5 power management.
-//
-// By default we operate as a "tap" virtual ethernet
-// 802.3 interface, but we can emulate a "tun"
-// interface (point-to-point IPv4) through the
-// TAP_IOCTL_CONFIG_POINT_TO_POINT or
-// TAP_IOCTL_CONFIG_TUN ioctl.
-//======================================================
-
-#include "common.h"
-#ifndef DDKVER_MAJOR
-#error DDKVER_MAJOR must be defined as the major number of the DDK Version
-#endif
-
-#define NDIS_MINIPORT_DRIVER
-#define BINARY_COMPATIBLE 0
-#define NDIS50_MINIPORT 1
-#define NDIS_WDM 0
-#define NDIS50 1
-#define NTSTRSAFE_LIB
-
-// Debug info output
-#define ALSO_DBGPRINT           1
-#define DEBUGP_AT_DISPATCH      0
-
-//========================================================
-// Check for truncated IPv4 packets, log errors if found.
-//========================================================
-#define PACKET_TRUNCATION_CHECK 0
-
-//========================================================
-// EXPERIMENTAL -- Configure TAP device object to be
-// accessible from non-administrative accounts, based
-// on an advanced properties setting.
-//
-// Duplicates the functionality of OpenVPN's
-// --allow-nonadmin directive.
-//========================================================
-#define ENABLE_NONADMIN 1
-
-#if DDKVER_MAJOR < 5600
-#include <ndis.h>
-#include <ntstrsafe.h>
-#include <ntddk.h>
-#else
-#include <ntifs.h>
-#include <ndis.h>
-#include <ntstrsafe.h>
-#endif
-
-#include "lock.h"
-#include "constants.h"
-#include "proto.h"
-#include "error.h"
-#include "endian.h"
-#include "dhcp.h"
-#include "types.h"
-#include "prototypes.h"
-
-#include "mem.c"
-#include "macinfo.c"
-#include "error.c"
-#include "dhcp.c"
-#include "instance.c"
-
-#define IS_UP(ta) \
-  ((ta)->m_InterfaceIsRunning && (ta)->m_Extension.m_TapIsRunning)
-
-#define INCREMENT_STAT(s) ++(s)
-
-#define NAME_BUFFER_SIZE 80
-
-//========================================================
-//                            Globals
-//========================================================
-
-NDIS_HANDLE g_NdisWrapperHandle;
-
-const UINT g_SupportedOIDList[] = {
-  OID_GEN_HARDWARE_STATUS,
-  OID_GEN_MEDIA_SUPPORTED,
-  OID_GEN_MEDIA_IN_USE,
-  OID_GEN_MAXIMUM_LOOKAHEAD,
-  OID_GEN_MAC_OPTIONS,
-  OID_GEN_LINK_SPEED,
-  OID_GEN_TRANSMIT_BLOCK_SIZE,
-  OID_GEN_RECEIVE_BLOCK_SIZE,
-  OID_GEN_VENDOR_DESCRIPTION,
-  OID_GEN_DRIVER_VERSION,
-  OID_GEN_XMIT_OK,
-  OID_GEN_RCV_OK,
-  OID_GEN_XMIT_ERROR,
-  OID_GEN_RCV_ERROR,
-  OID_802_3_PERMANENT_ADDRESS,
-  OID_802_3_CURRENT_ADDRESS,
-  OID_GEN_RCV_NO_BUFFER,
-  OID_802_3_RCV_ERROR_ALIGNMENT,
-  OID_802_3_XMIT_ONE_COLLISION,
-  OID_802_3_XMIT_MORE_COLLISIONS,
-  OID_802_3_MULTICAST_LIST,
-  OID_802_3_MAXIMUM_LIST_SIZE,
-  OID_GEN_VENDOR_ID,
-  OID_GEN_CURRENT_LOOKAHEAD,
-  OID_GEN_CURRENT_PACKET_FILTER,
-  OID_GEN_PROTOCOL_OPTIONS,
-  OID_GEN_MAXIMUM_TOTAL_SIZE,
-  OID_GEN_TRANSMIT_BUFFER_SPACE,
-  OID_GEN_RECEIVE_BUFFER_SPACE,
-  OID_GEN_MAXIMUM_FRAME_SIZE,
-  OID_GEN_VENDOR_DRIVER_VERSION,
-  OID_GEN_MAXIMUM_SEND_PACKETS,
-  OID_GEN_MEDIA_CONNECT_STATUS,
-  OID_GEN_SUPPORTED_LIST
-};
-
-//============================================================
-//                         Driver Entry
-//============================================================
-#pragma NDIS_INIT_FUNCTION (DriverEntry)
-
-NTSTATUS
-DriverEntry (IN PDRIVER_OBJECT p_DriverObject,
-            IN PUNICODE_STRING p_RegistryPath)
-{
-  NDIS_STATUS l_Status = NDIS_STATUS_FAILURE;
-  NDIS_MINIPORT_CHARACTERISTICS *l_Properties = NULL;
-
-  //========================================================
-  // Notify NDIS that a new miniport driver is initializing.
-  //========================================================
-
-  NdisMInitializeWrapper (&g_NdisWrapperHandle,
-                         p_DriverObject,
-                         p_RegistryPath, NULL);
-
-  //======================
-  // Global initialization
-  //======================
-
-#if DBG
-  MyDebugInit (10000); // Allocate debugging text space
-#endif
-
-  if (!InitInstanceList ())
-    {
-      DEBUGP (("[TAP] Allocation failed for adapter instance list\n"));
-      goto cleanup;
-    }
-
-  //=======================================
-  // Set and register miniport entry points
-  //=======================================
-
-  l_Properties = MemAlloc (sizeof (NDIS_MINIPORT_CHARACTERISTICS), TRUE);
-
-  if (l_Properties == NULL)
-    {
-      DEBUGP (("[TAP] Allocation failed for miniport entry points\n"));
-      goto cleanup;
-    }
-
-  l_Properties->MajorNdisVersion = TAP_NDIS_MAJOR_VERSION;
-  l_Properties->MinorNdisVersion = TAP_NDIS_MINOR_VERSION;
-  l_Properties->InitializeHandler = AdapterCreate;
-  l_Properties->HaltHandler = AdapterHalt;
-  l_Properties->ResetHandler = AdapterReset;               /* DISPATCH_LEVEL */
-  l_Properties->TransferDataHandler = AdapterReceive;      /* DISPATCH_LEVEL */
-  l_Properties->SendHandler = AdapterTransmit;             /* DISPATCH_LEVEL */
-  l_Properties->QueryInformationHandler = AdapterQuery;    /* DISPATCH_LEVEL */
-  l_Properties->SetInformationHandler = AdapterModify;     /* DISPATCH_LEVEL */
-
-  switch (l_Status =
-         NdisMRegisterMiniport (g_NdisWrapperHandle, l_Properties,
-                                sizeof (NDIS_MINIPORT_CHARACTERISTICS)))
-    {
-    case NDIS_STATUS_SUCCESS:
-      {
-       DEBUGP (("[TAP] version [%d.%d] %s %s registered miniport 
successfully\n",
-                TAP_DRIVER_MAJOR_VERSION,
-                TAP_DRIVER_MINOR_VERSION,
-                __DATE__,
-                __TIME__));
-       DEBUGP (("Registry Path: '%.*S'\n", p_RegistryPath->Length/2, 
p_RegistryPath->Buffer));
-       break;
-      }
-
-    case NDIS_STATUS_BAD_CHARACTERISTICS:
-      {
-       DEBUGP (("[TAP] Miniport characteristics were badly defined\n"));
-       NdisTerminateWrapper (g_NdisWrapperHandle, NULL);
-       break;
-      }
-
-    case NDIS_STATUS_BAD_VERSION:
-      {
-       DEBUGP
-         (("[TAP] NDIS Version is wrong for the given characteristics\n"));
-       NdisTerminateWrapper (g_NdisWrapperHandle, NULL);
-       break;
-      }
-
-    case NDIS_STATUS_RESOURCES:
-      {
-       DEBUGP (("[TAP] Insufficient resources\n"));
-       NdisTerminateWrapper (g_NdisWrapperHandle, NULL);
-       break;
-      }
-
-    default:
-    case NDIS_STATUS_FAILURE:
-      {
-       DEBUGP (("[TAP] Unknown fatal registration error\n"));
-       NdisTerminateWrapper (g_NdisWrapperHandle, NULL);
-       break;
-      }
-    }
-
- cleanup:
-  if (l_Properties)
-    MemFree (l_Properties, sizeof (NDIS_MINIPORT_CHARACTERISTICS));
-
-  if (l_Status == NDIS_STATUS_SUCCESS)
-    NdisMRegisterUnloadHandler (g_NdisWrapperHandle, TapDriverUnload);
-  else
-    TapDriverUnload (p_DriverObject);
-
-  return l_Status;
-}
-
-//============================================================
-//                         Driver Unload
-//============================================================
-VOID 
-TapDriverUnload (IN PDRIVER_OBJECT p_DriverObject)
-{
-  DEBUGP (("[TAP] version [%d.%d] %s %s unloaded, instances=%d, imbs=%d\n",
-          TAP_DRIVER_MAJOR_VERSION,
-          TAP_DRIVER_MINOR_VERSION,
-          __DATE__,
-          __TIME__,
-          NInstances(),
-          InstanceMaxBucketSize()));
-
-  FreeInstanceList ();
-
-  //==============================
-  // Free debugging text space
-  //==============================
-#if DBG
-  MyDebugFree ();
-#endif
-}
-
-//==========================================================
-//                            Adapter Initialization
-//==========================================================
-NDIS_STATUS AdapterCreate
-(OUT PNDIS_STATUS p_ErrorStatus,
- OUT PUINT p_MediaIndex,
- IN PNDIS_MEDIUM p_Media,
- IN UINT p_MediaCount,
- IN NDIS_HANDLE p_AdapterHandle,
- IN NDIS_HANDLE p_ConfigurationHandle)
-{
-  TapAdapterPointer l_Adapter = NULL;
-
-  NDIS_MEDIUM l_PreferredMedium = NdisMedium802_3; // Ethernet
-  BOOLEAN l_MacFromRegistry = FALSE;
-  UINT l_Index;
-  NDIS_STATUS status;
-
-#if ENABLE_NONADMIN
-  BOOLEAN enable_non_admin = FALSE;
-#endif
-
-  DEBUGP (("[TAP] AdapterCreate called\n"));
-
-  //====================================
-  // Make sure adapter type is supported
-  //====================================
-
-  for (l_Index = 0;
-       l_Index < p_MediaCount && p_Media[l_Index] != l_PreferredMedium;
-       ++l_Index);
-
-  if (l_Index == p_MediaCount)
-    {
-      DEBUGP (("[TAP] Unsupported adapter type [wanted: %d]\n",
-              l_PreferredMedium));
-      return NDIS_STATUS_UNSUPPORTED_MEDIA;
-    }
-
-  *p_MediaIndex = l_Index;
-
-  //=========================================
-  // Allocate memory for TapAdapter structure
-  //=========================================
-
-  l_Adapter = MemAlloc (sizeof (TapAdapter), TRUE);
-
-  if (l_Adapter == NULL)
-    {
-      DEBUGP (("[TAP] Couldn't allocate adapter memory\n"));
-      return NDIS_STATUS_RESOURCES;
-    }
-
-  //==========================================
-  // Inform the NDIS library about significant
-  // features of our virtual NIC.
-  //==========================================
-
-  NdisMSetAttributesEx
-    (p_AdapterHandle,
-     (NDIS_HANDLE) l_Adapter,
-     16,
-     NDIS_ATTRIBUTE_DESERIALIZE
-     | NDIS_ATTRIBUTE_IGNORE_PACKET_TIMEOUT
-     | NDIS_ATTRIBUTE_IGNORE_REQUEST_TIMEOUT
-     | NDIS_ATTRIBUTE_NO_HALT_ON_SUSPEND,
-     NdisInterfaceInternal);
-
-  //=====================================
-  // Initialize simple Adapter parameters
-  //=====================================
-
-  l_Adapter->m_Lookahead = DEFAULT_PACKET_LOOKAHEAD;
-  l_Adapter->m_Medium = l_PreferredMedium;
-  l_Adapter->m_DeviceState = '?';
-  l_Adapter->m_MiniportAdapterHandle = p_AdapterHandle;
-
-  //==================================
-  // Allocate spinlock for controlling
-  // access to multicast address list.
-  //==================================
-  NdisAllocateSpinLock (&l_Adapter->m_MCLock);
-  l_Adapter->m_MCLockAllocated = TRUE;
-
-  //====================================================
-  // Register a shutdown handler which will be called
-  // on system restart/shutdown to halt our virtual NIC.
-  //====================================================
-
-  NdisMRegisterAdapterShutdownHandler (p_AdapterHandle, l_Adapter,
-                                      AdapterHalt);
-  l_Adapter->m_RegisteredAdapterShutdownHandler = TRUE;
-
-  //============================================
-  // Get parameters from registry which were set
-  // in the adapter advanced properties dialog.
-  //============================================
-  {
-    NDIS_STATUS status;
-    NDIS_HANDLE configHandle;
-    NDIS_CONFIGURATION_PARAMETER *parm;
-
-    // set defaults in case our registry query fails
-    l_Adapter->m_MTU = ETHERNET_MTU;
-    l_Adapter->m_MediaStateAlwaysConnected = FALSE;
-    l_Adapter->m_MediaState = FALSE;
-
-    NdisOpenConfiguration (&status, &configHandle, p_ConfigurationHandle);
-    if (status != NDIS_STATUS_SUCCESS)
-      {
-       DEBUGP (("[TAP] Couldn't open adapter registry\n"));
-       AdapterFreeResources (l_Adapter);
-       return status;
-      }
-
-    //====================================
-    // Allocate and construct adapter name
-    //====================================
-    {
-      
-      NDIS_STRING mkey = NDIS_STRING_CONST("MiniportName");
-      NDIS_STRING vkey = NDIS_STRING_CONST("NdisVersion");
-      NDIS_STATUS vstatus;
-      NDIS_CONFIGURATION_PARAMETER *vparm;
-
-      NdisReadConfiguration (&vstatus, &vparm, configHandle, &vkey, 
NdisParameterInteger);
-      if (vstatus == NDIS_STATUS_SUCCESS)
-       DEBUGP (("[TAP] NdisReadConfiguration NdisVersion=%X\n", 
vparm->ParameterData.IntegerData));
-
-      NdisReadConfiguration (&status, &parm, configHandle, &mkey, 
NdisParameterString);
-      if (status == NDIS_STATUS_SUCCESS)
-       {
-         if (parm->ParameterType == NdisParameterString)
-           {
-             DEBUGP (("[TAP] NdisReadConfiguration (MiniportName=%.*S)\n",
-                      parm->ParameterData.StringData.Length/2,
-                      parm->ParameterData.StringData.Buffer));
-
-             if (RtlUnicodeStringToAnsiString (
-                                               &l_Adapter->m_NameAnsi,
-                                               &parm->ParameterData.StringData,
-                                               TRUE) != STATUS_SUCCESS)
-               {
-                 DEBUGP (("[TAP] MiniportName failed\n"));
-                 status = NDIS_STATUS_RESOURCES;
-               }
-           }
-       }
-      else
-       {
-         /* "MiniportName" is available only XP and above.  Not on Windows 
2000. */
-         if (vstatus == NDIS_STATUS_SUCCESS && 
vparm->ParameterData.IntegerData == 0x50000)
-           {
-             /* Fallback for Windows 2000 with NDIS version 5.00.00
-                Don't use this on Vista, 'NDIS_MINIPORT_BLOCK' was changed! */
-             if (RtlUnicodeStringToAnsiString (&l_Adapter->m_NameAnsi,
-                                               &((struct 
WIN2K_NDIS_MINIPORT_BLOCK *) p_AdapterHandle)->MiniportName,
-                                               TRUE) != STATUS_SUCCESS)
-               {
-                 DEBUGP (("[TAP] MiniportName (W2K) failed\n"));
-                 status = NDIS_STATUS_RESOURCES;
-               }
-             else
-               {
-                 DEBUGP (("[TAP] MiniportName (W2K) succeeded: %s\n", 
l_Adapter->m_NameAnsi.Buffer));
-                 status = NDIS_STATUS_SUCCESS;
-               }
-           }
-       }
-    }
-
-    /* Can't continue without name (see macro 'NAME') */
-    if (status != NDIS_STATUS_SUCCESS || !l_Adapter->m_NameAnsi.Buffer)
-      {
-       NdisCloseConfiguration (configHandle);
-       AdapterFreeResources (l_Adapter);
-       DEBUGP (("[TAP] failed to get miniport name\n"));
-       return NDIS_STATUS_RESOURCES;
-      }
-
-    /* Read MTU setting from registry */
-    {
-      NDIS_STRING key = NDIS_STRING_CONST("MTU");
-      NdisReadConfiguration (&status, &parm, configHandle,
-                            &key, NdisParameterInteger);
-      if (status == NDIS_STATUS_SUCCESS)
-       {
-         if (parm->ParameterType == NdisParameterInteger)
-           {
-             int mtu = parm->ParameterData.IntegerData;
-             if (mtu < MINIMUM_MTU)
-               mtu = MINIMUM_MTU;
-             if (mtu > MAXIMUM_MTU)
-               mtu = MAXIMUM_MTU;
-             l_Adapter->m_MTU = mtu;
-           }
-       }
-    }
-
-    /* Read Media Status setting from registry */
-    {
-      NDIS_STRING key = NDIS_STRING_CONST("MediaStatus");
-      NdisReadConfiguration (&status, &parm, configHandle,
-                            &key, NdisParameterInteger);
-      if (status == NDIS_STATUS_SUCCESS)
-       {
-         if (parm->ParameterType == NdisParameterInteger)
-           {
-             if (parm->ParameterData.IntegerData)
-               {
-                 l_Adapter->m_MediaStateAlwaysConnected = TRUE;
-                 l_Adapter->m_MediaState = TRUE;
-               }
-           }
-       }
-    }
-
-#if ENABLE_NONADMIN
-    /* Read AllowNonAdmin setting from registry */
-    {
-      NDIS_STRING key = NDIS_STRING_CONST("AllowNonAdmin");
-      NdisReadConfiguration (&status, &parm, configHandle,
-                            &key, NdisParameterInteger);
-      if (status == NDIS_STATUS_SUCCESS)
-       {
-         if (parm->ParameterType == NdisParameterInteger)
-           {
-             if (parm->ParameterData.IntegerData)
-               {
-                 enable_non_admin = TRUE;
-               }
-           }
-       }
-    }
-#endif
-
-    /* Read optional MAC setting from registry */
-    {
-      NDIS_STRING key = NDIS_STRING_CONST("MAC");
-      ANSI_STRING mac_string;
-      NdisReadConfiguration (&status, &parm, configHandle,
-                            &key, NdisParameterString);
-      if (status == NDIS_STATUS_SUCCESS)
-       {
-         if (parm->ParameterType == NdisParameterString)
-           {
-             if (RtlUnicodeStringToAnsiString (&mac_string, 
&parm->ParameterData.StringData, TRUE) == STATUS_SUCCESS)
-               {
-                 l_MacFromRegistry = ParseMAC (l_Adapter->m_MAC, 
mac_string.Buffer);
-                 RtlFreeAnsiString (&mac_string);
-               }
-           }
-       }
-    }
-
-    NdisCloseConfiguration (configHandle);
-
-    DEBUGP (("[%s] MTU=%d\n", NAME (l_Adapter), l_Adapter->m_MTU));
-  }
-
-  //==================================
-  // Store and update MAC address info
-  //==================================
-
-  if (!l_MacFromRegistry)
-    GenerateRandomMac (l_Adapter->m_MAC, NAME (l_Adapter));
-
-  DEBUGP (("[%s] Using MAC %x:%x:%x:%x:%x:%x\n",
-          NAME (l_Adapter),
-          l_Adapter->m_MAC[0], l_Adapter->m_MAC[1], l_Adapter->m_MAC[2],
-          l_Adapter->m_MAC[3], l_Adapter->m_MAC[4], l_Adapter->m_MAC[5]));
-
-  //==================
-  // Set broadcast MAC
-  //==================
-  {
-    int i;
-    for (i = 0; i < sizeof (MACADDR); ++i)
-      l_Adapter->m_MAC_Broadcast[i] = 0xFF;
-  }
-
-  //====================================
-  // Initialize TAP device
-  //====================================
-  {
-    NDIS_STATUS tap_status;
-    tap_status = CreateTapDevice (&l_Adapter->m_Extension, NAME (l_Adapter));
-    if (tap_status != NDIS_STATUS_SUCCESS)
-      {
-       AdapterFreeResources (l_Adapter);
-       DEBUGP (("[TAP] CreateTapDevice failed\n"));
-       return tap_status;
-      }
-  }
-
-  if (!AddAdapterToInstanceList (l_Adapter))
-    {
-      NOTE_ERROR ();
-      TapDeviceFreeResources (&l_Adapter->m_Extension);
-      AdapterFreeResources (l_Adapter);
-      DEBUGP (("[TAP] AddAdapterToInstanceList failed\n"));
-      return NDIS_STATUS_RESOURCES;
-    }
-
-  l_Adapter->m_InterfaceIsRunning = TRUE;
-
-#if ENABLE_NONADMIN
-  if (enable_non_admin)
-    AllowNonAdmin (&l_Adapter->m_Extension);
-#endif
-
-  return NDIS_STATUS_SUCCESS;
-}
-
-VOID
-AdapterHalt (IN NDIS_HANDLE p_AdapterContext)
-{
-  BOOLEAN status;
-
-  TapAdapterPointer l_Adapter = (TapAdapterPointer) p_AdapterContext;
-
-  NOTE_ERROR ();
-
-  l_Adapter->m_InterfaceIsRunning = FALSE;
-
-  DEBUGP (("[%s] is being halted\n", NAME (l_Adapter)));
-  
-  DestroyTapDevice (&l_Adapter->m_Extension);
-
-  // Free resources
-  DEBUGP (("[%s] Freeing Resources\n", NAME (l_Adapter)));
-  AdapterFreeResources (l_Adapter);
-
-  status = RemoveAdapterFromInstanceList (l_Adapter);
-  DEBUGP (("[TAP] RemoveAdapterFromInstanceList returned %d\n", (int) status));
-
-  DEBUGP (("[TAP] version [%d.%d] %s %s AdapterHalt returning\n",
-          TAP_DRIVER_MAJOR_VERSION,
-          TAP_DRIVER_MINOR_VERSION,
-          __DATE__,
-          __TIME__));
-}
-
-VOID
-AdapterFreeResources (TapAdapterPointer p_Adapter)
-{
-  MYASSERT (!p_Adapter->m_CalledAdapterFreeResources);
-  p_Adapter->m_CalledAdapterFreeResources = TRUE;
-
-  if (p_Adapter->m_NameAnsi.Buffer)
-    RtlFreeAnsiString (&p_Adapter->m_NameAnsi);
-  
-  if (p_Adapter->m_RegisteredAdapterShutdownHandler)
-    NdisMDeregisterAdapterShutdownHandler (p_Adapter->m_MiniportAdapterHandle);
-
-  if (p_Adapter->m_MCLockAllocated)
-    NdisFreeSpinLock (&p_Adapter->m_MCLock);
-}
-
-VOID
-DestroyTapDevice (TapExtensionPointer p_Extension)
-{
-  DEBUGP (("[%s] Destroying tap device\n", p_Extension->m_TapName));
-
-  //======================================
-  // Let clients know we are shutting down
-  //======================================
-  p_Extension->m_TapIsRunning = FALSE;
-  p_Extension->m_TapOpens = 0;
-  p_Extension->m_Halt = TRUE;
-
-  //=====================================
-  // If we are concurrently executing in
-  // TapDeviceHook or AdapterTransmit,
-  // give those calls time to finish.
-  // Note that we must be running at IRQL
-  // < DISPATCH_LEVEL in order to call
-  // NdisMSleep.
-  //=====================================
-  NdisMSleep (500000);
-
-  //===========================================================
-  // Exhaust IRP and packet queues.  Any pending IRPs will
-  // be cancelled, causing user-space to get this error
-  // on overlapped reads:
-  //   The I/O operation has been aborted because of either a
-  //   thread exit or an application request.   (code=995)
-  // It's important that user-space close the device handle
-  // when this code is returned, so that when we finally
-  // do a NdisMDeregisterDevice, the device reference count
-  // is 0.  Otherwise the driver will not unload even if the
-  // the last adapter has been halted.
-  //===========================================================
-  FlushQueues (p_Extension);
-  NdisMSleep (500000); // give user space time to respond to IRP cancel
-
-  TapDeviceFreeResources (p_Extension);
-}
-
-VOID
-TapDeviceFreeResources (TapExtensionPointer p_Extension)
-{
-  MYASSERT (p_Extension);
-  MYASSERT (!p_Extension->m_CalledTapDeviceFreeResources);
-  p_Extension->m_CalledTapDeviceFreeResources = TRUE;
-
-  if (p_Extension->m_PacketQueue)
-    QueueFree (p_Extension->m_PacketQueue);
-  if (p_Extension->m_IrpQueue)
-    QueueFree (p_Extension->m_IrpQueue);
-  if (p_Extension->m_InjectQueue)
-    QueueFree (p_Extension->m_InjectQueue);
-
-  if (p_Extension->m_CreatedUnicodeLinkName)
-    RtlFreeUnicodeString (&p_Extension->m_UnicodeLinkName);
-
-  //==========================================================
-  // According to DDK docs, the device is not actually deleted
-  // until its reference count falls to zero.  That means we
-  // still need to gracefully fail TapDeviceHook requests
-  // after this point, otherwise ugly things would happen if
-  // the device was disabled (e.g. in the network connections
-  // control panel) while a userspace app still held an open
-  // file handle to it.
-  //==========================================================
-  
-  if (p_Extension->m_TapDevice)
-    {
-      BOOLEAN status;
-      status = (NdisMDeregisterDevice (p_Extension->m_TapDeviceHandle)
-               == NDIS_STATUS_SUCCESS);
-      DEBUGP (("[TAP] Deregistering TAP device, status=%d\n", (int)status));
-    }
-
-  if (p_Extension->m_TapName)
-    MemFree (p_Extension->m_TapName, NAME_BUFFER_SIZE);
-  
-  if (p_Extension->m_InjectDpcInitialized)
-    KeRemoveQueueDpc (&p_Extension->m_InjectDpc);
-
-  if (p_Extension->m_AllocatedSpinlocks)
-    {
-      NdisFreeSpinLock (&p_Extension->m_QueueLock);
-      NdisFreeSpinLock (&p_Extension->m_InjectLock);
-    }
-}
-
-//========================================================================
-//                             Tap Device Initialization
-//========================================================================
-
-NDIS_STATUS
-CreateTapDevice (TapExtensionPointer p_Extension, const char *p_Name)
-{
-# define SIZEOF_DISPATCH (sizeof(PDRIVER_DISPATCH) * (IRP_MJ_MAXIMUM_FUNCTION 
+ 1))
-  PDRIVER_DISPATCH *l_Dispatch = NULL;
-  ANSI_STRING l_TapString, l_LinkString;
-  UNICODE_STRING l_TapUnicode;
-  BOOLEAN l_FreeTapUnicode = FALSE;
-  NTSTATUS l_Status, l_Return = NDIS_STATUS_SUCCESS;
-  const char *l_UsableName;
-
-  DEBUGP (("[TAP] version [%d.%d] creating tap device: %s\n",
-          TAP_DRIVER_MAJOR_VERSION,
-          TAP_DRIVER_MINOR_VERSION,
-          p_Name));
-
-  NdisZeroMemory (p_Extension, sizeof (TapExtension));
-
-  INIT_MUTEX (&p_Extension->m_OpenCloseMutex);
-
-  l_LinkString.Buffer = NULL;
-  l_TapString.Buffer = NULL;
-
-  l_TapString.MaximumLength = l_LinkString.MaximumLength = NAME_BUFFER_SIZE;
-
-  //=======================================
-  // Set TAP device entry points
-  //=======================================
-
-  if ((l_Dispatch = MemAlloc (SIZEOF_DISPATCH, TRUE)) == NULL)
-    {
-      DEBUGP (("[%s] couldn't alloc TAP dispatch table\n", p_Name));
-      l_Return = NDIS_STATUS_RESOURCES;
-      goto cleanup;
-    }
-
-  l_Dispatch[IRP_MJ_DEVICE_CONTROL] = TapDeviceHook;
-  l_Dispatch[IRP_MJ_READ] = TapDeviceHook;
-  l_Dispatch[IRP_MJ_WRITE] = TapDeviceHook;
-  l_Dispatch[IRP_MJ_CREATE] = TapDeviceHook;
-  l_Dispatch[IRP_MJ_CLOSE] = TapDeviceHook;
-
-  //==================================
-  // Find the beginning of the GUID
-  //==================================
-  l_UsableName = p_Name;
-  while (*l_UsableName != '{')
-    {
-      if (*l_UsableName == '\0')
-       {
-         DEBUGP (("[%s] couldn't find leading '{' in name\n", p_Name));
-         l_Return = NDIS_STATUS_RESOURCES;
-         goto cleanup;
-       }
-      ++l_UsableName;
-    }
-
-  //==================================
-  // Allocate pool for TAP device name
-  //==================================
-
-  if ((p_Extension->m_TapName = l_TapString.Buffer =
-       MemAlloc (NAME_BUFFER_SIZE, TRUE)) == NULL)
-    {
-      DEBUGP (("[%s] couldn't alloc TAP name buffer\n", p_Name));
-      l_Return = NDIS_STATUS_RESOURCES;
-      goto cleanup;
-    }
-
-  //================================================
-  // Allocate pool for TAP symbolic link name buffer
-  //================================================
-
-  if ((l_LinkString.Buffer =
-       MemAlloc (NAME_BUFFER_SIZE, TRUE)) == NULL)
-    {
-      DEBUGP (("[%s] couldn't alloc TAP symbolic link name buffer\n",
-              p_Name));
-      l_Return = NDIS_STATUS_RESOURCES;
-      goto cleanup;
-    }
-
-  //=======================================================
-  // Set TAP device name
-  //=======================================================
-
-  l_Status = RtlStringCchPrintfExA
-    (l_TapString.Buffer,
-     l_TapString.MaximumLength,
-     NULL,
-     NULL,
-     STRSAFE_FILL_BEHIND_NULL | STRSAFE_IGNORE_NULLS,
-     "%s%s%s",
-     SYSDEVICEDIR,
-     l_UsableName,
-     TAPSUFFIX);
-
-  if (l_Status != STATUS_SUCCESS)
-    {
-      DEBUGP (("[%s] couldn't format TAP device name\n",
-              p_Name));
-      l_Return = NDIS_STATUS_RESOURCES;
-      goto cleanup;
-    }
-  l_TapString.Length = (USHORT) strlen (l_TapString.Buffer);
-
-  DEBUGP (("TAP DEV NAME: '%s'\n", l_TapString.Buffer));
-
-  //=======================================================
-  // Set TAP link name
-  //=======================================================
-
-  l_Status = RtlStringCchPrintfExA
-    (l_LinkString.Buffer,
-     l_LinkString.MaximumLength,
-     NULL,
-     NULL,
-     STRSAFE_FILL_BEHIND_NULL | STRSAFE_IGNORE_NULLS,
-     "%s%s%s",
-     USERDEVICEDIR,
-     l_UsableName,
-     TAPSUFFIX);
-
-  if (l_Status != STATUS_SUCCESS)
-    {
-      DEBUGP (("[%s] couldn't format TAP device symbolic link\n",
-              p_Name));
-      l_Return = NDIS_STATUS_RESOURCES;
-      goto cleanup;
-    }
-  l_LinkString.Length = (USHORT) strlen (l_LinkString.Buffer);
-
-  DEBUGP (("TAP LINK NAME: '%s'\n", l_LinkString.Buffer));
-
-  //==================================================
-  // Convert strings to unicode
-  //==================================================
-  if (RtlAnsiStringToUnicodeString (&l_TapUnicode, &l_TapString, TRUE) !=
-      STATUS_SUCCESS)
-    {
-      DEBUGP (("[%s] couldn't alloc TAP unicode name buffer\n",
-               p_Name));
-      l_Return = NDIS_STATUS_RESOURCES;
-      goto cleanup;
-    }
-  l_FreeTapUnicode = TRUE;
-
-  if (RtlAnsiStringToUnicodeString
-      (&p_Extension->m_UnicodeLinkName, &l_LinkString, TRUE)
-      != STATUS_SUCCESS)
-    {
-      DEBUGP
-       (("[%s] Couldn't allocate unicode string for symbolic link name\n",
-        p_Name));
-      l_Return = NDIS_STATUS_RESOURCES;
-      goto cleanup;
-    }
-  p_Extension->m_CreatedUnicodeLinkName = TRUE;
-
-  //==================================================
-  // Create new TAP device with symbolic
-  // link and associate with adapter.
-  //==================================================
-
-  l_Status = NdisMRegisterDevice
-    (g_NdisWrapperHandle,
-     &l_TapUnicode,
-     &p_Extension->m_UnicodeLinkName,
-     l_Dispatch,
-     &p_Extension->m_TapDevice,
-     &p_Extension->m_TapDeviceHandle
-     );
-
-  if (l_Status != STATUS_SUCCESS)
-    {
-      DEBUGP (("[%s] couldn't be created\n", p_Name));
-      l_Return = NDIS_STATUS_RESOURCES;
-      goto cleanup;
-    }
-
-  /* Set TAP device flags */
-  p_Extension->m_TapDevice->Flags |= DO_DIRECT_IO;
-
-  //========================================================
-  // Initialize Packet and IRP queues.
-  //
-  // The packet queue is used to buffer data which has been
-  // "transmitted" by the virtual NIC, before user space
-  // has had a chance to read it.
-  //
-  // The IRP queue is used to buffer pending I/O requests
-  // from userspace, i.e. read requests on the TAP device
-  // waiting for the system to "transmit" something through
-  // the virtual NIC.
-  //
-  // Basically, packets in the packet queue are used
-  // to satisfy IRP requests in the IRP queue.
-  //
-  // QueueLock is used to lock the packet queue used
-  // for the TAP-Win32 NIC -> User Space packet flow direction.
-  //
-  // All accesses to packet or IRP queues should be
-  // bracketed by the QueueLock spinlock,
-  // in order to be SMP-safe.
-  //========================================================
-
-  NdisAllocateSpinLock (&p_Extension->m_QueueLock);
-  NdisAllocateSpinLock (&p_Extension->m_InjectLock);
-  p_Extension->m_AllocatedSpinlocks = TRUE;
-
-  p_Extension->m_PacketQueue = QueueInit (PACKET_QUEUE_SIZE);
-  p_Extension->m_IrpQueue = QueueInit (IRP_QUEUE_SIZE);
-  p_Extension->m_InjectQueue = QueueInit (INJECT_QUEUE_SIZE);
-  if (!p_Extension->m_PacketQueue
-      || !p_Extension->m_IrpQueue
-      || !p_Extension->m_InjectQueue)
-    {
-      DEBUGP (("[%s] couldn't alloc TAP queues\n", p_Name));
-      l_Return = NDIS_STATUS_RESOURCES;
-      goto cleanup;
-    }
-
-  //=================================================================
-  // Initialize deferred procedure call for DHCP/ARP packet injection
-  //=================================================================
-
-  KeInitializeDpc (&p_Extension->m_InjectDpc, InjectPacketDpc, NULL);
-  p_Extension->m_InjectDpcInitialized = TRUE;
-
-  //========================
-  // Finalize initialization
-  //========================
-
-  p_Extension->m_TapIsRunning = TRUE;
-
-  DEBUGP (("[%s] successfully created TAP device [%s]\n", p_Name,
-           p_Extension->m_TapName));
-
- cleanup:
-  if (l_FreeTapUnicode)
-    RtlFreeUnicodeString (&l_TapUnicode);
-  if (l_LinkString.Buffer)
-    MemFree (l_LinkString.Buffer, NAME_BUFFER_SIZE);
-  if (l_Dispatch)
-    MemFree (l_Dispatch, SIZEOF_DISPATCH);
-
-  if (l_Return != NDIS_STATUS_SUCCESS)
-    TapDeviceFreeResources (p_Extension);
-
-  return l_Return;
-}
-#undef SIZEOF_DISPATCH
-
-//========================================================
-//                      Adapter Control
-//========================================================
-NDIS_STATUS
-AdapterReset (OUT PBOOLEAN p_AddressingReset, IN NDIS_HANDLE p_AdapterContext)
-{
-  TapAdapterPointer l_Adapter = (TapAdapterPointer) p_AdapterContext;
-  DEBUGP (("[%s] is resetting\n", NAME (l_Adapter)));
-  return NDIS_STATUS_SUCCESS;
-}
-
-NDIS_STATUS AdapterReceive
-  (OUT PNDIS_PACKET p_Packet,
-   OUT PUINT p_Transferred,
-   IN NDIS_HANDLE p_AdapterContext,
-   IN NDIS_HANDLE p_ReceiveContext,
-   IN UINT p_Offset,
-   IN UINT p_ToTransfer)
-{
-  return NDIS_STATUS_SUCCESS;
-}
-
-//==============================================================
-//                  Adapter Option Query/Modification
-//==============================================================
-NDIS_STATUS AdapterQuery
-(IN NDIS_HANDLE p_AdapterContext,
- IN NDIS_OID p_OID,
- IN PVOID p_Buffer,
- IN ULONG p_BufferLength,
- OUT PULONG p_BytesWritten, OUT PULONG p_BytesNeeded)
-{
-  TapAdapterPointer l_Adapter = (TapAdapterPointer) p_AdapterContext;
-  TapAdapterQuery l_Query, *l_QueryPtr = &l_Query;
-  NDIS_STATUS l_Status = NDIS_STATUS_SUCCESS;
-  UINT l_QueryLength = 4;
-  BOOLEAN lock_succeeded;
-
-  NdisZeroMemory (&l_Query, sizeof (l_Query));
-
-  switch (p_OID)
-    {
-      //===================================================================
-      //                       Vendor & Driver version Info
-      //===================================================================
-    case OID_GEN_VENDOR_DESCRIPTION:
-      l_QueryPtr = (TapAdapterQueryPointer) PRODUCT_STRING;
-      l_QueryLength = strlen (PRODUCT_STRING) + 1;
-      break;
-
-    case OID_GEN_VENDOR_ID:
-      l_Query.m_Long = 0xffffff;
-      break;
-
-    case OID_GEN_DRIVER_VERSION:
-      l_Query.m_Short =
-       (((USHORT) TAP_NDIS_MAJOR_VERSION) << 8 | (USHORT)
-        TAP_NDIS_MINOR_VERSION);
-      l_QueryLength = sizeof (unsigned short);
-      break;
-
-    case OID_GEN_VENDOR_DRIVER_VERSION:
-      l_Query.m_Long =
-       (((USHORT) TAP_DRIVER_MAJOR_VERSION) << 8 | (USHORT)
-        TAP_DRIVER_MINOR_VERSION);
-      break;
-
-      //=================================================================
-      //                             Statistics
-      //=================================================================
-    case OID_GEN_RCV_NO_BUFFER:
-      l_Query.m_Long = 0;
-      break;
-
-    case OID_802_3_RCV_ERROR_ALIGNMENT:
-      l_Query.m_Long = 0;
-      break;
-
-    case OID_802_3_XMIT_ONE_COLLISION:
-      l_Query.m_Long = 0;
-      break;
-
-    case OID_802_3_XMIT_MORE_COLLISIONS:
-      l_Query.m_Long = 0;
-      break;
-
-    case OID_GEN_XMIT_OK:
-      l_Query.m_Long = l_Adapter->m_Tx;
-      break;
-
-    case OID_GEN_RCV_OK:
-      l_Query.m_Long = l_Adapter->m_Rx;
-      break;
-
-    case OID_GEN_XMIT_ERROR:
-      l_Query.m_Long = l_Adapter->m_TxErr;
-      break;
-
-    case OID_GEN_RCV_ERROR:
-      l_Query.m_Long = l_Adapter->m_RxErr;
-      break;
-
-      //===================================================================
-      //                       Device & Protocol Options
-      //===================================================================
-    case OID_GEN_SUPPORTED_LIST:
-      l_QueryPtr = (TapAdapterQueryPointer) g_SupportedOIDList;
-      l_QueryLength = sizeof (g_SupportedOIDList);
-      break;
-
-    case OID_GEN_MAC_OPTIONS:
-      // This MUST be here !!!
-      l_Query.m_Long = (NDIS_MAC_OPTION_RECEIVE_SERIALIZED
-                       | NDIS_MAC_OPTION_COPY_LOOKAHEAD_DATA
-                       | NDIS_MAC_OPTION_NO_LOOPBACK
-                       | NDIS_MAC_OPTION_TRANSFERS_NOT_PEND);
-
-      break;
-
-    case OID_GEN_CURRENT_PACKET_FILTER:
-      l_Query.m_Long =
-       (NDIS_PACKET_TYPE_ALL_LOCAL |
-        NDIS_PACKET_TYPE_BROADCAST |
-        NDIS_PACKET_TYPE_DIRECTED | NDIS_PACKET_TYPE_ALL_FUNCTIONAL);
-
-      break;
-
-    case OID_GEN_PROTOCOL_OPTIONS:
-      l_Query.m_Long = 0;
-      break;
-
-      //==================================================================
-      //                            Device Info
-      //==================================================================
-    case OID_GEN_MEDIA_CONNECT_STATUS:
-      l_Query.m_Long = l_Adapter->m_MediaState
-       ? NdisMediaStateConnected : NdisMediaStateDisconnected;
-      break;
-
-    case OID_GEN_HARDWARE_STATUS:
-      l_Query.m_HardwareStatus = NdisHardwareStatusReady;
-      l_QueryLength = sizeof (NDIS_HARDWARE_STATUS);
-      break;
-
-    case OID_GEN_MEDIA_SUPPORTED:
-    case OID_GEN_MEDIA_IN_USE:
-      l_Query.m_Medium = l_Adapter->m_Medium;
-      l_QueryLength = sizeof (NDIS_MEDIUM);
-      break;
-
-    case OID_GEN_PHYSICAL_MEDIUM:
-      l_Query.m_PhysicalMedium = NdisPhysicalMediumUnspecified;
-      l_QueryLength = sizeof (NDIS_PHYSICAL_MEDIUM);
-      break;
-      
-    case OID_GEN_LINK_SPEED:
-      l_Query.m_Long = 100000; // rate / 100 bps
-      break;
-
-    case OID_802_3_PERMANENT_ADDRESS:
-    case OID_802_3_CURRENT_ADDRESS:
-      COPY_MAC (l_Query.m_MacAddress, l_Adapter->m_MAC);
-      l_QueryLength = sizeof (MACADDR);
-      break;
-
-      //==================================================================
-      //                             Limits
-      //==================================================================
-
-    case OID_GEN_MAXIMUM_SEND_PACKETS:
-      l_Query.m_Long = 1;
-      break;
-
-    case OID_802_3_MAXIMUM_LIST_SIZE:
-      l_Query.m_Long = NIC_MAX_MCAST_LIST;
-      break;
-
-    case OID_GEN_CURRENT_LOOKAHEAD:
-      l_Query.m_Long = l_Adapter->m_Lookahead;
-      break;
-
-    case OID_GEN_MAXIMUM_LOOKAHEAD:
-    case OID_GEN_MAXIMUM_TOTAL_SIZE:
-    case OID_GEN_RECEIVE_BUFFER_SPACE:
-    case OID_GEN_RECEIVE_BLOCK_SIZE:
-      l_Query.m_Long = DEFAULT_PACKET_LOOKAHEAD;
-      break;
-
-    case OID_GEN_MAXIMUM_FRAME_SIZE:
-    case OID_GEN_TRANSMIT_BLOCK_SIZE:
-    case OID_GEN_TRANSMIT_BUFFER_SPACE:
-      l_Query.m_Long = l_Adapter->m_MTU;
-      break;
-
-    case OID_PNP_CAPABILITIES:
-      do
-       {
-         PNDIS_PNP_CAPABILITIES pPNPCapabilities;
-         PNDIS_PM_WAKE_UP_CAPABILITIES pPMstruct;
-
-         if (p_BufferLength >= sizeof (NDIS_PNP_CAPABILITIES))
-           {
-             pPNPCapabilities = (PNDIS_PNP_CAPABILITIES) (p_Buffer);
-
-             //
-             // Setting up the buffer to be returned
-             // to the Protocol above the Passthru miniport
-             //
-             pPMstruct = &pPNPCapabilities->WakeUpCapabilities;
-             pPMstruct->MinMagicPacketWakeUp = NdisDeviceStateUnspecified;
-             pPMstruct->MinPatternWakeUp = NdisDeviceStateUnspecified;
-             pPMstruct->MinLinkChangeWakeUp = NdisDeviceStateUnspecified;
-           }
-         l_QueryLength = sizeof (NDIS_PNP_CAPABILITIES);
-       }
-      while (FALSE);
-      break;
-    case OID_PNP_QUERY_POWER:
-      break;
-
-      // Required OIDs that we don't support
-
-    case OID_GEN_SUPPORTED_GUIDS:
-    case OID_GEN_MEDIA_CAPABILITIES:
-    case OID_TCP_TASK_OFFLOAD:
-    case OID_FFP_SUPPORT:
-      l_Status = NDIS_STATUS_INVALID_OID;
-      break;
-
-      // Optional stats OIDs
-
-    case OID_GEN_DIRECTED_BYTES_XMIT:
-    case OID_GEN_DIRECTED_FRAMES_XMIT:
-    case OID_GEN_MULTICAST_BYTES_XMIT:
-    case OID_GEN_MULTICAST_FRAMES_XMIT:
-    case OID_GEN_BROADCAST_BYTES_XMIT:
-    case OID_GEN_BROADCAST_FRAMES_XMIT:
-    case OID_GEN_DIRECTED_BYTES_RCV:
-    case OID_GEN_DIRECTED_FRAMES_RCV:
-    case OID_GEN_MULTICAST_BYTES_RCV:
-    case OID_GEN_MULTICAST_FRAMES_RCV:
-    case OID_GEN_BROADCAST_BYTES_RCV:
-    case OID_GEN_BROADCAST_FRAMES_RCV:
-      l_Status = NDIS_STATUS_INVALID_OID;
-      break;
-
-      //===================================================================
-      //                          Not Handled
-      //===================================================================
-    default:
-      DEBUGP (("[%s] Unhandled OID %lx\n", NAME (l_Adapter), p_OID));
-      l_Status = NDIS_STATUS_INVALID_OID;
-      break;
-    }
-
-  if (l_Status != NDIS_STATUS_SUCCESS)
-    ;
-  else if (l_QueryLength > p_BufferLength)
-    {
-      l_Status = NDIS_STATUS_INVALID_LENGTH;
-      *p_BytesNeeded = l_QueryLength;
-    }
-  else
-    NdisMoveMemory (p_Buffer, (PVOID) l_QueryPtr,
-                   (*p_BytesWritten = l_QueryLength));
-
-  return l_Status;
-}
-
-NDIS_STATUS AdapterModify
-(IN NDIS_HANDLE p_AdapterContext,
- IN NDIS_OID p_OID,
- IN PVOID p_Buffer,
- IN ULONG p_BufferLength,
- OUT PULONG p_BytesRead,
- OUT PULONG p_BytesNeeded)
-{
-  TapAdapterQueryPointer l_Query = (TapAdapterQueryPointer) p_Buffer;
-  TapAdapterPointer l_Adapter = (TapAdapterPointer) p_AdapterContext;
-  NDIS_STATUS l_Status = NDIS_STATUS_INVALID_OID;
-  ULONG l_Long;
-
-  switch (p_OID)
-    {
-      //==================================================================
-      //                            Device Info
-      //==================================================================
-    case OID_802_3_MULTICAST_LIST:
-      DEBUGP (("[%s] Setting [OID_802_3_MULTICAST_LIST]\n",
-              NAME (l_Adapter)));
-
-      *p_BytesNeeded = sizeof (ETH_ADDR);
-      *p_BytesRead = p_BufferLength;
-
-      if (p_BufferLength % sizeof (ETH_ADDR))
-       l_Status = NDIS_STATUS_INVALID_LENGTH;
-      else if (p_BufferLength > sizeof (MC_LIST))
-       {
-         l_Status = NDIS_STATUS_MULTICAST_FULL;
-         *p_BytesNeeded = sizeof (MC_LIST);
-       }
-      else
-       {
-         NdisAcquireSpinLock (&l_Adapter->m_MCLock);
-
-         NdisZeroMemory(&l_Adapter->m_MCList, sizeof (MC_LIST));
-        
-         NdisMoveMemory(&l_Adapter->m_MCList,
-                        p_Buffer,
-                        p_BufferLength);
-
-         l_Adapter->m_MCListSize = p_BufferLength / sizeof (ETH_ADDR);
-        
-         NdisReleaseSpinLock (&l_Adapter->m_MCLock);
-
-         l_Status = NDIS_STATUS_SUCCESS;
-       }
-      break;
-
-    case OID_GEN_CURRENT_PACKET_FILTER:
-      l_Status = NDIS_STATUS_INVALID_LENGTH;
-      *p_BytesNeeded = 4;
-
-      if (p_BufferLength >= sizeof (ULONG))
-       {
-         DEBUGP
-           (("[%s] Setting [OID_GEN_CURRENT_PACKET_FILTER] to [0x%02lx]\n",
-             NAME (l_Adapter), l_Query->m_Long));
-         l_Status = NDIS_STATUS_SUCCESS;
-         *p_BytesRead = sizeof (ULONG);
-       }
-      break;
-
-    case OID_GEN_CURRENT_LOOKAHEAD:
-      if (p_BufferLength < sizeof (ULONG))
-       {
-         l_Status = NDIS_STATUS_INVALID_LENGTH;
-         *p_BytesNeeded = 4;
-       }
-      else if (l_Query->m_Long > DEFAULT_PACKET_LOOKAHEAD
-              || l_Query->m_Long <= 0)
-       {
-         l_Status = NDIS_STATUS_INVALID_DATA;
-       }
-      else
-       {
-         DEBUGP (("[%s] Setting [OID_GEN_CURRENT_LOOKAHEAD] to [%d]\n",
-                  NAME (l_Adapter), l_Query->m_Long));
-         l_Adapter->m_Lookahead = l_Query->m_Long;
-         l_Status = NDIS_STATUS_SUCCESS;
-         *p_BytesRead = sizeof (ULONG);
-       }
-      break;
-
-    case OID_GEN_NETWORK_LAYER_ADDRESSES:
-      l_Status = NDIS_STATUS_SUCCESS;
-      *p_BytesRead = *p_BytesNeeded = 0;
-      break;
-
-    case OID_GEN_TRANSPORT_HEADER_OFFSET:
-      l_Status = NDIS_STATUS_SUCCESS;
-      *p_BytesRead = *p_BytesNeeded = 0;
-      break;
-
-    case OID_PNP_SET_POWER:
-      do
-       {
-         NDIS_DEVICE_POWER_STATE NewDeviceState;
-
-         NewDeviceState = (*(PNDIS_DEVICE_POWER_STATE) p_Buffer);
-
-         switch (NewDeviceState)
-           {
-           case NdisDeviceStateD0:
-             l_Adapter->m_DeviceState = '0';
-             break;
-           case NdisDeviceStateD1:
-             l_Adapter->m_DeviceState = '1';
-             break;
-           case NdisDeviceStateD2:
-             l_Adapter->m_DeviceState = '2';
-             break;
-           case NdisDeviceStateD3:
-             l_Adapter->m_DeviceState = '3';
-             break;
-           default:
-             l_Adapter->m_DeviceState = '?';
-             break;
-           }
-
-         l_Status = NDIS_STATUS_FAILURE;
-
-         //
-         // Check for invalid length
-         //
-         if (p_BufferLength < sizeof (NDIS_DEVICE_POWER_STATE))
-           {
-             l_Status = NDIS_STATUS_INVALID_LENGTH;
-             break;
-           }
-
-         if (NewDeviceState > NdisDeviceStateD0)
-           {
-             l_Adapter->m_InterfaceIsRunning = FALSE;
-             DEBUGP (("[%s] Power management device state OFF\n",
-                      NAME (l_Adapter)));
-           }
-         else
-           {
-             l_Adapter->m_InterfaceIsRunning = TRUE;
-             DEBUGP (("[%s] Power management device state ON\n",
-                      NAME (l_Adapter)));
-           }
-
-         l_Status = NDIS_STATUS_SUCCESS;
-       }
-      while (FALSE);
-
-      if (l_Status == NDIS_STATUS_SUCCESS)
-       {
-         *p_BytesRead = sizeof (NDIS_DEVICE_POWER_STATE);
-         *p_BytesNeeded = 0;
-       }
-      else
-       {
-         *p_BytesRead = 0;
-         *p_BytesNeeded = sizeof (NDIS_DEVICE_POWER_STATE);
-       }
-      break;
-
-    case OID_PNP_REMOVE_WAKE_UP_PATTERN:
-    case OID_PNP_ADD_WAKE_UP_PATTERN:
-      l_Status = NDIS_STATUS_SUCCESS;
-      *p_BytesRead = *p_BytesNeeded = 0;
-      break;
-
-    default:
-      DEBUGP (("[%s] Can't set value for OID %lx\n", NAME (l_Adapter),
-              p_OID));
-      l_Status = NDIS_STATUS_INVALID_OID;
-      *p_BytesRead = *p_BytesNeeded = 0;
-      break;
-    }
-
-  return l_Status;
-}
-
-// checksum code for ICMPv6 packet, taken from dhcp.c / udp_checksum
-// see RFC 4443, 2.3, and RFC 2460, 8.1
-USHORT
-icmpv6_checksum (const UCHAR *buf,
-                const int len_icmpv6,
-                const UCHAR *saddr6,
-                const UCHAR *daddr6)
-{
-  USHORT word16;
-  ULONG sum = 0;
-  int i;
-
-  // make 16 bit words out of every two adjacent 8 bit words and
-  // calculate the sum of all 16 bit words
-  for (i = 0; i < len_icmpv6; i += 2){
-    word16 = ((buf[i] << 8) & 0xFF00) + ((i + 1 < len_icmpv6) ? (buf[i+1] & 
0xFF) : 0);
-    sum += word16;
-  }
-
-  // add the IPv6 pseudo header which contains the IP source and destination 
addresses
-  for (i = 0; i < 16; i += 2){
-    word16 =((saddr6[i] << 8) & 0xFF00) + (saddr6[i+1] & 0xFF);
-    sum += word16;
-  }
-  for (i = 0; i < 16; i += 2){
-    word16 =((daddr6[i] << 8) & 0xFF00) + (daddr6[i+1] & 0xFF);
-    sum += word16;
-  }
-
-  // the next-header number and the length of the ICMPv6 packet
-  sum += (USHORT) IPPROTO_ICMPV6 + (USHORT) len_icmpv6;
-
-  // keep only the last 16 bits of the 32 bit calculated sum and add the 
carries
-  while (sum >> 16)
-    sum = (sum & 0xFFFF) + (sum >> 16);
-
-  // Take the one's complement of sum
-  return ((USHORT) ~sum);
-}
-
-// check IPv6 packet for "is this an IPv6 Neighbor Solicitation that
-// the tap driver needs to answer?"
-// see RFC 4861 4.3 for the different cases
-static IPV6ADDR IPV6_NS_TARGET_MCAST =
-       { 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-          0x00, 0x00, 0x00, 0x01, 0xff, 0x00, 0x00, 0x08 };
-static IPV6ADDR IPV6_NS_TARGET_UNICAST =
-       { 0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08 };
-
-BOOLEAN
-HandleIPv6NeighborDiscovery( TapAdapterPointer p_Adapter, UCHAR * m_Data )
-{
-    const ETH_HEADER * e = (ETH_HEADER *) m_Data;
-    const IPV6HDR *ipv6 = (IPV6HDR *) (m_Data + sizeof (ETH_HEADER));
-    const ICMPV6_NS * icmpv6_ns = (ICMPV6_NS *) (m_Data + sizeof (ETH_HEADER) 
+ sizeof (IPV6HDR));
-    ICMPV6_NA_PKT *na;
-    USHORT icmpv6_len, icmpv6_csum;
-
-    // we don't really care about the destination MAC address here
-    // - it's either a multicast MAC, or the userland destination MAC
-    // but since the TAP driver is point-to-point, all packets are "for us"
-
-    // IPv6 target address must be ff02::1::ff00:8 (multicast for
-    // initial NS) or fe80::1 (unicast for recurrent NUD)
-    if ( memcmp( ipv6->daddr, IPV6_NS_TARGET_MCAST,
-                sizeof(IPV6ADDR) ) != 0 &&
-         memcmp( ipv6->daddr, IPV6_NS_TARGET_UNICAST,
-                sizeof(IPV6ADDR) ) != 0 )
-    {
-       return FALSE;                           // wrong target address
-    }
-
-    // IPv6 Next-Header must be ICMPv6
-    if ( ipv6->nexthdr != IPPROTO_ICMPV6 )
-    {
-       return FALSE;                           // wrong next-header
-    }
-
-    // ICMPv6 type+code must be 135/0 for NS
-    if ( icmpv6_ns->type != ICMPV6_TYPE_NS ||
-        icmpv6_ns->code != ICMPV6_CODE_0 )
-    {
-       return FALSE;                           // wrong ICMPv6 type
-    }
-
-    // ICMPv6 target address must be fe80::8 (magic)
-    if ( memcmp( icmpv6_ns->target_addr, IPV6_NS_TARGET_UNICAST,
-                sizeof(IPV6ADDR) ) != 0 )
-    {
-       return FALSE;                           // not for us
-    }
-
-    // packet identified, build magic response packet
-
-    na = (ICMPV6_NA_PKT *) MemAlloc (sizeof (ICMPV6_NA_PKT), TRUE);
-    if ( !na ) return FALSE;
-
-    //------------------------------------------------
-    // Initialize Neighbour Advertisement reply packet
-    //------------------------------------------------
-
-    // ethernet header
-    na->eth.proto = htons(ETH_P_IPV6);
-    COPY_MAC(na->eth.dest, p_Adapter->m_MAC);
-    COPY_MAC(na->eth.src, p_Adapter->m_TapToUser.dest);
-
-    // IPv6 header
-    na->ipv6.version_prio = ipv6->version_prio;
-    NdisMoveMemory( na->ipv6.flow_lbl, ipv6->flow_lbl,
-                   sizeof(na->ipv6.flow_lbl) );
-    icmpv6_len = sizeof(ICMPV6_NA_PKT) - sizeof(ETH_HEADER) - sizeof(IPV6HDR);
-    na->ipv6.payload_len = htons(icmpv6_len);
-    na->ipv6.nexthdr = IPPROTO_ICMPV6;
-    na->ipv6.hop_limit = 255;
-    NdisMoveMemory( na->ipv6.saddr, IPV6_NS_TARGET_UNICAST,
-                   sizeof(IPV6ADDR) );
-    NdisMoveMemory( na->ipv6.daddr, ipv6->saddr,
-                   sizeof(IPV6ADDR) );
-
-    // ICMPv6
-    na->icmpv6.type = ICMPV6_TYPE_NA;
-    na->icmpv6.code = ICMPV6_CODE_0;
-    na->icmpv6.checksum = 0;
-    na->icmpv6.rso_bits = 0x60;                // Solicited + Override
-    NdisZeroMemory( na->icmpv6.reserved, sizeof(na->icmpv6.reserved) );
-    NdisMoveMemory( na->icmpv6.target_addr, IPV6_NS_TARGET_UNICAST,
-                   sizeof(IPV6ADDR) );
-
-    // ICMPv6 option "Target Link Layer Address"
-    na->icmpv6.opt_type = ICMPV6_OPTION_TLLA;
-    na->icmpv6.opt_length = ICMPV6_LENGTH_TLLA;
-    COPY_MAC( na->icmpv6.target_macaddr, p_Adapter->m_TapToUser.dest );
-
-    // calculate and set checksum
-    icmpv6_csum = icmpv6_checksum ( (UCHAR*) &(na->icmpv6),
-                                   icmpv6_len,
-                                   na->ipv6.saddr,
-                                   na->ipv6.daddr );
-    na->icmpv6.checksum = htons( icmpv6_csum );
-
-    DUMP_PACKET ("HandleIPv6NeighborDiscovery",
-                (unsigned char *) na,
-                sizeof (ICMPV6_NA_PKT));
-
-    InjectPacketDeferred (p_Adapter, (UCHAR *) na, sizeof (ICMPV6_NA_PKT));
-
-    MemFree (na, sizeof (ICMPV6_NA_PKT));
-
-    return TRUE;                               // all fine
-}
-
-//====================================================================
-//                               Adapter Transmission
-//====================================================================
-NDIS_STATUS
-AdapterTransmit (IN NDIS_HANDLE p_AdapterContext,
-                IN PNDIS_PACKET p_Packet,
-                IN UINT p_Flags)
-{
-  TapAdapterPointer l_Adapter = (TapAdapterPointer) p_AdapterContext;
-  ULONG l_Index = 0, l_PacketLength = 0;
-  UINT l_BufferLength = 0;
-  PIRP l_IRP;
-  TapPacketPointer l_PacketBuffer;
-  PNDIS_BUFFER l_NDIS_Buffer;
-  PUCHAR l_Buffer;
-  PVOID result;
-
-  NdisQueryPacket (p_Packet, NULL, NULL, &l_NDIS_Buffer, &l_PacketLength);
-
-  //====================================================
-  // Here we abandon the transmission attempt if any of
-  // the parameters is wrong or memory allocation fails
-  // but we do not indicate failure. The packet is
-  // silently dropped.
-  //====================================================
-
-  if (l_PacketLength < ETHERNET_HEADER_SIZE || l_PacketLength > 65535)
-    goto exit_fail;
-  else if (!l_Adapter->m_Extension.m_TapOpens || !l_Adapter->m_MediaState)
-    goto exit_success;              // Nothing is bound to the TAP device
-
-  if (NdisAllocateMemoryWithTag (&l_PacketBuffer,
-                                TAP_PACKET_SIZE (l_PacketLength),
-                                '5PAT') != NDIS_STATUS_SUCCESS)
-    goto exit_no_resources;
-
-  if (l_PacketBuffer == NULL)
-    goto exit_no_resources;
-
-  l_PacketBuffer->m_SizeFlags = (l_PacketLength & TP_SIZE_MASK);
-
-  //===========================
-  // Reassemble packet contents
-  //===========================
-
-  __try
-  {
-    l_Index = 0;
-    while (l_NDIS_Buffer && l_Index < l_PacketLength)
-      {
-       ULONG newlen;
-       NdisQueryBuffer (l_NDIS_Buffer, (PVOID *) & l_Buffer,
-                        &l_BufferLength);
-       newlen = l_Index + l_BufferLength;
-       if (newlen > l_PacketLength)
-         {
-           NOTE_ERROR ();
-           goto no_queue; /* overflow */
-         }
-       NdisMoveMemory (l_PacketBuffer->m_Data + l_Index, l_Buffer,
-                       l_BufferLength);
-       l_Index = newlen;
-       NdisGetNextBuffer (l_NDIS_Buffer, &l_NDIS_Buffer);
-      }
-    if (l_Index != l_PacketLength)
-      {
-       NOTE_ERROR ();
-       goto no_queue; /* underflow */
-      }
-
-    DUMP_PACKET ("AdapterTransmit", l_PacketBuffer->m_Data, l_PacketLength);
-
-    //=====================================================
-    // If IPv4 packet, check whether or not packet
-    // was truncated.
-    //=====================================================
-#if PACKET_TRUNCATION_CHECK
-    IPv4PacketSizeVerify (l_PacketBuffer->m_Data, l_PacketLength, FALSE, "TX", 
&l_Adapter->m_TxTrunc);
-#endif
-
-    //=====================================================
-    // Are we running in DHCP server masquerade mode?
-    //
-    // If so, catch both DHCP requests and ARP queries
-    // to resolve the address of our virtual DHCP server.
-    //=====================================================
-    if (l_Adapter->m_dhcp_enabled)
-      {
-       const ETH_HEADER *eth = (ETH_HEADER *) l_PacketBuffer->m_Data;
-       const IPHDR *ip = (IPHDR *) (l_PacketBuffer->m_Data + sizeof 
(ETH_HEADER));
-       const UDPHDR *udp = (UDPHDR *) (l_PacketBuffer->m_Data + sizeof 
(ETH_HEADER) + sizeof (IPHDR));
-
-       // ARP packet?
-       if (l_PacketLength == sizeof (ARP_PACKET)
-           && eth->proto == htons (ETH_P_ARP)
-           && l_Adapter->m_dhcp_server_arp)
-         {
-           if (ProcessARP (l_Adapter,
-                           (PARP_PACKET) l_PacketBuffer->m_Data,
-                           l_Adapter->m_dhcp_addr,
-                           l_Adapter->m_dhcp_server_ip,
-                           ~0,
-                           l_Adapter->m_dhcp_server_mac))
-             goto no_queue;
-         }
-
-       // DHCP packet?
-       else if (l_PacketLength >= sizeof (ETH_HEADER) + sizeof (IPHDR) + 
sizeof (UDPHDR) + sizeof (DHCP)
-                && eth->proto == htons (ETH_P_IP)
-                && ip->version_len == 0x45 // IPv4, 20 byte header
-                && ip->protocol == IPPROTO_UDP
-                && udp->dest == htons (BOOTPS_PORT))
-         {
-           const DHCP *dhcp = (DHCP *) (l_PacketBuffer->m_Data
-                                        + sizeof (ETH_HEADER)
-                                        + sizeof (IPHDR)
-                                        + sizeof (UDPHDR));
-
-           const int optlen = l_PacketLength
-             - sizeof (ETH_HEADER)
-             - sizeof (IPHDR)
-             - sizeof (UDPHDR)
-             - sizeof (DHCP);
-
-           if (optlen > 0) // we must have at least one DHCP option
-             {
-               if (ProcessDHCP (l_Adapter, eth, ip, udp, dhcp, optlen))
-                 goto no_queue;
-             }
-           else
-             goto no_queue;
-         }
-      }
-
-    //===============================================
-    // In Point-To-Point mode, check to see whether
-    // packet is ARP (handled) or IPv4 (sent to app).
-    // IPv6 packets are inspected for neighbour discovery
-    // (to be handled locally), and the rest is forwarded
-    // all other protocols are dropped
-    //===============================================
-    if (l_Adapter->m_tun)
-      {
-       ETH_HEADER *e;
-
-       if (l_PacketLength < ETHERNET_HEADER_SIZE)
-         goto no_queue;
-
-       e = (ETH_HEADER *) l_PacketBuffer->m_Data;
-
-       switch (ntohs (e->proto))
-         {
-         case ETH_P_ARP:
-
-           // Make sure that packet is the
-           // right size for ARP.
-           if (l_PacketLength != sizeof (ARP_PACKET))
-             goto no_queue;
-
-           ProcessARP (l_Adapter,
-                       (PARP_PACKET) l_PacketBuffer->m_Data,
-                       l_Adapter->m_localIP,
-                       l_Adapter->m_remoteNetwork,
-                       l_Adapter->m_remoteNetmask,
-                       l_Adapter->m_TapToUser.dest);
-
-         default:
-           goto no_queue;
-
-         case ETH_P_IP:
-
-           // Make sure that packet is large
-           // enough to be IPv4.
-           if (l_PacketLength
-               < ETHERNET_HEADER_SIZE + IP_HEADER_SIZE)
-             goto no_queue;
-
-           // Only accept directed packets,
-           // not broadcasts.
-           if (memcmp (e, &l_Adapter->m_TapToUser, ETHERNET_HEADER_SIZE))
-             goto no_queue;
-
-           // Packet looks like IPv4, queue it.
-           l_PacketBuffer->m_SizeFlags |= TP_TUN;
-           break;
-
-         case ETH_P_IPV6:
-           // make sure that packet is large
-           // enough to be IPv6
-           if (l_PacketLength
-               < ETHERNET_HEADER_SIZE + IPV6_HEADER_SIZE)
-             goto no_queue;
-
-           // broadcasts and multicasts are handled specially
-           // (to be implemented)
-
-           // neighbor discovery packets to fe80::8 are special
-           // OpenVPN sets this next-hop to signal "handled by tapdrv"
-           if ( HandleIPv6NeighborDiscovery( l_Adapter,
-                                             l_PacketBuffer->m_Data ))
-             {
-               goto no_queue;
-             }
-
-           // Packet looks like IPv6, queue it :-)
-           l_PacketBuffer->m_SizeFlags |= TP_TUN;
-         }
-      }
-
-    //===============================================
-    // Push packet onto queue to wait for read from
-    // userspace.
-    //===============================================
-
-    NdisAcquireSpinLock (&l_Adapter->m_Extension.m_QueueLock);
-
-    result = NULL;
-    if (IS_UP (l_Adapter))
-      result = QueuePush (l_Adapter->m_Extension.m_PacketQueue, 
l_PacketBuffer);
-
-    NdisReleaseSpinLock (&l_Adapter->m_Extension.m_QueueLock);
-
-    if ((TapPacketPointer) result != l_PacketBuffer)
-      {
-       // adapter receive overrun
-       INCREMENT_STAT (l_Adapter->m_TxErr);
-       goto no_queue;
-      }
-    else
-      {
-       INCREMENT_STAT (l_Adapter->m_Tx);
-      }
-
-    //============================================================
-    // Cycle through IRPs and packets, try to satisfy each pending
-    // IRP with a queued packet.
-    //============================================================
-    while (TRUE)
-      {
-       l_IRP = NULL;
-       l_PacketBuffer = NULL;
-
-       NdisAcquireSpinLock (&l_Adapter->m_Extension.m_QueueLock);
-
-       if (IS_UP (l_Adapter)
-           && QueueCount (l_Adapter->m_Extension.m_PacketQueue)
-           && QueueCount (l_Adapter->m_Extension.m_IrpQueue))
-         {
-           l_IRP = (PIRP) QueuePop (l_Adapter->m_Extension.m_IrpQueue);
-           l_PacketBuffer = (TapPacketPointer)
-             QueuePop (l_Adapter->m_Extension.m_PacketQueue);
-         }
-
-       NdisReleaseSpinLock (&l_Adapter->m_Extension.m_QueueLock);
-
-       MYASSERT ((l_IRP != NULL) + (l_PacketBuffer != NULL) != 1);
-
-       if (l_IRP && l_PacketBuffer)
-         {
-           CompleteIRP (l_IRP,
-                        l_PacketBuffer, 
-                        IO_NETWORK_INCREMENT);
-         }
-       else
-         break;
-      }
-  }
-  __except (EXCEPTION_EXECUTE_HANDLER)
-    {
-    }
-
-  return NDIS_STATUS_SUCCESS;
-
- no_queue:
-  NdisFreeMemory (l_PacketBuffer,
-                 TAP_PACKET_SIZE (l_PacketLength),
-                 0);
-  
- exit_success:
-  return NDIS_STATUS_SUCCESS;
-    
- exit_fail:
-  return NDIS_STATUS_FAILURE;
-
- exit_no_resources:
-  return NDIS_STATUS_RESOURCES;
-}
-
-//======================================================================
-// Hooks for catching TAP device IRP's.
-//======================================================================
-
-NTSTATUS
-TapDeviceHook (IN PDEVICE_OBJECT p_DeviceObject, IN PIRP p_IRP)
-{
-  TapAdapterPointer l_Adapter = LookupAdapterInInstanceList (p_DeviceObject);
-  PIO_STACK_LOCATION l_IrpSp;
-  NTSTATUS l_Status = STATUS_SUCCESS;
-  BOOLEAN accessible;
-
-  l_IrpSp = IoGetCurrentIrpStackLocation (p_IRP);
-
-  p_IRP->IoStatus.Status = STATUS_SUCCESS;
-  p_IRP->IoStatus.Information = 0;
-
-  if (!l_Adapter || l_Adapter->m_Extension.m_Halt)
-    {
-      DEBUGP (("TapDeviceHook called when TAP device is halted, 
MajorFunction=%d\n",
-              (int)l_IrpSp->MajorFunction));
-
-      if (l_IrpSp->MajorFunction == IRP_MJ_CLOSE)
-       {
-         IoCompleteRequest (p_IRP, IO_NO_INCREMENT);
-         return STATUS_SUCCESS;
-       }
-      else
-       {
-         p_IRP->IoStatus.Status = STATUS_NO_SUCH_DEVICE;
-         IoCompleteRequest (p_IRP, IO_NO_INCREMENT);
-         return STATUS_NO_SUCH_DEVICE;
-       }
-    }
-
-  switch (l_IrpSp->MajorFunction)
-    {
-      //===========================================================
-      //                 Ioctl call handlers
-      //===========================================================
-    case IRP_MJ_DEVICE_CONTROL:
-      {
-       switch (l_IrpSp->Parameters.DeviceIoControl.IoControlCode)
-         {
-         case TAP_IOCTL_GET_MAC:
-           {
-             if (l_IrpSp->Parameters.DeviceIoControl.OutputBufferLength
-                 >= sizeof (MACADDR))
-               {
-                 COPY_MAC (p_IRP->AssociatedIrp.SystemBuffer,
-                           l_Adapter->m_MAC);
-                 p_IRP->IoStatus.Information = sizeof (MACADDR);
-               }
-             else
-               {
-                 NOTE_ERROR ();
-                 p_IRP->IoStatus.Status = l_Status = STATUS_BUFFER_TOO_SMALL;
-               }
-             break;
-           }
-         case TAP_IOCTL_GET_VERSION:
-           {
-             const ULONG size = sizeof (ULONG) * 3;
-             if (l_IrpSp->Parameters.DeviceIoControl.OutputBufferLength
-                 >= size)
-               {
-                 ((PULONG) (p_IRP->AssociatedIrp.SystemBuffer))[0]
-                   = TAP_DRIVER_MAJOR_VERSION;
-                 ((PULONG) (p_IRP->AssociatedIrp.SystemBuffer))[1]
-                   = TAP_DRIVER_MINOR_VERSION;
-                 ((PULONG) (p_IRP->AssociatedIrp.SystemBuffer))[2]
-#if DBG
-                   = 1;
-#else
-                 = 0;
-#endif
-                 p_IRP->IoStatus.Information = size;
-               }
-             else
-               {
-                 NOTE_ERROR ();
-                 p_IRP->IoStatus.Status = l_Status = STATUS_BUFFER_TOO_SMALL;
-               }
-
-             break;
-           }
-         case TAP_IOCTL_GET_MTU:
-           {
-             const ULONG size = sizeof (ULONG) * 1;
-             if (l_IrpSp->Parameters.DeviceIoControl.OutputBufferLength
-                 >= size)
-               {
-                 ((PULONG) (p_IRP->AssociatedIrp.SystemBuffer))[0]
-                   = l_Adapter->m_MTU;
-                 p_IRP->IoStatus.Information = size;
-               }
-             else
-               {
-                 NOTE_ERROR ();
-                 p_IRP->IoStatus.Status = l_Status = STATUS_BUFFER_TOO_SMALL;
-               }
-
-             break;
-           }
-         case TAP_IOCTL_GET_INFO:
-           {
-             char state[16];
-             if (l_Adapter->m_InterfaceIsRunning)
-               state[0] = 'A';
-             else
-               state[0] = 'a';
-             if (l_Adapter->m_Extension.m_TapIsRunning)
-               state[1] = 'T';
-             else
-               state[1] = 't';
-             state[2] = l_Adapter->m_DeviceState;
-             if (l_Adapter->m_MediaStateAlwaysConnected)
-               state[3] = 'C';
-             else
-               state[3] = 'c';
-             state[4] = '\0';
-
-             p_IRP->IoStatus.Status = l_Status = RtlStringCchPrintfExA (
-               ((LPTSTR) (p_IRP->AssociatedIrp.SystemBuffer)),
-               l_IrpSp->Parameters.DeviceIoControl.OutputBufferLength,
-               NULL,
-               NULL,
-               STRSAFE_FILL_BEHIND_NULL | STRSAFE_IGNORE_NULLS,
-#if PACKET_TRUNCATION_CHECK
-               "State=%s Err=[%s/%d] #O=%d Tx=[%d,%d,%d] Rx=[%d,%d,%d] 
IrpQ=[%d,%d,%d] PktQ=[%d,%d,%d] InjQ=[%d,%d,%d]",
-#else
-               "State=%s Err=[%s/%d] #O=%d Tx=[%d,%d] Rx=[%d,%d] 
IrpQ=[%d,%d,%d] PktQ=[%d,%d,%d] InjQ=[%d,%d,%d]",
-#endif
-               state,
-               g_LastErrorFilename,
-               g_LastErrorLineNumber,
-               (int)l_Adapter->m_Extension.m_NumTapOpens,
-               (int)l_Adapter->m_Tx,
-               (int)l_Adapter->m_TxErr,
-#if PACKET_TRUNCATION_CHECK
-               (int)l_Adapter->m_TxTrunc,
-#endif
-               (int)l_Adapter->m_Rx,
-               (int)l_Adapter->m_RxErr,
-#if PACKET_TRUNCATION_CHECK
-               (int)l_Adapter->m_RxTrunc,
-#endif
-               (int)l_Adapter->m_Extension.m_IrpQueue->size,
-               (int)l_Adapter->m_Extension.m_IrpQueue->max_size,
-               (int)IRP_QUEUE_SIZE,
-               (int)l_Adapter->m_Extension.m_PacketQueue->size,
-               (int)l_Adapter->m_Extension.m_PacketQueue->max_size,
-               (int)PACKET_QUEUE_SIZE,
-               (int)l_Adapter->m_Extension.m_InjectQueue->size,
-               (int)l_Adapter->m_Extension.m_InjectQueue->max_size,
-               (int)INJECT_QUEUE_SIZE
-               );
-
-             p_IRP->IoStatus.Information
-               = l_IrpSp->Parameters.DeviceIoControl.OutputBufferLength;
-
-             break;
-           }
-
-#if DBG
-         case TAP_IOCTL_GET_LOG_LINE:
-           {
-             if (GetDebugLine ((LPTSTR)p_IRP->AssociatedIrp.SystemBuffer,
-                               
l_IrpSp->Parameters.DeviceIoControl.OutputBufferLength))
-               p_IRP->IoStatus.Status = l_Status = STATUS_SUCCESS;
-             else
-               p_IRP->IoStatus.Status = l_Status = STATUS_UNSUCCESSFUL;
-
-             p_IRP->IoStatus.Information
-               = l_IrpSp->Parameters.DeviceIoControl.OutputBufferLength;
-
-             break;
-           }
-#endif
-
-         case TAP_IOCTL_CONFIG_TUN:
-           {
-             if (l_IrpSp->Parameters.DeviceIoControl.InputBufferLength >=
-                 (sizeof (IPADDR) * 3))
-               {
-                 MACADDR dest;
-
-                 l_Adapter->m_tun = FALSE;
-
-                 GenerateRelatedMAC (dest, l_Adapter->m_MAC, 1);
-
-                 l_Adapter->m_localIP =       ((IPADDR*) 
(p_IRP->AssociatedIrp.SystemBuffer))[0];
-                 l_Adapter->m_remoteNetwork = ((IPADDR*) 
(p_IRP->AssociatedIrp.SystemBuffer))[1];
-                 l_Adapter->m_remoteNetmask = ((IPADDR*) 
(p_IRP->AssociatedIrp.SystemBuffer))[2];
-
-                 // sanity check on network/netmask
-                 if ((l_Adapter->m_remoteNetwork & l_Adapter->m_remoteNetmask) 
!= l_Adapter->m_remoteNetwork)
-                   {
-                     NOTE_ERROR ();
-                     p_IRP->IoStatus.Status = l_Status = 
STATUS_INVALID_PARAMETER;
-                     break;
-                   }
-
-                 COPY_MAC (l_Adapter->m_TapToUser.src, l_Adapter->m_MAC);
-                 COPY_MAC (l_Adapter->m_TapToUser.dest, dest);
-                 COPY_MAC (l_Adapter->m_UserToTap.src, dest);
-                 COPY_MAC (l_Adapter->m_UserToTap.dest, l_Adapter->m_MAC);
-
-                 l_Adapter->m_TapToUser.proto = l_Adapter->m_UserToTap.proto = 
htons (ETH_P_IP);
-                 l_Adapter->m_UserToTap_IPv6 = l_Adapter->m_UserToTap;
-                 l_Adapter->m_UserToTap_IPv6.proto = htons(ETH_P_IPV6);
-
-                 l_Adapter->m_tun = TRUE;
-
-                 CheckIfDhcpAndTunMode (l_Adapter);
-
-                 p_IRP->IoStatus.Information = 1; // Simple boolean value
-               }
-             else
-               {
-                 NOTE_ERROR ();
-                 p_IRP->IoStatus.Status = l_Status = STATUS_INVALID_PARAMETER;
-               }
-             
-             break;
-           }
-
-         case TAP_IOCTL_CONFIG_POINT_TO_POINT: // Obsoleted by 
TAP_IOCTL_CONFIG_TUN
-           {
-             if (l_IrpSp->Parameters.DeviceIoControl.InputBufferLength >=
-                 (sizeof (IPADDR) * 2))
-               {
-                 MACADDR dest;
-
-                 l_Adapter->m_tun = FALSE;
-
-                 GenerateRelatedMAC (dest, l_Adapter->m_MAC, 1);
-
-                 l_Adapter->m_localIP =       ((IPADDR*) 
(p_IRP->AssociatedIrp.SystemBuffer))[0];
-                 l_Adapter->m_remoteNetwork = ((IPADDR*) 
(p_IRP->AssociatedIrp.SystemBuffer))[1];
-                 l_Adapter->m_remoteNetmask = ~0;
-
-                 COPY_MAC (l_Adapter->m_TapToUser.src, l_Adapter->m_MAC);
-                 COPY_MAC (l_Adapter->m_TapToUser.dest, dest);
-                 COPY_MAC (l_Adapter->m_UserToTap.src, dest);
-                 COPY_MAC (l_Adapter->m_UserToTap.dest, l_Adapter->m_MAC);
-
-                 l_Adapter->m_TapToUser.proto = l_Adapter->m_UserToTap.proto = 
htons (ETH_P_IP);
-                 l_Adapter->m_UserToTap_IPv6 = l_Adapter->m_UserToTap;
-                 l_Adapter->m_UserToTap_IPv6.proto = htons(ETH_P_IPV6);
-
-                 l_Adapter->m_tun = TRUE;
-
-                 CheckIfDhcpAndTunMode (l_Adapter);
-
-                 p_IRP->IoStatus.Information = 1; // Simple boolean value
-               }
-             else
-               {
-                 NOTE_ERROR ();
-                 p_IRP->IoStatus.Status = l_Status = STATUS_INVALID_PARAMETER;
-               }
-             
-             break;
-           }
-
-         case TAP_IOCTL_SET_MEDIA_STATUS:
-           {
-             if (l_IrpSp->Parameters.DeviceIoControl.InputBufferLength >=
-                 (sizeof (ULONG) * 1))
-               {
-                 ULONG parm = ((PULONG) 
(p_IRP->AssociatedIrp.SystemBuffer))[0];
-                 SetMediaStatus (l_Adapter, (BOOLEAN) parm);
-                 p_IRP->IoStatus.Information = 1;
-               }
-             else
-               {
-                 NOTE_ERROR ();
-                 p_IRP->IoStatus.Status = l_Status = STATUS_INVALID_PARAMETER;
-               }
-             break;
-           }
-
-         case TAP_IOCTL_CONFIG_DHCP_MASQ:
-           {
-             if (l_IrpSp->Parameters.DeviceIoControl.InputBufferLength >=
-                 (sizeof (IPADDR) * 4))
-               {
-                 l_Adapter->m_dhcp_enabled = FALSE;
-                 l_Adapter->m_dhcp_server_arp = FALSE;
-                 l_Adapter->m_dhcp_user_supplied_options_buffer_len = 0;
-
-                 // Adapter IP addr / netmask
-                 l_Adapter->m_dhcp_addr =
-                   ((IPADDR*) (p_IRP->AssociatedIrp.SystemBuffer))[0];
-                 l_Adapter->m_dhcp_netmask =
-                   ((IPADDR*) (p_IRP->AssociatedIrp.SystemBuffer))[1];
-
-                 // IP addr of DHCP masq server
-                 l_Adapter->m_dhcp_server_ip =
-                   ((IPADDR*) (p_IRP->AssociatedIrp.SystemBuffer))[2];
-
-                 // Lease time in seconds
-                 l_Adapter->m_dhcp_lease_time =
-                   ((IPADDR*) (p_IRP->AssociatedIrp.SystemBuffer))[3];
-
-                 GenerateRelatedMAC (l_Adapter->m_dhcp_server_mac, 
l_Adapter->m_MAC, 2);
-
-                 l_Adapter->m_dhcp_enabled = TRUE;
-                 l_Adapter->m_dhcp_server_arp = TRUE;
-
-                 CheckIfDhcpAndTunMode (l_Adapter);
-
-                 p_IRP->IoStatus.Information = 1; // Simple boolean value
-               }
-             else
-               {
-                 NOTE_ERROR ();
-                 p_IRP->IoStatus.Status = l_Status = STATUS_INVALID_PARAMETER;
-               }
-             
-             break;
-           }
-
-         case TAP_IOCTL_CONFIG_DHCP_SET_OPT:
-           {
-             if (l_IrpSp->Parameters.DeviceIoControl.InputBufferLength <=
-                 DHCP_USER_SUPPLIED_OPTIONS_BUFFER_SIZE
-                 && l_Adapter->m_dhcp_enabled)
-               {
-                 l_Adapter->m_dhcp_user_supplied_options_buffer_len = 0;
-
-                 NdisMoveMemory 
(l_Adapter->m_dhcp_user_supplied_options_buffer,
-                                 p_IRP->AssociatedIrp.SystemBuffer,
-                                 
l_IrpSp->Parameters.DeviceIoControl.InputBufferLength);
-                 
-                 l_Adapter->m_dhcp_user_supplied_options_buffer_len = 
-                   l_IrpSp->Parameters.DeviceIoControl.InputBufferLength;
-
-                 p_IRP->IoStatus.Information = 1; // Simple boolean value
-               }
-             else
-               {
-                 NOTE_ERROR ();
-                 p_IRP->IoStatus.Status = l_Status = STATUS_INVALID_PARAMETER;
-               }
-             
-             break;
-           }
-
-         default:
-           {
-             NOTE_ERROR ();
-             p_IRP->IoStatus.Status = l_Status = STATUS_INVALID_PARAMETER;
-             break;
-           }
-         }
-
-       IoCompleteRequest (p_IRP, IO_NO_INCREMENT);
-       break;
-      }
-
-      //===========================================================
-      // User mode thread issued a read request on the tap device
-      // If there are packets waiting to be read, then the request
-      // will be satisfied here. If not, then the request will be
-      // queued and satisfied by any packet that is not used to
-      // satisfy requests ahead of it.
-      //===========================================================
-    case IRP_MJ_READ:
-      {
-       TapPacketPointer l_PacketBuffer;
-       BOOLEAN pending = FALSE;
-
-       // Save IRP-accessible copy of buffer length
-       p_IRP->IoStatus.Information = l_IrpSp->Parameters.Read.Length;
-
-       if (p_IRP->MdlAddress == NULL)
-         {
-           DEBUGP (("[%s] MdlAddress is NULL for IRP_MJ_READ\n",
-                    NAME (l_Adapter)));
-           NOTE_ERROR ();
-           p_IRP->IoStatus.Status = l_Status = STATUS_INVALID_PARAMETER;
-           p_IRP->IoStatus.Information = 0;
-           IoCompleteRequest (p_IRP, IO_NO_INCREMENT);
-           break;
-         }
-       else if ((p_IRP->AssociatedIrp.SystemBuffer =
-                 MmGetSystemAddressForMdlSafe
-                 (p_IRP->MdlAddress, NormalPagePriority)) == NULL)
-         {
-           DEBUGP (("[%s] Could not map address in IRP_MJ_READ\n",
-                    NAME (l_Adapter)));
-           NOTE_ERROR ();
-           p_IRP->IoStatus.Status = l_Status = STATUS_INSUFFICIENT_RESOURCES;
-           p_IRP->IoStatus.Information = 0;
-           IoCompleteRequest (p_IRP, IO_NO_INCREMENT);
-           break;
-         }
-       else if (!l_Adapter->m_InterfaceIsRunning)
-         {
-           DEBUGP (("[%s] Interface is down in IRP_MJ_READ\n",
-                    NAME (l_Adapter)));
-           NOTE_ERROR ();
-           p_IRP->IoStatus.Status = l_Status = STATUS_UNSUCCESSFUL;
-           p_IRP->IoStatus.Information = 0;
-           IoCompleteRequest (p_IRP, IO_NO_INCREMENT);
-           break;
-         }
-
-       //==================================
-       // Can we provide immediate service?
-       //==================================
-
-       l_PacketBuffer = NULL;
-
-       NdisAcquireSpinLock (&l_Adapter->m_Extension.m_QueueLock);
-
-       if (IS_UP (l_Adapter)
-           && QueueCount (l_Adapter->m_Extension.m_PacketQueue)
-           && QueueCount (l_Adapter->m_Extension.m_IrpQueue) == 0)
-         {
-           l_PacketBuffer = (TapPacketPointer)
-             QueuePop (l_Adapter->m_Extension.m_PacketQueue);
-         }
-
-       NdisReleaseSpinLock (&l_Adapter->m_Extension.m_QueueLock);
-
-       if (l_PacketBuffer)
-         {
-           l_Status = CompleteIRP (p_IRP,
-                                   l_PacketBuffer,
-                                   IO_NO_INCREMENT);
-           break;
-         }
-
-       //=============================
-       // Attempt to pend read request
-       //=============================
-
-       NdisAcquireSpinLock (&l_Adapter->m_Extension.m_QueueLock);
-
-       if (IS_UP (l_Adapter)
-           && QueuePush (l_Adapter->m_Extension.m_IrpQueue, p_IRP) == (PIRP) 
p_IRP)
-         {
-           IoSetCancelRoutine (p_IRP, CancelIRPCallback);
-           l_Status = STATUS_PENDING;
-           IoMarkIrpPending (p_IRP);
-           pending = TRUE;
-         }
-
-       NdisReleaseSpinLock (&l_Adapter->m_Extension.m_QueueLock);
-
-       if (pending)
-         break;
-
-       // Can't queue anymore IRP's
-       DEBUGP (("[%s] TAP [%s] read IRP overrun\n",
-                NAME (l_Adapter), l_Adapter->m_Extension.m_TapName));
-       NOTE_ERROR ();
-       p_IRP->IoStatus.Status = l_Status = STATUS_UNSUCCESSFUL;
-       p_IRP->IoStatus.Information = 0;
-       IoCompleteRequest (p_IRP, IO_NO_INCREMENT);
-       break;
-      }
-
-      //==============================================================
-      // User mode issued a WriteFile request on the TAP file handle.
-      // The request will always get satisfied here.  The call may
-      // fail if there are too many pending packets (queue full).
-      //==============================================================
-    case IRP_MJ_WRITE:
-      {
-       if (p_IRP->MdlAddress == NULL)
-         {
-           DEBUGP (("[%s] MdlAddress is NULL for IRP_MJ_WRITE\n",
-                    NAME (l_Adapter)));
-           NOTE_ERROR ();
-           p_IRP->IoStatus.Status = l_Status = STATUS_INVALID_PARAMETER;
-           p_IRP->IoStatus.Information = 0;
-         }
-       else if ((p_IRP->AssociatedIrp.SystemBuffer =
-                 MmGetSystemAddressForMdlSafe
-                 (p_IRP->MdlAddress, NormalPagePriority)) == NULL)
-         {
-           DEBUGP (("[%s] Could not map address in IRP_MJ_WRITE\n",
-                    NAME (l_Adapter)));
-           NOTE_ERROR ();
-           p_IRP->IoStatus.Status = l_Status = STATUS_INSUFFICIENT_RESOURCES;
-           p_IRP->IoStatus.Information = 0;
-         }
-       else if (!l_Adapter->m_InterfaceIsRunning)
-         {
-           DEBUGP (("[%s] Interface is down in IRP_MJ_WRITE\n",
-                    NAME (l_Adapter)));
-           NOTE_ERROR ();
-           p_IRP->IoStatus.Status = l_Status = STATUS_UNSUCCESSFUL;
-           p_IRP->IoStatus.Information = 0;
-         }
-       else if (!l_Adapter->m_tun && ((l_IrpSp->Parameters.Write.Length) >= 
ETHERNET_HEADER_SIZE))
-         {
-           __try
-             {
-               p_IRP->IoStatus.Information = l_IrpSp->Parameters.Write.Length;
-
-               DUMP_PACKET ("IRP_MJ_WRITE ETH",
-                            (unsigned char *) 
p_IRP->AssociatedIrp.SystemBuffer,
-                            l_IrpSp->Parameters.Write.Length);
-
-    //=====================================================
-    // If IPv4 packet, check whether or not packet
-    // was truncated.
-    //=====================================================
-#if PACKET_TRUNCATION_CHECK
-               IPv4PacketSizeVerify ((unsigned char *) 
p_IRP->AssociatedIrp.SystemBuffer,
-                                     l_IrpSp->Parameters.Write.Length,
-                                     FALSE,
-                                     "RX",
-                                     &l_Adapter->m_RxTrunc);
-#endif
-
-               NdisMEthIndicateReceive
-                 (l_Adapter->m_MiniportAdapterHandle,
-                  (NDIS_HANDLE) l_Adapter,
-                  (unsigned char *) p_IRP->AssociatedIrp.SystemBuffer,
-                  ETHERNET_HEADER_SIZE,
-                  (unsigned char *) p_IRP->AssociatedIrp.SystemBuffer + 
ETHERNET_HEADER_SIZE,
-                  l_IrpSp->Parameters.Write.Length - ETHERNET_HEADER_SIZE,
-                  l_IrpSp->Parameters.Write.Length - ETHERNET_HEADER_SIZE);
-               
-               NdisMEthIndicateReceiveComplete 
(l_Adapter->m_MiniportAdapterHandle);
-
-               p_IRP->IoStatus.Status = l_Status = STATUS_SUCCESS;
-             }
-           __except (EXCEPTION_EXECUTE_HANDLER)
-             {
-               DEBUGP (("[%s] NdisMEthIndicateReceive failed in 
IRP_MJ_WRITE\n",
-                        NAME (l_Adapter)));
-               NOTE_ERROR ();
-               p_IRP->IoStatus.Status = l_Status = STATUS_UNSUCCESSFUL;
-               p_IRP->IoStatus.Information = 0;
-             }
-         }
-       else if (l_Adapter->m_tun && ((l_IrpSp->Parameters.Write.Length) >= 
IP_HEADER_SIZE))
-         {
-           __try
-             {
-               ETH_HEADER * p_UserToTap = &l_Adapter->m_UserToTap;
-
-               // for IPv6, need to use ethernet header with IPv6 proto
-               if ( IPH_GET_VER( ((IPHDR*) 
p_IRP->AssociatedIrp.SystemBuffer)->version_len) == 6 )
-                 {
-                   p_UserToTap = &l_Adapter->m_UserToTap_IPv6;
-                 }
-
-               p_IRP->IoStatus.Information = l_IrpSp->Parameters.Write.Length;
-
-               DUMP_PACKET2 ("IRP_MJ_WRITE P2P",
-                             p_UserToTap,
-                             (unsigned char *) 
p_IRP->AssociatedIrp.SystemBuffer,
-                             l_IrpSp->Parameters.Write.Length);
-
-    //=====================================================
-    // If IPv4 packet, check whether or not packet
-    // was truncated.
-    //=====================================================
-#if PACKET_TRUNCATION_CHECK
-               IPv4PacketSizeVerify ((unsigned char *) 
p_IRP->AssociatedIrp.SystemBuffer,
-                                     l_IrpSp->Parameters.Write.Length,
-                                     TRUE,
-                                     "RX",
-                                     &l_Adapter->m_RxTrunc);
-#endif
-
-               NdisMEthIndicateReceive
-                 (l_Adapter->m_MiniportAdapterHandle,
-                  (NDIS_HANDLE) l_Adapter,
-                  (unsigned char *) p_UserToTap,
-                  sizeof (ETH_HEADER),
-                  (unsigned char *) p_IRP->AssociatedIrp.SystemBuffer,
-                  l_IrpSp->Parameters.Write.Length,
-                  l_IrpSp->Parameters.Write.Length);
-
-               NdisMEthIndicateReceiveComplete 
(l_Adapter->m_MiniportAdapterHandle);
-
-               p_IRP->IoStatus.Status = l_Status = STATUS_SUCCESS;
-             }
-           __except (EXCEPTION_EXECUTE_HANDLER)
-             {
-               DEBUGP (("[%s] NdisMEthIndicateReceive failed in IRP_MJ_WRITE 
(P2P)\n",
-                        NAME (l_Adapter)));
-               NOTE_ERROR ();
-               p_IRP->IoStatus.Status = l_Status = STATUS_UNSUCCESSFUL;
-               p_IRP->IoStatus.Information = 0;
-             }
-         }
-       else
-         {
-           DEBUGP (("[%s] Bad buffer size in IRP_MJ_WRITE, len=%d\n",
-                    NAME (l_Adapter),
-                    l_IrpSp->Parameters.Write.Length));
-           NOTE_ERROR ();
-           p_IRP->IoStatus.Information = 0;    // ETHERNET_HEADER_SIZE;
-           p_IRP->IoStatus.Status = l_Status = STATUS_BUFFER_TOO_SMALL;
-         }
-
-       if (l_Status == STATUS_SUCCESS)
-         INCREMENT_STAT (l_Adapter->m_Rx);
-       else
-         INCREMENT_STAT (l_Adapter->m_RxErr);
-
-       IoCompleteRequest (p_IRP, IO_NO_INCREMENT);
-       break;
-      }
-
-      //--------------------------------------------------------------
-      //   User mode thread has called CreateFile() on the tap device
-      //--------------------------------------------------------------
-    case IRP_MJ_CREATE:
-      {
-       BOOLEAN succeeded = FALSE;
-       BOOLEAN mutex_succeeded;
-
-       DEBUGP
-         (("[%s] [TAP] release [%d.%d] open request (m_TapOpens=%d)\n",
-           NAME (l_Adapter), TAP_DRIVER_MAJOR_VERSION,
-           TAP_DRIVER_MINOR_VERSION, l_Adapter->m_Extension.m_TapOpens));
-
-       ACQUIRE_MUTEX_ADAPTIVE (&l_Adapter->m_Extension.m_OpenCloseMutex, 
mutex_succeeded);
-       if (mutex_succeeded)
-         {
-           if (l_Adapter->m_Extension.m_TapIsRunning && 
!l_Adapter->m_Extension.m_TapOpens)
-             {
-               ResetTapAdapterState (l_Adapter);
-               l_Adapter->m_Extension.m_TapOpens = 1;
-               succeeded = TRUE;
-             }
-
-           if (succeeded)
-             {
-               INCREMENT_STAT (l_Adapter->m_Extension.m_NumTapOpens);
-               p_IRP->IoStatus.Status = l_Status = STATUS_SUCCESS;
-               p_IRP->IoStatus.Information = 0;
-             }
-           else
-             {
-               DEBUGP (("[%s] TAP is presently unavailable (m_TapOpens=%d)\n",
-                        NAME (l_Adapter), l_Adapter->m_Extension.m_TapOpens));
-               NOTE_ERROR ();
-               p_IRP->IoStatus.Status = l_Status = STATUS_UNSUCCESSFUL;
-               p_IRP->IoStatus.Information = 0;
-             }
-
-           RELEASE_MUTEX (&l_Adapter->m_Extension.m_OpenCloseMutex);
-         }
-       else
-         {
-           DEBUGP (("[%s] TAP is presently locked (m_TapOpens=%d)\n",
-                    NAME (l_Adapter), l_Adapter->m_Extension.m_TapOpens));
-           NOTE_ERROR ();
-           p_IRP->IoStatus.Status = l_Status = STATUS_UNSUCCESSFUL;
-           p_IRP->IoStatus.Information = 0;
-         }
-       
-       IoCompleteRequest (p_IRP, IO_NO_INCREMENT);
-       break;
-      }
-      
-      //-----------------------------------------------------------
-      //  User mode thread called CloseHandle() on the tap device
-      //-----------------------------------------------------------
-    case IRP_MJ_CLOSE:
-      {
-       BOOLEAN mutex_succeeded;
-
-       DEBUGP (("[%s] [TAP] release [%d.%d] close/cleanup request\n",
-                NAME (l_Adapter), TAP_DRIVER_MAJOR_VERSION,
-                TAP_DRIVER_MINOR_VERSION));
-
-       ACQUIRE_MUTEX_ADAPTIVE (&l_Adapter->m_Extension.m_OpenCloseMutex, 
mutex_succeeded);
-       if (mutex_succeeded)
-         {
-           l_Adapter->m_Extension.m_TapOpens = 0;
-           ResetTapAdapterState (l_Adapter);
-           FlushQueues (&l_Adapter->m_Extension);
-           SetMediaStatus (l_Adapter, FALSE);
-           RELEASE_MUTEX (&l_Adapter->m_Extension.m_OpenCloseMutex);
-         }
-       else
-         {
-           DEBUGP (("[%s] TAP is presently locked (m_TapOpens=%d)\n",
-                    NAME (l_Adapter), l_Adapter->m_Extension.m_TapOpens));
-           NOTE_ERROR ();
-           p_IRP->IoStatus.Status = l_Status = STATUS_UNSUCCESSFUL;
-           p_IRP->IoStatus.Information = 0;
-         }
-       
-       IoCompleteRequest (p_IRP, IO_NO_INCREMENT);
-       break;
-      }
-
-      //------------------
-      // Strange Request
-      //------------------
-    default:
-      {
-       //NOTE_ERROR ();
-       p_IRP->IoStatus.Status = l_Status = STATUS_UNSUCCESSFUL;
-       IoCompleteRequest (p_IRP, IO_NO_INCREMENT);
-       break;
-      }
-    }
-
-  return l_Status;
-}
-
-//=============================================================
-// CompleteIRP is normally called with an adapter -> userspace
-// network packet and an IRP (Pending I/O request) from userspace.
-//
-// The IRP will normally represent a queued overlapped read
-// operation from userspace that is in a wait state.
-//
-// Use the ethernet packet to satisfy the IRP.
-//=============================================================
-
-NTSTATUS
-CompleteIRP (IN PIRP p_IRP,
-            IN TapPacketPointer p_PacketBuffer,
-            IN CCHAR PriorityBoost)
-{
-  NTSTATUS l_Status = STATUS_UNSUCCESSFUL;
-
-  int offset;
-  int len;
-
-  MYASSERT (p_IRP);
-  MYASSERT (p_PacketBuffer);
-
-  IoSetCancelRoutine (p_IRP, NULL);  // Disable cancel routine
-
-  //-------------------------------------------
-  // While p_PacketBuffer always contains a
-  // full ethernet packet, including the
-  // ethernet header, in point-to-point mode,
-  // we only want to return the IPv4
-  // component.
-  //-------------------------------------------
-
-  if (p_PacketBuffer->m_SizeFlags & TP_TUN)
-    {
-      offset = ETHERNET_HEADER_SIZE;
-      len = (int) (p_PacketBuffer->m_SizeFlags & TP_SIZE_MASK) - 
ETHERNET_HEADER_SIZE;
-    }
-  else
-    {
-      offset = 0;
-      len = (p_PacketBuffer->m_SizeFlags & TP_SIZE_MASK);
-    }
-
-  if (len < 0 || (int) p_IRP->IoStatus.Information < len)
-    {
-      p_IRP->IoStatus.Information = 0;
-      p_IRP->IoStatus.Status = STATUS_BUFFER_OVERFLOW;
-      NOTE_ERROR ();
-    }
-  else
-    {
-      p_IRP->IoStatus.Information = len;
-      p_IRP->IoStatus.Status = l_Status = STATUS_SUCCESS;
-
-      __try
-       {
-         NdisMoveMemory (p_IRP->AssociatedIrp.SystemBuffer,
-                         p_PacketBuffer->m_Data + offset,
-                         len);
-       }
-      __except (EXCEPTION_EXECUTE_HANDLER)
-       {
-         NOTE_ERROR ();
-         p_IRP->IoStatus.Status = STATUS_UNSUCCESSFUL;
-         p_IRP->IoStatus.Information = 0;
-       }
-    }
-
-  __try
-    {
-      NdisFreeMemory (p_PacketBuffer,
-                     TAP_PACKET_SIZE (p_PacketBuffer->m_SizeFlags & 
TP_SIZE_MASK),
-                     0);
-    }
-  __except (EXCEPTION_EXECUTE_HANDLER)
-    {
-    }
-  
-  if (l_Status == STATUS_SUCCESS)
-    {
-      IoCompleteRequest (p_IRP, PriorityBoost);
-    }
-  else
-    IoCompleteRequest (p_IRP, IO_NO_INCREMENT);
-
-  return l_Status;
-}
-
-//==============================================
-// IRPs get cancelled for a number of reasons.
-//
-// The TAP device could be closed by userspace
-// when there are still pending read operations.
-//
-// The user could disable the TAP adapter in the
-// network connections control panel, while the
-// device is still open by a process.
-//==============================================
-VOID
-CancelIRPCallback (IN PDEVICE_OBJECT p_DeviceObject,
-                  IN PIRP p_IRP)
-{
-  TapAdapterPointer l_Adapter = LookupAdapterInInstanceList (p_DeviceObject);
-  CancelIRP (l_Adapter ? &l_Adapter->m_Extension : NULL, p_IRP, TRUE);
-}
-
-VOID
-CancelIRP (TapExtensionPointer p_Extension,
-          IN PIRP p_IRP,
-          BOOLEAN callback)
-{
-  BOOLEAN exists = FALSE;
-
-  MYASSERT (p_IRP);
-
-  if (p_Extension)
-    {
-      NdisAcquireSpinLock (&p_Extension->m_QueueLock);
-      exists = (QueueExtract (p_Extension->m_IrpQueue, p_IRP) == p_IRP);
-      NdisReleaseSpinLock (&p_Extension->m_QueueLock);
-    }
-  else
-    exists = TRUE;
-
-  if (exists)
-    {
-      IoSetCancelRoutine (p_IRP, NULL);
-      p_IRP->IoStatus.Status = STATUS_CANCELLED;
-      p_IRP->IoStatus.Information = 0;
-    }
-     
-  if (callback)
-    IoReleaseCancelSpinLock (p_IRP->CancelIrql);
-
-  if (exists)
-    IoCompleteRequest (p_IRP, IO_NO_INCREMENT);
-}
-
-//===========================================
-// Exhaust packet, IRP, and injection queues.
-//===========================================
-VOID
-FlushQueues (TapExtensionPointer p_Extension)
-{
-  PIRP l_IRP;
-  TapPacketPointer l_PacketBuffer;
-  InjectPacketPointer l_InjectBuffer;
-  int n_IRP=0, n_Packet=0, n_Inject=0;
-
-  MYASSERT (p_Extension);
-  MYASSERT (p_Extension->m_TapDevice);
-
-  while (TRUE)
-    {
-      NdisAcquireSpinLock (&p_Extension->m_QueueLock);
-      l_IRP = QueuePop (p_Extension->m_IrpQueue);
-      NdisReleaseSpinLock (&p_Extension->m_QueueLock);
-      if (l_IRP)
-       {
-         ++n_IRP;
-         CancelIRP (NULL, l_IRP, FALSE);
-       }
-      else
-       break;
-    }
-
-  while (TRUE)
-    {
-      NdisAcquireSpinLock (&p_Extension->m_QueueLock);
-      l_PacketBuffer = QueuePop (p_Extension->m_PacketQueue);
-      NdisReleaseSpinLock (&p_Extension->m_QueueLock);
-      if (l_PacketBuffer)
-       {
-         ++n_Packet;
-         MemFree (l_PacketBuffer, TAP_PACKET_SIZE (l_PacketBuffer->m_SizeFlags 
& TP_SIZE_MASK));
-       }
-      else
-       break;
-    }
-
-  while (TRUE)
-    {
-      NdisAcquireSpinLock (&p_Extension->m_InjectLock);
-      l_InjectBuffer = QueuePop (p_Extension->m_InjectQueue);
-      NdisReleaseSpinLock (&p_Extension->m_InjectLock);
-      if (l_InjectBuffer)
-       {
-         ++n_Inject;
-         INJECT_PACKET_FREE(l_InjectBuffer);
-       }
-      else
-       break;
-    }
-
-  DEBUGP ((
-          "[%s] [TAP] FlushQueues n_IRP=[%d,%d,%d] n_Packet=[%d,%d,%d] 
n_Inject=[%d,%d,%d]\n",
-          p_Extension->m_TapName,
-          n_IRP,
-          p_Extension->m_IrpQueue->max_size,
-          IRP_QUEUE_SIZE,
-          n_Packet,
-          p_Extension->m_PacketQueue->max_size,
-          PACKET_QUEUE_SIZE,
-          n_Inject,
-          p_Extension->m_InjectQueue->max_size,
-          INJECT_QUEUE_SIZE
-          ));
-}
-
-//===================================================
-// Tell Windows whether the TAP device should be
-// considered "connected" or "disconnected".
-//===================================================
-VOID
-SetMediaStatus (TapAdapterPointer p_Adapter, BOOLEAN state)
-{
-  if (p_Adapter->m_MediaState != state && 
!p_Adapter->m_MediaStateAlwaysConnected)
-    {
-      if (state)
-       NdisMIndicateStatus (p_Adapter->m_MiniportAdapterHandle,
-                            NDIS_STATUS_MEDIA_CONNECT, NULL, 0);
-      else
-       NdisMIndicateStatus (p_Adapter->m_MiniportAdapterHandle,
-                            NDIS_STATUS_MEDIA_DISCONNECT, NULL, 0);
-
-      NdisMIndicateStatusComplete (p_Adapter->m_MiniportAdapterHandle);
-      p_Adapter->m_MediaState = state;
-    }
-}
-
-
-//======================================================
-// If DHCP mode is used together with tun
-// mode, consider the fact that the P2P remote subnet
-// might enclose the DHCP masq server address.
-//======================================================
-VOID
-CheckIfDhcpAndTunMode (TapAdapterPointer p_Adapter)
-{
-  if (p_Adapter->m_tun && p_Adapter->m_dhcp_enabled)
-    {
-      if ((p_Adapter->m_dhcp_server_ip & p_Adapter->m_remoteNetmask) == 
p_Adapter->m_remoteNetwork)
-       {
-         COPY_MAC (p_Adapter->m_dhcp_server_mac, p_Adapter->m_TapToUser.dest);
-         p_Adapter->m_dhcp_server_arp = FALSE;
-       }
-    }
-}
-
-//===================================================
-// Generate an ARP reply message for specific kinds
-// ARP queries.
-//===================================================
-BOOLEAN
-ProcessARP (TapAdapterPointer p_Adapter,
-           const PARP_PACKET src,
-           const IPADDR adapter_ip,
-           const IPADDR ip_network,
-           const IPADDR ip_netmask,
-           const MACADDR mac)
-{
-  //-----------------------------------------------
-  // Is this the kind of packet we are looking for?
-  //-----------------------------------------------
-  if (src->m_Proto == htons (ETH_P_ARP)
-      && MAC_EQUAL (src->m_MAC_Source, p_Adapter->m_MAC)
-      && MAC_EQUAL (src->m_ARP_MAC_Source, p_Adapter->m_MAC)
-      && MAC_EQUAL (src->m_MAC_Destination, p_Adapter->m_MAC_Broadcast)
-      && src->m_ARP_Operation == htons (ARP_REQUEST)
-      && src->m_MAC_AddressType == htons (MAC_ADDR_TYPE)
-      && src->m_MAC_AddressSize == sizeof (MACADDR)
-      && src->m_PROTO_AddressType == htons (ETH_P_IP)
-      && src->m_PROTO_AddressSize == sizeof (IPADDR)
-      && src->m_ARP_IP_Source == adapter_ip
-      && (src->m_ARP_IP_Destination & ip_netmask) == ip_network
-      && src->m_ARP_IP_Destination != adapter_ip)
-    {
-      ARP_PACKET *arp = (ARP_PACKET *) MemAlloc (sizeof (ARP_PACKET), TRUE);
-      if (arp)
-       {
-         //----------------------------------------------
-         // Initialize ARP reply fields
-         //----------------------------------------------
-         arp->m_Proto = htons (ETH_P_ARP);
-         arp->m_MAC_AddressType = htons (MAC_ADDR_TYPE);
-         arp->m_PROTO_AddressType = htons (ETH_P_IP);
-         arp->m_MAC_AddressSize = sizeof (MACADDR);
-         arp->m_PROTO_AddressSize = sizeof (IPADDR);
-         arp->m_ARP_Operation = htons (ARP_REPLY);
-
-         //----------------------------------------------
-         // ARP addresses
-         //----------------------------------------------      
-         COPY_MAC (arp->m_MAC_Source, mac);
-         COPY_MAC (arp->m_MAC_Destination, p_Adapter->m_MAC);
-         COPY_MAC (arp->m_ARP_MAC_Source, mac);
-         COPY_MAC (arp->m_ARP_MAC_Destination, p_Adapter->m_MAC);
-         arp->m_ARP_IP_Source = src->m_ARP_IP_Destination;
-         arp->m_ARP_IP_Destination = adapter_ip;
-
-         DUMP_PACKET ("ProcessARP",
-                      (unsigned char *) arp,
-                      sizeof (ARP_PACKET));
-
-         InjectPacketDeferred (p_Adapter, (UCHAR *) arp, sizeof (ARP_PACKET));
-
-         MemFree (arp, sizeof (ARP_PACKET));
-       }
-
-      return TRUE;
-    }
-  else
-    return FALSE;
-}
-
-//===============================================================
-// Used in cases where internally generated packets such as
-// ARP or DHCP replies must be returned to the kernel, to be
-// seen as an incoming packet "arriving" on the interface.
-//===============================================================
-
-// Defer packet injection till IRQL < DISPATCH_LEVEL
-VOID
-InjectPacketDeferred (TapAdapterPointer p_Adapter,
-                     UCHAR *packet,
-                     const unsigned int len)
-{
-  InjectPacketPointer l_InjectBuffer;
-  PVOID result;
-
-  if (NdisAllocateMemoryWithTag (&l_InjectBuffer,
-                                INJECT_PACKET_SIZE (len),
-                                'IPAT') == NDIS_STATUS_SUCCESS)
-    {
-      l_InjectBuffer->m_Size = len;
-      NdisMoveMemory (l_InjectBuffer->m_Data, packet, len);
-      NdisAcquireSpinLock (&p_Adapter->m_Extension.m_InjectLock);
-      result = QueuePush (p_Adapter->m_Extension.m_InjectQueue, 
l_InjectBuffer);
-      NdisReleaseSpinLock (&p_Adapter->m_Extension.m_InjectLock);
-      if (result)
-       KeInsertQueueDpc (&p_Adapter->m_Extension.m_InjectDpc, p_Adapter, NULL);
-      else
-       INJECT_PACKET_FREE(l_InjectBuffer);
-    }
-}
-
-// Handle the injection of previously deferred packets
-VOID
-InjectPacketDpc(KDPC *Dpc,
-               PVOID DeferredContext,
-               PVOID SystemArgument1,
-               PVOID SystemArgument2)
-{
-  InjectPacketPointer l_InjectBuffer;
-  TapAdapterPointer l_Adapter = (TapAdapterPointer)SystemArgument1;
-  while (TRUE)
-    {
-      NdisAcquireSpinLock (&l_Adapter->m_Extension.m_InjectLock);
-      l_InjectBuffer = QueuePop (l_Adapter->m_Extension.m_InjectQueue);
-      NdisReleaseSpinLock (&l_Adapter->m_Extension.m_InjectLock);
-      if (l_InjectBuffer)
-       {
-         InjectPacketNow(l_Adapter, l_InjectBuffer->m_Data, 
l_InjectBuffer->m_Size);
-         INJECT_PACKET_FREE(l_InjectBuffer);
-       }
-      else
-       break;
-    }
-}
-
-// Do packet injection now
-VOID
-InjectPacketNow (TapAdapterPointer p_Adapter,
-                UCHAR *packet,
-                const unsigned int len)
-{
-  MYASSERT (len >= ETHERNET_HEADER_SIZE);
-
-  __try
-    {
-      //------------------------------------------------------------
-      // NdisMEthIndicateReceive and NdisMEthIndicateReceiveComplete
-      // could potentially be called reentrantly both here and in
-      // TapDeviceHook/IRP_MJ_WRITE.
-      //
-      // The DDK docs imply that this is okay.
-      //
-      // Note that reentrant behavior could only occur if the
-      // non-deferred version of InjectPacket is used.
-      //------------------------------------------------------------
-      NdisMEthIndicateReceive
-       (p_Adapter->m_MiniportAdapterHandle,
-        (NDIS_HANDLE) p_Adapter,
-        packet,
-        ETHERNET_HEADER_SIZE,
-        packet + ETHERNET_HEADER_SIZE,
-        len - ETHERNET_HEADER_SIZE,
-        len - ETHERNET_HEADER_SIZE);
-      
-      NdisMEthIndicateReceiveComplete (p_Adapter->m_MiniportAdapterHandle);
-    }
-  __except (EXCEPTION_EXECUTE_HANDLER)
-    {
-      DEBUGP (("[%s] NdisMEthIndicateReceive failed in InjectPacketNow\n",
-              NAME (p_Adapter)));
-      NOTE_ERROR ();
-    }
-}
-
-//===================================================================
-// Go back to default TAP mode from Point-To-Point mode.
-// Also reset (i.e. disable) DHCP Masq mode.
-//===================================================================
-VOID ResetTapAdapterState (TapAdapterPointer p_Adapter)
-{
-  // Point-To-Point
-  p_Adapter->m_tun = FALSE;
-  p_Adapter->m_localIP = 0;
-  p_Adapter->m_remoteNetwork = 0;
-  p_Adapter->m_remoteNetmask = 0;
-  NdisZeroMemory (&p_Adapter->m_TapToUser, sizeof (p_Adapter->m_TapToUser));
-  NdisZeroMemory (&p_Adapter->m_UserToTap, sizeof (p_Adapter->m_UserToTap));
-  NdisZeroMemory (&p_Adapter->m_UserToTap_IPv6, sizeof 
(p_Adapter->m_UserToTap_IPv6));
-
-  // DHCP Masq
-  p_Adapter->m_dhcp_enabled = FALSE;
-  p_Adapter->m_dhcp_server_arp = FALSE;
-  p_Adapter->m_dhcp_user_supplied_options_buffer_len = 0;
-  p_Adapter->m_dhcp_addr = 0;
-  p_Adapter->m_dhcp_netmask = 0;
-  p_Adapter->m_dhcp_server_ip = 0;
-  p_Adapter->m_dhcp_lease_time = 0;
-  p_Adapter->m_dhcp_received_discover = FALSE;
-  p_Adapter->m_dhcp_bad_requests = 0;
-  NdisZeroMemory (p_Adapter->m_dhcp_server_mac, sizeof (MACADDR));
-}
-
-#if ENABLE_NONADMIN
-
-//===================================================================
-// Set TAP device handle to be accessible without admin privileges.
-//===================================================================
-VOID AllowNonAdmin (TapExtensionPointer p_Extension)
-{
-  NTSTATUS stat;
-  SECURITY_DESCRIPTOR sd;
-  OBJECT_ATTRIBUTES oa;
-  IO_STATUS_BLOCK isb;
-  HANDLE hand = NULL;
-
-  NdisZeroMemory (&sd, sizeof (sd));
-  NdisZeroMemory (&oa, sizeof (oa));
-  NdisZeroMemory (&isb, sizeof (isb));
-
-  if (!p_Extension->m_CreatedUnicodeLinkName)
-    {
-      DEBUGP (("[TAP] AllowNonAdmin: UnicodeLinkName is uninitialized\n"));
-      NOTE_ERROR ();
-      return;
-    }
-
-  stat = RtlCreateSecurityDescriptor (&sd, SECURITY_DESCRIPTOR_REVISION);
-  if (stat != STATUS_SUCCESS)
-    {
-      DEBUGP (("[TAP] AllowNonAdmin: RtlCreateSecurityDescriptor failed\n"));
-      NOTE_ERROR ();
-      return;
-    }
-
-  InitializeObjectAttributes (
-    &oa,
-    &p_Extension->m_UnicodeLinkName,
-    OBJ_KERNEL_HANDLE,
-    NULL,
-    NULL
-    );
-
-  stat = ZwOpenFile (
-    &hand,
-    WRITE_DAC,
-    &oa,
-    &isb,
-    0,
-    0
-    );
-  if (stat != STATUS_SUCCESS)
-    {
-      DEBUGP (("[TAP] AllowNonAdmin: ZwOpenFile failed, status=0x%08x\n", 
(unsigned int)stat));
-      NOTE_ERROR ();
-      return;
-    }
-
-  stat = ZwSetSecurityObject (hand, DACL_SECURITY_INFORMATION, &sd);
-  if (stat != STATUS_SUCCESS)
-    {
-      DEBUGP (("[TAP] AllowNonAdmin: ZwSetSecurityObject failed\n"));
-      NOTE_ERROR ();
-      return;
-    }
-
-  stat = ZwClose (hand);
-  if (stat != STATUS_SUCCESS)
-    {
-      DEBUGP (("[TAP] AllowNonAdmin: ZwClose failed\n"));
-      NOTE_ERROR ();
-      return;
-    }
-
-  DEBUGP (("[TAP] AllowNonAdmin: SUCCEEDED\n"));
-}
-
-#endif
-
-#if PACKET_TRUNCATION_CHECK
-
-VOID
-IPv4PacketSizeVerify (const UCHAR *data, ULONG length, BOOLEAN tun, const char 
*prefix, LONG *counter)
-{
-  const IPHDR *ip;
-  int len = length;
-
-  if (tun)
-    {
-      ip = (IPHDR *) data;
-    }
-  else
-    {
-      if (length >= sizeof (ETH_HEADER))
-       {
-         const ETH_HEADER *eth = (ETH_HEADER *) data;
-
-         if (eth->proto != htons (ETH_P_IP))
-           return;
-
-         ip = (IPHDR *) (data + sizeof (ETH_HEADER));
-         len -= sizeof (ETH_HEADER);
-       }
-      else
-       return;
-    }
-
-  if (len >= sizeof (IPHDR))
-    {
-      const int totlen = ntohs (ip->tot_len);
-
-      DEBUGP (("[TAP] IPv4PacketSizeVerify %s len=%d totlen=%d\n", prefix, 
len, totlen));
-
-      if (len != totlen)
-       ++(*counter);
-    }
-}
-
-#endif
-
-//======================================================================
-//                                    End of Source
-//======================================================================
diff --git a/tap-win32/types.h b/tap-win32/types.h
deleted file mode 100755
index bdc08e7..0000000
--- a/tap-win32/types.h
+++ /dev/null
@@ -1,178 +0,0 @@
-/*
- *  TAP-Win32/TAP-Win64 -- A kernel driver to provide virtual tap
- *                         device functionality on Windows.
- *
- *  This code was inspired by the CIPE-Win32 driver by Damion K. Wilson.
- *
- *  This source code is Copyright (C) 2002-2010 OpenVPN Technologies, Inc.,
- *  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 version 2
- *  as published by the Free Software Foundation.
- *
- *  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
- */
-
-#ifndef TAP_TYPES_DEFINED
-#define TAP_TYPES_DEFINED
-
-typedef struct _Queue
-{
-  ULONG base;
-  ULONG size;
-  ULONG capacity;
-  ULONG max_size;
-  PVOID data[];
-} Queue;
-
-typedef struct _TapAdapter;
-typedef struct _TapPacket;
-
-typedef union _TapAdapterQuery
-{
-  NDIS_HARDWARE_STATUS m_HardwareStatus;
-  NDIS_MEDIUM m_Medium;
-  NDIS_PHYSICAL_MEDIUM m_PhysicalMedium;
-  UCHAR m_MacAddress [6];
-  UCHAR m_Buffer [256];
-  ULONG m_Long;
-  USHORT m_Short;
-  UCHAR m_Byte;
-}
-TapAdapterQuery, *TapAdapterQueryPointer;
-
-typedef struct _TapExtension
-{
-  // TAP device object and packet queues
-  Queue *m_PacketQueue, *m_IrpQueue;
-  PDEVICE_OBJECT m_TapDevice;
-  NDIS_HANDLE m_TapDeviceHandle;
-  ULONG m_TapOpens;
-
-  // Used to lock packet queues
-  NDIS_SPIN_LOCK m_QueueLock;
-  BOOLEAN m_AllocatedSpinlocks;
-
-  // Used to bracket open/close
-  // state changes.
-  MUTEX m_OpenCloseMutex;
-
-  // True if device has been permanently halted
-  BOOLEAN m_Halt;
-
-  // TAP device name
-  unsigned char *m_TapName;
-  UNICODE_STRING m_UnicodeLinkName;
-  BOOLEAN m_CreatedUnicodeLinkName;
-
-  // Used for device status ioctl only
-  const char *m_LastErrorFilename;
-  int m_LastErrorLineNumber;
-  LONG m_NumTapOpens;
-
-  // Flags
-  BOOLEAN m_TapIsRunning;
-  BOOLEAN m_CalledTapDeviceFreeResources;
-
-  // DPC queue for deferred packet injection
-  BOOLEAN m_InjectDpcInitialized;
-  KDPC m_InjectDpc;
-  NDIS_SPIN_LOCK m_InjectLock;
-  Queue *m_InjectQueue;
-}
-TapExtension, *TapExtensionPointer;
-
-typedef struct _TapPacket
-   {
-#   define TAP_PACKET_SIZE(data_size) (sizeof (TapPacket) + (data_size))
-#   define TP_TUN 0x80000000
-#   define TP_SIZE_MASK      (~TP_TUN)
-    ULONG m_SizeFlags;
-    UCHAR m_Data []; // m_Data must be the last struct member
-   }
-TapPacket, *TapPacketPointer;
-
-typedef struct _InjectPacket
-   {
-#   define INJECT_PACKET_SIZE(data_size) (sizeof (InjectPacket) + (data_size))
-#   define INJECT_PACKET_FREE(ib)  NdisFreeMemory ((ib), INJECT_PACKET_SIZE 
((ib)->m_Size), 0)
-    ULONG m_Size;
-    UCHAR m_Data []; // m_Data must be the last struct member
-   }
-InjectPacket, *InjectPacketPointer;
-
-typedef struct _TapAdapter
-{
-# define NAME(a) ((a)->m_NameAnsi.Buffer)
-  ANSI_STRING m_NameAnsi;
-  MACADDR m_MAC;
-  BOOLEAN m_InterfaceIsRunning;
-  NDIS_HANDLE m_MiniportAdapterHandle;
-  LONG m_Rx, m_Tx, m_RxErr, m_TxErr;
-#if PACKET_TRUNCATION_CHECK
-  LONG m_RxTrunc, m_TxTrunc;
-#endif
-  NDIS_MEDIUM m_Medium;
-  ULONG m_Lookahead;
-  ULONG m_MTU;
-
-  // TRUE if adapter should always be
-  // "connected" even when device node
-  // is not open by a userspace process.
-  BOOLEAN m_MediaStateAlwaysConnected;
-
-  // TRUE if device is "connected"
-  BOOLEAN m_MediaState;
-
-  // Adapter power state
-  char m_DeviceState;
-
-  // Info for point-to-point mode
-  BOOLEAN m_tun;
-  IPADDR m_localIP;
-  IPADDR m_remoteNetwork;
-  IPADDR m_remoteNetmask;
-  ETH_HEADER m_TapToUser;
-  ETH_HEADER m_UserToTap;
-  ETH_HEADER m_UserToTap_IPv6;         // same as UserToTap but proto=ipv6
-  MACADDR m_MAC_Broadcast;
-
-  // Used for DHCP server masquerade
-  BOOLEAN m_dhcp_enabled;
-  IPADDR m_dhcp_addr;
-  ULONG m_dhcp_netmask;
-  IPADDR m_dhcp_server_ip;
-  BOOLEAN m_dhcp_server_arp;
-  MACADDR m_dhcp_server_mac;
-  ULONG m_dhcp_lease_time;
-  UCHAR 
m_dhcp_user_supplied_options_buffer[DHCP_USER_SUPPLIED_OPTIONS_BUFFER_SIZE];
-  ULONG m_dhcp_user_supplied_options_buffer_len;
-  BOOLEAN m_dhcp_received_discover;
-  ULONG m_dhcp_bad_requests;
-
-  // Help to tear down the adapter by keeping
-  // some state information on allocated
-  // resources.
-  BOOLEAN m_CalledAdapterFreeResources;
-  BOOLEAN m_RegisteredAdapterShutdownHandler;
-
-  // Multicast list info
-  NDIS_SPIN_LOCK m_MCLock;
-  BOOLEAN m_MCLockAllocated;
-  ULONG m_MCListSize;
-  MC_LIST m_MCList;
-
-  // Information on the TAP device
-  TapExtension m_Extension;
-} TapAdapter, *TapAdapterPointer;
-
-#endif
diff --git a/tap-windows.h b/tap-windows.h
new file mode 100644
index 0000000..0655672
--- /dev/null
+++ b/tap-windows.h
@@ -0,0 +1,68 @@
+/*
+ *  TAP-Win32/TAP-Win64 -- A kernel driver to provide virtual tap
+ *                         device functionality on Windows.
+ *
+ *  This code was inspired by the CIPE-Win32 driver by Damion K. Wilson.
+ *
+ *  This source code is Copyright (C) 2002-2010 OpenVPN Technologies, Inc.,
+ *  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 version 2
+ *  as published by the Free Software Foundation.
+ *
+ *  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
+ */
+#ifndef __TAP_H
+#define __TAP_H
+
+//=============
+// TAP IOCTLs
+//=============
+
+#define TAP_CONTROL_CODE(request,method) \
+  CTL_CODE (FILE_DEVICE_UNKNOWN, request, method, FILE_ANY_ACCESS)
+
+// Present in 8.1
+
+#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)
+
+// Added in 8.2
+
+/* obsoletes TAP_IOCTL_CONFIG_POINT_TO_POINT */
+#define TAP_IOCTL_CONFIG_TUN            TAP_CONTROL_CODE (10, 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"
+
+#endif
diff --git a/tun.h b/tun.h
index 513257f..ad7b2b1 100644
--- a/tun.h
+++ b/tun.h
@@ -27,7 +27,7 @@

 #ifdef WIN32
 #include <winioctl.h>
-#include "tap-win32/common.h"
+#include <tap-windows.h>
 #endif

 #include "buffer.h"
diff --git a/win/autodefs.h.in b/win/autodefs.h.in
index ad0af19..372eb81 100644
--- a/win/autodefs.h.in
+++ b/win/autodefs.h.in
@@ -6,7 +6,7 @@
  *
  * The TAP-Win32 version number is defined in tap-win32/SOURCES
  */
-#define TAP_ID "@PRODUCT_TAP_ID@"
+#define TAP_COMPONENT_ID "@PRODUCT_TAP_ID@"
 #define TAP_WIN32_MIN_MAJOR @PRODUCT_TAP_WIN32_MIN_MAJOR@
 #define TAP_WIN32_MIN_MINOR @PRODUCT_TAP_WIN32_MIN_MINOR@

-- 
1.7.3.4


Reply via email to