Add idiomatic wrappers to be exposed publically, and hide low-level

WinAPI operations

Signed-off-by: Ben Ridley <benridley29@gmail.com>
This commit is contained in:
Ben Ridley
2021-03-03 15:35:04 +11:00
parent d947d0f6db
commit 05f0f6f688
4 changed files with 126 additions and 46 deletions

View File

@@ -1,6 +1,7 @@
package sysinfoapi
import (
"fmt"
"unicode/utf16"
"unsafe"
@@ -9,7 +10,7 @@ import (
// MemoryStatusEx is a wrapper for MEMORYSTATUSEX
// https://docs.microsoft.com/en-us/windows/win32/api/sysinfoapi/ns-sysinfoapi-memorystatusex
type MemoryStatusEx struct {
type memoryStatusEx struct {
dwLength uint32
DwMemoryLoad uint32
UllTotalPhys uint64
@@ -21,6 +22,18 @@ type MemoryStatusEx struct {
UllAvailExtendedVirtual uint64
}
// MemoryStatus is an idiomatic wrapper for MemoryStatusEx
type MemoryStatus struct {
MemoryLoad uint32
TotalPhys uint64
AvailPhys uint64
TotalPageFile uint64
AvailPageFile uint64
TotalVirtual uint64
AvailVirtual uint64
AvailExtendedVirtual uint64
}
// wProcessorArchitecture is a wrapper for the union found in LP_SYSTEM_INFO
// https://docs.microsoft.com/en-us/windows/win32/api/sysinfoapi/ns-sysinfoapi-system_info
type wProcessorArchitecture struct {
@@ -28,14 +41,27 @@ type wProcessorArchitecture struct {
WProcessorArchitecture uint16
}
// ProcessorArchitecture is an idiomatic wrapper for wProcessorArchitecture
type ProcessorArchitecture uint16
// Idiomatic values for wProcessorArchitecture
const (
AMD64 ProcessorArchitecture = 9
ARM = 5
ARM64 = 12
IA64 = 6
INTEL = 0
UNKNOWN = 0xffff
)
// LpSystemInfo is a wrapper for LPSYSTEM_INFO
// https://docs.microsoft.com/en-us/windows/win32/api/sysinfoapi/ns-sysinfoapi-system_info
type LpSystemInfo struct {
type lpSystemInfo struct {
Arch wProcessorArchitecture
DwPageSize uint32
LpMinimumApplicationAddress *byte
LpMaximumApplicationAddress *byte
DwActiveProcessorMask *uint32
LpMinimumApplicationAddress uintptr
LpMaximumApplicationAddress uintptr
DwActiveProcessorMask uint32
DwNumberOfProcessors uint32
DwProcessorType uint32
DwAllocationGranularity uint32
@@ -43,6 +69,20 @@ type LpSystemInfo struct {
WProcessorRevision uint16
}
// SystemInfo is an idiomatic wrapper for LpSystemInfo
type SystemInfo struct {
Arch ProcessorArchitecture
PageSize uint32
MinimumApplicationAddress uintptr
MaximumApplicationAddress uintptr
ActiveProcessorMask uint32
NumberOfProcessors uint32
ProcessorType uint32
AllocationGranularity uint32
ProcessorLevel uint16
ProcessorRevision uint16
}
// WinComputerNameFormat is a wrapper for COMPUTER_NAME_FORMAT
type WinComputerNameFormat int
@@ -68,27 +108,47 @@ var (
// GlobalMemoryStatusEx retrieves information about the system's current usage of both physical and virtual memory.
// https://docs.microsoft.com/en-us/windows/win32/api/sysinfoapi/nf-sysinfoapi-globalmemorystatusex
func GlobalMemoryStatusEx() (MemoryStatusEx, error) {
var mse MemoryStatusEx
func GlobalMemoryStatusEx() (MemoryStatus, error) {
var mse memoryStatusEx
mse.dwLength = (uint32)(unsafe.Sizeof(mse))
pMse := uintptr(unsafe.Pointer(&mse))
r1, _, err := procGlobalMemoryStatusEx.Call(pMse)
if ret := *(*bool)(unsafe.Pointer(&r1)); ret == false {
// returned false
return MemoryStatusEx{}, err
return MemoryStatus{}, err
}
return mse, nil
return MemoryStatus{
MemoryLoad: mse.DwMemoryLoad,
TotalPhys: mse.UllTotalPhys,
AvailPhys: mse.UllAvailPhys,
TotalPageFile: mse.UllTotalPageFile,
AvailPageFile: mse.UllAvailPageFile,
TotalVirtual: mse.UllTotalVirtual,
AvailVirtual: mse.UllAvailVirtual,
AvailExtendedVirtual: mse.UllAvailExtendedVirtual,
}, nil
}
// GetSystemInfo wraps the GetSystemInfo function from sysinfoapi
// https://docs.microsoft.com/en-us/windows/win32/api/sysinfoapi/nf-sysinfoapi-getsysteminfo
func GetSystemInfo() LpSystemInfo {
var info LpSystemInfo
func GetSystemInfo() SystemInfo {
var info lpSystemInfo
pInfo := uintptr(unsafe.Pointer(&info))
procGetSystemInfo.Call(pInfo)
return info
fmt.Printf("%+v", info)
return SystemInfo{
Arch: ProcessorArchitecture(info.Arch.WProcessorArchitecture),
PageSize: info.DwPageSize,
MinimumApplicationAddress: info.LpMinimumApplicationAddress,
MaximumApplicationAddress: info.LpMinimumApplicationAddress,
ActiveProcessorMask: info.DwActiveProcessorMask,
NumberOfProcessors: info.DwNumberOfProcessors,
ProcessorType: info.DwProcessorType,
AllocationGranularity: info.DwAllocationGranularity,
ProcessorLevel: info.WProcessorLevel,
ProcessorRevision: info.WProcessorRevision,
}
}
// GetComputerName wraps the GetComputerNameW function in a more Go-like way