Hi Lev,

Thanks for confirming. What you tested is exactly what I have in mind.

I suppose you tested it using MSVC. I recall when I worked on creating tap
adapters on the fly (patch abandoned for lack of time) some functions in
newdev.dll did not resolve with mingw and I always had to load them on
runtime. I'll check those hard corners again and submit a patch soonish
(hopefully today).

Selva

On Thu, Sep 3, 2020 at 8:11 AM Lev Stipakov <lstipa...@gmail.com> wrote:

> 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

Reply via email to