Files
sproutclaw-web/backend/internal/handlers/sysinfo_windows.go

69 lines
1.7 KiB
Go

//go:build windows
package handlers
import (
"syscall"
"unsafe"
)
type memoryStatusEx struct {
dwLength uint32
dwMemoryLoad uint32
ullTotalPhys uint64
ullAvailPhys uint64
ullTotalPageFile uint64
ullAvailPageFile uint64
ullTotalVirtual uint64
ullAvailVirtual uint64
ullAvailExtendedVirtual uint64
}
func getSysMemMb() (total, free int64) {
kernel32 := syscall.NewLazyDLL("kernel32.dll")
proc := kernel32.NewProc("GlobalMemoryStatusEx")
var ms memoryStatusEx
ms.dwLength = uint32(unsafe.Sizeof(ms))
ret, _, _ := proc.Call(uintptr(unsafe.Pointer(&ms)))
if ret == 0 {
return 0, 0
}
return int64(ms.ullTotalPhys / 1024 / 1024), int64(ms.ullAvailPhys / 1024 / 1024)
}
func getOSRelease() string {
k, err := syscall.UTF16PtrFromString(`SOFTWARE\Microsoft\Windows NT\CurrentVersion`)
if err != nil {
return "Windows"
}
var handle syscall.Handle
if err := syscall.RegOpenKeyEx(syscall.HKEY_LOCAL_MACHINE, k, 0, syscall.KEY_READ, &handle); err != nil {
return "Windows"
}
defer syscall.RegCloseKey(handle)
readStr := func(name string) string {
namePtr, _ := syscall.UTF16PtrFromString(name)
var typ uint32
var buf [256]uint16
n := uint32(len(buf) * 2)
if err := syscall.RegQueryValueEx(handle, namePtr, nil, &typ, (*byte)(unsafe.Pointer(&buf[0])), &n); err != nil {
return ""
}
return syscall.UTF16ToString(buf[:])
}
productName := readStr("ProductName")
displayVersion := readStr("DisplayVersion")
if displayVersion == "" {
displayVersion = readStr("ReleaseId")
}
if productName == "" {
return "Windows"
}
if displayVersion != "" {
return productName + " " + displayVersion
}
return productName
}