Set an overlapped hEvent before calling any APCs.
diff --git a/files/file.c b/files/file.c
index c108857..fb28a9a 100644
--- a/files/file.c
+++ b/files/file.c
@@ -1370,7 +1370,8 @@
*/
static BOOL FILE_ReadFileEx(HANDLE hFile, LPVOID buffer, DWORD bytesToRead,
LPOVERLAPPED overlapped,
- LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
+ LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
+ HANDLE hEvent)
{
async_private *ovp;
int fd;
@@ -1400,6 +1401,7 @@
close(fd);
return FALSE;
}
+ ovp->event = hEvent;
ovp->lpOverlapped = overlapped;
ovp->count = bytesToRead;
ovp->completion_func = lpCompletionRoutine;
@@ -1435,12 +1437,7 @@
{
overlapped->Internal = STATUS_PENDING;
overlapped->InternalHigh = 0;
- return FILE_ReadFileEx(hFile,buffer,bytesToRead,overlapped,lpCompletionRoutine);
-}
-
-static VOID CALLBACK FILE_OverlappedComplete(DWORD status, DWORD count, LPOVERLAPPED ov)
-{
- NtSetEvent(ov->hEvent,NULL);
+ return FILE_ReadFileEx(hFile,buffer,bytesToRead,overlapped,lpCompletionRoutine, INVALID_HANDLE_VALUE);
}
static BOOL FILE_TimeoutRead(HANDLE hFile, LPVOID buffer, DWORD bytesToRead, LPDWORD bytesRead)
@@ -1453,7 +1450,7 @@
ZeroMemory(&ov, sizeof (OVERLAPPED));
if(STATUS_SUCCESS==NtCreateEvent(&ov.hEvent, SYNCHRONIZE, NULL, 0, 0))
{
- if(ReadFileEx(hFile, buffer, bytesToRead, &ov, FILE_OverlappedComplete))
+ if(FILE_ReadFileEx(hFile, buffer, bytesToRead, &ov, NULL, ov.hEvent))
{
r = GetOverlappedResult(hFile, &ov, bytesRead, TRUE);
}
@@ -1520,7 +1517,7 @@
overlapped->Internal = STATUS_PENDING;
overlapped->InternalHigh = result;
- if(!FILE_ReadFileEx(hFile, buffer, bytesToRead, overlapped, FILE_OverlappedComplete))
+ if(!FILE_ReadFileEx(hFile, buffer, bytesToRead, overlapped, NULL, overlapped->hEvent))
return FALSE;
/* fail on return, with ERROR_IO_PENDING */
@@ -1617,7 +1614,8 @@
*/
static BOOL FILE_WriteFileEx(HANDLE hFile, LPCVOID buffer, DWORD bytesToWrite,
LPOVERLAPPED overlapped,
- LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
+ LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
+ HANDLE hEvent)
{
async_private *ovp;
@@ -1647,6 +1645,7 @@
return FALSE;
}
ovp->lpOverlapped = overlapped;
+ ovp->event = hEvent;
ovp->func = FILE_AsyncWriteService;
ovp->buffer = (LPVOID) buffer;
ovp->count = bytesToWrite;
@@ -1681,7 +1680,7 @@
overlapped->Internal = STATUS_PENDING;
overlapped->InternalHigh = 0;
- return FILE_WriteFileEx(hFile, buffer, bytesToWrite, overlapped, lpCompletionRoutine);
+ return FILE_WriteFileEx(hFile, buffer, bytesToWrite, overlapped, lpCompletionRoutine, INVALID_HANDLE_VALUE);
}
/***********************************************************************
@@ -1744,7 +1743,7 @@
overlapped->Internal = STATUS_PENDING;
overlapped->InternalHigh = result;
- if(!FILE_WriteFileEx(hFile, buffer, bytesToWrite, overlapped, FILE_OverlappedComplete))
+ if(!FILE_WriteFileEx(hFile, buffer, bytesToWrite, overlapped, NULL, overlapped->hEvent))
return FALSE;
/* fail on return, with ERROR_IO_PENDING */