2 * PROJECT: ReactOS FAT file system driver
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: drivers/filesystems/fastfat/fsctl.c
5 * PURPOSE: Filesystem control
6 * PROGRAMMERS: Aleksey Bragin (aleksey@reactos.org)
9 /* INCLUDES *****************************************************************/
14 /* FUNCTIONS ****************************************************************/
18 FatUserFsCtrl(PFAT_IRP_CONTEXT IrpContext
, PIRP Irp
)
20 DPRINT1("FatUserFsCtrl()\n");
21 FatCompleteRequest(IrpContext
, Irp
, STATUS_INVALID_DEVICE_REQUEST
);
22 return STATUS_INVALID_DEVICE_REQUEST
;
27 FatVerifyVolume(PFAT_IRP_CONTEXT IrpContext
, PIRP Irp
)
29 DPRINT1("FatVerifyVolume()\n");
30 FatCompleteRequest(IrpContext
, Irp
, STATUS_INVALID_DEVICE_REQUEST
);
31 return STATUS_INVALID_DEVICE_REQUEST
;
36 FatiCleanVcbs(PFAT_IRP_CONTEXT IrpContext
)
38 /* Make sure this IRP is waitable */
39 ASSERT(IrpContext
->Flags
& IRPCONTEXT_CANWAIT
);
41 /* Acquire global resource */
42 ExAcquireResourceExclusiveLite(&FatGlobalData
.Resource
, TRUE
);
44 /* TODO: Go through all VCBs and delete unmounted ones */
46 /* Release global resource */
47 ExReleaseResourceLite(&FatGlobalData
.Resource
);
52 FatMountVolume(PFAT_IRP_CONTEXT IrpContext
,
53 PDEVICE_OBJECT TargetDeviceObject
,
55 PDEVICE_OBJECT FsDeviceObject
)
58 PVOLUME_DEVICE_OBJECT VolumeDevice
;
60 DPRINT1("FatMountVolume()\n");
62 /* Make sure this IRP is waitable */
63 ASSERT(IrpContext
->Flags
& IRPCONTEXT_CANWAIT
);
65 /* TODO: IOCTL_DISK_CHECK_VERIFY */
66 /* TODO: Check if data-track present in case of a CD drive */
67 /* TODO: IOCTL_DISK_GET_PARTITION_INFO_EX */
69 /* Remove unmounted VCBs */
70 FatiCleanVcbs(IrpContext
);
72 /* Create a new volume device object */
73 Status
= IoCreateDevice(FatGlobalData
.DriverObject
,
74 sizeof(VOLUME_DEVICE_OBJECT
) - sizeof(DEVICE_OBJECT
),
76 FILE_DEVICE_DISK_FILE_SYSTEM
,
79 (PDEVICE_OBJECT
*)&VolumeDevice
);
81 if (!NT_SUCCESS(Status
)) return Status
;
83 /* Match alignment requirements */
84 if (TargetDeviceObject
->AlignmentRequirement
> VolumeDevice
->DeviceObject
.AlignmentRequirement
)
86 VolumeDevice
->DeviceObject
.AlignmentRequirement
= TargetDeviceObject
->AlignmentRequirement
;
90 VolumeDevice
->DeviceObject
.StackSize
= TargetDeviceObject
->StackSize
+ 1;
92 /* TODO: IOCTL_DISK_GET_DRIVE_GEOMETRY to obtain BytesPerSector */
93 VolumeDevice
->DeviceObject
.SectorSize
= 512;
95 /* Signal we're done with initializing */
96 VolumeDevice
->DeviceObject
.Flags
&= ~DO_DEVICE_INITIALIZING
;
98 /* Save device object in a VPB */
99 Vpb
->DeviceObject
= (PDEVICE_OBJECT
)VolumeDevice
;
101 /* TODO: Initialize VCB for this volume */
103 /* Complete the request and return success */
104 FatCompleteRequest(IrpContext
, IrpContext
->Irp
, STATUS_SUCCESS
);
105 return STATUS_SUCCESS
;
112 FatiFileSystemControl(PFAT_IRP_CONTEXT IrpContext
, PIRP Irp
)
114 PIO_STACK_LOCATION IrpSp
;
117 /* Get current IRP stack location */
118 IrpSp
= IoGetCurrentIrpStackLocation(Irp
);
120 /* Dispatch depending on the minor function */
121 switch (IrpSp
->MinorFunction
)
123 case IRP_MN_USER_FS_REQUEST
:
124 Status
= FatUserFsCtrl(IrpContext
, Irp
);
127 case IRP_MN_MOUNT_VOLUME
:
128 Status
= FatMountVolume(IrpContext
,
129 IrpSp
->Parameters
.MountVolume
.DeviceObject
,
130 IrpSp
->Parameters
.MountVolume
.Vpb
,
131 IrpSp
->DeviceObject
);
134 case IRP_MN_VERIFY_VOLUME
:
135 Status
= FatVerifyVolume(IrpContext
, Irp
);
139 DPRINT1("Unhandled FSCTL minor 0x%x\n", IrpSp
->MinorFunction
);
140 FatCompleteRequest(IrpContext
, Irp
, STATUS_INVALID_DEVICE_REQUEST
);
141 Status
= STATUS_INVALID_DEVICE_REQUEST
;
150 FatFileSystemControl(PDEVICE_OBJECT DeviceObject
, PIRP Irp
)
152 NTSTATUS Status
= STATUS_SUCCESS
;
153 PFAT_IRP_CONTEXT IrpContext
;
154 BOOLEAN CanWait
= TRUE
;
156 DPRINT1("FatFileSystemControl(DeviceObject %p, Irp %p)\n", DeviceObject
, Irp
);
158 /* Get CanWait flag */
159 if (IoGetCurrentIrpStackLocation(Irp
)->FileObject
)
161 CanWait
= IoIsOperationSynchronous(Irp
);
164 /* Enter FsRtl critical region */
165 FsRtlEnterFileSystem();
167 /* Build an irp context */
168 IrpContext
= FatBuildIrpContext(Irp
, CanWait
);
170 /* Call internal function */
171 Status
= FatiFileSystemControl(IrpContext
, Irp
);
173 /* Leave FsRtl critical region */
174 FsRtlExitFileSystem();