Coder Social home page Coder Social logo

tap-windows6's Introduction

TAP-Windows driver (NDIS 6)

This is an NDIS 6.20/6.30 implementation of the TAP-Windows driver, used by OpenVPN and other apps. NDIS 6.20 drivers can run on Windows 7 or higher except on ARM64 desktop systems where, since the platform relies on next-gen power management in its drivers, NDIS 6.30 is required.

Build

The prerequisites for building are:

  • Python 2.7
  • Microsoft Windows 10 EWDK (Enterprise Windows Driver Kit)
    • Visual Studio+Windows Driver Kit works too. Make sure to work from a "Command Prompt for Visual Studio" and to call buildtap.py with "--sdk=wdk".
  • The devcon source code directory (setup/devcon) from Windows-driver-samples (optional)
    • If you use the repo from upstream remember to include our patch to devcon.vcxproj to ensure that devcon.exe is statically linked.
  • Windows code signing certificate
  • Git (not strictly required, but useful for running commands using bundled bash shell)
  • MakeNSIS (optional)
  • Prebuilt tapinstall.exe binaries (optional)
  • Visual Studio 2019 and WiX Toolset for MSM packaging (optional)

Make sure you add Python's install directory (usually c:\python27) to the PATH environment variable.

Tap-windows6 has been successfully build on Windows 10 and Windows Server 2016 using CMD.exe, Powershell and Git Bash.

View build script options:

$ python buildtap.py
Usage: buildtap.py [options]

Options:
  -h, --help           show this help message and exit
  -s SRC, --src=SRC    TAP-Windows top-level directory, default=<CWD>
  --ti=TAPINSTALL      tapinstall (i.e. devcon) directory (optional)
  -d, --debug          enable debug build
  --hlk                build for HLK tests (test sign, no debug)
  -c, --clean          do an nmake clean before build
  -b, --build          build TAP-Windows and possibly tapinstall (add -c to
                       clean before build)
  --sdk=SDK            SDK to use for building: ewdk or wdk, default=ewdk
  --sign               sign the driver files
  -p, --package        generate an NSIS installer from the compiled files
  -m, --package-msm    generate a MSM installer from the compiled files
  --cert=CERT          Common name of code signing certificate,
                       default=openvpn
  --certfile=CERTFILE  Path to the code signing certificate
  --certpw=CERTPW      Password for the code signing certificate/key
                       (optional)
  --crosscert=CERT     The cross-certificate file to use, default=MSCV-
                       VSClass3.cer
  --timestamp=URL      Timestamp URL to use, default=http://timestamp.verisign
                       .com/scripts/timstamp.dll
  --versionoverride=FILE
                       Path to the version override file

Edit version.m4 and paths.py as necessary then build:

$ python buildtap.py -b

On successful completion, all build products will be placed in the "dist" directory as well as tap6.tar.gz. The NSIS installer package will be placed to the build root directory.

Building tapinstall (optional)

The easiest way to build tapinstall is to clone the Microsoft driver samples and copy the source for devcon.exe into the tap-windows6 tree. Using PowerShell:

$ git clone https://github.com/OpenVPN/Windows-driver-samples.git
$ Copy-Item -Recurse Windows-driver-samples/setup/devcon tap-windows6
$ cd tap-windows6
$ python.exe buildtap.py -b --ti=devcon

The build system also supports reuse of pre-built tapinstall.exe executables. To make sure the buildsystem finds the executables, create the following directory structure under tap-windows6 directory:

devcon
├── Release
│   └── devcon.exe
├── x64
│   └── Release
│       └── devcon.exe
└── ARM64
    └── Release
        └── devcon.exe

This structure is equal to what building tapinstall would create. Then call buildtap.py with "--ti=devcon". Replace "Release" with your build configuration; for example, when using --Hlk you'd use "Hlk".

Please note that the NSIS packaging (-p) step will fail if you don't have tapinstall.exe available. Also don't use the "-c" flag or the above directories will get wiped before MakeNSIS is able to find them.

Developer Mode: Installing, Removing and Replacing the Driver

The driver can be installed using a command-line tool, tapinstall.exe, which is bundled with OpenVPN and tap-windows installers. Note that in some versions of OpenVPN tapinstall.exe is called devcon.exe. To install, update or remove the tap-windows NDIS 6 driver follow these steps:

  • place tapinstall.exe/devcon.exe to your PATH
  • open an Administrator shell
  • cd to dist
  • cd to amd64, i386, or arm64 depending on your system's processor architecture.

If you are actively developing the driver (e.g.: Edit, Compile, Debug, Loop...), you may not be signing your driver each time, thus you need to be aware of the following additional items.

Disable Secure Boot:

Unsigned drivers require disabling secure boot.

Enable Windows Test Mode:

Test mode is also required.

Driver Installation:

Notes

  • The command tapinstall install OemVista.inf TAP0901 installs the driver
  • Because your driver is not signed, the tapinstall install step will pop up the "Big Scary Unsigned Driver Warning", you'll need to click OK.
  • As a result, the driver will be copied into the Windows Driver Store

Updating the Driver, and the Windows Driver Store:

At some point, you will build a shinny new driver and need to test it.

  • The command tapinstall remove TAP0901 - removes the driver
  • However, the previously approved driver is still in the Windows Driver Store
  • Typing tapinstall install ... now, only re-installs the old driver that was copied into the driver store.

Key step: The driver needs to be removed from the driver store also.

There is a script to do this, but it only works if you have not changed the text strings in your driver package

The manual steps are:

  • Step 1 - Obtain a list of Installed drivers via the command: pnputil -e, this will list all of the oemNUMBER.inf files that are in the driver store.
  • Step 2 - Find your driver in that list, it will be some oem<NUMBER>.inf file
  • Step 3 - To delete, use pnputil.exe /d oemNUMBER.inf

Finally use tapinstall install OemVista.inf TAP0901 to install your driver

Important:

If you do not see the Big Scary Unsigned Driver Warning - Windows will use the old (not new) driver.

Troubleshooting:

Examining the SetupAPI log file helps, see C:\Windows\INF\setupapi.dev.log.

Build for HLK tests

A test-signed version of tap-windows6 driver should be used for the HLK tests. The recommended procedure is to use pre-built, cross-signed devcon.exe and use the WDK-generated key for signing the driver.

First setup the directory with prebuilt devcon as described above. Then run the build with the --hlk option:

$ python.exe buildtap.py -c -b --ti=devcon-prebuilt --hlk

Release process and signing

Microsoft's driver signing requirements have tightened considerably over the last several years. Because of this this buildsystem no longer attempts to sign files by default. If you want to sign the files at build time use the --sign option. The "sign" directory contains several Powershell scripts that help produce release-signed tap-windows6 packages:

  • Cross-Sign: cross-sign tap-windows6 driver files and tapinstall.exe
  • Create-DriverSubmission: create architecture-specific attestation signing submission cabinet files
  • Extract-DriverSubmission: extract attestation-signed zip files
  • Sign-File: sign files (e.g. tap-windows6 installer or driver submission cabinet files)
  • Sign-tap6.conf.ps1: configuration file for all the scripts above
  • Prepare-Msm.ps1: take Win7- and Win10-signed "dist" directories and produce a "dist" directory that MSM packaging can consume

Most of these scripts operate directly on the "dist" directory that tap-windows6 build system produces. Below it is assumed that building and signing is done on the same computer.

First produce cross-signed drivers for (Windows 7/8/8.1/Server 2012r2):

$ python.exe buildtap.py -c -b --ti=devcon
$ sign\Cross-Sign.ps1 -SourceDir dist -Force

Note that the "-Force" option for Cross-Sign.ps1 is required except in the unlikely case that you're appending a signature.

Next produce a driver submission cabinet files for attestation signing:

$ sign\Create-DriverSubmission.ps1
$ Get-ChildItem -Path disk1|sign\Sign-File.ps1

Three architecture-specific (i386, amd64, arm64) cabinet files are created. Submit these to Windows Dev Center for attestation signing. Note that unsigned cabinet files will be automatically rejected.

When submitting the drivers to Microsoft take care to only request signatures applicable for each architecture.

At this point move the cross-signed "dist" directory away:

$ Move-Item dist dist.win7

Download the attestation-signed drivers as zip files put them into a temporary directory (e.g. tap-windows6tempdir). Then run Extract-DriverSubmission.ps1:

$ Get-ChildItem -Path tempdir -Filter "*.zip"|sign\Extract-DriverSubmission.ps1

This extracts the drivers into the "dist" directory. Move that directory to dist.win10:

$ Move-Item dist dist.win10

After this you can start creating the installers and/or MSM packages.

If you're creating NSIS packages do:

$ Move-Item dist.win7 dist
$ python.exe buildtap.py -p --ti=devcon
$ Move-Item dist dist.win7

Followed by:

$ Move-Item dist.win10 dist
$ python.exe buildtap.py -p --ti=devcon
$ Move-Item dist dist.win10

Finally sign both installers:

$ Get-Item tap-windows*.exe|sign\Sign-File.ps1

On the other hand if you're creating MSM packages do:

$ sign\Prepare-Msm.ps1
$ python buildtap.py -m --sdk=wdk
$ Get-Item tap-windows*.msm|sign\Sign-File.ps1

For additional instructions and background information please refer to this article on OpenVPN community wiki.

