github.com/docker/docker@v299999999.0.0-20200612211812-aaf470eca7b5+incompatible/pkg/parsers/kernel/kernel_windows.go (about)

     1  package kernel // import "github.com/docker/docker/pkg/parsers/kernel"
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"golang.org/x/sys/windows"
     7  	"golang.org/x/sys/windows/registry"
     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  	KVI := &VersionInfo{"Unknown", 0, 0, 0}
    26  
    27  	k, err := registry.OpenKey(registry.LOCAL_MACHINE, `SOFTWARE\Microsoft\Windows NT\CurrentVersion`, registry.QUERY_VALUE)
    28  	if err != nil {
    29  		return KVI, err
    30  	}
    31  	defer k.Close()
    32  
    33  	blex, _, err := k.GetStringValue("BuildLabEx")
    34  	if err != nil {
    35  		return KVI, err
    36  	}
    37  	KVI.kvi = blex
    38  
    39  	// Important - dockerd.exe MUST be manifested for this API to return
    40  	// the correct information.
    41  	dwVersion, err := windows.GetVersion()
    42  	if err != nil {
    43  		return KVI, err
    44  	}
    45  
    46  	KVI.major = int(dwVersion & 0xFF)
    47  	KVI.minor = int((dwVersion & 0xFF00) >> 8)
    48  	KVI.build = int((dwVersion & 0xFFFF0000) >> 16)
    49  
    50  	return KVI, nil
    51  }