[ros-diffs] [pschweitzer] 34238: - Implemented a "method" to keep $Mft in memory. That's ugly, unsafe, etc. It will be improved with the use of CC. For now, it will help developing directory browsing - Free memory after use - Some code cleanup

pschweitzer at svn.reactos.org pschweitzer at svn.reactos.org
Tue Jul 1 20:58:03 CEST 2008


Author: pschweitzer
Date: Tue Jul  1 13:58:03 2008
New Revision: 34238

URL: http://svn.reactos.org/svn/reactos?rev=34238&view=rev
Log:
- Implemented a "method" to keep $Mft in memory. That's ugly, unsafe, etc. It will be improved with the use of CC. For now, it will help developing directory browsing
- Free memory after use
- Some code cleanup

Modified:
    branches/pierre-fsd/drivers/filesystems/ntfs/fsctl.c

Modified: branches/pierre-fsd/drivers/filesystems/ntfs/fsctl.c
URL: http://svn.reactos.org/svn/reactos/branches/pierre-fsd/drivers/filesystems/ntfs/fsctl.c?rev=34238&r1=34237&r2=34238&view=diff
==============================================================================
--- branches/pierre-fsd/drivers/filesystems/ntfs/fsctl.c [iso-8859-1] (original)
+++ branches/pierre-fsd/drivers/filesystems/ntfs/fsctl.c [iso-8859-1] Tue Jul  1 13:58:03 2008
@@ -256,7 +256,7 @@
   VolumeRecord = ExAllocatePoolWithTag(NonPagedPool, NtfsInfo->BytesPerFileRecord, TAG_NTFS);
   if (VolumeRecord == NULL)
   {
-    ExFreePool (MftRecord);
+    ExFreePool(MftRecord);
     return STATUS_INSUFFICIENT_RESOURCES;
   }
 
@@ -265,7 +265,7 @@
   Status = ReadFileRecord(DeviceExt, 3, VolumeRecord, MftRecord);
   if (!NT_SUCCESS(Status))
   {
-    ExFreePool (MftRecord);
+    ExFreePool(MftRecord);
     return Status;
   }
 
@@ -307,7 +307,8 @@
     NtfsInfo->Flags = VolumeInfo->Flags;
   }
 
-  ExFreePool (MftRecord);
+  ExFreePool(MftRecord);
+  ExFreePool(VolumeRecord);
 
   return Status;
 }
@@ -318,6 +319,7 @@
                 PIRP Irp)
 {
   PDEVICE_OBJECT NewDeviceObject = NULL;
+  PFILE_RECORD_HEADER MftRecord = NULL;
   PDEVICE_OBJECT DeviceToMount;
   PIO_STACK_LOCATION Stack;
   PNTFS_FCB Fcb = NULL;
@@ -354,7 +356,7 @@
   if (!NT_SUCCESS(Status))
     goto ByeBye;
 
-  NewDeviceObject->Flags = NewDeviceObject->Flags | DO_DIRECT_IO;
+  NewDeviceObject->Flags |= DO_DIRECT_IO;
   Vcb = (PVOID)NewDeviceObject->DeviceExtension;
   RtlZeroMemory(Vcb, sizeof(NTFS_VCB));
 
@@ -424,6 +426,26 @@
                        &(NtfsGlobalData->CacheMgrCallbacks),
                        Fcb);
 
+  /* FIXME: Use CC and get rid of this crappy code! */
+  MftRecord = ExAllocatePoolWithTag(NonPagedPool,
+                                    Vcb->NtfsInfo.BytesPerFileRecord, TAG_NTFS);
+  if (MftRecord == NULL)
+  {
+    Status = STATUS_INSUFFICIENT_RESOURCES;
+    goto ByeBye;
+  }
+
+  Status = NtfsReadSectors(Vcb->StorageDevice,
+                           Vcb->NtfsInfo.MftStart.u.LowPart * Vcb->NtfsInfo.SectorsPerCluster,
+                           Vcb->NtfsInfo.BytesPerFileRecord / Vcb->NtfsInfo.BytesPerSector,
+                           Vcb->NtfsInfo.BytesPerSector,
+                           (PVOID)MftRecord,
+                           TRUE);
+  if (!NT_SUCCESS(Status))
+    goto ByeBye;
+
+  Vcb->MftBuffer = MftRecord;
+
   ExInitializeResourceLite(&Vcb->DirResource);
 
   KeInitializeSpinLock(&Vcb->FcbListLock);
@@ -447,6 +469,8 @@
   if (!NT_SUCCESS(Status))
   {
     /* Cleanup */
+    if (MftRecord)
+      ExFreePool(MftRecord);
     if (Vcb && Vcb->StreamFileObject)
       ObDereferenceObject(Vcb->StreamFileObject);
     if (Fcb)



More information about the Ros-diffs mailing list