Overriding setting defined in version.m4

It is possible to override one or more of the settings in version.m4 file with the --versionoverride <file> option. Any settings given in the override file have precedence over those in version.m4.

This is useful when building several tap-windows6 drivers with different component ids for example.

Notes on proxies

It is possible to build tap-windows6 without connectivity to the Internet but any attempt to timestamp the driver will fail. For this reason configure your outbound proxy server before starting the build. Note that the command prompt also needs to be restarted to make use of new proxy settings.

MSM packaging

In order to build the MSM packages build and sign the driver first:

  • Build the TAP driver with buildtap.py and "-b" flag.
  • EV-sign the drivers
  • WHQL/Attestation-sign the drivers

Place the signed drivers in a directory structure under tap-windows6 directory. Each platform directory should contain the EV-signed driver with a "win10" subdirectory containing WHQL/Attestation signed driver for that platform:

dist
├── amd64
│   ├── win10
│   │   ├── OemVista.inf
│   │   ├── tap0901.cat
│   │   └── tap0901.sys
│   ├── OemVista.inf
│   ├── tap0901.cat
│   └── tap0901.sys
├── arm64
│   ├── win10
│   │   ├── OemVista.inf
│   │   ├── tap0901.cat
│   │   └── tap0901.sys
│   └── (Note: EV-signed driver for arm64 is not used.)
├── include
│   └── tap-windows.h
└── i386
    ├── win10
    │   ├── OemVista.inf
    │   ├── tap0901.cat
    │   └── tap0901.sys
    ├── OemVista.inf
    ├── tap0901.cat
    └── tap0901.sys

Building MSM packages requires Visual Studio 2019 (EWDK is not sufficient) and the WiX Toolset installed. In a Developer Command Prompt for Visual Studio 2019, run:

$ python buildtap.py -m --sdk=wdk

This will compile the installer.dll file with embedded drivers and package it as a platform-dependent tap-windows-<version>-<platform>.msm files.

As the WiX Toolset does not support the arm64 platform yet, only amd64 and i386 MSM files are built.

Optional: Consider EV-signing the MSM packages before deploying them. Thou, MSM signature is ignored when merging MSM into MSI package, users get a choice to validate the integrity of the downloaded MSM packages manually.

License

See the file COPYING.

tap-windows6's People

Contributors

alcaro avatar chipitsine avatar cron2 avatar duaneellissd avatar inhavk avatar jait avatar jamesyonan avatar jimmy01240397 avatar jkunkee avatar lstipakov avatar mattock avatar rozmansi avatar saper avatar selvanair avatar sgstair avatar shkpk avatar tdivine avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

tap-windows6's Issues

Cannot do unattended installation, Trusted Publishers not enough

Hello,

I'm trying to install openvpn-2.4.7 (with TAP 9.23.3.601) completely unattended. However, tap driver installation always asks for confirmation.

I have "OpenVPN Inc." certificate (valid from 2019/02/12) imported into "Trusted Publishers". However, win7 still asks me to trusts the driver every time I run add-tap.bat. If I manually install the driver from device manager, the behavior is the same.

If I mark to "Always trust software from 'OpenVPN Inc.'", I got the certificate into "Trusted Publishers". If I uninstall the driver but leave "Trusted Publishers" untouched and run addtap.bat again, win7 asks me again to trusts the same driver. It looks like win7 cannot check the signature even with the certificate imported.

I tried to import all Trust chain (DigiCert Root CA and DigiCert EV Code Signing CA) into each certificate container and also all together into "Trusted Publishers". Nothing made tap-windows driver be accepted without confirmation when I run add-tap.bat (after the driver was uninstalled).

I noticed that when I asks windows to trust 'OpenVPN Inc.', it included the certificate in the "Trusted Publishers". However, if I check it in certmgr, windows cannot validate it as it does not have the the intermediate CA (DigiCert EV Code Signing CA) imported. Is it expected? Importing the code signer be enough or should it also include intermediate CA?

What else might be wrong?

Prebuilt Binary Location?

I am confused about a few things.

A number of the openvpn web pages seem point to "prebuilts" for this package - I can't seem to find one named "tap-windows6.exe"

For example: https://community.openvpn.net/openvpn/wiki/GettingTapWindows
I do see for example "tap-windows-.exe" but not the 6 version.

My question is - where is the latest "offical signed released" driver located?

Note: My end goal is to use just the "tap" driver with an different application, not "openvpn"

If the answer/solution is - I must install the entire openvpn package... because it contains the driver and that is the only solution - please let me know.

Unable to build custom driver

I have followed the directions to install a custom driver but it will not install.

At this point I would gladly contract out this work.

I am trying to build a custom tuntap driver. I followed the instructions and used buildtap.py to create a new 9.0.21 IPv6 supported driver. I then signed it. It was build on Windows 2012 and I am trying to install it on a different Windows 2012 server.

Trying to install, results in the below:

c:\tapinstall.exe install driver\OemVista.inf tavvetun

Device node created. Install is complete when drivers are installed...
Updating drivers for tavvetun from C:\Users\gary\tuntap\driver\OemVista.inf.
tapinstall.exe failed.

setupapi.dev look like the following:

[Device Install (UpdateDriverForPlugAndPlayDevices) - tavvetun]
Section start 2015/04/19 17:32:34.968
cmd: bin\tapinstall.exe install driver\OemVista.inf tavvetun
dvi: {Build Driver List} 17:32:34.968
dvi: Searching for hardware ID(s):
dvi: tavvetun
cpy: Policy is set to make all digital signatures equal.
dvi: {Build Driver List - exit(0x00000000)} 17:32:34.968
dvi: {DIF_SELECTBESTCOMPATDRV} 17:32:34.968
dvi: Using exported function 'NetClassInstaller' in module 'C:\Windows\system32\NetCfgx.dll'.
dvi: Class installer == NetCfgx.dll,NetClassInstaller
dvi: Using exported function 'WlanDeviceClassCoInstaller' in module 'C:\Windows\system32\wlaninst.dll'.
dvi: CoInstaller 1 == wlaninst.dll,WlanDeviceClassCoInstaller
dvi: Using exported function 'WwanDeviceClassCoInstaller' in module 'C:\Windows\system32\wwaninst.dll'.
dvi: CoInstaller 2 == wwaninst.dll,WwanDeviceClassCoInstaller
dvi: CoInstaller 1: Enter 17:32:34.983
dvi: CoInstaller 1: Exit
dvi: CoInstaller 2: Enter 17:32:34.983
dvi: CoInstaller 2: Exit
dvi: Class installer: Enter 17:32:34.983
dvi: Class installer: Exit
dvi: Default installer: Enter 17:32:34.983
dvi: {Select Best Driver}
! dvi: Selecting driver failed(0xe0000228)
dvi: {Select Best Driver - exit(0xe0000228)}
! dvi: Default installer: failed!
! dvi: Error 0xe0000228: There are no compatible drivers for this device.
dvi: {DIF_SELECTBESTCOMPATDRV - exit(0xe0000228)} 17:32:34.983
dvi: {DIF_DESTROYPRIVATEDATA} 17:32:34.983
dvi: CoInstaller 1: Enter 17:32:34.983
dvi: CoInstaller 1: Exit
dvi: CoInstaller 2: Enter 17:32:34.983
dvi: CoInstaller 2: Exit
dvi: Class installer: Enter 17:32:34.983
dvi: Class installer: Exit
dvi: {DIF_DESTROYPRIVATEDATA - exit(0x00000000)} 17:32:34.983

install error Device has problem: 0x38 (CM_PROB_NEED_CLASS_CONFIG)

After I installed other VPN using openVPN technology, I can no longer install the latest openVPN. I looked up other issues and it seems there is no workaround. I read the setupapi.dev.log and I don't think I got certificate errors. But the error does not indicate how to resolve. So is there any other solution? For example, delete some files, registry keys?

attach is setupapi.dev.log

Best regards

1.log

How to install multiple taps & naming etc

I need to install 4 identical taps, so that I can create 4 different interfaces.

Background
I need to create 4 SLIP network adapters on windows, ie: "tap-tun -> SERIALPORT" - If there is an existing solution - great - but I can't find one.

Known and Unknown

  • Executing as Administrator.
  • No modification of INF, CAT or SYS files
  • copied the "addtap.bat" file creating "add4taps.bat", and changed "tapname" parameter.

The output I get is this:

c:\Program Files\TAP-Windows\bin>tapinstall install ..\driver\OemVista.inf  tap0001
Device node created. Install is complete when drivers are installed...
Updating drivers for tap0001 from c:\Program Files\TAP-Windows\driver\OemVista.inf.
tapinstall failed.

c:\Program Files\TAP-Windows\bin>

[CLEANUP] More code analysis

I was checking out code on ZeroTier, which uses this adapter, and saw a few bugs come up there; they might be using an older version of this. Then I noticed here that @sgstair & @cron2 had posted some "code analysis fixes". I wasn't sure if what they fixed, had anything to do with what I found; but I have posted scans there & here. Not much to look at, thankfully.

Cppcheck 1.88 analysis, ran with cppcheck --enable=all --force --inconclusive . 2> ../../tapwin6-cppcheck.txt: tapwin6-cppcheck.txt

