[FASTFAT]

Thomas->happiness++;

svn path=/trunk/; revision=73808
This commit is contained in:
Pierre Schweitzer 2017-02-17 11:38:05 +00:00
parent 57ec8a7319
commit 990af47b16
2 changed files with 25 additions and 23 deletions

View file

@ -97,7 +97,7 @@ VfatGetStandardInformation(
StandardInfo->Directory = FALSE; StandardInfo->Directory = FALSE;
} }
StandardInfo->NumberOfLinks = 1; StandardInfo->NumberOfLinks = 1;
StandardInfo->DeletePending = BooleanFlagOn(FCB->Flags, FCB_DELETE_PENDING) ? TRUE : FALSE; StandardInfo->DeletePending = BooleanFlagOn(FCB->Flags, FCB_DELETE_PENDING);
*BufferLength -= sizeof(FILE_STANDARD_INFORMATION); *BufferLength -= sizeof(FILE_STANDARD_INFORMATION);
return STATUS_SUCCESS; return STATUS_SUCCESS;
@ -165,7 +165,7 @@ VfatSetBasicInformation(
/* Check volume label bit */ /* Check volume label bit */
ASSERT(0 == (*FCB->Attributes & _A_VOLID)); ASSERT(0 == (*FCB->Attributes & _A_VOLID));
if (FCB->Flags & FCB_IS_FATX_ENTRY) if (BooleanFlagOn(FCB->Flags, FCB_IS_FATX_ENTRY))
{ {
if (BasicInfo->CreationTime.QuadPart != 0 && BasicInfo->CreationTime.QuadPart != -1) if (BasicInfo->CreationTime.QuadPart != 0 && BasicInfo->CreationTime.QuadPart != -1)
{ {
@ -254,7 +254,7 @@ VfatGetBasicInformation(
if (*BufferLength < sizeof(FILE_BASIC_INFORMATION)) if (*BufferLength < sizeof(FILE_BASIC_INFORMATION))
return STATUS_BUFFER_OVERFLOW; return STATUS_BUFFER_OVERFLOW;
if (FCB->Flags & FCB_IS_FATX_ENTRY) if (BooleanFlagOn(FCB->Flags, FCB_IS_FATX_ENTRY))
{ {
FsdDosDateTimeToSystemTime(DeviceExt, FsdDosDateTimeToSystemTime(DeviceExt,
FCB->entry.FatX.CreationDate, FCB->entry.FatX.CreationDate,
@ -331,7 +331,7 @@ VfatSetDispositionInformation(
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
if (FCB->Flags & FCB_DELETE_PENDING) if (BooleanFlagOn(FCB->Flags, FCB_DELETE_PENDING))
{ {
/* stream already marked for deletion. just update the file object */ /* stream already marked for deletion. just update the file object */
FileObject->DeletePending = TRUE; FileObject->DeletePending = TRUE;
@ -1043,7 +1043,7 @@ VfatGetNetworkOpenInformation(
if (*BufferLength < sizeof(FILE_NETWORK_OPEN_INFORMATION)) if (*BufferLength < sizeof(FILE_NETWORK_OPEN_INFORMATION))
return(STATUS_BUFFER_OVERFLOW); return(STATUS_BUFFER_OVERFLOW);
if (Fcb->Flags & FCB_IS_FATX_ENTRY) if (BooleanFlagOn(Fcb->Flags, FCB_IS_FATX_ENTRY))
{ {
FsdDosDateTimeToSystemTime(DeviceExt, FsdDosDateTimeToSystemTime(DeviceExt,
Fcb->entry.FatX.CreationDate, Fcb->entry.FatX.CreationDate,
@ -1196,7 +1196,7 @@ UpdateFileSize(
} }
if (!vfatFCBIsDirectory(Fcb)) if (!vfatFCBIsDirectory(Fcb))
{ {
if (Fcb->Flags & FCB_IS_FATX_ENTRY) if (BooleanFlagOn(Fcb->Flags, FCB_IS_FATX_ENTRY))
Fcb->entry.FatX.FileSize = Size; Fcb->entry.FatX.FileSize = Size;
else else
Fcb->entry.Fat.FileSize = Size; Fcb->entry.Fat.FileSize = Size;
@ -1221,12 +1221,12 @@ VfatSetAllocationSizeInformation(
ULONG ClusterSize = DeviceExt->FatInfo.BytesPerCluster; ULONG ClusterSize = DeviceExt->FatInfo.BytesPerCluster;
ULONG NewSize = AllocationSize->u.LowPart; ULONG NewSize = AllocationSize->u.LowPart;
ULONG NCluster; ULONG NCluster;
BOOLEAN AllocSizeChanged = FALSE; BOOLEAN AllocSizeChanged = FALSE, IsFatX = BooleanFlagOn(Fcb->Flags, FCB_IS_FATX_ENTRY);
DPRINT("VfatSetAllocationSizeInformation(File <%wZ>, AllocationSize %d %u)\n", DPRINT("VfatSetAllocationSizeInformation(File <%wZ>, AllocationSize %d %u)\n",
&Fcb->PathNameU, AllocationSize->HighPart, AllocationSize->LowPart); &Fcb->PathNameU, AllocationSize->HighPart, AllocationSize->LowPart);
if (Fcb->Flags & FCB_IS_FATX_ENTRY) if (IsFatX)
OldSize = Fcb->entry.FatX.FileSize; OldSize = Fcb->entry.FatX.FileSize;
else else
OldSize = Fcb->entry.Fat.FileSize; OldSize = Fcb->entry.Fat.FileSize;
@ -1278,7 +1278,7 @@ VfatSetAllocationSizeInformation(
return STATUS_DISK_FULL; return STATUS_DISK_FULL;
} }
if (Fcb->Flags & FCB_IS_FATX_ENTRY) if (IsFatX)
{ {
Fcb->entry.FatX.FirstCluster = FirstCluster; Fcb->entry.FatX.FirstCluster = FirstCluster;
} }
@ -1378,7 +1378,7 @@ VfatSetAllocationSizeInformation(
} }
else else
{ {
if (Fcb->Flags & FCB_IS_FATX_ENTRY) if (IsFatX)
{ {
Fcb->entry.FatX.FirstCluster = 0; Fcb->entry.FatX.FirstCluster = 0;
} }
@ -1454,7 +1454,7 @@ VfatQueryInformation(
SystemBuffer = IrpContext->Irp->AssociatedIrp.SystemBuffer; SystemBuffer = IrpContext->Irp->AssociatedIrp.SystemBuffer;
BufferLength = IrpContext->Stack->Parameters.QueryFile.Length; BufferLength = IrpContext->Stack->Parameters.QueryFile.Length;
if (!(FCB->Flags & FCB_IS_PAGE_FILE)) if (!BooleanFlagOn(FCB->Flags, FCB_IS_PAGE_FILE))
{ {
if (!ExAcquireResourceSharedLite(&FCB->MainResource, if (!ExAcquireResourceSharedLite(&FCB->MainResource,
BooleanFlagOn(IrpContext->Flags, IRPCONTEXT_CANWAIT))) BooleanFlagOn(IrpContext->Flags, IRPCONTEXT_CANWAIT)))
@ -1532,7 +1532,7 @@ VfatQueryInformation(
Status = STATUS_INVALID_PARAMETER; Status = STATUS_INVALID_PARAMETER;
} }
if (!(FCB->Flags & FCB_IS_PAGE_FILE)) if (!BooleanFlagOn(FCB->Flags, FCB_IS_PAGE_FILE))
{ {
ExReleaseResourceLite(&FCB->MainResource); ExReleaseResourceLite(&FCB->MainResource);
} }
@ -1607,7 +1607,7 @@ VfatSetInformation(
} }
} }
if (!(FCB->Flags & FCB_IS_PAGE_FILE)) if (!BooleanFlagOn(FCB->Flags, FCB_IS_PAGE_FILE))
{ {
if (!ExAcquireResourceExclusiveLite(&FCB->MainResource, if (!ExAcquireResourceExclusiveLite(&FCB->MainResource,
BooleanFlagOn(IrpContext->Flags, IRPCONTEXT_CANWAIT))) BooleanFlagOn(IrpContext->Flags, IRPCONTEXT_CANWAIT)))
@ -1662,7 +1662,7 @@ VfatSetInformation(
Status = STATUS_NOT_SUPPORTED; Status = STATUS_NOT_SUPPORTED;
} }
if (!(FCB->Flags & FCB_IS_PAGE_FILE)) if (!BooleanFlagOn(FCB->Flags, FCB_IS_PAGE_FILE))
{ {
ExReleaseResourceLite(&FCB->MainResource); ExReleaseResourceLite(&FCB->MainResource);
} }

View file

@ -547,7 +547,7 @@ VfatRead(
LARGE_INTEGER ByteOffset; LARGE_INTEGER ByteOffset;
PVOID Buffer; PVOID Buffer;
ULONG BytesPerSector; ULONG BytesPerSector;
BOOLEAN PagingIo, CanWait; BOOLEAN PagingIo, CanWait, IsVolume;
ASSERT(IrpContext); ASSERT(IrpContext);
@ -586,6 +586,7 @@ VfatRead(
BytesPerSector = IrpContext->DeviceExt->FatInfo.BytesPerSector; BytesPerSector = IrpContext->DeviceExt->FatInfo.BytesPerSector;
PagingIo = BooleanFlagOn(IrpContext->Irp->Flags, IRP_PAGING_IO); PagingIo = BooleanFlagOn(IrpContext->Irp->Flags, IRP_PAGING_IO);
CanWait = BooleanFlagOn(IrpContext->Flags, IRPCONTEXT_CANWAIT); CanWait = BooleanFlagOn(IrpContext->Flags, IRPCONTEXT_CANWAIT);
IsVolume = BooleanFlagOn(Fcb->Flags, FCB_IS_VOLUME);
/* fail if file is a directory and no paged read */ /* fail if file is a directory and no paged read */
if (*Fcb->Attributes & FILE_ATTRIBUTE_DIRECTORY && !PagingIo) if (*Fcb->Attributes & FILE_ATTRIBUTE_DIRECTORY && !PagingIo)
@ -596,7 +597,7 @@ VfatRead(
DPRINT("'%wZ', Offset: %u, Length %u\n", &Fcb->PathNameU, ByteOffset.u.LowPart, Length); DPRINT("'%wZ', Offset: %u, Length %u\n", &Fcb->PathNameU, ByteOffset.u.LowPart, Length);
if (ByteOffset.u.HighPart && !(Fcb->Flags & FCB_IS_VOLUME)) if (ByteOffset.u.HighPart && !IsVolume)
{ {
Status = STATUS_INVALID_PARAMETER; Status = STATUS_INVALID_PARAMETER;
goto ByeBye; goto ByeBye;
@ -616,7 +617,7 @@ VfatRead(
goto ByeBye; goto ByeBye;
} }
if (IrpContext->Irp->Flags & (IRP_PAGING_IO | IRP_NOCACHE) || (Fcb->Flags & FCB_IS_VOLUME)) if (IrpContext->Irp->Flags & (IRP_PAGING_IO | IRP_NOCACHE) || IsVolume)
{ {
if (ByteOffset.u.LowPart % BytesPerSector != 0 || Length % BytesPerSector != 0) if (ByteOffset.u.LowPart % BytesPerSector != 0 || Length % BytesPerSector != 0)
{ {
@ -627,7 +628,7 @@ VfatRead(
} }
} }
if (Fcb->Flags & FCB_IS_VOLUME) if (IsVolume)
{ {
Resource = &IrpContext->DeviceExt->DirResource; Resource = &IrpContext->DeviceExt->DirResource;
} }
@ -770,7 +771,7 @@ VfatWrite(
ULONG Length = 0; ULONG Length = 0;
PVOID Buffer; PVOID Buffer;
ULONG BytesPerSector; ULONG BytesPerSector;
BOOLEAN PagingIo, CanWait; BOOLEAN PagingIo, CanWait, IsVolume;
ASSERT(IrpContext); ASSERT(IrpContext);
@ -806,6 +807,7 @@ VfatWrite(
PagingIo = BooleanFlagOn(IrpContext->Irp->Flags, IRP_PAGING_IO); PagingIo = BooleanFlagOn(IrpContext->Irp->Flags, IRP_PAGING_IO);
CanWait = BooleanFlagOn(IrpContext->Flags, IRPCONTEXT_CANWAIT); CanWait = BooleanFlagOn(IrpContext->Flags, IRPCONTEXT_CANWAIT);
IsVolume = BooleanFlagOn(Fcb->Flags, FCB_IS_VOLUME);
/* fail if file is a directory and no paged read */ /* fail if file is a directory and no paged read */
if (*Fcb->Attributes & FILE_ATTRIBUTE_DIRECTORY && !PagingIo) if (*Fcb->Attributes & FILE_ATTRIBUTE_DIRECTORY && !PagingIo)
@ -823,7 +825,7 @@ VfatWrite(
Length = IrpContext->Stack->Parameters.Write.Length; Length = IrpContext->Stack->Parameters.Write.Length;
BytesPerSector = IrpContext->DeviceExt->FatInfo.BytesPerSector; BytesPerSector = IrpContext->DeviceExt->FatInfo.BytesPerSector;
if (ByteOffset.u.HighPart && !(Fcb->Flags & FCB_IS_VOLUME)) if (ByteOffset.u.HighPart && !IsVolume)
{ {
Status = STATUS_INVALID_PARAMETER; Status = STATUS_INVALID_PARAMETER;
goto ByeBye; goto ByeBye;
@ -840,7 +842,7 @@ VfatWrite(
} }
} }
if (IrpContext->Irp->Flags & (IRP_PAGING_IO|IRP_NOCACHE) || (Fcb->Flags & FCB_IS_VOLUME)) if (IrpContext->Irp->Flags & (IRP_PAGING_IO|IRP_NOCACHE) || IsVolume)
{ {
if (ByteOffset.u.LowPart % BytesPerSector != 0 || Length % BytesPerSector != 0) if (ByteOffset.u.LowPart % BytesPerSector != 0 || Length % BytesPerSector != 0)
{ {
@ -874,7 +876,7 @@ VfatWrite(
} }
} }
if (Fcb->Flags & FCB_IS_VOLUME) if (IsVolume)
{ {
Resource = &IrpContext->DeviceExt->DirResource; Resource = &IrpContext->DeviceExt->DirResource;
} }
@ -916,7 +918,7 @@ VfatWrite(
} }
} }
if (!CanWait && !(Fcb->Flags & FCB_IS_VOLUME)) if (!CanWait && !IsVolume)
{ {
if (ByteOffset.u.LowPart + Length > Fcb->RFCB.AllocationSize.u.LowPart) if (ByteOffset.u.LowPart + Length > Fcb->RFCB.AllocationSize.u.LowPart)
{ {