#pragma once #include "errors.h" #include "handles.h" #include "internal.h" #include "minwinbase.h" #include namespace kernel32::detail { inline HANDLE normalizedOverlappedEventHandle(const OVERLAPPED *ov) { if (!ov || (reinterpret_cast(ov->hEvent) & 1U) != 0) { return nullptr; } return ov->hEvent; } inline void signalOverlappedEvent(FileObject *file, OVERLAPPED *ov, NTSTATUS status, size_t bytesTransferred) { if (ov) { ov->Internal = status; ov->InternalHigh = static_cast(bytesTransferred); } if (HANDLE handle = normalizedOverlappedEventHandle(ov)) { if (auto ev = wibo::handles().getAs(handle)) { ev->set(); } } if (file) { file->overlappedCv.notify_all(); } } inline void resetOverlappedEvent(OVERLAPPED *ov) { if (HANDLE handle = normalizedOverlappedEventHandle(ov)) { if (auto ev = wibo::handles().getAs(handle)) { ev->reset(); } } } } // namespace kernel32::detail