]> git.ipfire.org Git - thirdparty/wireguard-go.git/commitdiff
wintun: do not load dll in init()
authorJason A. Donenfeld <Jason@zx2c4.com>
Wed, 9 Dec 2020 00:46:55 +0000 (01:46 +0100)
committerJason A. Donenfeld <Jason@zx2c4.com>
Wed, 9 Dec 2020 00:46:55 +0000 (01:46 +0100)
This prevents linking to wintun.dll until it's actually needed, which
should improve startup time.

Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
tun/wintun/dll_fromfile_windows.go
tun/wintun/dll_fromrsrc_windows.go
tun/wintun/dll_windows.go
tun/wintun/session_windows.go
tun/wintun/wintun_windows.go

index 525812b3c8d465472fdbfc43c593e2407fadef56..f40f8b30d09709303258a7a641e5d75f2afce21d 100644 (file)
@@ -20,6 +20,7 @@ type lazyDLL struct {
        Name   string
        mu     sync.Mutex
        module windows.Handle
+       onLoad func(d *lazyDLL)
 }
 
 func (d *lazyDLL) Load() error {
@@ -42,6 +43,9 @@ func (d *lazyDLL) Load() error {
        }
 
        atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(&d.module)), unsafe.Pointer(module))
+       if d.onLoad != nil {
+               d.onLoad(d)
+       }
        return nil
 }
 
index e6e393f021d520f13484857a27e1d737efbfb47b..d107ba98b6a98041fe197839603d7386042993ed 100644 (file)
@@ -23,6 +23,7 @@ type lazyDLL struct {
        Name   string
        mu     sync.Mutex
        module *memmod.Module
+       onLoad func(d *lazyDLL)
 }
 
 func (d *lazyDLL) Load() error {
@@ -50,6 +51,9 @@ func (d *lazyDLL) Load() error {
        }
 
        atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(&d.module)), unsafe.Pointer(module))
+       if d.onLoad != nil {
+               d.onLoad(d)
+       }
        return nil
 }
 
index 9f04f73c2bc00aa4b1cf549c3285622b8e2eec62..dd97bbc0a97032eca7b3c3dff3741a37b9e9777e 100644 (file)
@@ -12,8 +12,8 @@ import (
        "unsafe"
 )
 
-func newLazyDLL(name string) *lazyDLL {
-       return &lazyDLL{Name: name}
+func newLazyDLL(name string, onLoad func(d *lazyDLL)) *lazyDLL {
+       return &lazyDLL{Name: name, onLoad: onLoad}
 }
 
 func (d *lazyDLL) NewProc(name string) *lazyProc {
index 1619e5a951e293f05d14c6c69829e25a852e10de..5b24fa5744db83be3d30231e26c52a8e36d3c9ef 100644 (file)
@@ -30,12 +30,12 @@ type Packet struct {
 }
 
 var (
-       procWintunAllocateSendPacket   = modwintun.NewProc("WintunAllocateSendPacket").Addr()
+       procWintunAllocateSendPacket   = modwintun.NewProc("WintunAllocateSendPacket")
        procWintunEndSession           = modwintun.NewProc("WintunEndSession")
        procWintunGetReadWaitEvent     = modwintun.NewProc("WintunGetReadWaitEvent")
-       procWintunReceivePacket        = modwintun.NewProc("WintunReceivePacket").Addr()
-       procWintunReleaseReceivePacket = modwintun.NewProc("WintunReleaseReceivePacket").Addr()
-       procWintunSendPacket           = modwintun.NewProc("WintunSendPacket").Addr()
+       procWintunReceivePacket        = modwintun.NewProc("WintunReceivePacket")
+       procWintunReleaseReceivePacket = modwintun.NewProc("WintunReleaseReceivePacket")
+       procWintunSendPacket           = modwintun.NewProc("WintunSendPacket")
        procWintunStartSession         = modwintun.NewProc("WintunStartSession")
 )
 
@@ -62,7 +62,7 @@ func (session Session) ReadWaitEvent() (handle windows.Handle) {
 
 func (session Session) ReceivePacket() (packet []byte, err error) {
        var packetSize uint32
-       r0, _, e1 := syscall.Syscall(procWintunReceivePacket, 2, session.handle, uintptr(unsafe.Pointer(&packetSize)), 0)
+       r0, _, e1 := syscall.Syscall(procWintunReceivePacket.Addr(), 2, session.handle, uintptr(unsafe.Pointer(&packetSize)), 0)
        if r0 == 0 {
                err = e1
                return
@@ -72,11 +72,11 @@ func (session Session) ReceivePacket() (packet []byte, err error) {
 }
 
 func (session Session) ReleaseReceivePacket(packet []byte) {
-       syscall.Syscall(procWintunReleaseReceivePacket, 2, session.handle, uintptr(unsafe.Pointer(&packet[0])), 0)
+       syscall.Syscall(procWintunReleaseReceivePacket.Addr(), 2, session.handle, uintptr(unsafe.Pointer(&packet[0])), 0)
 }
 
 func (session Session) AllocateSendPacket(packetSize int) (packet []byte, err error) {
-       r0, _, e1 := syscall.Syscall(procWintunAllocateSendPacket, 2, session.handle, uintptr(packetSize), 0)
+       r0, _, e1 := syscall.Syscall(procWintunAllocateSendPacket.Addr(), 2, session.handle, uintptr(packetSize), 0)
        if r0 == 0 {
                err = e1
                return
@@ -86,7 +86,7 @@ func (session Session) AllocateSendPacket(packetSize int) (packet []byte, err er
 }
 
 func (session Session) SendPacket(packet []byte) {
-       syscall.Syscall(procWintunSendPacket, 2, session.handle, uintptr(unsafe.Pointer(&packet[0])), 0)
+       syscall.Syscall(procWintunSendPacket.Addr(), 2, session.handle, uintptr(unsafe.Pointer(&packet[0])), 0)
 }
 
 // unsafeSlice updates the slice slicePtr to be a slice
index e7ba8b6e2d282c140ca6521f340bfebc88f912a6..afbbe7686edb2bf3d3a4349ed15bb2a02f60821c 100644 (file)
@@ -34,7 +34,7 @@ type Adapter struct {
 }
 
 var (
-       modwintun = newLazyDLL("wintun.dll")
+       modwintun = newLazyDLL("wintun.dll", setupLogger)
 
        procWintunCreateAdapter           = modwintun.NewProc("WintunCreateAdapter")
        procWintunDeleteAdapter           = modwintun.NewProc("WintunDeleteAdapter")
@@ -46,11 +46,10 @@ var (
        procWintunGetAdapterName          = modwintun.NewProc("WintunGetAdapterName")
        procWintunGetRunningDriverVersion = modwintun.NewProc("WintunGetRunningDriverVersion")
        procWintunSetAdapterName          = modwintun.NewProc("WintunSetAdapterName")
-       procWintunSetLogger               = modwintun.NewProc("WintunSetLogger")
 )
 
-func init() {
-       syscall.Syscall(procWintunSetLogger.Addr(), 1, windows.NewCallback(func(level loggerLevel, msg *uint16) int {
+func setupLogger(dll *lazyDLL) {
+       syscall.Syscall(dll.NewProc("WintunSetLogger").Addr(), 1, windows.NewCallback(func(level loggerLevel, msg *uint16) int {
                log.Println("[Wintun]", windows.UTF16PtrToString(msg))
                return 0
        }), 0, 0)