architecture_windows.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. package platform
  2. import (
  3. "fmt"
  4. "syscall"
  5. "unsafe"
  6. )
  7. var (
  8. modkernel32 = syscall.NewLazyDLL("kernel32.dll")
  9. procGetSystemInfo = modkernel32.NewProc("GetSystemInfo")
  10. )
  11. // see http://msdn.microsoft.com/en-us/library/windows/desktop/ms724958(v=vs.85).aspx
  12. type systeminfo struct {
  13. wProcessorArchitecture uint16
  14. wReserved uint16
  15. dwPageSize uint32
  16. lpMinimumApplicationAddress uintptr
  17. lpMaximumApplicationAddress uintptr
  18. dwActiveProcessorMask uintptr
  19. dwNumberOfProcessors uint32
  20. dwProcessorType uint32
  21. dwAllocationGranularity uint32
  22. wProcessorLevel uint16
  23. wProcessorRevision uint16
  24. }
  25. // Constants
  26. const (
  27. ProcessorArchitecture64 = 9 // PROCESSOR_ARCHITECTURE_AMD64
  28. ProcessorArchitectureIA64 = 6 // PROCESSOR_ARCHITECTURE_IA64
  29. ProcessorArchitecture32 = 0 // PROCESSOR_ARCHITECTURE_INTEL
  30. ProcessorArchitectureArm = 5 // PROCESSOR_ARCHITECTURE_ARM
  31. )
  32. var sysinfo systeminfo
  33. // GetRuntimeArchitecture get the name of the current architecture (x86, x86_64, …)
  34. func GetRuntimeArchitecture() (string, error) {
  35. syscall.Syscall(procGetSystemInfo.Addr(), 1, uintptr(unsafe.Pointer(&sysinfo)), 0, 0)
  36. switch sysinfo.wProcessorArchitecture {
  37. case ProcessorArchitecture64, ProcessorArchitectureIA64:
  38. return "x86_64", nil
  39. case ProcessorArchitecture32:
  40. return "i686", nil
  41. case ProcessorArchitectureArm:
  42. return "arm", nil
  43. default:
  44. return "", fmt.Errorf("Unknown processor architecture")
  45. }
  46. }