Signed-off-by: Alon Bar-Lev <alon.bar...@gmail.com>
---
 .gitignore                  |    7 +-
 _build.bat                  |   49 +++++++
 build.bat                   |   55 ++++++++
 build/MSCV-VSClass3.cer     |   29 ++++
 build/msvc-generate.js      |  118 +++++++++++++++++
 build/unix2dos.js           |   54 ++++++++
 build/vars.amd64.m4         |    2 +
 build/vars.i386.m4          |    2 +
 build/zip.js                |   74 +++++++++++
 config-env.bat.in           |   12 ++
 configure.bat               |   88 +++++++++++++
 installer/StrStr.nsi        |   47 +++++++
 installer/build.bat         |   88 +++++++++++++
 installer/icon.ico          |  Bin 0 -> 22486 bytes
 installer/install-whirl.bmp |  Bin 0 -> 25820 bytes
 installer/tap-windows.nsi   |  296 +++++++++++++++++++++++++++++++++++++++++++
 src/OemWin2k.inf.in         |  187 +++++++++++++++++++++++++++
 src/SOURCES.in              |    7 +-
 src/config.h.in             |    9 ++
 src/error.c                 |    4 +-
 src/i386/OemWin2k.inf.in    |  195 ----------------------------
 src/resource.rc             |    8 +-
 src/tapdrvr.c               |    9 +-
 version.m4                  |   11 ++
 24 files changed, 1144 insertions(+), 207 deletions(-)
 create mode 100644 _build.bat
 create mode 100644 build.bat
 create mode 100644 build/MSCV-VSClass3.cer
 create mode 100644 build/msvc-generate.js
 create mode 100644 build/unix2dos.js
 create mode 100644 build/vars.amd64.m4
 create mode 100644 build/vars.i386.m4
 create mode 100644 build/zip.js
 create mode 100644 config-env.bat.in
 create mode 100644 configure.bat
 create mode 100755 installer/StrStr.nsi
 create mode 100644 installer/build.bat
 create mode 100755 installer/icon.ico
 create mode 100755 installer/install-whirl.bmp
 create mode 100755 installer/tap-windows.nsi
 create mode 100755 src/OemWin2k.inf.in
 create mode 100644 src/config.h.in
 delete mode 100755 src/i386/OemWin2k.inf.in
 create mode 100644 version.m4

diff --git a/.gitignore b/.gitignore
index 230ee15..f10f92d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,10 +1,15 @@
 *.pdb
 *.sys
 *.map
+*.cat
 *.cod
+*.exe
+*.zip
+tmp
+config-local.m4
+config-env.bat
 src/obj*
 src/amd64
 src/i386
 src/SOURCES
-src/i386/OemWin2k.inf
 src/config.h