9.21.2 fails to install (Device has problem: 0x38 (CM_PROB_NEED_CLASS_CONFIG))

I'm unable to install 9.21.2 currently on Windows 10 Version 1803 Build 17134.345.

I've ran the Cert Check as I saw this was a similiar error, but not exactly the same:

PS C:\Program Files\TAP-Windows\driver> Get-AuthenticodeSignature tap0901.cat


    Directory: C:\Program Files\TAP-Windows\driver


SignerCertificate                         Status                                 Path
-----------------                         ------                                 ----
5E66E0CA2367757E800E65B770629026E131A7DC  Valid                                  tap0901.cat

I've read in multiple places to try and disable SecureBoot and Integrity Check. I do not want to really do that permanently, but did for testing, with the same results.

Any help would be appreciated. I can't use any OpenVPN variant without TAP installed.

Setup Log:

>>>  [Device Install (UpdateDriverForPlugAndPlayDevices) - tap0901]
>>>  Section start 2018/11/06 14:13:56.374
      cmd: "C:\Program Files\TAP-Windows\bin\tapinstall.exe" install "C:\Program Files\TAP-Windows\driver\OemVista.inf" tap0901
     ndv: INF path: C:\Program Files\TAP-Windows\driver\OemVista.inf
     ndv: Install flags: 0x00000001
     ndv: {Update Device Driver - ROOT\NET\0001}
     ndv:      Search options: 0x00000080
     ndv:      Searching single INF 'C:\Program Files\TAP-Windows\driver\OemVista.inf'
     dvi:      {Build Driver List} 14:13:56.389
     dvi:           Searching for hardware ID(s):
     dvi:                tap0901
     sig:           {_VERIFY_FILE_SIGNATURE} 14:13:56.436
     sig:                Key      = oemvista.inf
     sig:                FilePath = c:\program files\tap-windows\driver\oemvista.inf
     sig:                Catalog  = c:\program files\tap-windows\driver\tap0901.cat
!    sig:                Verifying file against specific (valid) catalog failed.
!    sig:                Error 0x800b0109: A certificate chain processed, but terminated in a root certificate which is not trusted by the trust provider.
     sig:           {_VERIFY_FILE_SIGNATURE exit(0x800b0109)} 14:13:56.472
     sig:           {_VERIFY_FILE_SIGNATURE} 14:13:56.476
     sig:                Key      = oemvista.inf
     sig:                FilePath = c:\program files\tap-windows\driver\oemvista.inf
     sig:                Catalog  = c:\program files\tap-windows\driver\tap0901.cat
     sig:                Success: File is signed in Authenticode(tm) catalog.
     sig:                Error 0xe0000242: The publisher of an Authenticode(tm) signed catalog has not yet been established as trusted.
     sig:           {_VERIFY_FILE_SIGNATURE exit(0xe0000242)} 14:13:56.496
     dvi:           Created Driver Node:
     dvi:                HardwareID   - tap0901
     dvi:                InfName      - c:\program files\tap-windows\driver\oemvista.inf
     dvi:                DevDesc      - TAP-Windows Adapter V9
     dvi:                Section      - tap0901.ndi
     dvi:                Rank         - 0x00ff0000
     dvi:                Signer Score - Authenticode
     dvi:                DrvDate      - 04/21/2016
     dvi:                Version      - 9.0.0.21
     dvi:      {Build Driver List - exit(0x00000000)} 14:13:56.505
     dvi:      {DIF_SELECTBESTCOMPATDRV} 14:13:56.506
     dvi:           Default installer: Enter 14:13:56.507
     dvi:                {Select Best Driver}
     dvi:                     Class GUID of device changed to: {4d36e972-e325-11ce-bfc1-08002be10318}.
     dvi:                     Selected Driver:
     dvi:                          Description - TAP-Windows Adapter V9
     dvi:                          InfFile     - c:\program files\tap-windows\driver\oemvista.inf
     dvi:                          Section     - tap0901.ndi
     dvi:                {Select Best Driver - exit(0x00000000)}
     dvi:           Default installer: Exit
     dvi:      {DIF_SELECTBESTCOMPATDRV - exit(0x00000000)} 14:13:56.515
     ndv:      Force Installing Driver:
     ndv:           Inf Name       - oemvista.inf
     ndv:           Driver Date    - 04/21/2016
     ndv:           Driver Version - 9.0.0.21
     sto:      {Setup Import Driver Package: c:\program files\tap-windows\driver\oemvista.inf} 14:13:56.520
     inf:           Provider: TAP-Windows Provider V9
     inf:           Class GUID: {4d36e972-e325-11ce-bfc1-08002be10318}
     inf:           Driver Version: 04/21/2016,9.00.00.21
     inf:           Catalog File: tap0901.cat
     sto:           {Copy Driver Package: c:\program files\tap-windows\driver\oemvista.inf} 14:13:56.527
     sto:                Driver Package = c:\program files\tap-windows\driver\oemvista.inf
     sto:                Flags          = 0x00000007
     sto:                Destination    = C:\Users\brian\AppData\Local\Temp\{34eb7d98-debe-4041-8580-81d95820a51c}
     sto:                Copying driver package files to 'C:\Users\brian\AppData\Local\Temp\{34eb7d98-debe-4041-8580-81d95820a51c}'.
     flq:                Copying 'c:\program files\tap-windows\driver\oemvista.inf' to 'C:\Users\brian\AppData\Local\Temp\{34eb7d98-debe-4041-8580-81d95820a51c}\oemvista.inf'.
     flq:                Copying 'c:\program files\tap-windows\driver\tap0901.cat' to 'C:\Users\brian\AppData\Local\Temp\{34eb7d98-debe-4041-8580-81d95820a51c}\tap0901.cat'.
     flq:                Copying 'c:\program files\tap-windows\driver\tap0901.sys' to 'C:\Users\brian\AppData\Local\Temp\{34eb7d98-debe-4041-8580-81d95820a51c}\tap0901.sys'.
     sto:           {Copy Driver Package: exit(0x00000000)} 14:13:56.547
     pol:           {Driver package policy check} 14:13:56.595
     pol:           {Driver package policy check - exit(0x00000000)} 14:13:56.596
     sto:           {Stage Driver Package: C:\Users\brian\AppData\Local\Temp\{34eb7d98-debe-4041-8580-81d95820a51c}\oemvista.inf} 14:13:56.597
     inf:                {Query Configurability: C:\Users\brian\AppData\Local\Temp\{34eb7d98-debe-4041-8580-81d95820a51c}\oemvista.inf} 14:13:56.601
     inf:                     Driver package 'oemvista.inf' is configurable.
     inf:                {Query Configurability: exit(0x00000000)} 14:13:56.604
     flq:                Copying 'C:\Users\brian\AppData\Local\Temp\{34eb7d98-debe-4041-8580-81d95820a51c}\oemvista.inf' to 'C:\Windows\System32\DriverStore\Temp\{2a7ab88f-021c-ae48-b2c4-cddf90222b57}\oemvista.inf'.
     flq:                Copying 'C:\Users\brian\AppData\Local\Temp\{34eb7d98-debe-4041-8580-81d95820a51c}\tap0901.cat' to 'C:\Windows\System32\DriverStore\Temp\{2a7ab88f-021c-ae48-b2c4-cddf90222b57}\tap0901.cat'.
     flq:                Copying 'C:\Users\brian\AppData\Local\Temp\{34eb7d98-debe-4041-8580-81d95820a51c}\tap0901.sys' to 'C:\Windows\System32\DriverStore\Temp\{2a7ab88f-021c-ae48-b2c4-cddf90222b57}\tap0901.sys'.
     sto:                {DRIVERSTORE IMPORT VALIDATE} 14:13:56.638
     sig:                     {_VERIFY_FILE_SIGNATURE} 14:13:56.659
     sig:                          Key      = oemvista.inf
     sig:                          FilePath = C:\Windows\System32\DriverStore\Temp\{2a7ab88f-021c-ae48-b2c4-cddf90222b57}\oemvista.inf
     sig:                          Catalog  = C:\Windows\System32\DriverStore\Temp\{2a7ab88f-021c-ae48-b2c4-cddf90222b57}\tap0901.cat
!    sig:                          Verifying file against specific (valid) catalog failed.
!    sig:                          Error 0x800b0109: A certificate chain processed, but terminated in a root certificate which is not trusted by the trust provider.
     sig:                     {_VERIFY_FILE_SIGNATURE exit(0x800b0109)} 14:13:56.674
     sig:                     {_VERIFY_FILE_SIGNATURE} 14:13:56.674
     sig:                          Key      = oemvista.inf
     sig:                          FilePath = C:\Windows\System32\DriverStore\Temp\{2a7ab88f-021c-ae48-b2c4-cddf90222b57}\oemvista.inf
     sig:                          Catalog  = C:\Windows\System32\DriverStore\Temp\{2a7ab88f-021c-ae48-b2c4-cddf90222b57}\tap0901.cat
     sig:                          Success: File is signed in Authenticode(tm) catalog.
     sig:                          Error 0xe0000242: The publisher of an Authenticode(tm) signed catalog has not yet been established as trusted.
     sig:                     {_VERIFY_FILE_SIGNATURE exit(0xe0000242)} 14:13:56.706
