71 lines
2.2 KiB
Go
71 lines
2.2 KiB
Go
//
|
|
// Use and distribution licensed under the Apache license version 2.
|
|
//
|
|
// See the COPYING file in the root project directory for full text.
|
|
//
|
|
|
|
package ghw
|
|
|
|
import (
|
|
"github.com/StackExchange/wmi"
|
|
)
|
|
|
|
const wqlOperatingSystem = "SELECT TotalVisibleMemorySize FROM Win32_OperatingSystem"
|
|
|
|
type win32OperatingSystem struct {
|
|
TotalVisibleMemorySize *uint64
|
|
}
|
|
|
|
const wqlPhysicalMemory = "SELECT BankLabel, Capacity, DataWidth, Description, DeviceLocator, Manufacturer, Model, Name, PartNumber, PositionInRow, SerialNumber, Speed, Tag, TotalWidth FROM Win32_PhysicalMemory"
|
|
|
|
type win32PhysicalMemory struct {
|
|
BankLabel *string
|
|
Capacity *uint64
|
|
DataWidth *uint16
|
|
Description *string
|
|
DeviceLocator *string
|
|
Manufacturer *string
|
|
Model *string
|
|
Name *string
|
|
PartNumber *string
|
|
PositionInRow *uint32
|
|
SerialNumber *string
|
|
Speed *uint32
|
|
Tag *string
|
|
TotalWidth *uint16
|
|
}
|
|
|
|
func (ctx *context) memFillInfo(info *MemoryInfo) error {
|
|
// Getting info from WMI
|
|
var win32OSDescriptions []win32OperatingSystem
|
|
if err := wmi.Query(wqlOperatingSystem, &win32OSDescriptions); err != nil {
|
|
return err
|
|
}
|
|
var win32MemDescriptions []win32PhysicalMemory
|
|
if err := wmi.Query(wqlPhysicalMemory, &win32MemDescriptions); err != nil {
|
|
return err
|
|
}
|
|
// We calculate total physical memory size by summing the DIMM sizes
|
|
var totalPhysicalBytes uint64
|
|
info.Modules = make([]*MemoryModule, 0, len(win32MemDescriptions))
|
|
for _, description := range win32MemDescriptions {
|
|
totalPhysicalBytes += *description.Capacity
|
|
info.Modules = append(info.Modules, &MemoryModule{
|
|
Label: *description.BankLabel,
|
|
Location: *description.DeviceLocator,
|
|
SerialNumber: *description.SerialNumber,
|
|
SizeBytes: int64(*description.Capacity),
|
|
Vendor: *description.Manufacturer,
|
|
})
|
|
}
|
|
var totalUsableBytes uint64
|
|
for _, description := range win32OSDescriptions {
|
|
// TotalVisibleMemorySize is the amount of memory available for us by
|
|
// the operating system **in Kilobytes**
|
|
totalUsableBytes += *description.TotalVisibleMemorySize * uint64(KB)
|
|
}
|
|
info.TotalUsableBytes = int64(totalUsableBytes)
|
|
info.TotalPhysicalBytes = int64(totalPhysicalBytes)
|
|
return nil
|
|
}
|