#include "ioapiset.h" #include "context.h" #include "errors.h" #include "overlapped_util.h" #include "synchapi.h" namespace kernel32 { BOOL WIN_FUNC GetOverlappedResult(HANDLE hFile, LPOVERLAPPED lpOverlapped, LPDWORD lpNumberOfBytesTransferred, BOOL bWait) { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetOverlappedResult(%p, %p, %p, %d)\n", hFile, lpOverlapped, lpNumberOfBytesTransferred, bWait); (void)hFile; if (!lpOverlapped) { wibo::lastError = ERROR_INVALID_PARAMETER; return FALSE; } if (bWait && lpOverlapped->Internal == STATUS_PENDING && kernel32::detail::shouldSignalOverlappedEvent(lpOverlapped)) { if (HANDLE waitHandle = kernel32::detail::normalizedOverlappedEventHandle(lpOverlapped)) { WaitForSingleObject(waitHandle, INFINITE); } } const auto status = static_cast(lpOverlapped->Internal); if (status == STATUS_PENDING) { wibo::lastError = ERROR_IO_INCOMPLETE; return FALSE; } if (lpNumberOfBytesTransferred) { *lpNumberOfBytesTransferred = static_cast(lpOverlapped->InternalHigh); } DWORD error = wibo::winErrorFromNtStatus(status); if (error == ERROR_SUCCESS) { return TRUE; } wibo::lastError = error; return FALSE; } } // namespace kernel32