!    sig:                     Driver package signer is unknown, but user trusts signer.
     sig:                     Driver package certificate was successfully installed.
     sto:                {DRIVERSTORE IMPORT VALIDATE: exit(0x00000000)} 14:13:59.234
     sig:                Signer Score  = 0x0F000000
     sig:                Signer Name   = OpenVPN Technologies, Inc.
     sto:                {DRIVERSTORE IMPORT BEGIN} 14:13:59.238
     sto:                {DRIVERSTORE IMPORT BEGIN: exit(0x00000000)} 14:13:59.239
     cpy:                {Copy Directory: C:\Windows\System32\DriverStore\Temp\{2a7ab88f-021c-ae48-b2c4-cddf90222b57}} 14:13:59.240
     cpy:                     Target Path = C:\Windows\System32\DriverStore\FileRepository\oemvista.inf_amd64_a572b7f20c402d28
     cpy:                {Copy Directory: exit(0x00000000)} 14:13:59.245
     idb:                {Register Driver Package: C:\Windows\System32\DriverStore\FileRepository\oemvista.inf_amd64_a572b7f20c402d28\oemvista.inf} 14:13:59.246
     idb:                     Created driver package object 'oemvista.inf_amd64_a572b7f20c402d28' in DRIVERS database node.
     idb:                     Created driver INF file object 'oem70.inf' in DRIVERS database node.
     idb:                     Registered driver package 'oemvista.inf_amd64_a572b7f20c402d28' with 'oem70.inf'.
     idb:                {Register Driver Package: exit(0x00000000)} 14:13:59.253
     idb:                {Publish Driver Package: C:\Windows\System32\DriverStore\FileRepository\oemvista.inf_amd64_a572b7f20c402d28\oemvista.inf} 14:13:59.253
     idb:                     Activating driver package 'oemvista.inf_amd64_a572b7f20c402d28'.
     cpy:                     Published 'oemvista.inf_amd64_a572b7f20c402d28\oemvista.inf' to 'oem70.inf'.
     idb:                     Indexed 3 device IDs for 'oemvista.inf_amd64_a572b7f20c402d28'.
     sto:                     Flushed driver database node 'DRIVERS'. Time = 0 ms
     sto:                     Flushed driver database node 'SYSTEM'. Time = 0 ms
     idb:                {Publish Driver Package: exit(0x00000000)} 14:13:59.269
     sto:                {DRIVERSTORE IMPORT END} 14:13:59.272
     dvi:                     Flushed all driver package files to disk. Time = 0 ms
     sig:                     Installed catalog 'tap0901.cat' as 'oem70.cat'.
     sto:                {DRIVERSTORE IMPORT END: exit(0x00000000)} 14:13:59.281
     sto:           {Stage Driver Package: exit(0x00000000)} 14:13:59.281
     sto:      {Setup Import Driver Package - exit (0x00000000)} 14:13:59.281
     dvi:      Searching for hardware ID(s):
     dvi:           tap0901
     dvi:      Class GUID of device changed to: {4d36e972-e325-11ce-bfc1-08002be10318}.
     dvi:      {Plug and Play Service: Device Install for ROOT\NET\0001}
     dvi:           Driver INF Path: C:\Windows\INF\oem70.inf
     dvi:           Driver Node Name: oemvista.inf:3beb73aff103cc24:tap0901.ndi:9.0.0.21:tap0901,
     dvi:           Driver Store Path: C:\Windows\System32\DriverStore\FileRepository\oemvista.inf_amd64_a572b7f20c402d28\oemvista.inf
     dvi:           Searching for hardware ID(s):
     dvi:                tap0901
     dvi:           Class GUID of device changed to: {4d36e972-e325-11ce-bfc1-08002be10318}.
     dvi:           {Core Device Install} 14:13:59.316
     dvi:                {Install Device - ROOT\NET\0001} 14:13:59.316
     dvi:                     Device Status: 0x01802001, Problem: 0x0 (0x00000000)
     dvi:                     Parent device: HTREE\ROOT\0
     dvi:                     {Configure Device - ROOT\NET\0001} 14:13:59.338
     dvi:                          Device Status: 0x01802001, Problem: 0x0 (0x00000000)
     dvi:                          Parent device: HTREE\ROOT\0
     sto:                          {Configure Driver Package: C:\Windows\System32\DriverStore\FileRepository\oemvista.inf_amd64_a572b7f20c402d28\oemvista.inf}
     sto:                               Source Filter  = tap0901
     inf:                               Class GUID     = {4d36e972-e325-11ce-bfc1-08002be10318}
     inf:                               Class Options  = Configurable
     inf:                               {Configure Driver: TAP-Windows Adapter V9}
     inf:                                    Section Name = tap0901.ndi
     inf:                                    {Add Service: tap0901}
     inf:                                         Start Type    = 3
     inf:                                         Service Type  = 1
     inf:                                         Error Control = 1
     inf:                                         Image Path    = \SystemRoot\System32\drivers\tap0901.sys
     inf:                                         Display Name  = TAP-Windows Adapter V9
     inf:                                         Group         = NDIS
     inf:                                         Updated service 'tap0901'.
     inf:                                    {Add Service: exit(0x00000000)}
     inf:                                    Hardware Id  = tap0901
     inf:                                    {Configure Driver Configuration: tap0901.ndi}
     inf:                                         Service Name  = tap0901
     inf:                                         Config Flags  = 0x00000000
     inf:                                    {Configure Driver Configuration: exit(0x00000000)}
     inf:                               {Configure Driver: exit(0x00000000)}
     flq:                               Copying 'C:\Windows\System32\DriverStore\FileRepository\oemvista.inf_amd64_a572b7f20c402d28\tap0901.sys' to 'C:\Windows\System32\drivers\tap0901.sys'.
     cpy:                               Existing file 'C:\Windows\System32\drivers\tap0901.sys' remains unchanged.
     sto:                          {Configure Driver Package: exit(0x00000000)}
     dvi:                          Install Device: Configuring device (oem70.inf:tap0901,tap0901.ndi). 14:13:59.381
     dvi:                          Install Device: Configuring device completed. 14:13:59.381
     dvi:                          Device Status: 0x01802001, Problem: 0x0 (0x00000000)
     dvi:                          Install Device: Starting device 'ROOT\NET\0001'. 14:13:59.396
     dvi:                          Install Device: Starting device completed. 14:13:59.396
!    dvi:                          Device pending start: Device has problem: 0x38 (CM_PROB_NEED_CLASS_CONFIG), problem status: 0x00000000.
     dvi:                     {Configure Device - exit(0x00000000)} 14:13:59.396
     dvi:                     Device Status: 0x01802401, Problem: 0x38
     dvi:                {Install Device - exit(0x00000000)} 14:13:59.412
     dvi:           {Core Device Install - exit(0x00000000)} 14:13:59.412
     dvi:           Waiting for device post-install to complete. 14:13:59.429
!!!  dvi:           Timed out waiting for device post-install to complete. 14:17:44.442
     ump:      {Plug and Play Service: Device Install exit(000005b4)}
!!!  ndv:      Device install failed for device.
!!!  ndv:      Error 1460: This operation returned because the timeout period expired.
     ndv:      Installing NULL driver.
     dvi:      {Plug and Play Service: Device Install for ROOT\NET\0001}
!    dvi:           Installing NULL driver!
     dvi:           {DIF_ALLOW_INSTALL} 14:17:44.626
     dvi:                Default installer: Enter 14:17:44.626
     dvi:                Default installer: Exit
     dvi:           {DIF_ALLOW_INSTALL - exit(0xe000020e)} 14:17:44.626
     dvi:           {DIF_REGISTER_COINSTALLERS} 14:17:44.626
     dvi:                Default installer: Enter 14:17:44.626
     dvi:                Default installer: Exit
     dvi:           {DIF_REGISTER_COINSTALLERS - exit(0x00000000)} 14:17:44.626
     dvi:           {DIF_INSTALLDEVICE} 14:17:44.641
     dvi:                Default installer: Enter 14:17:44.642
!    dvi:                     Installing NULL driver!
     dvi:                     Install Null Driver: Removing device sub-tree. 14:17:44.645
     dvi:                     Install Null Driver: Removing device sub-tree completed. 14:17:44.648
     dvi:                     Install Null Driver: Restarting device. 14:17:44.654
     dvi:                     Install Null Driver: Restarting device completed. 14:17:44.657
     dvi:                     Install Device: Configuring device class. 14:17:44.657
     dvi:                     Install Device: Configuring device class completed. 14:17:44.658
     dvi:                     Device Status: 0x01802401, Problem: 0x1c (0x00000000)
     dvi:                     Install Device: Starting device 'ROOT\NET\0001'. 14:17:44.660
     dvi:                     Install Device: Starting device completed. 14:17:44.664
     dvi:                Default installer: Exit
     dvi:           {DIF_INSTALLDEVICE - exit(0x00000000)} 14:17:44.666
     ump:      {Plug and Play Service: Device Install exit(00000000)}
     ndv: {Update Device Driver - exit(000005b4)}
!!!  ndv: Failed to install device instance 'ROOT\NET\0001'. Error = 0x000005b4
<<<  Section end 2018/11/06 14:17:44.672
<<<  [Exit status: FAILURE(0x000005b4)]

Allow MTU > 1500 (9000 for Jumbo Frames?)

