OpenVPN / ovpn-dco-win

OpenVPN Data Channel Offload driver for Windows
MIT License
47 stars 22 forks source link

Can't install network adapter on Arm64 PC, can't find a DCO driver. #81

Open oblomingo opened 2 months ago

oblomingo commented 2 months ago

Hey, We have found that some users can't use OpenVPN protocol, cause installer can't install a Arm64 network adapter. The installer has OpenVPN DCO merged module taken from this Github page and a custom action: C:\Program Files\xxx\Resources\arm64\tapctl.exe" create --hwid ovpn-dco --name "OpenVPN Data Channel Offload Custom Name" It seems the installer can successfully install a driver. Please take a look at a log part from setupapi.dev.log:

>>>  [SetupCopyOEMInf - C:\Program Files\Common Files\ovpn-dco\Win11\ovpn-dco.inf]
>>>  Section start 2024/08/22 11:41:09.892
      cmd: C:\Windows\System32\MsiExec.exe -Embedding 39FC7E12BA0ED9655F11E172895F275A E Global\MSI0000
     inf: Copy style: 0x00000000
     sto: {Setup Import Driver Package: C:\Program Files\Common Files\ovpn-dco\Win11\ovpn-dco.inf} 11:41:09.902
     inf:      Provider: OpenVPN, Inc
     inf:      Class GUID: {4d36e972-e325-11ce-bfc1-08002be10318}
     inf:      Driver Version: 04/12/2024,1.1.1.0
     inf:      Catalog File: ovpn-dco.cat
     ump:      Import flags: 0x00000001
     pol:      {Driver package policy check} 11:41:09.995
     pol:      {Driver package policy check - exit(0x00000000)} 11:41:09.995
     sto:      {Stage Driver Package: C:\Program Files\Common Files\ovpn-dco\Win11\ovpn-dco.inf} 11:41:09.996
     inf:           Provider       = OpenVPN, Inc
     inf:           Class GUID     = {4d36e972-e325-11ce-bfc1-08002be10318}
     inf:           Driver Version = 04/12/2024,1.1.1.0
     inf:           Catalog File   = ovpn-dco.cat
     inf:           Version Flags  = 0x00000001
     inf:           {Query Configurability: C:\Program Files\Common Files\ovpn-dco\Win11\ovpn-dco.inf} 11:41:10.005
     inf:                Driver package is fully isolated.
     inf:                Driver package 'ovpn-dco.inf' is configurable.
     inf:           {Query Configurability: exit(0x00000000)} 11:41:10.006
     flq:           {FILE_QUEUE_COMMIT} 11:41:10.006
     flq:                Copying 'C:\Program Files\Common Files\ovpn-dco\Win11\ovpn-dco.cat' to 'C:\Windows\System32\DriverStore\Temp\{367b0960-ffb3-2c46-881c-ba540719c858}\ovpn-dco.cat'.
     flq:                Copying 'C:\Program Files\Common Files\ovpn-dco\Win11\ovpn-dco.inf' to 'C:\Windows\System32\DriverStore\Temp\{367b0960-ffb3-2c46-881c-ba540719c858}\ovpn-dco.inf'.
     flq:           {FILE_QUEUE_COMMIT - exit(0x00000000)} 11:41:10.011
     sto:           {DRIVERSTORE IMPORT VALIDATE} 11:41:10.012
     sig:                Driver package catalog is valid.
     sig:                {_VERIFY_FILE_SIGNATURE} 11:41:10.019
     sig:                     Key      = ovpn-dco.inf
     sig:                     FilePath = C:\Windows\System32\DriverStore\Temp\{367b0960-ffb3-2c46-881c-ba540719c858}\ovpn-dco.inf
     sig:                     Catalog  = C:\Windows\System32\DriverStore\Temp\{367b0960-ffb3-2c46-881c-ba540719c858}\ovpn-dco.cat
     sig:                     Success: File is signed in catalog.
     sig:                {_VERIFY_FILE_SIGNATURE exit(0x00000000)} 11:41:10.029
     sto:           {DRIVERSTORE IMPORT VALIDATE: exit(0x00000000)} 11:41:10.029
     sig:           Signer Score  = 0x0D000005 (WHQL)
     sig:           Signer Name   = Microsoft Windows Hardware Compatibility Publisher
     sig:           Submission ID = 53719220_14353574059272285_1152921505697628289
     sto:           {Core Driver Package Import: ovpn-dco.inf_arm64_f2b346196cf322ed} 11:41:10.031
     sto:                {DRIVERSTORE IMPORT BEGIN} 11:41:10.032
     sto:                {DRIVERSTORE IMPORT BEGIN: exit(0x00000000)} 11:41:10.032
     cpy:                {Copy Directory: C:\Windows\System32\DriverStore\Temp\{367b0960-ffb3-2c46-881c-ba540719c858}} 11:41:10.032
     cpy:                     Target Path = C:\Windows\System32\DriverStore\FileRepository\ovpn-dco.inf_arm64_f2b346196cf322ed
     cpy:                {Copy Directory: exit(0x00000000)} 11:41:10.033
     idb:                {Register Driver Package: C:\Windows\System32\DriverStore\FileRepository\ovpn-dco.inf_arm64_f2b346196cf322ed\ovpn-dco.inf} 11:41:10.036
     idb:                     Created driver package object 'ovpn-dco.inf_arm64_f2b346196cf322ed' in DRIVERS database node.
     idb:                     Created driver INF file object 'oem5.inf' in DRIVERS database node.
     idb:                     Registered driver package 'ovpn-dco.inf_arm64_f2b346196cf322ed' with 'oem5.inf'.
     idb:                {Register Driver Package: exit(0x00000000)} 11:41:10.043
     idb:                {Publish Driver Package: C:\Windows\System32\DriverStore\FileRepository\ovpn-dco.inf_arm64_f2b346196cf322ed\ovpn-dco.inf} 11:41:10.043
     idb:                     Activating driver package 'ovpn-dco.inf_arm64_f2b346196cf322ed'.
     cpy:                     Published 'ovpn-dco.inf_arm64_f2b346196cf322ed\ovpn-dco.inf' to 'oem5.inf'.
     idb:                     Indexed 1 device ID for 'ovpn-dco.inf_arm64_f2b346196cf322ed'.
     sto:                     Flushed driver database node 'DRIVERS'. Time = 16 ms
     sto:                     Flushed driver database node 'SYSTEM'. Time = 31 ms
     idb:                {Publish Driver Package: exit(0x00000000)} 11:41:10.088
     sto:                {DRIVERSTORE IMPORT END} 11:41:10.090
     dvi:                     Flushed all driver package files to disk. Time = 0 ms
     sig:                     Installed catalog 'ovpn-dco.cat' as 'oem5.cat'.
     sto:                {DRIVERSTORE IMPORT END: exit(0x00000000)} 11:41:10.173
     sto:           {Core Driver Package Import: exit(0x00000000)} 11:41:10.173
     sto:      {Stage Driver Package: exit(0x00000000)} 11:41:10.175
     sto: {Setup Import Driver Package - exit (0x00000000)} 11:41:10.244
     inf: Driver Store Path: C:\Windows\System32\DriverStore\FileRepository\ovpn-dco.inf_arm64_f2b346196cf322ed\ovpn-dco.inf
     inf: Published Inf Path: C:\Windows\INF\oem5.inf
