We have written an application that manages OpenVPN from the tray as an add-on for a bigger software package.
OpenVPN includes a file called tapinstall.exe that installs the OpenVPN adapter (or any driver for that matter). Doing some research, this file is the exact same as a command-line tool called devcon that Microsoft includes in the Windows DDK. The OpenVPN guys just renamed it for their use.
So we use it during our setup (msi) installer in a custom action to install the driver, which for the most part, works just fine.
Every now and again, devcon fails and hangs–never exiting. After that point, you can re-run devcon and it will install the driver twice… which basically breaks OpenVPN.
Has anyone seen this issue with devcon, know what it’s doing, or know a way to fix it?
As an alternate solution, does anyone know how to install a driver from C#? (we have a .inf and a .sys file)
UPDATE: We’ve found this issues to be pretty rare. It occurs most often when we’ve applied an update where we uninstall the V8 version of the OpenVPN adapter and then install the new version (V9) of the OpenVPN adapter. It also seems to not happen if you restart your PC in between installs, so we might be better off forcing a PC restart on uninstall….
SIDE NOTE: I’ve heard of people using WiX and the DifxAPI (I think that is what it’s called) to install drivers from an MSI installer. Any ideas if this can be done from plain C# in a custom action? We don’t really want to start over with our setup project using WiX (it could be time consuming).
I don’t have a solution for your problem, but here are some ideas:
The source code for DevCon is available as part of the Windows DDK under DDK root\Src\Setup\Devcon. If your problem is reproducable, you could build your own version and debug it in your IDE.
The sources of the OpenVPN installer can be found in the OpenVPN SVN repository. You could compare how DevCon is invoked and see if the OpenVPN is doing it in a way that prevents the problem.
INF files can be installed from the command line using something like
rundll32 syssetup,SetupInfObjectInstallAction DefaultInstall 128 .\<file>.infbut I’d guess that DevCon is doing more than that, so I don’t know if this is a viable way. There has to be some reason obviously why the OpenVPN installer is using DevCon, right?
@update:
The OpenVPN installer seems to set a “Reboot Flag” depending of the return value of DevCon.
@side note:
I’d guess you should be able to port DevCon to C# using P/Invokes. DevCon apparently is just a wrapper around SetupAPI and DIFxAPI.
DIFxAPI
Documentation:
P/Invokes:
Test program:
Output:
The program must be run as administrator, otherwise you get an
ERROR_ACCESS_DENIED.If the driver is already installed you get an
ERROR_NO_MORE_ITEMS.