golang.zx2c4.com/wireguard/windows@v0.5.4-0.20230123132234-dcc0eb72a04b/driver/wintunremoval_windows.go (about)

     1  /* SPDX-License-Identifier: MIT
     2   *
     3   * Copyright (C) 2019-2022 WireGuard LLC. All Rights Reserved.
     4   */
     5  
     6  package driver
     7  
     8  import (
     9  	"path/filepath"
    10  
    11  	"golang.org/x/sys/windows"
    12  )
    13  
    14  func UninstallLegacyWintun() error {
    15  	deviceClassNetGUID := &windows.GUID{0x4d36e972, 0xe325, 0x11ce, [8]byte{0xbf, 0xc1, 0x08, 0x00, 0x2b, 0xe1, 0x03, 0x18}}
    16  	devInfo, err := windows.SetupDiCreateDeviceInfoListEx(deviceClassNetGUID, 0, "")
    17  	if err != nil {
    18  		return err
    19  	}
    20  	defer devInfo.Close()
    21  	devInfoData, err := devInfo.CreateDeviceInfo("Wintun", deviceClassNetGUID, "", 0, windows.DICD_GENERATE_ID)
    22  	if err != nil {
    23  		return err
    24  	}
    25  	err = devInfo.SetDeviceRegistryProperty(devInfoData, windows.SPDRP_HARDWAREID, []byte("W\x00i\x00n\x00t\x00u\x00n\x00\x00\x00\x00\x00"))
    26  	if err != nil {
    27  		return err
    28  	}
    29  	err = devInfo.BuildDriverInfoList(devInfoData, windows.SPDIT_COMPATDRIVER)
    30  	if err != nil {
    31  		return err
    32  	}
    33  	defer devInfo.DestroyDriverInfoList(devInfoData, windows.SPDIT_COMPATDRIVER)
    34  	var lastError error
    35  	for i := 0; ; i++ {
    36  		drvInfoData, err := devInfo.EnumDriverInfo(devInfoData, windows.SPDIT_COMPATDRIVER, i)
    37  		if err != nil {
    38  			if err == windows.ERROR_NO_MORE_ITEMS {
    39  				break
    40  			}
    41  			continue
    42  		}
    43  		drvInfoDetailData, err := devInfo.DriverInfoDetail(devInfoData, drvInfoData)
    44  		if err != nil {
    45  			continue
    46  		}
    47  		lastError = windows.SetupUninstallOEMInf(filepath.Base(drvInfoDetailData.InfFileName()), 0)
    48  	}
    49  	return lastError
    50  }