From f49334f85ddcf0f08d7fb6dd7363e9e6d6b777eb Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Wed, 20 Mar 2019 23:14:46 -0600 Subject: [PATCH] windows: add GetOverlappedResult function for async I/O We already have all the structs and constants for async I/O, and the various functions of x/sys/windows take the right parameters. But we're missing the final step of any ordinary async I/O routine: getting the result of overlapped I/O. Without this, the rest of the plumbing supported by this module isn't actually so useful. So add this small oversight. Change-Id: I0ce1a71bce06bc81a83f3b0ca10ad9c4b67af726 Reviewed-on: https://go-review.googlesource.com/c/sys/+/168521 Reviewed-by: Brad Fitzpatrick Reviewed-by: Alex Brainman Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- windows/syscall_windows.go | 1 + windows/zsyscall_windows.go | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/windows/syscall_windows.go b/windows/syscall_windows.go index f72fa55f..7aff0d02 100644 --- a/windows/syscall_windows.go +++ b/windows/syscall_windows.go @@ -137,6 +137,7 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys CreateFile(name *uint16, access uint32, mode uint32, sa *SecurityAttributes, createmode uint32, attrs uint32, templatefile int32) (handle Handle, err error) [failretval==InvalidHandle] = CreateFileW //sys ReadFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error) //sys WriteFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error) +//sys GetOverlappedResult(handle Handle, overlapped *Overlapped, done *uint32, wait bool) (err error) //sys SetFilePointer(handle Handle, lowoffset int32, highoffsetptr *int32, whence uint32) (newlowoffset uint32, err error) [failretval==0xffffffff] //sys CloseHandle(handle Handle) (err error) //sys GetStdHandle(stdhandle uint32) (handle Handle, err error) [failretval==InvalidHandle] diff --git a/windows/zsyscall_windows.go b/windows/zsyscall_windows.go index 75dcd275..eb9f0629 100644 --- a/windows/zsyscall_windows.go +++ b/windows/zsyscall_windows.go @@ -77,6 +77,7 @@ var ( procCreateFileW = modkernel32.NewProc("CreateFileW") procReadFile = modkernel32.NewProc("ReadFile") procWriteFile = modkernel32.NewProc("WriteFile") + procGetOverlappedResult = modkernel32.NewProc("GetOverlappedResult") procSetFilePointer = modkernel32.NewProc("SetFilePointer") procCloseHandle = modkernel32.NewProc("CloseHandle") procGetStdHandle = modkernel32.NewProc("GetStdHandle") @@ -654,6 +655,24 @@ func WriteFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) return } +func GetOverlappedResult(handle Handle, overlapped *Overlapped, done *uint32, wait bool) (err error) { + var _p0 uint32 + if wait { + _p0 = 1 + } else { + _p0 = 0 + } + r1, _, e1 := syscall.Syscall6(procGetOverlappedResult.Addr(), 4, uintptr(handle), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(done)), uintptr(_p0), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + func SetFilePointer(handle Handle, lowoffset int32, highoffsetptr *int32, whence uint32) (newlowoffset uint32, err error) { r0, _, e1 := syscall.Syscall6(procSetFilePointer.Addr(), 4, uintptr(handle), uintptr(lowoffset), uintptr(unsafe.Pointer(highoffsetptr)), uintptr(whence), 0, 0) newlowoffset = uint32(r0)