get.pme.sh/pnats@v0.0.0-20240304004023-26bb5a137ed0/server/sysmem/mem_windows.go (about) 1 // Copyright 2019 The NATS Authors 2 // Licensed under the Apache License, Version 2.0 (the "License"); 3 // you may not use this file except in compliance with the License. 4 // You may obtain a copy of the License at 5 // 6 // http://www.apache.org/licenses/LICENSE-2.0 7 // 8 // Unless required by applicable law or agreed to in writing, software 9 // distributed under the License is distributed on an "AS IS" BASIS, 10 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 // See the License for the specific language governing permissions and 12 // limitations under the License. 13 14 //go:build windows 15 // +build windows 16 17 package sysmem 18 19 import ( 20 "syscall" 21 "unsafe" 22 ) 23 24 // https://docs.microsoft.com/en-us/windows/win32/api/sysinfoapi/ns-sysinfoapi-memorystatusex 25 type _memoryStatusEx struct { 26 dwLength uint32 27 dwMemoryLoad uint32 28 ullTotalPhys uint64 29 unused [6]uint64 // ignore rest of struct 30 } 31 32 func Memory() int64 { 33 kernel32, err := syscall.LoadDLL("kernel32.dll") 34 if err != nil { 35 return 0 36 } 37 globalMemoryStatusEx, err := kernel32.FindProc("GlobalMemoryStatusEx") 38 if err != nil { 39 return 0 40 } 41 msx := &_memoryStatusEx{dwLength: 64} 42 res, _, _ := globalMemoryStatusEx.Call(uintptr(unsafe.Pointer(msx))) 43 if res == 0 { 44 return 0 45 } 46 return int64(msx.ullTotalPhys) 47 }