[NTFS] Use LookasideList allocations for FILE_RECORD_HEADER.
authorPierre Schweitzer <pierre@reactos.org>
Sun, 31 Dec 2017 13:14:24 +0000 (14:14 +0100)
committerPierre Schweitzer <pierre@reactos.org>
Sun, 31 Dec 2017 13:14:24 +0000 (14:14 +0100)
TODO: use a specific tag

This, and previous commit, should speed up a bit the driver until caching gets implemented

drivers/filesystems/ntfs/attrib.c
drivers/filesystems/ntfs/create.c
drivers/filesystems/ntfs/dirctl.c
drivers/filesystems/ntfs/fcb.c
drivers/filesystems/ntfs/finfo.c
drivers/filesystems/ntfs/fsctl.c
drivers/filesystems/ntfs/mft.c
drivers/filesystems/ntfs/ntfs.h
drivers/filesystems/ntfs/rw.c
drivers/filesystems/ntfs/volinfo.c

index 846c16d..1a04b76 100644 (file)
@@ -1083,9 +1083,7 @@ FreeClusters(PNTFS_VCB Vcb,
     }
 
     // Read the $Bitmap file
-    BitmapRecord = ExAllocatePoolWithTag(NonPagedPool,
-                                         Vcb->NtfsInfo.BytesPerFileRecord,
-                                         TAG_NTFS);
+    BitmapRecord = ExAllocateFromNPagedLookasideList(&Vcb->FileRecLookasideList);
     if (BitmapRecord == NULL)
     {
         DPRINT1("Error: Unable to allocate memory for bitmap file record!\n");
@@ -1096,7 +1094,7 @@ FreeClusters(PNTFS_VCB Vcb,
     if (!NT_SUCCESS(Status))
     {
         DPRINT1("Error: Unable to read file record for bitmap!\n");
-        ExFreePoolWithTag(BitmapRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&Vcb->FileRecLookasideList, BitmapRecord);
         return 0;
     }
 
@@ -1104,7 +1102,7 @@ FreeClusters(PNTFS_VCB Vcb,
     if (!NT_SUCCESS(Status))
     {
         DPRINT1("Error: Unable to find data attribute for bitmap file!\n");
-        ExFreePoolWithTag(BitmapRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&Vcb->FileRecLookasideList, BitmapRecord);
         return 0;
     }
 
@@ -1116,7 +1114,7 @@ FreeClusters(PNTFS_VCB Vcb,
     {
         DPRINT1("Error: Unable to allocate memory for bitmap file data!\n");
         ReleaseAttributeContext(DataContext);
-        ExFreePoolWithTag(BitmapRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&Vcb->FileRecLookasideList, BitmapRecord);
         return 0;
     }
 
@@ -1156,13 +1154,13 @@ FreeClusters(PNTFS_VCB Vcb,
     {
         ReleaseAttributeContext(DataContext);
         ExFreePoolWithTag(BitmapData, TAG_NTFS);
-        ExFreePoolWithTag(BitmapRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&Vcb->FileRecLookasideList, BitmapRecord);
         return Status;
     }
 
     ReleaseAttributeContext(DataContext);
     ExFreePoolWithTag(BitmapData, TAG_NTFS);
-    ExFreePoolWithTag(BitmapRecord, TAG_NTFS);    
+    ExFreeToNPagedLookasideList(&Vcb->FileRecLookasideList, BitmapRecord);
     
     // Save updated data runs to file record
 
index f37a951..0ce5771 100644 (file)
@@ -114,9 +114,7 @@ NtfsMoonWalkID(PDEVICE_EXTENSION DeviceExt,
     DPRINT1("NtfsMoonWalkID(%p, %I64x, %p)\n", DeviceExt, Id, OutPath);
 
     RtlZeroMemory(FullPath, sizeof(FullPath));
-    MftRecord = ExAllocatePoolWithTag(NonPagedPool,
-                                      DeviceExt->NtfsInfo.BytesPerFileRecord,
-                                      TAG_NTFS);
+    MftRecord = ExAllocateFromNPagedLookasideList(&DeviceExt->FileRecLookasideList);
     if (MftRecord == NULL)
     {
         return STATUS_INSUFFICIENT_RESOURCES;
@@ -155,7 +153,7 @@ NtfsMoonWalkID(PDEVICE_EXTENSION DeviceExt,
             break;
     }
 
-    ExFreePoolWithTag(MftRecord, TAG_NTFS);
+    ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, MftRecord);
 
     if (!NT_SUCCESS(Status))
         return Status;
@@ -191,9 +189,7 @@ NtfsOpenFileById(PDEVICE_EXTENSION DeviceExt,
         return STATUS_OBJECT_NAME_NOT_FOUND;
     }
 
-    MftRecord = ExAllocatePoolWithTag(NonPagedPool,
-                                      DeviceExt->NtfsInfo.BytesPerFileRecord,
-                                      TAG_NTFS);
+    MftRecord = ExAllocateFromNPagedLookasideList(&DeviceExt->FileRecLookasideList);
     if (MftRecord == NULL)
     {
         return STATUS_INSUFFICIENT_RESOURCES;
@@ -202,13 +198,13 @@ NtfsOpenFileById(PDEVICE_EXTENSION DeviceExt,
     Status = ReadFileRecord(DeviceExt, MftId, MftRecord);
     if (!NT_SUCCESS(Status))
     {
-        ExFreePoolWithTag(MftRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, MftRecord);
         return Status;
     }
 
     if (!(MftRecord->Flags & FRH_IN_USE))
     {
-        ExFreePoolWithTag(MftRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, MftRecord);
         return STATUS_OBJECT_PATH_NOT_FOUND;
     }
 
@@ -221,14 +217,14 @@ NtfsOpenFileById(PDEVICE_EXTENSION DeviceExt,
         Status = NtfsMakeFCBFromDirEntry(DeviceExt, NULL, &Name, NULL, MftRecord, MftId, &FCB);
         if (!NT_SUCCESS(Status))
         {
-            ExFreePoolWithTag(MftRecord, TAG_NTFS);
+            ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, MftRecord);
             return Status;
         }
     }
 
     ASSERT(FCB != NULL);
 
-    ExFreePoolWithTag(MftRecord, TAG_NTFS);
+    ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, MftRecord);
 
     Status = NtfsAttachFCBToFileObject(DeviceExt,
                                        FCB,
@@ -506,9 +502,7 @@ NtfsCreateFile(PDEVICE_OBJECT DeviceObject,
            
             ExAcquireResourceExclusiveLite(&(Fcb->MainResource), TRUE);
 
-            fileRecord = ExAllocatePoolWithTag(NonPagedPool,
-                                               Fcb->Vcb->NtfsInfo.BytesPerFileRecord,
-                                               TAG_NTFS);
+            fileRecord = ExAllocateFromNPagedLookasideList(&Fcb->Vcb->FileRecLookasideList);
             if (fileRecord)
             {
 
@@ -532,7 +526,7 @@ NtfsCreateFile(PDEVICE_OBJECT DeviceObject,
            
         DoneOverwriting:
             if (fileRecord)
-                ExFreePoolWithTag(fileRecord, TAG_NTFS);
+                ExFreeToNPagedLookasideList(&Fcb->Vcb->FileRecLookasideList, fileRecord);
             if (dataContext)
                 ReleaseAttributeContext(dataContext);
 
@@ -741,7 +735,7 @@ NtfsCreateDirectory(PDEVICE_EXTENSION DeviceExt,
     if (!NT_SUCCESS(Status))
     {
         DPRINT1("ERROR: Failed to create empty B-Tree!\n");
-        ExFreePoolWithTag(FileRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, FileRecord);
         return Status;
     }
 
@@ -760,7 +754,7 @@ NtfsCreateDirectory(PDEVICE_EXTENSION DeviceExt,
     {
         DPRINT1("ERROR: Unable to create empty index root!\n");
         DestroyBTree(Tree);
-        ExFreePoolWithTag(FileRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, FileRecord);
         return Status;
     }
 
@@ -773,7 +767,7 @@ NtfsCreateDirectory(PDEVICE_EXTENSION DeviceExt,
     {
         DPRINT1("ERROR: Failed to add index root to new file record!\n");
         ExFreePoolWithTag(NewIndexRoot, TAG_NTFS);
-        ExFreePoolWithTag(FileRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, FileRecord);
         return Status;
     }
 
@@ -803,7 +797,7 @@ NtfsCreateDirectory(PDEVICE_EXTENSION DeviceExt,
     }
 
     ExFreePoolWithTag(NewIndexRoot, TAG_NTFS);
-    ExFreePoolWithTag(FileRecord, TAG_NTFS);
+    ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, FileRecord);
 
     return Status;
 }
@@ -829,9 +823,7 @@ NtfsCreateEmptyFileRecord(PDEVICE_EXTENSION DeviceExt)
     DPRINT1("NtfsCreateEmptyFileRecord(%p)\n", DeviceExt);
 
     // allocate memory for file record
-    FileRecord = ExAllocatePoolWithTag(NonPagedPool,
-                                       DeviceExt->NtfsInfo.BytesPerFileRecord,
-                                       TAG_NTFS);
+    FileRecord = ExAllocateFromNPagedLookasideList(&DeviceExt->FileRecLookasideList);
     if (!FileRecord)
     {
         DPRINT1("ERROR: Unable to allocate memory for file record!\n");
@@ -963,7 +955,7 @@ NtfsCreateFileRecord(PDEVICE_EXTENSION DeviceExt,
                                             CaseSensitive);
     }
 
-    ExFreePoolWithTag(FileRecord, TAG_NTFS);
+    ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, FileRecord);
 
     return Status;
 }
index ab784fc..3c8d3cd 100644 (file)
@@ -388,7 +388,7 @@ NtfsQueryDirectory(PNTFS_IRP_CONTEXT IrpContext)
             {
                 DPRINT1("Ignoring duplicate MFT entry 0x%x\n", MFTRecord);
                 Ccb->Entry++;
-                ExFreePoolWithTag(FileRecord, TAG_NTFS);
+                ExFreeToNPagedLookasideList(&DeviceExtension->FileRecLookasideList, FileRecord);
                 continue;
             }
             OldMFTRecord = MFTRecord;
@@ -468,7 +468,7 @@ NtfsQueryDirectory(PNTFS_IRP_CONTEXT IrpContext)
         }
         BufferLength -= Buffer0->NextEntryOffset;
         Buffer += Buffer0->NextEntryOffset;
-        ExFreePoolWithTag(FileRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&DeviceExtension->FileRecLookasideList, FileRecord);
     }
 
     if (Buffer0)
index f8057ee..8a4f460 100644 (file)
@@ -311,9 +311,7 @@ NtfsMakeRootFCB(PNTFS_VCB Vcb)
     PFILE_RECORD_HEADER MftRecord;
     PFILENAME_ATTRIBUTE FileName;
 
-    MftRecord = ExAllocatePoolWithTag(NonPagedPool,
-                                      Vcb->NtfsInfo.BytesPerFileRecord,
-                                      TAG_NTFS);
+    MftRecord = ExAllocateFromNPagedLookasideList(&Vcb->FileRecLookasideList);
     if (MftRecord == NULL)
     {
         return NULL;
@@ -321,21 +319,21 @@ NtfsMakeRootFCB(PNTFS_VCB Vcb)
 
     if (!NT_SUCCESS(ReadFileRecord(Vcb, NTFS_FILE_ROOT, MftRecord)))
     {
-        ExFreePoolWithTag(MftRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&Vcb->FileRecLookasideList, MftRecord);
         return NULL;
     }
 
     FileName = GetFileNameFromRecord(Vcb, MftRecord, NTFS_FILE_NAME_WIN32);
     if (!FileName)
     {
-        ExFreePoolWithTag(MftRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&Vcb->FileRecLookasideList, MftRecord);
         return NULL;
     }
 
     Fcb = NtfsCreateFCB(L"\\", NULL, Vcb);
     if (!Fcb)
     {
-        ExFreePoolWithTag(MftRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&Vcb->FileRecLookasideList, MftRecord);
         return NULL;
     }
 
@@ -355,7 +353,7 @@ NtfsMakeRootFCB(PNTFS_VCB Vcb)
     NtfsAddFCBToTable(Vcb, Fcb);
     NtfsGrabFCB(Vcb, Fcb);
 
-    ExFreePoolWithTag(MftRecord, TAG_NTFS);
+    ExFreeToNPagedLookasideList(&Vcb->FileRecLookasideList, MftRecord);
 
     return Fcb;
 }
@@ -570,6 +568,7 @@ NtfsDirFindFile(PNTFS_VCB Vcb,
 
     if ((FileRecord->Flags & FRH_DIRECTORY) && Colon != 0)
     {
+        ExFreeToNPagedLookasideList(&Vcb->FileRecLookasideList, FileRecord);
         return STATUS_INVALID_PARAMETER;
     }
     else if (Colon != 0)
@@ -583,7 +582,7 @@ NtfsDirFindFile(PNTFS_VCB Vcb,
     }
 
     Status = NtfsMakeFCBFromDirEntry(Vcb, DirectoryFcb, &File, Colon, FileRecord, MFTIndex, FoundFCB);
-    ExFreePoolWithTag(FileRecord, TAG_NTFS);
+    ExFreeToNPagedLookasideList(&Vcb->FileRecLookasideList, FileRecord);
 
     return Status;
 }
@@ -734,9 +733,7 @@ NtfsReadFCBAttribute(PNTFS_VCB Vcb,
     PNTFS_ATTR_CONTEXT AttrCtxt;
     ULONGLONG AttrLength;
 
-    FileRecord = ExAllocatePoolWithTag(NonPagedPool,
-                                       Vcb->NtfsInfo.BytesPerFileRecord,
-                                       TAG_NTFS);
+    FileRecord = ExAllocateFromNPagedLookasideList(&Vcb->FileRecLookasideList);
     if (FileRecord == NULL)
     {
         return STATUS_INSUFFICIENT_RESOURCES;
@@ -745,14 +742,14 @@ NtfsReadFCBAttribute(PNTFS_VCB Vcb,
     Status = ReadFileRecord(Vcb, pFCB->MFTIndex, FileRecord);
     if (!NT_SUCCESS(Status))
     {
-        ExFreePoolWithTag(FileRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&Vcb->FileRecLookasideList, FileRecord);
         return Status;
     }
 
     Status = FindAttribute(Vcb, FileRecord, Type, Name, NameLength, &AttrCtxt, NULL);
     if (!NT_SUCCESS(Status))
     {
-        ExFreePoolWithTag(FileRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&Vcb->FileRecLookasideList, FileRecord);
         return Status;
     }
 
@@ -761,14 +758,14 @@ NtfsReadFCBAttribute(PNTFS_VCB Vcb,
     if (*Data == NULL)
     {
         ReleaseAttributeContext(AttrCtxt);
-        ExFreePoolWithTag(FileRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&Vcb->FileRecLookasideList, FileRecord);
         return STATUS_INSUFFICIENT_RESOURCES;
     }
 
     ReadAttribute(Vcb, AttrCtxt, 0, *Data, AttrLength);
 
     ReleaseAttributeContext(AttrCtxt);
-    ExFreePoolWithTag(FileRecord, TAG_NTFS);
+    ExFreeToNPagedLookasideList(&Vcb->FileRecLookasideList, FileRecord);
 
     return STATUS_SUCCESS;
 }
index fb7df5f..9a1b44b 100644 (file)
@@ -236,7 +236,7 @@ NtfsGetSteamInformation(PNTFS_FCB Fcb,
     if (*BufferLength < sizeof(FILE_STREAM_INFORMATION))
         return STATUS_BUFFER_TOO_SMALL;
 
-    FileRecord = ExAllocatePoolWithTag(NonPagedPool, DeviceExt->NtfsInfo.BytesPerFileRecord, TAG_NTFS);
+    FileRecord = ExAllocateFromNPagedLookasideList(&DeviceExt->FileRecLookasideList);
     if (FileRecord == NULL)
     {
         DPRINT1("Not enough memory!\n");
@@ -247,7 +247,7 @@ NtfsGetSteamInformation(PNTFS_FCB Fcb,
     if (!NT_SUCCESS(Status))
     {
         DPRINT1("Can't find record!\n");
-        ExFreePoolWithTag(FileRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, FileRecord);
         return Status;
     }
 
@@ -285,7 +285,7 @@ NtfsGetSteamInformation(PNTFS_FCB Fcb,
     }
 
     FindCloseAttribute(&Context);
-    ExFreePoolWithTag(FileRecord, TAG_NTFS);
+    ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, FileRecord);
     return Status;
 }
 
@@ -577,7 +577,7 @@ NtfsSetEndOfFile(PNTFS_FCB Fcb,
 
 
     // Allocate non-paged memory for the file record
-    FileRecord = ExAllocatePoolWithTag(NonPagedPool, DeviceExt->NtfsInfo.BytesPerFileRecord, TAG_NTFS);
+    FileRecord = ExAllocateFromNPagedLookasideList(&DeviceExt->FileRecLookasideList);
     if (FileRecord == NULL)
     {
         DPRINT1("Couldn't allocate memory for file record!");
@@ -591,7 +591,7 @@ NtfsSetEndOfFile(PNTFS_FCB Fcb,
     {
         // We couldn't get the file's record. Free the memory and return the error
         DPRINT1("Can't find record for %wS!\n", Fcb->ObjectName);
-        ExFreePoolWithTag(FileRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, FileRecord);
         return Status;
     }
 
@@ -607,7 +607,7 @@ NtfsSetEndOfFile(PNTFS_FCB Fcb,
                                   NewFileSize))
         {
             DPRINT1("Couldn't decrease file size!\n");
-            ExFreePoolWithTag(FileRecord, TAG_NTFS);
+            ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, FileRecord);
             return STATUS_USER_MAPPED_FILE;
         }
     }
@@ -626,7 +626,7 @@ NtfsSetEndOfFile(PNTFS_FCB Fcb,
     if (!NT_SUCCESS(Status))
     {
         DPRINT1("No '%S' data stream associated with file!\n", Fcb->Stream);
-        ExFreePoolWithTag(FileRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, FileRecord);
         return Status;
     }
 
@@ -642,7 +642,7 @@ NtfsSetEndOfFile(PNTFS_FCB Fcb,
         {
             // TODO - just fail for now
             ReleaseAttributeContext(DataContext);
-            ExFreePoolWithTag(FileRecord, TAG_NTFS);
+            ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, FileRecord);
             return STATUS_ACCESS_DENIED;
         }
     }
@@ -652,7 +652,7 @@ NtfsSetEndOfFile(PNTFS_FCB Fcb,
     if (!NT_SUCCESS(Status))
     {
         ReleaseAttributeContext(DataContext);
-        ExFreePoolWithTag(FileRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, FileRecord);
         return Status;
     }
 
@@ -663,7 +663,7 @@ NtfsSetEndOfFile(PNTFS_FCB Fcb,
     {
         DPRINT1("Unable to find FileName attribute associated with file!\n");
         ReleaseAttributeContext(DataContext);
-        ExFreePoolWithTag(FileRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, FileRecord);
         return STATUS_INVALID_PARAMETER;
     }
 
@@ -684,7 +684,7 @@ NtfsSetEndOfFile(PNTFS_FCB Fcb,
                                   CaseSensitive);
 
     ReleaseAttributeContext(DataContext);
-    ExFreePoolWithTag(FileRecord, TAG_NTFS);
+    ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, FileRecord);
 
     return Status;
 }
index 76337ec..87858e0 100644 (file)
@@ -274,11 +274,13 @@ NtfsGetVolumeData(PDEVICE_OBJECT DeviceObject,
 
     ExFreePool(BootSector);
 
-    DeviceExt->MasterFileTable = ExAllocatePoolWithTag(NonPagedPool,
-                                                       NtfsInfo->BytesPerFileRecord,
-                                                       TAG_NTFS);
+    ExInitializeNPagedLookasideList(&DeviceExt->FileRecLookasideList,
+                                    NULL, NULL, 0, NtfsInfo->BytesPerFileRecord, TAG_NTFS, 0);
+
+    DeviceExt->MasterFileTable = ExAllocateFromNPagedLookasideList(&DeviceExt->FileRecLookasideList);
     if (DeviceExt->MasterFileTable == NULL)
     {
+        ExDeleteNPagedLookasideList(&DeviceExt->FileRecLookasideList);
         return STATUS_INSUFFICIENT_RESOURCES;
     }
 
@@ -291,7 +293,8 @@ NtfsGetVolumeData(PDEVICE_OBJECT DeviceObject,
     if (!NT_SUCCESS(Status))
     {
         DPRINT1("Failed reading MFT.\n");
-        ExFreePool(DeviceExt->MasterFileTable);
+        ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, DeviceExt->MasterFileTable);
+        ExDeleteNPagedLookasideList(&DeviceExt->FileRecLookasideList);
         return Status;
     }
 
@@ -305,17 +308,17 @@ NtfsGetVolumeData(PDEVICE_OBJECT DeviceObject,
     if (!NT_SUCCESS(Status))
     {
         DPRINT1("Can't find data attribute for Master File Table.\n");
-        ExFreePool(DeviceExt->MasterFileTable);
+        ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, DeviceExt->MasterFileTable);
+        ExDeleteNPagedLookasideList(&DeviceExt->FileRecLookasideList);
         return Status;
     }
 
-    VolumeRecord = ExAllocatePoolWithTag(NonPagedPool,
-                                         NtfsInfo->BytesPerFileRecord,
-                                         TAG_NTFS);
+    VolumeRecord = ExAllocateFromNPagedLookasideList(&DeviceExt->FileRecLookasideList);
     if (VolumeRecord == NULL)
     {
         DPRINT1("Allocation failed for volume record\n");
-        ExFreePool(DeviceExt->MasterFileTable);
+        ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, DeviceExt->MasterFileTable);
+        ExDeleteNPagedLookasideList(&DeviceExt->FileRecLookasideList);
         return STATUS_INSUFFICIENT_RESOURCES;
     }
 
@@ -327,8 +330,9 @@ NtfsGetVolumeData(PDEVICE_OBJECT DeviceObject,
     if (!NT_SUCCESS(Status))
     {
         DPRINT1("Failed reading volume file\n");
-        ExFreePool(VolumeRecord);
-        ExFreePool(DeviceExt->MasterFileTable);
+        ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, VolumeRecord);
+        ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, DeviceExt->MasterFileTable);
+        ExDeleteNPagedLookasideList(&DeviceExt->FileRecLookasideList);
         return Status;
     }
 
@@ -367,8 +371,9 @@ NtfsGetVolumeData(PDEVICE_OBJECT DeviceObject,
     if (VolumeFcb == NULL)
     {
         DPRINT1("Failed allocating volume FCB\n");
-        ExFreePool(VolumeRecord);
-        ExFreePool(DeviceExt->MasterFileTable);
+        ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, VolumeRecord);
+        ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, DeviceExt->MasterFileTable);
+        ExDeleteNPagedLookasideList(&DeviceExt->FileRecLookasideList);
         return STATUS_INSUFFICIENT_RESOURCES;
     }
 
@@ -398,7 +403,7 @@ NtfsGetVolumeData(PDEVICE_OBJECT DeviceObject,
         ReleaseAttributeContext(AttrCtxt);
     }
 
-    ExFreePool(VolumeRecord);
+    ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, VolumeRecord);
 
     NtfsInfo->MftZoneReservation = NtfsQueryMftZoneReservation();
 
@@ -418,6 +423,7 @@ NtfsMountVolume(PDEVICE_OBJECT DeviceObject,
     PNTFS_CCB Ccb = NULL;
     PNTFS_VCB Vcb = NULL;
     NTSTATUS Status;
+    BOOLEAN Lookaside = FALSE;
 
     DPRINT1("NtfsMountVolume() called\n");
 
@@ -446,6 +452,8 @@ NtfsMountVolume(PDEVICE_OBJECT DeviceObject,
     if (!NT_SUCCESS(Status))
         goto ByeBye;
 
+    Lookaside = TRUE;
+
     NewDeviceObject->Flags |= DO_DIRECT_IO;
     Vcb = (PVOID)NewDeviceObject->DeviceExtension;
     RtlZeroMemory(Vcb, sizeof(NTFS_VCB));
@@ -558,6 +566,9 @@ ByeBye:
 
         if (NewDeviceObject)
             IoDeleteDevice(NewDeviceObject);
+
+        if (Lookaside)
+            ExDeleteNPagedLookasideList(&Vcb->FileRecLookasideList);
     }
 
     DPRINT("NtfsMountVolume() done (Status: %lx)\n", Status);
@@ -672,9 +683,7 @@ GetNtfsFileRecord(PDEVICE_EXTENSION DeviceExt,
         return STATUS_BUFFER_TOO_SMALL;
     }
 
-    FileRecord = ExAllocatePoolWithTag(NonPagedPool,
-                                       DeviceExt->NtfsInfo.BytesPerFileRecord,
-                                       TAG_NTFS);
+    FileRecord = ExAllocateFromNPagedLookasideList(&DeviceExt->FileRecLookasideList);
     if (FileRecord == NULL)
     {
         return STATUS_INSUFFICIENT_RESOURCES;
@@ -705,7 +714,7 @@ GetNtfsFileRecord(PDEVICE_EXTENSION DeviceExt,
     OutputBuffer->FileRecordLength = DeviceExt->NtfsInfo.BytesPerFileRecord;
     RtlCopyMemory(OutputBuffer->FileRecordBuffer, FileRecord, DeviceExt->NtfsInfo.BytesPerFileRecord);
 
-    ExFreePoolWithTag(FileRecord, TAG_NTFS);
+    ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, FileRecord);
 
     Irp->IoStatus.Information = FIELD_OFFSET(NTFS_FILE_RECORD_OUTPUT_BUFFER, FileRecordBuffer) + DeviceExt->NtfsInfo.BytesPerFileRecord;
 
@@ -794,9 +803,7 @@ GetVolumeBitmap(PDEVICE_EXTENSION DeviceExt,
         ToCopy = Stack->Parameters.FileSystemControl.OutputBufferLength - FIELD_OFFSET(VOLUME_BITMAP_BUFFER, Buffer);
     }
 
-    BitmapRecord = ExAllocatePoolWithTag(NonPagedPool,
-                                         DeviceExt->NtfsInfo.BytesPerFileRecord,
-                                         TAG_NTFS);
+    BitmapRecord = ExAllocateFromNPagedLookasideList(&DeviceExt->FileRecLookasideList);
     if (BitmapRecord == NULL)
     {
         return STATUS_INSUFFICIENT_RESOURCES;
@@ -806,7 +813,7 @@ GetVolumeBitmap(PDEVICE_EXTENSION DeviceExt,
     if (!NT_SUCCESS(Status))
     {
         DPRINT1("Failed reading volume bitmap: %lx\n", Status);
-        ExFreePoolWithTag(BitmapRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, BitmapRecord);
         return Status;
     }
 
@@ -814,7 +821,7 @@ GetVolumeBitmap(PDEVICE_EXTENSION DeviceExt,
     if (!NT_SUCCESS(Status))
     {
         DPRINT1("Failed find $DATA for bitmap: %lx\n", Status);
-        ExFreePoolWithTag(BitmapRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, BitmapRecord);
         return Status;
     }
 
@@ -833,7 +840,7 @@ GetVolumeBitmap(PDEVICE_EXTENSION DeviceExt,
     }
     _SEH2_END;
     ReleaseAttributeContext(DataContext);
-    ExFreePoolWithTag(BitmapRecord, TAG_NTFS);
+    ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, BitmapRecord);
 
     return Status;
 }
index 8594f79..4724e8d 100644 (file)
@@ -277,7 +277,7 @@ IncreaseMftSize(PDEVICE_EXTENSION Vcb, BOOLEAN CanWait)
     if (!NT_SUCCESS(Status))
     {
         DPRINT1("ERROR: Couldn't find $BITMAP attribute of Mft!\n");
-        ExFreePoolWithTag(BlankFileRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&Vcb->FileRecLookasideList, BlankFileRecord);
         ExReleaseResourceLite(&(Vcb->DirResource));
         return Status;
     }
@@ -308,7 +308,7 @@ IncreaseMftSize(PDEVICE_EXTENSION Vcb, BOOLEAN CanWait)
     if (!BitmapBuffer)
     {
         DPRINT1("ERROR: Unable to allocate memory for bitmap attribute!\n");
-        ExFreePoolWithTag(BlankFileRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&Vcb->FileRecLookasideList, BlankFileRecord);
         ExReleaseResourceLite(&(Vcb->DirResource));
         ReleaseAttributeContext(BitmapContext);
         return STATUS_INSUFFICIENT_RESOURCES;
@@ -326,7 +326,7 @@ IncreaseMftSize(PDEVICE_EXTENSION Vcb, BOOLEAN CanWait)
     if (BytesRead != BitmapSize.LowPart)
     {
         DPRINT1("ERROR: Bytes read != Bitmap size!\n");
-        ExFreePoolWithTag(BlankFileRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&Vcb->FileRecLookasideList, BlankFileRecord);
         ExReleaseResourceLite(&(Vcb->DirResource));
         ExFreePoolWithTag(BitmapBuffer, TAG_NTFS);
         ReleaseAttributeContext(BitmapContext);
@@ -338,7 +338,7 @@ IncreaseMftSize(PDEVICE_EXTENSION Vcb, BOOLEAN CanWait)
     if (!NT_SUCCESS(Status))
     {
         DPRINT1("ERROR: Failed to set size of $MFT data attribute!\n");
-        ExFreePoolWithTag(BlankFileRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&Vcb->FileRecLookasideList, BlankFileRecord);
         ExReleaseResourceLite(&(Vcb->DirResource));
         ExFreePoolWithTag(BitmapBuffer, TAG_NTFS);
         ReleaseAttributeContext(BitmapContext);
@@ -351,7 +351,7 @@ IncreaseMftSize(PDEVICE_EXTENSION Vcb, BOOLEAN CanWait)
     if (!NT_SUCCESS(Status))
     {
         DPRINT1("ERROR: Couldn't find $BITMAP attribute of Mft!\n");
-        ExFreePoolWithTag(BlankFileRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&Vcb->FileRecLookasideList, BlankFileRecord);
         ExReleaseResourceLite(&(Vcb->DirResource));
         return Status;
     }
@@ -369,7 +369,7 @@ IncreaseMftSize(PDEVICE_EXTENSION Vcb, BOOLEAN CanWait)
         if (!NT_SUCCESS(Status))
         {
             DPRINT1("ERROR: Failed to set size of bitmap attribute!\n");
-            ExFreePoolWithTag(BlankFileRecord, TAG_NTFS);
+            ExFreeToNPagedLookasideList(&Vcb->FileRecLookasideList, BlankFileRecord);
             ExReleaseResourceLite(&(Vcb->DirResource));
             ExFreePoolWithTag(BitmapBuffer, TAG_NTFS);
             ReleaseAttributeContext(BitmapContext);
@@ -384,7 +384,7 @@ IncreaseMftSize(PDEVICE_EXTENSION Vcb, BOOLEAN CanWait)
     if (!NT_SUCCESS(Status))
     {
         DPRINT1("ERROR: Failed to update $MFT file record!\n");
-        ExFreePoolWithTag(BlankFileRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&Vcb->FileRecLookasideList, BlankFileRecord);
         ExReleaseResourceLite(&(Vcb->DirResource));
         ExFreePoolWithTag(BitmapBuffer, TAG_NTFS);
         ReleaseAttributeContext(BitmapContext);
@@ -395,7 +395,7 @@ IncreaseMftSize(PDEVICE_EXTENSION Vcb, BOOLEAN CanWait)
     Status = WriteAttribute(Vcb, BitmapContext, 0, BitmapBuffer, NewBitmapSize, &LengthWritten, Vcb->MasterFileTable);
     if (!NT_SUCCESS(Status))
     {
-        ExFreePoolWithTag(BlankFileRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&Vcb->FileRecLookasideList, BlankFileRecord);
         ExReleaseResourceLite(&(Vcb->DirResource));
         ExFreePoolWithTag(BitmapBuffer, TAG_NTFS);
         ReleaseAttributeContext(BitmapContext);
@@ -410,7 +410,7 @@ IncreaseMftSize(PDEVICE_EXTENSION Vcb, BOOLEAN CanWait)
         if (!NT_SUCCESS(Status))
         {
             DPRINT1("ERROR: Failed to write blank file record!\n");
-            ExFreePoolWithTag(BlankFileRecord, TAG_NTFS);
+            ExFreeToNPagedLookasideList(&Vcb->FileRecLookasideList, BlankFileRecord);
             ExReleaseResourceLite(&(Vcb->DirResource));
             ExFreePoolWithTag(BitmapBuffer, TAG_NTFS);
             ReleaseAttributeContext(BitmapContext);
@@ -422,7 +422,7 @@ IncreaseMftSize(PDEVICE_EXTENSION Vcb, BOOLEAN CanWait)
     Status = UpdateMftMirror(Vcb);
 
     // Cleanup
-    ExFreePoolWithTag(BlankFileRecord, TAG_NTFS);
+    ExFreeToNPagedLookasideList(&Vcb->FileRecLookasideList, BlankFileRecord);
     ExReleaseResourceLite(&(Vcb->DirResource));
     ExFreePoolWithTag(BitmapBuffer, TAG_NTFS);
     ReleaseAttributeContext(BitmapContext);
@@ -1301,7 +1301,7 @@ WriteAttribute(PDEVICE_EXTENSION Vcb,
         // Do we need to read the file record?
         if (FileRecord == NULL)
         {
-            FileRecord = ExAllocatePoolWithTag(NonPagedPool, Vcb->NtfsInfo.BytesPerFileRecord, TAG_NTFS);
+            FileRecord = ExAllocateFromNPagedLookasideList(&Vcb->FileRecLookasideList);
             if (!FileRecord)
             {
                 DPRINT1("Error: Couldn't allocate file record!\n");
@@ -1326,7 +1326,7 @@ WriteAttribute(PDEVICE_EXTENSION Vcb,
         {
             DPRINT1("ERROR: Couldn't find matching attribute!\n");
             if(FileRecordAllocated)
-                ExFreePoolWithTag(FileRecord, TAG_NTFS);
+                ExFreeToNPagedLookasideList(&Vcb->FileRecLookasideList, FileRecord);
             return Status;
         }
 
@@ -1340,7 +1340,7 @@ WriteAttribute(PDEVICE_EXTENSION Vcb,
             DPRINT1("DRIVER ERROR: Data being written extends past end of file record!\n");
             ReleaseAttributeContext(FoundContext);
             if (FileRecordAllocated)
-                ExFreePoolWithTag(FileRecord, TAG_NTFS);
+                ExFreeToNPagedLookasideList(&Vcb->FileRecLookasideList, FileRecord);
             return STATUS_INVALID_PARAMETER;
         }
 
@@ -1355,7 +1355,7 @@ WriteAttribute(PDEVICE_EXTENSION Vcb,
 
         ReleaseAttributeContext(FoundContext);
         if (FileRecordAllocated)
-            ExFreePoolWithTag(FileRecord, TAG_NTFS);
+            ExFreeToNPagedLookasideList(&Vcb->FileRecLookasideList, FileRecord);
 
         if (NT_SUCCESS(Status))
             *RealLengthWritten = Length;
@@ -1624,9 +1624,7 @@ UpdateFileNameRecord(PDEVICE_EXTENSION Vcb,
            NewAllocationSize,
            CaseSensitive ? "TRUE" : "FALSE");
 
-    MftRecord = ExAllocatePoolWithTag(NonPagedPool,
-                                      Vcb->NtfsInfo.BytesPerFileRecord,
-                                      TAG_NTFS);
+    MftRecord = ExAllocateFromNPagedLookasideList(&Vcb->FileRecLookasideList);
     if (MftRecord == NULL)
     {
         return STATUS_INSUFFICIENT_RESOURCES;
@@ -1635,7 +1633,7 @@ UpdateFileNameRecord(PDEVICE_EXTENSION Vcb,
     Status = ReadFileRecord(Vcb, ParentMFTIndex, MftRecord);
     if (!NT_SUCCESS(Status))
     {
-        ExFreePoolWithTag(MftRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&Vcb->FileRecLookasideList, MftRecord);
         return Status;
     }
 
@@ -1643,7 +1641,7 @@ UpdateFileNameRecord(PDEVICE_EXTENSION Vcb,
     Status = FindAttribute(Vcb, MftRecord, AttributeIndexRoot, L"$I30", 4, &IndexRootCtx, NULL);
     if (!NT_SUCCESS(Status))
     {
-        ExFreePoolWithTag(MftRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&Vcb->FileRecLookasideList, MftRecord);
         return Status;
     }
 
@@ -1651,7 +1649,7 @@ UpdateFileNameRecord(PDEVICE_EXTENSION Vcb,
     if (IndexRecord == NULL)
     {
         ReleaseAttributeContext(IndexRootCtx);
-        ExFreePoolWithTag(MftRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&Vcb->FileRecLookasideList, MftRecord);
         return STATUS_INSUFFICIENT_RESOURCES;
     }
 
@@ -1661,7 +1659,7 @@ UpdateFileNameRecord(PDEVICE_EXTENSION Vcb,
         DPRINT1("ERROR: Failed to read Index Root!\n");
         ExFreePoolWithTag(IndexRecord, TAG_NTFS);
         ReleaseAttributeContext(IndexRootCtx);
-        ExFreePoolWithTag(MftRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&Vcb->FileRecLookasideList, MftRecord);
     }
 
     IndexRoot = (PINDEX_ROOT_ATTRIBUTE)IndexRecord;
@@ -1699,7 +1697,7 @@ UpdateFileNameRecord(PDEVICE_EXTENSION Vcb,
 
     ReleaseAttributeContext(IndexRootCtx);
     ExFreePoolWithTag(IndexRecord, TAG_NTFS);
-    ExFreePoolWithTag(MftRecord, TAG_NTFS);
+    ExFreeToNPagedLookasideList(&Vcb->FileRecLookasideList, MftRecord);
 
     return Status;
 }
@@ -2158,9 +2156,7 @@ NtfsAddFilenameToDirectory(PDEVICE_EXTENSION DeviceExt,
     ULONG NodeSize;
 
     // Allocate memory for the parent directory
-    ParentFileRecord = ExAllocatePoolWithTag(NonPagedPool,
-                                             DeviceExt->NtfsInfo.BytesPerFileRecord,
-                                             TAG_NTFS);
+    ParentFileRecord = ExAllocateFromNPagedLookasideList(&DeviceExt->FileRecLookasideList);
     if (!ParentFileRecord)
     {
         DPRINT1("ERROR: Couldn't allocate memory for file record!\n");
@@ -2171,7 +2167,7 @@ NtfsAddFilenameToDirectory(PDEVICE_EXTENSION DeviceExt,
     Status = ReadFileRecord(DeviceExt, DirectoryMftIndex, ParentFileRecord);
     if (!NT_SUCCESS(Status))
     {
-        ExFreePoolWithTag(ParentFileRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, ParentFileRecord);
         DPRINT1("ERROR: Couldn't read parent directory with index %I64u\n",
                 DirectoryMftIndex);
         return Status;
@@ -2194,7 +2190,7 @@ NtfsAddFilenameToDirectory(PDEVICE_EXTENSION DeviceExt,
     {
         DPRINT1("ERROR: Couldn't find $I30 $INDEX_ROOT attribute for parent directory with MFT #: %I64u!\n",
                 DirectoryMftIndex);
-        ExFreePoolWithTag(ParentFileRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, ParentFileRecord);
         return Status;
     }
 
@@ -2230,7 +2226,7 @@ NtfsAddFilenameToDirectory(PDEVICE_EXTENSION DeviceExt,
     {
         DPRINT1("ERROR: Couldn't allocate memory for index root attribute!\n");
         ReleaseAttributeContext(IndexRootContext);
-        ExFreePoolWithTag(ParentFileRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, ParentFileRecord);
         return STATUS_INSUFFICIENT_RESOURCES;
     }
 
@@ -2241,7 +2237,7 @@ NtfsAddFilenameToDirectory(PDEVICE_EXTENSION DeviceExt,
         DPRINT1("ERROR: Couln't read index root attribute for Mft index #%I64u\n", DirectoryMftIndex);
         ReleaseAttributeContext(IndexRootContext);
         ExFreePoolWithTag(I30IndexRoot, TAG_NTFS);
-        ExFreePoolWithTag(ParentFileRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, ParentFileRecord);
         return Status;
     }
 
@@ -2256,7 +2252,7 @@ NtfsAddFilenameToDirectory(PDEVICE_EXTENSION DeviceExt,
         DPRINT1("ERROR: Failed to create B-Tree from Index!\n");
         ReleaseAttributeContext(IndexRootContext);
         ExFreePoolWithTag(I30IndexRoot, TAG_NTFS);
-        ExFreePoolWithTag(ParentFileRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, ParentFileRecord);
         return Status;
     }
 
@@ -2280,7 +2276,7 @@ NtfsAddFilenameToDirectory(PDEVICE_EXTENSION DeviceExt,
         DestroyBTree(NewTree);
         ReleaseAttributeContext(IndexRootContext);
         ExFreePoolWithTag(I30IndexRoot, TAG_NTFS);
-        ExFreePoolWithTag(ParentFileRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, ParentFileRecord);
         return Status;
     }
 
@@ -2329,7 +2325,7 @@ NtfsAddFilenameToDirectory(PDEVICE_EXTENSION DeviceExt,
         DestroyBTree(NewTree);
         ReleaseAttributeContext(IndexRootContext);
         ExFreePoolWithTag(I30IndexRoot, TAG_NTFS);
-        ExFreePoolWithTag(ParentFileRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, ParentFileRecord);
         return Status;
     }
 
@@ -2341,7 +2337,7 @@ NtfsAddFilenameToDirectory(PDEVICE_EXTENSION DeviceExt,
         DestroyBTree(NewTree);
         ReleaseAttributeContext(IndexRootContext);
         ExFreePoolWithTag(I30IndexRoot, TAG_NTFS);
-        ExFreePoolWithTag(ParentFileRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, ParentFileRecord);
         return Status;
     }
 
@@ -2390,7 +2386,7 @@ NtfsAddFilenameToDirectory(PDEVICE_EXTENSION DeviceExt,
             DestroyBTree(NewTree);
             ReleaseAttributeContext(IndexRootContext);
             ExFreePoolWithTag(I30IndexRoot, TAG_NTFS);
-            ExFreePoolWithTag(ParentFileRecord, TAG_NTFS);
+            ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, ParentFileRecord);
             return Status;
         }
 
@@ -2402,7 +2398,7 @@ NtfsAddFilenameToDirectory(PDEVICE_EXTENSION DeviceExt,
             DestroyBTree(NewTree);
             ReleaseAttributeContext(IndexRootContext);
             ExFreePoolWithTag(I30IndexRoot, TAG_NTFS);
-            ExFreePoolWithTag(ParentFileRecord, TAG_NTFS);
+            ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, ParentFileRecord);
             return Status;
         }
 
@@ -2444,7 +2440,7 @@ NtfsAddFilenameToDirectory(PDEVICE_EXTENSION DeviceExt,
         DestroyBTree(NewTree);
         ReleaseAttributeContext(IndexRootContext);
         ExFreePoolWithTag(I30IndexRoot, TAG_NTFS);
-        ExFreePoolWithTag(ParentFileRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, ParentFileRecord);
         return Status;
     }
 
@@ -2471,7 +2467,7 @@ NtfsAddFilenameToDirectory(PDEVICE_EXTENSION DeviceExt,
             ExFreePoolWithTag(NewIndexRoot, TAG_NTFS);
             ReleaseAttributeContext(IndexRootContext);
             ExFreePoolWithTag(I30IndexRoot, TAG_NTFS);
-            ExFreePoolWithTag(ParentFileRecord, TAG_NTFS);
+            ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, ParentFileRecord);
             DPRINT1("ERROR: Unable to set resident attribute length!\n");
             return Status;
         }
@@ -2484,7 +2480,7 @@ NtfsAddFilenameToDirectory(PDEVICE_EXTENSION DeviceExt,
     if (!NT_SUCCESS(Status))
     {
         DPRINT1("ERROR: Failed to update file record of directory with index: %llx\n", DirectoryMftIndex);
-        ExFreePoolWithTag(ParentFileRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, ParentFileRecord);
         ExFreePoolWithTag(NewIndexRoot, TAG_NTFS);
         ReleaseAttributeContext(IndexRootContext);
         ExFreePoolWithTag(I30IndexRoot, TAG_NTFS);
@@ -2505,7 +2501,7 @@ NtfsAddFilenameToDirectory(PDEVICE_EXTENSION DeviceExt,
         ExFreePoolWithTag(NewIndexRoot, TAG_NTFS);
         ReleaseAttributeContext(IndexRootContext);
         ExFreePoolWithTag(I30IndexRoot, TAG_NTFS);
-        ExFreePoolWithTag(ParentFileRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, ParentFileRecord);
         return Status;
     }
 
@@ -2539,7 +2535,7 @@ NtfsAddFilenameToDirectory(PDEVICE_EXTENSION DeviceExt,
     ExFreePoolWithTag(NewIndexRoot, TAG_NTFS);
     ReleaseAttributeContext(IndexRootContext);
     ExFreePoolWithTag(I30IndexRoot, TAG_NTFS);
-    ExFreePoolWithTag(ParentFileRecord, TAG_NTFS);
+    ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, ParentFileRecord);
 
     return Status;
 }
@@ -2668,7 +2664,7 @@ UpdateMftMirror(PNTFS_VCB Vcb)
     ULONG LengthWritten;
 
     // Allocate memory for the Mft mirror file record
-    MirrorFileRecord = ExAllocatePoolWithTag(NonPagedPool, Vcb->NtfsInfo.BytesPerFileRecord, TAG_NTFS);
+    MirrorFileRecord = ExAllocateFromNPagedLookasideList(&Vcb->FileRecLookasideList);
     if (!MirrorFileRecord)
     {
         DPRINT1("Error: Failed to allocate memory for $MFTMirr!\n");
@@ -2680,7 +2676,7 @@ UpdateMftMirror(PNTFS_VCB Vcb)
     if (!NT_SUCCESS(Status))
     {
         DPRINT1("ERROR: Failed to read $MFTMirr!\n");
-        ExFreePoolWithTag(MirrorFileRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&Vcb->FileRecLookasideList, MirrorFileRecord);
         return Status;
     }
 
@@ -2689,7 +2685,7 @@ UpdateMftMirror(PNTFS_VCB Vcb)
     if (!NT_SUCCESS(Status))
     {
         DPRINT1("ERROR: Couldn't find $DATA attribute!\n");
-        ExFreePoolWithTag(MirrorFileRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&Vcb->FileRecLookasideList, MirrorFileRecord);
         return Status;
     }
 
@@ -2699,7 +2695,7 @@ UpdateMftMirror(PNTFS_VCB Vcb)
     {
         DPRINT1("ERROR: Couldn't find $DATA attribute!\n");
         ReleaseAttributeContext(MirrDataContext);
-        ExFreePoolWithTag(MirrorFileRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&Vcb->FileRecLookasideList, MirrorFileRecord);
         return Status;
     }
 
@@ -2715,7 +2711,7 @@ UpdateMftMirror(PNTFS_VCB Vcb)
         DPRINT1("Error: Couldn't allocate memory for $DATA buffer!\n");
         ReleaseAttributeContext(MftDataContext);
         ReleaseAttributeContext(MirrDataContext);
-        ExFreePoolWithTag(MirrorFileRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&Vcb->FileRecLookasideList, MirrorFileRecord);
         return STATUS_INSUFFICIENT_RESOURCES;
     }
 
@@ -2729,7 +2725,7 @@ UpdateMftMirror(PNTFS_VCB Vcb)
         ReleaseAttributeContext(MftDataContext);
         ReleaseAttributeContext(MirrDataContext);
         ExFreePoolWithTag(DataBuffer, TAG_NTFS);
-        ExFreePoolWithTag(MirrorFileRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&Vcb->FileRecLookasideList, MirrorFileRecord);
         return STATUS_UNSUCCESSFUL;
     }
 
@@ -2750,7 +2746,7 @@ UpdateMftMirror(PNTFS_VCB Vcb)
     ReleaseAttributeContext(MftDataContext);
     ReleaseAttributeContext(MirrDataContext);
     ExFreePoolWithTag(DataBuffer, TAG_NTFS);
-    ExFreePoolWithTag(MirrorFileRecord, TAG_NTFS);
+    ExFreeToNPagedLookasideList(&Vcb->FileRecLookasideList, MirrorFileRecord);
 
     return Status;
 }
@@ -3116,9 +3112,7 @@ NtfsFindMftRecord(PDEVICE_EXTENSION Vcb,
            CaseSensitive ? "TRUE" : "FALSE",
            OutMFTIndex);
 
-    MftRecord = ExAllocatePoolWithTag(NonPagedPool,
-                                      Vcb->NtfsInfo.BytesPerFileRecord,
-                                      TAG_NTFS);
+    MftRecord = ExAllocateFromNPagedLookasideList(&Vcb->FileRecLookasideList);
     if (MftRecord == NULL)
     {
         return STATUS_INSUFFICIENT_RESOURCES;
@@ -3127,7 +3121,7 @@ NtfsFindMftRecord(PDEVICE_EXTENSION Vcb,
     Status = ReadFileRecord(Vcb, MFTIndex, MftRecord);
     if (!NT_SUCCESS(Status))
     {
-        ExFreePoolWithTag(MftRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&Vcb->FileRecLookasideList, MftRecord);
         return Status;
     }
 
@@ -3135,7 +3129,7 @@ NtfsFindMftRecord(PDEVICE_EXTENSION Vcb,
     Status = FindAttribute(Vcb, MftRecord, AttributeIndexRoot, L"$I30", 4, &IndexRootCtx, NULL);
     if (!NT_SUCCESS(Status))
     {
-        ExFreePoolWithTag(MftRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&Vcb->FileRecLookasideList, MftRecord);
         return Status;
     }
 
@@ -3143,7 +3137,7 @@ NtfsFindMftRecord(PDEVICE_EXTENSION Vcb,
     if (IndexRecord == NULL)
     {
         ReleaseAttributeContext(IndexRootCtx);
-        ExFreePoolWithTag(MftRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&Vcb->FileRecLookasideList, MftRecord);
         return STATUS_INSUFFICIENT_RESOURCES;
     }
 
@@ -3170,7 +3164,7 @@ NtfsFindMftRecord(PDEVICE_EXTENSION Vcb,
                                 OutMFTIndex);
 
     ExFreePoolWithTag(IndexRecord, TAG_NTFS);
-    ExFreePoolWithTag(MftRecord, TAG_NTFS);
+    ExFreeToNPagedLookasideList(&Vcb->FileRecLookasideList, MftRecord);
 
     return Status;
 }
@@ -3213,7 +3207,7 @@ NtfsLookupFileAt(PDEVICE_EXTENSION Vcb,
         FsRtlDissectName(Current, &Current, &Remaining);
     }
 
-    *FileRecord = ExAllocatePoolWithTag(NonPagedPool, Vcb->NtfsInfo.BytesPerFileRecord, TAG_NTFS);
+    *FileRecord = ExAllocateFromNPagedLookasideList(&Vcb->FileRecLookasideList);
     if (*FileRecord == NULL)
     {
         DPRINT("NtfsLookupFileAt: Can't allocate MFT record\n");
@@ -3224,7 +3218,7 @@ NtfsLookupFileAt(PDEVICE_EXTENSION Vcb,
     if (!NT_SUCCESS(Status))
     {
         DPRINT("NtfsLookupFileAt: Can't read MFT record\n");
-        ExFreePoolWithTag(*FileRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&Vcb->FileRecLookasideList, *FileRecord);
         return Status;
     }
 
@@ -3328,7 +3322,7 @@ NtfsFindFileAt(PDEVICE_EXTENSION Vcb,
         return Status;
     }
 
-    *FileRecord = ExAllocatePoolWithTag(NonPagedPool, Vcb->NtfsInfo.BytesPerFileRecord, TAG_NTFS);
+    *FileRecord = ExAllocateFromNPagedLookasideList(&Vcb->FileRecLookasideList);
     if (*FileRecord == NULL)
     {
         DPRINT("NtfsFindFileAt: Can't allocate MFT record\n");
@@ -3339,7 +3333,7 @@ NtfsFindFileAt(PDEVICE_EXTENSION Vcb,
     if (!NT_SUCCESS(Status))
     {
         DPRINT("NtfsFindFileAt: Can't read MFT record\n");
-        ExFreePoolWithTag(*FileRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&Vcb->FileRecLookasideList, *FileRecord);
         return Status;
     }
 
index 0b64b72..7b88f7b 100644 (file)
@@ -116,6 +116,8 @@ typedef struct
 
     NTFS_INFO NtfsInfo;
 
+    NPAGED_LOOKASIDE_LIST FileRecLookasideList;
+
     ULONG MftDataOffset;
     ULONG Flags;
     ULONG OpenHandleCount;
index 038caa4..fc3a62c 100644 (file)
@@ -79,7 +79,7 @@ NtfsReadFile(PDEVICE_EXTENSION DeviceExt,
         return STATUS_NOT_IMPLEMENTED;
     }
 
-    FileRecord = ExAllocatePoolWithTag(NonPagedPool, DeviceExt->NtfsInfo.BytesPerFileRecord, TAG_NTFS);
+    FileRecord = ExAllocateFromNPagedLookasideList(&DeviceExt->FileRecLookasideList);
     if (FileRecord == NULL)
     {
         DPRINT1("Not enough memory!\n");
@@ -90,7 +90,7 @@ NtfsReadFile(PDEVICE_EXTENSION DeviceExt,
     if (!NT_SUCCESS(Status))
     {
         DPRINT1("Can't find record!\n");
-        ExFreePoolWithTag(FileRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, FileRecord);
         return Status;
     }
 
@@ -122,7 +122,7 @@ NtfsReadFile(PDEVICE_EXTENSION DeviceExt,
         FindCloseAttribute(&Context);
 
         ReleaseAttributeContext(DataContext);
-        ExFreePoolWithTag(FileRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, FileRecord);
         return Status;
     }
 
@@ -131,7 +131,7 @@ NtfsReadFile(PDEVICE_EXTENSION DeviceExt,
     {
         DPRINT1("Reading beyond stream end!\n");
         ReleaseAttributeContext(DataContext);
-        ExFreePoolWithTag(FileRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, FileRecord);
         return STATUS_END_OF_FILE;
     }
 
@@ -159,7 +159,7 @@ NtfsReadFile(PDEVICE_EXTENSION DeviceExt,
         {
             DPRINT1("Not enough memory!\n");
             ReleaseAttributeContext(DataContext);
-            ExFreePoolWithTag(FileRecord, TAG_NTFS);
+            ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, FileRecord);
             return STATUS_INSUFFICIENT_RESOURCES;
         }
         AllocatedBuffer = TRUE;
@@ -171,7 +171,7 @@ NtfsReadFile(PDEVICE_EXTENSION DeviceExt,
     {
         DPRINT1("Read failure!\n");
         ReleaseAttributeContext(DataContext);
-        ExFreePoolWithTag(FileRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, FileRecord);
         if (AllocatedBuffer)
         {
             ExFreePoolWithTag(ReadBuffer, TAG_NTFS);
@@ -180,7 +180,7 @@ NtfsReadFile(PDEVICE_EXTENSION DeviceExt,
     }
 
     ReleaseAttributeContext(DataContext);
-    ExFreePoolWithTag(FileRecord, TAG_NTFS);
+    ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, FileRecord);
 
     *LengthRead = ToRead;
 
@@ -355,7 +355,7 @@ NTSTATUS NtfsWriteFile(PDEVICE_EXTENSION DeviceExt,
     }
 
     // allocate non-paged memory for the FILE_RECORD_HEADER
-    FileRecord = ExAllocatePoolWithTag(NonPagedPool, DeviceExt->NtfsInfo.BytesPerFileRecord, TAG_NTFS);
+    FileRecord = ExAllocateFromNPagedLookasideList(&DeviceExt->FileRecLookasideList);
     if (FileRecord == NULL)
     {
         DPRINT1("Not enough memory! Can't write %wS!\n", Fcb->PathName);
@@ -369,7 +369,7 @@ NTSTATUS NtfsWriteFile(PDEVICE_EXTENSION DeviceExt,
     {
         // We couldn't get the file's record. Free the memory and return the error
         DPRINT1("Can't find record for %wS!\n", Fcb->ObjectName);
-        ExFreePoolWithTag(FileRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, FileRecord);
         return Status;
     }
 
@@ -408,7 +408,7 @@ NTSTATUS NtfsWriteFile(PDEVICE_EXTENSION DeviceExt,
         FindCloseAttribute(&Context);
 
         ReleaseAttributeContext(DataContext);
-        ExFreePoolWithTag(FileRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, FileRecord);
         return Status;
     }
 
@@ -437,7 +437,7 @@ NTSTATUS NtfsWriteFile(PDEVICE_EXTENSION DeviceExt,
             if (!NT_SUCCESS(Status))
             {
                 ReleaseAttributeContext(DataContext);
-                ExFreePoolWithTag(FileRecord, TAG_NTFS);
+                ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, FileRecord);
                 *LengthWritten = 0;
                 return Status;
             }
@@ -469,7 +469,7 @@ NTSTATUS NtfsWriteFile(PDEVICE_EXTENSION DeviceExt,
         {
             // TODO - just fail for now
             ReleaseAttributeContext(DataContext);
-            ExFreePoolWithTag(FileRecord, TAG_NTFS);
+            ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, FileRecord);
             *LengthWritten = 0;
             return STATUS_ACCESS_DENIED;
         }
@@ -485,7 +485,7 @@ NTSTATUS NtfsWriteFile(PDEVICE_EXTENSION DeviceExt,
     {
         DPRINT1("Write failure!\n");
         ReleaseAttributeContext(DataContext);
-        ExFreePoolWithTag(FileRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, FileRecord);
 
         return Status;
     }
@@ -499,7 +499,7 @@ NTSTATUS NtfsWriteFile(PDEVICE_EXTENSION DeviceExt,
     }
 
     ReleaseAttributeContext(DataContext);
-    ExFreePoolWithTag(FileRecord, TAG_NTFS);
+    ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, FileRecord);
 
     return Status;
 }
index 6b7e598..565a601 100644 (file)
@@ -47,9 +47,7 @@ NtfsGetFreeClusters(PDEVICE_EXTENSION DeviceExt)
 
     DPRINT1("NtfsGetFreeClusters(%p)\n", DeviceExt);
 
-    BitmapRecord = ExAllocatePoolWithTag(NonPagedPool,
-                                         DeviceExt->NtfsInfo.BytesPerFileRecord,
-                                         TAG_NTFS);
+    BitmapRecord = ExAllocateFromNPagedLookasideList(&DeviceExt->FileRecLookasideList);
     if (BitmapRecord == NULL)
     {
         return 0;
@@ -58,14 +56,14 @@ NtfsGetFreeClusters(PDEVICE_EXTENSION DeviceExt)
     Status = ReadFileRecord(DeviceExt, NTFS_FILE_BITMAP, BitmapRecord);
     if (!NT_SUCCESS(Status))
     {
-        ExFreePoolWithTag(BitmapRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, BitmapRecord);
         return 0;
     }
 
     Status = FindAttribute(DeviceExt, BitmapRecord, AttributeData, L"", 0, &DataContext, NULL);
     if (!NT_SUCCESS(Status))
     {
-        ExFreePoolWithTag(BitmapRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, BitmapRecord);
         return 0;
     }
 
@@ -75,7 +73,7 @@ NtfsGetFreeClusters(PDEVICE_EXTENSION DeviceExt)
     if (BitmapData == NULL)
     {
         ReleaseAttributeContext(DataContext);
-        ExFreePoolWithTag(BitmapRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, BitmapRecord);
         return 0;
     }
 
@@ -94,7 +92,7 @@ NtfsGetFreeClusters(PDEVICE_EXTENSION DeviceExt)
     FreeClusters = RtlNumberOfClearBits(&Bitmap);
 
     ExFreePoolWithTag(BitmapData, TAG_NTFS);
-    ExFreePoolWithTag(BitmapRecord, TAG_NTFS);
+    ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, BitmapRecord);
 
     return FreeClusters;
 }
@@ -122,9 +120,7 @@ NtfsAllocateClusters(PDEVICE_EXTENSION DeviceExt,
 
     DPRINT1("NtfsAllocateClusters(%p, %lu, %lu, %p, %p)\n", DeviceExt, FirstDesiredCluster, DesiredClusters, FirstAssignedCluster, AssignedClusters);
 
-    BitmapRecord = ExAllocatePoolWithTag(NonPagedPool,
-                                         DeviceExt->NtfsInfo.BytesPerFileRecord,
-                                         TAG_NTFS);
+    BitmapRecord = ExAllocateFromNPagedLookasideList(&DeviceExt->FileRecLookasideList);
     if (BitmapRecord == NULL)
     {
         return STATUS_INSUFFICIENT_RESOURCES;
@@ -133,14 +129,14 @@ NtfsAllocateClusters(PDEVICE_EXTENSION DeviceExt,
     Status = ReadFileRecord(DeviceExt, NTFS_FILE_BITMAP, BitmapRecord);
     if (!NT_SUCCESS(Status))
     {
-        ExFreePoolWithTag(BitmapRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, BitmapRecord);
         return Status;
     }
 
     Status = FindAttribute(DeviceExt, BitmapRecord, AttributeData, L"", 0, &DataContext, NULL);
     if (!NT_SUCCESS(Status))
     {
-        ExFreePoolWithTag(BitmapRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, BitmapRecord);
         return Status;
     }
 
@@ -151,7 +147,7 @@ NtfsAllocateClusters(PDEVICE_EXTENSION DeviceExt,
     if (BitmapData == NULL)
     {
         ReleaseAttributeContext(DataContext);
-        ExFreePoolWithTag(BitmapRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, BitmapRecord);
         return  STATUS_INSUFFICIENT_RESOURCES;
     }
 
@@ -169,7 +165,7 @@ NtfsAllocateClusters(PDEVICE_EXTENSION DeviceExt,
         ReleaseAttributeContext(DataContext);
 
         ExFreePoolWithTag(BitmapData, TAG_NTFS);
-        ExFreePoolWithTag(BitmapRecord, TAG_NTFS);
+        ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, BitmapRecord);
         return STATUS_DISK_FULL;
     }
     
@@ -201,7 +197,7 @@ NtfsAllocateClusters(PDEVICE_EXTENSION DeviceExt,
     ReleaseAttributeContext(DataContext);
 
     ExFreePoolWithTag(BitmapData, TAG_NTFS);
-    ExFreePoolWithTag(BitmapRecord, TAG_NTFS);
+    ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, BitmapRecord);
 
     return Status;
 }