From fefcaea1a8e30c2ea4f3cbd3a223509ef79d0ac4 Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Tue, 9 Jun 2009 16:38:05 +0000 Subject: [PATCH] - Make use of the implemented transfer counter. svn path=/trunk/; revision=41359 --- reactos/ntoskrnl/include/internal/io_x.h | 2 +- reactos/ntoskrnl/io/iomgr/iofunc.c | 3 +++ reactos/ntoskrnl/io/iomgr/irp.c | 23 +++++++++++++++++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/include/internal/io_x.h b/reactos/ntoskrnl/include/internal/io_x.h index e5d437c5955..c5f068645cb 100644 --- a/reactos/ntoskrnl/include/internal/io_x.h +++ b/reactos/ntoskrnl/include/internal/io_x.h @@ -92,7 +92,7 @@ IopUpdateOperationCount(IN IOP_TRANSFER_TYPE Type) static __inline VOID -IopUpdateTransferCount(IN IOP_TRANSFER_TYPE Type, IN ULONG TransferCount) +IopUpdateTransferCount(IN IOP_TRANSFER_TYPE Type, IN ULONG_PTR TransferCount) { PLARGE_INTEGER CountToChange; PLARGE_INTEGER TransferToChange; diff --git a/reactos/ntoskrnl/io/iomgr/iofunc.c b/reactos/ntoskrnl/io/iomgr/iofunc.c index 54de91c494a..517dbb9f809 100644 --- a/reactos/ntoskrnl/io/iomgr/iofunc.c +++ b/reactos/ntoskrnl/io/iomgr/iofunc.c @@ -2354,6 +2354,9 @@ NtSetInformationFile(IN HANDLE FileHandle, } _SEH2_END; + /* Update transfer count */ + IopUpdateTransferCount(IopOtherTransfer, Length); + /* Release the file lock, dereference the file and return */ IopUnlockFileObject(FileObject); ObDereferenceObject(FileObject); diff --git a/reactos/ntoskrnl/io/iomgr/irp.c b/reactos/ntoskrnl/io/iomgr/irp.c index 7dca8cb5aa8..7ee3fe496e8 100644 --- a/reactos/ntoskrnl/io/iomgr/irp.c +++ b/reactos/ntoskrnl/io/iomgr/irp.c @@ -393,6 +393,29 @@ IopCompleteRequest(IN PKAPC Apc, } } + /* Update transfer count for everything but create operation */ + if (!(Irp->Flags & IRP_CREATE_OPERATION)) + { + if (Irp->Flags & IRP_WRITE_OPERATION) + { + /* Update write transfer count */ + IopUpdateTransferCount(IopWriteTransfer, + Irp->IoStatus.Information); + } + else if (Irp->Flags & IRP_READ_OPERATION) + { + /* Update read transfer count */ + IopUpdateTransferCount(IopReadTransfer, + Irp->IoStatus.Information); + } + else + { + /* Update other transfer count */ + IopUpdateTransferCount(IopOtherTransfer, + Irp->IoStatus.Information); + } + } + /* Now that we've signaled the events, de-associate the IRP */ IopUnQueueIrpFromThread(Irp);