gpt4 book ai didi

windows - 在Golang的syscall程序包中为Windows特定系统调用定义syscall.Syscall()的方式和位置?

转载 作者:行者123 更新时间:2023-12-01 22:25:44 28 4
gpt4 key购买 nike

我试图了解Golangs syscall软件包的一些底层细节。特别是,我对特定于Windows的系统调用感兴趣(请参见下面的示例)。

我可以找到基于UNIX的系统的syscall.Syscall()的定义:

  • https://golang.org/src/syscall/syscall_unix.go?s=496:562#L18
  • https://golang.org/src/syscall/asm_unix_amd64.s

  • 但是,我找不到基于Windows的系统的任何此类定义,例如 asm_windows_amd64.s

    特别是, asm_unix_amd64.s具有以下build指令,因此其 ·Syscall(SB),NOSPLIT,$0-56定义不能是Windows系统调用所要求的:
     1// +build netbsd freebsd openbsd dragonfly

    对于基于Windows的系统, syscall.Syscall()在哪里定义?

    示例:
    https://godoc.org/golang.org/x/sys/windows#example-LoadLibrary
    h, err := windows.LoadLibrary("kernel32.dll")
    if err != nil {
    abort("LoadLibrary", err)
    }
    defer windows.FreeLibrary(h)
    proc, err := windows.GetProcAddress(h, "GetVersion")
    if err != nil {
    abort("GetProcAddress", err)
    }
    r, _, _ := syscall.Syscall(uintptr(proc), 0, 0, 0, 0)
    major := byte(r)
    minor := uint8(r >> 8)
    build := uint16(r >> 16)
    print("windows version ", major, ".", minor, " (Build ", build, ")\n")

    最佳答案

    我没有或没有使用Windows,但是一些与源代码一起工作的grep发现了这一点:

    syscall.Syscall 中定义了

  • syscall.Syscall6runtime/syscall_windows.go等。例如,从第179行开始(当前):
    //go:linkname syscall_Syscall syscall.Syscall
    //go:nosplit
    func syscall_Syscall(fn, nargs, a1, a2, a3 uintptr) (r1, r2, err uintptr) {
    lockOSThread()
    defer unlockOSThread()
    c := &getg().m.syscall
    c.fn = fn
    c.n = nargs
    c.args = uintptr(noescape(unsafe.Pointer(&a1)))
    cgocall(asmstdcallAddr, unsafe.Pointer(c))
    return c.r1, c.r2, c.err

    }
    go:linkname是使此函数命名为syscall.Syscall的魔力,即使在此处将其命名为runtime.syscall_Syscall
  • 这些文件使用较早加载的DLL来弄清楚如何真正进行系统调用。 (这就是c.fn的意思。)要调用DLL,Go运行时必须锁定线程(请参阅前两个调用),并使用cgocall调用DLL。此外,使用getc().m.syscall获得的结构需要特殊的技巧来传递参数。
  • 启动加载似乎是通过 runtime/os_windows.go 进行的。请注意,_GetProcAddress(和其他功能)由Windows加载程序填充,这允许引导。
  • 关于windows - 在Golang的syscall程序包中为Windows特定系统调用定义syscall.Syscall()的方式和位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60034725/

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