diff options
author | Jason A. Donenfeld <Jason@zx2c4.com> | 2020-11-11 18:51:44 +0100 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2020-11-11 18:51:44 +0100 |
commit | 60b3766b89b9cc664d9bbdc9ab34b283e0374d21 (patch) | |
tree | 34c11b87b228b92da4b3fe9d8c50390ece64be70 /tun/wintun/dll_fromrsrc_windows.go | |
parent | 82128c47d90a54faded017ad3e5bc61eb0c641db (diff) |
wintun: load from filesystem by default
We let people loading this from resources opt in via:
go build -tags load_wintun_from_rsrc
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Diffstat (limited to 'tun/wintun/dll_fromrsrc_windows.go')
-rw-r--r-- | tun/wintun/dll_fromrsrc_windows.go | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/tun/wintun/dll_fromrsrc_windows.go b/tun/wintun/dll_fromrsrc_windows.go new file mode 100644 index 0000000..e6e393f --- /dev/null +++ b/tun/wintun/dll_fromrsrc_windows.go @@ -0,0 +1,58 @@ +// +build load_wintun_from_rsrc + +/* SPDX-License-Identifier: MIT + * + * Copyright (C) 2019 WireGuard LLC. All Rights Reserved. + */ + +package wintun + +import ( + "fmt" + "sync" + "sync/atomic" + "unsafe" + + "golang.org/x/sys/windows" + + "golang.zx2c4.com/wireguard/tun/wintun/memmod" + "golang.zx2c4.com/wireguard/tun/wintun/resource" +) + +type lazyDLL struct { + Name string + mu sync.Mutex + module *memmod.Module +} + +func (d *lazyDLL) Load() error { + if atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(&d.module))) != nil { + return nil + } + d.mu.Lock() + defer d.mu.Unlock() + if d.module != nil { + return nil + } + + const ourModule windows.Handle = 0 + resInfo, err := resource.FindByName(ourModule, d.Name, resource.RT_RCDATA) + if err != nil { + return fmt.Errorf("Unable to find \"%v\" RCDATA resource: %w", d.Name, err) + } + data, err := resource.Load(ourModule, resInfo) + if err != nil { + return fmt.Errorf("Unable to load resource: %w", err) + } + module, err := memmod.LoadLibrary(data) + if err != nil { + return fmt.Errorf("Unable to load library: %w", err) + } + + atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(&d.module)), unsafe.Pointer(module)) + return nil +} + +func (p *lazyProc) nameToAddr() (uintptr, error) { + return p.dll.module.ProcAddressByName(p.Name) +} |