/* FUNCTIONS ****************************************************************/
static NTSTATUS
-CdfsCleanupFile(PDEVICE_EXTENSION DeviceExt,
+CdfsCleanupFile(PCDFS_IRP_CONTEXT IrpContext,
PFILE_OBJECT FileObject)
/*
* FUNCTION: Cleans up after a file has been closed.
*/
{
+ PDEVICE_EXTENSION DeviceExt;
PFCB Fcb;
- DPRINT("CdfsCleanupFile(DeviceExt %p, FileObject %p)\n",
- DeviceExt,
+ DPRINT("CdfsCleanupFile(IrpContext %p, FileObject %p)\n",
+ IrpContext,
FileObject);
+ DeviceExt = IrpContext->DeviceObject->DeviceExtension;
Fcb = FileObject->FsContext;
if (!Fcb)
{
&(DeviceExt->NotifyList),
FileObject->FsContext2);
+ if (!CdfsFCBIsDirectory(Fcb) &&
+ FsRtlAreThereCurrentFileLocks(&Fcb->FileLock))
+ {
+ FsRtlFastUnlockAll(&Fcb->FileLock,
+ FileObject,
+ IoGetRequestorProcess(IrpContext->Irp),
+ NULL);
+ }
+
/* Uninitialize file cache if initialized for this file object. */
if (FileObject->SectionObjectPointer && FileObject->SectionObjectPointer->SharedCacheMap)
{
DeviceObject = IrpContext->DeviceObject;
Stack = IrpContext->Stack;
- if (DeviceObject == CdfsGlobalData->DeviceObject)
+ if (DeviceObject == CdfsGlobalData->CdFsDeviceObject || DeviceObject == CdfsGlobalData->HddFsDeviceObject)
{
DPRINT("Closing file system\n");
Status = STATUS_SUCCESS;
KeEnterCriticalRegion();
ExAcquireResourceExclusiveLite(&DeviceExtension->DirResource, TRUE);
- Status = CdfsCleanupFile(DeviceExtension, FileObject);
+ Status = CdfsCleanupFile(IrpContext, FileObject);
ExReleaseResourceLite(&DeviceExtension->DirResource);
KeLeaveCriticalRegion();