[FASTFAT]
[reactos.git] / reactos / drivers / filesystems / fastfat / fsctl.c
index 43e582a..873b0fc 100644 (file)
@@ -121,16 +121,6 @@ VfatHasFileSystem(
             *RecognizedFS = TRUE;
         }
     }
-    else if (DiskGeometry.MediaType == Unknown)
-    {
-        /*
-         * Floppy disk driver can return Unknown as media type if it
-         * doesn't know yet what floppy in the drive really is. This is
-         * perfectly correct to do under Windows.
-         */
-        *RecognizedFS = TRUE;
-        DiskGeometry.BytesPerSector = 512;
-    }
     else
     {
         *RecognizedFS = TRUE;
@@ -429,7 +419,6 @@ VfatMount(
     {
         HashTableSize = 65537; // 65536 = 64 * 1024;
     }
-    HashTableSize = FCB_HASH_TABLE_SIZE;
     DPRINT("VFAT: Recognized volume\n");
     Status = IoCreateDevice(VfatGlobalData->DriverObject,
                             ROUND_UP(sizeof (DEVICE_EXTENSION), sizeof(ULONG)) + sizeof(HASHENTRY*) * HashTableSize,
@@ -447,6 +436,7 @@ VfatMount(
     RtlZeroMemory(DeviceExt, ROUND_UP(sizeof(DEVICE_EXTENSION), sizeof(ULONG)) + sizeof(HASHENTRY*) * HashTableSize);
     DeviceExt->FcbHashTable = (HASHENTRY**)((ULONG_PTR)DeviceExt + ROUND_UP(sizeof(DEVICE_EXTENSION), sizeof(ULONG)));
     DeviceExt->HashTableSize = HashTableSize;
+    DeviceExt->VolumeDevice = DeviceObject;
 
     /* use same vpb as device disk */
     DeviceObject->Vpb = Vpb;
@@ -924,6 +914,8 @@ VfatDismountVolume(
     PLIST_ENTRY NextEntry;
     PVFATFCB Fcb;
     PFILE_OBJECT FileObject;
+    ULONG eocMark;
+    NTSTATUS Status;
 
     DPRINT("VfatDismountVolume(%p)\n", IrpContext);
 
@@ -949,6 +941,18 @@ VfatDismountVolume(
 
     ExAcquireResourceExclusiveLite(&DeviceExt->FatResource, TRUE);
 
+    if (DeviceExt->VolumeFcb->Flags & VCB_CLEAR_DIRTY)
+    {
+        /* Set clean shutdown bit */
+        Status = GetNextCluster(DeviceExt, 1, &eocMark);
+        if (NT_SUCCESS(Status))
+        {
+            eocMark |= DeviceExt->CleanShutBitMask;
+            if (NT_SUCCESS(WriteCluster(DeviceExt, 1, eocMark)))
+                DeviceExt->VolumeFcb->Flags &= ~VCB_IS_DIRTY;
+        }
+    }
+
     /* Flush volume & files */
     VfatFlushVolume(DeviceExt, (PVFATFCB)FileObject->FsContext);
 
@@ -962,7 +966,9 @@ VfatDismountVolume(
 
     /* Mark we're being dismounted */
     DeviceExt->Flags |= VCB_DISMOUNT_PENDING;
+#ifndef ENABLE_SWAPOUT
     IrpContext->DeviceObject->Vpb->Flags &= ~VPB_MOUNTED;
+#endif
 
     ExReleaseResourceLite(&DeviceExt->FatResource);
 
@@ -1049,9 +1055,5 @@ VfatFileSystemControl(
             break;
     }
 
-    IrpContext->Irp->IoStatus.Status = Status;
-
-    IoCompleteRequest(IrpContext->Irp, IO_NO_INCREMENT);
-    VfatFreeIrpContext(IrpContext);
     return Status;
 }