[FASTFAT]
authorPierre Schweitzer <pierre@reactos.org>
Sat, 4 Mar 2017 11:34:13 +0000 (11:34 +0000)
committerPierre Schweitzer <pierre@reactos.org>
Sat, 4 Mar 2017 11:34:13 +0000 (11:34 +0000)
When un/locking a volume, also handle VPB state

svn path=/trunk/; revision=74047

reactos/drivers/filesystems/fastfat/fsctl.c

index 876e7f8..16b3f2c 100644 (file)
@@ -1058,12 +1058,14 @@ VfatLockOrUnlockVolume(
     PFILE_OBJECT FileObject;
     PDEVICE_EXTENSION DeviceExt;
     PVFATFCB Fcb;
     PFILE_OBJECT FileObject;
     PDEVICE_EXTENSION DeviceExt;
     PVFATFCB Fcb;
+    PVPB Vpb;
 
     DPRINT("VfatLockOrUnlockVolume(%p, %d)\n", IrpContext, Lock);
 
     DeviceExt = IrpContext->DeviceExt;
     FileObject = IrpContext->FileObject;
     Fcb = FileObject->FsContext;
 
     DPRINT("VfatLockOrUnlockVolume(%p, %d)\n", IrpContext, Lock);
 
     DeviceExt = IrpContext->DeviceExt;
     FileObject = IrpContext->FileObject;
     Fcb = FileObject->FsContext;
+    Vpb = DeviceExt->FATFileObject->Vpb;
 
     /* Only allow locking with the volume open */
     if (!BooleanFlagOn(Fcb->Flags, FCB_IS_VOLUME))
 
     /* Only allow locking with the volume open */
     if (!BooleanFlagOn(Fcb->Flags, FCB_IS_VOLUME))
@@ -1078,6 +1080,13 @@ VfatLockOrUnlockVolume(
         return STATUS_ACCESS_DENIED;
     }
 
         return STATUS_ACCESS_DENIED;
     }
 
+    /* Bail out if it's already in the demanded state */
+    if ((BooleanFlagOn(Vpb->Flags, VPB_LOCKED) && Lock) ||
+        (!BooleanFlagOn(Vpb->Flags, VPB_LOCKED) && !Lock))
+    {
+        return STATUS_ACCESS_DENIED;
+    }
+
     /* Deny locking if we're not alone */
     if (Lock && DeviceExt->OpenHandleCount != 1)
     {
     /* Deny locking if we're not alone */
     if (Lock && DeviceExt->OpenHandleCount != 1)
     {
@@ -1088,10 +1097,12 @@ VfatLockOrUnlockVolume(
     if (Lock)
     {
         DeviceExt->Flags |= VCB_VOLUME_LOCKED;
     if (Lock)
     {
         DeviceExt->Flags |= VCB_VOLUME_LOCKED;
+        Vpb->Flags |= VPB_LOCKED;
     }
     else
     {
         DeviceExt->Flags &= ~VCB_VOLUME_LOCKED;
     }
     else
     {
         DeviceExt->Flags &= ~VCB_VOLUME_LOCKED;
+        Vpb->Flags &= ~VPB_LOCKED;
     }
 
     return STATUS_SUCCESS;
     }
 
     return STATUS_SUCCESS;