{
PDEVICE_OBJECT DeviceObject;
NTSTATUS Status = STATUS_SUCCESS;
- PEXT2_VCB Vcb;
+ PEXT2_VCB Vcb = NULL;
PFILE_OBJECT FileObject;
- PEXT2_FCB Fcb;
- PEXT2_CCB Ccb;
- PIRP Irp;
- PEXT2_MCB Mcb;
+ PEXT2_FCB Fcb = NULL;
+ PEXT2_CCB Ccb = NULL;
+ PIRP Irp = NULL;
+ PEXT2_MCB Mcb = NULL;
BOOLEAN VcbResourceAcquired = FALSE;
VcbResourceAcquired =
ExAcquireResourceExclusiveLite(
&Vcb->MainResource,
- IsFlagOn(IrpContext->Flags, IRP_CONTEXT_FLAG_WAIT)
+ TRUE
);
if (Fcb->Identifier.Type == EXT2VCB) {
FcbResourceAcquired =
ExAcquireResourceExclusiveLite(
&Fcb->MainResource,
- IsFlagOn(IrpContext->Flags, IRP_CONTEXT_FLAG_WAIT)
+ TRUE
);
ASSERT((Ccb->Identifier.Type == EXT2CCB) &&
if (Fcb->Header.ValidDataLength.QuadPart < Fcb->Header.FileSize.QuadPart) {
if (!INODE_HAS_EXTENT(Fcb->Inode)) {
#if EXT2_PRE_ALLOCATION_SUPPORT
- CcZeroData(FileObject, &Fcb->Header.ValidDataLength,
- &Fcb->Header.AllocationSize, TRUE);
+ _SEH2_TRY {
+ CcZeroData( FileObject,
+ &Fcb->Header.ValidDataLength,
+ &Fcb->Header.AllocationSize,
+ TRUE);
+ } _SEH2_EXCEPT (EXCEPTION_EXECUTE_HANDLER) {
+ DbgBreak();
+ } _SEH2_END;
#endif
}
}
FcbResourceAcquired =
ExAcquireResourceExclusiveLite(
&Fcb->MainResource,
- IsFlagOn(IrpContext->Flags, IRP_CONTEXT_FLAG_WAIT)
+ TRUE
);
SetFlag(FileObject->Flags, FO_FILE_MODIFIED);
if (!IsDirectory(Fcb)) {
if ( IsFlagOn(FileObject->Flags, FO_CACHE_SUPPORTED) &&
- (Fcb->NonCachedOpenCount + 1 == Fcb->ReferenceCount) &&
+ (Fcb->NonCachedOpenCount == Fcb->OpenHandleCount) &&
(Fcb->SectionObject.DataSectionObject != NULL)) {
if (!IsVcbReadOnly(Vcb)) {
ClearLongFlag(Fcb->Flags, FCB_FILE_MODIFIED);
}
- if (ExAcquireResourceExclusiveLite(&(Fcb->PagingIoResource), TRUE)) {
- ExReleaseResourceLite(&(Fcb->PagingIoResource));
- }
+ /* purge cache if all remaining openings are non-cached */
+ if (Fcb->NonCachedOpenCount > 0) {
+ if (ExAcquireResourceExclusiveLite(&(Fcb->PagingIoResource), TRUE)) {
+ ExReleaseResourceLite(&(Fcb->PagingIoResource));
+ }
- CcPurgeCacheSection( &Fcb->SectionObject,
- NULL,
- 0,
- FALSE );
+ CcPurgeCacheSection( &Fcb->SectionObject,
+ NULL,
+ 0,
+ FALSE );
+ }
}
CcUninitializeCacheMap(FileObject, NULL, NULL);