<<<  Section end 2024/08/22 11:41:10.245
<<<  [Exit status: SUCCESS]

but the second part doesn't work:

>>>  [Device Install (DiInstallDevice) - ROOT\NET\0000]
>>>  Section start 2024/08/22 11:41:19.767
      cmd: "C:\Program Files\xxx\Resources\arm64\tapctl.exe" create --hwid ovpn-dco --name "OpenVPN Data Channel Offload Custom Name"
     ndv: Flags: 0x00000000
     ndv: Search options: 0x00000002
     ndv: Searching default INF path
     dvi: {Build Driver List} 11:41:19.805
     dvi:      Searching for hardware ID(s):
     dvi:           ovpn-dco
     dvi: {Build Driver List - exit(0x00000000)} 11:41:19.964
     dvi: {DIF_SELECTBESTCOMPATDRV} 11:41:19.974
     dvi:      Default installer: Enter 11:41:19.984
     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)} 11:41:20.040
!    ndv: Unable to select best compatible driver. Error = 0xe0000228
<<<  Section end 2024/08/22 11:41:20.055
<<<  [Exit status: FAILURE(0xe0000203)]

The user tried to run a command line to get information about the driver Get-WmiObject Win32_PnPSignedDriver | Where-Object { $_.DeviceName -like "*OpenVPN Data Channel Offload*" } | Format-List * and got nothing. Why may it happen? Why does the log state that the driver installed successfully, but it is impossible to find the driver and create a network adapter?

