github.com/hauerwu/docker@v1.8.0-rc1/pkg/parsers/kernel/kernel_windows.go (about)

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