61 lines
1.3 KiB
Go
61 lines
1.3 KiB
Go
|
// +build windows
|
||
|
|
||
|
package memory
|
||
|
|
||
|
import (
|
||
|
"syscall"
|
||
|
"unsafe"
|
||
|
)
|
||
|
|
||
|
// omitting a few fields for brevity...
|
||
|
// https://msdn.microsoft.com/en-us/library/windows/desktop/aa366589(v=vs.85).aspx
|
||
|
type memStatusEx struct {
|
||
|
dwLength uint32
|
||
|
dwMemoryLoad uint32
|
||
|
ullTotalPhys uint64
|
||
|
ullAvailPhys uint64
|
||
|
unused [5]uint64
|
||
|
}
|
||
|
|
||
|
func sysTotalMemory() uint64 {
|
||
|
kernel32, err := syscall.LoadDLL("kernel32.dll")
|
||
|
if err != nil {
|
||
|
return 0
|
||
|
}
|
||
|
// GetPhysicallyInstalledSystemMemory is simpler, but broken on
|
||
|
// older versions of windows (and uses this under the hood anyway).
|
||
|
globalMemoryStatusEx, err := kernel32.FindProc("GlobalMemoryStatusEx")
|
||
|
if err != nil {
|
||
|
return 0
|
||
|
}
|
||
|
msx := &memStatusEx{
|
||
|
dwLength: 64,
|
||
|
}
|
||
|
r, _, _ := globalMemoryStatusEx.Call(uintptr(unsafe.Pointer(msx)))
|
||
|
if r == 0 {
|
||
|
return 0
|
||
|
}
|
||
|
return msx.ullTotalPhys
|
||
|
}
|
||
|
|
||
|
func sysFreeMemory() uint64 {
|
||
|
kernel32, err := syscall.LoadDLL("kernel32.dll")
|
||
|
if err != nil {
|
||
|
return 0
|
||
|
}
|
||
|
// GetPhysicallyInstalledSystemMemory is simpler, but broken on
|
||
|
// older versions of windows (and uses this under the hood anyway).
|
||
|
globalMemoryStatusEx, err := kernel32.FindProc("GlobalMemoryStatusEx")
|
||
|
if err != nil {
|
||
|
return 0
|
||
|
}
|
||
|
msx := &memStatusEx{
|
||
|
dwLength: 64,
|
||
|
}
|
||
|
r, _, _ := globalMemoryStatusEx.Call(uintptr(unsafe.Pointer(msx)))
|
||
|
if r == 0 {
|
||
|
return 0
|
||
|
}
|
||
|
return msx.ullAvailPhys
|
||
|
}
|