From 216a2cae733be32a80c1ce8281fc08c9bbea27b9 Mon Sep 17 00:00:00 2001 From: Pierre Schweitzer Date: Sun, 31 Dec 2017 14:14:24 +0100 Subject: [PATCH] [NTFS] Use LookasideList allocations for FILE_RECORD_HEADER. 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 | 14 ++-- drivers/filesystems/ntfs/create.c | 38 ++++------ drivers/filesystems/ntfs/dirctl.c | 4 +- drivers/filesystems/ntfs/fcb.c | 27 ++++--- drivers/filesystems/ntfs/finfo.c | 22 +++--- drivers/filesystems/ntfs/fsctl.c | 55 ++++++++------- drivers/filesystems/ntfs/mft.c | 110 ++++++++++++++--------------- drivers/filesystems/ntfs/ntfs.h | 2 + drivers/filesystems/ntfs/rw.c | 28 ++++---- drivers/filesystems/ntfs/volinfo.c | 26 +++---- 10 files changed, 156 insertions(+), 170 deletions(-) diff --git a/drivers/filesystems/ntfs/attrib.c b/drivers/filesystems/ntfs/attrib.c index 846c16da808..1a04b763a2a 100644 --- a/drivers/filesystems/ntfs/attrib.c +++ b/drivers/filesystems/ntfs/attrib.c @@ -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 diff --git a/drivers/filesystems/ntfs/create.c b/drivers/filesystems/ntfs/create.c index f37a9518cda..0ce5771ae3c 100644 --- a/drivers/filesystems/ntfs/create.c +++ b/drivers/filesystems/ntfs/create.c @@ -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; } diff --git a/drivers/filesystems/ntfs/dirctl.c b/drivers/filesystems/ntfs/dirctl.c index ab784fce3d5..3c8d3cdb9a5 100644 --- a/drivers/filesystems/ntfs/dirctl.c +++ b/drivers/filesystems/ntfs/dirctl.c @@ -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) diff --git a/drivers/filesystems/ntfs/fcb.c b/drivers/filesystems/ntfs/fcb.c index f8057ee2ff0..8a4f4605460 100644 --- a/drivers/filesystems/ntfs/fcb.c +++ b/drivers/filesystems/ntfs/fcb.c @@ -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; } diff --git a/drivers/filesystems/ntfs/finfo.c b/drivers/filesystems/ntfs/finfo.c index fb7df5f4d4c..9a1b44b3882 100644 --- a/drivers/filesystems/ntfs/finfo.c +++ b/drivers/filesystems/ntfs/finfo.c @@ -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; } diff --git a/drivers/filesystems/ntfs/fsctl.c b/drivers/filesystems/ntfs/fsctl.c index 76337ec4482..87858e07c05 100644 --- a/drivers/filesystems/ntfs/fsctl.c +++ b/drivers/filesystems/ntfs/fsctl.c @@ -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; } diff --git a/drivers/filesystems/ntfs/mft.c b/drivers/filesystems/ntfs/mft.c index 8594f79e56c..4724e8d899b 100644 --- a/drivers/filesystems/ntfs/mft.c +++ b/drivers/filesystems/ntfs/mft.c @@ -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; } diff --git a/drivers/filesystems/ntfs/ntfs.h b/drivers/filesystems/ntfs/ntfs.h index 0b64b7247ed..7b88f7b7c49 100644 --- a/drivers/filesystems/ntfs/ntfs.h +++ b/drivers/filesystems/ntfs/ntfs.h @@ -116,6 +116,8 @@ typedef struct NTFS_INFO NtfsInfo; + NPAGED_LOOKASIDE_LIST FileRecLookasideList; + ULONG MftDataOffset; ULONG Flags; ULONG OpenHandleCount; diff --git a/drivers/filesystems/ntfs/rw.c b/drivers/filesystems/ntfs/rw.c index 038caa4516d..fc3a62c7ccf 100644 --- a/drivers/filesystems/ntfs/rw.c +++ b/drivers/filesystems/ntfs/rw.c @@ -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; } diff --git a/drivers/filesystems/ntfs/volinfo.c b/drivers/filesystems/ntfs/volinfo.c index 6b7e598819a..565a6012bca 100644 --- a/drivers/filesystems/ntfs/volinfo.c +++ b/drivers/filesystems/ntfs/volinfo.c @@ -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; }