3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: services/fs/vfat/close.c
6 * PURPOSE: VFAT Filesystem
7 * PROGRAMMER: Jason Filby (jasonfilby@yahoo.com)
10 /* INCLUDES *****************************************************************/
12 #include <ddk/ntddk.h>
19 /* FUNCTIONS ****************************************************************/
22 VfatCloseFile (PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject)
24 * FUNCTION: Closes a file
29 NTSTATUS Status = STATUS_SUCCESS;
31 DPRINT ("VfatCloseFile(DeviceExt %x, FileObject %x)\n",
32 DeviceExt, FileObject);
34 /* FIXME : update entry in directory? */
35 pCcb = (PVFATCCB) (FileObject->FsContext2);
37 DPRINT ("pCcb %x\n", pCcb);
40 return STATUS_SUCCESS;
43 if (pFcb->Flags & FCB_IS_VOLUME)
47 FileObject->FsContext2 = NULL;
49 else if (FileObject->FileName.Buffer)
51 // This a FO, that was created outside from FSD.
52 // Some FO's are created with IoCreateStreamFileObject() insid from FSD.
53 // This FO's haven't a FileName.
54 if (FileObject->DeletePending)
56 if (pFcb->Flags & FCB_DELETE_PENDING)
58 delEntry (DeviceExt, FileObject);
59 pFcb->Flags &= ~FCB_UPDATE_DIRENTRY;
62 Status = STATUS_DELETE_PENDING;
64 if (pFcb->Flags & FCB_UPDATE_DIRENTRY)
66 VfatUpdateEntry (DeviceExt, FileObject);
67 pFcb->Flags &= ~FCB_UPDATE_DIRENTRY;
69 FileObject->FsContext2 = NULL;
70 vfatReleaseFCB (DeviceExt, pFcb);
73 FileObject->FsContext2 = NULL;
75 if (pCcb->DirectorySearchPattern)
76 ExFreePool(pCcb->DirectorySearchPattern);
82 NTSTATUS VfatClose (PVFAT_IRP_CONTEXT IrpContext)
84 * FUNCTION: Closes a file
89 DPRINT ("VfatClose(DeviceObject %x, Irp %x)\n", DeviceObject, Irp);
91 if (IrpContext->DeviceObject == VfatGlobalData->DeviceObject)
93 DPRINT("Closing file system\n");
94 Status = STATUS_SUCCESS;
98 if (!ExAcquireResourceExclusiveLite (&IrpContext->DeviceExt->DirResource, IrpContext->Flags & IRPCONTEXT_CANWAIT))
100 return VfatQueueRequest (IrpContext);
103 Status = VfatCloseFile (IrpContext->DeviceExt, IrpContext->FileObject);
104 ExReleaseResourceLite (&IrpContext->DeviceExt->DirResource);
107 IrpContext->Irp->IoStatus.Status = Status;
108 IrpContext->Irp->IoStatus.Information = 0;
109 IoCompleteRequest (IrpContext->Irp, IO_NO_INCREMENT);
110 VfatFreeIrpContext(IrpContext);