瀏覽代碼

Merge pull request #36451 from Microsoft/jjh/ubr

Windows: Report Version and UBR
John Stephens 7 年之前
父節點
當前提交
8cf8fe9cf8
共有 1 個文件被更改,包括 26 次插入25 次删除
  1. 26 25
      pkg/parsers/operatingsystem/operatingsystem_windows.go

+ 26 - 25
pkg/parsers/operatingsystem/operatingsystem_windows.go

@@ -1,44 +1,45 @@
 package operatingsystem // import "github.com/docker/docker/pkg/parsers/operatingsystem"
 
 import (
-	"unsafe"
+	"fmt"
 
-	"golang.org/x/sys/windows"
+	"golang.org/x/sys/windows/registry"
 )
 
-// See https://code.google.com/p/go/source/browse/src/pkg/mime/type_windows.go?r=d14520ac25bf6940785aabb71f5be453a286f58c
-// for a similar sample
-
 // GetOperatingSystem gets the name of the current operating system.
 func GetOperatingSystem() (string, error) {
 
-	var h windows.Handle
-
 	// Default return value
 	ret := "Unknown Operating System"
 
-	if err := windows.RegOpenKeyEx(windows.HKEY_LOCAL_MACHINE,
-		windows.StringToUTF16Ptr(`SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\`),
-		0,
-		windows.KEY_READ,
-		&h); err != nil {
+	k, err := registry.OpenKey(registry.LOCAL_MACHINE, `SOFTWARE\Microsoft\WIndows NT\CurrentVersion`, registry.QUERY_VALUE)
+	if err != nil {
+		return ret, err
+	}
+	defer k.Close()
+
+	pn, _, err := k.GetStringValue("ProductName")
+	if err != nil {
+		return ret, err
+	}
+	ret = pn
+
+	ri, _, err := k.GetStringValue("ReleaseId")
+	if err != nil {
+		return ret, err
+	}
+	ret = fmt.Sprintf("%s Version %s", ret, ri)
+
+	cbn, _, err := k.GetStringValue("CurrentBuildNumber")
+	if err != nil {
 		return ret, err
 	}
-	defer windows.RegCloseKey(h)
-
-	var buf [1 << 10]uint16
-	var typ uint32
-	n := uint32(len(buf) * 2) // api expects array of bytes, not uint16
-
-	if err := windows.RegQueryValueEx(h,
-		windows.StringToUTF16Ptr("ProductName"),
-		nil,
-		&typ,
-		(*byte)(unsafe.Pointer(&buf[0])),
-		&n); err != nil {
+
+	ubr, _, err := k.GetIntegerValue("UBR")
+	if err != nil {
 		return ret, err
 	}
-	ret = windows.UTF16ToString(buf[:])
+	ret = fmt.Sprintf("%s (OS Build %s.%d)", ret, cbn, ubr)
 
 	return ret, nil
 }