diff --git a/mem_windows.go b/mem_windows.go index 5bbaa8f..05cbfdc 100644 --- a/mem_windows.go +++ b/mem_windows.go @@ -2,9 +2,42 @@ package main +import ( + "syscall" + "unsafe" +) + +var ( + modKernel32 = syscall.NewLazyDLL("kernel32.dll") + globalMemoryStatusEx = modKernel32.NewProc("GlobalMemoryStatusEx") +) + +type MEMORYSTATUSEX struct { + cbSize uint32 + dwMemoryLoad uint32 + ullTotalPhys uint64 // in bytes + ullAvailPhys uint64 + ullTotalPageFile uint64 + ullAvailPageFile uint64 + ullTotalVirtual uint64 + ullAvailVirtual uint64 + ullAvailExtendedVirtual uint64 +} + func (m Mem) Virtual_memory() (Virtual_memory, error) { ret := Virtual_memory{} + var memInfo MEMORYSTATUSEX + memInfo.cbSize = uint32(unsafe.Sizeof(memInfo)) + mem, _, _ := globalMemoryStatusEx.Call(uintptr(unsafe.Pointer(&memInfo))) + if mem == 0 { + return ret, syscall.GetLastError() + } + + ret.Total = memInfo.ullTotalPhys + ret.Available = memInfo.ullAvailPhys + ret.UsedPercent = float64(memInfo.dwMemoryLoad) + ret.Used = ret.Total - ret.Available return ret, nil }