Skip to content

Commit 8cf8fe9

Browse files
authored
Merge pull request moby#36451 from Microsoft/jjh/ubr
Windows: Report Version and UBR
2 parents f3a3778 + 6de9f90 commit 8cf8fe9

File tree

1 file changed

+26
-25
lines changed

1 file changed

+26
-25
lines changed

pkg/parsers/operatingsystem/operatingsystem_windows.go

Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,45 @@
11
package operatingsystem // import "github.com/docker/docker/pkg/parsers/operatingsystem"
22

33
import (
4-
"unsafe"
4+
"fmt"
55

6-
"golang.org/x/sys/windows"
6+
"golang.org/x/sys/windows/registry"
77
)
88

9-
// See https://code.google.com/p/go/source/browse/src/pkg/mime/type_windows.go?r=d14520ac25bf6940785aabb71f5be453a286f58c
10-
// for a similar sample
11-
129
// GetOperatingSystem gets the name of the current operating system.
1310
func GetOperatingSystem() (string, error) {
1411

15-
var h windows.Handle
16-
1712
// Default return value
1813
ret := "Unknown Operating System"
1914

20-
if err := windows.RegOpenKeyEx(windows.HKEY_LOCAL_MACHINE,
21-
windows.StringToUTF16Ptr(`SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\`),
22-
0,
23-
windows.KEY_READ,
24-
&h); err != nil {
15+
k, err := registry.OpenKey(registry.LOCAL_MACHINE, `SOFTWARE\Microsoft\WIndows NT\CurrentVersion`, registry.QUERY_VALUE)
16+
if err != nil {
17+
return ret, err
18+
}
19+
defer k.Close()
20+
21+
pn, _, err := k.GetStringValue("ProductName")
22+
if err != nil {
23+
return ret, err
24+
}
25+
ret = pn
26+
27+
ri, _, err := k.GetStringValue("ReleaseId")
28+
if err != nil {
29+
return ret, err
30+
}
31+
ret = fmt.Sprintf("%s Version %s", ret, ri)
32+
33+
cbn, _, err := k.GetStringValue("CurrentBuildNumber")
34+
if err != nil {
2535
return ret, err
2636
}
27-
defer windows.RegCloseKey(h)
28-
29-
var buf [1 << 10]uint16
30-
var typ uint32
31-
n := uint32(len(buf) * 2) // api expects array of bytes, not uint16
32-
33-
if err := windows.RegQueryValueEx(h,
34-
windows.StringToUTF16Ptr("ProductName"),
35-
nil,
36-
&typ,
37-
(*byte)(unsafe.Pointer(&buf[0])),
38-
&n); err != nil {
37+
38+
ubr, _, err := k.GetIntegerValue("UBR")
39+
if err != nil {
3940
return ret, err
4041
}
41-
ret = windows.UTF16ToString(buf[:])
42+
ret = fmt.Sprintf("%s (OS Build %s.%d)", ret, cbn, ubr)
4243

4344
return ret, nil
4445
}

0 commit comments

Comments
 (0)