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