确定当前进程是否在 WOW64 中运行或不在 Go 中运行

在 Windows 中,猜测当前 32 位进程是在 32 位还是 64 位架构上运行的官方方法是从 kernel32.dll调用IsWow64Process函数,并查看它是否存在(据我了解文档)。


在 Go 中,我们可以使用syscall包调用在 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 系统进行测试都会在标准输出中显示相同的内容:


&{0x10ada110 IsWow64Process 2088961457}

0 7 The handle is invalid.

0

我做错了什么?如何实现测试以确定我们的 32 位 Go 程序是在 64 位 CPU(WOW64)上的模拟 32 位上运行还是在真正的 32 位 Windows 上运行?


白板的微信
浏览 199回答 3
3回答

杨__羊羊

我相信问题在于您的proc.Call. 的预期参数IsWow64Process是一个 HANDLE,它与pid. 这就是为什么它表明句柄无效。以下 SO 问题How to get process handle from process id表示您需要OpenProcess在 pid 中调用passsing 并返回句柄。编辑: GetCurrentProcess 在syscall 中定义。所以我认为你可以用Getpid以下内容替换通话:handle, err := syscall.GetCurrentProcess()

POPMUISE

好的,这是一个工作代码:package mainimport (    "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位系统真。

DIEA

你也可以使用 golang.org/x/sys/windowspackage mainimport (    "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)}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go