pFcb = (PVFATFCB) FileObject->FsContext;
if (pFcb)
{
- if (pFcb->Flags & FCB_IS_VOLUME)
- {
- pFcb->OpenHandleCount--;
-
- if (pFcb->OpenHandleCount != 0)
- {
- IoRemoveShareAccess(FileObject, &pFcb->FCBShareAccess);
- }
- }
- else
- {
- if(!ExAcquireResourceExclusiveLite (&pFcb->MainResource,
- (BOOLEAN)(IrpContext->Flags & IRPCONTEXT_CANWAIT)))
- {
- return STATUS_PENDING;
- }
- if(!ExAcquireResourceExclusiveLite (&pFcb->PagingIoResource,
- (BOOLEAN)(IrpContext->Flags & IRPCONTEXT_CANWAIT)))
- {
- ExReleaseResourceLite (&pFcb->MainResource);
- return STATUS_PENDING;
- }
-
- pFcb->OpenHandleCount--;
-
- if (!(*pFcb->Attributes & FILE_ATTRIBUTE_DIRECTORY) &&
- FsRtlAreThereCurrentFileLocks(&pFcb->FileLock))
- {
- /* remove all locks this process have on this file */
- FsRtlFastUnlockAll(&pFcb->FileLock,
- FileObject,
- IoGetRequestorProcess(IrpContext->Irp),
- NULL);
- }
-
- if (pFcb->Flags & FCB_IS_DIRTY)
- {
- VfatUpdateEntry (pFcb);
- }
-
- if (pFcb->Flags & FCB_DELETE_PENDING &&
- pFcb->OpenHandleCount == 0)
- {
- DPRINT("'%wZ'\n", &pFcb->PathNameU);
+ if (!(*pFcb->Attributes & FILE_ATTRIBUTE_DIRECTORY) &&
+ FsRtlAreThereCurrentFileLocks(&pFcb->FileLock))
+ {
+ /* remove all locks this process have on this file */
+ FsRtlFastUnlockAll(&pFcb->FileLock,
+ FileObject,
+ IoGetRequestorProcess(IrpContext->Irp),
+ NULL);
+ }
+
+ if (pFcb->Flags & FCB_IS_DIRTY)
+ {
+ VfatUpdateEntry (pFcb);
+ }
+
+ if (pFcb->Flags & FCB_DELETE_PENDING &&
+ pFcb->OpenHandleCount == 1)
+ {
PFILE_OBJECT tmpFileObject;
tmpFileObject = pFcb->FileObject;
if (tmpFileObject != NULL)
#ifdef USE_ROS_CC_AND_FS
CcRosReleaseFileCache (FileObject);
#else
- if (FileObject->SectionObjectPointer->SharedCacheMap)
- {
- CcUninitializeCacheMap (FileObject, &pFcb->RFCB.FileSize, NULL);
- }
+ CcUninitializeCacheMap (FileObject, NULL, NULL);
#endif
- if (pFcb->OpenHandleCount != 0)
- {
- IoRemoveShareAccess(FileObject, &pFcb->FCBShareAccess);
- }
-
- FileObject->Flags |= FO_CLEANUP_COMPLETE;
-
- ExReleaseResourceLite (&pFcb->PagingIoResource);
- ExReleaseResourceLite (&pFcb->MainResource);
- }
+ pFcb->OpenHandleCount--;
+ IoRemoveShareAccess(FileObject, &pFcb->FCBShareAccess);
}
return STATUS_SUCCESS;
}
ExReleaseResourceLite (&IrpContext->DeviceExt->DirResource);
- if (Status == STATUS_PENDING)
- {
- return VfatQueueRequest(IrpContext);
- }
-
ByeBye:
IrpContext->Irp->IoStatus.Status = Status;
IrpContext->Irp->IoStatus.Information = 0;
VfatCloseFile (DeviceExt, FileObject);
return(STATUS_NOT_A_DIRECTORY);
}
-#ifndef USE_ROS_CC_AND_FS
- if (!(*pFcb->Attributes & FILE_ATTRIBUTE_DIRECTORY))
- {
- if (Stack->Parameters.Create.SecurityContext->DesiredAccess & FILE_WRITE_DATA ||
- RequestedDisposition == FILE_OVERWRITE ||
- RequestedDisposition == FILE_OVERWRITE_IF)
- {
- if (!MmFlushImageSection(&pFcb->SectionObjectPointers, MmFlushForWrite))
- {
- DPRINT1("%wZ\n", &pFcb->PathNameU);
- DPRINT1("%d %d %d\n", Stack->Parameters.Create.SecurityContext->DesiredAccess & FILE_WRITE_DATA,
- RequestedDisposition == FILE_OVERWRITE, RequestedDisposition == FILE_OVERWRITE_IF);
- VfatCloseFile (DeviceExt, FileObject);
- return STATUS_SHARING_VIOLATION;
- }
- }
- }
-#endif
+
if (PagingFileCreate)
{
/* FIXME: