Browse Source

Remove old Windows NDIS5 tap driver -- I think this is dead.

Adam Ierymenko 9 years ago
parent
commit
bacb53fe8f

+ 4 - 4
ext/installfiles/windows/ZeroTier One.aip

@@ -23,10 +23,10 @@
     <ROW Property="CTRLS" Value="2"/>
     <ROW Property="MSIFASTINSTALL" MultiBuildValue="DefaultBuild:2"/>
     <ROW Property="Manufacturer" Value="ZeroTier, Inc."/>
-    <ROW Property="ProductCode" Value="1033:{BBE07631-7B85-4531-A601-B7BAD339AF4D} " Type="16"/>
+    <ROW Property="ProductCode" Value="1033:{53B5409D-BFB0-497A-AFE8-9CB6A003652C} " Type="16"/>
     <ROW Property="ProductLanguage" Value="1033"/>
     <ROW Property="ProductName" Value="ZeroTier One"/>
-    <ROW Property="ProductVersion" Value="1.0.4" Type="32"/>
+    <ROW Property="ProductVersion" Value="1.0.5" Type="32"/>
     <ROW Property="REBOOT" MultiBuildValue="DefaultBuild:ReallySuppress"/>
     <ROW Property="RUNAPPLICATION" Value="1" Type="4"/>
     <ROW Property="SecureCustomProperties" Value="OLDPRODUCTS;AI_NEWERPRODUCTFOUND"/>
@@ -56,7 +56,7 @@
     <ROW Directory="x86_Dir" Directory_Parent="tapwindows_Dir" DefaultDir="x86"/>
   </COMPONENT>
   <COMPONENT cid="caphyon.advinst.msicomp.MsiCompsComponent">
-    <ROW Component="AI_CustomARPName" ComponentId="{BCC96839-1488-49BC-97C4-92E710FB511C}" Directory_="APPDIR" Attributes="4" KeyPath="DisplayName" Options="1"/>
+    <ROW Component="AI_CustomARPName" ComponentId="{7429F569-09E0-4148-99C2-64E125EF156B}" Directory_="APPDIR" Attributes="4" KeyPath="DisplayName" Options="1"/>
     <ROW Component="AI_DisableModify" ComponentId="{020DCABD-5D56-49B9-AF48-F07F0B55E590}" Directory_="APPDIR" Attributes="4" KeyPath="NoModify" Options="1"/>
     <ROW Component="ProductInformation" ComponentId="{DB078D04-EA8E-4A7C-9001-89BAD932F9D9}" Directory_="APPDIR" Attributes="4" KeyPath="Version"/>
     <ROW Component="ZeroTierOne.exe" ComponentId="{18B51525-77BF-4FD9-9C18-A10D4CFC25BA}" Directory_="APPDIR" Attributes="0" KeyPath="ZeroTierOne.exe"/>
@@ -328,7 +328,7 @@
     <ROW XmlAttribute="xsischemaLocation" XmlElement="swidsoftware_identification_tag" Name="xsi:schemaLocation" Flags="14" Order="3" Value="http://standards.iso.org/iso/19770/-2/2008/schema.xsd software_identification_tag.xsd"/>
   </COMPONENT>
   <COMPONENT cid="caphyon.advinst.msicomp.XmlElementComponent">
-    <ROW XmlElement="swidbuild" ParentElement="swidnumeric" Name="swid:build" Condition="1" Order="2" Flags="14" Text="4"/>
+    <ROW XmlElement="swidbuild" ParentElement="swidnumeric" Name="swid:build" Condition="1" Order="2" Flags="14" Text="5"/>
     <ROW XmlElement="swidentitlement_required_indicator" ParentElement="swidsoftware_identification_tag" Name="swid:entitlement_required_indicator" Condition="1" Order="0" Flags="14" Text="false"/>
     <ROW XmlElement="swidmajor" ParentElement="swidnumeric" Name="swid:major" Condition="1" Order="0" Flags="14" Text="1"/>
     <ROW XmlElement="swidminor" ParentElement="swidnumeric" Name="swid:minor" Condition="1" Order="1" Flags="14" Text="0"/>

+ 0 - 385
windows/TapDriver/TapDriver.vcxproj

@@ -1,385 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Win8 Debug|Win32">
-      <Configuration>Win8 Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Win8 Release|Win32">
-      <Configuration>Win8 Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Win7 Debug|Win32">
-      <Configuration>Win7 Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Win7 Release|Win32">
-      <Configuration>Win7 Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Vista Debug|Win32">
-      <Configuration>Vista Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Vista Release|Win32">
-      <Configuration>Vista Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Win8 Debug|x64">
-      <Configuration>Win8 Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Win8 Release|x64">
-      <Configuration>Win8 Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Win7 Debug|x64">
-      <Configuration>Win7 Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Win7 Release|x64">
-      <Configuration>Win7 Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Vista Debug|x64">
-      <Configuration>Vista Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Vista Release|x64">
-      <Configuration>Vista Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
-  <PropertyGroup Label="Globals">
-    <ProjectGuid>{689210B1-467C-4850-BB7D-2E10D5B4A3DA}</ProjectGuid>
-    <TemplateGuid>{1bc93793-694f-48fe-9372-81e2b05556fd}</TemplateGuid>
-    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
-    <MinimumVisualStudioVersion>11.0</MinimumVisualStudioVersion>
-    <Configuration>Win8 Debug</Configuration>
-    <Platform Condition="'$(Platform)' == ''">Win32</Platform>
-  </PropertyGroup>
-  <PropertyGroup Label="Globals">
-    <RootNamespace>TapDriver</RootNamespace>
-    <VCTargetsPath Condition="'$(VCTargetsPath11)' != '' and '$(VisualStudioVersion)' == '11.0'">$(VCTargetsPath11)</VCTargetsPath>
-  </PropertyGroup>
-  <PropertyGroup Label="PropertySheets">
-    <PlatformToolset>WindowsKernelModeDriver8.0</PlatformToolset>
-    <ConfigurationType>Driver</ConfigurationType>
-    <DriverType>KMDF</DriverType>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'" Label="Configuration">
-    <TargetVersion>Windows8</TargetVersion>
-    <UseDebugLibraries>true</UseDebugLibraries>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'" Label="Configuration">
-    <TargetVersion>Windows8</TargetVersion>
-    <UseDebugLibraries>false</UseDebugLibraries>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'" Label="Configuration">
-    <TargetVersion>Windows7</TargetVersion>
-    <UseDebugLibraries>true</UseDebugLibraries>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'" Label="Configuration">
-    <TargetVersion>Windows7</TargetVersion>
-    <UseDebugLibraries>false</UseDebugLibraries>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Vista Debug|Win32'" Label="Configuration">
-    <TargetVersion>Vista</TargetVersion>
-    <UseDebugLibraries>true</UseDebugLibraries>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Vista Release|Win32'" Label="Configuration">
-    <TargetVersion>Vista</TargetVersion>
-    <UseDebugLibraries>false</UseDebugLibraries>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'" Label="Configuration">
-    <TargetVersion>Windows8</TargetVersion>
-    <UseDebugLibraries>true</UseDebugLibraries>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'" Label="Configuration">
-    <TargetVersion>Windows8</TargetVersion>
-    <UseDebugLibraries>false</UseDebugLibraries>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'" Label="Configuration">
-    <TargetVersion>Windows7</TargetVersion>
-    <UseDebugLibraries>true</UseDebugLibraries>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'" Label="Configuration">
-    <TargetVersion>Windows7</TargetVersion>
-    <UseDebugLibraries>false</UseDebugLibraries>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Vista Debug|x64'" Label="Configuration">
-    <TargetVersion>Vista</TargetVersion>
-    <UseDebugLibraries>true</UseDebugLibraries>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Vista Release|x64'" Label="Configuration">
-    <TargetVersion>Vista</TargetVersion>
-    <UseDebugLibraries>false</UseDebugLibraries>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
-  <ImportGroup Label="ExtensionSettings">
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <PropertyGroup Label="UserMacros" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Vista Debug|Win32'">
-    <TargetName>zttap200</TargetName>
-    <OutDir>$(SolutionDir)\Build\$(Platform)\$(ConfigurationName)\</OutDir>
-    <IntDir>$(Platform)\$(ConfigurationName)\</IntDir>
-    <TimeStampServer>http://timestamp.digicert.com/</TimeStampServer>
-  </PropertyGroup>
-  <PropertyGroup>
-    <DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'">
-    <TargetName>zttap200</TargetName>
-    <OutDir>$(SolutionDir)\Build\$(Platform)\$(ConfigurationName)\</OutDir>
-    <IntDir>$(Platform)\$(ConfigurationName)\</IntDir>
-    <TimeStampServer>http://timestamp.digicert.com/</TimeStampServer>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Vista Release|Win32'">
-    <TargetName>zttap200</TargetName>
-    <OutDir>$(SolutionDir)\Build\$(Platform)\$(ConfigurationName)\</OutDir>
-    <IntDir>$(Platform)\$(ConfigurationName)\</IntDir>
-    <TimeStampServer>http://timestamp.digicert.com/</TimeStampServer>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'">
-    <TargetName>zttap200</TargetName>
-    <OutDir>$(SolutionDir)\Build\$(Platform)\$(ConfigurationName)\</OutDir>
-    <IntDir>$(Platform)\$(ConfigurationName)\</IntDir>
-    <TimeStampServer>http://timestamp.digicert.com/</TimeStampServer>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'">
-    <TargetName>zttap200</TargetName>
-    <OutDir>$(SolutionDir)\Build\$(Platform)\$(ConfigurationName)\</OutDir>
-    <IntDir>$(Platform)\$(ConfigurationName)\</IntDir>
-    <TimeStampServer>http://timestamp.digicert.com/</TimeStampServer>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'">
-    <TargetName>zttap200</TargetName>
-    <OutDir>$(SolutionDir)\Build\$(Platform)\$(ConfigurationName)\</OutDir>
-    <IntDir>$(Platform)\$(ConfigurationName)\</IntDir>
-    <TimeStampServer>http://timestamp.digicert.com/</TimeStampServer>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Vista Debug|x64'">
-    <TargetName>zttap200</TargetName>
-    <OutDir>$(SolutionDir)\Build\$(Platform)\$(ConfigurationName)\</OutDir>
-    <TimeStampServer>
-    </TimeStampServer>
-    <DiagnosticMode>true</DiagnosticMode>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'">
-    <TargetName>zttap200</TargetName>
-    <OutDir>$(SolutionDir)\Build\$(Platform)\$(ConfigurationName)\</OutDir>
-    <TimeStampServer>
-    </TimeStampServer>
-    <DiagnosticMode>true</DiagnosticMode>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Vista Release|x64'">
-    <TargetName>zttap200</TargetName>
-    <OutDir>$(SolutionDir)\Build\$(Platform)\$(ConfigurationName)\</OutDir>
-    <TimeStampServer>
-    </TimeStampServer>
-    <DiagnosticMode>true</DiagnosticMode>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'">
-    <TargetName>zttap200</TargetName>
-    <OutDir>$(SolutionDir)\Build\$(Platform)\$(ConfigurationName)\</OutDir>
-    <TimeStampServer>
-    </TimeStampServer>
-    <DiagnosticMode>true</DiagnosticMode>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'">
-    <TargetName>zttap200</TargetName>
-    <OutDir>$(SolutionDir)\Build\$(Platform)\$(ConfigurationName)\</OutDir>
-    <TimeStampServer>
-    </TimeStampServer>
-    <DiagnosticMode>true</DiagnosticMode>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'">
-    <TargetName>zttap200</TargetName>
-    <OutDir>$(SolutionDir)\Build\$(Platform)\$(ConfigurationName)\</OutDir>
-    <TimeStampServer>
-    </TimeStampServer>
-    <DiagnosticMode>true</DiagnosticMode>
-  </PropertyGroup>
-  <ItemDefinitionGroup>
-    <ClCompile>
-      <WppEnabled>false</WppEnabled>
-      <WppScanConfigurationData Condition="'%(ClCompile. ScanConfigurationData)'  == ''">trace.h</WppScanConfigurationData>
-      <WppKernelMode>true</WppKernelMode>
-      <WarningLevel Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'">Level2</WarningLevel>
-      <TreatWarningAsError Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'">false</TreatWarningAsError>
-      <DebugInformationFormat Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'">None</DebugInformationFormat>
-      <DebugInformationFormat Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'">None</DebugInformationFormat>
-      <DebugInformationFormat Condition="'$(Configuration)|$(Platform)'=='Vista Release|Win32'">None</DebugInformationFormat>
-      <WarningLevel Condition="'$(Configuration)|$(Platform)'=='Vista Debug|Win32'">Level2</WarningLevel>
-      <TreatWarningAsError Condition="'$(Configuration)|$(Platform)'=='Vista Debug|Win32'">false</TreatWarningAsError>
-      <WarningLevel Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'">Level2</WarningLevel>
-      <TreatWarningAsError Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'">false</TreatWarningAsError>
-      <WarningLevel Condition="'$(Configuration)|$(Platform)'=='Vista Release|Win32'">Level2</WarningLevel>
-      <TreatWarningAsError Condition="'$(Configuration)|$(Platform)'=='Vista Release|Win32'">false</TreatWarningAsError>
-      <WarningLevel Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'">Level2</WarningLevel>
-      <TreatWarningAsError Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'">false</TreatWarningAsError>
-      <WarningLevel Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'">Level2</WarningLevel>
-      <TreatWarningAsError Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'">false</TreatWarningAsError>
-      <WarningLevel Condition="'$(Configuration)|$(Platform)'=='Vista Debug|x64'">Level2</WarningLevel>
-      <TreatWarningAsError Condition="'$(Configuration)|$(Platform)'=='Vista Debug|x64'">false</TreatWarningAsError>
-      <WarningLevel Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'">Level2</WarningLevel>
-      <TreatWarningAsError Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'">false</TreatWarningAsError>
-      <WarningLevel Condition="'$(Configuration)|$(Platform)'=='Vista Release|x64'">Level2</WarningLevel>
-      <TreatWarningAsError Condition="'$(Configuration)|$(Platform)'=='Vista Release|x64'">false</TreatWarningAsError>
-      <WarningLevel Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'">Level2</WarningLevel>
-      <TreatWarningAsError Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'">false</TreatWarningAsError>
-      <WarningLevel Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'">Level2</WarningLevel>
-      <TreatWarningAsError Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'">false</TreatWarningAsError>
-      <WarningLevel Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'">Level2</WarningLevel>
-      <TreatWarningAsError Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'">false</TreatWarningAsError>
-      <DebugInformationFormat Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'">None</DebugInformationFormat>
-      <DebugInformationFormat Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'">None</DebugInformationFormat>
-      <DebugInformationFormat Condition="'$(Configuration)|$(Platform)'=='Vista Release|x64'">None</DebugInformationFormat>
-    </ClCompile>
-    <Link>
-      <AdditionalDependencies Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'">C:\WinDDK\7600.16385.1\lib\wnet\i386\ndis.lib;C:\WinDDK\7600.16385.1\lib\wnet\i386\ntstrsafe.lib;%(AdditionalDependencies)</AdditionalDependencies>
-    </Link>
-    <Link>
-      <AdditionalDependencies Condition="'$(Configuration)|$(Platform)'=='Vista Debug|Win32'">C:\WinDDK\7600.16385.1\lib\wnet\i386\ndis.lib;C:\WinDDK\7600.16385.1\lib\wnet\i386\ntstrsafe.lib;%(AdditionalDependencies)</AdditionalDependencies>
-    </Link>
-    <Link>
-      <AdditionalDependencies Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'">C:\WinDDK\7600.16385.1\lib\wnet\i386\ndis.lib;C:\WinDDK\7600.16385.1\lib\wnet\i386\ntstrsafe.lib;%(AdditionalDependencies)</AdditionalDependencies>
-    </Link>
-    <Link>
-      <AdditionalDependencies Condition="'$(Configuration)|$(Platform)'=='Vista Release|Win32'">C:\WinDDK\7600.16385.1\lib\wnet\i386\ndis.lib;C:\WinDDK\7600.16385.1\lib\wnet\i386\ntstrsafe.lib;%(AdditionalDependencies)</AdditionalDependencies>
-    </Link>
-    <Link>
-      <AdditionalDependencies Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'">C:\WinDDK\7600.16385.1\lib\wnet\i386\ndis.lib;C:\WinDDK\7600.16385.1\lib\wnet\i386\ntstrsafe.lib;%(AdditionalDependencies)</AdditionalDependencies>
-    </Link>
-    <Link>
-      <AdditionalDependencies Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'">C:\WinDDK\7600.16385.1\lib\wnet\i386\ndis.lib;C:\WinDDK\7600.16385.1\lib\wnet\i386\ntstrsafe.lib;%(AdditionalDependencies)</AdditionalDependencies>
-    </Link>
-    <Link>
-      <AdditionalDependencies Condition="'$(Configuration)|$(Platform)'=='Vista Debug|x64'">C:\WinDDK\7600.16385.1\lib\wnet\amd64\ndis.lib;C:\WinDDK\7600.16385.1\lib\wnet\amd64\ntstrsafe.lib;%(AdditionalDependencies)</AdditionalDependencies>
-    </Link>
-    <Link>
-      <AdditionalDependencies Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'">C:\WinDDK\7600.16385.1\lib\wnet\amd64\ndis.lib;C:\WinDDK\7600.16385.1\lib\wnet\amd64\ntstrsafe.lib;%(AdditionalDependencies)</AdditionalDependencies>
-    </Link>
-    <Link>
-      <AdditionalDependencies Condition="'$(Configuration)|$(Platform)'=='Vista Release|x64'">C:\WinDDK\7600.16385.1\lib\wnet\amd64\ndis.lib;C:\WinDDK\7600.16385.1\lib\wnet\amd64\ntstrsafe.lib;%(AdditionalDependencies)</AdditionalDependencies>
-    </Link>
-    <Link>
-      <AdditionalDependencies Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'">C:\WinDDK\7600.16385.1\lib\wnet\amd64\ndis.lib;C:\WinDDK\7600.16385.1\lib\wnet\amd64\ntstrsafe.lib;%(AdditionalDependencies)</AdditionalDependencies>
-    </Link>
-    <Link>
-      <AdditionalDependencies Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'">C:\WinDDK\7600.16385.1\lib\wnet\amd64\ndis.lib;C:\WinDDK\7600.16385.1\lib\wnet\amd64\ntstrsafe.lib;%(AdditionalDependencies)</AdditionalDependencies>
-    </Link>
-    <Link>
-      <AdditionalDependencies Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'">C:\WinDDK\7600.16385.1\lib\wnet\amd64\ndis.lib;C:\WinDDK\7600.16385.1\lib\wnet\amd64\ntstrsafe.lib;%(AdditionalDependencies)</AdditionalDependencies>
-    </Link>
-    <DriverSign>
-      <FileDigestAlgorithm Condition="'$(Configuration)|$(Platform)'=='Vista Debug|x64'">SHA1</FileDigestAlgorithm>
-      <AdditionalOptions Condition="'$(Configuration)|$(Platform)'=='Vista Debug|x64'">/t "http://timestamp.digicert.com/" /d "ZeroTier One Virtual Network Port" /sha1 5809bb3255b4f32dd93619c1cf26a7df6c282a89</AdditionalOptions>
-    </DriverSign>
-    <DriverSign>
-      <FileDigestAlgorithm Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'">SHA1</FileDigestAlgorithm>
-      <AdditionalOptions Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'">/t "http://timestamp.digicert.com/" /d "ZeroTier One Virtual Network Port" /sha1 5809bb3255b4f32dd93619c1cf26a7df6c282a89</AdditionalOptions>
-    </DriverSign>
-    <DriverSign>
-      <FileDigestAlgorithm Condition="'$(Configuration)|$(Platform)'=='Vista Release|x64'">SHA1</FileDigestAlgorithm>
-      <AdditionalOptions Condition="'$(Configuration)|$(Platform)'=='Vista Release|x64'">/t "http://timestamp.digicert.com/" /d "ZeroTier One Virtual Network Port" /sha1 5809bb3255b4f32dd93619c1cf26a7df6c282a89</AdditionalOptions>
-    </DriverSign>
-    <DriverSign>
-      <FileDigestAlgorithm Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'">SHA1</FileDigestAlgorithm>
-      <AdditionalOptions Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'">/t "http://timestamp.digicert.com/" /d "ZeroTier One Virtual Network Port" /sha1 5809bb3255b4f32dd93619c1cf26a7df6c282a89</AdditionalOptions>
-    </DriverSign>
-    <DriverSign>
-      <FileDigestAlgorithm Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'">SHA1</FileDigestAlgorithm>
-      <AdditionalOptions Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'">/t "http://timestamp.digicert.com/" /d "ZeroTier One Virtual Network Port" /sha1 5809bb3255b4f32dd93619c1cf26a7df6c282a89</AdditionalOptions>
-    </DriverSign>
-    <DriverSign>
-      <FileDigestAlgorithm Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'">SHA1</FileDigestAlgorithm>
-      <AdditionalOptions Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'">/t "http://timestamp.digicert.com/" /d "ZeroTier One Virtual Network Port" /sha1 5809bb3255b4f32dd93619c1cf26a7df6c282a89</AdditionalOptions>
-    </DriverSign>
-  </ItemDefinitionGroup>
-  <ItemGroup>
-    <Inf Include="zttap200.inf" />
-  </ItemGroup>
-  <ItemGroup>
-    <FilesToPackage Include="$(TargetPath)" />
-    <FilesToPackage Include="@(Inf->'%(CopyOutput)')" Condition="'@(Inf)'!=''" />
-  </ItemGroup>
-  <ItemGroup>
-    <ClCompile Include="error.c">
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Vista Debug|Win32'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Vista Release|Win32'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Vista Debug|x64'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Vista Release|x64'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'">true</ExcludedFromBuild>
-    </ClCompile>
-    <ClCompile Include="instance.c">
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Vista Debug|Win32'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Vista Release|Win32'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Vista Debug|x64'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Vista Release|x64'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'">true</ExcludedFromBuild>
-    </ClCompile>
-    <ClCompile Include="macinfo.c">
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Vista Debug|Win32'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Vista Release|Win32'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Vista Debug|x64'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Vista Release|x64'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'">true</ExcludedFromBuild>
-    </ClCompile>
-    <ClCompile Include="mem.c">
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Vista Debug|Win32'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Vista Release|Win32'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Vista Debug|x64'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Vista Release|x64'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'">true</ExcludedFromBuild>
-    </ClCompile>
-    <ClCompile Include="tapdrvr.c" />
-  </ItemGroup>
-  <ItemGroup>
-    <ClInclude Include="config.h" />
-    <ClInclude Include="constants.h" />
-    <ClInclude Include="endian.h" />
-    <ClInclude Include="error.h" />
-    <ClInclude Include="lock.h" />
-    <ClInclude Include="macinfo.h" />
-    <ClInclude Include="proto.h" />
-    <ClInclude Include="prototypes.h" />
-    <ClInclude Include="tap-windows.h" />
-    <ClInclude Include="types.h" />
-  </ItemGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
-  <ImportGroup Label="ExtensionTargets">
-  </ImportGroup>
-</Project>