diff --git a/_build.bat b/_build.bat
new file mode 100644
index 0000000..718feb2
--- /dev/null
+++ b/_build.bat
@@ -0,0 +1,49 @@
+@echo off
+rem TAP-Windows -- A kernel driver to provide virtual tap
+rem                 device functionality on Windows.
+rem
+rem  Copyright (C) 2012      Alon Bar-Lev <alon.bar...@gmail.com>
+rem
+rem  This program is free software; you can redistribute it and/or modify
+rem  it under the terms of the GNU General Public License as published by
+rem  the Free Software Foundation; either version 2 of the License, or
+rem  (at your option) any later version.
+rem
+rem  This program is distributed in the hope that it will be useful,
+rem  but WITHOUT ANY WARRANTY; without even the implied warranty of
+rem  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+rem  GNU General Public License for more details.
+rem
+rem  You should have received a copy of the GNU General Public License
+rem  along with this program (see the file COPYING included with this
+rem  distribution); if not, write to the Free Software Foundation, Inc.,
+rem  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+setlocal enableextensions enabledelayedexpansion
+
+set root=%cd%
+set myos=%1
+set myprofile=%2
+set mymode=fre
+
+echo Building %myos%-%myprofile%-%mymode%
+
+call "%DDK%\bin\setenv" %DDK% %mymode% %myprofile% %myos% no_oacr
+if errorlevel 1 goto error
+
+cd /d %root%
+cd src
+nmake
+if errorlevel 1 goto error
+
+set rc=0
+goto end
+
+:error
+echo FAIL %myos%-%myprofile%-%mymode%
+set rc=1
+goto end
+
+:end
+
+endlocal
diff --git a/build.bat b/build.bat
new file mode 100644
index 0000000..839be8c
--- /dev/null
+++ b/build.bat
@@ -0,0 +1,55 @@
+@echo off
+rem TAP-Windows -- A kernel driver to provide virtual tap
+rem                 device functionality on Windows.
+rem
+rem  Copyright (C) 2012      Alon Bar-Lev <alon.bar...@gmail.com>
+rem
+rem  This program is free software; you can redistribute it and/or modify
+rem  it under the terms of the GNU General Public License as published by
+rem  the Free Software Foundation; either version 2 of the License, or
+rem  (at your option) any later version.
+rem
+rem  This program is distributed in the hope that it will be useful,
+rem  but WITHOUT ANY WARRANTY; without even the implied warranty of
+rem  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+rem  GNU General Public License for more details.
+rem
+rem  You should have received a copy of the GNU General Public License
+rem  along with this program (see the file COPYING included with this
+rem  distribution); if not, write to the Free Software Foundation, Inc.,
+rem  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+cd %0\..
+
+if not exist config-env.bat (
+       echo please run configure
+       exit /b 1
+)
+
+setlocal
+
+call config-env.bat
+
+for /d %%d in (src\obj*) do rmdir /q /s %%d > nul 2>&1
+for %%f in (src\amd64\*.sys src\i386\*.sys) do del /s %%f > nul 2>&1
+
+cmd /c _build WXP x86
+if errorlevel 1 goto error
+cmd /c _build WIN7 x64
+if errorlevel 1 goto error
+
+call installer\build
+
+set rc=0
+goto end
+
+:error
+echo FAIL
+set rc=1
+goto end
+
+:end
+
+endlocal
+
+exit /b %rc%
diff --git a/build/MSCV-VSClass3.cer b/build/MSCV-VSClass3.cer
new file mode 100644
index 0000000..78eae54
--- /dev/null
+++ b/build/MSCV-VSClass3.cer
@@ -0,0 +1,29 @@
+-----BEGIN CERTIFICATE-----
+MIIFAzCCAuugAwIBAgIKYQwSBgAAAAAAGzANBgkqhkiG9w0BAQUFADB/MQswCQYD
+VQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEe
+MBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSkwJwYDVQQDEyBNaWNyb3Nv
+ZnQgQ29kZSBWZXJpZmljYXRpb24gUm9vdDAeFw0wNjA1MjMxNzAxMjlaFw0xNjA1
+MjMxNzExMjlaMF8xCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5j
+LjE3MDUGA1UECxMuQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9u
+IEF1dGhvcml0eTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAyVxZnvIbigEU
+tBDfBEDb41evakVAj4QMC9Ez2dkRz+4CWB8l9yqoRAWq7AMfeH+ek7maAKojfdas
+haJjRcdyJ8z0TMZ1cdI5709C8HXfCpDGjiBvmA/4rCNfcCk2pMmG57GaIMtTpYXn
+Pb59mv4kRTPcdhXtD6JxZExlLoFoRacCAwEAAaOCASMwggEfMBEGA1UdIAQKMAgw
+BgYEVR0gADA2BgkrBgEEAYI3FQcEKTAnBh8rBgEEAYI3FQiN4NGJToTXnMMHhqaG
++xyP07+mFQEZAgFuAgEAMAsGA1UdDwQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0G
+A1UdDgQWBBTif3vYd9Xfngo/nrTLDi6p79tpdzAdBgkrBgEEAYI3FAIEEB4OAEMA
+cgBvAHMAcwBDAEEwHwYDVR0jBBgwFoAUYvsKIVt/Q24R2glUUGv10pZx8Z4wVQYD
+VR0fBE4wTDBKoEigRoZEaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraS9jcmwv
+cHJvZHVjdHMvTWljcm9zb2Z0Q29kZVZlcmlmUm9vdC5jcmwwDQYJKoZIhvcNAQEF
+BQADggIBAAHkRrM7RX91E4d+X0PeRo7Lir22R0G8zMx0kdjOOVGVpKa1R8Dv0tp7
+j1cR9DKMfM0/7kLaBCFK98hDiEpvXMoU/EvRn0y91FVuzAK+DaaIj4YJuqQlveiw
+8PqLcU5nsMuCqNeOVfc36/A+iO/k4Ir9HG4uYUFIdbSwLB0o2EkP1xXwJHMlPMyI
+DN4oTGVU/l6ujOoZrSxRsps6R/U8gDUBF+JJh9ZUSvtLqwe8v315z781AFy7ns/8
+gokbOaBRl7bewLMH/0SWRMA0Khlcq+7wO+wpTrUTxTeFfnXVtNYNBm610mwjcWfq
+8XGOr050qgz57L9MWPpekJttOcuGiD+LHKgWMtX+bbnx+LPq15H2Nkd4wCcqFcdo
+1vTF/E9OyGc/EC1An/EeyWFI56cD/DFzDPBGiP5W2kkple8J2qPlvu9g7NlUoFmc
+KL1U72YVf4dMhNumDpVnLlF7NDm2QcKMhGgm3CQCCeeBjgqXLe/up7mYpg+BjccQ
+teHtmC9Ib1OFSWR4m+xdrJcLVSbD77qNyNGlL1p/k2thGjObGLiiYhDeJOp24S9D
+6+zdfBI0JInaKFWu5XVOMStnY7ao16tzCgPOxepZP8frKkWuqGJbLwCZOau0X3PD
+COyAEY9HDo8qE0PhkQZiVbv/uj2pqT0mD67KfWKLFVWJ1pQ0TdZl
+-----END CERTIFICATE-----
diff --git a/build/msvc-generate.js b/build/msvc-generate.js
new file mode 100644
index 0000000..d9564cf
--- /dev/null
+++ b/build/msvc-generate.js
@@ -0,0 +1,118 @@
+/*
+ * msvc-generate.js  - string transformation
+ *
+ * Copyright (C) 2008-2012 Alon Bar-Lev <alon.bar...@gmail.com>
+ *
+ * BSD License
+ * ============
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ *     o Redistributions of source code must retain the above copyright notice,
+ *       this list of conditions and the following disclaimer.
+ *     o Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in the
+ *       documentation and/or other materials provided with the distribution.
+ *     o Neither the name of the Alon Bar-Lev nor the names of its
+ *       contributors may be used to endorse or promote products derived from
+ *       this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+var ForReading = 1;
+var fso = new ActiveXObject("Scripting.FileSystemObject");
+var input = "nul";
+var output = "nul";
+var files = new Array();
+var env = new Array();
+
+function initialize() {
+       for (var i=0;i<WScript.Arguments.length;i++) {
+               var arg = WScript.Arguments(i);
+               if (arg.match(/^--input=(.*)$/)) {
+                       input=RegExp.$1;
+               }
+               else if (arg.match(/^--output=(.*)$/)) {
+                       output=RegExp.$1;
+               }
+               else if (arg.match(/^--config=(.*)$/)) {
+                       files.push(RegExp.$1);
+               }
+               else if (arg.match(/^--var=([^=]*)=(.*)$/)) {
+                       env[RegExp.$1] = RegExp.$2;
+               }
+       }
+}
+
+function process_config(vars, file) {
+       try {
+               var fin = fso.OpenTextFile(file, ForReading);
+
+               while (!fin.AtEndOfStream) {
+                       var content = fin.ReadLine();
+                       if (content.match(/^[ \t]*define\(\[(.*)\],[ 
\t]*\[(.*)\]\)[ \t]*/)) {
+                               vars[RegExp.$1] = RegExp.$2;
+                       }
+               }
+       }
+       catch(e) {
+               throw new Error(1, "Cannot process '" + file + "'.");
+       }
+}
+
+function process_file(vars, input, output) {
+       var fin = fso.OpenTextFile(input, ForReading);
+       var fout = fso.CreateTextFile(output);
+       var content = fin.ReadAll();
+
+       for (var i in vars) {
+               content = content.replace(new RegExp("@"+i+"@", "g"), vars[i]);
+       }
+
+       fout.Write(content);
+}
+
+function build_vars() {
+       var vars = new Array();
+       for (var f in files) {
+               process_config(vars, files[f]);
+       }
+       for (var e in env) {
+               vars[e] = env[e];
+       }
+       return vars;
+}
+
+function main() {
+       try {
+               initialize();
+
+               var vars = build_vars();
+
+               process_file(
+                       vars,
+                       input,
+                       output
+               );
+
+               WScript.Quit(0);
+       }
+       catch(e) {
+               WScript.Echo("ERROR: when procssing " + output + ": " + 
e.description);
+               WScript.Quit(1);
+       }
+}
+
+main();
diff --git a/build/unix2dos.js b/build/unix2dos.js
new file mode 100644
index 0000000..51ee7c9
--- /dev/null
+++ b/build/unix2dos.js
@@ -0,0 +1,54 @@
+/*
+ * unix2dos.js  - a simple unix2dos implementation in jscript.
+ *
+ * Copyright (C) 2008-2012 Alon Bar-Lev <alon.bar...@gmail.com>
+ *
+ * BSD License
+ * ============
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ *     o Redistributions of source code must retain the above copyright notice,
+ *       this list of conditions and the following disclaimer.
+ *     o Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in the
+ *       documentation and/or other materials provided with the distribution.
+ *     o Neither the name of the Alon Bar-Lev nor the names of its
+ *       contributors may be used to endorse or promote products derived from
+ *       this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+var ForReading = 1;
+
+try {
+       var fso = new ActiveXObject("Scripting.FileSystemObject");
+       for (var i=0;i<WScript.Arguments.length;i++) {
+               var file = WScript.Arguments(i);
+               var tmp = file+".tmp";
+               var fin = fso.OpenTextFile(file, ForReading);
+               var fout = fso.CreateTextFile(tmp);
+               fout.Write(fin.ReadAll().replace(/\n/g, "\r\n"));
+               fin.Close();
+               fout.Close();
+               fso.DeleteFile(file);
+               fso.MoveFile(tmp, file);
+       }
+       WScript.Quit(0);
+}
+catch(e) {
+       WScript.Echo("ERROR: " + e.description);
+       WScript.Quit(1);
+}
diff --git a/build/vars.amd64.m4 b/build/vars.amd64.m4
new file mode 100644
index 0000000..2613250
--- /dev/null
+++ b/build/vars.amd64.m4
@@ -0,0 +1,2 @@
+define([INF_PROVIDER_SUFFIX], [, NTamd64])
+define([INF_SECTION_SUFFIX], [.NTamd64])
diff --git a/build/vars.i386.m4 b/build/vars.i386.m4
new file mode 100644
index 0000000..9bd4d31
--- /dev/null
+++ b/build/vars.i386.m4
@@ -0,0 +1,2 @@
+define([INF_PROVIDER_SUFFIX], [])
+define([INF_SECTION_SUFFIX], [])
diff --git a/build/zip.js b/build/zip.js
new file mode 100644
index 0000000..6550d8a
--- /dev/null
+++ b/build/zip.js
@@ -0,0 +1,74 @@
+/*
+ * zip.js  - a simple zip implementation in jscript.
+ *
+ * Copyright (C) 2008-2012 Alon Bar-Lev <alon.bar...@gmail.com>
+ *
+ * BSD License
+ * ============
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ *     o Redistributions of source code must retain the above copyright notice,
+ *       this list of conditions and the following disclaimer.
+ *     o Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in the
+ *       documentation and/or other materials provided with the distribution.
+ *     o Neither the name of the Alon Bar-Lev nor the names of its
+ *       contributors may be used to endorse or promote products derived from
+ *       this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+var ForReading = 0;
+var ForWriting = 1;
+var fso = new ActiveXObject("Scripting.FileSystemObject");
+
+function zip(source, destination) {
+       try {
+               var f = OpenTextFile(destination, ForReading);
+               f.Close();
+       }
+       catch(e) {
+               var f = fso.CreateTextFile(destination, ForWriting);
+               var zipheader = "PK" + String.fromCharCode(5) + 
String.fromCharCode(6);
+               for (var i=0;i<18;i++) {
+                       zipheader += String.fromCharCode(0);
+               }
+               f.Write(zipheader);
+               f.Close();
+       }
+
+       var shell = new ActiveXObject("Shell.Application");
+       var source = shell.NameSpace(fso.GetAbsolutePathName(source));
+       var destination = shell.NameSpace(fso.GetAbsolutePathName(destination));
+       
+       destination.CopyHere(source.Items(), 4);
+       while(source.Items().Count != destination.Items().Count) {
+               WScript.Sleep(1000);
+       }
+}
+
+var index = 0;
+var source = WScript.Arguments(index++);
+var destination = WScript.Arguments(index++);
+try {
+       zip(source, destination);
+       WScript.Quit(0);
+}
+catch(e) {
+       WScript.Echo("ERROR: Cannot zip '" + destination + "'.");
+       WScript.Quit(1);
+}
+
diff --git a/config-env.bat.in b/config-env.bat.in
new file mode 100644
index 0000000..ed38c15
--- /dev/null
+++ b/config-env.bat.in
@@ -0,0 +1,12 @@
+set DDK=@DDK@
+set DEVCON32=@DEVCON32@
+set DEVCON64=@DEVCON64@
+set DEVCON_BASENAME=@DEVCON_BASENAME@
+set SIGNTOOL=@SIGNTOOL@
+set MAKENSIS=@MAKENSIS@
+set CODESIGN_PKCS12=@CODESIGN_PKCS12@
+set CODESIGN_PASS=@CODESIGN_PASS@
+set PRODUCT_TAP_WIN_COMPONENT_ID=@PRODUCT_TAP_WIN_COMPONENT_ID@
+set PRODUCT_NAME=@PRODUCT_NAME@
+set PRODUCT_VERSION=@PRODUCT_VERSION@
+set OUTDIR=@OUTDIR@
diff --git a/configure.bat b/configure.bat
new file mode 100644
index 0000000..8673d5a
--- /dev/null
+++ b/configure.bat
@@ -0,0 +1,88 @@
+@echo off
+rem TAP-Windows -- A kernel driver to provide virtual tap
+rem                 device functionality on Windows.
+rem
+rem  Copyright (C) 2012      Alon Bar-Lev <alon.bar...@gmail.com>
+rem
+rem  This program is free software; you can redistribute it and/or modify
+rem  it under the terms of the GNU General Public License as published by
+rem  the Free Software Foundation; either version 2 of the License, or
+rem  (at your option) any later version.
+rem
+rem  This program is distributed in the hope that it will be useful,
+rem  but WITHOUT ANY WARRANTY; without even the implied warranty of
+rem  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+rem  GNU General Public License for more details.
+rem
+rem  You should have received a copy of the GNU General Public License
+rem  along with this program (see the file COPYING included with this
+rem  distribution); if not, write to the Free Software Foundation, Inc.,
+rem  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+cd %0\..
+
+if "%1"=="--help" (
+       echo %0
+       echo Environment:
+       echo     DDK               DDK home
+       echo     SIGNTOOL          signtool, default from DDK
+       echo     DEVCON32          devcon, default from DDK
+       echo     DEVCON64          devcon, default from DDK
+       echo     MAKENSIS          nullsoft installer
+       echo     CODESIGN_PKCS12   Code sign PKCS#12 optional
+       echo     CODESIGN_PASS     Code sign password
+       echo     OUTDIR            Output directory
+       exit /b 1
+)
+
+setlocal
+
+if "%DDK%"=="" for /d %%f in (c:\WINDDK\*) do set DDK=%%f
+
+if "%DDK%"=="" (
+       echo cannot find ddk
+       goto error
+)
+
+if "%SIGNTOOL%"=="" set SIGNTOOL=%DDK%\bin\x86\signtool.exe
+if "%DEVCON32%"=="" set DEVCON32=%DDK%\tools\devcon\i386\devcon.exe
+if "%DEVCON64%"=="" set DEVCON64=%DDK%\tools\devcon\amd64\devcon.exe
+for /f %%f in ("%DEVCON32%") do set DEVCON_BASENAME=%%~nf%%~xf
+
+if "%MAKENSIS%"=="" for /d %%f in ("%ProgramFiles%\NSIS" 
"%ProgramFiles(x86)%\NSIS") do if exist "%%f" set MAKENSIS=%%~f
+
+if "%MAKENSIS%"=="" (
+       echo cannot find nsis
+       goto error
+)
+
+if "%OUTDIR%"=="" set OUTDIR=%cd%
+
+set msvcg_args=cscript //nologo build/msvc-generate.js --config=version.m4
+if exist config-local.m4 set msvcg_args=%msvcg_args% --config=config-local.m4
+set msvcg_args=%msvcg_args% --var=DDK="%DDK%" --var=MAKENSIS="%MAKENSIS%" 
--var=SIGNTOOL="%SIGNTOOL%" --var=DEVCON32="%DEVCON32%" 
--var=DEVCON64="%DEVCON64%" --var=DEVCON_BASENAME="%DEVCON_BASENAME%" 
--var=EXTRA_C_DEFINES="%EXTRA_C_DEFINES%" 
--var=CODESIGN_PKCS12="%CODESIGN_PKCS12%" --var=CODESIGN_PASS="%CODESIGN_PASS%" 
--var=OUTDIR="%OUTDIR%"
+
+for %%f in (config-env.bat src\SOURCES src\config.h) do (
+       %msvcg_args% --input=%%f.in --output=%%f
+       if errorlevel 1 goto error
+)
+
+for %%a in (i386 amd64) do (
+       mkdir src\%%a > nul 2>&1
+       %msvcg_args% --config=build\vars.%%a.m4 --input=src\OemWin2k.inf.in 
--output=src\%%a\OemWin2k.inf
+       if errorlevel 1 goto error
+)
+
+set rc=0
+goto end
+
+:error
+echo FAILED
+set rc=1
+goto end
+
+:end
+
+endlocal
+
+exit /b %rc%
diff --git a/installer/StrStr.nsi b/installer/StrStr.nsi
new file mode 100755
index 0000000..0bad0f2
--- /dev/null
+++ b/installer/StrStr.nsi
@@ -0,0 +1,47 @@
+;====================================================
+; StrStr - Finds a given string in another given string.
+;               Returns -1 if not found and the pos if found.
+;          Input: head of the stack - string to find
+;                      second in the stack - string to find in
+;          Output: head of the stack
+;====================================================
+!macro StrStr un
+Function ${un}StrStr
+  Push $0
+  Exch
+  Pop $0 ; $0 now have the string to find
+  Push $1
+  Exch 2
+  Pop $1 ; $1 now have the string to find in
+  Exch
+  Push $2
+  Push $3
+  Push $4
+  Push $5
+
+  StrCpy $2 -1
+  StrLen $3 $0
+  StrLen $4 $1
+  IntOp $4 $4 - $3
+
+  StrStr_loop:
+    IntOp $2 $2 + 1
+    IntCmp $2 $4 0 0 StrStrReturn_notFound
+    StrCpy $5 $1 $3 $2
+    StrCmp $5 $0 StrStr_done StrStr_loop
+
+  StrStrReturn_notFound:
+    StrCpy $2 -1
+
+  StrStr_done:
+    Pop $5
+    Pop $4
+    Pop $3
+    Exch $2
+    Exch 2
+    Pop $0
+    Pop $1
+FunctionEnd
+!macroend
+!insertmacro StrStr ""
+;!insertmacro StrStr "un."
diff --git a/installer/build.bat b/installer/build.bat
new file mode 100644
index 0000000..79405b5
--- /dev/null
+++ b/installer/build.bat
@@ -0,0 +1,88 @@
+@echo off
+rem TAP-Windows -- A kernel driver to provide virtual tap
+rem                 device functionality on Windows.
+rem
+rem  Copyright (C) 2012      Alon Bar-Lev <alon.bar...@gmail.com>
+rem
+rem  This program is free software; you can redistribute it and/or modify
+rem  it under the terms of the GNU General Public License as published by
+rem  the Free Software Foundation; either version 2 of the License, or
+rem  (at your option) any later version.
+rem
+rem  This program is distributed in the hope that it will be useful,
+rem  but WITHOUT ANY WARRANTY; without even the implied warranty of
+rem  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+rem  GNU General Public License for more details.
+rem
+rem  You should have received a copy of the GNU General Public License
+rem  along with this program (see the file COPYING included with this
+rem  distribution); if not, write to the Free Software Foundation, Inc.,
+rem  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+setlocal
+
+set wd=%cd%
+cd %0\..
+
+if "%MAKENSIS%"=="" call ..\config-env.bat
+
+if "%OUTDIR%"=="" set OUTDIR=.
+set OUTPUT=%OUTDIR%\tap-windows-%PRODUCT_VERSION%
+set TAP_ROOT=tmp\image\tap-windows-%PRODUCT_VERSION%
+
+del "%OUTPUT%.*" > nul 2>&1
+rmdir /q /s tmp > nul 2>&1
+
+mkdir %TAP_ROOT%\include
+copy ..\src\tap-windows.h %TAP_ROOT%\include
+if errorlevel 1 goto error
+mkdir %TAP_ROOT%\i386
+copy ..\src\i386\*  %TAP_ROOT%\i386
+if errorlevel 1 goto error
+mkdir %TAP_ROOT%\amd64
+copy ..\src\amd64\* %TAP_ROOT%\amd64
+if errorlevel 1 goto error
+
+type ..\COPYING > %TAP_ROOT%\license.txt
+type ..\COPYRIGHT.GPL >> %TAP_ROOT%\license.txt
+cscript //nologo ..\build\unix2dos.js %TAP_ROOT%\license.txt
+if errorlevel 1 goto error
+
+"%DDK%\bin\selfsign\inf2cat" /driver:%TAP_ROOT%\i386 
/os:XP_X86,Vista_X86,7_X86,Server2003_X86,Server2008_X86
+"%DDK%\bin\selfsign\inf2cat" /driver:%TAP_ROOT%\amd64 
/os:XP_X64,Vista_X64,7_X64,Server2003_X64,Server2008_X64,Server2008R2_X64
+
+if not "%CODESIGN_PKCS12%"=="" (
+       for %%a in (i386 amd64) do (
+               "%SIGNTOOL%" sign /v /p "%CODESIGN_PASS%" /f 
"%CODESIGN_PKCS12%" /ac ..\build\MSCV-VSClass3.cer /t 
http://timestamp.verisign.com/scripts/timestamp.dll 
"%TAP_ROOT%\%%a\%PRODUCT_TAP_WIN_COMPONENT_ID%.sys"
+               "%SIGNTOOL%" sign /v /p "%CODESIGN_PASS%" /f 
"%CODESIGN_PKCS12%" /ac ..\build\MSCV-VSClass3.cer /t 
http://timestamp.verisign.com/scripts/timestamp.dll 
"%TAP_ROOT%\%%a\%PRODUCT_TAP_WIN_COMPONENT_ID%.cat"
+               if errorlevel 1 goto error
+       )
+)
+
+cscript //nologo ..\build\zip.js tmp\image "%OUTPUT%.zip"
+if errorlevel 1 goto error
+
+"%MAKENSIS%\makensis" -DDEVCON32="%DEVCON32%" -DDEVCON64="%DEVCON64%" 
-DDEVCON_BASENAME="%DEVCON_BASENAME%" 
-DPRODUCT_TAP_WIN_COMPONENT_ID="%PRODUCT_TAP_WIN_COMPONENT_ID%" 
-DPRODUCT_NAME="%PRODUCT_NAME%" -DPRODUCT_VERSION="%PRODUCT_VERSION%" 
-DOUTPUT="%OUTPUT%.exe" -DIMAGE="%TAP_ROOT%" tap-windows.nsi
+if errorlevel 1 goto error
+
+if not "%CODESIGN_PKCS12%"=="" (
+       "%SIGNTOOL%" sign /v /p "%CODESIGN_PASS%" /f "%CODESIGN_PKCS12%" /t 
http://timestamp.verisign.com/scripts/timestamp.dll "%OUTPUT%.exe"
+               if errorlevel 1 goto error
+       )
+)
+
+set rc=0
+goto end
+
+:error
+echo FATAL
+set rc=1
+goto end
+
+:end
+
+cd %wd%
+
+endlocal
+
+exit /b %rc%
diff --git a/installer/icon.ico b/installer/icon.ico
new file mode 100755
index 
0000000000000000000000000000000000000000..03ea0b1dccf355d4f5ac877c0918b374c7b7c4ee
GIT binary patch
literal 22486
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

literal 0
HcmV?d00001

diff --git a/installer/install-whirl.bmp b/installer/install-whirl.bmp
new file mode 100755
index 
0000000000000000000000000000000000000000..03f33fce96789420beb692679093506ca0685469
GIT binary patch
literal 25820
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

literal 0
HcmV?d00001

diff --git a/installer/tap-windows.nsi b/installer/tap-windows.nsi
new file mode 100755
index 0000000..26e060b
--- /dev/null
+++ b/installer/tap-windows.nsi
@@ -0,0 +1,296 @@
+; ****************************************************************************
+; * Copyright (C) 2002-2010 OpenVPN Technologies, Inc.                       *
+; * Copyright (C)      2012 Alon Bar-Lev <alon.bar...@gmail.com>             *
+; *  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.                           *
+; ****************************************************************************
+
+; TAP-Windows install script for Windows, using NSIS
+
+SetCompressor lzma
+
+!include "MUI.nsh"
+
+!include "StrStr.nsi"
+
+;--------------------------------
+;Configuration
+
+;General
+
+OutFile "${OUTPUT}"
+
+ShowInstDetails show
+ShowUninstDetails show
+
+;Folder selection page
+InstallDir "$PROGRAMFILES\${PRODUCT_NAME}"
+
+;Remember install folder
+InstallDirRegKey HKCU "Software\${PRODUCT_NAME}" ""
+
+;--------------------------------
+;Modern UI Configuration
+
+Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
+
+!define MUI_WELCOMEPAGE_TEXT "This wizard will guide you through the 
installation of ${PRODUCT_NAME}, an Open Source VPN package by James 
Yonan.\r\n\r\nNote that the Windows version of ${PRODUCT_NAME} will only run on 
Win 2000, XP, or higher.\r\n\r\n\r\n"
+
+!define MUI_COMPONENTSPAGE_TEXT_TOP "Select the components to install/upgrade. 
 Stop any ${PRODUCT_NAME} processes or the ${PRODUCT_NAME} service if it is 
running.  All DLLs are installed locally."
+
+!define MUI_COMPONENTSPAGE_SMALLDESC
+!define MUI_FINISHPAGE_NOAUTOCLOSE
+!define MUI_ABORTWARNING
+!define MUI_ICON "icon.ico"
+!define MUI_UNICON "icon.ico"
+!define MUI_HEADERIMAGE
+!define MUI_HEADERIMAGE_BITMAP "install-whirl.bmp"
+!define MUI_UNFINISHPAGE_NOAUTOCLOSE
+
+!insertmacro MUI_PAGE_WELCOME
+!insertmacro MUI_PAGE_LICENSE "${IMAGE}\license.txt"
+!insertmacro MUI_PAGE_COMPONENTS
+!insertmacro MUI_PAGE_DIRECTORY
+!insertmacro MUI_PAGE_INSTFILES
+!insertmacro MUI_PAGE_FINISH
+
+!insertmacro MUI_UNPAGE_CONFIRM
+!insertmacro MUI_UNPAGE_INSTFILES  
+!insertmacro MUI_UNPAGE_FINISH
+
+;--------------------------------
+;Languages
+
+!insertmacro MUI_LANGUAGE "English"
+
+;--------------------------------
+;Language Strings
+
+LangString DESC_SecTAP ${LANG_ENGLISH} "Install/Upgrade the TAP virtual device 
driver.  Will not interfere with CIPE."
+LangString DESC_SecTAPSDK ${LANG_ENGLISH} "Install the TAP SDK."
+
+;--------------------------------
+;Reserve Files
+
+;Things that need to be extracted on first (keep these lines before any File 
command!)
+;Only useful for BZIP2 compression
+
+ReserveFile "install-whirl.bmp"
+
+;--------------------------------
+;Macros
+
+!macro IsAdmin
+       UserInfo::GetName
+       ${Unless} ${Errors}
+               Pop $R0
+               UserInfo::GetAccountType
+               Pop $R1
+               ${If} $R1 != "Admin"
+                       Messagebox MB_OK "Administrator privileges required to 
install/uninstall ${PRODUCT_NAME} [$R0/$R1]"
+                       Abort
+               ${EndIf}
+       ${EndUnlesS}
+!macroend
+
+;------------------------------------------
+;Set reboot flag based on tapinstall return
+
+Function CheckReboot
+       ${If} $R0 == ""
+               IntOp $R0 0 & 0
+               SetRebootFlag true
+               DetailPrint "REBOOT flag set"
+       ${EndIf}
+FunctionEnd
+
+;--------------------------------
+;Installer Sections
+
+Function .onInit
+       ClearErrors
+       !insertmacro IsAdmin
+
+       # Delete previous start menu
+       RMDir /r $SMPROGRAMS\${PRODUCT_NAME}
+
+FunctionEnd
+
+Section "TAP Virtual Ethernet Adapter" SecTAP
+
+       SetOverwrite on
+
+       FileOpen $R0 "$INSTDIR\bin\addtap.bat" w
+       FileWrite $R0 "rem Add a new TAP virtual ethernet adapter$\r$\n"
+       FileWrite $R0 '"$INSTDIR\bin\${DEVCON_BASENAME}" install 
"$INSTDIR\driver\OemWin2k.inf" ${PRODUCT_TAP_WIN_COMPONENT_ID}$\r$\n'
+       FileWrite $R0 "pause$\r$\n"
+       FileClose $R0
+
+       FileOpen $R0 "$INSTDIR\bin\deltapall.bat" w
+       FileWrite $R0 "echo WARNING: this script will delete ALL TAP virtual 
adapters (use the device manager to delete adapters one at a time)$\r$\n"
+       FileWrite $R0 "pause$\r$\n"
+       FileWrite $R0 '"$INSTDIR\bin\${DEVCON_BASENAME}" remove 
${PRODUCT_TAP_WIN_COMPONENT_ID}$\r$\n'
+       FileWrite $R0 "pause$\r$\n"
+       FileClose $R0
+
+       ; Check if we are running on a 64 bit system.
+       System::Call "kernel32::GetCurrentProcess() i .s"
+       System::Call "kernel32::IsWow64Process(i s, *i .R0)"
+       ${If} $R0 != 0
+               ; tap-64bit:
+               DetailPrint "We are running on a 64-bit system."
+
+               SetOutPath "$INSTDIR\bin"
+               File "${DEVCON64}"
+
+               SetOutPath "$INSTDIR\driver"
+               File "${IMAGE}\amd64\OemWin2k.inf"
+               File "${IMAGE}\amd64\${PRODUCT_TAP_WIN_COMPONENT_ID}.cat"
+               File "${IMAGE}\amd64\${PRODUCT_TAP_WIN_COMPONENT_ID}.sys"
+       ${Else}
+               ; tap-32bit
+               DetailPrint "We are running on a 32-bit system."
+
+               SetOutPath "$INSTDIR\bin"
+               File "${DEVCON32}"
+
+               SetOutPath "$INSTDIR\driver"
+               File "${IMAGE}\i386\OemWin2k.inf"
+               File "${IMAGE}\i386\${PRODUCT_TAP_WIN_COMPONENT_ID}.cat"
+               File "${IMAGE}\i386\${PRODUCT_TAP_WIN_COMPONENT_ID}.sys"
+       ${EndIf}
+SectionEnd
+
+Section /o "TAP SDK" SecTAPSDK
+       SetOverwrite on
+       SetOutPath "$INSTDIR\include"
+       File "${IMAGE}\include\tap-windows.h"
+SectionEnd
+
+;--------------------
+;Post-install section
+
+Section -post
+
+       SetOverwrite on
+
+       ; Store README, license, icon
+       SetOverwrite on
+       SetOutPath $INSTDIR
+       File "${IMAGE}\license.txt"
+       File "icon.ico"
+
+       ${If} ${SectionIsSelected} ${SecTAP}
+               ;
+               ; install/upgrade TAP driver if selected, using devcon
+               ;
+               ; TAP install/update was selected.
+               ; Should we install or update?
+               ; If tapinstall error occurred, $R5 will
+               ; be nonzero.
+               IntOp $R5 0 & 0
+               nsExec::ExecToStack '"$INSTDIR\bin\${DEVCON_BASENAME}" hwids 
${PRODUCT_TAP_WIN_COMPONENT_ID}'
+               Pop $R0 # return value/error/timeout
+               IntOp $R5 $R5 | $R0
+               DetailPrint "${DEVCON_BASENAME} hwids returned: $R0"
+
+               ; If tapinstall output string contains 
"${PRODUCT_TAP_WIN_COMPONENT_ID}" we assume
+               ; that TAP device has been previously installed,
+               ; therefore we will update, not install.
+               Push "${PRODUCT_TAP_WIN_COMPONENT_ID}"
+               Call StrStr
+               Pop $R0
+
+               ${If} $R5 == 0
+                       ${If} $R0 == -1
+                               DetailPrint "TAP INSTALL 
(${PRODUCT_TAP_WIN_COMPONENT_ID})"
+                               nsExec::ExecToLog 
'"$INSTDIR\bin\${DEVCON_BASENAME}" install "$INSTDIR\driver\OemWin2k.inf" 
${PRODUCT_TAP_WIN_COMPONENT_ID}'
+                               Pop $R0 # return value/error/timeout
+                               Call CheckReboot
+                               IntOp $R5 $R5 | $R0
+                               DetailPrint "${DEVCON_BASENAME} install 
returned: $R0"
+                       ${Else}
+                               DetailPrint "TAP UPDATE"
+                               nsExec::ExecToLog 
'"$INSTDIR\bin\${DEVCON_BASENAME}" update "$INSTDIR\driver\OemWin2k.inf" 
${PRODUCT_TAP_WIN_COMPONENT_ID}'
+                               Pop $R0 # return value/error/timeout
+                               Call CheckReboot
+                               IntOp $R5 $R5 | $R0
+                               DetailPrint "${DEVCON_BASENAME} update 
returned: $R0"
+                       ${EndIf}
+               ${EndIf}
+
+               DetailPrint "${DEVCON_BASENAME} cumulative status: $R5"
+               ${If} $R5 != 0
+                       MessageBox MB_OK "An error occurred installing the TAP 
device driver."
+               ${EndIf}
+
+               ; Store install folder in registry
+               WriteRegStr HKLM SOFTWARE\${PRODUCT_NAME} "" $INSTDIR
+
+               ; Create shortcuts
+               CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Utilities\Add a new 
TAP virtual ethernet adapter.lnk" "$INSTDIR\bin\addtap.bat" ""
+               CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Utilities\Delete 
ALL TAP virtual ethernet adapters.lnk" "$INSTDIR\bin\deltapall.bat" ""
+       ${EndIf}
+
+       ; Create uninstaller
+       WriteUninstaller "$INSTDIR\Uninstall.exe"
+
+       ; Show up in Add/Remove programs
+       WriteRegStr HKLM 
"Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" 
"DisplayName" "${PRODUCT_NAME} ${PRODUCT_VERSION}"
+       WriteRegExpandStr HKLM 
"Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" 
"UninstallString" "$INSTDIR\Uninstall.exe"
+       WriteRegStr HKLM 
"Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" 
"DisplayIcon" "$INSTDIR\icon.ico"
+       WriteRegStr HKLM 
"Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" 
"DisplayVersion" "${PRODUCT_VERSION}"
+
+       ; Advise a reboot
+       ;Messagebox MB_OK "IMPORTANT: Rebooting the system is advised in order 
to finalize TAP driver installation/upgrade (this is an informational message 
only, pressing OK will not reboot)."
+
+SectionEnd
+
+;--------------------------------
+;Descriptions
+
+!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
+!insertmacro MUI_DESCRIPTION_TEXT ${SecTAP} $(DESC_SecTAP)
+!insertmacro MUI_DESCRIPTION_TEXT ${SecTAPSDK} $(DESC_SecTAPSDK)
+!insertmacro MUI_FUNCTION_DESCRIPTION_END
+
+;--------------------------------
+;Uninstaller Section
+
+Function un.onInit
+       ClearErrors
+       !insertmacro IsAdmin
+FunctionEnd
+
+Section "Uninstall"
+       DetailPrint "TAP REMOVE"
+       nsExec::ExecToLog '"$INSTDIR\bin\${DEVCON_BASENAME}" remove 
${PRODUCT_TAP_WIN_COMPONENT_ID}'
+       Pop $R0 # return value/error/timeout
+       DetailPrint "${DEVCON_BASENAME} remove returned: $R0"
+
+       Delete "$INSTDIR\bin\${DEVCON_BASENAME}"
+       Delete "$INSTDIR\bin\addtap.bat"
+       Delete "$INSTDIR\bin\deltapall.bat"
+
+       Delete "$INSTDIR\driver\OemWin2k.inf"
+       Delete "$INSTDIR\driver\${PRODUCT_TAP_WIN_COMPONENT_ID}.cat"
+       Delete "$INSTDIR\driver\${PRODUCT_TAP_WIN_COMPONENT_ID}.sys"
+
+       Delete "$INSTDIR\include\tap-windows.h"
+
+       Delete "$INSTDIR\icon.ico"
+       Delete "$INSTDIR\license.txt"
+       Delete "$INSTDIR\Uninstall.exe"
+
+       RMDir "$INSTDIR\bin"
+       RMDir "$INSTDIR\driver"
+       RMDir "$INSTDIR\include"
+       RMDir "$INSTDIR"
+
+       DeleteRegKey HKCR "${PRODUCT_NAME}File"
+       DeleteRegKey HKLM "SOFTWARE\${PRODUCT_NAME}"
+       DeleteRegKey HKCU "Software\${PRODUCT_NAME}"
+       DeleteRegKey HKLM 
"Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
+
+SectionEnd
diff --git a/src/OemWin2k.inf.in b/src/OemWin2k.inf.in
new file mode 100755
index 0000000..ef73600
--- /dev/null
+++ b/src/OemWin2k.inf.in
@@ -0,0 +1,187 @@
+; ****************************************************************************
+; * Copyright (C) 2002-2010 OpenVPN Technologies, Inc.                         
   *
+; *  This program is free software; you can redistribute it and/or modify    *
+; *  it under the terms of the GNU General Public License version 2          *
+; *  as published by the Free Software Foundation.                           *
+; ****************************************************************************
+
+; SYNTAX CHECKER
+; cd \WINDDK\3790\tools\chkinf
+; chkinf c:\src\openvpn\tap-win32\i386\oemwin2k.inf
+; OUTPUT -> 
file:///c:/WINDDK/3790/tools/chkinf/htm/c%23+src+openvpn+tap-win32+i386+__OemWin2k.htm
+
+; INSTALL/REMOVE DRIVER
+;   tapinstall install OemWin2k.inf TAP0901
+;   tapinstall update OemWin2k.inf TAP0901
+;   tapinstall remove TAP0901
+
+;*********************************************************
+; Note to Developers:
+;
+; If you are bundling the TAP-Windows driver with your app,
+; you should try to rename it in such a way that it will
+; not collide with other instances of TAP-Windows defined
+; by other apps.  Multiple versions of the TAP-Windows
+; driver, each installed by different apps, can coexist
+; on the same machine if you follow these guidelines.
+; NOTE: these instructions assume you are editing the
+; generated OemWin2k.inf file, not the source
+; OemWin2k.inf.in file which is preprocessed by winconfig
+; and uses macro definitions from settings.in.
+;
+; (1) Rename all tapXXXX instances in this file to
+;     something different (use at least 5 characters
+;     for this name!)
+; (2) Change the "!define TAP" definition in openvpn.nsi
+;     to match what you changed tapXXXX to.
+; (3) Change TARGETNAME in SOURCES to match what you
+;     changed tapXXXX to.
+; (4) Change TAP_COMPONENT_ID in common.h to match what
+;     you changed tapXXXX to.
+; (5) Change SZDEPENDENCIES in service.h to match what
+;     you changed tapXXXX to.
+; (6) Change DeviceDescription and Provider strings.
+; (7) Change PRODUCT_TAP_WIN_DEVICE_DESCRIPTION in constants.h to what you
+;     set DeviceDescription to.
+;
+;*********************************************************
+
+[Version]
+   Signature = "$Windows NT$"
+   CatalogFile = @PRODUCT_TAP_WIN_COMPONENT_ID@.cat
+   ClassGUID = {4d36e972-e325-11ce-bfc1-08002be10318}
+   Provider = %Provider%
+   Class = Net
+
+; This version number should match the version
+; number given in SOURCES.
+   
DriverVer=@PRODUCT_TAP_WIN_RELDATE@,@PRODUCT_TAP_WIN_MAJOR@.00.00.@PRODUCT_TAP_WIN_MINOR@
+
+[Strings]
+   DeviceDescription = "@PRODUCT_TAP_WIN_DEVICE_DESCRIPTION@"
+   Provider = "@PRODUCT_TAP_WIN_PROVIDER@"
+
+;----------------------------------------------------------------
+;                      Manufacturer + Product Section (Done)
+;----------------------------------------------------------------
+[Manufacturer]
+   %Provider% = @PRODUCT_TAP_WIN_COMPONENT_ID@@INF_PROVIDER_SUFFIX@
+
+[@PRODUCT_TAP_WIN_COMPONENT_ID@@INF_SECTION_SUFFIX@]
+   %DeviceDescription% = @PRODUCT_TAP_WIN_COMPONENT_ID@.ndi, 
@PRODUCT_TAP_WIN_COMPONENT_ID@
+
+;---------------------------------------------------------------
+;                             Driver Section (Done)
+;---------------------------------------------------------------
+
+;----------------- Characteristics ------------
+;    NCF_PHYSICAL = 0x04
+;    NCF_VIRTUAL = 0x01
+;    NCF_SOFTWARE_ENUMERATED = 0x02
+;    NCF_HIDDEN = 0x08
+;    NCF_NO_SERVICE = 0x10
+;    NCF_HAS_UI = 0x80
+;----------------- Characteristics ------------
+
+[@PRODUCT_TAP_WIN_COMPONENT_ID@.ndi]
+   CopyFiles       = @PRODUCT_TAP_WIN_COMPONENT_ID@.driver, 
@PRODUCT_TAP_WIN_COMPONENT_ID@.files
+   AddReg          = @PRODUCT_TAP_WIN_COMPONENT_ID@.reg
+   AddReg          = @product_tap_win_component...@.params.reg
+   Characteristics = @PRODUCT_TAP_WIN_CHARACTERISTICS@
+
+[@PRODUCT_TAP_WIN_COMPONENT_ID@.ndi.Services]
+   AddService = @PRODUCT_TAP_WIN_COMPONENT_ID@,        2, 
@PRODUCT_TAP_WIN_COMPONENT_ID@.service
+
+[@PRODUCT_TAP_WIN_COMPONENT_ID@.reg]
+   HKR, Ndi,            Service,      0, "@PRODUCT_TAP_WIN_COMPONENT_ID@"
+   HKR, Ndi\Interfaces, UpperRange,   0, "ndis5"
+   HKR, Ndi\Interfaces, LowerRange,   0, "ethernet"
+   HKR, ,               Manufacturer, 0, "%Provider%"
+   HKR, ,               ProductName,  0, "%DeviceDescription%"
+
+[@product_tap_win_component...@.params.reg]
+   HKR, Ndi\params\MTU,                  ParamDesc, 0, "MTU"
+   HKR, Ndi\params\MTU,                  Type,      0, "int"
+   HKR, Ndi\params\MTU,                  Default,   0, "1500"
+   HKR, Ndi\params\MTU,                  Optional,  0, "0"
+   HKR, Ndi\params\MTU,                  Min,       0, "100"
+   HKR, Ndi\params\MTU,                  Max,       0, "1500"
+   HKR, Ndi\params\MTU,                  Step,      0, "1"
+   HKR, Ndi\params\MediaStatus,          ParamDesc, 0, "Media Status"
+   HKR, Ndi\params\MediaStatus,          Type,      0, "enum"
+   HKR, Ndi\params\MediaStatus,          Default,   0, "0"
+   HKR, Ndi\params\MediaStatus,          Optional,  0, "0"
+   HKR, Ndi\params\MediaStatus\enum,     "0",       0, "Application Controlled"
+   HKR, Ndi\params\MediaStatus\enum,     "1",       0, "Always Connected"
+   HKR, Ndi\params\MAC,                  ParamDesc, 0, "MAC Address"
+   HKR, Ndi\params\MAC,                  Type,      0, "edit"
+   HKR, Ndi\params\MAC,                  Optional,  0, "1"
+   HKR, Ndi\params\AllowNonAdmin,        ParamDesc, 0, "Non-Admin Access"
+   HKR, Ndi\params\AllowNonAdmin,        Type,      0, "enum"
+   HKR, Ndi\params\AllowNonAdmin,        Default,   0, "1"
+   HKR, Ndi\params\AllowNonAdmin,        Optional,  0, "0"
+   HKR, Ndi\params\AllowNonAdmin\enum,   "0",       0, "Not Allowed"
+   HKR, Ndi\params\AllowNonAdmin\enum,   "1",       0, "Allowed"
+
+;----------------------------------------------------------------
+;                             Service Section
+;----------------------------------------------------------------
+
+;---------- Service Type -------------
+;    SERVICE_KERNEL_DRIVER     = 0x01
+;    SERVICE_WIN32_OWN_PROCESS = 0x10
+;---------- Service Type -------------
+
+;---------- Start Mode ---------------
+;    SERVICE_BOOT_START   = 0x0
+;    SERVICE_SYSTEM_START = 0x1
+;    SERVICE_AUTO_START   = 0x2
+;    SERVICE_DEMAND_START = 0x3
+;    SERVICE_DISABLED     = 0x4
+;---------- Start Mode ---------------
+
+[@PRODUCT_TAP_WIN_COMPONENT_ID@.service]
+   DisplayName = %DeviceDescription%
+   ServiceType = 1
+   StartType = 3
+   ErrorControl = 1
+   LoadOrderGroup = NDIS
+   ServiceBinary = %12%\@PRODUCT_TAP_WIN_COMPONENT_ID@.sys
+
+;-----------------------------------------------------------------
+;                                File Installation
+;-----------------------------------------------------------------
+
+;----------------- Copy Flags ------------
+;    COPYFLG_NOSKIP = 0x02
+;    COPYFLG_NOVERSIONCHECK = 0x04
+;----------------- Copy Flags ------------
+
+; SourceDisksNames
+; diskid = description[, [tagfile] [, <unused>, subdir]]
+; 1 = "Intel Driver Disk 1",e100bex.sys,,
+
+[SourceDisksNames]
+   1 = %DeviceDescription%, @PRODUCT_TAP_WIN_COMPONENT_ID@.sys
+
+; SourceDisksFiles
+; filename_on_source = diskID[, [subdir][, size]]
+; e100bex.sys = 1,, ; on distribution disk 1
+
+[SourceDisksFiles]
+@PRODUCT_TAP_WIN_COMPONENT_ID@.sys = 1
+
+[DestinationDirs]
+   @PRODUCT_TAP_WIN_COMPONENT_ID@.files  = 11
+   @PRODUCT_TAP_WIN_COMPONENT_ID@.driver = 12
+
+[@PRODUCT_TAP_WIN_COMPONENT_ID@.files]
+;   TapPanel.cpl,,,6   ; COPYFLG_NOSKIP | COPYFLG_NOVERSIONCHECK
+;   cipsrvr.exe,,,6     ; COPYFLG_NOSKIP | COPYFLG_NOVERSIONCHECK
+
+[@PRODUCT_TAP_WIN_COMPONENT_ID@.driver]
+   @PRODUCT_TAP_WIN_COMPONENT_ID@.sys,,,6     ; COPYFLG_NOSKIP | 
COPYFLG_NOVERSIONCHECK
+
+;---------------------------------------------------------------
+;                                      End
+;---------------------------------------------------------------
diff --git a/src/SOURCES.in b/src/SOURCES.in
index 2f77365..3e1ee81 100755
--- a/src/SOURCES.in
+++ b/src/SOURCES.in
@@ -4,7 +4,7 @@
 MAJORCOMP=ntos
 MINORCOMP=ndis

-TARGETNAME=@@PRODUCT_TAP_ID@@
+TARGETNAME=@PRODUCT_TAP_WIN_COMPONENT_ID@
 TARGETTYPE=DRIVER
 TARGETPATH=.
 TARGETLIBS=$(DDK_LIB_PATH)\ndis.lib $(DDK_LIB_PATH)\ntstrsafe.lib
@@ -13,8 +13,9 @@ INCLUDES=$(DDK_INCLUDE_PATH) ..
 # The TAP version numbers here must be >=
 # PRODUCT_TAP_WIN32_MIN_x values defined in version.m4
 C_DEFINES=
-C_DEFINES=$(C_DEFINES) -DTAP_DRIVER_MAJOR_VERSION=@@PRODUCT_TAP_MAJOR_VER@@
-C_DEFINES=$(C_DEFINES) -DTAP_DRIVER_MINOR_VERSION=@@PRODUCT_TAP_MINOR_VER@@
+C_DEFINES=$(C_DEFINES) @EXTRA_C_DEFINES@
+C_DEFINES=$(C_DEFINES) -DTAP_DRIVER_MAJOR_VERSION=@PRODUCT_TAP_WIN_MAJOR@
+C_DEFINES=$(C_DEFINES) -DTAP_DRIVER_MINOR_VERSION=@PRODUCT_TAP_WIN_MINOR@

 # Produce the same symbolic information for both free & checked builds.
 # This will allow us to perform full source-level debugging on both
diff --git a/src/config.h.in b/src/config.h.in
new file mode 100644
index 0000000..322afa8
--- /dev/null
+++ b/src/config.h.in
@@ -0,0 +1,9 @@
+#define PRODUCT_NAME                   "@PRODUCT_NAME@"
+#define PRODUCT_VERSION                        "@PRODUCT_VERSION@"
+#define PRODUCT_VERSION_RESOURCE       @PRODUCT_VERSION_RESOURCE@
+#define PRODUCT_TAP_WIN_COMPONENT_ID   "@PRODUCT_TAP_WIN_COMPONENT_ID@"
+#define PRODUCT_TAP_WIN_MAJOR          @PRODUCT_TAP_WIN_MAJOR@
+#define PRODUCT_TAP_WIN_MINOR          @PRODUCT_TAP_WIN_MINOR@
+#define PRODUCT_TAP_WIN_PROVIDER               "@PRODUCT_TAP_WIN_PROVIDER@"
+#define PRODUCT_TAP_WIN_DEVICE_DESCRIPTION     
"@PRODUCT_TAP_WIN_DEVICE_DESCRIPTION@"
+#define PRODUCT_TAP_WIN_RELDATE                "@PRODUCT_TAP_WIN_RELDATE@"
diff --git a/src/error.c b/src/error.c
index 271dafc..69e9ec6 100755
--- a/src/error.c
+++ b/src/error.c
@@ -95,7 +95,9 @@ MyDebugPrint (const unsigned char* format, ...)
                                               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
diff --git a/src/i386/OemWin2k.inf.in b/src/i386/OemWin2k.inf.in
deleted file mode 100755
index 34888f2..0000000
--- a/src/i386/OemWin2k.inf.in
+++ /dev/null
@@ -1,195 +0,0 @@
-; ****************************************************************************
-; * Copyright (C) 2002-2010 OpenVPN Technologies, Inc.                         
   *
-; *  This program is free software; you can redistribute it and/or modify    *
-; *  it under the terms of the GNU General Public License version 2          *
-; *  as published by the Free Software Foundation.                           *
-; ****************************************************************************
-
-; SYNTAX CHECKER
-; cd \WINDDK\3790\tools\chkinf
-; chkinf c:\src\openvpn\tap-win32\i386\oemwin2k.inf
-; OUTPUT -> 
file:///c:/WINDDK/3790/tools/chkinf/htm/c%23+src+openvpn+tap-win32+i386+__OemWin2k.htm
-
-; INSTALL/REMOVE DRIVER
-;   tapinstall install OemWin2k.inf TAP0901
-;   tapinstall update OemWin2k.inf TAP0901
-;   tapinstall remove TAP0901
-
-;*********************************************************
-; Note to Developers:
-;
-; If you are bundling the TAP-Windows driver with your app,
-; you should try to rename it in such a way that it will
-; not collide with other instances of TAP-Windows defined
-; by other apps.  Multiple versions of the TAP-Windows
-; driver, each installed by different apps, can coexist
-; on the same machine if you follow these guidelines.
-; NOTE: these instructions assume you are editing the
-; generated OemWin2k.inf file, not the source
-; OemWin2k.inf.in file which is preprocessed by winconfig
-; and uses macro definitions from settings.in.
-;
-; (1) Rename all tapXXXX instances in this file to
-;     something different (use at least 5 characters
-;     for this name!)
-; (2) Change the "!define TAP" definition in openvpn.nsi
-;     to match what you changed tapXXXX to.
-; (3) Change TARGETNAME in SOURCES to match what you
-;     changed tapXXXX to.
-; (4) Change TAP_COMPONENT_ID in common.h to match what
-;     you changed tapXXXX to.
-; (5) Change SZDEPENDENCIES in service.h to match what
-;     you changed tapXXXX to.
-; (6) Change DeviceDescription and Provider strings.
-; (7) Change PRODUCT_STRING in constants.h to what you
-;     set DeviceDescription to.
-;
-;*********************************************************
-
-[Version]
-   Signature = "$Windows NT$"
-   CatalogFile = @@PRODUCT_TAP_ID@@.cat
-   ClassGUID = {4d36e972-e325-11ce-bfc1-08002be10318}
-   Provider = %Provider%
-   Class = Net
-
-; This version number should match the version
-; number given in SOURCES.
-   
DriverVer=@@PRODUCT_TAP_RELDATE@@,@@PRODUCT_TAP_MAJOR_VER@@.00.00.@@PRODUCT_TAP_MINOR_VER@@
-
-[Strings]
-   DeviceDescription = "@@PRODUCT_TAP_DEVICE_DESCRIPTION@@"
-   Provider = "@@PRODUCT_TAP_PROVIDER@@"
-
-;----------------------------------------------------------------
-;                      Manufacturer + Product Section (Done)
-;----------------------------------------------------------------
-[Manufacturer]
-!ifdef AMD64
-   %Provider% = @@PRODUCT_TAP_ID@@, NTamd64
-!else
-   %Provider% = @@PRODUCT_TAP_ID@@
-!endif
-
-!ifdef AMD64
-[@@PRODUCT_TAP_ID@@.NTamd64]
-!else
-[@@PRODUCT_TAP_ID@@]
-!endif
-   %DeviceDescription% = @@PRODUCT_TAP_ID@@.ndi, @@PRODUCT_TAP_ID@@
-
-;---------------------------------------------------------------
-;                             Driver Section (Done)
-;---------------------------------------------------------------
-
-;----------------- Characteristics ------------
-;    NCF_PHYSICAL = 0x04
-;    NCF_VIRTUAL = 0x01
-;    NCF_SOFTWARE_ENUMERATED = 0x02
-;    NCF_HIDDEN = 0x08
-;    NCF_NO_SERVICE = 0x10
-;    NCF_HAS_UI = 0x80
-;----------------- Characteristics ------------
-
-[@@PRODUCT_TAP_ID@@.ndi]
-   CopyFiles       = @@PRODUCT_TAP_ID@@.driver, @@PRODUCT_TAP_ID@@.files
-   AddReg          = @@PRODUCT_TAP_ID@@.reg
-   AddReg          = @@PRODUCT_TAP_ID@@.params.reg
-   Characteristics = @@PRODUCT_TAP_CHARACTERISTICS@@
-
-[@@PRODUCT_TAP_ID@@.ndi.Services]
-   AddService = @@PRODUCT_TAP_ID@@,        2, @@PRODUCT_TAP_ID@@.service
-
-[@@PRODUCT_TAP_ID@@.reg]
-   HKR, Ndi,            Service,      0, "@@PRODUCT_TAP_ID@@"
-   HKR, Ndi\Interfaces, UpperRange,   0, "ndis5"
-   HKR, Ndi\Interfaces, LowerRange,   0, "ethernet"
-   HKR, ,               Manufacturer, 0, "%Provider%"
-   HKR, ,               ProductName,  0, "%DeviceDescription%"
-
-[@@PRODUCT_TAP_ID@@.params.reg]
-   HKR, Ndi\params\MTU,                  ParamDesc, 0, "MTU"
-   HKR, Ndi\params\MTU,                  Type,      0, "int"
-   HKR, Ndi\params\MTU,                  Default,   0, "1500"
-   HKR, Ndi\params\MTU,                  Optional,  0, "0"
-   HKR, Ndi\params\MTU,                  Min,       0, "100"
-   HKR, Ndi\params\MTU,                  Max,       0, "1500"
-   HKR, Ndi\params\MTU,                  Step,      0, "1"
-   HKR, Ndi\params\MediaStatus,          ParamDesc, 0, "Media Status"
-   HKR, Ndi\params\MediaStatus,          Type,      0, "enum"
-   HKR, Ndi\params\MediaStatus,          Default,   0, "0"
-   HKR, Ndi\params\MediaStatus,          Optional,  0, "0"
-   HKR, Ndi\params\MediaStatus\enum,     "0",       0, "Application Controlled"
-   HKR, Ndi\params\MediaStatus\enum,     "1",       0, "Always Connected"
-   HKR, Ndi\params\MAC,                  ParamDesc, 0, "MAC Address"
-   HKR, Ndi\params\MAC,                  Type,      0, "edit"
-   HKR, Ndi\params\MAC,                  Optional,  0, "1"
-   HKR, Ndi\params\AllowNonAdmin,        ParamDesc, 0, "Non-Admin Access"
-   HKR, Ndi\params\AllowNonAdmin,        Type,      0, "enum"
-   HKR, Ndi\params\AllowNonAdmin,        Default,   0, "1"
-   HKR, Ndi\params\AllowNonAdmin,        Optional,  0, "0"
-   HKR, Ndi\params\AllowNonAdmin\enum,   "0",       0, "Not Allowed"
-   HKR, Ndi\params\AllowNonAdmin\enum,   "1",       0, "Allowed"
-
-;----------------------------------------------------------------
-;                             Service Section
-;----------------------------------------------------------------
-
-;---------- Service Type -------------
-;    SERVICE_KERNEL_DRIVER     = 0x01
-;    SERVICE_WIN32_OWN_PROCESS = 0x10
-;---------- Service Type -------------
-
-;---------- Start Mode ---------------
-;    SERVICE_BOOT_START   = 0x0
-;    SERVICE_SYSTEM_START = 0x1
-;    SERVICE_AUTO_START   = 0x2
-;    SERVICE_DEMAND_START = 0x3
-;    SERVICE_DISABLED     = 0x4
-;---------- Start Mode ---------------
-
-[@@PRODUCT_TAP_ID@@.service]
-   DisplayName = %DeviceDescription%
-   ServiceType = 1
-   StartType = 3
-   ErrorControl = 1
-   LoadOrderGroup = NDIS
-   ServiceBinary = %12%\@@PRODUCT_TAP_ID@@.sys
-
-;-----------------------------------------------------------------
-;                                File Installation
-;-----------------------------------------------------------------
-
-;----------------- Copy Flags ------------
-;    COPYFLG_NOSKIP = 0x02
-;    COPYFLG_NOVERSIONCHECK = 0x04
-;----------------- Copy Flags ------------
-
-; SourceDisksNames
-; diskid = description[, [tagfile] [, <unused>, subdir]]
-; 1 = "Intel Driver Disk 1",e100bex.sys,,
-
-[SourceDisksNames]
-   1 = %DeviceDescription%, @@PRODUCT_TAP_ID@@.sys
-
-; SourceDisksFiles
-; filename_on_source = diskID[, [subdir][, size]]
-; e100bex.sys = 1,, ; on distribution disk 1
-
-[SourceDisksFiles]
-@@PRODUCT_TAP_ID@@.sys = 1
-
-[DestinationDirs]
-   @@PRODUCT_TAP_ID@@.files  = 11
-   @@PRODUCT_TAP_ID@@.driver = 12
-
-[@@PRODUCT_TAP_ID@@.files]
-;   TapPanel.cpl,,,6   ; COPYFLG_NOSKIP | COPYFLG_NOVERSIONCHECK
-;   cipsrvr.exe,,,6     ; COPYFLG_NOSKIP | COPYFLG_NOVERSIONCHECK
-
-[@@PRODUCT_TAP_ID@@.driver]
-   @@PRODUCT_TAP_ID@@.sys,,,6     ; COPYFLG_NOSKIP | COPYFLG_NOVERSIONCHECK
-
-;---------------------------------------------------------------
-;                                      End
-;---------------------------------------------------------------
diff --git a/src/resource.rc b/src/resource.rc
index ed7cf20..b669c34 100755
--- a/src/resource.rc
+++ b/src/resource.rc
@@ -1,6 +1,8 @@
 #include <windows.h>
 #include <ntverp.h>

+#include "config.h"
+
 #undef VER_PRODUCTVERSION
 #undef VER_PRODUCTVERSION_STR
 #undef VER_COMPANYNAME_STR
@@ -36,18 +38,18 @@

 #define VER_COMPANYNAME_STR         "The OpenVPN Project"
 #define VER_FILEDESCRIPTION_STR     "TAP-Windows Virtual Network Driver"
-#define VER_ORIGINALFILENAME_STR    PRODUCT_TAP_ID ".sys"
+#define VER_ORIGINALFILENAME_STR    PRODUCT_TAP_WIN_COMPONENT_ID ".sys"
 #define VER_LEGALCOPYRIGHT_YEARS    "2003-2010"
 #define VER_LEGALCOPYRIGHT_STR      "OpenVPN Technologies, Inc."


 #define VER_PRODUCTNAME_STR         VER_FILEDESCRIPTION_STR
-#define VER_PRODUCTVERSION         
TAP_DRIVER_MAJOR_VERSION,00,00,TAP_DRIVER_MINOR_VERSION
+#define VER_PRODUCTVERSION         
PRODUCT_TAP_WIN_MAJOR,00,00,PRODUCT_TAP_WIN_MINOR

 #define XSTR(s) STR(s)
 #define STR(s) #s

-#define VSTRING PACKAGE_VERSION " " XSTR(TAP_DRIVER_MAJOR_VERSION) "/" 
XSTR(TAP_DRIVER_MINOR_VERSION)
+#define VSTRING PRODUCT_VERSION " " XSTR(PRODUCT_TAP_WIN_MAJOR) "/" 
XSTR(PRODUCT_TAP_WIN_MINOR)

 #ifdef DBG
 #define VER_PRODUCTVERSION_STR      VSTRING " (DEBUG)"
diff --git a/src/tapdrvr.c b/src/tapdrvr.c
index d183902..43eca58 100755
--- a/src/tapdrvr.c
+++ b/src/tapdrvr.c
@@ -36,6 +36,7 @@
 //======================================================

 #include "tap-windows.h"
+#include "config.h"

 #define NDIS_MINIPORT_DRIVER
 #define BINARY_COMPATIBLE 0
@@ -1028,8 +1029,8 @@ NDIS_STATUS AdapterQuery
       //                       Vendor & Driver version Info
       //===================================================================
     case OID_GEN_VENDOR_DESCRIPTION:
-      l_QueryPtr = (TapAdapterQueryPointer) PRODUCT_STRING;
-      l_QueryLength = strlen (PRODUCT_STRING) + 1;
+      l_QueryPtr = (TapAdapterQueryPointer) PRODUCT_TAP_WIN_DEVICE_DESCRIPTION;
+      l_QueryLength = strlen (PRODUCT_TAP_WIN_DEVICE_DESCRIPTION) + 1;
       break;

     case OID_GEN_VENDOR_ID:
@@ -1045,8 +1046,8 @@ NDIS_STATUS AdapterQuery

     case OID_GEN_VENDOR_DRIVER_VERSION:
       l_Query.m_Long =
-       (((USHORT) TAP_DRIVER_MAJOR_VERSION) << 8 | (USHORT)
-        TAP_DRIVER_MINOR_VERSION);
+       (((USHORT) PRODUCT_TAP_WIN_MAJOR) << 8 | (USHORT)
+        PRODUCT_TAP_WIN_MINOR);
       break;

       //=================================================================
diff --git a/version.m4 b/version.m4
new file mode 100644
index 0000000..95fe9e0
--- /dev/null
+++ b/version.m4
@@ -0,0 +1,11 @@
+dnl define the TAP version
+define([PRODUCT_NAME], [TAP-Windows])
+define([PRODUCT_VERSION], [9.9])
+define([PRODUCT_VERSION_RESOURCE], [9,0,0,9])
+define([PRODUCT_TAP_WIN_COMPONENT_ID], [tap0901])
+define([PRODUCT_TAP_WIN_MAJOR], [9])
+define([PRODUCT_TAP_WIN_MINOR], [9])
+define([PRODUCT_TAP_WIN_PROVIDER], [TAP-Windows Provider V9])
+define([PRODUCT_TAP_WIN_CHARACTERISTICS], [0x81])
+define([PRODUCT_TAP_WIN_DEVICE_DESCRIPTION], [TAP-Windows Adapter V9])
+define([PRODUCT_TAP_WIN_RELDATE], [04/19/2010])
-- 
1.7.3.4


Reply via email to