mirror of
https://github.com/reactos/reactos.git
synced 2024-08-05 11:00:55 +00:00
[FASTFAT]
Thomas->happiness++; svn path=/trunk/; revision=73808
This commit is contained in:
parent
57ec8a7319
commit
990af47b16
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue