Skip to content

Commit

Permalink
Feature: Memory Banks (Windows Only)
Browse files Browse the repository at this point in the history
When collecting HW informations about memory, it's also very useful to
know the physical memory banks and their specs
  • Loading branch information
Riccardo Re authored and jaypipes committed Mar 16, 2020
1 parent e20daa2 commit 3a54316
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 3 deletions.
11 changes: 10 additions & 1 deletion memory.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,20 @@ import (
"math"
)

type MemoryModule struct {
Label string `json:"label"`
Location string `json:"location"`
SerialNumber string `json:"serial_number"`
SizeBytes int64 `json:"size_bytes"`
Vendor string `json:"vendor"`
}

type MemoryInfo struct {
TotalPhysicalBytes int64 `json:"total_physical_bytes"`
TotalUsableBytes int64 `json:"total_usable_bytes"`
// An array of sizes, in bytes, of memory pages supported by the host
SupportedPageSizes []uint64 `json:"supported_page_sizes"`
SupportedPageSizes []uint64 `json:"supported_page_sizes"`
Modules []*MemoryModule `json:"modules"`
}

func Memory(opts ...*WithOption) (*MemoryInfo, error) {
Expand Down
39 changes: 37 additions & 2 deletions memory_windows.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import (
"github.com/StackExchange/wmi"
)

const wmqlMemory = "SELECT FreePhysicalMemory, FreeSpaceInPagingFiles, FreeVirtualMemory, TotalSwapSpaceSize, TotalVirtualMemorySize, TotalVisibleMemorySize FROM Win32_OperatingSystem"
const wqlOperatingSystem = "SELECT FreePhysicalMemory, FreeSpaceInPagingFiles, FreeVirtualMemory, TotalSwapSpaceSize, TotalVirtualMemorySize, TotalVisibleMemorySize FROM Win32_OperatingSystem"

type win32OperatingSystem struct {
FreePhysicalMemory uint64
Expand All @@ -21,12 +21,47 @@ 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(wmqlMemory, &win32OSDescriptions); err != nil {
if err := wmi.Query(wqlOperatingSystem, &win32OSDescriptions); err != nil {
return err
}
var win32MemDescriptions []win32PhysicalMemory
if err := wmi.Query(wqlPhysicalMemory, &win32MemDescriptions); err != nil {
return err
}
// Converting into standard structures
// Handling physical memory modules
info.Modules = make([]*MemoryModule, 0, len(win32MemDescriptions))
for _, description := range win32MemDescriptions {
info.Modules = append(info.Modules, &MemoryModule{
Label: description.BankLabel,
Location: description.DeviceLocator,
SerialNumber: description.SerialNumber,
SizeBytes: int64(description.Capacity),
Vendor: description.Manufacturer,
})
}
// Handling physical memory total/free size (as seen by OS)
var totalUsableBytes uint64
var totalPhysicalBytes uint64
Expand Down

0 comments on commit 3a54316

Please sign in to comment.