+ 0 - 75
windows/TapDriver/TapDriver.vcxproj.filters

@@ -1,75 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup>
-    <Filter Include="Source Files">
-      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
-      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
-    </Filter>
-    <Filter Include="Header Files">
-      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
-      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
-    </Filter>
-    <Filter Include="Resource Files">
-      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
-      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
-    </Filter>
-    <Filter Include="Driver Files">
-      <UniqueIdentifier>{8E41214B-6785-4CFE-B992-037D68949A14}</UniqueIdentifier>
-      <Extensions>inf;inv;inx;mof;mc;</Extensions>
-    </Filter>
-  </ItemGroup>
-  <ItemGroup>
-    <ClCompile Include="error.c">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="instance.c">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="macinfo.c">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="mem.c">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="tapdrvr.c">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-  </ItemGroup>
-  <ItemGroup>
-    <ClInclude Include="constants.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="endian.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="error.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="lock.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="macinfo.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="proto.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="prototypes.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="tap-windows.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="types.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="config.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-  </ItemGroup>
-  <ItemGroup>
-    <Inf Include="zttap200.inf">
-      <Filter>Driver Files</Filter>
-    </Inf>
-  </ItemGroup>
-</Project>

+ 0 - 12
windows/TapDriver/config.h

@@ -1,12 +0,0 @@
-#define PRODUCT_NAME			"ZeroTier One Virtual Network Port"
-#define PRODUCT_VERSION			"2.0.0"
-#define PRODUCT_VERSION_RESOURCE	2,0,0,1
-#define PRODUCT_TAP_WIN_COMPONENT_ID	"zttap200"
-#define PRODUCT_TAP_WIN_MAJOR		2
-#define PRODUCT_TAP_WIN_MINOR		0
-#define PRODUCT_TAP_WIN_PROVIDER		"ZeroTier Networks"
-#define PRODUCT_TAP_WIN_DEVICE_DESCRIPTION	PRODUCT_NAME
-#define PRODUCT_TAP_WIN_RELDATE		"01/22/2014"
-
-#define TAP_DRIVER_MAJOR_VERSION PRODUCT_TAP_WIN_MAJOR
-#define TAP_DRIVER_MINOR_VERSION PRODUCT_TAP_WIN_MINOR

