Author: cgutman
Date: Sat Jan 21 22:16:46 2012
New Revision: 55057
URL:
http://svn.reactos.org/svn/reactos?rev=55057&view=rev
Log:
[CDFS]
- Prevent an infinite loop in CdfsDeviceIoControl if the the verify request is successful
but IoCallDriver keeps returning STATUS_VERIFY_REQUIRED
Modified:
trunk/reactos/drivers/filesystems/cdfs/common.c
Modified: trunk/reactos/drivers/filesystems/cdfs/common.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/cdfs/c…
==============================================================================
--- trunk/reactos/drivers/filesystems/cdfs/common.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/filesystems/cdfs/common.c [iso-8859-1] Sat Jan 21 22:16:46 2012
@@ -154,6 +154,7 @@
KEVENT Event;
PIRP Irp;
NTSTATUS Status;
+ BOOLEAN LastChance = FALSE;
DPRINT("CdfsDeviceIoControl(DeviceObject %x, CtlCode %x, "
"InputBuffer %x, InputBufferSize %x, OutputBuffer %x, "
@@ -208,20 +209,29 @@
{
PDEVICE_OBJECT DeviceToVerify;
- DPRINT1("STATUS_VERIFY_REQUIRED\n");
DeviceToVerify = IoGetDeviceToVerify(PsGetCurrentThread());
IoSetDeviceToVerify(PsGetCurrentThread(), NULL);
if (DeviceToVerify)
{
Status = IoVerifyVolume(DeviceToVerify, FALSE);
- DPRINT1("IoVerifyVolume() returned (Status %lx)\n", Status);
- }
-
- if (NT_SUCCESS(Status))
+ DPRINT("IoVerifyVolume() returned (Status %lx)\n", Status);
+ }
+
+ if (NT_SUCCESS(Status) && !LastChance)
{
DPRINT1("Volume verify succeeded; trying request again\n");
+ LastChance = TRUE;
goto again;
+ }
+ else if (NT_SUCCESS(Status))
+ {
+ DPRINT1("Failed to read after successful verify, aborting\n");
+ Status = STATUS_DEVICE_NOT_READY;
+ }
+ else
+ {
+ DPRINT1("IoVerifyVolume() failed (Status %lx)\n", Status);
}
}