diff --git a/reactos/drivers/fs/vfat/close.c b/reactos/drivers/fs/vfat/close.c index ca295be7808..f8b0c37b5dd 100644 --- a/reactos/drivers/fs/vfat/close.c +++ b/reactos/drivers/fs/vfat/close.c @@ -1,4 +1,4 @@ -/* $Id: close.c,v 1.9 2001/11/02 22:44:34 hbirr Exp $ +/* $Id: close.c,v 1.10 2002/05/05 20:18:33 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -39,12 +39,18 @@ VfatCloseFile (PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject) { return STATUS_SUCCESS; } - if (FileObject->FileName.Buffer) + pFcb = pCcb->pFcb; + if (pFcb->Flags & FCB_IS_VOLUME) + { + DPRINT1("Volume\n"); + pFcb->RefCount--; + FileObject->FsContext2 = NULL; + } + else 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 haven't a FileName. - pFcb = pCcb->pFcb; if (FileObject->DeletePending) { if (pFcb->Flags & FCB_DELETE_PENDING) diff --git a/reactos/drivers/fs/vfat/create.c b/reactos/drivers/fs/vfat/create.c index 307e713f4d8..848be6405f4 100644 --- a/reactos/drivers/fs/vfat/create.c +++ b/reactos/drivers/fs/vfat/create.c @@ -1,4 +1,4 @@ -/* $Id: create.c,v 1.39 2002/03/18 22:37:12 hbirr Exp $ +/* $Id: create.c,v 1.40 2002/05/05 20:18:33 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -583,6 +583,43 @@ VfatCreateFile (PDEVICE_OBJECT DeviceObject, PIRP Irp) DeviceExt = DeviceObject->DeviceExtension; assert (DeviceExt); + if (FileObject->FileName.Length == 0 && FileObject->RelatedFileObject == NULL) + { + /* This a open operation for the volume itself */ + if (RequestedDisposition == FILE_CREATE || + RequestedDisposition == FILE_OVERWRITE_IF || + RequestedDisposition == FILE_SUPERSEDE) + { + Irp->IoStatus.Status = STATUS_ACCESS_DENIED; + return STATUS_ACCESS_DENIED; + } + if (RequestedOptions & FILE_DIRECTORY_FILE) + { + Irp->IoStatus.Status = STATUS_NOT_A_DIRECTORY; + return STATUS_NOT_A_DIRECTORY; + } + pFcb = DeviceExt->VolumeFcb; + pCcb = ExAllocatePoolWithTag (NonPagedPool, sizeof (VFATCCB), TAG_CCB); + if (pCcb == NULL) + { + Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; + return STATUS_INSUFFICIENT_RESOURCES; + } + memset(pCcb, 0, sizeof(VFATCCB)); + FileObject->Flags |= FO_FCB_IS_VALID; + FileObject->SectionObjectPointers = &pFcb->SectionObjectPointers; + FileObject->FsContext = (PVOID) &pFcb->RFCB; + FileObject->FsContext2 = pCcb; + pCcb->pFcb = pFcb; + pCcb->PtrFileObject = FileObject; + pFcb->pDevExt = DeviceExt; + pFcb->RefCount++; + + Irp->IoStatus.Information = FILE_OPENED; + Irp->IoStatus.Status = STATUS_SUCCESS; + return STATUS_SUCCESS; + } + /* * Check for illegal characters in the file name */ diff --git a/reactos/drivers/fs/vfat/vfat.h b/reactos/drivers/fs/vfat/vfat.h index f87c9baa73d..1eb184a626f 100644 --- a/reactos/drivers/fs/vfat/vfat.h +++ b/reactos/drivers/fs/vfat/vfat.h @@ -1,4 +1,4 @@ -/* $Id: vfat.h,v 1.40 2002/03/18 22:37:13 hbirr Exp $ */ +/* $Id: vfat.h,v 1.41 2002/05/05 20:18:33 hbirr Exp $ */ #include @@ -113,9 +113,12 @@ typedef struct ULONG BytesPerCluster; ULONG NumberOfClusters; ULONG FatType; + ULONG Sectors; } FATINFO, *PFATINFO; +struct _VFATFCB; + typedef struct { ERESOURCE DirResource; @@ -131,6 +134,7 @@ typedef struct ULONG AvailableClusters; BOOLEAN AvailableClustersValid; ULONG Flags; + struct _VFATFCB * VolumeFcb; } DEVICE_EXTENSION, *PDEVICE_EXTENSION, VCB, *PVCB; @@ -148,6 +152,7 @@ extern PVFAT_GLOBAL_DATA VfatGlobalData; #define FCB_DELETE_PENDING 0x0002 #define FCB_IS_FAT 0x0004 #define FCB_IS_PAGE_FILE 0x0008 +#define FCB_IS_VOLUME 0x0010 typedef struct _VFATFCB { @@ -482,7 +487,7 @@ NTSTATUS VfatWrite (PVFAT_IRP_CONTEXT IrpContext); NTSTATUS vfatExtendSpace (PDEVICE_EXTENSION pDeviceExt, PFILE_OBJECT pFileObject, ULONG NewSize); -/* + NTSTATUS VfatWriteFile (PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject, PVOID Buffer, @@ -498,7 +503,6 @@ NTSTATUS VfatReadFile (PDEVICE_EXTENSION DeviceExt, ULONG ReadOffset, PULONG LengthRead, ULONG NoCache); -*/ NTSTATUS NextCluster(PDEVICE_EXTENSION DeviceExt, PVFATFCB Fcb, @@ -517,11 +521,11 @@ VOID VfatFreeIrpContext(PVFAT_IRP_CONTEXT IrpContext); NTSTATUS STDCALL VfatBuildRequest (PDEVICE_OBJECT DeviceObject, PIRP Irp); -/* + PVOID VfatGetUserBuffer(IN PIRP); NTSTATUS VfatLockUserBuffer(IN PIRP, IN ULONG, IN LOCK_OPERATION); -*/ + /* EOF */