I'd like to try using this virtual TAP adapter as an alternative to the Microsoft Loopback Adapter (now called "KM-TEST"). I was excited to see that this OpenVPN implementation allows for a configurable MTU in the driver properties, but doesn't allow for a value > 1500 to be entered. Would it be possible to support larger values here (e.g. 9000), for the purpose of supporting Jumbo Frames?

Supporting larger MTUs for OpenVPN across VLANs on an internal Jumbo Frame-enabled network could also be another potential use-case for this.

(I could make the necessary edits and build myself, but the lack of a Windows code signing certificate quickly becomes a show-stopper here.)

Thanks!

Latest tap-windows-9.21.2 adapter doesnt work on Windows 10

I tried the latest tap-windows-9.21.2.zip to install on Windows 10 mannuly:


C:>tapinstall.exe install OemVista.inf TAP0901
Device node created. Install is complete when drivers are installed...
Updating drivers for TAP0901 from C:\OemVista.inf.

Drivers installed successfully.

From the commands , looks like its sucessfully installed, also i can see the new created tap connection.
but when i try to use openvpn to connect, i always got notification : No TAP adapters found.
i also tried the other tap driver based client like openconnect got the same kind of errors...
also tried 3 different version of win 10, all the same notification....
it only happens on win 10, the other windows versions all fine, from xp to win 8.1.......

btw 1 weird thing is:
the notification i got its only from doing mannuly installation from tap-windows-9.21.2.zip
which provided these files:
tapinstall.exe
OemVista
tap0901.inf
tap0901.sys

But
the tap-windows-9.21.2.exe auto installer from
https://openvpn.net/index.php/download/community-downloads.html
works fine on win10.

tapinstall.exe
OemVista
tap0901.inf
tap0901.sys

these files are all the same, i double compared md5 from the .zip and the .exe autoinstaller.
so very weird that the command created tap adpter connection doesnt work:
tapinstall.exe install OemVista.inf TAP0901

anyone knows how does the auto installer work on win 10?
i guess it has something to do with regedit...

TrustedPublisher issue

With latest install package for Windows, I was previously injecting the TrustedPublisher certificate from the tap installer. That way, the install process could be completely silent.

However, I discovered your latest openvpn installer is adding an outdated Trusted Publisher certificate. This is breaking my silent installer because my (correct) TrustedPublisher certificate got overridden by yours (incorrect) and the tap driver couldn't be automatically installed.

Two solutions:

  • either do not add a TrustedPublisher certificate with the openvpn installer
  • just update the certificate you install by the one from the tab driver installer.

Right now, to circumvent this issue I had to launch AutoIT cmdlets tool to locate the Windows Security dialog on the screen and simulate a click on the Install button I had to install with /SELECT_TAP=0 and install the tap interface manually.

Injecting the publisher certificate into the Trusted Publisher store prior to running tapinstall.exe

According to Trac#798 silent installations of tap-windows6 driver fail if our publisher certificate is not in the Trusted Publishers store before installing the driver. This happens because Windows pops up / would pop up a messagebox that asks about trusting the publisher. To solve this the publisher certificate has to be injected into the certificate store.

What need is

  • A way to define which publisher certificate to inject (e.g. command-line option to buildtap.py)
  • Embed the defined certificate to the installer at the packaging phase (-p)
  • Run certificate injection code in the installer before running tapinstall.exe

Windows 10 remove tap failed

C:\Program Files\TAP-Windows\bin>tapinstall.exe remove tap0901
ROOT\NET\0000                                               : Remove failed
No devices were removed.

Packets freeze/stall for several seconds on Windows 7 with NDIS 6

I'm on Windows 7 x64, using commercial anonymous VPN services with OpenVPN, and for a few days I've been trying to track down an issue where every once in a while all packets sent or received from OpenVPN would not be delivered. I was eventually able to find a simple trigger event which reproduces it 100% of the time:

  1. Run the NXT RuneScape Launcher.
  2. When the Launcher's progress bar says "loading application resources" and the progress bar is about one-fifth of the way across, all packets across the entire system will be stalled.
  3. After 5-10 seconds, packets get delivered again. The packets seem to be queued; if I send a ping before the stall, often I will receive the reply after it, several seconds later.

I have also observed it:

  • Sometimes when the Battle.net launcher starts, though not always.
  • Every few minutes in-game in RuneScape.

It does not occur merely under heavy activity; I can get a pretty good download speed, for example, without an excessive amount of packet loss. I also tested that it is not brought on by high CPU or GPU activity. I tried two different anonymous VPN services, and many different servers within each, with no change. I tried all sorts of MTU-related fixes, even though my MTU appears by testing to be the normal 1472. I tried disabling all security software.

It seems to be triggered by some very particular situation either with a series of packets or some action of the OS which freezes the TAP-Windows thread. Eventually I found this forum thread which describes a similar problem, and as recommended there I downgraded to TAP-Windows NDIS 5. This fixes it. Therefore, it seems to be a bug in Tap-Windows NDIS 6

For people who got code 52 error

Currently I'm testing 9.24.2 on Windows 10 Pro x64 with Secure Boot enabled. And it works fine.
I've done some research and got conclusion:
9.21.2 works on Windows 7. For Windows 10, it needs to disable Secure Boot.
9.24.2 works on Windows 10 with Secure Boot enabled. For Windows 7, it needs to install KB4474419.

tap-windows6 9.21.0 hangs forever when writing

I installed a virtual network device using tap-windows6 9.21.0 (from the OpenVPN Experimental versions page) on my Windows 7 x64 system. Unfortunately, every time I try to write a packet to the device handle, it hangs forever.

I wrote a small program to reproduce the issue. All the program does is open the device, enable it, read one packet, write the packet back, and close the device. Here's the output with tap-windows6 9.21.0:

>tap-win32-test.exe {FE35ADE5-E728-4DAC-9ABA-6C29C2EBE8D3}
Opening device with path: \\.\Global\{FE35ADE5-E728-4DAC-9ABA-6C29C2EBE8D3}.tap
Device successfully opened
Setting media status to connected
Media status set
Reading one packet
Successfully read one packet of size 42
Writing the packet back

It then hangs forever. Not only that, but the process cannot be killed, leading me to believe the driver state is messed up. (As a side note, the packet size that it reads (42) looks suspicious - I did not check the contents)

In contrast, here's the output on the same system with the driver included in the latest stable OpenVPN (2.3.4, driver version 9.0.0.9):

>tap-win32-test.exe {2D55947C-C6E0-483B-8978-7417BE0BDD9C}
Opening device with path: \\.\Global\{2D55947C-C6E0-483B-8978-7417BE0BDD9C}.tap
Device successfully opened
Setting media status to connected
Media status set
Reading one packet
Successfully read one packet of size 342
Writing the packet back
Successfully wrote 342 bytes
Closing device

Missing packet fragmentation for packets larger than configured MTU

It appears that UDP packets which are larger than the user-configured MTU are not properly fragmented before transmission.

For example, if attempting to transmit a UDP packet of size 1450 and the MTU is set to 1400, the packet is not fragmented via IP packet fragmentation but transmitted as-is. The driver based on NDIS 5 on the other hand does proper packet fragmentation. This can be seen by using for example Wireshark.

Upgrade issue on 2012 R1 systems only - TAP 5 to TAP 6

Good day,

I have been looking into a TAP 5 to TAP6 upgrade issue that appears to only impact 2012 R1 systems, and wanted to pass my findings back for your consideration.

So on a 2012 R1 system that has TAP 5 installed, when you attempt to perform the upgrade the process will fail with an event like the following in the setupapi.dev.log:

 dvi:                     {Restarting Devices} 13:50:42.291
 dvi:                          Restart: ROOT\NET\0000

!!! dvi: Device not started: Device has problem: 0x1f: CM_PROB_FAILED_ADD.

When you look within Device Manager you can have one of two possible states:

  • Driver shows that it needs a system restart in Device Manager. Do the restart and now shows Code 31
  • Have driver disabled before you do the upgrade, upon install it goes right into Code 31

The error in Device Manager shows as:

This device is not working properly because Windows cannot load the drivers required for this device. (Code 31)

Doing some review I found that the ‘_MediaType’ and ‘_PhysicalMediaType’ registry keys under the adapter instance for tap0901 are not being written in this upgrade scenario. If you manually add these two missing keys the driver is now able to start without issue.

Working the issue I found two possible solutions:

Option 1 is to manually add the two missing registry keys for the driver before you do your upgrade to TAP 6.

Option 2 is slightly more involved.

If we look within OEMVISTA INF, after the blank Characteristics value (due to issue 15), currently we have the following:

[tap0901.ndi]
   CopyFiles       = tap0901.driver, tap0901.files
   AddReg          = tap0901.reg
   AddReg          = tap0901.params.reg
   Characteristics = 
   *IfType            = 0x6 ; IF_TYPE_ETHERNET_CSMACD
   *MediaType         = 0x0 ; NdisMedium802_3
   *PhysicalMediaType = 14  ; NdisPhysicalMedium802_3

To allow the INF to always lay these three keys down, moving them within the AddReg for tap0901.reg allows the upgrade to proceed without issue, just as a suggestion.

[tap0901.ndi]
   CopyFiles       = tap0901.driver, tap0901.files
   AddReg          = tap0901.reg
   AddReg          = tap0901.params.reg
   Characteristics = 

