Add back LoadLibraryA fallback
This commit is contained in:
@@ -41,6 +41,7 @@ const (
|
||||
//go:cgo_import_dynamic runtime._SetThreadContext SetThreadContext%2 "kernel32.dll"
|
||||
//go:cgo_import_dynamic runtime._LoadLibraryExW LoadLibraryExW%3 "kernel32.dll"
|
||||
//go:cgo_import_dynamic runtime._LoadLibraryW LoadLibraryW%1 "kernel32.dll"
|
||||
//go:cgo_import_dynamic runtime._LoadLibraryA LoadLibraryA%1 "kernel32.dll"
|
||||
//go:cgo_import_dynamic runtime._PostQueuedCompletionStatus PostQueuedCompletionStatus%4 "kernel32.dll"
|
||||
//go:cgo_import_dynamic runtime._QueryPerformanceCounter QueryPerformanceCounter%1 "kernel32.dll"
|
||||
//go:cgo_import_dynamic runtime._QueryPerformanceFrequency QueryPerformanceFrequency%1 "kernel32.dll"
|
||||
@@ -74,6 +75,7 @@ var (
|
||||
// Following syscalls are available on every Windows PC.
|
||||
// All these variables are set by the Windows executable
|
||||
// loader before the Go program starts.
|
||||
_AddDllDirectory,
|
||||
_AddVectoredContinueHandler,
|
||||
_AddVectoredExceptionHandler,
|
||||
_CloseHandle,
|
||||
@@ -99,6 +101,7 @@ var (
|
||||
_SetThreadContext,
|
||||
_LoadLibraryExW,
|
||||
_LoadLibraryW,
|
||||
_LoadLibraryA,
|
||||
_PostQueuedCompletionStatus,
|
||||
_QueryPerformanceCounter,
|
||||
_QueryPerformanceFrequency,
|
||||
@@ -157,7 +160,6 @@ var (
|
||||
ntdlldll = [...]uint16{'n', 't', 'd', 'l', 'l', '.', 'd', 'l', 'l', 0}
|
||||
powrprofdll = [...]uint16{'p', 'o', 'w', 'r', 'p', 'r', 'o', 'f', '.', 'd', 'l', 'l', 0}
|
||||
winmmdll = [...]uint16{'w', 'i', 'n', 'm', 'm', '.', 'd', 'l', 'l', 0}
|
||||
ws2_32dll = [...]uint16{'w', 's', '2', '_', '3', '2', '.', 'd', 'l', 'l', 0}
|
||||
)
|
||||
|
||||
// Function to be called by windows CreateThread
|
||||
@@ -253,7 +255,36 @@ func windows_GetSystemDirectory() string {
|
||||
}
|
||||
|
||||
func windowsLoadSystemLib(name []uint16) uintptr {
|
||||
return stdcall3(_LoadLibraryExW, uintptr(unsafe.Pointer(&name[0])), 0, _LOAD_LIBRARY_SEARCH_SYSTEM32)
|
||||
if useLoadLibraryEx {
|
||||
return stdcall3(_LoadLibraryExW, uintptr(unsafe.Pointer(&name[0])), 0, _LOAD_LIBRARY_SEARCH_SYSTEM32)
|
||||
} else {
|
||||
var nameBytes [_MAX_PATH]byte
|
||||
n := len(name)
|
||||
if n > len(nameBytes) {
|
||||
n = len(nameBytes)
|
||||
}
|
||||
for i := 0; i < n && name[i] != 0; i++ {
|
||||
nameBytes[i] = byte(name[i])
|
||||
}
|
||||
|
||||
// Construct the full path
|
||||
var fullPath [_MAX_PATH]byte
|
||||
copy(fullPath[:], sysDirectory[:sysDirectoryLen])
|
||||
pathLen := sysDirectoryLen
|
||||
for i := 0; i < len(nameBytes) && nameBytes[i] != 0 && pathLen < _MAX_PATH; i++ {
|
||||
fullPath[pathLen] = nameBytes[i]
|
||||
pathLen++
|
||||
}
|
||||
|
||||
// Ensure null-termination
|
||||
if pathLen < _MAX_PATH {
|
||||
fullPath[pathLen] = 0
|
||||
} else {
|
||||
fullPath[_MAX_PATH-1] = 0
|
||||
}
|
||||
|
||||
return stdcall1(_LoadLibraryA, uintptr(unsafe.Pointer(&fullPath[0])))
|
||||
}
|
||||
}
|
||||
|
||||
//go:linkname windows_QueryPerformanceCounter internal/syscall/windows.QueryPerformanceCounter
|
||||
@@ -271,6 +302,15 @@ func windows_QueryPerformanceFrequency() int64 {
|
||||
}
|
||||
|
||||
func loadOptionalSyscalls() {
|
||||
var kernel32dll = []byte("kernel32.dll\000")
|
||||
k32 := stdcall1(_LoadLibraryA, uintptr(unsafe.Pointer(&kernel32dll[0])))
|
||||
if k32 == 0 {
|
||||
throw("kernel32.dll not found")
|
||||
}
|
||||
_AddDllDirectory = windowsFindfunc(k32, []byte("AddDllDirectory\000"))
|
||||
_LoadLibraryExW = windowsFindfunc(k32, []byte("LoadLibraryExW\000"))
|
||||
useLoadLibraryEx = (_LoadLibraryExW != nil && _AddDllDirectory != nil)
|
||||
|
||||
a32 := windowsLoadSystemLib(advapi32dll[:])
|
||||
if a32 == 0 {
|
||||
throw("advapi32.dll not found")
|
||||
@@ -365,6 +405,22 @@ const (
|
||||
// in sys_windows_386.s and sys_windows_amd64.s:
|
||||
func getlasterror() uint32
|
||||
|
||||
// When loading DLLs, we prefer to use LoadLibraryEx with
|
||||
// LOAD_LIBRARY_SEARCH_* flags, if available. LoadLibraryEx is not
|
||||
// available on old Windows, though, and the LOAD_LIBRARY_SEARCH_*
|
||||
// flags are not available on some versions of Windows without a
|
||||
// security patch.
|
||||
//
|
||||
// https://msdn.microsoft.com/en-us/library/ms684179(v=vs.85).aspx says:
|
||||
// "Windows 7, Windows Server 2008 R2, Windows Vista, and Windows
|
||||
// Server 2008: The LOAD_LIBRARY_SEARCH_* flags are available on
|
||||
// systems that have KB2533623 installed. To determine whether the
|
||||
// flags are available, use GetProcAddress to get the address of the
|
||||
// AddDllDirectory, RemoveDllDirectory, or SetDefaultDllDirectories
|
||||
// function. If GetProcAddress succeeds, the LOAD_LIBRARY_SEARCH_*
|
||||
// flags can be used with LoadLibraryEx."
|
||||
var useLoadLibraryEx bool
|
||||
|
||||
var timeBeginPeriodRetValue uint32
|
||||
|
||||
// osRelaxMinNS indicates that sysmon shouldn't osRelax if the next
|
||||
|
||||
Reference in New Issue
Block a user