From ca9edf1c6301ed1498a56124d018474a68d04b25 Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Wed, 9 Dec 2020 01:46:55 +0100 Subject: wintun: do not load dll in init() This prevents linking to wintun.dll until it's actually needed, which should improve startup time. Signed-off-by: Jason A. Donenfeld --- tun/wintun/dll_fromfile_windows.go | 4 ++++ tun/wintun/dll_fromrsrc_windows.go | 4 ++++ tun/wintun/dll_windows.go | 4 ++-- tun/wintun/session_windows.go | 16 ++++++++-------- tun/wintun/wintun_windows.go | 7 +++---- 5 files changed, 21 insertions(+), 14 deletions(-) (limited to 'tun') diff --git a/tun/wintun/dll_fromfile_windows.go b/tun/wintun/dll_fromfile_windows.go index 525812b..f40f8b3 100644 --- a/tun/wintun/dll_fromfile_windows.go +++ b/tun/wintun/dll_fromfile_windows.go @@ -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 } diff --git a/tun/wintun/dll_fromrsrc_windows.go b/tun/wintun/dll_fromrsrc_windows.go index e6e393f..d107ba9 100644 --- a/tun/wintun/dll_fromrsrc_windows.go +++ b/tun/wintun/dll_fromrsrc_windows.go @@ -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 } diff --git a/tun/wintun/dll_windows.go b/tun/wintun/dll_windows.go index 9f04f73..dd97bbc 100644 --- a/tun/wintun/dll_windows.go +++ b/tun/wintun/dll_windows.go @@ -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 { diff --git a/tun/wintun/session_windows.go b/tun/wintun/session_windows.go index 1619e5a..5b24fa5 100644 --- a/tun/wintun/session_windows.go +++ b/tun/wintun/session_windows.go @@ -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 diff --git a/tun/wintun/wintun_windows.go b/tun/wintun/wintun_windows.go index e7ba8b6..afbbe76 100644 --- a/tun/wintun/wintun_windows.go +++ b/tun/wintun/wintun_windows.go @@ -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) -- cgit v1.2.3