Skip to content

Commit

Permalink
fix: add win7 compat for GetOverlappedResults
Browse files Browse the repository at this point in the history
  • Loading branch information
connorjclark committed Jul 31, 2023
1 parent 0456127 commit 8a0699e
Showing 1 changed file with 45 additions and 6 deletions.
51 changes: 45 additions & 6 deletions src/base/process_management.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -97,33 +97,72 @@ bool io_manager::ProcessReadFile(HANDLE read_handle, LPVOID buf, DWORD bytes_to_
memset(&ov, 0, sizeof(OVERLAPPED));

callback_error = false;

typedef BOOL (WINAPI *GetOverlappedResultExPROC)(HANDLE, LPOVERLAPPED, LPDWORD, DWORD, BOOL);
HMODULE kernel32 = LoadLibraryW(L"kernel32");
GetOverlappedResultExPROC imp_GetOverlappedResultEx =
(GetOverlappedResultExPROC) GetProcAddress(kernel32, "GetOverlappedResultEx");

// Windows 7 compat: GetOverlappedResultEx was added in Windows 8.
if (!kernel32 || kernel32 == INVALID_HANDLE_VALUE)
{
DWORD num_read = 0;
// if(!ReadFile(read_handle, buf, bytes_to_read, &num_read, p_ov))
if(!ReadFile(read_handle, buf, bytes_to_read, NULL, NULL))
{
zprint2("READ FAILURE: %d\n",GetLastError());
return false;
}

while(!GetOverlappedResult(read_handle, p_ov, bytes_read, true))
{
if(!is_alive())
throw zc_io_exception::dead();
auto error = GetLastError();
switch(error)
{
case WAIT_IO_COMPLETION:
case ERROR_IO_INCOMPLETE:
continue;
default:
throw zc_io_exception::unknown();
}
}

return !callback_error;
}

if(!ReadFileEx(read_handle, buf, bytes_to_read, p_ov, callback))
if (!ReadFileEx(read_handle, buf, bytes_to_read, p_ov, callback))
{
zprint2("READ FAILURE: %d\n",GetLastError());
return false;
}

int waitcount = 0;
while(!GetOverlappedResultEx(read_handle, p_ov, bytes_read, 30000, true))

while (!imp_GetOverlappedResultEx(read_handle, p_ov, bytes_read, 30000, true))
{
if(!is_alive())
if (!is_alive())
{
FreeLibrary(kernel32);
throw zc_io_exception::dead();
}
auto error = GetLastError();
switch(error)
{
case WAIT_TIMEOUT:
{
FreeLibrary(kernel32);
throw zc_io_exception::timeout();
}
case WAIT_IO_COMPLETION:
case ERROR_IO_INCOMPLETE:
continue;
default:
FreeLibrary(kernel32);
throw zc_io_exception::unknown();
}
}


FreeLibrary(kernel32);
return !callback_error;
}
bool io_manager::ProcessWriteFile(HANDLE write_handle, LPVOID buf, DWORD bytes_to_write, LPDWORD bytes_written)
Expand Down

0 comments on commit 8a0699e

Please sign in to comment.