+ 0 - 51
windows/TapDriver/constants.h

@@ -1,51 +0,0 @@
-/*
- *  TAP-Windows -- 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             2800 // ZeroTier One MTU
-#define ETHERNET_PACKET_SIZE     (ETHERNET_MTU + ETHERNET_HEADER_SIZE)
-#define DEFAULT_PACKET_LOOKAHEAD (ETHERNET_PACKET_SIZE)
-
-#define NIC_MAX_MCAST_LIST 128  // 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 TAP_LITTLE_ENDIAN      // affects ntohs, htonl, etc. functions

+ 0 - 35
windows/TapDriver/endian.h

@@ -1,35 +0,0 @@
-/*
- *  TAP-Windows -- 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

+ 0 - 387
windows/TapDriver/error.c

@@ -1,387 +0,0 @@
-/*
-*  TAP-Windows -- 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;
-
-#ifdef DBG_PRINT
-				va_start (args, format);
-				vDbgPrintEx (DPFLTR_IHVNETWORK_ID, DPFLTR_INFO_LEVEL, format, args);
-				va_end (args);
-#endif
-				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);
-				va_start (args, format);
-				vDbgPrintEx(DPFLTR_IHVDRIVER_ID , 1, 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);
-
-#if 0
-			// 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;
-			}
-#endif
-
-			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

+ 0 - 88
windows/TapDriver/error.h

@@ -1,88 +0,0 @@
-/*
- *  TAP-Windows -- 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

+ 0 - 241
windows/TapDriver/instance.c

@@ -1,241 +0,0 @@
-/*
-*  TAP-Windows -- 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;
-}

+ 0 - 75
windows/TapDriver/lock.h

@@ -1,75 +0,0 @@
-/*
- *  TAP-Windows -- 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;                                        \
-        }                                                 \
-    }                                                     \
-}

+ 0 - 154
windows/TapDriver/macinfo.c

@@ -1,154 +0,0 @@
-/*
-*  TAP-Windows -- 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;
-}

+ 0 - 38
windows/TapDriver/macinfo.h

@@ -1,38 +0,0 @@
-/*
- *  TAP-Windows -- 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

+ 0 - 186
windows/TapDriver/mem.c

@@ -1,186 +0,0 @@
-/*
-*  TAP-Windows -- 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

+ 0 - 60
windows/TapDriver/proto.h

@@ -1,60 +0,0 @@
-/*
-*  TAP-Windows -- 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)
-
-typedef unsigned char MACADDR [6];
-
-//-----------------
-// 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;
-
-#pragma pack()

+ 0 - 163
windows/TapDriver/prototypes.h

@@ -1,163 +0,0 @@
-/*
- *  TAP-Windows -- 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 SetMediaStatus
-   (
-    TapAdapterPointer p_Adapter,
-    BOOLEAN state
-   );
-
-VOID HookDispatchFunctions();
-
-struct WIN2K_NDIS_MINIPORT_BLOCK
-{
-  unsigned char  opaque[16];
-  UNICODE_STRING MiniportName;       // how mini-port refers to us
-};
-
-#endif

+ 0 - 69
windows/TapDriver/tap-windows.h

@@ -1,69 +0,0 @@
-/*
- *  TAP-Windows -- 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_WIN_H
-#define __TAP_WIN_H
-
-/*
- * =============
- * TAP IOCTLs
- * =============
- */
-
-#define TAP_WIN_CONTROL_CODE(request,method) \
-  CTL_CODE (FILE_DEVICE_UNKNOWN, request, method, FILE_ANY_ACCESS)
-
-#define TAP_WIN_IOCTL_GET_MAC               TAP_WIN_CONTROL_CODE (1, METHOD_BUFFERED)
-#define TAP_WIN_IOCTL_GET_VERSION           TAP_WIN_CONTROL_CODE (2, METHOD_BUFFERED)
-#define TAP_WIN_IOCTL_GET_MTU               TAP_WIN_CONTROL_CODE (3, METHOD_BUFFERED)
-#define TAP_WIN_IOCTL_SET_MEDIA_STATUS      TAP_WIN_CONTROL_CODE (6, METHOD_BUFFERED)
-#define TAP_WIN_IOCTL_GET_LOG_LINE          TAP_WIN_CONTROL_CODE (8, METHOD_BUFFERED)
-#define TAP_WIN_IOCTL_GET_MULTICAST_MEMBERSHIPS TAP_WIN_CONTROL_CODE (11, METHOD_BUFFERED)
-
-// Must be the same as NIC_MAX_MCAST_LIST in constants.h
-#define TAP_MAX_MCAST_LIST 128
-
-// Amount of memory that must be provided to ioctl TAP_WIN_IOCTL_GET_MULTICAST_MEMBERSHIPS
-#define TAP_WIN_IOCTL_GET_MULTICAST_MEMBERSHIPS_OUTPUT_BUF_SIZE (TAP_MAX_MCAST_LIST * 6)
-
-/*
- * =================
- * 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 TAP_WIN_SUFFIX    ".tap"
-
-#endif

+ 0 - 2183
windows/TapDriver/tapdrvr.c

@@ -1,2183 +0,0 @@
-/*
-*  TAP-Windows -- 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_WIN_IOCTL_CONFIG_POINT_TO_POINT or
-// TAP_WIN_IOCTL_CONFIG_TUN ioctl.
-//======================================================
-
-#include "tap-windows.h"
-#include "config.h"
-
-#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
-
-#if defined(DDKVER_MAJOR) && 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 "types.h"
-#include "prototypes.h"
-
-#include "mem.c"
-#include "macinfo.c"
-#include "error.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)
-
-DRIVER_INITIALIZE 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 = (NDIS_MINIPORT_CHARACTERISTICS *)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
-//============================================================
-DRIVER_UNLOAD TapDriverUnload;
-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;
-
-	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;
-					}
-				}
-			}
-		}
-
-		/* 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, (const unsigned char *)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]));
-
-	//====================================
-	// 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;
-
-	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_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_AllocatedSpinlocks)
-	{
-		NdisFreeSpinLock (&p_Extension->m_QueueLock);
-	}
-}
-
-//========================================================================
-//                             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 =
-		(PCHAR)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,
-		TAP_WIN_SUFFIX);
-
-	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,
-		TAP_WIN_SUFFIX);
-
-	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-Windows 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);
-	p_Extension->m_AllocatedSpinlocks = TRUE;
-
-	p_Extension->m_PacketQueue = QueueInit (PACKET_QUEUE_SIZE);
-	p_Extension->m_IrpQueue = QueueInit (IRP_QUEUE_SIZE);
-	if (!p_Extension->m_PacketQueue
-		|| !p_Extension->m_IrpQueue)
-	{
-		DEBUGP (("[%s] couldn't alloc TAP queues\n", p_Name));
-		l_Return = NDIS_STATUS_RESOURCES;
-		goto cleanup;
-	}
-
-	//========================
-	// 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_TAP_WIN_DEVICE_DESCRIPTION;
-		l_QueryLength = strlen (PRODUCT_TAP_WIN_DEVICE_DESCRIPTION) + 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) PRODUCT_TAP_WIN_MAJOR) << 8 | (USHORT)
-			PRODUCT_TAP_WIN_MINOR);
-		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;
-}
-
-//====================================================================
-//                               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);
-
-		//===============================================
-		// 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.
-//======================================================================
-
-DRIVER_DISPATCH TapDeviceHook;
-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;
-	ULONG i,j;
-
-	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_WIN_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_WIN_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_WIN_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;
-				}
-
-#if DBG
-			case TAP_WIN_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
-
-				// Allow ZeroTier One to get multicast memberships at the L2 level in a
-				// protocol-neutral manner.
-			case TAP_WIN_IOCTL_GET_MULTICAST_MEMBERSHIPS:
-				{
-					if (&l_Adapter->m_MCLockAllocated)
-						NdisAcquireSpinLock (&l_Adapter->m_MCLock);
-					if (l_IrpSp->Parameters.DeviceIoControl.OutputBufferLength < TAP_WIN_IOCTL_GET_MULTICAST_MEMBERSHIPS_OUTPUT_BUF_SIZE) {
-						/* output buffer too small */
-						NOTE_ERROR ();
-						p_IRP->IoStatus.Status = l_Status = STATUS_INVALID_PARAMETER;
-					} else {
-						char *out = (char *)p_IRP->AssociatedIrp.SystemBuffer;
-						char *end = out + TAP_WIN_IOCTL_GET_MULTICAST_MEMBERSHIPS_OUTPUT_BUF_SIZE;
-						for(i=0;i<l_Adapter->m_MCListSize;++i) {
-							if (i >= TAP_MAX_MCAST_LIST)
-								break;
-							for(j=0;j<6;++j)
-								*(out++) = l_Adapter->m_MCList.list[i].addr[j];
-							if (out >= end)
-								break;
-						}
-						while (out < end)
-							*(out++) = (char)0;
-						p_IRP->IoStatus.Information
-							= l_IrpSp->Parameters.DeviceIoControl.OutputBufferLength;
-						p_IRP->IoStatus.Status = l_Status = STATUS_SUCCESS;
-					}
-					if (&l_Adapter->m_MCLockAllocated)
-						NdisReleaseSpinLock (&l_Adapter->m_MCLock);
-
-					break;
-				}
-
-			case TAP_WIN_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;
-				}
-
-			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_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);
-
-					NdisMEthIndicateReceive
-						(l_Adapter->m_MiniportAdapterHandle,
-						(NDIS_HANDLE) l_Adapter,
-						(PCHAR)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
-			{
-				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)
-				{
-					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;
-				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;
-
-	MYASSERT (p_Extension);
-	MYASSERT (p_Extension->m_TapDevice);
-
-	while (TRUE)
-	{
-		NdisAcquireSpinLock (&p_Extension->m_QueueLock);
-		l_IRP = (PIRP)QueuePop (p_Extension->m_IrpQueue);
-		NdisReleaseSpinLock (&p_Extension->m_QueueLock);
-		if (l_IRP)
-		{
-			CancelIRP (NULL, l_IRP, FALSE);
-		}
-		else
-			break;
-	}
-
-	while (TRUE)
-	{
-		NdisAcquireSpinLock (&p_Extension->m_QueueLock);
-		l_PacketBuffer = (TapPacketPointer)QueuePop (p_Extension->m_PacketQueue);
-		NdisReleaseSpinLock (&p_Extension->m_QueueLock);
-		if (l_PacketBuffer)
-		{
-			MemFree (l_PacketBuffer, TAP_PACKET_SIZE (l_PacketBuffer->m_SizeFlags & TP_SIZE_MASK));
-		}
-		else
-			break;
-	}
-}
-
-//===================================================
-// 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;
-	}
-}

