meminfo_windows.go 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. package system
  2. import (
  3. "unsafe"
  4. "golang.org/x/sys/windows"
  5. )
  6. var (
  7. modkernel32 = windows.NewLazySystemDLL("kernel32.dll")
  8. procGlobalMemoryStatusEx = modkernel32.NewProc("GlobalMemoryStatusEx")
  9. )
  10. // https://msdn.microsoft.com/en-us/library/windows/desktop/aa366589(v=vs.85).aspx
  11. // https://msdn.microsoft.com/en-us/library/windows/desktop/aa366770(v=vs.85).aspx
  12. type memorystatusex struct {
  13. dwLength uint32
  14. dwMemoryLoad uint32
  15. ullTotalPhys uint64
  16. ullAvailPhys uint64
  17. ullTotalPageFile uint64
  18. ullAvailPageFile uint64
  19. ullTotalVirtual uint64
  20. ullAvailVirtual uint64
  21. ullAvailExtendedVirtual uint64
  22. }
  23. // ReadMemInfo retrieves memory statistics of the host system and returns a
  24. // MemInfo type.
  25. func ReadMemInfo() (*MemInfo, error) {
  26. msi := &memorystatusex{
  27. dwLength: 64,
  28. }
  29. r1, _, _ := procGlobalMemoryStatusEx.Call(uintptr(unsafe.Pointer(msi)))
  30. if r1 == 0 {
  31. return &MemInfo{}, nil
  32. }
  33. return &MemInfo{
  34. MemTotal: int64(msi.ullTotalPhys),
  35. MemFree: int64(msi.ullAvailPhys),
  36. SwapTotal: int64(msi.ullTotalPageFile),
  37. SwapFree: int64(msi.ullAvailPageFile),
  38. }, nil
  39. }