在Windows中,官方猜测当前32位进程是否运行在32位或64位架构(在WOW64上是否如此)的官方方法是从kernel32.dll调用IsWow64Process函数,并查看它是否存在(如我所理解的文档)。
在Go中,我们可以用赛瑟尔包调用dll文件中导出的函数,下面是我的尝试:
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系统的测试在stdout中显示相同的结果:
&{0x10ada110 IsWow64Process 2088961457}
0 7 The handle is invalid.
0我做错什么了?如何实现测试以确定我们的32位Go程序是在64位CPU (WOW64)上的模拟32位上运行,还是在真正的32位Windows上运行?
发布于 2015-11-18 21:50:34
我认为问题在于您的proc.Call上的句柄参数。IsWow64Process的预期参数是一个句柄,它与pid不一样。这就是为什么它指示句柄无效的原因。
下面的问题如何从进程id获取进程句柄表明您需要在pid中调用OpenProcess,并且它返回句柄。
编辑: GetCurrentProcess是用赛瑟尔定义的。因此,我认为您可以将Getpid调用替换为以下内容:
handle, err := syscall.GetCurrentProcess()发布于 2015-11-19 12:04:43
好的,下面是一个工作代码:
package main
import (
"syscall"
"fmt"
"unsafe"
)
func main() {
dll, err := syscall.LoadDLL("kernel32.dll")
if err != nil {
fmt.Println("Can't load kernel32")
fmt.Println(err)
}
defer dll.Release()
proc, err := dll.FindProc("IsWow64Process")
if err != nil {
fmt.Println("Proc not found")
fmt.Println(err)
}
fmt.Printf("%v\n",proc)
handle, err := syscall.GetCurrentProcess()
if err != nil {
fmt.Println("Handle not found")
fmt.Println(err)
}
fmt.Printf("%v\n",handle)
var result bool
v, x, y := proc.Call(uintptr(handle), uintptr(unsafe.Pointer(&result)))
fmt.Printf("%v %v %v\n",v,x,y)
fmt.Printf("%v\n",result)
}result变量对于WOW64系统为真,对于32位系统为false。
发布于 2020-12-13 07:02:08
您也可以使用golang.org/x/sys/windows
package main
import (
"fmt"
"golang.org/x/sys/windows"
)
func main() {
handle := windows.CurrentProcess()
var isWow64 bool
err := windows.IsWow64Process(handle, &isWow64)
if err != nil {
panic(err)
}
fmt.Println(isWow64)
}https://stackoverflow.com/questions/33790814
复制相似问题