diff --git a/reactos/drivers/filesystems/fastfat_new/cleanup.c b/reactos/drivers/filesystems/fastfat_new/cleanup.c index 49ae9556ea8..dbc1f1b3d96 100644 --- a/reactos/drivers/filesystems/fastfat_new/cleanup.c +++ b/reactos/drivers/filesystems/fastfat_new/cleanup.c @@ -303,12 +303,11 @@ FatiCleanup(PFAT_IRP_CONTEXT IrpContext, PIRP Irp) if (FlagOn(Fcb->State, FCB_STATE_DELETE_ON_CLOSE) && Fcb->Header.AllocationSize.LowPart == 0) { - UNIMPLEMENTED; - /*FatNotifyReportChange(IrpContext, + FatNotifyReportChange(IrpContext, Vcb, Fcb, FILE_NOTIFY_CHANGE_FILE_NAME, - FILE_ACTION_REMOVED );*/ + FILE_ACTION_REMOVED); } /* Remove the entry from the splay table if the file was deleted */ diff --git a/reactos/drivers/filesystems/fastfat_new/lock.c b/reactos/drivers/filesystems/fastfat_new/lock.c index a081c4b29dd..509aa50b81c 100644 --- a/reactos/drivers/filesystems/fastfat_new/lock.c +++ b/reactos/drivers/filesystems/fastfat_new/lock.c @@ -13,12 +13,98 @@ /* FUNCTIONS ****************************************************************/ +NTSTATUS +NTAPI +FatiLockControl(PFAT_IRP_CONTEXT IrpContext, PIRP Irp) +{ + PIO_STACK_LOCATION IrpSp; + TYPE_OF_OPEN TypeOfOpen; + PVCB Vcb; + PFCB Fcb; + PCCB Ccb; + NTSTATUS Status; + + /* Get IRP stack location */ + IrpSp = IoGetCurrentIrpStackLocation(Irp); + + /* Determine type of open */ + TypeOfOpen = FatDecodeFileObject(IrpSp->FileObject, &Vcb, &Fcb, &Ccb); + + /* Only user file open is allowed */ + if (TypeOfOpen != UserFileOpen) + { + FatCompleteRequest(IrpContext, Irp, STATUS_INVALID_PARAMETER); + return STATUS_INVALID_PARAMETER; + } + + /* Acquire shared FCB lock */ + if (!FatAcquireSharedFcb(IrpContext, Fcb)) + { + UNIMPLEMENTED; + //Status = FatFsdPostRequest(IrpContext, Irp); + Status = STATUS_NOT_IMPLEMENTED; + return Status; + } + + /* Check oplock state */ + Status = FsRtlCheckOplock(&Fcb->Fcb.Oplock, + Irp, + IrpContext, + FatOplockComplete, + NULL); + + if (Status != STATUS_SUCCESS) + { + /* Release FCB lock */ + FatReleaseFcb(IrpContext, Fcb); + + return Status; + } + + /* Process the lock */ + Status = FsRtlProcessFileLock(&Fcb->Fcb.Lock, Irp, NULL); + + /* Update Fast I/O state */ + Fcb->Header.IsFastIoPossible = FatIsFastIoPossible(Fcb); + + /* Complete the request */ + FatCompleteRequest(IrpContext, NULL, 0); + + /* Release FCB lock */ + FatReleaseFcb(IrpContext, Fcb); + + return Status; +} + NTSTATUS NTAPI FatLockControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) { + PFAT_IRP_CONTEXT IrpContext; + NTSTATUS Status; + BOOLEAN TopLevel; + DPRINT1("FatLockControl()\n"); - return STATUS_NOT_IMPLEMENTED; + + /* Enter FsRtl critical region */ + FsRtlEnterFileSystem(); + + /* Set Top Level IRP if not set */ + TopLevel = FatIsTopLevelIrp(Irp); + + /* Build an irp context */ + IrpContext = FatBuildIrpContext(Irp, IoIsOperationSynchronous(Irp)); + + /* Call internal function */ + Status = FatiLockControl(IrpContext, Irp); + + /* Reset Top Level IRP */ + if (TopLevel) IoSetTopLevelIrp(NULL); + + /* Leave FsRtl critical region */ + FsRtlExitFileSystem(); + + return Status; } VOID diff --git a/reactos/drivers/filesystems/fastfat_new/volume.c b/reactos/drivers/filesystems/fastfat_new/volume.c index 6fc53f23f6c..a6a30abed38 100644 --- a/reactos/drivers/filesystems/fastfat_new/volume.c +++ b/reactos/drivers/filesystems/fastfat_new/volume.c @@ -83,6 +83,25 @@ FatiQueryFsSizeInfo(PVCB Vcb, return Status; } +NTSTATUS +NTAPI +FatiQueryFsDeviceInfo(PVCB Vcb, + PFILE_FS_DEVICE_INFORMATION Buffer, + PLONG Length) +{ + /* Deduct the minimum written length */ + *Length -= sizeof(FILE_FS_DEVICE_INFORMATION); + + /* Zero it */ + RtlZeroMemory(Buffer, sizeof(FILE_FS_DEVICE_INFORMATION)); + + /* Set values */ + Buffer->DeviceType = FILE_DEVICE_DISK; + Buffer->Characteristics = Vcb->TargetDeviceObject->Characteristics; + + return STATUS_SUCCESS; +} + NTSTATUS NTAPI FatiQueryVolumeInfo(PFAT_IRP_CONTEXT IrpContext, PIRP Irp) @@ -142,8 +161,7 @@ FatiQueryVolumeInfo(PFAT_IRP_CONTEXT IrpContext, PIRP Irp) break; case FileFsDeviceInformation: - UNIMPLEMENTED - //Status = FatiQueryFsDeviceInfo(IrpContext, Vcb, Buffer, &Length); + Status = FatiQueryFsDeviceInfo(Vcb, Buffer, &Length); break; case FileFsAttributeInformation: