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