gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 01:24:43 24 4
gpt4 key购买 nike

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

在 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 上运行?

最佳答案

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

下面的SO问题How to get process handle from process id表示您需要调用 OpenProcess 并传入 pid 并返回句柄。

编辑:GetCurrentProcess 在 syscall 中定义.所以我认为您可以将 Getpid 调用替换为以下内容:

handle, err := syscall.GetCurrentProcess()

关于windows - 确定当前进程是否在 WOW64 中运行或不在 Go 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33790814/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com