github.com/rita33cool1/iot-system-gateway@v0.0.0-20200911033302-e65bde238cc5/docker-engine/pkg/parsers/kernel/kernel_windows.go (about)

     1  package kernel // import "github.com/docker/docker/pkg/parsers/kernel"
     2  
     3  import (
     4  	"fmt"
     5  	"unsafe"
     6  
     7  	"golang.org/x/sys/windows"
     8  )
     9  
    10  // VersionInfo holds information about the kernel.
    11  type VersionInfo struct {
    12  	kvi   string // Version of the kernel (e.g. 6.1.7601.17592 -> 6)
    13  	major int    // Major part of the kernel version (e.g. 6.1.7601.17592 -> 1)
    14  	minor int    // Minor part of the kernel version (e.g. 6.1.7601.17592 -> 7601)
    15  	build int    // Build number of the kernel version (e.g. 6.1.7601.17592 -> 17592)
    16  }
    17  
    18  func (k *VersionInfo) String() string {
    19  	return fmt.Sprintf("%d.%d %d (%s)", k.major, k.minor, k.build, k.kvi)
    20  }
    21  
    22  // GetKernelVersion gets the current kernel version.
    23  func GetKernelVersion() (*VersionInfo, error) {
    24  
    25  	var (
    26  		h         windows.Handle
    27  		dwVersion uint32
    28  		err       error
    29  	)
    30  
    31  	KVI := &VersionInfo{"Unknown", 0, 0, 0}
    32  
    33  	if err = windows.RegOpenKeyEx(windows.HKEY_LOCAL_MACHINE,
    34  		windows.StringToUTF16Ptr(`SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\`),
    35  		0,
    36  		windows.KEY_READ,
    37  		&h); err != nil {
    38  		return KVI, err
    39  	}
    40  	defer windows.RegCloseKey(h)
    41  
    42  	var buf [1 << 10]uint16
    43  	var typ uint32
    44  	n := uint32(len(buf) * 2) // api expects array of bytes, not uint16
    45  
    46  	if err = windows.RegQueryValueEx(h,
    47  		windows.StringToUTF16Ptr("BuildLabEx"),
    48  		nil,
    49  		&typ,
    50  		(*byte)(unsafe.Pointer(&buf[0])),
    51  		&n); err != nil {
    52  		return KVI, err
    53  	}
    54  
    55  	KVI.kvi = windows.UTF16ToString(buf[:])
    56  
    57  	// Important - docker.exe MUST be manifested for this API to return
    58  	// the correct information.
    59  	if dwVersion, err = windows.GetVersion(); err != nil {
    60  		return KVI, err
    61  	}
    62  
    63  	KVI.major = int(dwVersion & 0xFF)
    64  	KVI.minor = int((dwVersion & 0XFF00) >> 8)
    65  	KVI.build = int((dwVersion & 0xFFFF0000) >> 16)
    66  
    67  	return KVI, nil
    68  }