我正在尝试学习如何在 Go 中使用一些 Windows API 调用,特别是一些较低级别的、未记录的函数。我在这里关注一个 C++ 示例并尝试跟随 Go。下面是我正在尝试做的输出和精简示例:
c0000005:操作成功完成。
package main
import (
"fmt"
"golang.org/x/sys/windows"
)
// Why are these not defined in the windows pkg?!
const SEC_COMMIT = 0x08000000
const SECTION_WRITE = 0x2
const SECTION_READ = 0x4
const SECTION_EXECUTE = 0x8
const SECTION_RWX = SECTION_WRITE | SECTION_READ | SECTION_EXECUTE
func createSection() error {
var e error
var err uintptr
var ntdll *windows.LazyDLL
var section uintptr
// Load DLL
ntdll = windows.NewLazySystemDLL("ntdll")
// FIXME Allocate section
err, _, e = ntdll.NewProc("NtCreateSection").Call(
section,
SECTION_RWX,
0,
uintptr(512),
windows.PAGE_EXECUTE_READWRITE,
SEC_COMMIT,
0,
)
if err != 0 {
return fmt.Errorf("%0x: %s", uint32(err), e.Error())
} else if section == 0 {
return fmt.Errorf("NtCreateSection failed for unknown reason")
}
fmt.Printf("%0x\n", section)
return nil
}
func main() {
var e error
if e = createSection(); e != nil {
fmt.Println(e.Error())
}
}
据我所知,c0000005这是一个Access Violation错误。C++ 中的相同代码似乎可以工作(参见链接博客中的第 25 行),但是数据类型略有不同。可能我使用var section uintptr不当。C++ 使用对 a 的引用HANDLE,我认为它也称为PHANDLE. 围棋似乎改为使用uintptr。任何帮助将不胜感激!
沧海一幻觉
相关分类