github.com/Prakhar-Agarwal-byte/moby@v0.0.0-20231027092010-a14e3e8ab87e/pkg/platform/platform_windows.go (about)

     1  package platform // import "github.com/Prakhar-Agarwal-byte/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 https://learn.microsoft.com/en-gb/windows/win32/api/sysinfoapi/ns-sysinfoapi-system_info
    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  // Windows processor architectures.
    32  //
    33  // see https://github.com/microsoft/go-winio/blob/v0.6.0/wim/wim.go#L48-L65
    34  // see https://learn.microsoft.com/en-gb/windows/win32/api/sysinfoapi/ns-sysinfoapi-system_info
    35  const (
    36  	processorArchitecture64    = 9  // PROCESSOR_ARCHITECTURE_AMD64
    37  	processorArchitectureIA64  = 6  // PROCESSOR_ARCHITECTURE_IA64
    38  	processorArchitecture32    = 0  // PROCESSOR_ARCHITECTURE_INTEL
    39  	processorArchitectureArm   = 5  // PROCESSOR_ARCHITECTURE_ARM
    40  	processorArchitectureArm64 = 12 // PROCESSOR_ARCHITECTURE_ARM64
    41  )
    42  
    43  // runtimeArchitecture gets the name of the current architecture (x86, x86_64, …)
    44  func runtimeArchitecture() (string, error) {
    45  	// TODO(thaJeztah): rewrite this to use "GetNativeSystemInfo" instead.
    46  	// See: https://learn.microsoft.com/en-us/windows/win32/api/sysinfoapi/nf-sysinfoapi-getsysteminfo
    47  	// See: https://github.com/shirou/gopsutil/blob/v3.23.3/host/host_windows.go#L267-L297
    48  	// > To retrieve accurate information for an application running on WOW64,
    49  	// > call the GetNativeSystemInfo function.
    50  	var sysinfo systeminfo
    51  	_, _, _ = syscall.SyscallN(procGetSystemInfo.Addr(), uintptr(unsafe.Pointer(&sysinfo)))
    52  	switch sysinfo.wProcessorArchitecture {
    53  	case processorArchitecture64, processorArchitectureIA64:
    54  		return "x86_64", nil
    55  	case processorArchitecture32:
    56  		return "i686", nil
    57  	case processorArchitectureArm:
    58  		return "arm", nil
    59  	case processorArchitectureArm64:
    60  		return "arm64", nil
    61  	default:
    62  		return "", fmt.Errorf("unknown processor architecture %+v", sysinfo.wProcessorArchitecture)
    63  	}
    64  }
    65  
    66  // NumProcs returns the number of processors on the system
    67  func NumProcs() uint32 {
    68  	var sysinfo systeminfo
    69  	_, _, _ = syscall.SyscallN(procGetSystemInfo.Addr(), uintptr(unsafe.Pointer(&sysinfo)))
    70  	return sysinfo.dwNumberOfProcessors
    71  }