summaryrefslogtreecommitdiff
path: root/vendor/github.com/pbnjay/memory/memory_windows.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/pbnjay/memory/memory_windows.go')
-rw-r--r--vendor/github.com/pbnjay/memory/memory_windows.go60
1 files changed, 60 insertions, 0 deletions
diff --git a/vendor/github.com/pbnjay/memory/memory_windows.go b/vendor/github.com/pbnjay/memory/memory_windows.go
new file mode 100644
index 000000000..c8500cc6f
--- /dev/null
+++ b/vendor/github.com/pbnjay/memory/memory_windows.go
@@ -0,0 +1,60 @@
+// +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
+}