github.com/demonoid81/moby@v0.0.0-20200517203328-62dd8e17c460/pkg/platform/architecture_windows.go (about)

     1  package platform // import "github.com/demonoid81/moby/pkg/platform"
     2  
     3  import (
     4  	"fmt"
     5  	"syscall"
     6  	"unsafe"
     7  
     8  	"golang.org/x/sys/windows"
     9  )
    10  
    11  var (
    12  	modkernel32       = windows.NewLazySystemDLL("kernel32.dll")
    13  	procGetSystemInfo = modkernel32.NewProc("GetSystemInfo")
    14  )
    15  
    16  // see http://msdn.microsoft.com/en-us/library/windows/desktop/ms724958(v=vs.85).aspx
    17  type systeminfo struct {
    18  	wProcessorArchitecture      uint16
    19  	wReserved                   uint16
    20  	dwPageSize                  uint32
    21  	lpMinimumApplicationAddress uintptr
    22  	lpMaximumApplicationAddress uintptr
    23  	dwActiveProcessorMask       uintptr
    24  	dwNumberOfProcessors        uint32
    25  	dwProcessorType             uint32
    26  	dwAllocationGranularity     uint32
    27  	wProcessorLevel             uint16
    28  	wProcessorRevision          uint16
    29  }
    30  
    31  // Constants
    32  const (
    33  	ProcessorArchitecture64   = 9 // PROCESSOR_ARCHITECTURE_AMD64
    34  	ProcessorArchitectureIA64 = 6 // PROCESSOR_ARCHITECTURE_IA64
    35  	ProcessorArchitecture32   = 0 // PROCESSOR_ARCHITECTURE_INTEL
    36  	ProcessorArchitectureArm  = 5 // PROCESSOR_ARCHITECTURE_ARM
    37  )
    38  
    39  // runtimeArchitecture gets the name of the current architecture (x86, x86_64, …)
    40  func runtimeArchitecture() (string, error) {
    41  	var sysinfo systeminfo
    42  	syscall.Syscall(procGetSystemInfo.Addr(), 1, uintptr(unsafe.Pointer(&sysinfo)), 0, 0)
    43  	switch sysinfo.wProcessorArchitecture {
    44  	case ProcessorArchitecture64, ProcessorArchitectureIA64:
    45  		return "x86_64", nil
    46  	case ProcessorArchitecture32:
    47  		return "i686", nil
    48  	case ProcessorArchitectureArm:
    49  		return "arm", nil
    50  	default:
    51  		return "", fmt.Errorf("Unknown processor architecture")
    52  	}
    53  }
    54  
    55  // NumProcs returns the number of processors on the system
    56  func NumProcs() uint32 {
    57  	var sysinfo systeminfo
    58  	syscall.Syscall(procGetSystemInfo.Addr(), 1, uintptr(unsafe.Pointer(&sysinfo)), 0, 0)
    59  	return sysinfo.dwNumberOfProcessors
    60  }