lstipakov commented 2 months ago

Just tried installing 2.6.12 on my Arm64 dev box, looks good. Here are driver installation logs for comparison:

>>>  [Device Install (DiInstallDevice) - ROOT\NET\0001]
>>>  Section start 2024/09/05 13:39:29.625
      cmd: C:\Windows\System32\MsiExec.exe -Embedding A1249009EF83D9DC3F20002BEA3EFBB4 E Global\MSI0000
     ndv: Flags: 0x00000000
     ndv: Search options: 0x00000002
     ndv: Searching default INF path
     dvi: {Build Driver List} 13:39:29.627
     dvi:      Searching for hardware ID(s):
     dvi:           ovpn-dco
     dvi:      Created Driver Node:
     dvi:           HardwareID   - ovpn-dco
     dvi:           InfName      - C:\WINDOWS\System32\DriverStore\FileRepository\ovpn-dco.inf_arm64_51acf7251abebc91\ovpn-dco.inf
     dvi:           DevDesc      - OpenVPN Data Channel Offload
     dvi:           Section      - ovpn-dco_Device.NT
     dvi:           Rank         - 0x00ff0000
     dvi:           Signer Score - WHQL
     dvi:           DrvDate      - 10/08/2023
     dvi:           Version      - 1.0.0.0
     dvi:      Created Driver Node:
     dvi:           HardwareID   - ovpn-dco
     dvi:           InfName      - C:\WINDOWS\System32\DriverStore\FileRepository\ovpn-dco.inf_arm64_17aed440edc0a3bb\ovpn-dco.inf
     dvi:           DevDesc      - OpenVPN Data Channel Offload
     dvi:           Section      - ovpn-dco_Device.NT
     dvi:           Rank         - 0x00ff0000
     dvi:           Signer Score - WHQL
     dvi:           DrvDate      - 05/22/2024
     dvi:           Version      - 1.2.1.0
     dvi: {Build Driver List - exit(0x00000000)} 13:39:29.687
     dvi: {DIF_SELECTBESTCOMPATDRV} 13:39:29.687
     dvi:      Default installer: Enter 13:39:29.687
     dvi:           {Select Best Driver}
     dvi:                Class GUID of device changed to: {4d36e972-e325-11ce-bfc1-08002be10318}.
     dvi:                Selected Driver:
     dvi:                     Description - OpenVPN Data Channel Offload
     dvi:                     InfFile     - c:\windows\system32\driverstore\filerepository\ovpn-dco.inf_arm64_17aed440edc0a3bb\ovpn-dco.inf
     dvi:                     Section     - ovpn-dco_Device
     dvi:           {Select Best Driver - exit(0x00000000)}
     dvi:      Default installer: Exit
     dvi: {DIF_SELECTBESTCOMPATDRV - exit(0x00000000)} 13:39:29.687
     ndv: Driver package 'C:\WINDOWS\System32\DriverStore\FileRepository\ovpn-dco.inf_arm64_17aed440edc0a3bb\ovpn-dco.inf' is already imported.
     sto: {Setup Import Driver Package: C:\WINDOWS\INF\oem58.inf} 13:39:29.687
     sto:      Driver package already imported as 'oem58.inf'.
     sto: {Setup Import Driver Package - exit (0x00000000)} 13:39:29.687
     dvi: Searching for hardware ID(s):
     dvi:      ovpn-dco
     dvi: Class GUID of device changed to: {4d36e972-e325-11ce-bfc1-08002be10318}.
     ump: {Plug and Play Service: Device Install for ROOT\NET\0001}
     dvi:      Install flags: 0x00010011
     dvi:      {Core Device Install} 13:39:29.703
     dvi:           {Configure Device - ROOT\NET\0001} 13:39:29.719
     dvi:                Device Status: 0x01802001
     dvi:                Parent Device: HTREE\ROOT\0
     sto:                {Configure Driver Package: C:\WINDOWS\System32\DriverStore\FileRepository\ovpn-dco.inf_arm64_17aed440edc0a3bb\ovpn-dco.inf} 13:39:29.719
     sto:                     Source Filter  = ovpn-dco
     inf:                     Config Options = IsolationCompat
     inf:                     Class GUID     = {4d36e972-e325-11ce-bfc1-08002be10318}
     inf:                     Class Options  = Configurable
     inf:                     {Configure Driver: OpenVPN Data Channel Offload}
     inf:                          Section Name = ovpn-dco_Device.NT
     inf:                          {Add Service: ovpn-dco}
     inf:                               Flags         = 0x2
     inf:                               Start Type    = 3
     inf:                               Service Type  = 1
     inf:                               Error Control = 1
     inf:                               Image Path    = \SystemRoot\System32\drivers\ovpn-dco.sys
     inf:                               Display Name  = ovpn-dco
     inf:                               Updated service 'ovpn-dco'.
     inf:                          {Add Service: exit(0x00000000)}
     inf:                          Hardware Id  = ovpn-dco
     inf:                          {Configure Driver Configuration: ovpn-dco_Device.NT}
     inf:                               Service Name  = ovpn-dco
     inf:                               Config Flags  = 0x00000000
     inf:                          {Configure Driver Configuration: exit(0x00000000)}
     inf:                     {Configure Driver: exit(0x00000000)}
     flq:                     {FILE_QUEUE_COMMIT} 13:39:29.735
     flq:                          Copying 'C:\WINDOWS\System32\DriverStore\FileRepository\ovpn-dco.inf_arm64_17aed440edc0a3bb\ovpn-dco.sys' to 'C:\WINDOWS\System32\drivers\ovpn-dco.sys'.
     idb:                          Last driver package 'ovpn-dco.inf_arm64_51acf7251abebc91' to copy 'C:\WINDOWS\System32\drivers\ovpn-dco.sys' needs reconfiguration.
     flq:                     {FILE_QUEUE_COMMIT - exit(0x00000000)} 13:39:29.751
     dvi:                     Existing files modified, may need to restart related services.
     sto:                {Configure Driver Package: exit(0x00000bc3)} 13:39:29.751
     dvi:                Restart required for any devices using this driver.
     dvi:                Install Device: Configuring device. 13:39:29.751
     dvi:                     Configuration: oem58.inf:ovpn-dco,ovpn-dco_Device
     dvi:                Install Device: Configuring device completed. 13:39:29.758
     dvi:                Device Status: 0x01802001
     dvi:                {Restarting Devices} 13:39:29.758
     dvi:                     Start: ROOT\NET\0001
