github.com/rish1988/moby@v25.0.2+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  	KVI := &VersionInfo{"Unknown", 0, 0, 0}
    25  
    26  	k, err := registry.OpenKey(registry.LOCAL_MACHINE, `SOFTWARE\Microsoft\Windows NT\CurrentVersion`, registry.QUERY_VALUE)
    27  	if err != nil {
    28  		return KVI, err
    29  	}
    30  	defer k.Close()
    31  
    32  	blex, _, err := k.GetStringValue("BuildLabEx")
    33  	if err != nil {
    34  		return KVI, err
    35  	}
    36  	KVI.kvi = blex
    37  
    38  	// Important - dockerd.exe MUST be manifested for this API to return
    39  	// the correct information.
    40  	dwVersion, err := windows.GetVersion()
    41  	if err != nil {
    42  		return KVI, err
    43  	}
    44  
    45  	KVI.major = int(dwVersion & 0xFF)
    46  	KVI.minor = int((dwVersion & 0xFF00) >> 8)
    47  	KVI.build = int((dwVersion & 0xFFFF0000) >> 16)
    48  
    49  	return KVI, nil
    50  }