This commit is contained in:
Xie Jingyi 2025-07-20 01:26:45 +08:00 committed by GitHub
commit 344dba44be
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 7 additions and 10 deletions

View file

@ -68,7 +68,7 @@ static textwindows ssize_t ntspawn_read(intptr_t fh, char *buf, size_t len) {
uint32_t got;
struct NtOverlapped overlap = {.hEvent = CreateEvent(0, 0, 0, 0)};
ok = overlap.hEvent &&
(ReadFile(fh, buf, len, 0, &overlap) ||
(ReadFile(fh, buf, len, &got, &overlap) ||
GetLastError() == kNtErrorIoPending) &&
GetOverlappedResult(fh, &overlap, &got, true);
if (overlap.hEvent)

View file

@ -93,7 +93,8 @@ sys_readwrite_nt(int fd, void *data, size_t size, ssize_t offset,
// initiate asynchronous i/o operation with win32
struct NtOverlapped overlap = {.hEvent = event, .Pointer = offset};
bool32 ok = ReadOrWriteFile(handle, data, size, 0, &overlap);
uint32_t exchanged = 0;
bool32 ok = ReadOrWriteFile(handle, data, size, &exchanged, &overlap);
if (!ok && GetLastError() == kNtErrorIoPending) {
if (f->flags & _O_NONBLOCK) {
// immediately back out of blocking i/o if non-blocking
@ -135,11 +136,8 @@ sys_readwrite_nt(int fd, void *data, size_t size, ssize_t offset,
CancelIoEx(handle, &overlap);
}
}
ok = true;
}
uint32_t exchanged = 0;
if (ok)
ok = GetOverlappedResult(handle, &overlap, &exchanged, true);
}
uint32_t io_error = GetLastError();
CloseHandle(event);

View file

@ -81,7 +81,7 @@ textwindows int IsWindowsExecutable(int64_t handle, const char16_t *path) {
BLOCK_SIGNALS;
struct NtOverlapped overlap = {.hEvent = CreateEvent(0, 0, 0, 0)};
ok = overlap.hEvent &&
(ReadFile(handle, buf, 2, 0, &overlap) ||
(ReadFile(handle, buf, 2, &got, &overlap) ||
GetLastError() == kNtErrorIoPending) &&
GetOverlappedResult(handle, &overlap, &got, true);
CloseHandle(overlap.hEvent);

View file

@ -362,8 +362,7 @@ ABI void klog(const char *b, size_t n) {
struct NtOverlapped overlap = {.hEvent = ev};
ok = !!__imp_WriteFile(h, b, n, 0, &overlap);
if (!ok && __imp_GetLastError() == kNtErrorIoPending)
ok = true;
ok &= !!__imp_GetOverlappedResult(h, &overlap, &wrote, true);
ok = !!__imp_GetOverlappedResult(h, &overlap, &wrote, true);
if (!ok)
__klog_handle = 0;
__imp_CloseHandle(ev);

View file

@ -147,7 +147,7 @@ abi static void DeduplicateStdioHandles(void) {
int64_t h2 = __imp_GetStdHandle(kNtStdio[j]);
if (h1 == h2) {
int64_t h3;
__imp_DuplicateHandle(-1, h2, -1, &h3, 0, false,
__imp_DuplicateHandle(-1, h2, -1, &h3, 0, true,
kNtDuplicateSameAccess);
__imp_SetStdHandle(kNtStdio[j], h3);
}