1 /* $Id: vfat.h,v 1.56 2003/02/13 22:24:17 hbirr Exp $ */
5 #define ROUND_UP(N, S) ((((N) + (S) - 1) / (S)) * (S))
6 #define ROUND_DOWN(N, S) ((N) - ((N) % (S)))
10 unsigned char magic0
, res0
, magic1
;
11 unsigned char OEMName
[8];
12 unsigned short BytesPerSector
;
13 unsigned char SectorsPerCluster
;
14 unsigned short ReservedSectors
;
15 unsigned char FATCount
;
16 unsigned short RootEntries
, Sectors
;
18 unsigned short FATSectors
, SectorsPerTrack
, Heads
;
19 unsigned long HiddenSectors
, SectorsHuge
;
20 unsigned char Drive
, Res1
, Sig
;
21 unsigned long VolumeID
;
22 unsigned char VolumeLabel
[11], SysType
[8];
23 unsigned char Res2
[446];
24 unsigned long Signatur1
;
25 } __attribute__((packed
));
29 unsigned char magic0
, res0
, magic1
; // 0
30 unsigned char OEMName
[8]; // 3
31 unsigned short BytesPerSector
; // 11
32 unsigned char SectorsPerCluster
; // 13
33 unsigned short ReservedSectors
; // 14
34 unsigned char FATCount
; // 16
35 unsigned short RootEntries
, Sectors
; // 17
36 unsigned char Media
; // 21
37 unsigned short FATSectors
, SectorsPerTrack
, Heads
; // 22
38 unsigned long HiddenSectors
, SectorsHuge
; // 28
39 unsigned long FATSectors32
; // 36
40 unsigned short ExtFlag
; // 40
41 unsigned short FSVersion
; // 42
42 unsigned long RootCluster
; // 44
43 unsigned short FSInfoSector
; // 48
44 unsigned short BootBackup
; // 50
45 unsigned char Res3
[12]; // 52
46 unsigned char Drive
; // 64
47 unsigned char Res4
; // 65
48 unsigned char ExtBootSignature
; // 66
49 unsigned long VolumeID
; // 67
50 unsigned char VolumeLabel
[11], SysType
[8]; // 71
51 unsigned char Res2
[418]; // 90
52 unsigned long Signature1
; // 508
53 } __attribute__((packed
));
57 unsigned long ExtBootSignature2
; // 0
58 unsigned char Res6
[480]; // 4
59 unsigned long FSINFOSignature
; // 484
60 unsigned long FreeCluster
; // 488
61 unsigned long NextCluster
; // 492
62 unsigned char Res7
[12]; // 496
63 unsigned long Signatur2
; // 508
64 } __attribute__((packed
));
66 typedef struct _BootSector BootSector
;
68 #define VFAT_CASE_LOWER_BASE 8 // base is lower case
69 #define VFAT_CASE_LOWER_EXT 16 // extension is lower case
73 unsigned char Filename
[8], Ext
[3];
76 unsigned char CreationTimeMs
;
77 unsigned short CreationTime
,CreationDate
,AccessDate
;
78 unsigned short FirstClusterHigh
; // higher
79 unsigned short UpdateTime
; //time create/update
80 unsigned short UpdateDate
; //date create/update
81 unsigned short FirstCluster
;
82 unsigned long FileSize
;
83 } __attribute__((packed
));
85 typedef struct _FATDirEntry FATDirEntry
, FAT_DIR_ENTRY
, *PFAT_DIR_ENTRY
;
89 unsigned char id
; // sequence number for slot
90 WCHAR name0_4
[5]; // first 5 characters in name
91 unsigned char attr
; // attribute byte
92 unsigned char reserved
; // always 0
93 unsigned char alias_checksum
; // checksum for 8.3 alias
94 WCHAR name5_10
[6]; // 6 more characters in name
95 unsigned char start
[2]; // starting cluster number
96 WCHAR name11_12
[2]; // last 2 characters in name
97 } __attribute__((packed
));
100 typedef struct _slot slot
;
102 #define BLOCKSIZE 512
108 #define VCB_VOLUME_LOCKED 0x0001
109 #define VCB_DISMOUNT_PENDING 0x0002
117 ULONG rootDirectorySectors
;
121 ULONG SectorsPerCluster
;
122 ULONG BytesPerSector
;
123 ULONG BytesPerCluster
;
124 ULONG NumberOfClusters
;
127 } FATINFO
, *PFATINFO
;
131 typedef struct _HASHENTRY
134 struct _VFATFCB
* self
;
135 struct _HASHENTRY
* next
;
139 #define FCB_HASH_TABLE_SIZE 1024
143 ERESOURCE DirResource
;
144 ERESOURCE FatResource
;
146 KSPIN_LOCK FcbListLock
;
147 LIST_ENTRY FcbListHead
;
149 PDEVICE_OBJECT StorageDevice
;
150 PFILE_OBJECT FATFileObject
;
152 ULONG LastAvailableCluster
;
153 ULONG AvailableClusters
;
154 BOOLEAN AvailableClustersValid
;
156 struct _VFATFCB
* VolumeFcb
;
157 struct _HASHENTRY
* FcbHashTable
[FCB_HASH_TABLE_SIZE
];
159 LIST_ENTRY VolumeListEntry
;
160 } DEVICE_EXTENSION
, *PDEVICE_EXTENSION
, VCB
, *PVCB
;
164 PDRIVER_OBJECT DriverObject
;
165 PDEVICE_OBJECT DeviceObject
;
167 ERESOURCE VolumeListLock
;
168 LIST_ENTRY VolumeListHead
;
169 NPAGED_LOOKASIDE_LIST FcbLookasideList
;
170 NPAGED_LOOKASIDE_LIST CcbLookasideList
;
171 NPAGED_LOOKASIDE_LIST IrpContextLookasideList
;
172 } VFAT_GLOBAL_DATA
, *PVFAT_GLOBAL_DATA
;
174 extern PVFAT_GLOBAL_DATA VfatGlobalData
;
176 #define FCB_CACHE_INITIALIZED 0x0001
177 #define FCB_DELETE_PENDING 0x0002
178 #define FCB_IS_FAT 0x0004
179 #define FCB_IS_PAGE_FILE 0x0008
180 #define FCB_IS_VOLUME 0x0010
182 typedef struct _VFATFCB
184 /* FCB header required by ROS/NT */
185 REACTOS_COMMON_FCB_HEADER RFCB
;
186 SECTION_OBJECT_POINTERS SectionObjectPointers
;
187 ERESOURCE MainResource
;
188 ERESOURCE PagingIoResource
;
189 /* end FCB header required by ROS/NT */
194 /* point on filename (250 chars max) in PathName */
197 /* path+filename 260 max */
198 WCHAR PathName
[MAX_PATH
];
200 /* short file name */
206 /* List of FCB's for this volume */
207 LIST_ENTRY FcbListEntry
;
209 /* pointer to the parent fcb */
210 struct _VFATFCB
* parentFcb
;
212 /* Flags for the fcb */
215 /* pointer to the file object which has initialized the fcb */
216 PFILE_OBJECT FileObject
;
218 /* Directory index for the short name entry */
221 /* Directory index where the long name starts */
224 /* Share access for the file object */
225 SHARE_ACCESS FCBShareAccess
;
227 /* Entry into the hash table for the path + long name */
230 /* Entry into the hash table for the path + short name */
233 /* List of byte-range locks for this file */
236 /* Structure members used only for paging files. */
239 } VFATFCB
, *PVFATFCB
;
241 typedef struct _VFATCCB
243 LARGE_INTEGER CurrentByteOffset
;
244 /* for DirectoryControl */
246 /* for DirectoryControl */
247 PWCHAR DirectorySearchPattern
;
251 } VFATCCB
, *PVFATCCB
;
254 #define TAG(A, B, C, D) (ULONG)(((A)<<0) + ((B)<<8) + ((C)<<16) + ((D)<<24))
257 #define TAG_CCB TAG('V', 'C', 'C', 'B')
258 #define TAG_FCB TAG('V', 'F', 'C', 'B')
259 #define TAG_IRP TAG('V', 'I', 'R', 'P')
261 #define ENTRIES_PER_SECTOR (BLOCKSIZE / sizeof(FATDirEntry))
263 typedef struct __DOSTIME
271 typedef struct __DOSDATE
279 #define IRPCONTEXT_CANWAIT 0x0001
284 PDEVICE_OBJECT DeviceObject
;
285 PDEVICE_EXTENSION DeviceExt
;
287 WORK_QUEUE_ITEM WorkQueueItem
;
288 PIO_STACK_LOCATION Stack
;
291 PFILE_OBJECT FileObject
;
292 } VFAT_IRP_CONTEXT
, *PVFAT_IRP_CONTEXT
;
294 /* ------------------------------------------------------ shutdown.c */
296 NTSTATUS STDCALL
VfatShutdown (PDEVICE_OBJECT DeviceObject
,
299 /* -------------------------------------------------------- volume.c */
301 NTSTATUS
VfatQueryVolumeInformation (PVFAT_IRP_CONTEXT IrpContext
);
303 NTSTATUS
VfatSetVolumeInformation (PVFAT_IRP_CONTEXT IrpContext
);
305 /* ------------------------------------------------------ blockdev.c */
307 NTSTATUS
VfatReadDisk(IN PDEVICE_OBJECT pDeviceObject
,
308 IN PLARGE_INTEGER ReadOffset
,
312 NTSTATUS
VfatWriteDisk(IN PDEVICE_OBJECT pDeviceObject
,
313 IN PLARGE_INTEGER WriteOffset
,
314 IN ULONG WriteLength
,
317 NTSTATUS
VfatBlockDeviceIoControl (IN PDEVICE_OBJECT DeviceObject
,
319 IN PVOID InputBuffer
,
320 IN ULONG InputBufferSize
,
321 IN OUT PVOID OutputBuffer
,
322 IN OUT PULONG pOutputBufferSize
);
324 /* ----------------------------------------------------------- dir.c */
326 NTSTATUS
VfatDirectoryControl (PVFAT_IRP_CONTEXT
);
328 BOOL
FsdDosDateTimeToFileTime (WORD wDosDate
,
332 BOOL
FsdFileTimeToDosDateTime (TIME
*FileTime
,
336 /* -------------------------------------------------------- create.c */
338 NTSTATUS
VfatCreate (PVFAT_IRP_CONTEXT IrpContext
);
340 NTSTATUS
VfatOpenFile (PDEVICE_EXTENSION DeviceExt
,
341 PFILE_OBJECT FileObject
,
344 NTSTATUS
FindFile (PDEVICE_EXTENSION DeviceExt
,
351 VOID
vfat8Dot3ToString (PFAT_DIR_ENTRY pEntry
,
354 NTSTATUS
ReadVolumeLabel(PDEVICE_EXTENSION DeviceExt
,
357 BOOLEAN
IsDeletedEntry (PVOID Block
,
360 BOOLEAN
IsLastEntry (PVOID Block
,
363 /* --------------------------------------------------------- close.c */
365 NTSTATUS
VfatClose (PVFAT_IRP_CONTEXT IrpContext
);
367 NTSTATUS
VfatCloseFile(PDEVICE_EXTENSION DeviceExt
,
368 PFILE_OBJECT FileObject
);
370 /* ------------------------------------------------------- cleanup.c */
372 NTSTATUS
VfatCleanup (PVFAT_IRP_CONTEXT IrpContext
);
374 /* --------------------------------------------------------- fsctl.c */
376 NTSTATUS
VfatFileSystemControl (PVFAT_IRP_CONTEXT IrpContext
);
378 /* --------------------------------------------------------- finfo.c */
380 NTSTATUS
VfatQueryInformation (PVFAT_IRP_CONTEXT IrpContext
);
382 NTSTATUS
VfatSetInformation (PVFAT_IRP_CONTEXT IrpContext
);
385 VfatSetAllocationSizeInformation(PFILE_OBJECT FileObject
,
387 PDEVICE_EXTENSION DeviceExt
,
388 PLARGE_INTEGER AllocationSize
);
390 /* --------------------------------------------------------- iface.c */
392 NTSTATUS STDCALL
DriverEntry (PDRIVER_OBJECT DriverObject
,
393 PUNICODE_STRING RegistryPath
);
395 /* --------------------------------------------------------- dirwr.c */
397 NTSTATUS
VfatAddEntry (PDEVICE_EXTENSION DeviceExt
,
398 PFILE_OBJECT pFileObject
,
399 ULONG RequestedOptions
,UCHAR ReqAttr
);
401 NTSTATUS
VfatUpdateEntry (PDEVICE_EXTENSION DeviceExt
,
402 PFILE_OBJECT pFileObject
);
404 NTSTATUS
delEntry(PDEVICE_EXTENSION
,
407 /* -------------------------------------------------------- string.c */
409 BOOLEAN
wstrcmpjoki (PWSTR s1
,
412 PWCHAR
vfatGetNextPathElement (PWCHAR pFileName
);
414 VOID
vfatWSubString (PWCHAR pTarget
,
415 const PWCHAR pSource
,
418 BOOL
vfatIsFileNameValid (PWCHAR pFileName
);
420 /* ----------------------------------------------------------- fat.c */
422 NTSTATUS
OffsetToCluster (PDEVICE_EXTENSION DeviceExt
,
429 ULONGLONG
ClusterToSector (PDEVICE_EXTENSION DeviceExt
,
432 NTSTATUS
GetNextCluster (PDEVICE_EXTENSION DeviceExt
,
433 ULONG CurrentCluster
,
437 NTSTATUS
CountAvailableClusters (PDEVICE_EXTENSION DeviceExt
,
438 PLARGE_INTEGER Clusters
);
440 /* ------------------------------------------------------ direntry.c */
442 ULONG
vfatDirEntryGetFirstCluster (PDEVICE_EXTENSION pDeviceExt
,
443 PFAT_DIR_ENTRY pDirEntry
);
445 BOOL
vfatIsDirEntryDeleted (FATDirEntry
* pFatDirEntry
);
447 BOOL
vfatIsDirEntryVolume (FATDirEntry
* pFatDirEntry
);
449 BOOL
vfatIsDirEntryEndMarker (FATDirEntry
* pFatDirEntry
);
451 VOID
vfatGetDirEntryName (PFAT_DIR_ENTRY pDirEntry
,
454 NTSTATUS
vfatGetNextDirEntry(PVOID
* pContext
,
457 IN OUT PULONG pDirIndex
,
459 OUT PFAT_DIR_ENTRY pDirEntry
,
460 OUT PULONG pStartIndex
);
462 /* ----------------------------------------------------------- fcb.c */
464 PVFATFCB
vfatNewFCB (PWCHAR pFileName
);
466 VOID
vfatDestroyFCB (PVFATFCB pFCB
);
468 VOID
vfatGrabFCB (PDEVICE_EXTENSION pVCB
,
471 VOID
vfatReleaseFCB (PDEVICE_EXTENSION pVCB
,
474 VOID
vfatAddFCBToTable (PDEVICE_EXTENSION pVCB
,
477 PVFATFCB
vfatGrabFCBFromTable (PDEVICE_EXTENSION pDeviceExt
,
480 PVFATFCB
vfatMakeRootFCB (PDEVICE_EXTENSION pVCB
);
482 PVFATFCB
vfatOpenRootFCB (PDEVICE_EXTENSION pVCB
);
484 BOOL
vfatFCBIsDirectory (PVFATFCB FCB
);
486 NTSTATUS
vfatAttachFCBToFileObject (PDEVICE_EXTENSION vcb
,
488 PFILE_OBJECT fileObject
);
490 NTSTATUS
vfatDirFindFile (PDEVICE_EXTENSION pVCB
,
495 NTSTATUS
vfatGetFCBForFile (PDEVICE_EXTENSION pVCB
,
496 PVFATFCB
*pParentFCB
,
498 const PWSTR pFileName
);
500 NTSTATUS
vfatMakeFCBFromDirEntry (PVCB vcb
,
501 PVFATFCB directoryFCB
,
503 PFAT_DIR_ENTRY dirEntry
,
508 /* ------------------------------------------------------------ rw.c */
510 NTSTATUS
VfatRead (PVFAT_IRP_CONTEXT IrpContext
);
512 NTSTATUS
VfatWrite (PVFAT_IRP_CONTEXT IrpContext
);
514 NTSTATUS
NextCluster(PDEVICE_EXTENSION DeviceExt
,
517 PULONG CurrentCluster
,
520 /* ----------------------------------------------------------- misc.c */
522 NTSTATUS
VfatQueueRequest(PVFAT_IRP_CONTEXT IrpContext
);
524 PVFAT_IRP_CONTEXT
VfatAllocateIrpContext(PDEVICE_OBJECT DeviceObject
,
527 VOID
VfatFreeIrpContext(PVFAT_IRP_CONTEXT IrpContext
);
529 NTSTATUS STDCALL
VfatBuildRequest (PDEVICE_OBJECT DeviceObject
,
532 PVOID
VfatGetUserBuffer(IN PIRP
);
534 NTSTATUS
VfatLockUserBuffer(IN PIRP
, IN ULONG
,
538 VfatSetExtendedAttributes(PFILE_OBJECT FileObject
,
541 /* ------------------------------------------------------------- flush.c */
543 NTSTATUS
VfatFlush(PVFAT_IRP_CONTEXT IrpContext
);
545 NTSTATUS
VfatFlushVolume(PDEVICE_EXTENSION DeviceExt
, PVFATFCB VolumeFcb
);