mirror of
https://github.com/prometheus-community/windows_exporter.git
synced 2026-02-08 22:16:38 +00:00
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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user