首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >确定当前进程是否在WOW64中运行

确定当前进程是否在WOW64中运行
EN

Stack Overflow用户
提问于 2015-11-18 21:32:28
回答 3查看 968关注 0票数 3

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

在Go中,我们可以用赛瑟尔包调用dll文件中导出的函数,下面是我的尝试:

代码语言:javascript
复制
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中显示相同的结果:

代码语言:javascript
复制
&{0x10ada110 IsWow64Process 2088961457}
0 7 The handle is invalid.
0

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-11-18 21:50:34

我认为问题在于您的proc.Call上的句柄参数。IsWow64Process的预期参数是一个句柄,它与pid不一样。这就是为什么它指示句柄无效的原因。

下面的问题如何从进程id获取进程句柄表明您需要在pid中调用OpenProcess,并且它返回句柄。

编辑: GetCurrentProcess是用赛瑟尔定义的。因此,我认为您可以将Getpid调用替换为以下内容:

代码语言:javascript
复制
handle, err := syscall.GetCurrentProcess()
票数 4
EN

Stack Overflow用户

发布于 2015-11-19 12:04:43

好的,下面是一个工作代码:

代码语言:javascript
复制
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。

票数 3
EN

Stack Overflow用户

发布于 2020-12-13 07:02:08

您也可以使用golang.org/x/sys/windows

代码语言:javascript
复制
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)
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33790814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档