remove whitespace from end of lines
[reactos.git] / reactos / drivers / fs / vfat / vfat.h
1 /* $Id$ */
2
3 #include <ddk/ntifs.h>
4 #include <ddk/ntdddisk.h>
5 #include <limits.h>
6 #include <debug.h>
7
8 #define USE_ROS_CC_AND_FS
9
10 /* FIXME */
11 #ifdef __USE_W32API
12 NTSTATUS NTAPI RtlOemStringToUnicodeString(PUNICODE_STRING, CONST STRING *, BOOLEAN);
13 NTSTATUS NTAPI RtlDowncaseUnicodeString(PUNICODE_STRING, PCUNICODE_STRING, BOOLEAN);
14 NTSTATUS NTAPI RtlUnicodeStringToOemString(POEM_STRING, PCUNICODE_STRING, BOOLEAN);
15 #undef DeleteFile /* FIXME */
16 #define VOLUME_IS_DIRTY 0x00000001 /* FIXME */
17 #endif
18
19 #ifdef USE_ROS_CC_AND_FS
20 NTSTATUS STDCALL CcRosInitializeFileCache(PFILE_OBJECT, ULONG);
21 NTSTATUS STDCALL CcRosReleaseFileCache(PFILE_OBJECT);
22 #define FSCTL_ROS_QUERY_LCN_MAPPING CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 63, METHOD_BUFFERED, FILE_ANY_ACCESS)
23 typedef struct _ROS_QUERY_LCN_MAPPING { LARGE_INTEGER LcnDiskOffset; } ROS_QUERY_LCN_MAPPING, *PROS_QUERY_LCN_MAPPING;
24 #endif
25
26 #define KEBUGCHECK(a) DbgPrint("KeBugCheck at %s:%i\n",__FILE__,__LINE__), KeBugCheck(a)
27 #define KEBUGCHECKEX(a,b,c,d,e) DbgPrint("KeBugCheckEx at %s:%i\n",__FILE__,__LINE__), KeBugCheckEx(a,b,c,d,e)
28
29 #define ROUND_UP(N, S) ((((N) + (S) - 1) / (S)) * (S))
30 #define ROUND_DOWN(N, S) ((N) - ((N) % (S)))
31
32 #include <pshpack1.h>
33 struct _BootSector
34 {
35 unsigned char magic0, res0, magic1;
36 unsigned char OEMName[8];
37 unsigned short BytesPerSector;
38 unsigned char SectorsPerCluster;
39 unsigned short ReservedSectors;
40 unsigned char FATCount;
41 unsigned short RootEntries, Sectors;
42 unsigned char Media;
43 unsigned short FATSectors, SectorsPerTrack, Heads;
44 unsigned long HiddenSectors, SectorsHuge;
45 unsigned char Drive, Res1, Sig;
46 unsigned long VolumeID;
47 unsigned char VolumeLabel[11], SysType[8];
48 unsigned char Res2[448];
49 unsigned short Signatur1;
50 };
51
52 struct _BootSector32
53 {
54 unsigned char magic0, res0, magic1; // 0
55 unsigned char OEMName[8]; // 3
56 unsigned short BytesPerSector; // 11
57 unsigned char SectorsPerCluster; // 13
58 unsigned short ReservedSectors; // 14
59 unsigned char FATCount; // 16
60 unsigned short RootEntries, Sectors; // 17
61 unsigned char Media; // 21
62 unsigned short FATSectors, SectorsPerTrack, Heads; // 22
63 unsigned long HiddenSectors, SectorsHuge; // 28
64 unsigned long FATSectors32; // 36
65 unsigned short ExtFlag; // 40
66 unsigned short FSVersion; // 42
67 unsigned long RootCluster; // 44
68 unsigned short FSInfoSector; // 48
69 unsigned short BootBackup; // 50
70 unsigned char Res3[12]; // 52
71 unsigned char Drive; // 64
72 unsigned char Res4; // 65
73 unsigned char ExtBootSignature; // 66
74 unsigned long VolumeID; // 67
75 unsigned char VolumeLabel[11], SysType[8]; // 71
76 unsigned char Res2[420]; // 90
77 unsigned short Signature1; // 510
78 };
79
80 struct _BootSectorFatX
81 {
82 unsigned char SysType[4]; // 0
83 unsigned long VolumeID; // 4
84 unsigned long SectorsPerCluster; // 8
85 unsigned short FATCount; // 12
86 unsigned long Unknown; // 14
87 unsigned char Unused[4078]; // 18
88 };
89
90 struct _FsInfoSector
91 {
92 unsigned long ExtBootSignature2; // 0
93 unsigned char Res6[480]; // 4
94 unsigned long FSINFOSignature; // 484
95 unsigned long FreeCluster; // 488
96 unsigned long NextCluster; // 492
97 unsigned char Res7[12]; // 496
98 unsigned long Signatur2; // 508
99 };
100
101 typedef struct _BootSector BootSector;
102
103 struct _FATDirEntry
104 {
105 union
106 {
107 struct { unsigned char Filename[8], Ext[3]; };
108 unsigned char ShortName[11];
109 };
110 unsigned char Attrib;
111 unsigned char lCase;
112 unsigned char CreationTimeMs;
113 unsigned short CreationTime,CreationDate,AccessDate;
114 unsigned short FirstClusterHigh; // higher
115 unsigned short UpdateTime; //time create/update
116 unsigned short UpdateDate; //date create/update
117 unsigned short FirstCluster;
118 unsigned long FileSize;
119 };
120
121 typedef struct _FATDirEntry FAT_DIR_ENTRY, *PFAT_DIR_ENTRY;
122
123 struct _FATXDirEntry
124 {
125 unsigned char FilenameLength; // 0
126 unsigned char Attrib; // 1
127 unsigned char Filename[42]; // 2
128 unsigned long FirstCluster; // 44
129 unsigned long FileSize; // 48
130 unsigned short UpdateTime; // 52
131 unsigned short UpdateDate; // 54
132 unsigned short CreationTime; // 56
133 unsigned short CreationDate; // 58
134 unsigned short AccessTime; // 60
135 unsigned short AccessDate; // 62
136 };
137
138 struct _slot
139 {
140 unsigned char id; // sequence number for slot
141 WCHAR name0_4[5]; // first 5 characters in name
142 unsigned char attr; // attribute byte
143 unsigned char reserved; // always 0
144 unsigned char alias_checksum; // checksum for 8.3 alias
145 WCHAR name5_10[6]; // 6 more characters in name
146 unsigned char start[2]; // starting cluster number
147 WCHAR name11_12[2]; // last 2 characters in name
148 };
149
150 typedef struct _slot slot;
151
152 #include <poppack.h>
153
154 #define VFAT_CASE_LOWER_BASE 8 // base is lower case
155 #define VFAT_CASE_LOWER_EXT 16 // extension is lower case
156
157 #define LONGNAME_MAX_LENGTH 256 // max length for a long filename
158
159 #define ENTRY_DELETED(DeviceExt, DirEntry) ((DeviceExt)->Flags & VCB_IS_FATX ? FATX_ENTRY_DELETED(&((DirEntry)->FatX)) : FAT_ENTRY_DELETED(&((DirEntry)->Fat)))
160 #define ENTRY_VOLUME(DeviceExt, DirEntry) ((DeviceExt)->Flags & VCB_IS_FATX ? FATX_ENTRY_VOLUME(&((DirEntry)->FatX)) : FAT_ENTRY_VOLUME(&((DirEntry)->Fat)))
161 #define ENTRY_END(DeviceExt, DirEntry) ((DeviceExt)->Flags & VCB_IS_FATX ? FATX_ENTRY_END(&((DirEntry)->FatX)) : FAT_ENTRY_END(&((DirEntry)->Fat)))
162
163 #define FAT_ENTRY_DELETED(DirEntry) ((DirEntry)->Filename[0] == 0xe5)
164 #define FAT_ENTRY_END(DirEntry) ((DirEntry)->Filename[0] == 0)
165 #define FAT_ENTRY_LONG(DirEntry) (((DirEntry)->Attrib & 0x3f) == 0x0f)
166 #define FAT_ENTRY_VOLUME(DirEntry) (((DirEntry)->Attrib & 0x1f) == 0x08)
167
168 #define FATX_ENTRY_DELETED(DirEntry) ((DirEntry)->FilenameLength == 0xe5)
169 #define FATX_ENTRY_END(DirEntry) ((DirEntry)->FilenameLength == 0xff)
170 #define FATX_ENTRY_LONG(DirEntry) (FALSE)
171 #define FATX_ENTRY_VOLUME(DirEntry) (((DirEntry)->Attrib & 0x1f) == 0x08)
172
173 #define FAT_ENTRIES_PER_PAGE (PAGE_SIZE / sizeof (FAT_DIR_ENTRY))
174 #define FATX_ENTRIES_PER_PAGE (PAGE_SIZE / sizeof (FATX_DIR_ENTRY))
175
176 typedef struct _FATXDirEntry FATX_DIR_ENTRY, *PFATX_DIR_ENTRY;
177
178 union _DIR_ENTRY
179 {
180 FAT_DIR_ENTRY Fat;
181 FATX_DIR_ENTRY FatX;
182 };
183
184 typedef union _DIR_ENTRY DIR_ENTRY, *PDIR_ENTRY;
185
186 #define BLOCKSIZE 512
187
188 #define FAT16 (1)
189 #define FAT12 (2)
190 #define FAT32 (3)
191 #define FATX16 (4)
192 #define FATX32 (5)
193
194 #define VCB_VOLUME_LOCKED 0x0001
195 #define VCB_DISMOUNT_PENDING 0x0002
196 #define VCB_IS_FATX 0x0004
197 #define VCB_IS_DIRTY 0x4000 /* Volume is dirty */
198 #define VCB_CLEAR_DIRTY 0x8000 /* Clean dirty flag at shutdown */
199
200 typedef struct
201 {
202 ULONG VolumeID;
203 ULONG FATStart;
204 ULONG FATCount;
205 ULONG FATSectors;
206 ULONG rootDirectorySectors;
207 ULONG rootStart;
208 ULONG dataStart;
209 ULONG RootCluster;
210 ULONG SectorsPerCluster;
211 ULONG BytesPerSector;
212 ULONG BytesPerCluster;
213 ULONG NumberOfClusters;
214 ULONG FatType;
215 ULONG Sectors;
216 BOOLEAN FixedMedia;
217 } FATINFO, *PFATINFO;
218
219 struct _VFATFCB;
220 struct _VFAT_DIRENTRY_CONTEXT;
221
222 typedef struct _HASHENTRY
223 {
224 ULONG Hash;
225 struct _VFATFCB* self;
226 struct _HASHENTRY* next;
227 }
228 HASHENTRY;
229
230 #define FCB_HASH_TABLE_SIZE 65536
231
232 typedef struct DEVICE_EXTENSION *PDEVICE_EXTENSION;
233
234 typedef NTSTATUS (*PGET_NEXT_CLUSTER)(PDEVICE_EXTENSION,ULONG,PULONG);
235 typedef NTSTATUS (*PFIND_AND_MARK_AVAILABLE_CLUSTER)(PDEVICE_EXTENSION,PULONG);
236 typedef NTSTATUS (*PWRITE_CLUSTER)(PDEVICE_EXTENSION,ULONG,ULONG,PULONG);
237
238 typedef NTSTATUS (*PGET_NEXT_DIR_ENTRY)(PVOID*,PVOID*,struct _VFATFCB*,struct _VFAT_DIRENTRY_CONTEXT*,BOOLEAN);
239
240 typedef struct DEVICE_EXTENSION
241 {
242 ERESOURCE DirResource;
243 ERESOURCE FatResource;
244
245 KSPIN_LOCK FcbListLock;
246 LIST_ENTRY FcbListHead;
247 ULONG HashTableSize;
248 struct _HASHENTRY** FcbHashTable;
249
250 PDEVICE_OBJECT StorageDevice;
251 PFILE_OBJECT FATFileObject;
252 FATINFO FatInfo;
253 ULONG LastAvailableCluster;
254 ULONG AvailableClusters;
255 BOOLEAN AvailableClustersValid;
256 ULONG Flags;
257 struct _VFATFCB * VolumeFcb;
258
259 /* Pointers to functions for manipulating FAT. */
260 PGET_NEXT_CLUSTER GetNextCluster;
261 PFIND_AND_MARK_AVAILABLE_CLUSTER FindAndMarkAvailableCluster;
262 PWRITE_CLUSTER WriteCluster;
263 ULONG CleanShutBitMask;
264
265 /* Pointers to functions for manipulating directory entries. */
266 PGET_NEXT_DIR_ENTRY GetNextDirEntry;
267
268 ULONG BaseDateYear;
269
270 LIST_ENTRY VolumeListEntry;
271 } DEVICE_EXTENSION, VCB, *PVCB;
272
273 typedef struct
274 {
275 PDRIVER_OBJECT DriverObject;
276 PDEVICE_OBJECT DeviceObject;
277 ULONG Flags;
278 ERESOURCE VolumeListLock;
279 LIST_ENTRY VolumeListHead;
280 NPAGED_LOOKASIDE_LIST FcbLookasideList;
281 NPAGED_LOOKASIDE_LIST CcbLookasideList;
282 NPAGED_LOOKASIDE_LIST IrpContextLookasideList;
283 FAST_IO_DISPATCH FastIoDispatch;
284 CACHE_MANAGER_CALLBACKS CacheMgrCallbacks;
285 } VFAT_GLOBAL_DATA, *PVFAT_GLOBAL_DATA;
286
287 extern PVFAT_GLOBAL_DATA VfatGlobalData;
288
289 #define FCB_CACHE_INITIALIZED 0x0001
290 #define FCB_DELETE_PENDING 0x0002
291 #define FCB_IS_FAT 0x0004
292 #define FCB_IS_PAGE_FILE 0x0008
293 #define FCB_IS_VOLUME 0x0010
294 #define FCB_IS_DIRTY 0x0020
295 #define FCB_IS_FATX_ENTRY 0x0040
296
297 typedef struct _VFATFCB
298 {
299 /* FCB header required by ROS/NT */
300 FSRTL_COMMON_FCB_HEADER RFCB;
301 SECTION_OBJECT_POINTERS SectionObjectPointers;
302 ERESOURCE MainResource;
303 ERESOURCE PagingIoResource;
304 /* end FCB header required by ROS/NT */
305
306 /* directory entry for this file or directory */
307 DIR_ENTRY entry;
308
309 /* Pointer to attributes in entry */
310 PUCHAR Attributes;
311
312 /* long file name, points into PathNameBuffer */
313 UNICODE_STRING LongNameU;
314
315 /* short file name */
316 UNICODE_STRING ShortNameU;
317
318 /* directory name, points into PathNameBuffer */
319 UNICODE_STRING DirNameU;
320
321 /* path + long file name 260 max*/
322 UNICODE_STRING PathNameU;
323
324 /* buffer for PathNameU */
325 PWCHAR PathNameBuffer;
326
327 /* buffer for ShortNameU */
328 WCHAR ShortNameBuffer[13];
329
330 /* */
331 LONG RefCount;
332
333 /* List of FCB's for this volume */
334 LIST_ENTRY FcbListEntry;
335
336 /* pointer to the parent fcb */
337 struct _VFATFCB* parentFcb;
338
339 /* Flags for the fcb */
340 ULONG Flags;
341
342 /* pointer to the file object which has initialized the fcb */
343 PFILE_OBJECT FileObject;
344
345 /* Directory index for the short name entry */
346 ULONG dirIndex;
347
348 /* Directory index where the long name starts */
349 ULONG startIndex;
350
351 /* Share access for the file object */
352 SHARE_ACCESS FCBShareAccess;
353
354 /* Incremented on IRP_MJ_CREATE, decremented on IRP_MJ_CLEANUP */
355 ULONG OpenHandleCount;
356
357 /* Entry into the hash table for the path + long name */
358 HASHENTRY Hash;
359
360 /* Entry into the hash table for the path + short name */
361 HASHENTRY ShortHash;
362
363 /* List of byte-range locks for this file */
364 FILE_LOCK FileLock;
365
366 /*
367 * Optimalization: caching of last read/write cluster+offset pair. Can't
368 * be in VFATCCB because it must be reset everytime the allocated clusters
369 * change.
370 */
371 FAST_MUTEX LastMutex;
372 ULONG LastCluster;
373 ULONG LastOffset;
374 } VFATFCB, *PVFATFCB;
375
376 typedef struct _VFATCCB
377 {
378 LARGE_INTEGER CurrentByteOffset;
379 /* for DirectoryControl */
380 ULONG Entry;
381 /* for DirectoryControl */
382 UNICODE_STRING SearchPattern;
383 } VFATCCB, *PVFATCCB;
384
385 #ifndef TAG
386 #define TAG(A, B, C, D) (ULONG)(((A)<<0) + ((B)<<8) + ((C)<<16) + ((D)<<24))
387 #endif
388
389 #define TAG_CCB TAG('V', 'C', 'C', 'B')
390 #define TAG_FCB TAG('V', 'F', 'C', 'B')
391 #define TAG_IRP TAG('V', 'I', 'R', 'P')
392
393 #define ENTRIES_PER_SECTOR (BLOCKSIZE / sizeof(FATDirEntry))
394
395 typedef struct __DOSTIME
396 {
397 USHORT Second:5;
398 USHORT Minute:6;
399 USHORT Hour:5;
400 }
401 DOSTIME, *PDOSTIME;
402
403 typedef struct __DOSDATE
404 {
405 USHORT Day:5;
406 USHORT Month:4;
407 USHORT Year:5;
408 }
409 DOSDATE, *PDOSDATE;
410
411 #define IRPCONTEXT_CANWAIT 0x0001
412 #define IRPCONTEXT_PENDINGRETURNED 0x0002
413
414 typedef struct
415 {
416 PIRP Irp;
417 PDEVICE_OBJECT DeviceObject;
418 PDEVICE_EXTENSION DeviceExt;
419 ULONG Flags;
420 WORK_QUEUE_ITEM WorkQueueItem;
421 PIO_STACK_LOCATION Stack;
422 UCHAR MajorFunction;
423 UCHAR MinorFunction;
424 PFILE_OBJECT FileObject;
425 ULONG RefCount;
426 KEVENT Event;
427 } VFAT_IRP_CONTEXT, *PVFAT_IRP_CONTEXT;
428
429 typedef struct _VFAT_DIRENTRY_CONTEXT
430 {
431 ULONG StartIndex;
432 ULONG DirIndex;
433 DIR_ENTRY DirEntry;
434 UNICODE_STRING LongNameU;
435 UNICODE_STRING ShortNameU;
436 } VFAT_DIRENTRY_CONTEXT, *PVFAT_DIRENTRY_CONTEXT;
437
438
439 /* ------------------------------------------------------ shutdown.c */
440
441 NTSTATUS STDCALL VfatShutdown (PDEVICE_OBJECT DeviceObject,
442 PIRP Irp);
443
444 /* -------------------------------------------------------- volume.c */
445
446 NTSTATUS VfatQueryVolumeInformation (PVFAT_IRP_CONTEXT IrpContext);
447
448 NTSTATUS VfatSetVolumeInformation (PVFAT_IRP_CONTEXT IrpContext);
449
450 /* ------------------------------------------------------ blockdev.c */
451
452 NTSTATUS VfatReadDisk(IN PDEVICE_OBJECT pDeviceObject,
453 IN PLARGE_INTEGER ReadOffset,
454 IN ULONG ReadLength,
455 IN PUCHAR Buffer,
456 IN BOOLEAN Override);
457
458 NTSTATUS VfatReadDiskPartial (IN PVFAT_IRP_CONTEXT IrpContext,
459 IN PLARGE_INTEGER ReadOffset,
460 IN ULONG ReadLength,
461 IN ULONG BufferOffset,
462 IN BOOLEAN Wait);
463
464 NTSTATUS VfatWriteDiskPartial(IN PVFAT_IRP_CONTEXT IrpContext,
465 IN PLARGE_INTEGER WriteOffset,
466 IN ULONG WriteLength,
467 IN ULONG BufferOffset,
468 IN BOOLEAN Wait);
469
470 NTSTATUS VfatBlockDeviceIoControl (IN PDEVICE_OBJECT DeviceObject,
471 IN ULONG CtlCode,
472 IN PVOID InputBuffer,
473 IN ULONG InputBufferSize,
474 IN OUT PVOID OutputBuffer,
475 IN OUT PULONG pOutputBufferSize,
476 IN BOOLEAN Override);
477
478 /* ----------------------------------------------------------- dir.c */
479
480 NTSTATUS VfatDirectoryControl (PVFAT_IRP_CONTEXT);
481
482 BOOLEAN FsdDosDateTimeToSystemTime (PDEVICE_EXTENSION DeviceExt,
483 USHORT DosDate,
484 USHORT DosTime,
485 PLARGE_INTEGER SystemTime);
486
487 BOOLEAN FsdSystemTimeToDosDateTime (PDEVICE_EXTENSION DeviceExt,
488 PLARGE_INTEGER SystemTime,
489 USHORT *pDosDate,
490 USHORT *pDosTime);
491
492 /* -------------------------------------------------------- create.c */
493
494 NTSTATUS VfatCreate (PVFAT_IRP_CONTEXT IrpContext);
495
496 NTSTATUS VfatOpenFile (PDEVICE_EXTENSION DeviceExt,
497 PFILE_OBJECT FileObject,
498 PVFATFCB* parentFcb);
499
500 NTSTATUS FindFile (PDEVICE_EXTENSION DeviceExt,
501 PVFATFCB Parent,
502 PUNICODE_STRING FileToFindU,
503 PVFAT_DIRENTRY_CONTEXT DirContext,
504 BOOLEAN First);
505
506 VOID vfat8Dot3ToString (PFAT_DIR_ENTRY pEntry,
507 PUNICODE_STRING NameU);
508
509 NTSTATUS ReadVolumeLabel(PDEVICE_EXTENSION DeviceExt,
510 PVPB Vpb);
511
512 /* --------------------------------------------------------- close.c */
513
514 NTSTATUS VfatClose (PVFAT_IRP_CONTEXT IrpContext);
515
516 NTSTATUS VfatCloseFile(PDEVICE_EXTENSION DeviceExt,
517 PFILE_OBJECT FileObject);
518
519 /* ------------------------------------------------------- cleanup.c */
520
521 NTSTATUS VfatCleanup (PVFAT_IRP_CONTEXT IrpContext);
522
523 /* --------------------------------------------------------- fastio.c */
524
525 VOID
526 VfatInitFastIoRoutines(PFAST_IO_DISPATCH FastIoDispatch);
527
528 BOOLEAN NTAPI
529 VfatAcquireForLazyWrite(IN PVOID Context,
530 IN BOOLEAN Wait);
531
532 VOID NTAPI
533 VfatReleaseFromLazyWrite(IN PVOID Context);
534
535 BOOLEAN NTAPI
536 VfatAcquireForReadAhead(IN PVOID Context,
537 IN BOOLEAN Wait);
538
539 VOID NTAPI
540 VfatReleaseFromReadAhead(IN PVOID Context);
541
542 /* --------------------------------------------------------- fsctl.c */
543
544 NTSTATUS VfatFileSystemControl (PVFAT_IRP_CONTEXT IrpContext);
545
546 /* --------------------------------------------------------- finfo.c */
547
548 NTSTATUS VfatQueryInformation (PVFAT_IRP_CONTEXT IrpContext);
549
550 NTSTATUS VfatSetInformation (PVFAT_IRP_CONTEXT IrpContext);
551
552 NTSTATUS
553 VfatSetAllocationSizeInformation(PFILE_OBJECT FileObject,
554 PVFATFCB Fcb,
555 PDEVICE_EXTENSION DeviceExt,
556 PLARGE_INTEGER AllocationSize);
557
558 /* --------------------------------------------------------- iface.c */
559
560 NTSTATUS STDCALL DriverEntry (PDRIVER_OBJECT DriverObject,
561 PUNICODE_STRING RegistryPath);
562
563 /* --------------------------------------------------------- dirwr.c */
564
565 NTSTATUS VfatAddEntry (PDEVICE_EXTENSION DeviceExt,
566 PUNICODE_STRING PathNameU,
567 PVFATFCB* Fcb,
568 PVFATFCB ParentFcb,
569 ULONG RequestedOptions,
570 UCHAR ReqAttr);
571
572 NTSTATUS VfatUpdateEntry (PVFATFCB pFcb);
573
574 NTSTATUS VfatDelEntry(PDEVICE_EXTENSION, PVFATFCB);
575
576 BOOLEAN
577 vfatFindDirSpace(PDEVICE_EXTENSION DeviceExt,
578 PVFATFCB pDirFcb,
579 ULONG nbSlots,
580 PULONG start);
581
582 /* -------------------------------------------------------- string.c */
583
584 VOID
585 vfatSplitPathName(PUNICODE_STRING PathNameU,
586 PUNICODE_STRING DirNameU,
587 PUNICODE_STRING FileNameU);
588
589 BOOLEAN vfatIsLongIllegal(WCHAR c);
590
591 BOOLEAN wstrcmpjoki (PWSTR s1,
592 PWSTR s2);
593
594 /* ----------------------------------------------------------- fat.c */
595
596 NTSTATUS FAT12GetNextCluster(PDEVICE_EXTENSION DeviceExt,
597 ULONG CurrentCluster,
598 PULONG NextCluster);
599
600 NTSTATUS FAT12FindAndMarkAvailableCluster(PDEVICE_EXTENSION DeviceExt,
601 PULONG Cluster);
602
603 NTSTATUS FAT12WriteCluster(PDEVICE_EXTENSION DeviceExt,
604 ULONG ClusterToWrite,
605 ULONG NewValue,
606 PULONG OldValue);
607
608 NTSTATUS FAT16GetNextCluster(PDEVICE_EXTENSION DeviceExt,
609 ULONG CurrentCluster,
610 PULONG NextCluster);
611
612 NTSTATUS FAT16FindAndMarkAvailableCluster(PDEVICE_EXTENSION DeviceExt,
613 PULONG Cluster);
614
615 NTSTATUS FAT16WriteCluster(PDEVICE_EXTENSION DeviceExt,
616 ULONG ClusterToWrite,
617 ULONG NewValue,
618 PULONG OldValue);
619
620 NTSTATUS FAT32GetNextCluster(PDEVICE_EXTENSION DeviceExt,
621 ULONG CurrentCluster,
622 PULONG NextCluster);
623
624 NTSTATUS FAT32FindAndMarkAvailableCluster(PDEVICE_EXTENSION DeviceExt,
625 PULONG Cluster);
626
627 NTSTATUS FAT32WriteCluster(PDEVICE_EXTENSION DeviceExt,
628 ULONG ClusterToWrite,
629 ULONG NewValue,
630 PULONG OldValue);
631
632 NTSTATUS OffsetToCluster (PDEVICE_EXTENSION DeviceExt,
633 ULONG FirstCluster,
634 ULONG FileOffset,
635 PULONG Cluster,
636 BOOLEAN Extend);
637
638 ULONGLONG ClusterToSector (PDEVICE_EXTENSION DeviceExt,
639 ULONG Cluster);
640
641 NTSTATUS GetNextCluster (PDEVICE_EXTENSION DeviceExt,
642 ULONG CurrentCluster,
643 PULONG NextCluster);
644
645 NTSTATUS GetNextClusterExtend (PDEVICE_EXTENSION DeviceExt,
646 ULONG CurrentCluster,
647 PULONG NextCluster);
648
649 NTSTATUS CountAvailableClusters (PDEVICE_EXTENSION DeviceExt,
650 PLARGE_INTEGER Clusters);
651
652 NTSTATUS
653 WriteCluster(PDEVICE_EXTENSION DeviceExt,
654 ULONG ClusterToWrite,
655 ULONG NewValue);
656
657 /* ------------------------------------------------------ direntry.c */
658
659 ULONG vfatDirEntryGetFirstCluster (PDEVICE_EXTENSION pDeviceExt,
660 PDIR_ENTRY pDirEntry);
661
662 BOOLEAN VfatIsDirectoryEmpty(PVFATFCB Fcb);
663
664 NTSTATUS FATGetNextDirEntry(PVOID * pContext,
665 PVOID * pPage,
666 IN PVFATFCB pDirFcb,
667 IN PVFAT_DIRENTRY_CONTEXT DirContext,
668 BOOLEAN First);
669
670 NTSTATUS FATXGetNextDirEntry(PVOID * pContext,
671 PVOID * pPage,
672 IN PVFATFCB pDirFcb,
673 IN PVFAT_DIRENTRY_CONTEXT DirContext,
674 BOOLEAN First);
675
676 /* ----------------------------------------------------------- fcb.c */
677
678 PVFATFCB vfatNewFCB (PDEVICE_EXTENSION pVCB,
679 PUNICODE_STRING pFileNameU);
680
681 VOID vfatDestroyFCB (PVFATFCB pFCB);
682
683 VOID vfatDestroyCCB(PVFATCCB pCcb);
684
685 VOID vfatGrabFCB (PDEVICE_EXTENSION pVCB,
686 PVFATFCB pFCB);
687
688 VOID vfatReleaseFCB (PDEVICE_EXTENSION pVCB,
689 PVFATFCB pFCB);
690
691 VOID vfatAddFCBToTable (PDEVICE_EXTENSION pVCB,
692 PVFATFCB pFCB);
693
694 PVFATFCB vfatGrabFCBFromTable (PDEVICE_EXTENSION pDeviceExt,
695 PUNICODE_STRING pFileNameU);
696
697 PVFATFCB vfatMakeRootFCB (PDEVICE_EXTENSION pVCB);
698
699 PVFATFCB vfatOpenRootFCB (PDEVICE_EXTENSION pVCB);
700
701 BOOLEAN vfatFCBIsDirectory (PVFATFCB FCB);
702
703 BOOLEAN vfatFCBIsRoot(PVFATFCB FCB);
704
705 NTSTATUS vfatAttachFCBToFileObject (PDEVICE_EXTENSION vcb,
706 PVFATFCB fcb,
707 PFILE_OBJECT fileObject);
708
709 NTSTATUS vfatDirFindFile (PDEVICE_EXTENSION pVCB,
710 PVFATFCB parentFCB,
711 PUNICODE_STRING FileToFindU,
712 PVFATFCB * fileFCB);
713
714 NTSTATUS vfatGetFCBForFile (PDEVICE_EXTENSION pVCB,
715 PVFATFCB *pParentFCB,
716 PVFATFCB *pFCB,
717 PUNICODE_STRING pFileNameU);
718
719 NTSTATUS vfatMakeFCBFromDirEntry (PVCB vcb,
720 PVFATFCB directoryFCB,
721 PVFAT_DIRENTRY_CONTEXT DirContext,
722 PVFATFCB * fileFCB);
723
724 /* ------------------------------------------------------------ rw.c */
725
726 NTSTATUS VfatRead (PVFAT_IRP_CONTEXT IrpContext);
727
728 NTSTATUS VfatWrite (PVFAT_IRP_CONTEXT IrpContext);
729
730 NTSTATUS NextCluster(PDEVICE_EXTENSION DeviceExt,
731 ULONG FirstCluster,
732 PULONG CurrentCluster,
733 BOOLEAN Extend);
734
735 /* ----------------------------------------------------------- misc.c */
736
737 NTSTATUS VfatQueueRequest(PVFAT_IRP_CONTEXT IrpContext);
738
739 PVFAT_IRP_CONTEXT VfatAllocateIrpContext(PDEVICE_OBJECT DeviceObject,
740 PIRP Irp);
741
742 VOID VfatFreeIrpContext(PVFAT_IRP_CONTEXT IrpContext);
743
744 NTSTATUS STDCALL VfatBuildRequest (PDEVICE_OBJECT DeviceObject,
745 PIRP Irp);
746
747 PVOID VfatGetUserBuffer(IN PIRP);
748
749 NTSTATUS VfatLockUserBuffer(IN PIRP, IN ULONG,
750 IN LOCK_OPERATION);
751
752 NTSTATUS
753 VfatSetExtendedAttributes(PFILE_OBJECT FileObject,
754 PVOID Ea,
755 ULONG EaLength);
756 /* ------------------------------------------------------------- flush.c */
757
758 NTSTATUS VfatFlush(PVFAT_IRP_CONTEXT IrpContext);
759
760 NTSTATUS VfatFlushVolume(PDEVICE_EXTENSION DeviceExt, PVFATFCB VolumeFcb);
761
762
763 /* EOF */