为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
白板的微信 2021-11-22 18:13:32
在 Windows 中,猜测当前 32 位进程是在 32 位还是 64 位架构上运行的官方方法是从 kernel32.dll调用IsWow64Process函数,并查看它是否存在(据我了解文档)。在 Go 中,我们可以使用syscall包调用在 dll 文件中导出的函数,所以这是我的尝试:package mainimport (    "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 上运行?
查看完整描述

3 回答

?
杨__羊羊

TA贡献1943条经验 获得超7个赞

我相信问题在于您的proc.Call. 的预期参数IsWow64Process是一个 HANDLE,它与pid. 这就是为什么它表明句柄无效。

以下 SO 问题How to get process handle from process id表示您需要OpenProcess在 pid 中调用passsing 并返回句柄。

编辑: GetCurrentProcess 在syscall 中定义。所以我认为你可以用Getpid以下内容替换通话:

handle, err := syscall.GetCurrentProcess()


查看完整回答
反对 回复 2021-11-22
?
POPMUISE

TA贡献1765条经验 获得超5个赞

好的,这是一个工作代码:


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位系统真。


查看完整回答
反对 回复 2021-11-22
?
DIEA

TA贡献1820条经验 获得超2个赞

你也可以使用 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)

}


查看完整回答
反对 回复 2021-11-22
  • 3 回答
  • 0 关注
  • 198 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信