[tap0901.ndi.Services]
   AddService = tap0901,        2, tap0901.service

[tap0901.reg]
   HKR, Ndi,            Service,      0, "tap0901"
   HKR, Ndi\Interfaces, UpperRange,   0, "ndis5"
   HKR, Ndi\Interfaces, LowerRange,   0, "ethernet"
   HKR, ,               Manufacturer, 0, "%Provider%"
   HKR, ,               ProductName,  0, "%DeviceDescription%"
   HKR, ,               *IfType,  0x00010001, 6
   HKR, ,               *MediaType,  0x00010001, 0
   HKR, ,               *PhysicalMediaType,  0x00010001, 14

Supporting evidence.

If we have a Procmon capture running while the installer does the upgrade from TAP 5 to 6, when the HKLM\System\CurrentControlSet\Control\Network\NDISTempKey\ structure is built we don’t see any events for MediaType or PhysicalMediaType. The only events we see are attempts to query the keys and them reported as not found:

8:05:40.9829317 PM DrvInst.exe 10104 RegQueryValue HKLM\System\CurrentControlSet\Control\Class{4d36e972-e325-11ce-bfc1-08002be10318}\0013MediaType NAME NOT FOUND Length: 144
8:05:40.9829514 PM DrvInst.exe 10104 RegQueryValue HKLM\System\CurrentControlSet\Control\Class{4d36e972-e325-11ce-bfc1-08002be10318}\0013
PhysicalMediaType NAME NOT FOUND Length: 144

When you perform a fresh clean install of TAP 6 on the same system, once again when the NDISTempKey structure is built we don’t see any events for these keys. But we do see rather than a Query call DrvInst Set’s both of these keys:

8:11:06.0012482 PM DrvInst.exe 3024 RegSetValue HKLM\System\CurrentControlSet\Control\Class{4d36e972-e325-11ce-bfc1-08002be10318}\0013MediaType SUCCESS Type: REG_DWORD, Length: 4, Data: 0
8:11:06.0013126 PM DrvInst.exe 3024 RegSetValue HKLM\System\CurrentControlSet\Control\Class{4d36e972-e325-11ce-bfc1-08002be10318}\0013
PhysicalMediaType SUCCESS Type: REG_DWORD, Length: 4, Data: 14

Now for comparison when we move these three keys down into the AddReg call, when the NDISTempKey is built we see all three listed, then added to the adapter instance location, and finally the Query Value call’s succeed.

8:24:59.5386870 PM DrvInst.exe 6304 RegSetValue HKLM\System\CurrentControlSet\Control\Network\NDISTempKeyIfType SUCCESS Type: REG_DWORD, Length: 4, Data: 6
8:24:59.5387484 PM DrvInst.exe 6304 RegSetValue HKLM\System\CurrentControlSet\Control\Network\NDISTempKey
MediaType SUCCESS Type: REG_DWORD, Length: 4, Data: 0
8:24:59.5388187 PM DrvInst.exe 6304 RegSetValue HKLM\System\CurrentControlSet\Control\Network\NDISTempKey*PhysicalMediaType SUCCESS Type: REG_DWORD, Length: 4, Data: 14

8:24:59.8681578 PM DrvInst.exe 6304 RegSetValue HKLM\System\CurrentControlSet\Control\Class{4d36e972-e325-11ce-bfc1-08002be10318}\0013IfType SUCCESS Type: REG_DWORD, Length: 4, Data: 6
8:24:59.8682016 PM DrvInst.exe 6304 RegSetValue HKLM\System\CurrentControlSet\Control\Class{4d36e972-e325-11ce-bfc1-08002be10318}\0013
MediaType SUCCESS Type: REG_DWORD, Length: 4, Data: 0
8:24:59.8683201 PM DrvInst.exe 6304 RegSetValue HKLM\System\CurrentControlSet\Control\Class{4d36e972-e325-11ce-bfc1-08002be10318}\0013*PhysicalMediaType SUCCESS Type: REG_DWORD, Length: 4, Data: 14

8:24:59.8746089 PM DrvInst.exe 6304 RegQueryValue HKLM\System\CurrentControlSet\Control\Class{4d36e972-e325-11ce-bfc1-08002be10318}\0013MediaType SUCCESS Type: REG_DWORD, Length: 4, Data: 0
8:24:59.8746259 PM DrvInst.exe 6304 RegQueryValue HKLM\System\CurrentControlSet\Control\Class{4d36e972-e325-11ce-bfc1-08002be10318}\0013
PhysicalMediaType SUCCESS Type: REG_DWORD, Length: 4, Data: 14

Thanks,

Matthew

Build tap with new component id,but it doesnt work?

I have build tap with new component id such as "tap1". When I finish everything and install it on my computer(win10), I found wireshark could not get any data in this virtual adapter.
If I build tap with the default component id "tap0901", everything seems alright。

Possible False Positive (virus) for prebuilt driver binary?

The IT dept where I work - requires that they pass all packages through www.virustotal.com before we can use them internally - end of story - full stop - I can't change this.

When our IT dept does this, the file/link:

https://build.openvpn.net/downloads/releases/tap-windows-9.24.2-I601-Win10.exe

Reports virus hit - for or with "Secure Age APEX - ! Malicious"

yes - I am aware that this could very well be a false positive, my only solution is to report it up the chain of command for the outside package hoping that it can be addressed by the powers that be in that project.

Hence I'm reporting this - if you can please provide an update when available that would be helpful.

Thanks

ndis miniport characteristics missing

Commit 2ab5e88 introduced a 'g' before the definition of PRODUCT_TAP_WIN_CHARACTERISTICS in version.m4, which doesn't match the regex in buildtap.py's BuildTAPWindows.parse_version_m4 method. Consequently, the generated INF describes the characteristics of the device as "" (the empty string), which erroneously becomes a 0 in the registry, rather than the correct value of 0x81 (NCF_VIRTUAL | NCF_HAS_UI).

when use intel wireless AC8265 and AC 7265 with HP PC will run erro

I have two HP computers. When I use one of the devices with Intel AC 8265 wireless network card model, the wireless network will stop working automatically after I start TAP, but it can work normally when I use the network cable. When I start tap with Intel AC 7260 wireless network card model and use WiFi, there will be no exception. What's the reason? What is the orientation of the analysis?

Installer for 9.22.1 throws a signature error.

After installing 9.22.1 the adapter in device manager throws the following error.

Windows cannot verify the digital signature for the drivers required for this device. A recent hardware or software change might have installed a file that is signed incorrectly or damaged, or that might be malicious software from an unknown source. (Code 52)

Microsoft Windows 10 Enterprise 2016 LTSB
10.0.14393 Build 14393

Microsoft Windows 10 Pro
10.0.16299 Build 16299

documentation for developers

Hi
could you provide documentation how to use your driver in my own application?
I am trying to make my own vpn but I can't find any informations how to create my own tap interface on windows

Bridged TAP adapter fails after hibernation.

I am using Windows Server 2012 R2. My network card adapter is bridged with TAP adapter, which is used by OpenVPN. Somewhere since November Windows update, when computer gets up from hibernation, my OpenVPN service started to stop working properly.

I've tracked this down to TAP adapter being recreated (or something like, dunno) after the wakeup. If i remove TAP adapter from the bridge and then re-add it back, it starts to work.

Any idea how to fix it?

9.23.3 not working with Secure Boot enabled, 9.23.2 works.

Hi,

While this problem seems similar to #49 the solution proposed there does not work.

The error shown is the same, the signature cannot be verified and error code 52.
setupdev.log is surprisingly empty so not much help here.

Tried installing TAP-Windows 9.23.3 manually (Win10, Win7 and generic installer), as well as OpenVPN 2.4.7 (Win10 installer). In all these cases the TAP driver shows the error and doesn't work.

image (1)

Entering the firmware configuration and disabling Secure Boot (while driver signature enforcement is still enabled in Windows 10), the TAP driver works.

Tried installing TAP-Windows 9.23.2 and it works, both with and without Secure Boot.

image (2)

9.23.3 also works in BIOS based devices, where Secure Boot is not available at all.

The tested Windows 10 was build 17763.

Problem with 802.1Q marked frames with OpenVPN Client

Found an issue regarding the handling of 802.1Q (VLAN) tagged frames in the latest version of OpenVPN in Windows.

My setup:

  • A Linux-VM with OpenVPN server configured in Layer 2 bridge mode
  • A Windows VM with OpenVPN client configured in Layer 2 bridge mode

If the Linux send a frame with VLAN tags into the tunnel, this frame is corrupted (Source MAC is wrong) when the packet leaves the TAP interface in Windows. In detail, the last 4 bytes of the destination MAC (bytes 8..11 in frame) are identical to bytes 5..7 in the frame.

Maybe this is related to this merge request: #81

I observed the problem with OpenVPN 2.4.9, with OpenVPN 2.4.7 everything works fine.

SixxS AICCU utility hangs on Ctrl-C forever

I have tried another application using TAP interface, AICCU that is used to create SiXXS IPv6 tunnel useful for those without native IPv6 access.

