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