windows: add LoadLibraryEx, add LazyDLL.System

Updates golang/go#14959

Change-Id: Ib91c359c3df919df0b30e584d38e56f79f3e3dc9
Reviewed-on: https://go-review.googlesource.com/21388
Reviewed-by: Russ Cox <rsc@golang.org>
Reviewed-by: Alex Brainman <alex.brainman@gmail.com>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
Brad Fitzpatrick
2016-04-02 00:33:28 +00:00
parent 320cb01ddb
commit 3dff6e19a5
5 changed files with 156 additions and 35 deletions
+38 -13
View File
@@ -2,23 +2,25 @@
package windows
import "unsafe"
import "syscall"
import (
"syscall"
"unsafe"
)
var _ unsafe.Pointer
var (
modadvapi32 = syscall.NewLazyDLL("advapi32.dll")
modkernel32 = syscall.NewLazyDLL("kernel32.dll")
modshell32 = syscall.NewLazyDLL("shell32.dll")
modmswsock = syscall.NewLazyDLL("mswsock.dll")
modcrypt32 = syscall.NewLazyDLL("crypt32.dll")
modws2_32 = syscall.NewLazyDLL("ws2_32.dll")
moddnsapi = syscall.NewLazyDLL("dnsapi.dll")
modiphlpapi = syscall.NewLazyDLL("iphlpapi.dll")
modsecur32 = syscall.NewLazyDLL("secur32.dll")
modnetapi32 = syscall.NewLazyDLL("netapi32.dll")
moduserenv = syscall.NewLazyDLL("userenv.dll")
modadvapi32 = &LazyDLL{Name: "advapi32.dll", System: true}
modkernel32 = &LazyDLL{Name: "kernel32.dll", System: true}
modshell32 = &LazyDLL{Name: "shell32.dll", System: true}
modmswsock = &LazyDLL{Name: "mswsock.dll", System: true}
modcrypt32 = &LazyDLL{Name: "crypt32.dll", System: true}
modws2_32 = &LazyDLL{Name: "ws2_32.dll", System: true}
moddnsapi = &LazyDLL{Name: "dnsapi.dll", System: true}
modiphlpapi = &LazyDLL{Name: "iphlpapi.dll", System: true}
modsecur32 = &LazyDLL{Name: "secur32.dll", System: true}
modnetapi32 = &LazyDLL{Name: "netapi32.dll", System: true}
moduserenv = &LazyDLL{Name: "userenv.dll", System: true}
procRegisterEventSourceW = modadvapi32.NewProc("RegisterEventSourceW")
procDeregisterEventSource = modadvapi32.NewProc("DeregisterEventSource")
@@ -39,6 +41,7 @@ var (
procQueryServiceConfig2W = modadvapi32.NewProc("QueryServiceConfig2W")
procGetLastError = modkernel32.NewProc("GetLastError")
procLoadLibraryW = modkernel32.NewProc("LoadLibraryW")
procLoadLibraryExW = modkernel32.NewProc("LoadLibraryExW")
procFreeLibrary = modkernel32.NewProc("FreeLibrary")
procGetProcAddress = modkernel32.NewProc("GetProcAddress")
procGetVersion = modkernel32.NewProc("GetVersion")
@@ -430,6 +433,28 @@ func _LoadLibrary(libname *uint16) (handle Handle, err error) {
return
}
func LoadLibraryEx(libname string, zero Handle, flags uintptr) (handle Handle, err error) {
var _p0 *uint16
_p0, err = syscall.UTF16PtrFromString(libname)
if err != nil {
return
}
return _LoadLibraryEx(_p0, zero, flags)
}
func _LoadLibraryEx(libname *uint16, zero Handle, flags uintptr) (handle Handle, err error) {
r0, _, e1 := syscall.Syscall(procLoadLibraryExW.Addr(), 3, uintptr(unsafe.Pointer(libname)), uintptr(zero), uintptr(flags))
handle = Handle(r0)
if handle == 0 {
if e1 != 0 {
err = error(e1)
} else {
err = syscall.EINVAL
}
}
return
}
func FreeLibrary(handle Handle) (err error) {
r1, _, e1 := syscall.Syscall(procFreeLibrary.Addr(), 1, uintptr(handle), 0, 0)
if r1 == 0 {