[FS_REC]
[reactos.git] / reactos / drivers / filesystems / fs_rec / fs_rec.h
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS File System Recognizer
4 * FILE: drivers/filesystems/fs_rec/fs_rec.h
5 * PURPOSE: Main Header File
6 * PROGRAMMER: Alex Ionescu (alex.ionescu@reactos.org)
7 * Eric Kohl
8 */
9
10 #include <ntifs.h>
11
12 /* Tag for memory allocations */
13 #define FSREC_TAG 'cRsF'
14
15 /* UDFS Offsets */
16 #define UDFS_VRS_START_OFFSET 32768
17 #define UDFS_AVDP_SECTOR 256
18
19 /* Non-standard rounding macros */
20 #define ROUND_UP(n, align) \
21 ROUND_DOWN(((ULONG)n) + (align) - 1, (align))
22
23 #define ROUND_DOWN(n, align) \
24 (((ULONG)n) & ~((align) - 1l))
25
26 /* Conversion types and macros taken from internal ntifs headers */
27 typedef union _UCHAR1
28 {
29 UCHAR Uchar[1];
30 UCHAR ForceAlignment;
31 } UCHAR1, *PUCHAR1;
32
33 typedef union _UCHAR2
34 {
35 UCHAR Uchar[2];
36 USHORT ForceAlignment;
37 } UCHAR2, *PUCHAR2;
38
39 typedef union _UCHAR4
40 {
41 UCHAR Uchar[4];
42 ULONG ForceAlignment;
43 } UCHAR4, *PUCHAR4;
44
45 #define CopyUchar1(Dst,Src) { \
46 *((UCHAR1 *)(Dst)) = *((UNALIGNED UCHAR1 *)(Src)); \
47 }
48
49 #define CopyUchar2(Dst,Src) { \
50 *((UCHAR2 *)(Dst)) = *((UNALIGNED UCHAR2 *)(Src)); \
51 }
52
53 #define CopyUchar4(Dst,Src) { \
54 *((UCHAR4 *)(Dst)) = *((UNALIGNED UCHAR4 *)(Src)); \
55 }
56
57 #define FatUnpackBios(Bios,Pbios) { \
58 CopyUchar2(&(Bios)->BytesPerSector, &(Pbios)->BytesPerSector[0] ); \
59 CopyUchar1(&(Bios)->SectorsPerCluster, &(Pbios)->SectorsPerCluster[0]); \
60 CopyUchar2(&(Bios)->ReservedSectors, &(Pbios)->ReservedSectors[0] ); \
61 CopyUchar1(&(Bios)->Fats, &(Pbios)->Fats[0] ); \
62 CopyUchar2(&(Bios)->RootEntries, &(Pbios)->RootEntries[0] ); \
63 CopyUchar2(&(Bios)->Sectors, &(Pbios)->Sectors[0] ); \
64 CopyUchar1(&(Bios)->Media, &(Pbios)->Media[0] ); \
65 CopyUchar2(&(Bios)->SectorsPerFat, &(Pbios)->SectorsPerFat[0] ); \
66 CopyUchar2(&(Bios)->SectorsPerTrack, &(Pbios)->SectorsPerTrack[0] ); \
67 CopyUchar2(&(Bios)->Heads, &(Pbios)->Heads[0] ); \
68 CopyUchar4(&(Bios)->HiddenSectors, &(Pbios)->HiddenSectors[0] ); \
69 CopyUchar4(&(Bios)->LargeSectors, &(Pbios)->LargeSectors[0] ); \
70 }
71
72 /* Packed versions of the BPB and Boot Sector */
73 typedef struct _PACKED_BIOS_PARAMETER_BLOCK
74 {
75 UCHAR BytesPerSector[2];
76 UCHAR SectorsPerCluster[1];
77 UCHAR ReservedSectors[2];
78 UCHAR Fats[1];
79 UCHAR RootEntries[2];
80 UCHAR Sectors[2];
81 UCHAR Media[1];
82 UCHAR SectorsPerFat[2];
83 UCHAR SectorsPerTrack[2];
84 UCHAR Heads[2];
85 UCHAR HiddenSectors[4];
86 UCHAR LargeSectors[4];
87 } PACKED_BIOS_PARAMETER_BLOCK, *PPACKED_BIOS_PARAMETER_BLOCK;
88
89 typedef struct _PACKED_BOOT_SECTOR
90 {
91 UCHAR Jump[3];
92 UCHAR Oem[8];
93 PACKED_BIOS_PARAMETER_BLOCK PackedBpb;
94 UCHAR PhysicalDriveNumber;
95 UCHAR CurrentHead;
96 UCHAR Signature;
97 UCHAR Id[4];
98 UCHAR VolumeLabel[11];
99 UCHAR SystemId[8];
100 } PACKED_BOOT_SECTOR, *PPACKED_BOOT_SECTOR;
101
102 /* Unpacked version of the BPB */
103 typedef struct BIOS_PARAMETER_BLOCK
104 {
105 USHORT BytesPerSector;
106 UCHAR SectorsPerCluster;
107 USHORT ReservedSectors;
108 UCHAR Fats;
109 USHORT RootEntries;
110 USHORT Sectors;
111 UCHAR Media;
112 USHORT SectorsPerFat;
113 USHORT SectorsPerTrack;
114 USHORT Heads;
115 ULONG32 HiddenSectors;
116 ULONG32 LargeSectors;
117 ULONG32 LargeSectorsPerFat;
118 union
119 {
120 USHORT ExtendedFlags;
121 struct
122 {
123 ULONG ActiveFat:4;
124 ULONG Reserved0:3;
125 ULONG MirrorDisabled:1;
126 ULONG Reserved1:8;
127 };
128 };
129 USHORT FsVersion;
130 ULONG32 RootDirFirstCluster;
131 USHORT FsInfoSector;
132 USHORT BackupBootSector;
133 } BIOS_PARAMETER_BLOCK, *PBIOS_PARAMETER_BLOCK;
134
135 /* UDFS Structures */
136 #include <pshpack1.h>
137 typedef struct _TAG
138 {
139 USHORT Identifier;
140 USHORT Version;
141 UCHAR Checksum;
142 UCHAR Reserved;
143 USHORT SerialNumber;
144 USHORT Crc;
145 USHORT CrcLength;
146 ULONG Location;
147 } TAG, *PTAG;
148
149 typedef struct _EXTENT
150 {
151 ULONG Length;
152 ULONG Location;
153 } EXTENT, *PEXTENT;
154
155 typedef struct _AVDP
156 {
157 TAG DescriptorTag;
158 EXTENT MainVolumeDescriptorExtent;
159 EXTENT ReserveVolumeDescriptorExtent;
160 } AVDP, *PAVDP;
161 #include <poppack.h>
162
163 /* Filesystem Types */
164 typedef enum _FILE_SYSTEM_TYPE
165 {
166 FS_TYPE_UNUSED,
167 FS_TYPE_VFAT,
168 FS_TYPE_NTFS,
169 FS_TYPE_CDFS,
170 FS_TYPE_UDFS,
171 FS_TYPE_EXT2,
172 } FILE_SYSTEM_TYPE, *PFILE_SYSTEM_TYPE;
173
174 /* FS Recognizer State */
175 typedef enum _FS_REC_STATE
176 {
177 Pending,
178 Loaded,
179 Unloading
180 } FS_REC_STATE, *PFS_REC_STATE;
181
182 /* Device extension */
183 typedef struct _DEVICE_EXTENSION
184 {
185 FS_REC_STATE State;
186 FILE_SYSTEM_TYPE FsType;
187 PDEVICE_OBJECT Alternate;
188 } DEVICE_EXTENSION, *PDEVICE_EXTENSION;
189
190 /* Prototypes */
191 NTSTATUS
192 NTAPI
193 FsRecCdfsFsControl(
194 IN PDEVICE_OBJECT DeviceObject,
195 IN PIRP Irp
196 );
197
198 NTSTATUS
199 NTAPI
200 FsRecVfatFsControl(
201 IN PDEVICE_OBJECT DeviceObject,
202 IN PIRP Irp
203 );
204
205 NTSTATUS
206 NTAPI
207 FsRecNtfsFsControl(
208 IN PDEVICE_OBJECT DeviceObject,
209 IN PIRP Irp
210 );
211
212 NTSTATUS
213 NTAPI
214 FsRecUdfsFsControl(
215 IN PDEVICE_OBJECT DeviceObject,
216 IN PIRP Irp
217 );
218
219 NTSTATUS
220 NTAPI
221 FsRecExt2FsControl(
222 IN PDEVICE_OBJECT DeviceObject,
223 IN PIRP Irp
224 );
225
226 BOOLEAN
227 NTAPI
228 FsRecGetDeviceSectors(
229 IN PDEVICE_OBJECT DeviceObject,
230 IN ULONG SectorSize,
231 OUT PLARGE_INTEGER SectorCount
232 );
233
234 BOOLEAN
235 NTAPI
236 FsRecGetDeviceSectorSize(
237 IN PDEVICE_OBJECT DeviceObject,
238 OUT PULONG SectorSize
239 );
240
241 BOOLEAN
242 NTAPI
243 FsRecReadBlock(
244 IN PDEVICE_OBJECT DeviceObject,
245 IN PLARGE_INTEGER Offset,
246 IN ULONG Length,
247 IN ULONG SectorSize,
248 IN OUT PVOID *Buffer,
249 OUT PBOOLEAN DeviceError OPTIONAL
250 );
251
252 NTSTATUS
253 NTAPI
254 FsRecLoadFileSystem(
255 IN PDEVICE_OBJECT DeviceObject,
256 IN PWCHAR DriverServiceName
257 );