diff --git a/server/certstore/certstore_windows.go b/server/certstore/certstore_windows.go index 4db8b90360e..d3a1d745235 100644 --- a/server/certstore/certstore_windows.go +++ b/server/certstore/certstore_windows.go @@ -124,19 +124,38 @@ var ( winAuthRootStore = winWide("AuthRoot") // These DLLs must be available on all Windows hosts - winCrypt32 = windows.MustLoadDLL("crypt32.dll") - winNCrypt = windows.MustLoadDLL("ncrypt.dll") + winCrypt32 = windows.NewLazySystemDLL("crypt32.dll") + winNCrypt = windows.NewLazySystemDLL("ncrypt.dll") - winCertFindCertificateInStore = winCrypt32.MustFindProc("CertFindCertificateInStore") - winCryptAcquireCertificatePrivateKey = winCrypt32.MustFindProc("CryptAcquireCertificatePrivateKey") - winNCryptExportKey = winNCrypt.MustFindProc("NCryptExportKey") - winNCryptOpenStorageProvider = winNCrypt.MustFindProc("NCryptOpenStorageProvider") - winNCryptGetProperty = winNCrypt.MustFindProc("NCryptGetProperty") - winNCryptSignHash = winNCrypt.MustFindProc("NCryptSignHash") + winCertFindCertificateInStore = winCrypt32.NewProc("CertFindCertificateInStore") + winCryptAcquireCertificatePrivateKey = winCrypt32.NewProc("CryptAcquireCertificatePrivateKey") + winNCryptExportKey = winNCrypt.NewProc("NCryptExportKey") + winNCryptOpenStorageProvider = winNCrypt.NewProc("NCryptOpenStorageProvider") + winNCryptGetProperty = winNCrypt.NewProc("NCryptGetProperty") + winNCryptSignHash = winNCrypt.NewProc("NCryptSignHash") winFnGetProperty = winGetProperty ) +func init() { + for _, d := range []*windows.LazyDLL{ + winCrypt32, winNCrypt, + } { + if err := d.Load(); err != nil { + panic(err) + } + } + for _, p := range []*windows.LazyProc{ + winCertFindCertificateInStore, winCryptAcquireCertificatePrivateKey, + winNCryptExportKey, winNCryptOpenStorageProvider, + winNCryptGetProperty, winNCryptSignHash, + } { + if err := p.Find(); err != nil { + panic(err) + } + } +} + type winPKCS1PaddingInfo struct { pszAlgID *uint16 } diff --git a/server/pse/pse_windows.go b/server/pse/pse_windows.go index 5ee9645f3f7..04e3ae8bb9b 100644 --- a/server/pse/pse_windows.go +++ b/server/pse/pse_windows.go @@ -25,10 +25,12 @@ import ( "syscall" "time" "unsafe" + + "golang.org/x/sys/windows" ) var ( - pdh = syscall.NewLazyDLL("pdh.dll") + pdh = windows.NewLazySystemDLL("pdh.dll") winPdhOpenQuery = pdh.NewProc("PdhOpenQuery") winPdhAddCounter = pdh.NewProc("PdhAddCounterW") winPdhCollectQueryData = pdh.NewProc("PdhCollectQueryData") @@ -36,6 +38,20 @@ var ( winPdhGetFormattedCounterArray = pdh.NewProc("PdhGetFormattedCounterArrayW") ) +func init() { + if err := pdh.Load(); err != nil { + panic(err) + } + for _, p := range []*windows.LazyProc{ + winPdhOpenQuery, winPdhAddCounter, winPdhCollectQueryData, + winPdhGetFormattedCounterValue, winPdhGetFormattedCounterArray, + } { + if err := p.Find(); err != nil { + panic(err) + } + } +} + // global performance counter query handle and counters var ( pcHandle PDH_HQUERY diff --git a/server/sysmem/mem_windows.go b/server/sysmem/mem_windows.go index cc4c43dc95b..f557c0b8ee1 100644 --- a/server/sysmem/mem_windows.go +++ b/server/sysmem/mem_windows.go @@ -17,10 +17,23 @@ package sysmem import ( - "syscall" "unsafe" + + "golang.org/x/sys/windows" ) +var winKernel32 = windows.NewLazySystemDLL("kernel32.dll") +var winGlobalMemoryStatusEx = winKernel32.NewProc("GlobalMemoryStatusEx") + +func init() { + if err := winKernel32.Load(); err != nil { + panic(err) + } + if err := winGlobalMemoryStatusEx.Find(); err != nil { + panic(err) + } +} + // https://docs.microsoft.com/en-us/windows/win32/api/sysinfoapi/ns-sysinfoapi-memorystatusex type _memoryStatusEx struct { dwLength uint32 @@ -30,16 +43,8 @@ type _memoryStatusEx struct { } func Memory() int64 { - kernel32, err := syscall.LoadDLL("kernel32.dll") - if err != nil { - return 0 - } - globalMemoryStatusEx, err := kernel32.FindProc("GlobalMemoryStatusEx") - if err != nil { - return 0 - } msx := &_memoryStatusEx{dwLength: 64} - res, _, _ := globalMemoryStatusEx.Call(uintptr(unsafe.Pointer(msx))) + res, _, _ := winGlobalMemoryStatusEx.Call(uintptr(unsafe.Pointer(msx))) if res == 0 { return 0 }