+ 0 - 137
windows/TapDriver/types.h

@@ -1,137 +0,0 @@
-/*
- *  TAP-Windows -- 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;
-}
-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 _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;
-  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;
-
-  // 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

+ 0 - 78
windows/TapDriver/zttap200.inf

@@ -1,78 +0,0 @@
-[Version]
-Signature="$WINDOWS NT$"
-Class=Net
-ClassGuid={4d36e972-e325-11ce-bfc1-08002be10318}
-Provider=%Provider%
-CatalogFile=zttap200.cat
-
-[Strings]
-DeviceDescription = "ZeroTier One Virtual Network Port"
-Provider = "ZeroTier Networks LLC"
-
-; To build for x86, take NTamd64 off this and off the named section manually, build, then put it back!
-[Manufacturer]
-%Provider%=zttap200,NTamd64
-
-[zttap200]
-%DeviceDescription%=zttap200.ndi,zttap200
-
-[ztTap200.NTamd64]
-%DeviceDescription%=zttap200.ndi,zttap200
-
-[zttap200.ndi]
-CopyFiles       = zttap200.driver,zttap200.files
-AddReg          = zttap200.reg
-AddReg          = zttap200.params.reg
-Characteristics = 0x81
-
-[zttap200.ndi.Services]
-AddService = zttap200,        2, zttap200.service
-
-[zttap200.reg]
-HKR, Ndi,            Service,      0, "zttap200"
-HKR, Ndi\Interfaces, UpperRange,   0, "ndis5"
-HKR, Ndi\Interfaces, LowerRange,   0, "ethernet"
-HKR, ,               Manufacturer, 0, "%Provider%"
-HKR, ,               ProductName,  0, "%DeviceDescription%"
-
-[zttap200.params.reg]
-HKR, Ndi\params\MTU,                  ParamDesc, 0, "MTU"
-HKR, Ndi\params\MTU,                  Type,      0, "int"
-HKR, Ndi\params\MTU,                  Default,   0, "2800"
-HKR, Ndi\params\MTU,                  Optional,  0, "0"
-HKR, Ndi\params\MTU,                  Min,       0, "100"
-HKR, Ndi\params\MTU,                  Max,       0, "2800"
-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"
-
-[zttap200.service]
-DisplayName = %DeviceDescription%
-ServiceType = 1
-StartType = 3
-ErrorControl = 1
-LoadOrderGroup = NDIS
-ServiceBinary = %12%\zttap200.sys
-
-[SourceDisksNames]
-1 = %DeviceDescription%, zttap200.sys
-
-[SourceDisksFiles]
-zttap200.sys = 1
-
-[DestinationDirs]
-zttap200.files  = 11
-zttap200.driver = 12
-
-[zttap200.files]
-;
-
-[zttap200.driver]
-zttap200.sys,,,6     ; COPYFLG_NOSKIP | COPYFLG_NOVERSIONCHECK

+ 0 - 105
windows/ZeroTierOne.sln

@@ -1,8 +1,6 @@
 
 Microsoft Visual Studio Solution File, Format Version 12.00
 # Visual Studio 2012
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TapDriver", "TapDriver\TapDriver.vcxproj", "{689210B1-467C-4850-BB7D-2E10D5B4A3DA}"
-EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ZeroTierOne", "ZeroTierOne\ZeroTierOne.vcxproj", "{B00A4957-5977-4AC1-9EF4-571DC27EADA2}"
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TapDriver6", "TapDriver6\TapDriver6.vcxproj", "{43BA7584-D4DB-4F7C-90FC-E2B18A68A213}"
@@ -70,109 +68,6 @@ Global
 		Win8 Release|x86 = Win8 Release|x86
 	EndGlobalSection
 	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.CD_ROM|Any CPU.ActiveCfg = Vista Release|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.CD_ROM|Mixed Platforms.ActiveCfg = Vista Release|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.CD_ROM|Mixed Platforms.Build.0 = Vista Release|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.CD_ROM|Mixed Platforms.Deploy.0 = Vista Release|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.CD_ROM|Win32.ActiveCfg = Vista Release|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.CD_ROM|Win32.Build.0 = Vista Release|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.CD_ROM|Win32.Deploy.0 = Vista Release|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.CD_ROM|x64.ActiveCfg = Win8 Release|x64
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.CD_ROM|x64.Build.0 = Win8 Release|x64
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.CD_ROM|x64.Deploy.0 = Win8 Release|x64
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.CD_ROM|x86.ActiveCfg = Vista Debug|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Debug|Any CPU.ActiveCfg = Win8 Debug|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Debug|Mixed Platforms.ActiveCfg = Win8 Debug|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Debug|Win32.ActiveCfg = Win7 Debug|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Debug|Win32.Build.0 = Win7 Debug|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Debug|Win32.Deploy.0 = Win7 Debug|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Debug|x64.ActiveCfg = Win7 Debug|x64
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Debug|x64.Build.0 = Win7 Debug|x64
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Debug|x64.Deploy.0 = Win7 Debug|x64
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Debug|x86.ActiveCfg = Vista Debug|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.DVD-5|Any CPU.ActiveCfg = Vista Release|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.DVD-5|Mixed Platforms.ActiveCfg = Vista Release|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.DVD-5|Mixed Platforms.Build.0 = Vista Release|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.DVD-5|Mixed Platforms.Deploy.0 = Vista Release|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.DVD-5|Win32.ActiveCfg = Vista Release|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.DVD-5|Win32.Build.0 = Vista Release|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.DVD-5|Win32.Deploy.0 = Vista Release|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.DVD-5|x64.ActiveCfg = Win8 Release|x64
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.DVD-5|x64.Build.0 = Win8 Release|x64
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.DVD-5|x64.Deploy.0 = Win8 Release|x64
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.DVD-5|x86.ActiveCfg = Vista Debug|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Release|Any CPU.ActiveCfg = Win7 Release|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Release|Mixed Platforms.ActiveCfg = Win7 Release|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Release|Win32.ActiveCfg = Win8 Release|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Release|Win32.Build.0 = Win8 Release|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Release|Win32.Deploy.0 = Win8 Release|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Release|x64.ActiveCfg = Win7 Release|x64
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Release|x64.Build.0 = Win7 Release|x64
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Release|x64.Deploy.0 = Win7 Release|x64
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Release|x86.ActiveCfg = Win8 Release|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.SingleImage|Any CPU.ActiveCfg = Vista Release|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.SingleImage|Mixed Platforms.ActiveCfg = Vista Release|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.SingleImage|Mixed Platforms.Build.0 = Vista Release|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.SingleImage|Mixed Platforms.Deploy.0 = Vista Release|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.SingleImage|Win32.ActiveCfg = Vista Release|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.SingleImage|Win32.Build.0 = Vista Release|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.SingleImage|Win32.Deploy.0 = Vista Release|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.SingleImage|x64.ActiveCfg = Win8 Release|x64
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.SingleImage|x64.Build.0 = Win8 Release|x64
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.SingleImage|x64.Deploy.0 = Win8 Release|x64
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.SingleImage|x86.ActiveCfg = Vista Debug|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Vista Debug|Any CPU.ActiveCfg = Vista Debug|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Vista Debug|Mixed Platforms.ActiveCfg = Vista Debug|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Vista Debug|Win32.ActiveCfg = Vista Debug|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Vista Debug|Win32.Build.0 = Vista Debug|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Vista Debug|Win32.Deploy.0 = Vista Debug|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Vista Debug|x64.ActiveCfg = Vista Debug|x64
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Vista Debug|x64.Build.0 = Vista Debug|x64
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Vista Debug|x64.Deploy.0 = Vista Debug|x64
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Vista Debug|x86.ActiveCfg = Vista Debug|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Vista Release|Any CPU.ActiveCfg = Vista Release|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Vista Release|Mixed Platforms.ActiveCfg = Vista Release|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Vista Release|Win32.ActiveCfg = Vista Release|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Vista Release|Win32.Build.0 = Vista Release|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Vista Release|Win32.Deploy.0 = Vista Release|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Vista Release|x64.ActiveCfg = Vista Release|x64
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Vista Release|x64.Build.0 = Vista Release|x64
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Vista Release|x64.Deploy.0 = Vista Release|x64
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Vista Release|x86.ActiveCfg = Vista Release|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Win7 Debug|Any CPU.ActiveCfg = Win7 Debug|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Win7 Debug|Mixed Platforms.ActiveCfg = Win7 Debug|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Win7 Debug|Win32.ActiveCfg = Win7 Debug|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Win7 Debug|Win32.Build.0 = Win7 Debug|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Win7 Debug|Win32.Deploy.0 = Win7 Debug|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Win7 Debug|x64.ActiveCfg = Win7 Debug|x64
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Win7 Debug|x64.Build.0 = Win7 Debug|x64
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Win7 Debug|x64.Deploy.0 = Win7 Debug|x64
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Win7 Debug|x86.ActiveCfg = Win7 Debug|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Win7 Release|Any CPU.ActiveCfg = Win7 Release|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Win7 Release|Mixed Platforms.ActiveCfg = Win7 Release|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Win7 Release|Win32.ActiveCfg = Win7 Release|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Win7 Release|Win32.Build.0 = Win7 Release|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Win7 Release|Win32.Deploy.0 = Win7 Release|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Win7 Release|x64.ActiveCfg = Win7 Release|x64
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Win7 Release|x86.ActiveCfg = Win7 Release|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Win8 Debug|Any CPU.ActiveCfg = Win8 Debug|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Win8 Debug|Mixed Platforms.ActiveCfg = Win8 Debug|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Win8 Debug|Win32.ActiveCfg = Win8 Debug|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Win8 Debug|Win32.Build.0 = Win8 Debug|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Win8 Debug|Win32.Deploy.0 = Win8 Debug|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Win8 Debug|x64.ActiveCfg = Win8 Debug|x64
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Win8 Debug|x64.Build.0 = Win8 Debug|x64
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Win8 Debug|x64.Deploy.0 = Win8 Debug|x64
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Win8 Debug|x86.ActiveCfg = Win8 Debug|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Win8 Release|Any CPU.ActiveCfg = Win8 Release|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Win8 Release|Mixed Platforms.ActiveCfg = Win8 Release|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Win8 Release|Win32.ActiveCfg = Win8 Release|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Win8 Release|Win32.Build.0 = Win8 Release|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Win8 Release|Win32.Deploy.0 = Win8 Release|Win32
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Win8 Release|x64.ActiveCfg = Win8 Release|x64
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Win8 Release|x64.Build.0 = Win8 Release|x64
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Win8 Release|x64.Deploy.0 = Win8 Release|x64
-		{689210B1-467C-4850-BB7D-2E10D5B4A3DA}.Win8 Release|x86.ActiveCfg = Win8 Release|Win32
 		{B00A4957-5977-4AC1-9EF4-571DC27EADA2}.CD_ROM|Any CPU.ActiveCfg = Release|Win32
 		{B00A4957-5977-4AC1-9EF4-571DC27EADA2}.CD_ROM|Mixed Platforms.ActiveCfg = Release|Win32
 		{B00A4957-5977-4AC1-9EF4-571DC27EADA2}.CD_ROM|Mixed Platforms.Build.0 = Release|Win32