*LengthRead = 0;
Ccb = (PVFATCCB)IrpContext->FileObject->FsContext2;
- Fcb = Ccb->pFcb;
+ Fcb = IrpContext->FileObject->FsContext;
BytesPerSector = DeviceExt->FatInfo.BytesPerSector;
BytesPerCluster = DeviceExt->FatInfo.BytesPerCluster;
assert (IrpContext->FileObject->FsContext2 != NULL);
Ccb = (PVFATCCB)IrpContext->FileObject->FsContext2;
- Fcb = Ccb->pFcb;
+ Fcb = IrpContext->FileObject->FsContext;
BytesPerCluster = DeviceExt->FatInfo.BytesPerCluster;
BytesPerSector = DeviceExt->FatInfo.BytesPerSector;
{
NTSTATUS Status;
PVFATFCB Fcb;
- PVFATCCB Ccb;
ULONG Length;
ULONG ReturnedLength = 0;
PERESOURCE Resource = NULL;
assert(IrpContext->DeviceExt);
assert(IrpContext->FileObject);
- Ccb = (PVFATCCB) IrpContext->FileObject->FsContext2;
- assert(Ccb);
- Fcb = Ccb->pFcb;
+ Fcb = IrpContext->FileObject->FsContext;
assert(Fcb);
DPRINT("<%S>\n", Fcb->PathName);
Status = STATUS_PENDING;
goto ByeBye;
}
+
+ if (!(IrpContext->Irp->Flags & IRP_PAGING_IO) &&
+ FsRtlAreThereCurrentFileLocks(&Fcb->FileLock))
+ {
+ if (!FsRtlCheckLockForReadAccess(&Fcb->FileLock, IrpContext->Irp))
+ {
+ Status = STATUS_FILE_LOCK_CONFLICT;
+ goto ByeBye;
+ }
+ }
+
if (!(IrpContext->Irp->Flags & (IRP_NOCACHE|IRP_PAGING_IO)) &&
!(Fcb->Flags & (FCB_IS_PAGE_FILE|FCB_IS_VOLUME)))
{
{
CacheSize = PAGE_SIZE;
}
- CcRosInitializeFileCache(IrpContext->FileObject, &Fcb->RFCB.Bcb, CacheSize);
+ CcRosInitializeFileCache(IrpContext->FileObject, CacheSize);
}
if (!CcCopyRead(IrpContext->FileObject, &ByteOffset, Length,
IrpContext->Flags & IRPCONTEXT_CANWAIT, Buffer,
NTSTATUS VfatWrite (PVFAT_IRP_CONTEXT IrpContext)
{
- PVFATCCB Ccb;
PVFATFCB Fcb;
PERESOURCE Resource = NULL;
LARGE_INTEGER ByteOffset;
assert(IrpContext->DeviceExt);
assert(IrpContext->FileObject);
- Ccb = (PVFATCCB) IrpContext->FileObject->FsContext2;
- assert(Ccb);
- Fcb = Ccb->pFcb;
+ Fcb = IrpContext->FileObject->FsContext;
assert(Fcb);
DPRINT("<%S>\n", Fcb->PathName);
}
}
+ if (!(IrpContext->Irp->Flags & IRP_PAGING_IO) &&
+ FsRtlAreThereCurrentFileLocks(&Fcb->FileLock))
+ {
+ if (!FsRtlCheckLockForWriteAccess(&Fcb->FileLock, IrpContext->Irp))
+ {
+ Status = STATUS_FILE_LOCK_CONFLICT;
+ goto ByeBye;
+ }
+ }
+
if (!(IrpContext->Flags & IRPCONTEXT_CANWAIT) && !(Fcb->Flags & FCB_IS_VOLUME))
{
if (ByteOffset.u.LowPart + Length > Fcb->RFCB.AllocationSize.u.LowPart)
}
}
- if (ByteOffset.QuadPart > OldFileSize.QuadPart)
- {
- CcZeroData(IrpContext->FileObject, &OldFileSize, &ByteOffset, TRUE);
- }
if (!(IrpContext->Irp->Flags & (IRP_NOCACHE|IRP_PAGING_IO)) &&
!(Fcb->Flags & (FCB_IS_PAGE_FILE|FCB_IS_VOLUME)))
{
CacheSize = PAGE_SIZE;
}
- CcRosInitializeFileCache(IrpContext->FileObject, &Fcb->RFCB.Bcb, CacheSize);
+ CcRosInitializeFileCache(IrpContext->FileObject, CacheSize);
+ }
+ if (ByteOffset.QuadPart > OldFileSize.QuadPart)
+ {
+ CcZeroData(IrpContext->FileObject, &OldFileSize, &ByteOffset, TRUE);
}
if (CcCopyWrite(IrpContext->FileObject, &ByteOffset, Length,
1 /*IrpContext->Flags & IRPCONTEXT_CANWAIT*/, Buffer))
// non cached write
CHECKPOINT;
+ if (ByteOffset.QuadPart > OldFileSize.QuadPart)
+ {
+ CcZeroData(IrpContext->FileObject, &OldFileSize, &ByteOffset, TRUE);
+ }
Buffer = VfatGetUserBuffer(IrpContext->Irp);
if (!Buffer)
{
&Fcb->entry.UpdateTime);
Fcb->entry.AccessDate = Fcb->entry.UpdateDate;
// update dates/times and length
- if (OldAllocationSize != Fcb->RFCB.AllocationSize.u.LowPart)
- {
- VfatUpdateEntry (IrpContext->DeviceExt, IrpContext->FileObject);
- Fcb->Flags &= ~FCB_UPDATE_DIRENTRY;
- }
- else
- Fcb->Flags |= FCB_UPDATE_DIRENTRY;
+ VfatUpdateEntry (IrpContext->DeviceExt, IrpContext->FileObject);
}
}