mirror of
https://github.com/reactos/reactos.git
synced 2024-12-28 01:55:19 +00:00
[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
This commit is contained in:
parent
3ddf44ff10
commit
216a2cae73
10 changed files with 156 additions and 170 deletions
|
@ -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
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -116,6 +116,8 @@ typedef struct
|
|||
|
||||
NTFS_INFO NtfsInfo;
|
||||
|
||||
NPAGED_LOOKASIDE_LIST FileRecLookasideList;
|
||||
|
||||
ULONG MftDataOffset;
|
||||
ULONG Flags;
|
||||
ULONG OpenHandleCount;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue