|
1 | 1 | package operatingsystem // import "github.com/docker/docker/pkg/parsers/operatingsystem" |
2 | 2 |
|
3 | 3 | import ( |
4 | | - "unsafe" |
| 4 | + "fmt" |
5 | 5 |
|
6 | | - "golang.org/x/sys/windows" |
| 6 | + "golang.org/x/sys/windows/registry" |
7 | 7 | ) |
8 | 8 |
|
9 | | -// See https://code.google.com/p/go/source/browse/src/pkg/mime/type_windows.go?r=d14520ac25bf6940785aabb71f5be453a286f58c |
10 | | -// for a similar sample |
11 | | - |
12 | 9 | // GetOperatingSystem gets the name of the current operating system. |
13 | 10 | func GetOperatingSystem() (string, error) { |
14 | 11 |
|
15 | | - var h windows.Handle |
16 | | - |
17 | 12 | // Default return value |
18 | 13 | ret := "Unknown Operating System" |
19 | 14 |
|
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 { |
25 | 35 | return ret, err |
26 | 36 | } |
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 { |
39 | 40 | return ret, err |
40 | 41 | } |
41 | | - ret = windows.UTF16ToString(buf[:]) |
| 42 | + ret = fmt.Sprintf("%s (OS Build %s.%d)", ret, cbn, ubr) |
42 | 43 |
|
43 | 44 | return ret, nil |
44 | 45 | } |
|
0 commit comments