From de339f3021329edc55da2075031ae444c70d5724 Mon Sep 17 00:00:00 2001 From: Mike McCormack Date: Mon, 7 Jan 2002 18:06:59 +0000 Subject: [PATCH] Implement CancelIo properly. --- files/file.c | 18 +++++++++++++++++- include/file.h | 1 + scheduler/synchro.c | 2 +- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/files/file.c b/files/file.c index 6ce32f96f2d..ad0ee1c7775 100644 --- a/files/file.c +++ b/files/file.c @@ -1275,7 +1275,23 @@ BOOL FILE_StartAsync(HANDLE hFile, LPOVERLAPPED lpOverlapped, DWORD type, DWORD */ BOOL WINAPI CancelIo(HANDLE handle) { - return FILE_StartAsync(handle, NULL, ASYNC_TYPE_NONE, 0, STATUS_CANCELLED); + async_private *ovp,*t; + + TRACE("handle = %x\n",handle); + + ovp = NtCurrentTeb()->pending_list; + while(ovp) + { + t = ovp->next; + if(FILE_StartAsync(handle, ovp->lpOverlapped, ovp->type, 0, STATUS_CANCELLED)) + { + TRACE("overlapped = %p\n",ovp->lpOverlapped); + finish_async(ovp, STATUS_CANCELLED); + } + ovp = t; + } + WaitForMultipleObjectsEx(0,NULL,FALSE,1,TRUE); + return TRUE; } /*********************************************************************** diff --git a/include/file.h b/include/file.h index e9dc4185a2a..45a37d92ef1 100644 --- a/include/file.h +++ b/include/file.h @@ -49,6 +49,7 @@ typedef struct async_private } async_private; extern void WINAPI check_async_list(LPOVERLAPPED ov, DWORD status); +extern void finish_async(struct async_private *ovp, DWORD status); /* locale-independent case conversion */ inline static char FILE_tolower( char c ) diff --git a/scheduler/synchro.c b/scheduler/synchro.c index e862737bbb2..5446ce283fc 100644 --- a/scheduler/synchro.c +++ b/scheduler/synchro.c @@ -47,7 +47,7 @@ static void CALLBACK call_completion_routine(ULONG_PTR data) HeapFree(GetProcessHeap(), 0, ovp); } -static void finish_async(async_private *ovp, DWORD status) +void finish_async(async_private *ovp, DWORD status) { ovp->lpOverlapped->Internal=status;