golang.zx2c4.com/wireguard/windows@v0.5.4-0.20230123132234-dcc0eb72a04b/driver/dll_fromrsrc_windows.go (about) 1 //go:build load_wgnt_from_rsrc 2 3 /* SPDX-License-Identifier: MIT 4 * 5 * Copyright (C) 2019 WireGuard LLC. All Rights Reserved. 6 */ 7 8 package driver 9 10 import ( 11 "fmt" 12 "sync" 13 "sync/atomic" 14 "unsafe" 15 16 "golang.org/x/sys/windows" 17 "golang.zx2c4.com/wireguard/windows/driver/memmod" 18 ) 19 20 type lazyDLL struct { 21 Name string 22 Base windows.Handle 23 mu sync.Mutex 24 module *memmod.Module 25 onLoad func(d *lazyDLL) 26 } 27 28 func (d *lazyDLL) Load() error { 29 if atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(&d.module))) != nil { 30 return nil 31 } 32 d.mu.Lock() 33 defer d.mu.Unlock() 34 if d.module != nil { 35 return nil 36 } 37 38 const ourModule windows.Handle = 0 39 resInfo, err := windows.FindResource(ourModule, d.Name, windows.RT_RCDATA) 40 if err != nil { 41 return fmt.Errorf("Unable to find \"%v\" RCDATA resource: %w", d.Name, err) 42 } 43 data, err := windows.LoadResourceData(ourModule, resInfo) 44 if err != nil { 45 return fmt.Errorf("Unable to load resource: %w", err) 46 } 47 module, err := memmod.LoadLibrary(data) 48 if err != nil { 49 return fmt.Errorf("Unable to load library: %w", err) 50 } 51 d.Base = windows.Handle(module.BaseAddr()) 52 53 atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(&d.module)), unsafe.Pointer(module)) 54 if d.onLoad != nil { 55 d.onLoad(d) 56 } 57 return nil 58 } 59 60 func (p *lazyProc) nameToAddr() (uintptr, error) { 61 return p.dll.module.ProcAddressByName(p.Name) 62 }