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)
18 // Tag for memory allocations
20 #define TAG(A, B, C, D) (ULONG)(((A)<<0) + ((B)<<8) + ((C)<<16) + ((D)<<24))
21 #define FSREC_TAG TAG('F', 's', 'R', 'c')
26 #define UDFS_VRS_START_OFFSET 32768
27 #define UDFS_AVDP_SECTOR 256
30 // Non-standard rounding macros
32 #define ROUND_UP(n, align) \
33 ROUND_DOWN(((ULONG)n) + (align) - 1, (align))
35 #define ROUND_DOWN(n, align) \
36 (((ULONG)n) & ~((align) - 1l))
39 // Conversion types and macros taken from internal ntifs headers
50 USHORT ForceAlignment
;
59 #define CopyUchar1(Dst,Src) { \
60 *((UCHAR1 *)(Dst)) = *((UNALIGNED UCHAR1 *)(Src)); \
63 #define CopyUchar2(Dst,Src) { \
64 *((UCHAR2 *)(Dst)) = *((UNALIGNED UCHAR2 *)(Src)); \
67 #define CopyUchar4(Dst,Src) { \
68 *((UCHAR4 *)(Dst)) = *((UNALIGNED UCHAR4 *)(Src)); \
71 #define FatUnpackBios(Bios,Pbios) { \
72 CopyUchar2(&(Bios)->BytesPerSector, &(Pbios)->BytesPerSector[0] ); \
73 CopyUchar1(&(Bios)->SectorsPerCluster, &(Pbios)->SectorsPerCluster[0]); \
74 CopyUchar2(&(Bios)->ReservedSectors, &(Pbios)->ReservedSectors[0] ); \
75 CopyUchar1(&(Bios)->Fats, &(Pbios)->Fats[0] ); \
76 CopyUchar2(&(Bios)->RootEntries, &(Pbios)->RootEntries[0] ); \
77 CopyUchar2(&(Bios)->Sectors, &(Pbios)->Sectors[0] ); \
78 CopyUchar1(&(Bios)->Media, &(Pbios)->Media[0] ); \
79 CopyUchar2(&(Bios)->SectorsPerFat, &(Pbios)->SectorsPerFat[0] ); \
80 CopyUchar2(&(Bios)->SectorsPerTrack, &(Pbios)->SectorsPerTrack[0] ); \
81 CopyUchar2(&(Bios)->Heads, &(Pbios)->Heads[0] ); \
82 CopyUchar4(&(Bios)->HiddenSectors, &(Pbios)->HiddenSectors[0] ); \
83 CopyUchar4(&(Bios)->LargeSectors, &(Pbios)->LargeSectors[0] ); \
87 // Packed versions of the BPB and Boot Sector
89 typedef struct _PACKED_BIOS_PARAMETER_BLOCK
91 UCHAR BytesPerSector
[2];
92 UCHAR SectorsPerCluster
[1];
93 UCHAR ReservedSectors
[2];
98 UCHAR SectorsPerFat
[2];
99 UCHAR SectorsPerTrack
[2];
101 UCHAR HiddenSectors
[4];
102 UCHAR LargeSectors
[4];
103 } PACKED_BIOS_PARAMETER_BLOCK
, *PPACKED_BIOS_PARAMETER_BLOCK
;
105 typedef struct _PACKED_BOOT_SECTOR
109 PACKED_BIOS_PARAMETER_BLOCK PackedBpb
;
110 UCHAR PhysicalDriveNumber
;
114 UCHAR VolumeLabel
[11];
116 } PACKED_BOOT_SECTOR
, *PPACKED_BOOT_SECTOR
;
119 // Unpacked version of the BPB
121 typedef struct BIOS_PARAMETER_BLOCK
123 USHORT BytesPerSector
;
124 UCHAR SectorsPerCluster
;
125 USHORT ReservedSectors
;
130 USHORT SectorsPerFat
;
131 USHORT SectorsPerTrack
;
133 ULONG32 HiddenSectors
;
134 ULONG32 LargeSectors
;
135 ULONG32 LargeSectorsPerFat
;
138 USHORT ExtendedFlags
;
143 ULONG MirrorDisabled
:1;
148 ULONG32 RootDirFirstCluster
;
150 USHORT BackupBootSector
;
151 } BIOS_PARAMETER_BLOCK
, *PBIOS_PARAMETER_BLOCK
;
156 #include <pshpack1.h>
169 typedef struct _EXTENT
178 EXTENT MainVolumeDescriptorExtent
;
179 EXTENT ReserveVolumeDescriptorExtent
;
186 typedef enum _FILE_SYSTEM_TYPE
194 } FILE_SYSTEM_TYPE
, *PFILE_SYSTEM_TYPE
;
197 // FS Recognizer State
199 typedef enum _FS_REC_STATE
204 } FS_REC_STATE
, *PFS_REC_STATE
;
209 typedef struct _DEVICE_EXTENSION
212 FILE_SYSTEM_TYPE FsType
;
213 PDEVICE_OBJECT Alternate
;
214 } DEVICE_EXTENSION
, *PDEVICE_EXTENSION
;
222 IN PDEVICE_OBJECT DeviceObject
,
229 IN PDEVICE_OBJECT DeviceObject
,
236 IN PDEVICE_OBJECT DeviceObject
,
243 IN PDEVICE_OBJECT DeviceObject
,
250 IN PDEVICE_OBJECT DeviceObject
,
256 FsRecGetDeviceSectors(
257 IN PDEVICE_OBJECT DeviceObject
,
259 OUT PLARGE_INTEGER SectorCount
264 FsRecGetDeviceSectorSize(
265 IN PDEVICE_OBJECT DeviceObject
,
266 OUT PULONG SectorSize
272 IN PDEVICE_OBJECT DeviceObject
,
273 IN PLARGE_INTEGER Offset
,
276 IN OUT PVOID
*Buffer
,
277 OUT PBOOLEAN DeviceError OPTIONAL
283 IN PDEVICE_OBJECT DeviceObject
,
284 IN PWCHAR DriverServiceName