В Windows официальный способ угадать, работает ли текущий 32-разрядный процесс на 32- или 64-разрядной архитектуре (то есть на WOW64 или нет), - это вызвать IsWow64Process из kernel32.dll и посмотрите, присутствует ли она (как я понимаю документ).
В Go мы можем вызывать функции, экспортированные в файлы dll, с помощью пакета syscall, поэтому вот моя попытка:
package main
import (
"fmt"
"os"
"syscall"
)
func main() {
dll, err := syscall.LoadDLL("kernel32.dll")
if err != nil {
fmt.Println(err)
}
defer dll.Release()
proc, err := dll.FindProc("IsWow64Process")
if err != nil {
fmt.Println("Proc not found") // not a WOW64 so a 32 bit system?
fmt.Println(err)
}
fmt.Printf("%v\n", proc)
var handle uintptr = uintptr(os.Getpid())
var result uintptr
v, x, y := proc.Call(handle, result)
fmt.Printf("%v %v %v\n", v, x, y)
fmt.Printf("%v\n", result)
}
К сожалению, тестирование с системой WOW64 или без нее отображает то же самое в стандартном выводе:
&{0x10ada110 IsWow64Process 2088961457}
0 7 The handle is invalid.
0
Что я делаю не так? Как провести тест, чтобы определить, работает ли наша 32-битная программа Go на эмулируемой 32-битной на 64-битном процессоре (WOW64) или на реальной 32-битной Windows?
kernel32!GetNativeSystemInfo()и осмотрите возвращаемую архитектуру. Значение будет одинаковым независимо от того, запускаете ли вы 32-битный процесс Go в 32-битной ОС или 64-битный процесс Go в 64-битной ОС или 32-битный процесс Go в 64-битной ОС. - person kostix   schedule 19.11.2015