From 0676247932d1f707e9b02d46073d022c02a7893b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20Poussineau?= Date: Sat, 10 Sep 2022 22:25:19 +0200 Subject: [PATCH] [FLOPPY] Correctly return media changed information If disk changed since last time, we must either return STATUS_IO_DEVICE_ERROR or STATUS_VERIFY_REQUIRED, depending of VPB_MOUNTED flag. This is already handled by the SignalMediaChanged() function. CORE-18244 --- drivers/storage/floppy/floppy/ioctl.c | 12 +++--------- drivers/storage/floppy/floppy/readwrite.c | 9 ++------- 2 files changed, 5 insertions(+), 16 deletions(-) diff --git a/drivers/storage/floppy/floppy/ioctl.c b/drivers/storage/floppy/floppy/ioctl.c index 11875e51838..7673a0fd0f0 100644 --- a/drivers/storage/floppy/floppy/ioctl.c +++ b/drivers/storage/floppy/floppy/ioctl.c @@ -153,16 +153,10 @@ DeviceIoctlPassive(PDRIVE_INFO DriveInfo, PIRP Irp) if(DiskChanged) { INFO_(FLOPPY, "DeviceIoctl(): detected disk changed; signalling media change and completing\n"); - SignalMediaChanged(DriveInfo->DeviceObject, Irp); - /* - * Just guessing here - I have a choice of returning NO_MEDIA or VERIFY_REQUIRED. If there's - * really no disk in the drive, I'm thinking I can save time by just reporting that fact, rather - * than forcing windows to ask me twice. If this doesn't work, we'll need to split this up and - * handle the CHECK_VERIFY IOCTL separately. - */ - if(ResetChangeFlag(DriveInfo) == STATUS_NO_MEDIA_IN_DEVICE) - Irp->IoStatus.Status = STATUS_NO_MEDIA_IN_DEVICE; + /* The following call sets IoStatus.Status and IoStatus.Information */ + SignalMediaChanged(DriveInfo->DeviceObject, Irp); + ResetChangeFlag(DriveInfo); IoCompleteRequest(Irp, IO_NO_INCREMENT); StopMotor(DriveInfo->ControllerInfo); diff --git a/drivers/storage/floppy/floppy/readwrite.c b/drivers/storage/floppy/floppy/readwrite.c index 2ce3a6ccf17..35d1c60d79b 100644 --- a/drivers/storage/floppy/floppy/readwrite.c +++ b/drivers/storage/floppy/floppy/readwrite.c @@ -478,16 +478,11 @@ ReadWritePassive(PDRIVE_INFO DriveInfo, PIRP Irp) if(DiskChanged) { - INFO_(FLOPPY, "ReadWritePhase1(): signalling media changed; Completing with STATUS_MEDIA_CHANGED\n"); + INFO_(FLOPPY, "ReadWritePhase1(): detected disk changed: signalling media change and completing\n"); /* The following call sets IoStatus.Status and IoStatus.Information */ SignalMediaChanged(DeviceObject, Irp); - - /* - * Guessing at something... see ioctl.c for more info - */ - if(ResetChangeFlag(DriveInfo) == STATUS_NO_MEDIA_IN_DEVICE) - Irp->IoStatus.Status = STATUS_NO_MEDIA_IN_DEVICE; + ResetChangeFlag(DriveInfo); IoCompleteRequest(Irp, IO_NO_INCREMENT); StopMotor(DriveInfo->ControllerInfo);