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 }