diff --git a/reactos/ntoskrnl/io/cleanup.c b/reactos/ntoskrnl/io/cleanup.c index c3fc57a89bb..eb91d2a44cc 100644 --- a/reactos/ntoskrnl/io/cleanup.c +++ b/reactos/ntoskrnl/io/cleanup.c @@ -15,6 +15,7 @@ #include #include #include +#include #define NDEBUG #include @@ -38,8 +39,19 @@ VOID IoDeviceControlCompletion(PDEVICE_OBJECT DeviceObject, else { IoControlCode = IoStack->Parameters.DeviceIoControl.IoControlCode; - OutputBufferLength = NT_SUCCESS(Irp->IoStatus.Status) - ? Irp->IoStatus.Information : 0; + if (NT_SUCCESS(Irp->IoStatus.Status)) + { + OutputBufferLength = Irp->IoStatus.Information; + if (IoStack->Parameters.DeviceIoControl.OutputBufferLength < OutputBufferLength) + { + Irp->IoStatus.Status = STATUS_DATA_OVERRUN; + OutputBufferLength = IoStack->Parameters.DeviceIoControl.OutputBufferLength; + } + } + else + { + OutputBufferLength = 0; + } } switch (IO_METHOD_FROM_CTL_CODE(IoControlCode))