AICCU does not be able to send/receive packets via this interface (that's another issue) but it hangs completely when trying to close the tunnel by pressing Ctrl-C in the AICCU window (it is a console application). The process stays and nothing is able to kill it.

I have followed advice in Mark Russinovich article on Unkillable Processes.

Here's the output from the debugger, I was using 080540d version of the git code, compiled by myself with WinDDK.

Opened log file 'c:\temp\hung.txt'
0: kd> !process 0 7 aiccu-2012-02-02-windows-console.exe
PROCESS 864566e0  SessionId: 1  Cid: 0f74    Peb: 7ffd6000  ParentCid: 14f4
    DirBase: 7ce08a60  ObjectTable: c368ed50  HandleCount:   2.
    Image: aiccu-2012-02-02-windows-console.exe
    VadRoot 86075238 Vads 72 Clone 0 Private 279. Modified 0. Locked 0.
    DeviceMap b81eede0
    Token                             bef43c38
    ElapsedTime                       00:23:41.035
    UserTime                          00:00:02.698
    KernelTime                        00:00:00.171
    QuotaPoolUsage[PagedPool]         95568
    QuotaPoolUsage[NonPagedPool]      3776
    Working Set Sizes (now,min,max)  (1173, 50, 345) (4692KB, 200KB, 1380KB)
    PeakWorkingSetSize                1173
    VirtualSize                       54 Mb
    PeakVirtualSize                   60 Mb
    PageFaultCount                    2109
    MemoryPriority                    BACKGROUND
    BasePriority                      8
    CommitCharge                      341

        THREAD 861c3d38  Cid 0f74.1194  Teb: 7ffde000 Win32Thread: 00000000 WAIT: (Executive) KernelMode Non-Alertable
            85efa1c8  Thread
        IRP List:
            8827abf0: (0006,0094) Flags: 00060a00  Mdl: 861dd2d0
        Not impersonating
        DeviceMap                 b81eede0
        Owning Process            864566e0       Image:         aiccu-2012-02-02-windows-console.exe
        Attached Process          N/A            Image:         N/A
        Wait Start TickCount      654696         Ticks: 34621 (0:00:09:00.091)
        Context Switch Count      346             
        UserTime                  00:00:00.000
        KernelTime                00:00:00.000
        Win32 Start Address 0x0040b074
        Stack Init c7af4000 Current c7af3bb0 Base c7af4000 Limit c7af1000 Call 0
        Priority 10 BasePriority 8 PriorityDecrement 2 IoPriority 2 PagePriority 5
        ChildEBP RetAddr  Args to Child              
        c7af3bc8 834ca23a 861c3d38 861c3dc0 00000000 nt!KiSwapContext+0x26 (FPO: [Uses EBP] [0,0,4])
        c7af3c0c 83465f38 861c3d38 85efa1c8 85efa410 nt!KiSwapThread+0x44f
        c7af3c64 836367bc 85efa1c8 00000000 00000000 nt!KeWaitForSingleObject+0x492
        c7af3cdc 8361347f 80000004 861c3d38 861c3d01 nt!PspExitThread+0x214
        c7af3cf4 834d1e8e 8852d8b8 c7af3d20 c7af3d2c nt!PsExitSpecialApc+0x22
        c7af3d4c 83468d42 00000001 00000000 c7af3d64 nt!KiDeliverApc+0x1dc
        c7af3d4c 77415d14 00000001 00000000 c7af3d64 nt!KiServiceExit+0x56 (FPO: [0,3] TrapFrame @ c7af3d64)
        02b4e674 00000000 00000000 00000000 00000000 ntdll!KiFastSystemCallRet (FPO: [0,0,0])

        THREAD 85efa1c8  Cid 0f74.095c  Teb: 7ffdd000 Win32Thread: 00000000 WAIT: (DelayExecution) KernelMode Non-Alertable
            85efa250  NotificationTimer
        IRP List:
            85e82c90: (0006,0094) Flags: 00060a00  Mdl: 88304b80
        Not impersonating
        DeviceMap                 b81eede0
        Owning Process            864566e0       Image:         aiccu-2012-02-02-windows-console.exe
        Attached Process          N/A            Image:         N/A
        Wait Start TickCount      698682       
        Context Switch Count      96771             
        UserTime                  00:00:00.000
        KernelTime                00:00:00.031
        Win32 Start Address 0x0040b074
        Stack Init b35bf000 Current b35beb88 Base b35bf000 Limit b35bc000 Call 0
        Priority 8 BasePriority 8 PriorityDecrement 0 IoPriority 2 PagePriority 5
        ChildEBP RetAddr  Args to Child              
        b35beba0 834ca23a 85efa1c8 85efa250 83516920 nt!KiSwapContext+0x26 (FPO: [Uses EBP] [0,0,4])
        b35bebe4 834c790e 85efa1c8 837df382 85efa3f4 nt!KiSwapThread+0x44f
        b35bec44 83636ce9 00000000 00000000 b35bec70 nt!KeDelayExecutionThread+0x472
        b35bec78 83636a67 48f0a97f 8852d8b8 80000004 nt!IoCancelThreadIo+0x70
        b35becdc 8361347f 80000004 85efa1c8 85efa201 nt!PspExitThread+0x4bf
        b35becf4 834d1e8e 8852d8b8 b35bed20 b35bed2c nt!PsExitSpecialApc+0x22
        b35bed4c 83468d42 00000001 00000000 b35bed64 nt!KiDeliverApc+0x1dc
        b35bed4c 77415d14 00000001 00000000 b35bed64 nt!KiServiceExit+0x56 (FPO: [0,3] TrapFrame @ b35bed64)
        02d4e5d4 00000000 00000000 00000000 00000000 ntdll!KiFastSystemCallRet (FPO: [0,0,0])


0: kd> !irp 8827abf0
Irp is active with 1 stacks 3 is current (= 0x8827aca8)
 Mdl=861dd2d0: System buffer=c17c56a0: Thread 861c3d38:  Irp is completed.  
     cmd  flg cl Device   File     Completion-Context
 [  4, 0]   0  0 86229030 00000000 00000000-00000000    
           \Driver\tap0901
            Args: 00000000 00000000 00000000 00000000
0: kd> !irp 85e82c90
Irp is active with 1 stacks 3 is current (= 0x85e82d48)
 Mdl=88304b80: System buffer=c19a7600: Thread 85efa1c8:  Irp is completed.  
     cmd  flg cl Device   File     Completion-Context
 [  4, 0]   0  0 86229030 00000000 00000000-00000000    
           \Driver\tap0901
            Args: 00000000 00000000 00000000 00000000
0: kd> .logclose
Closing open log file c:\temp\hung.txt

https://gist.github.com/saper/cddef78c5780e017dd35

TAP Adapter 9.24.* has 1 GB limitation

i use tun2socks with tap adapter to work as vpn, the issue comes when it reached 1 gb network usage then its stopped sending and receiving after that unless i try to reconnect again, so i tried to reinstall the tap adapter driver with version 9.23.* and it worked. it could pass 1 GB, is the issue comes from TAP Adapter or Tun2socks? i can't tell

i use windows 10 64-bit version 10.0.18363.752 if that's in the case

WHLK testing for Windows 10 2004

Running the tests for the 2004 version of Windows 10, running into a bunch of failures, with several blue screens, on both the Client and the Support machine.

  • 1c_ioctlcoverage
  • 1c_Mini6PerfSend
  • 1c_Mini6Send
  • 1c_OidsDeviceIoControl
  • 1c_WMICoverage
  • 2c_Mini6Performance
  • 2c_OidsNdisRequest
  • 2c_Priority
  • AddressChange
  • PacketFilters
  • ShortPackets

Has anyone managed to get a successful pass on the 2004 build yet with Product Type LAN? Or anyone have an idea how to get these passing. A lot of the failures seem to revolve around failing to query OIDs.

Not able to verify source code. Push signed git tags?

Hi,
From what I can see, this repository does neither have any signed commits, nor tags. As such, it's not possible to get any type of guarantee that the code I checked out is from you or can be trusted. We want to build our own TAP driver and sign it. But we want to be relatively sure that what we sign is not something bad.

Would it be possible to push a signed git tag pointing to the commit the latest release was built from, like you do in the main OpenVPN repository? And subsequently the same for future releases.

I have a commit with hash 01fbfb9451e1cbb3a6d33cb2975ae7fb21df90ed here, that bumps the driver version to 9.24.2.601.

Build is not working: .cat & .sys files are not created

Trying to build default driver.

  1. Installed Python 2.7.14
  2. Installed Windows Driver Kit Version 7.1.0 (C:\WinDDK\7600.16385.1)
    Didn't change anything, trying just a default build.
    Running python buildtap.py -b
    Got nothing, only 'OemVista.inf' files in dist. In the output see "2 errors..".
    Found them in buildfre_wlh_x86.err:
0>CanonicalizePathName: GetFileAttributesW(c:\winddk\7600.16385.1\lib\wlh\*\ --> c:\winddk\7600.16385.1\lib\wlh\*\) failed - rc = 123.
0>CanonicalizePathName: GetFileAttributesW(c:\winddk\7600.16385.1\lib\wlh\*\ --> c:\winddk\7600.16385.1\lib\wlh\*\) failed - rc = 123.

The same on Win10... It's bug?

Changed in buildtap.py to build only x86, and edited in setenv.bat (C:\WinDDK\7600.16385.1\bin) this path
set SDK_LIB_PATH=%BASEDIR%\lib\%_ddkspec%\*
to:
set SDK_LIB_PATH=%BASEDIR%\lib\%_ddkspec%\i386

As a result - no errors, but still have neither .cat not .sys files.

What am I doing wrong?
Is this build broken now?

IPV4 - routes, and such - confused

I'm not getting any IPV4 packets out of the TUN driver in P2P mode.
I don't understand why and I am a bit confused.

It seems that no matter what I do, I do not get IPv4 Traffic - I see IPv6 but no IPv4

What I don't know how to do is determine the route windows wants to use.

Interface configuration:

Unknown adapter Local Area Connection:

   Connection-specific DNS Suffix  . :
   Description . . . . . . . . . . . : TAP-Windows Adapter V9
   Physical Address. . . . . . . . . : 00-FF-0D-20-6E-9E
   DHCP Enabled. . . . . . . . . . . : No
   Autoconfiguration Enabled . . . . : Yes
   Link-local IPv6 Address . . . . . : fe80::456:c9a:9c24:6df3%17(Preferred)
   IPv4 Address. . . . . . . . . . . : 10.168.42.1(Preferred)
   Subnet Mask . . . . . . . . . . . : 255.255.255.252
   Default Gateway . . . . . . . . . :
   DHCPv6 IAID . . . . . . . . . . . : 285277965
   DHCPv6 Client DUID. . . . . . . . : 00-01-00-01-25-2F-CD-E0-98-E7-43-7A-1E-F9
   DNS Servers . . . . . . . . . . . : fec0:0:0:ffff::1%1
                                       fec0:0:0:ffff::2%1
                                       fec0:0:0:ffff::3%1
   NetBIOS over Tcpip. . . . . . . . : Enabled

I read in the OpenVPN source code that, in P2P mode, the network mask must be exactly 255.255.255.252 - so that's what I have.

I also see in the same code, the IP address for the WINDOWS side (last bits) must be 1 or 2, and the REMOTE side must be the other 2 or 1.

Thus, I configured the windows interface as 10.168.42.1, my remote side is 10.168.42.2

The ROUTING TABLES are as follows:

IPv4 Route Table
===========================================================================
Active Routes:
Network Destination        Netmask          Gateway       Interface  Metric
          0.0.0.0          0.0.0.0      10.168.99.1    10.168.99.195     25
      10.168.42.0  255.255.255.252         On-link       10.168.42.1    281
      10.168.96.0    255.255.252.0         On-link     10.168.99.195    281
    10.168.99.195  255.255.255.255         On-link     10.168.99.195    281
    10.168.99.255  255.255.255.255         On-link     10.168.99.195    281
        127.0.0.0        255.0.0.0         On-link         127.0.0.1    331
        127.0.0.1  255.255.255.255         On-link         127.0.0.1    331
  127.255.255.255  255.255.255.255         On-link         127.0.0.1    331
      169.254.0.0      255.255.0.0         On-link     169.254.13.25    281
    169.254.13.25  255.255.255.255         On-link     169.254.13.25    281
  169.254.255.255  255.255.255.255         On-link     169.254.13.25    281
     192.168.56.0    255.255.255.0         On-link      192.168.56.1    281
     192.168.56.1  255.255.255.255         On-link      192.168.56.1    281
   192.168.56.255  255.255.255.255         On-link      192.168.56.1    281
    192.168.125.0    255.255.255.0         On-link     192.168.125.1    291
    192.168.125.1  255.255.255.255         On-link     192.168.125.1    291
  192.168.125.255  255.255.255.255         On-link     192.168.125.1    291
    192.168.162.0    255.255.255.0         On-link     192.168.162.1    291
    192.168.162.1  255.255.255.255         On-link     192.168.162.1    291
  192.168.162.255  255.255.255.255         On-link     192.168.162.1    291
        224.0.0.0        240.0.0.0         On-link         127.0.0.1    331
        224.0.0.0        240.0.0.0         On-link      192.168.56.1    281
        224.0.0.0        240.0.0.0         On-link     192.168.125.1    291
        224.0.0.0        240.0.0.0         On-link     192.168.162.1    291
        224.0.0.0        240.0.0.0         On-link     10.168.99.195    281
        224.0.0.0        240.0.0.0         On-link     169.254.13.25    281
        224.0.0.0        240.0.0.0         On-link       10.168.42.1    281
  255.255.255.255  255.255.255.255         On-link         127.0.0.1    331
  255.255.255.255  255.255.255.255         On-link      192.168.56.1    281
  255.255.255.255  255.255.255.255         On-link     192.168.125.1    291
  255.255.255.255  255.255.255.255         On-link     192.168.162.1    291
  255.255.255.255  255.255.255.255         On-link     10.168.99.195    281
  255.255.255.255  255.255.255.255         On-link     169.254.13.25    281
  255.255.255.255  255.255.255.255         On-link       10.168.42.1    281
===========================================================================
Persistent Routes:
  None

I have 3 tests I've tried:
Method 1: ping 10.168.42.2 - I would expect some activity
Method 2: ping -6 -S localipv6address someipv6addressonnetwork
Method 3: curl -o foo http://10.168.42.2

For case 2, The IPv6 seems to work using linked local addresse (fe80), and specifying the target address as the same as the ipv6 addres but +1, thus it is on the same IPv6 segment. This works, I see packets out of the tun driver but no IPv4 packets.

WHLK testing status

Hi,

Hass anybody tried WHLK (kit 1804) testing for corresponding driver on windows 10 client machine.
In my attempt, i am encountering basic PNP Device removal test failure. any suggestion to solve.

Thanks
Amit

Unable to utilize gigabit channel

Hello.
I have Windows 2012 R2 hosts running OpenVPN with minimalistic config, no encryption and no compression.

Problem is, they could not exceed ~300 Mbps over OpenVPN channel. I thought OpenVPN core was the one to blame, so I switched to 5 separate peer to peer OpenVPN networks, rather than having 1 server and 5 clients in a single network. Each network is handled by it's own OpenVPN process, but cumulative speed (all 5 networks combined) is still limited by 300 Mbps.

Looks like tap0901.sys is the bottleneck.

My config for every client looks like this

ifconfig 10.x.2.2 10.x.2.1
dev tun
proto tcp-server
port 8148
secret static.key
cipher none

tun/tap tcp/udp don't affect speed much.

Windows cannot verify the digital signature

Hello,

I made the unfortunate mistake of upgrading from an older version of openvpn to the latest 2.4.8, under Windows 7 (ultimate, service pack 1). The machine has no internet access, its only being used internally.

What happened is, openvpn installed ok but the TAP interface disappeared. The device manager shows a yellow triangle with an exclamation, next to the TAP-Windows Adapter V9, and the device status says:

Windows cannot verify the digital signature for the drivers required for this device. A recent hardware or software change might have installed a file that is signed incorrectly or damaged, or that might be malicious software from an unknown source. (Code 52)

Anyone knows if its possible to recover from this situation?

Thank you.

UpdateDriverForPlugAndPlayDevices failed, GetLastError=87 What can I do?

We are running on a 64-bit system.
Output folder: C:\Program Files\TAP-Windows\bin
Extract: tapinstall.exe
Output folder: C:\Program Files\TAP-Windows\driver
Extract: OemVista.inf
Extract: tap0901.cat
Extract: tap0901.sys
Delete file: C:\ProgramData\Microsoft\Windows\Start Menu\Programs\TAP-Windows\Utilities\Add a new TAP virtual ethernet adapter.lnk
Delete file: C:\ProgramData\Microsoft\Windows\Start Menu\Programs\TAP-Windows\Utilities\Delete ALL TAP virtual ethernet adapters.lnk
Remove folder: C:\ProgramData\Microsoft\Windows\Start Menu\Programs\TAP-Windows\Utilities
Remove folder: C:\ProgramData\Microsoft\Windows\Start Menu\Programs\TAP-Windows
Create folder: C:\ProgramData\Microsoft\Windows\Start Menu\Programs\TAP-Windows\Utilities
Create shortcut: C:\ProgramData\Microsoft\Windows\Start Menu\Programs\TAP-Windows\Utilities\Add a new TAP virtual ethernet adapter.lnk
Create shortcut: C:\ProgramData\Microsoft\Windows\Start Menu\Programs\TAP-Windows\Utilities\Delete ALL TAP virtual ethernet adapters.lnk
Output folder: C:\Program Files\TAP-Windows\include
Extract: tap-windows.h
Output folder: C:\Program Files\TAP-Windows
Extract: license.txt
Extract: icon.ico
tapinstall.exe hwids returned: 0
TAP install (tap0901) (May require confirmation)
Device node created. Install is complete when drivers are installed...
Updating drivers for tap0901 from C:\Program Files\TAP-Windows\driver\OemVista.inf.
UpdateDriverForPlugAndPlayDevices failed, GetLastError=87
tapinstall.exe failed.
tapinstall.exe returned: 2
tapinstall.exe cumulative status: 2
Created uninstaller: C:\Program Files\TAP-Windows\Uninstall.exe
Completed

BSOD on windows 8.1

We are seeing BSOD on windows 8.1.
I saw few posts where it is stated that wdk 7 builds drivers for windows 7 only, not for windows 8 and above. That can be a reason for this issue.
Are there any plans to build tap-windows6 using WDK 8 or 10?

Thanks
AP

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.