- Fix a misnamed var in fastfat.h.
[reactos.git] / reactos / drivers / filesystems / fastfat_new / fsctl.c
1 /*
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)
7 */
8
9 /* INCLUDES *****************************************************************/
10
11 #define NDEBUG
12 #include "fastfat.h"
13
14 /* FUNCTIONS ****************************************************************/
15
16 NTSTATUS
17 NTAPI
18 FatUserFsCtrl(PFAT_IRP_CONTEXT IrpContext, PIRP Irp)
19 {
20 DPRINT1("FatUserFsCtrl()\n");
21 FatCompleteRequest(IrpContext, Irp, STATUS_INVALID_DEVICE_REQUEST);
22 return STATUS_INVALID_DEVICE_REQUEST;
23 }
24
25 NTSTATUS
26 NTAPI
27 FatVerifyVolume(PFAT_IRP_CONTEXT IrpContext, PIRP Irp)
28 {
29 DPRINT1("FatVerifyVolume()\n");
30 FatCompleteRequest(IrpContext, Irp, STATUS_INVALID_DEVICE_REQUEST);
31 return STATUS_INVALID_DEVICE_REQUEST;
32 }
33
34 VOID
35 NTAPI
36 FatiCleanVcbs(PFAT_IRP_CONTEXT IrpContext)
37 {
38 /* Make sure this IRP is waitable */
39 ASSERT(IrpContext->Flags & IRPCONTEXT_CANWAIT);
40
41 /* Acquire global resource */
42 ExAcquireResourceExclusiveLite(&FatGlobalData.Resource, TRUE);
43
44 /* TODO: Go through all VCBs and delete unmounted ones */
45
46 /* Release global resource */
47 ExReleaseResourceLite(&FatGlobalData.Resource);
48 }
49
50 NTSTATUS
51 NTAPI
52 FatMountVolume(PFAT_IRP_CONTEXT IrpContext,
53 PDEVICE_OBJECT TargetDeviceObject,
54 PVPB Vpb,
55 PDEVICE_OBJECT FsDeviceObject)
56 {
57 NTSTATUS Status;
58 PVOLUME_DEVICE_OBJECT VolumeDevice;
59
60 DPRINT1("FatMountVolume()\n");
61
62 /* Make sure this IRP is waitable */
63 ASSERT(IrpContext->Flags & IRPCONTEXT_CANWAIT);
64
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 */
68
69 /* Remove unmounted VCBs */
70 FatiCleanVcbs(IrpContext);
71
72 /* Create a new volume device object */
73 Status = IoCreateDevice(FatGlobalData.DriverObject,
74 sizeof(VOLUME_DEVICE_OBJECT) - sizeof(DEVICE_OBJECT),
75 NULL,
76 FILE_DEVICE_DISK_FILE_SYSTEM,
77 0,
78 FALSE,
79 (PDEVICE_OBJECT *)&VolumeDevice);
80
81 if (!NT_SUCCESS(Status)) return Status;
82
83 /* Match alignment requirements */
84 if (TargetDeviceObject->AlignmentRequirement > VolumeDevice->DeviceObject.AlignmentRequirement)
85 {
86 VolumeDevice->DeviceObject.AlignmentRequirement = TargetDeviceObject->AlignmentRequirement;
87 }
88
89 /* Init stack size */
90 VolumeDevice->DeviceObject.StackSize = TargetDeviceObject->StackSize + 1;
91
92 /* TODO: IOCTL_DISK_GET_DRIVE_GEOMETRY to obtain BytesPerSector */
93 VolumeDevice->DeviceObject.SectorSize = 512;
94
95 /* Signal we're done with initializing */
96 VolumeDevice->DeviceObject.Flags &= ~DO_DEVICE_INITIALIZING;
97
98 /* Save device object in a VPB */
99 Vpb->DeviceObject = (PDEVICE_OBJECT)VolumeDevice;
100
101 /* TODO: Initialize VCB for this volume */
102
103 /* Complete the request and return success */
104 FatCompleteRequest(IrpContext, IrpContext->Irp, STATUS_SUCCESS);
105 return STATUS_SUCCESS;
106 }
107
108
109
110 NTSTATUS
111 NTAPI
112 FatiFileSystemControl(PFAT_IRP_CONTEXT IrpContext, PIRP Irp)
113 {
114 PIO_STACK_LOCATION IrpSp;
115 NTSTATUS Status;
116
117 /* Get current IRP stack location */
118 IrpSp = IoGetCurrentIrpStackLocation(Irp);
119
120 /* Dispatch depending on the minor function */
121 switch (IrpSp->MinorFunction)
122 {
123 case IRP_MN_USER_FS_REQUEST:
124 Status = FatUserFsCtrl(IrpContext, Irp);
125 break;
126
127 case IRP_MN_MOUNT_VOLUME:
128 Status = FatMountVolume(IrpContext,
129 IrpSp->Parameters.MountVolume.DeviceObject,
130 IrpSp->Parameters.MountVolume.Vpb,
131 IrpSp->DeviceObject);
132 break;
133
134 case IRP_MN_VERIFY_VOLUME:
135 Status = FatVerifyVolume(IrpContext, Irp);
136 break;
137
138 default:
139 DPRINT1("Unhandled FSCTL minor 0x%x\n", IrpSp->MinorFunction);
140 FatCompleteRequest(IrpContext, Irp, STATUS_INVALID_DEVICE_REQUEST);
141 Status = STATUS_INVALID_DEVICE_REQUEST;
142 }
143
144 return Status;
145 }
146
147
148 NTSTATUS
149 NTAPI
150 FatFileSystemControl(PDEVICE_OBJECT DeviceObject, PIRP Irp)
151 {
152 NTSTATUS Status = STATUS_SUCCESS;
153 PFAT_IRP_CONTEXT IrpContext;
154 BOOLEAN CanWait = TRUE;
155
156 DPRINT1("FatFileSystemControl(DeviceObject %p, Irp %p)\n", DeviceObject, Irp);
157
158 /* Get CanWait flag */
159 if (IoGetCurrentIrpStackLocation(Irp)->FileObject)
160 {
161 CanWait = IoIsOperationSynchronous(Irp);
162 }
163
164 /* Enter FsRtl critical region */
165 FsRtlEnterFileSystem();
166
167 /* Build an irp context */
168 IrpContext = FatBuildIrpContext(Irp, CanWait);
169
170 /* Call internal function */
171 Status = FatiFileSystemControl(IrpContext, Irp);
172
173 /* Leave FsRtl critical region */
174 FsRtlExitFileSystem();
175
176 return Status;
177 }