From f5639215be841bfba0df050771d3d7f1baacd031 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Sun, 26 Dec 2004 15:36:23 +0000 Subject: [PATCH] Implement IoSetIoCompletion() svn path=/trunk/; revision=12343 --- reactos/ntoskrnl/io/iocomp.c | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/reactos/ntoskrnl/io/iocomp.c b/reactos/ntoskrnl/io/iocomp.c index 912dd4f23a7..deb9b3453ff 100644 --- a/reactos/ntoskrnl/io/iocomp.c +++ b/reactos/ntoskrnl/io/iocomp.c @@ -82,7 +82,7 @@ IoSetCompletionRoutineEx( } /* - * @unimplemented + * @implemented */ NTSTATUS STDCALL @@ -95,8 +95,23 @@ IoSetIoCompletion ( IN BOOLEAN Quota ) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + PKQUEUE Queue = (PKQUEUE) IoCompletion; + PIO_COMPLETION_PACKET Packet; + + Packet = ExAllocateFromNPagedLookasideList(&IoCompletionPacketLookaside); + if (NULL == Packet) + { + return STATUS_NO_MEMORY; + } + + Packet->Key = KeyContext; + Packet->Context = ApcContext; + Packet->IoStatus.Status = IoStatus; + Packet->IoStatus.Information = IoStatusInformation; + + KeInsertQueue(Queue, &Packet->ListEntry); + + return STATUS_SUCCESS; } VOID @@ -282,7 +297,7 @@ NtRemoveIoCompletion( NTSTATUS Status; PIO_COMPLETION_PACKET Packet; PLIST_ENTRY ListEntry; - + Status = ObReferenceObjectByHandle( IoCompletionHandle, IO_COMPLETION_MODIFY_STATE, ExIoCompletionType, @@ -366,16 +381,8 @@ NtSetIoCompletion( NULL); if (NT_SUCCESS(Status)) { - PIO_COMPLETION_PACKET Packet; - - Packet = ExAllocateFromNPagedLookasideList(&IoCompletionPacketLookaside); - - Packet->Key = CompletionKey; - Packet->Context = CompletionContext; - Packet->IoStatus.Status = CompletionStatus; - Packet->IoStatus.Information = CompletionInformation; - - KeInsertQueue(Queue, &Packet->ListEntry); + Status = IoSetIoCompletion(Queue, CompletionKey, CompletionContext, + CompletionStatus, CompletionInformation, TRUE); ObDereferenceObject(Queue); }