!    dvi:                     Device 'ROOT\NET\0001' pending start: Device has problem: 0x38 (CM_PROB_NEED_CLASS_CONFIG), problem status: 0x00000000.
     dvi:                {Restarting Devices exit} 13:39:29.783
     dvi:           {Configure Device - exit(0x00000000)} 13:39:29.783
     dvi:      {Core Device Install - exit(0x00000000)} 13:39:29.783
     dvi:      Waiting for device post-install to complete. 13:39:29.788
     dvi:      Device post-install completed. 13:39:29.923
     dvi:      Device Status: 0x0180200b
     ump: {Plug and Play Service: Device Install exit(00000000)}
<<<  Section end 2024/09/05 13:39:29.949
<<<  [Exit status: SUCCESS]

>>>  [Device Install (DiInstallDevice) - ROOT\NET\0002]
>>>  Section start 2024/09/05 13:42:51.215
      cmd: "C:\Program Files\OpenVPN\bin\tapctl.exe" create --hwid ovpn-dco --name "OpenVPN Data Channel Offload Custom Name"
     ndv: Flags: 0x00000000
     ndv: Search options: 0x00000002
     ndv: Searching default INF path
     dvi: {Build Driver List} 13:42:51.231
     dvi:      Searching for hardware ID(s):
     dvi:           ovpn-dco
     dvi:      Created Driver Node:
     dvi:           HardwareID   - ovpn-dco
     dvi:           InfName      - C:\WINDOWS\System32\DriverStore\FileRepository\ovpn-dco.inf_arm64_51acf7251abebc91\ovpn-dco.inf
     dvi:           DevDesc      - OpenVPN Data Channel Offload
     dvi:           Section      - ovpn-dco_Device.NT
     dvi:           Rank         - 0x00ff0000
     dvi:           Signer Score - WHQL
     dvi:           DrvDate      - 10/08/2023
     dvi:           Version      - 1.0.0.0
     dvi:      Created Driver Node:
     dvi:           HardwareID   - ovpn-dco
     dvi:           InfName      - C:\WINDOWS\System32\DriverStore\FileRepository\ovpn-dco.inf_arm64_17aed440edc0a3bb\ovpn-dco.inf
     dvi:           DevDesc      - OpenVPN Data Channel Offload
     dvi:           Section      - ovpn-dco_Device.NT
     dvi:           Rank         - 0x00ff0000
     dvi:           Signer Score - WHQL
     dvi:           DrvDate      - 05/22/2024
     dvi:           Version      - 1.2.1.0
     dvi: {Build Driver List - exit(0x00000000)} 13:42:51.533
     dvi: {DIF_SELECTBESTCOMPATDRV} 13:42:51.533
     dvi:      Default installer: Enter 13:42:51.549
     dvi:           {Select Best Driver}
     dvi:                Class GUID of device changed to: {4d36e972-e325-11ce-bfc1-08002be10318}.
     dvi:                Selected Driver:
     dvi:                     Description - OpenVPN Data Channel Offload
     dvi:                     InfFile     - c:\windows\system32\driverstore\filerepository\ovpn-dco.inf_arm64_17aed440edc0a3bb\ovpn-dco.inf
     dvi:                     Section     - ovpn-dco_Device
     dvi:           {Select Best Driver - exit(0x00000000)}
     dvi:      Default installer: Exit
     dvi: {DIF_SELECTBESTCOMPATDRV - exit(0x00000000)} 13:42:51.596
     ndv: Driver package 'C:\WINDOWS\System32\DriverStore\FileRepository\ovpn-dco.inf_arm64_17aed440edc0a3bb\ovpn-dco.inf' is already imported.
     sto: {Setup Import Driver Package: C:\WINDOWS\INF\oem58.inf} 13:42:51.612
     sto:      Driver package already imported as 'oem58.inf'.
     sto: {Setup Import Driver Package - exit (0x00000000)} 13:42:51.629
     dvi: Searching for hardware ID(s):
     dvi:      ovpn-dco
     dvi: Class GUID of device changed to: {4d36e972-e325-11ce-bfc1-08002be10318}.
     ump: {Plug and Play Service: Device Install for ROOT\NET\0002}
     dvi:      Install flags: 0x00010001
     dvi:      {Core Device Install} 13:42:51.706
     dvi:           {Configure Device - ROOT\NET\0002} 13:42:51.706
     dvi:                Device Status: 0x01802001
     dvi:                Parent Device: HTREE\ROOT\0
     sto:                {Configure Driver Package: C:\WINDOWS\System32\DriverStore\FileRepository\ovpn-dco.inf_arm64_17aed440edc0a3bb\ovpn-dco.inf} 13:42:51.706
     sto:                     Source Filter  = ovpn-dco
     inf:                     Config Options = IsolationCompat
     inf:                     Class GUID     = {4d36e972-e325-11ce-bfc1-08002be10318}
     inf:                     Class Options  = Configurable
     inf:                     {Configure Driver: OpenVPN Data Channel Offload}
     inf:                          Section Name = ovpn-dco_Device.NT
     inf:                          {Add Service: ovpn-dco}
     inf:                               Flags         = 0x2
     inf:                               Start Type    = 3
     inf:                               Service Type  = 1
     inf:                               Error Control = 1
     inf:                               Image Path    = \SystemRoot\System32\drivers\ovpn-dco.sys
     inf:                               Display Name  = ovpn-dco
     inf:                               Updated service 'ovpn-dco'.
     inf:                          {Add Service: exit(0x00000000)}
     inf:                          Hardware Id  = ovpn-dco
     inf:                          {Configure Driver Configuration: ovpn-dco_Device.NT}
     inf:                               Service Name  = ovpn-dco
     inf:                               Config Flags  = 0x00000000
     inf:                          {Configure Driver Configuration: exit(0x00000000)}
     inf:                     {Configure Driver: exit(0x00000000)}
     flq:                     {FILE_QUEUE_COMMIT} 13:42:51.722
     flq:                          Copying 'C:\WINDOWS\System32\DriverStore\FileRepository\ovpn-dco.inf_arm64_17aed440edc0a3bb\ovpn-dco.sys' to 'C:\WINDOWS\System32\drivers\ovpn-dco.sys'.
     cpy:                          Existing file 'C:\WINDOWS\System32\drivers\ovpn-dco.sys' remains unchanged.
     flq:                     {FILE_QUEUE_COMMIT - exit(0x00000000)} 13:42:51.738
     sto:                {Configure Driver Package: exit(0x00000000)} 13:42:51.738
     dvi:                Install Device: Configuring device. 13:42:51.738
     dvi:                     Configuration: oem58.inf:ovpn-dco,ovpn-dco_Device
     dvi:                Install Device: Configuring device completed. 13:42:51.738
     dvi:                Device Status: 0x01802001
     dvi:                Install Device: Starting device 'ROOT\NET\0002'. 13:42:51.738
     dvi:                Install Device: Starting device completed. 13:42:51.738
!    dvi:                Device pending start: Device has problem: 0x38 (CM_PROB_NEED_CLASS_CONFIG), problem status: 0x00000000.
     dvi:           {Configure Device - exit(0x00000000)} 13:42:51.750
     dvi:      {Core Device Install - exit(0x00000000)} 13:42:51.753
     dvi:      Waiting for device post-install to complete. 13:42:51.757
     dvi:      Device post-install completed. 13:42:51.877
     dvi:      Device Status: 0x0180200b
     ump: {Plug and Play Service: Device Install exit(00000000)}
<<<  Section end 2024/09/05 13:42:51.912
<<<  [Exit status: SUCCESS]

As you may see, your driver installation log looks somewhat different. You are installing from C:\Program Files\Common Files\ovpn-dco\Win11\ovpn-dco.inf, but you are supposed to install from the driver store, to where custom action copies the driver:

    /* copy driver to driver store */
    if (!SetupCopyOEMInfW(pathToInf, NULL, SPOST_PATH, 0, NULL, 0, NULL, NULL)) {
        msg(M_NONFATAL | M_ERRNO, "%s: SetupCopyOEMInf(\"%ls\") failed", __FUNCTION__, pathToInf);
        return;
    }

Does it work if user installs OpenVPN 2.6.12 ?