71 lines
1.4 KiB
Go
71 lines
1.4 KiB
Go
//go:build windows
|
|
|
|
package Atom_Device
|
|
|
|
import (
|
|
"fmt"
|
|
"golang.org/x/sys/windows"
|
|
"golang.zx2c4.com/wireguard/tun"
|
|
"golang.zx2c4.com/wireguard/windows/elevate"
|
|
"golang.zx2c4.com/wireguard/windows/tunnel/winipcfg"
|
|
"net"
|
|
"net/netip"
|
|
)
|
|
|
|
func init() {
|
|
var err error
|
|
|
|
tun.WintunTunnelType = "Atom"
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
guid, err := windows.GUIDFromString("{E15D88C1-A15E-4CA1-9577-97FCF2CB995E}")
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
tun.WintunStaticRequestedGUID = &guid
|
|
}
|
|
|
|
func NewTun(ifName string, mtu int, localIP net.IP, ipMask net.IPMask) (tun.Device, error) {
|
|
var tunDevice tun.Device
|
|
|
|
err := elevate.DoAsSystem(func() error {
|
|
var err error
|
|
tunDevice, err = tun.CreateTUN(ifName, mtu)
|
|
if err != nil {
|
|
return fmt.Errorf("create tun: %v", err)
|
|
}
|
|
return nil
|
|
})
|
|
if err != nil {
|
|
return nil, fmt.Errorf("do as system: %v", err)
|
|
}
|
|
|
|
nativeTun := tunDevice.(*tun.NativeTun)
|
|
luid := winipcfg.LUID(nativeTun.LUID())
|
|
|
|
ones, _ := ipMask.Size()
|
|
netAddr := netip.MustParseAddr(localIP.String())
|
|
prefix := netip.PrefixFrom(netAddr, ones)
|
|
|
|
err = luid.SetIPAddresses([]netip.Prefix{prefix})
|
|
if err != nil {
|
|
return nil, fmt.Errorf("unable to setup interface IP: %v", err)
|
|
}
|
|
|
|
return tunDevice, nil
|
|
}
|
|
|
|
func (d *Device) InterfaceName() (string, error) {
|
|
nativeTun := d.tun.(*tun.NativeTun)
|
|
luid := winipcfg.LUID(nativeTun.LUID())
|
|
guid, err := luid.GUID()
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
return guid.String(), nil
|
|
}
|