From 2003e4c54fbf92595e2696575ccfb286a9307cc7 Mon Sep 17 00:00:00 2001 From: "shirou.wakayama" Date: Mon, 22 Apr 2024 23:02:22 +0900 Subject: [PATCH] [host][windows]: change platform version from build version to display version --- host/host_test.go | 12 ++++++++++++ host/host_windows.go | 20 ++++++++++++++++++-- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/host/host_test.go b/host/host_test.go index 08ca98c83..24b137121 100644 --- a/host/host_test.go +++ b/host/host_test.go @@ -17,6 +17,18 @@ func skipIfNotImplementedErr(t *testing.T, err error) { } } +func TestHostID(t *testing.T) { + v, err := HostID() + skipIfNotImplementedErr(t, err) + if err != nil { + t.Errorf("error %v", err) + } + if v == "" { + t.Errorf("Could not get host id %v", v) + } + t.Log(v) +} + func TestInfo(t *testing.T) { v, err := Info() skipIfNotImplementedErr(t, err) diff --git a/host/host_windows.go b/host/host_windows.go index 1e02e01ee..7daad6f94 100644 --- a/host/host_windows.go +++ b/host/host_windows.go @@ -136,6 +136,14 @@ func BootTimeWithContext(ctx context.Context) (uint64, error) { } func PlatformInformationWithContext(ctx context.Context) (platform string, family string, version string, err error) { + platform, family, _, displayVersion, err := platformInformation(ctx) + if err != nil { + return "", "", "", err + } + return platform, family, displayVersion, nil +} + +func platformInformation(ctx context.Context) (platform, family, version, displayVersion string, err error) { // GetVersionEx lies on Windows 8.1 and returns as Windows 8 if we don't declare compatibility in manifest // RtlGetVersion bypasses this lying layer and returns the true Windows version // https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/content/wdm/nf-wdm-rtlgetversion @@ -199,6 +207,14 @@ func PlatformInformationWithContext(ctx context.Context) (platform string, famil copy((*[4]byte)(unsafe.Pointer(&UBR))[:], regBuf) } + // Get DisplayVersion(ex: 23H2) as platformVersion + err = windows.RegQueryValueEx(h, windows.StringToUTF16Ptr(`DisplayVersion`), nil, &valType, nil, &bufLen) + if err == nil { + regBuf := make([]uint16, bufLen/2+1) + err = windows.RegQueryValueEx(h, windows.StringToUTF16Ptr(`DisplayVersion`), nil, &valType, (*byte)(unsafe.Pointer(®Buf[0])), &bufLen) + displayVersion = windows.UTF16ToString(regBuf[:]) + } + // PlatformFamily switch osInfo.wProductType { case 1: @@ -214,7 +230,7 @@ func PlatformInformationWithContext(ctx context.Context) (platform string, famil osInfo.dwMajorVersion, osInfo.dwMinorVersion, osInfo.dwBuildNumber, UBR, osInfo.dwBuildNumber, UBR) - return platform, family, version, nil + return platform, family, version, displayVersion, nil } func UsersWithContext(ctx context.Context) ([]UserStat, error) { @@ -228,7 +244,7 @@ func VirtualizationWithContext(ctx context.Context) (string, string, error) { } func KernelVersionWithContext(ctx context.Context) (string, error) { - _, _, version, err := PlatformInformationWithContext(ctx) + _, _, version, _, err := platformInformation(ctx) return version, err }