Author: fireball
Date: Wed Aug 11 12:18:24 2010
New Revision: 48518
URL:
http://svn.reactos.org/svn/reactos?rev=48518&view=rev
Log:
[FASTFAT_NEW]
- Plug in a commented out notification call in case of cleanup.
- Implement a case of device info query.
- Implement lock control.
Modified:
trunk/reactos/drivers/filesystems/fastfat_new/cleanup.c
trunk/reactos/drivers/filesystems/fastfat_new/lock.c
trunk/reactos/drivers/filesystems/fastfat_new/volume.c
Modified: trunk/reactos/drivers/filesystems/fastfat_new/cleanup.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/fastfa…
==============================================================================
--- trunk/reactos/drivers/filesystems/fastfat_new/cleanup.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/filesystems/fastfat_new/cleanup.c [iso-8859-1] Wed Aug 11
12:18:24 2010
@@ -303,12 +303,11 @@
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 */
Modified: trunk/reactos/drivers/filesystems/fastfat_new/lock.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/fastfa…
==============================================================================
--- trunk/reactos/drivers/filesystems/fastfat_new/lock.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/filesystems/fastfat_new/lock.c [iso-8859-1] Wed Aug 11 12:18:24
2010
@@ -15,10 +15,96 @@
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
Modified: trunk/reactos/drivers/filesystems/fastfat_new/volume.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/fastfa…
==============================================================================
--- trunk/reactos/drivers/filesystems/fastfat_new/volume.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/filesystems/fastfat_new/volume.c [iso-8859-1] Wed Aug 11
12:18:24 2010
@@ -81,6 +81,25 @@
Partition->FreeClusterCount, Vcb->Bpb.SectorsPerCluster,
Vcb->Bpb.BytesPerSector);
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
@@ -142,8 +161,7 @@
break;
case FileFsDeviceInformation:
- UNIMPLEMENTED
- //Status = FatiQueryFsDeviceInfo(IrpContext, Vcb, Buffer, &Length);
+ Status = FatiQueryFsDeviceInfo(Vcb, Buffer, &Length);
break;
case FileFsAttributeInformation: