Hi, > > As per setupapi.dev.log, it appears that step 4 (d) is failing with some > access error to the driver store unless elevated to SYSTEM (see Trac 1321). > This leaves the adapter not fully configured. Hard to say exactly what fails > as none of the function calls return any error.
I can confirm that. This call /* Install the device. */ if (!SetupDiCallClassInstaller( DIF_INSTALLDEVICE, hDevInfoList, &devinfo_data)) { dwResult = GetLastError(); msg(M_NONFATAL | M_ERRNO, "%s: SetupDiCallClassInstaller(DIF_INSTALLDEVICE) failed", __FUNCTION__); goto cleanup_remove_device; } produces this error in setupapi.dev.log >>> [Configure Driver Package - >>> c:\windows\system32\driverstore\filerepository\oemvista.inf_amd64_8a00bc07868b5df3\oemvista.inf] >>> Section start 2020/09/03 12:08:49.525 cmd: "C:\Users\lev\Projects\openvpn\x64-Output\Debug\tapctl.exe" create sto: Source Filter = tap0901.ndi sto: Target Filter = ROOT\NET\0004 inf: Class GUID = {4d36e972-e325-11ce-bfc1-08002be10318} inf: Class Options = Configurable !!! idb: Failed to open driver package object 'oemvista.inf_amd64_8a00bc07868b5df3'. Error = 0x00000005 <<< Section end 2020/09/03 12:08:49.558 <<< [Exit status: FAILURE(0x00000005)] >>> [Restart Device - ROOT\NET\0004] >>> Section start 2020/09/03 12:08:49.565 cmd: "C:\Users\lev\Projects\openvpn\x64-Output\Debug\tapctl.exe" create dvi: Device Status: 0x01802501 [0x0e - 0x00000000] ! dvi: Device restart was skipped (NEEDREBOOT/NEEDRESTART). <<< Section end 2020/09/03 12:08:49.588 <<< [Exit status: SUCCESS] > I propose to replace 4(d) with a call to DiInstallDevice() instead. My tests > show this completes without error. I can confirm that too. This patch diff --git a/src/tapctl/tap.c b/src/tapctl/tap.c index 7cb3dedc..8d071320 100644 --- a/src/tapctl/tap.c +++ b/src/tapctl/tap.c @@ -29,6 +29,7 @@ #include <windows.h> #include <cfgmgr32.h> +#include <newdev.h> #include <objbase.h> #include <setupapi.h> #include <stdio.h> @@ -38,6 +39,7 @@ #pragma comment(lib, "advapi32.lib") #pragma comment(lib, "ole32.lib") #pragma comment(lib, "setupapi.lib") +#pragma comment(lib, "newdev.lib") #endif const static GUID GUID_DEVCLASS_NET = { 0x4d36e972L, 0xe325, 0x11ce, { 0xbf, 0xc1, 0x08, 0x00, 0x2b, 0xe1, 0x03, 0x18 } }; @@ -900,19 +902,13 @@ tap_create_adapter( } /* Install the device. */ - if (!SetupDiCallClassInstaller( - DIF_INSTALLDEVICE, - hDevInfoList, - &devinfo_data)) + if (!DiInstallDevice(NULL, hDevInfoList, &devinfo_data, NULL, 0, pbRebootRequired)) { dwResult = GetLastError(); - msg(M_NONFATAL | M_ERRNO, "%s: SetupDiCallClassInstaller(DIF_INSTALLDEVICE) failed", __FUNCTION__); + msg(M_NONFATAL | M_ERRNO, "%s: DiInstallDevice failed", __FUNCTION__); goto cleanup_remove_device; } - /* Check if a system reboot is required. (Ignore errors) */ - check_reboot(hDevInfoList, &devinfo_data, pbRebootRequired); - /* Get network adapter ID from registry. Retry for max 30sec. */ dwResult = get_net_adapter_guid(hDevInfoList, &devinfo_data, 30, pguidAdapter); works for both tapctl and MSI installer - created adapters are usable by non-admin. > > This also has an advantage that we could call it with driver_info = NULL > which will force the system to use the latest matching driver. That would > also eliminate step 3 which is right now very inefficient, though not > required to fix the problem at hand. Yeah, I also works for me without for (DWORD dwIndex = 0;; dwIndex++) { loop. > > If this sounds sane, I'll submit a patch. Please do! -- -Lev _______________________________________________ Openvpn-devel mailing list Openvpn-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/openvpn-devel