Files
baalvpn/client/os_windows.go

77 lines
1.8 KiB
Go

//go:build windows
package main
import (
"os"
"os/exec"
"golang.org/x/sys/windows"
"golang.zx2c4.com/wintun"
)
var session wintun.Session
var readWait windows.Handle
func isAdmin() bool {
f, err := os.Open("\\\\.\\PHYSICALDRIVE0")
if err != nil {
return false
}
f.Close()
return true
}
func setupInterface() {
adapter, err := wintun.CreateAdapter("baalvpn", "Wintun", nil)
if err != nil {
panic(err)
}
session, err = adapter.StartSession(0x800000)
if err != nil {
panic(err)
}
readWait = session.ReadWaitEvent()
if err := exec.Command("netsh", "interface", "ipv6", "add", "address", "interface=baalvpn", "address="+internalIP.String()).Run(); err != nil {
panic(err)
}
if err := exec.Command("netsh", "interface", "ipv6", "set", "interface", "interface=baalvpn", "forwarding=disabled").Run(); err != nil {
panic(err)
}
if err := exec.Command("netsh", "interface", "ipv6", "add", "route", "fd00:baa1::/32", "interface=baalvpn").Run(); err != nil {
panic(err)
}
if err := exec.Command("netsh", "advfirewall", "firewall", "add", "rule", "name=BaalVPN In", "dir=in", "action=allow", "remoteip=fd00:baa1::/32").Run(); err != nil {
panic(err)
}
if err := exec.Command("netsh", "advfirewall", "firewall", "add", "rule", "name=BaalVPN Out", "dir=out", "action=allow", "remoteip=fd00:baa1::/32").Run(); err != nil {
panic(err)
}
}
func writePkt(pkt []byte) error {
sp, err := session.AllocateSendPacket(len(pkt))
if err != nil {
return err
}
copy(sp, pkt)
session.SendPacket(sp)
return nil
}
func readPkt() ([]byte, error) {
for {
pkt, err := session.ReceivePacket()
if err == nil {
return pkt, nil
}
windows.WaitForSingleObject(readWait, windows.INFINITE)
}
}
func releasePkt(pkt []byte) {
session.ReleaseReceivePacket(pkt)
}