#define NDEBUG
#include <debug.h>
-/* GLOBALS *****************************************************************/
-
-
/* FUNCTIONS ****************************************************************/
-static NTSTATUS
-NtfsCloseFile(PDEVICE_EXTENSION DeviceExt,
- PFILE_OBJECT FileObject)
/*
* FUNCTION: Closes a file
*/
+NTSTATUS
+NtfsCloseFile(PDEVICE_EXTENSION DeviceExt,
+ PFILE_OBJECT FileObject)
{
- PNTFS_CCB Ccb;
+ PNTFS_CCB Ccb;
+ PNTFS_FCB Fcb;
- DPRINT("NtfsCloseFile(DeviceExt %p, FileObject %p)\n",
- DeviceExt,
- FileObject);
+ DPRINT("NtfsCloseFile(DeviceExt %p, FileObject %p)\n",
+ DeviceExt,
+ FileObject);
- Ccb = (PNTFS_CCB)(FileObject->FsContext2);
+ Ccb = (PNTFS_CCB)(FileObject->FsContext2);
+ Fcb = (PNTFS_FCB)(FileObject->FsContext);
- DPRINT("Ccb %p\n", Ccb);
- if (Ccb == NULL)
+ DPRINT("Ccb %p\n", Ccb);
+ if (Ccb == NULL)
{
- return(STATUS_SUCCESS);
+ return STATUS_SUCCESS;
}
- FileObject->FsContext2 = NULL;
+ FileObject->FsContext2 = NULL;
+ FileObject->FsContext = NULL;
+ FileObject->SectionObjectPointer = NULL;
+ DeviceExt->OpenHandleCount--;
- if (FileObject->FileName.Buffer)
+ if (FileObject->FileName.Buffer)
{
- // This a FO, that was created outside from FSD.
- // Some FO's are created with IoCreateStreamFileObject() insid from FSD.
- // This FO's don't have a FileName.
- NtfsReleaseFCB(DeviceExt, FileObject->FsContext);
+ // This a FO, that was created outside from FSD.
+ // Some FO's are created with IoCreateStreamFileObject() insid from FSD.
+ // This FO's don't have a FileName.
+ NtfsReleaseFCB(DeviceExt, Fcb);
}
- if (Ccb->DirectorySearchPattern)
+ if (Ccb->DirectorySearchPattern)
{
- ExFreePool(Ccb->DirectorySearchPattern);
+ ExFreePool(Ccb->DirectorySearchPattern);
}
- ExFreePool(Ccb);
- return(STATUS_SUCCESS);
+ ExFreePool(Ccb);
+
+ return STATUS_SUCCESS;
}
-NTSTATUS NTAPI
-NtfsFsdClose(PDEVICE_OBJECT DeviceObject,
- PIRP Irp)
+NTSTATUS
+NtfsClose(PNTFS_IRP_CONTEXT IrpContext)
{
- PDEVICE_EXTENSION DeviceExtension;
- PIO_STACK_LOCATION Stack;
- PFILE_OBJECT FileObject;
- NTSTATUS Status;
+ PDEVICE_EXTENSION DeviceExtension;
+ PFILE_OBJECT FileObject;
+ NTSTATUS Status;
+ PDEVICE_OBJECT DeviceObject;
+
+ DPRINT("NtfsClose() called\n");
- DPRINT("NtfsClose() called\n");
+ DeviceObject = IrpContext->DeviceObject;
+ if (DeviceObject == NtfsGlobalData->DeviceObject)
+ {
+ DPRINT("Closing file system\n");
+ IrpContext->Irp->IoStatus.Information = 0;
+ return STATUS_SUCCESS;
+ }
+
+ FileObject = IrpContext->FileObject;
+ DeviceExtension = DeviceObject->DeviceExtension;
- if (DeviceObject == NtfsGlobalData->DeviceObject)
+ if (!ExAcquireResourceExclusiveLite(&DeviceExtension->DirResource,
+ BooleanFlagOn(IrpContext->Flags, IRPCONTEXT_CANWAIT)))
{
- DPRINT("Closing file system\n");
- Status = STATUS_SUCCESS;
- goto ByeBye;
+ return NtfsMarkIrpContextForQueue(IrpContext);
}
- Stack = IoGetCurrentIrpStackLocation(Irp);
- FileObject = Stack->FileObject;
- DeviceExtension = DeviceObject->DeviceExtension;
+ Status = NtfsCloseFile(DeviceExtension, FileObject);
- Status = NtfsCloseFile(DeviceExtension,FileObject);
+ ExReleaseResourceLite(&DeviceExtension->DirResource);
-ByeBye:
- Irp->IoStatus.Status = Status;
- Irp->IoStatus.Information = 0;
+ if (Status == STATUS_PENDING)
+ {
+ return NtfsMarkIrpContextForQueue(IrpContext);
+ }
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
- return(Status);
+ IrpContext->Irp->IoStatus.Information = 0;
+ return Status;
}
+
+/* EOF */