-/* $Id: vfat.h 16656 2005-07-20 02:52:52Z ion $ */
-
-#include <ddk/ntifs.h>
-#include <ddk/ntdddisk.h>
-#include <ndk/ntndk.h>
-#include <reactos/helper.h>
-#include <ccros.h>
-#include <limits.h>
-#include <debug.h>
-
-#define USE_ROS_CC_AND_FS
-
-#include <pshpack1.h>
-struct _BootSector
-{
- unsigned char magic0, res0, magic1;
- unsigned char OEMName[8];
- unsigned short BytesPerSector;
- unsigned char SectorsPerCluster;
- unsigned short ReservedSectors;
- unsigned char FATCount;
- unsigned short RootEntries, Sectors;
- unsigned char Media;
- unsigned short FATSectors, SectorsPerTrack, Heads;
- unsigned long HiddenSectors, SectorsHuge;
- unsigned char Drive, Res1, Sig;
- unsigned long VolumeID;
- unsigned char VolumeLabel[11], SysType[8];
- unsigned char Res2[448];
- unsigned short Signatur1;
-};
-
-struct _BootSector32
-{
- unsigned char magic0, res0, magic1; // 0
- unsigned char OEMName[8]; // 3
- unsigned short BytesPerSector; // 11
- unsigned char SectorsPerCluster; // 13
- unsigned short ReservedSectors; // 14
- unsigned char FATCount; // 16
- unsigned short RootEntries, Sectors; // 17
- unsigned char Media; // 21
- unsigned short FATSectors, SectorsPerTrack, Heads; // 22
- unsigned long HiddenSectors, SectorsHuge; // 28
- unsigned long FATSectors32; // 36
- unsigned short ExtFlag; // 40
- unsigned short FSVersion; // 42
- unsigned long RootCluster; // 44
- unsigned short FSInfoSector; // 48
- unsigned short BootBackup; // 50
- unsigned char Res3[12]; // 52
- unsigned char Drive; // 64
- unsigned char Res4; // 65
- unsigned char ExtBootSignature; // 66
- unsigned long VolumeID; // 67
- unsigned char VolumeLabel[11], SysType[8]; // 71
- unsigned char Res2[420]; // 90
- unsigned short Signature1; // 510
-};
-
-struct _BootSectorFatX
-{
- unsigned char SysType[4]; // 0
- unsigned long VolumeID; // 4
- unsigned long SectorsPerCluster; // 8
- unsigned short FATCount; // 12
- unsigned long Unknown; // 14
- unsigned char Unused[4078]; // 18
-};
-
-struct _FsInfoSector
-{
- unsigned long ExtBootSignature2; // 0
- unsigned char Res6[480]; // 4
- unsigned long FSINFOSignature; // 484
- unsigned long FreeCluster; // 488
- unsigned long NextCluster; // 492
- unsigned char Res7[12]; // 496
- unsigned long Signatur2; // 508
-};
-
-typedef struct _BootSector BootSector;
-
-struct _FATDirEntry
-{
- union
- {
- struct { unsigned char Filename[8], Ext[3]; };
- unsigned char ShortName[11];
- };
- unsigned char Attrib;
- unsigned char lCase;
- unsigned char CreationTimeMs;
- unsigned short CreationTime,CreationDate,AccessDate;
- unsigned short FirstClusterHigh; // higher
- unsigned short UpdateTime; //time create/update
- unsigned short UpdateDate; //date create/update
- unsigned short FirstCluster;
- unsigned long FileSize;
-};
-
-typedef struct _FATDirEntry FAT_DIR_ENTRY, *PFAT_DIR_ENTRY;
-
-struct _FATXDirEntry
-{
- unsigned char FilenameLength; // 0
- unsigned char Attrib; // 1
- unsigned char Filename[42]; // 2
- unsigned long FirstCluster; // 44
- unsigned long FileSize; // 48
- unsigned short UpdateTime; // 52
- unsigned short UpdateDate; // 54
- unsigned short CreationTime; // 56
- unsigned short CreationDate; // 58
- unsigned short AccessTime; // 60
- unsigned short AccessDate; // 62
-};
-
-struct _slot
-{
- unsigned char id; // sequence number for slot
- WCHAR name0_4[5]; // first 5 characters in name
- unsigned char attr; // attribute byte
- unsigned char reserved; // always 0
- unsigned char alias_checksum; // checksum for 8.3 alias
- WCHAR name5_10[6]; // 6 more characters in name
- unsigned char start[2]; // starting cluster number
- WCHAR name11_12[2]; // last 2 characters in name
-};
-
-typedef struct _slot slot;
-
-#include <poppack.h>
-
-#define VFAT_CASE_LOWER_BASE 8 // base is lower case
-#define VFAT_CASE_LOWER_EXT 16 // extension is lower case
-
-#define LONGNAME_MAX_LENGTH 256 // max length for a long filename
-
-#define ENTRY_DELETED(DeviceExt, DirEntry) ((DeviceExt)->Flags & VCB_IS_FATX ? FATX_ENTRY_DELETED(&((DirEntry)->FatX)) : FAT_ENTRY_DELETED(&((DirEntry)->Fat)))
-#define ENTRY_VOLUME(DeviceExt, DirEntry) ((DeviceExt)->Flags & VCB_IS_FATX ? FATX_ENTRY_VOLUME(&((DirEntry)->FatX)) : FAT_ENTRY_VOLUME(&((DirEntry)->Fat)))
-#define ENTRY_END(DeviceExt, DirEntry) ((DeviceExt)->Flags & VCB_IS_FATX ? FATX_ENTRY_END(&((DirEntry)->FatX)) : FAT_ENTRY_END(&((DirEntry)->Fat)))
-
-#define FAT_ENTRY_DELETED(DirEntry) ((DirEntry)->Filename[0] == 0xe5)
-#define FAT_ENTRY_END(DirEntry) ((DirEntry)->Filename[0] == 0)
-#define FAT_ENTRY_LONG(DirEntry) (((DirEntry)->Attrib & 0x3f) == 0x0f)
-#define FAT_ENTRY_VOLUME(DirEntry) (((DirEntry)->Attrib & 0x1f) == 0x08)
-
-#define FATX_ENTRY_DELETED(DirEntry) ((DirEntry)->FilenameLength == 0xe5)
-#define FATX_ENTRY_END(DirEntry) ((DirEntry)->FilenameLength == 0xff)
-#define FATX_ENTRY_LONG(DirEntry) (FALSE)
-#define FATX_ENTRY_VOLUME(DirEntry) (((DirEntry)->Attrib & 0x1f) == 0x08)
-
-#define FAT_ENTRIES_PER_PAGE (PAGE_SIZE / sizeof (FAT_DIR_ENTRY))
-#define FATX_ENTRIES_PER_PAGE (PAGE_SIZE / sizeof (FATX_DIR_ENTRY))
-
-typedef struct _FATXDirEntry FATX_DIR_ENTRY, *PFATX_DIR_ENTRY;
-
-union _DIR_ENTRY
-{
- FAT_DIR_ENTRY Fat;
- FATX_DIR_ENTRY FatX;
-};
-
-typedef union _DIR_ENTRY DIR_ENTRY, *PDIR_ENTRY;
-
-#define BLOCKSIZE 512
-
-#define FAT16 (1)
-#define FAT12 (2)
-#define FAT32 (3)
-#define FATX16 (4)
-#define FATX32 (5)
-
-#define VCB_VOLUME_LOCKED 0x0001
-#define VCB_DISMOUNT_PENDING 0x0002
-#define VCB_IS_FATX 0x0004
-#define VCB_IS_DIRTY 0x4000 /* Volume is dirty */
-#define VCB_CLEAR_DIRTY 0x8000 /* Clean dirty flag at shutdown */
-
-typedef struct
-{
- ULONG VolumeID;
- ULONG FATStart;
- ULONG FATCount;
- ULONG FATSectors;
- ULONG rootDirectorySectors;
- ULONG rootStart;
- ULONG dataStart;
- ULONG RootCluster;
- ULONG SectorsPerCluster;
- ULONG BytesPerSector;
- ULONG BytesPerCluster;
- ULONG NumberOfClusters;
- ULONG FatType;
- ULONG Sectors;
- BOOLEAN FixedMedia;
-} FATINFO, *PFATINFO;
-
-struct _VFATFCB;
-struct _VFAT_DIRENTRY_CONTEXT;
-
-typedef struct _HASHENTRY
-{
- ULONG Hash;
- struct _VFATFCB* self;
- struct _HASHENTRY* next;
-}
-HASHENTRY;
-
-#define FCB_HASH_TABLE_SIZE 65536
-
-typedef struct DEVICE_EXTENSION *PDEVICE_EXTENSION;
-
-typedef NTSTATUS (*PGET_NEXT_CLUSTER)(PDEVICE_EXTENSION,ULONG,PULONG);
-typedef NTSTATUS (*PFIND_AND_MARK_AVAILABLE_CLUSTER)(PDEVICE_EXTENSION,PULONG);
-typedef NTSTATUS (*PWRITE_CLUSTER)(PDEVICE_EXTENSION,ULONG,ULONG,PULONG);
-
-typedef NTSTATUS (*PGET_NEXT_DIR_ENTRY)(PVOID*,PVOID*,struct _VFATFCB*,struct _VFAT_DIRENTRY_CONTEXT*,BOOLEAN);
-
-typedef struct DEVICE_EXTENSION
-{
- ERESOURCE DirResource;
- ERESOURCE FatResource;
-
- KSPIN_LOCK FcbListLock;
- LIST_ENTRY FcbListHead;
- ULONG HashTableSize;
- struct _HASHENTRY** FcbHashTable;
-
- PDEVICE_OBJECT StorageDevice;
- PFILE_OBJECT FATFileObject;
- FATINFO FatInfo;
- ULONG LastAvailableCluster;
- ULONG AvailableClusters;
- BOOLEAN AvailableClustersValid;
- ULONG Flags;
- struct _VFATFCB * VolumeFcb;
-
- /* Pointers to functions for manipulating FAT. */
- PGET_NEXT_CLUSTER GetNextCluster;
- PFIND_AND_MARK_AVAILABLE_CLUSTER FindAndMarkAvailableCluster;
- PWRITE_CLUSTER WriteCluster;
- ULONG CleanShutBitMask;
-
- /* Pointers to functions for manipulating directory entries. */
- PGET_NEXT_DIR_ENTRY GetNextDirEntry;
-
- ULONG BaseDateYear;
-
- LIST_ENTRY VolumeListEntry;
-} DEVICE_EXTENSION, VCB, *PVCB;
-
-typedef struct
-{
- PDRIVER_OBJECT DriverObject;
- PDEVICE_OBJECT DeviceObject;
- ULONG Flags;
- ERESOURCE VolumeListLock;
- LIST_ENTRY VolumeListHead;
- NPAGED_LOOKASIDE_LIST FcbLookasideList;
- NPAGED_LOOKASIDE_LIST CcbLookasideList;
- NPAGED_LOOKASIDE_LIST IrpContextLookasideList;
- FAST_IO_DISPATCH FastIoDispatch;
- CACHE_MANAGER_CALLBACKS CacheMgrCallbacks;
-} VFAT_GLOBAL_DATA, *PVFAT_GLOBAL_DATA;
-
-extern PVFAT_GLOBAL_DATA VfatGlobalData;
-
-#define FCB_CACHE_INITIALIZED 0x0001
-#define FCB_DELETE_PENDING 0x0002
-#define FCB_IS_FAT 0x0004
-#define FCB_IS_PAGE_FILE 0x0008
-#define FCB_IS_VOLUME 0x0010
-#define FCB_IS_DIRTY 0x0020
-#define FCB_IS_FATX_ENTRY 0x0040
-
-typedef struct _VFATFCB
-{
- /* FCB header required by ROS/NT */
- FSRTL_COMMON_FCB_HEADER RFCB;
- SECTION_OBJECT_POINTERS SectionObjectPointers;
- ERESOURCE MainResource;
- ERESOURCE PagingIoResource;
- /* end FCB header required by ROS/NT */
-
- /* directory entry for this file or directory */
- DIR_ENTRY entry;
-
- /* Pointer to attributes in entry */
- PUCHAR Attributes;
-
- /* long file name, points into PathNameBuffer */
- UNICODE_STRING LongNameU;
-
- /* short file name */
- UNICODE_STRING ShortNameU;
-
- /* directory name, points into PathNameBuffer */
- UNICODE_STRING DirNameU;
-
- /* path + long file name 260 max*/
- UNICODE_STRING PathNameU;
-
- /* buffer for PathNameU */
- PWCHAR PathNameBuffer;
-
- /* buffer for ShortNameU */
- WCHAR ShortNameBuffer[13];
-
- /* */
- LONG RefCount;
-
- /* List of FCB's for this volume */
- LIST_ENTRY FcbListEntry;
-
- /* pointer to the parent fcb */
- struct _VFATFCB* parentFcb;
-
- /* Flags for the fcb */
- ULONG Flags;
-
- /* pointer to the file object which has initialized the fcb */
- PFILE_OBJECT FileObject;
-
- /* Directory index for the short name entry */
- ULONG dirIndex;
-
- /* Directory index where the long name starts */
- ULONG startIndex;
-
- /* Share access for the file object */
- SHARE_ACCESS FCBShareAccess;
-
- /* Incremented on IRP_MJ_CREATE, decremented on IRP_MJ_CLEANUP */
- ULONG OpenHandleCount;
-
- /* Entry into the hash table for the path + long name */
- HASHENTRY Hash;
-
- /* Entry into the hash table for the path + short name */
- HASHENTRY ShortHash;
-
- /* List of byte-range locks for this file */
- FILE_LOCK FileLock;
-
- /*
- * Optimalization: caching of last read/write cluster+offset pair. Can't
- * be in VFATCCB because it must be reset everytime the allocated clusters
- * change.
- */
- FAST_MUTEX LastMutex;
- ULONG LastCluster;
- ULONG LastOffset;
-} VFATFCB, *PVFATFCB;
-
-typedef struct _VFATCCB
-{
- LARGE_INTEGER CurrentByteOffset;
- /* for DirectoryControl */
- ULONG Entry;
- /* for DirectoryControl */
- UNICODE_STRING SearchPattern;
-} VFATCCB, *PVFATCCB;
-
-#ifndef TAG
-#define TAG(A, B, C, D) (ULONG)(((A)<<0) + ((B)<<8) + ((C)<<16) + ((D)<<24))
-#endif
-
-#define TAG_CCB TAG('V', 'C', 'C', 'B')
-#define TAG_FCB TAG('V', 'F', 'C', 'B')
-#define TAG_IRP TAG('V', 'I', 'R', 'P')
-
-#define ENTRIES_PER_SECTOR (BLOCKSIZE / sizeof(FATDirEntry))
-
-typedef struct __DOSTIME
-{
- USHORT Second:5;
- USHORT Minute:6;
- USHORT Hour:5;
-}
-DOSTIME, *PDOSTIME;
-
-typedef struct __DOSDATE
-{
- USHORT Day:5;
- USHORT Month:4;
- USHORT Year:5;
-}
-DOSDATE, *PDOSDATE;
-
-#define IRPCONTEXT_CANWAIT 0x0001
-#define IRPCONTEXT_PENDINGRETURNED 0x0002
-
-typedef struct
-{
- PIRP Irp;
- PDEVICE_OBJECT DeviceObject;
- PDEVICE_EXTENSION DeviceExt;
- ULONG Flags;
- WORK_QUEUE_ITEM WorkQueueItem;
- PIO_STACK_LOCATION Stack;
- UCHAR MajorFunction;
- UCHAR MinorFunction;
- PFILE_OBJECT FileObject;
- ULONG RefCount;
- KEVENT Event;
-} VFAT_IRP_CONTEXT, *PVFAT_IRP_CONTEXT;
-
-typedef struct _VFAT_DIRENTRY_CONTEXT
-{
- ULONG StartIndex;
- ULONG DirIndex;
- DIR_ENTRY DirEntry;
- UNICODE_STRING LongNameU;
- UNICODE_STRING ShortNameU;
-} VFAT_DIRENTRY_CONTEXT, *PVFAT_DIRENTRY_CONTEXT;
-
-
-/* ------------------------------------------------------ shutdown.c */
-
-NTSTATUS STDCALL VfatShutdown (PDEVICE_OBJECT DeviceObject,
- PIRP Irp);
-
-/* -------------------------------------------------------- volume.c */
-
-NTSTATUS VfatQueryVolumeInformation (PVFAT_IRP_CONTEXT IrpContext);
-
-NTSTATUS VfatSetVolumeInformation (PVFAT_IRP_CONTEXT IrpContext);
-
-/* ------------------------------------------------------ blockdev.c */
-
-NTSTATUS VfatReadDisk(IN PDEVICE_OBJECT pDeviceObject,
- IN PLARGE_INTEGER ReadOffset,
- IN ULONG ReadLength,
- IN PUCHAR Buffer,
- IN BOOLEAN Override);
-
-NTSTATUS VfatReadDiskPartial (IN PVFAT_IRP_CONTEXT IrpContext,
- IN PLARGE_INTEGER ReadOffset,
- IN ULONG ReadLength,
- IN ULONG BufferOffset,
- IN BOOLEAN Wait);
-
-NTSTATUS VfatWriteDiskPartial(IN PVFAT_IRP_CONTEXT IrpContext,
- IN PLARGE_INTEGER WriteOffset,
- IN ULONG WriteLength,
- IN ULONG BufferOffset,
- IN BOOLEAN Wait);
-
-NTSTATUS VfatBlockDeviceIoControl (IN PDEVICE_OBJECT DeviceObject,
- IN ULONG CtlCode,
- IN PVOID InputBuffer,
- IN ULONG InputBufferSize,
- IN OUT PVOID OutputBuffer,
- IN OUT PULONG pOutputBufferSize,
- IN BOOLEAN Override);
-
-/* ----------------------------------------------------------- dir.c */
-
-NTSTATUS VfatDirectoryControl (PVFAT_IRP_CONTEXT);
-
-BOOLEAN FsdDosDateTimeToSystemTime (PDEVICE_EXTENSION DeviceExt,
- USHORT DosDate,
- USHORT DosTime,
- PLARGE_INTEGER SystemTime);
-
-BOOLEAN FsdSystemTimeToDosDateTime (PDEVICE_EXTENSION DeviceExt,
- PLARGE_INTEGER SystemTime,
- USHORT *pDosDate,
- USHORT *pDosTime);
-
-/* -------------------------------------------------------- create.c */
-
-NTSTATUS VfatCreate (PVFAT_IRP_CONTEXT IrpContext);
-
-NTSTATUS VfatOpenFile (PDEVICE_EXTENSION DeviceExt,
- PFILE_OBJECT FileObject,
- PVFATFCB* parentFcb);
-
-NTSTATUS FindFile (PDEVICE_EXTENSION DeviceExt,
- PVFATFCB Parent,
- PUNICODE_STRING FileToFindU,
- PVFAT_DIRENTRY_CONTEXT DirContext,
- BOOLEAN First);
-
-VOID vfat8Dot3ToString (PFAT_DIR_ENTRY pEntry,
- PUNICODE_STRING NameU);
-
-NTSTATUS ReadVolumeLabel(PDEVICE_EXTENSION DeviceExt,
- PVPB Vpb);
-
-/* --------------------------------------------------------- close.c */
-
-NTSTATUS VfatClose (PVFAT_IRP_CONTEXT IrpContext);
-
-NTSTATUS VfatCloseFile(PDEVICE_EXTENSION DeviceExt,
- PFILE_OBJECT FileObject);
-
-/* ------------------------------------------------------- cleanup.c */
-
-NTSTATUS VfatCleanup (PVFAT_IRP_CONTEXT IrpContext);
-
-/* --------------------------------------------------------- fastio.c */
-
-VOID
-VfatInitFastIoRoutines(PFAST_IO_DISPATCH FastIoDispatch);
-
-BOOLEAN NTAPI
-VfatAcquireForLazyWrite(IN PVOID Context,
- IN BOOLEAN Wait);
-
-VOID NTAPI
-VfatReleaseFromLazyWrite(IN PVOID Context);
-
-BOOLEAN NTAPI
-VfatAcquireForReadAhead(IN PVOID Context,
- IN BOOLEAN Wait);
-
-VOID NTAPI
-VfatReleaseFromReadAhead(IN PVOID Context);
-
-/* --------------------------------------------------------- fsctl.c */
-
-NTSTATUS VfatFileSystemControl (PVFAT_IRP_CONTEXT IrpContext);
-
-/* --------------------------------------------------------- finfo.c */
-
-NTSTATUS VfatQueryInformation (PVFAT_IRP_CONTEXT IrpContext);
-
-NTSTATUS VfatSetInformation (PVFAT_IRP_CONTEXT IrpContext);
-
-NTSTATUS
-VfatSetAllocationSizeInformation(PFILE_OBJECT FileObject,
- PVFATFCB Fcb,
- PDEVICE_EXTENSION DeviceExt,
- PLARGE_INTEGER AllocationSize);
-
-/* --------------------------------------------------------- iface.c */
-
-NTSTATUS STDCALL DriverEntry (PDRIVER_OBJECT DriverObject,
- PUNICODE_STRING RegistryPath);
-
-/* --------------------------------------------------------- dirwr.c */
-
-NTSTATUS VfatAddEntry (PDEVICE_EXTENSION DeviceExt,
- PUNICODE_STRING PathNameU,
- PVFATFCB* Fcb,
- PVFATFCB ParentFcb,
- ULONG RequestedOptions,
- UCHAR ReqAttr);
-
-NTSTATUS VfatUpdateEntry (PVFATFCB pFcb);
-
-NTSTATUS VfatDelEntry(PDEVICE_EXTENSION, PVFATFCB);
-
-BOOLEAN
-vfatFindDirSpace(PDEVICE_EXTENSION DeviceExt,
- PVFATFCB pDirFcb,
- ULONG nbSlots,
- PULONG start);
-
-/* -------------------------------------------------------- string.c */
-
-VOID
-vfatSplitPathName(PUNICODE_STRING PathNameU,
- PUNICODE_STRING DirNameU,
- PUNICODE_STRING FileNameU);
-
-BOOLEAN vfatIsLongIllegal(WCHAR c);
-
-BOOLEAN wstrcmpjoki (PWSTR s1,
- PWSTR s2);
-
-/* ----------------------------------------------------------- fat.c */
-
-NTSTATUS FAT12GetNextCluster(PDEVICE_EXTENSION DeviceExt,
- ULONG CurrentCluster,
- PULONG NextCluster);
-
-NTSTATUS FAT12FindAndMarkAvailableCluster(PDEVICE_EXTENSION DeviceExt,
- PULONG Cluster);
-
-NTSTATUS FAT12WriteCluster(PDEVICE_EXTENSION DeviceExt,
- ULONG ClusterToWrite,
- ULONG NewValue,
- PULONG OldValue);
-
-NTSTATUS FAT16GetNextCluster(PDEVICE_EXTENSION DeviceExt,
- ULONG CurrentCluster,
- PULONG NextCluster);
-
-NTSTATUS FAT16FindAndMarkAvailableCluster(PDEVICE_EXTENSION DeviceExt,
- PULONG Cluster);
-
-NTSTATUS FAT16WriteCluster(PDEVICE_EXTENSION DeviceExt,
- ULONG ClusterToWrite,
- ULONG NewValue,
- PULONG OldValue);
-
-NTSTATUS FAT32GetNextCluster(PDEVICE_EXTENSION DeviceExt,
- ULONG CurrentCluster,
- PULONG NextCluster);
-
-NTSTATUS FAT32FindAndMarkAvailableCluster(PDEVICE_EXTENSION DeviceExt,
- PULONG Cluster);
-
-NTSTATUS FAT32WriteCluster(PDEVICE_EXTENSION DeviceExt,
- ULONG ClusterToWrite,
- ULONG NewValue,
- PULONG OldValue);
-
-NTSTATUS OffsetToCluster (PDEVICE_EXTENSION DeviceExt,
- ULONG FirstCluster,
- ULONG FileOffset,
- PULONG Cluster,
- BOOLEAN Extend);
-
-ULONGLONG ClusterToSector (PDEVICE_EXTENSION DeviceExt,
- ULONG Cluster);
-
-NTSTATUS GetNextCluster (PDEVICE_EXTENSION DeviceExt,
- ULONG CurrentCluster,
- PULONG NextCluster);
-
-NTSTATUS GetNextClusterExtend (PDEVICE_EXTENSION DeviceExt,
- ULONG CurrentCluster,
- PULONG NextCluster);
-
-NTSTATUS CountAvailableClusters (PDEVICE_EXTENSION DeviceExt,
- PLARGE_INTEGER Clusters);
-
-NTSTATUS
-WriteCluster(PDEVICE_EXTENSION DeviceExt,
- ULONG ClusterToWrite,
- ULONG NewValue);
-
-/* ------------------------------------------------------ direntry.c */
-
-ULONG vfatDirEntryGetFirstCluster (PDEVICE_EXTENSION pDeviceExt,
- PDIR_ENTRY pDirEntry);
-
-BOOLEAN VfatIsDirectoryEmpty(PVFATFCB Fcb);
-
-NTSTATUS FATGetNextDirEntry(PVOID * pContext,
- PVOID * pPage,
- IN PVFATFCB pDirFcb,
- IN PVFAT_DIRENTRY_CONTEXT DirContext,
- BOOLEAN First);
-
-NTSTATUS FATXGetNextDirEntry(PVOID * pContext,
- PVOID * pPage,
- IN PVFATFCB pDirFcb,
- IN PVFAT_DIRENTRY_CONTEXT DirContext,
- BOOLEAN First);
-
-/* ----------------------------------------------------------- fcb.c */
-
-PVFATFCB vfatNewFCB (PDEVICE_EXTENSION pVCB,
- PUNICODE_STRING pFileNameU);
-
-VOID vfatDestroyFCB (PVFATFCB pFCB);
-
-VOID vfatDestroyCCB(PVFATCCB pCcb);
-
-VOID vfatGrabFCB (PDEVICE_EXTENSION pVCB,
- PVFATFCB pFCB);
-
-VOID vfatReleaseFCB (PDEVICE_EXTENSION pVCB,
- PVFATFCB pFCB);
-
-VOID vfatAddFCBToTable (PDEVICE_EXTENSION pVCB,
- PVFATFCB pFCB);
-
-PVFATFCB vfatGrabFCBFromTable (PDEVICE_EXTENSION pDeviceExt,
- PUNICODE_STRING pFileNameU);
-
-PVFATFCB vfatMakeRootFCB (PDEVICE_EXTENSION pVCB);
-
-PVFATFCB vfatOpenRootFCB (PDEVICE_EXTENSION pVCB);
-
-BOOLEAN vfatFCBIsDirectory (PVFATFCB FCB);
-
-BOOLEAN vfatFCBIsRoot(PVFATFCB FCB);
-
-NTSTATUS vfatAttachFCBToFileObject (PDEVICE_EXTENSION vcb,
- PVFATFCB fcb,
- PFILE_OBJECT fileObject);
-
-NTSTATUS vfatDirFindFile (PDEVICE_EXTENSION pVCB,
- PVFATFCB parentFCB,
- PUNICODE_STRING FileToFindU,
- PVFATFCB * fileFCB);
-
-NTSTATUS vfatGetFCBForFile (PDEVICE_EXTENSION pVCB,
- PVFATFCB *pParentFCB,
- PVFATFCB *pFCB,
- PUNICODE_STRING pFileNameU);
-
-NTSTATUS vfatMakeFCBFromDirEntry (PVCB vcb,
- PVFATFCB directoryFCB,
- PVFAT_DIRENTRY_CONTEXT DirContext,
- PVFATFCB * fileFCB);
-
-/* ------------------------------------------------------------ rw.c */
-
-NTSTATUS VfatRead (PVFAT_IRP_CONTEXT IrpContext);
-
-NTSTATUS VfatWrite (PVFAT_IRP_CONTEXT IrpContext);
-
-NTSTATUS NextCluster(PDEVICE_EXTENSION DeviceExt,
- ULONG FirstCluster,
- PULONG CurrentCluster,
- BOOLEAN Extend);
-
-/* ----------------------------------------------------------- misc.c */
-
-NTSTATUS VfatQueueRequest(PVFAT_IRP_CONTEXT IrpContext);
-
-PVFAT_IRP_CONTEXT VfatAllocateIrpContext(PDEVICE_OBJECT DeviceObject,
- PIRP Irp);
-
-VOID VfatFreeIrpContext(PVFAT_IRP_CONTEXT IrpContext);
-
-NTSTATUS STDCALL VfatBuildRequest (PDEVICE_OBJECT DeviceObject,
- PIRP Irp);
-
-PVOID VfatGetUserBuffer(IN PIRP);
-
-NTSTATUS VfatLockUserBuffer(IN PIRP, IN ULONG,
- IN LOCK_OPERATION);
-
-NTSTATUS
-VfatSetExtendedAttributes(PFILE_OBJECT FileObject,
- PVOID Ea,
- ULONG EaLength);
-/* ------------------------------------------------------------- flush.c */
-
-NTSTATUS VfatFlush(PVFAT_IRP_CONTEXT IrpContext);
-
-NTSTATUS VfatFlushVolume(PDEVICE_EXTENSION DeviceExt, PVFATFCB VolumeFcb);
-
-
-/* EOF */
+/* $Id: vfat.h 16656 2005-07-20 02:52:52Z ion $ */\r
+\r
+#include <ddk/ntifs.h>\r
+#include <ddk/ntdddisk.h>\r
+#include <ndk/ntndk.h>\r
+#include <reactos/helper.h>\r
+#include <ccros.h>\r
+#include <limits.h>\r
+#include <debug.h>\r
+\r
+#define USE_ROS_CC_AND_FS\r
+\r
+#include <pshpack1.h>\r
+struct _BootSector\r
+{\r
+ unsigned char magic0, res0, magic1;\r
+ unsigned char OEMName[8];\r
+ unsigned short BytesPerSector;\r
+ unsigned char SectorsPerCluster;\r
+ unsigned short ReservedSectors;\r
+ unsigned char FATCount;\r
+ unsigned short RootEntries, Sectors;\r
+ unsigned char Media;\r
+ unsigned short FATSectors, SectorsPerTrack, Heads;\r
+ unsigned long HiddenSectors, SectorsHuge;\r
+ unsigned char Drive, Res1, Sig;\r
+ unsigned long VolumeID;\r
+ unsigned char VolumeLabel[11], SysType[8];\r
+ unsigned char Res2[448];\r
+ unsigned short Signatur1;\r
+};\r
+\r
+struct _BootSector32\r
+{\r
+ unsigned char magic0, res0, magic1; // 0\r
+ unsigned char OEMName[8]; // 3\r
+ unsigned short BytesPerSector; // 11\r
+ unsigned char SectorsPerCluster; // 13\r
+ unsigned short ReservedSectors; // 14\r
+ unsigned char FATCount; // 16\r
+ unsigned short RootEntries, Sectors; // 17\r
+ unsigned char Media; // 21\r
+ unsigned short FATSectors, SectorsPerTrack, Heads; // 22\r
+ unsigned long HiddenSectors, SectorsHuge; // 28\r
+ unsigned long FATSectors32; // 36\r
+ unsigned short ExtFlag; // 40\r
+ unsigned short FSVersion; // 42\r
+ unsigned long RootCluster; // 44\r
+ unsigned short FSInfoSector; // 48\r
+ unsigned short BootBackup; // 50\r
+ unsigned char Res3[12]; // 52\r
+ unsigned char Drive; // 64\r
+ unsigned char Res4; // 65\r
+ unsigned char ExtBootSignature; // 66\r
+ unsigned long VolumeID; // 67\r
+ unsigned char VolumeLabel[11], SysType[8]; // 71\r
+ unsigned char Res2[420]; // 90\r
+ unsigned short Signature1; // 510\r
+};\r
+\r
+struct _BootSectorFatX\r
+{\r
+ unsigned char SysType[4]; // 0\r
+ unsigned long VolumeID; // 4\r
+ unsigned long SectorsPerCluster; // 8\r
+ unsigned short FATCount; // 12\r
+ unsigned long Unknown; // 14\r
+ unsigned char Unused[4078]; // 18\r
+};\r
+\r
+struct _FsInfoSector\r
+{\r
+ unsigned long ExtBootSignature2; // 0\r
+ unsigned char Res6[480]; // 4\r
+ unsigned long FSINFOSignature; // 484\r
+ unsigned long FreeCluster; // 488\r
+ unsigned long NextCluster; // 492\r
+ unsigned char Res7[12]; // 496\r
+ unsigned long Signatur2; // 508\r
+};\r
+\r
+typedef struct _BootSector BootSector;\r
+\r
+struct _FATDirEntry\r
+{\r
+ union\r
+ {\r
+ struct { unsigned char Filename[8], Ext[3]; };\r
+ unsigned char ShortName[11];\r
+ };\r
+ unsigned char Attrib;\r
+ unsigned char lCase;\r
+ unsigned char CreationTimeMs;\r
+ unsigned short CreationTime,CreationDate,AccessDate;\r
+ unsigned short FirstClusterHigh; // higher\r
+ unsigned short UpdateTime; //time create/update\r
+ unsigned short UpdateDate; //date create/update\r
+ unsigned short FirstCluster;\r
+ unsigned long FileSize;\r
+};\r
+\r
+typedef struct _FATDirEntry FAT_DIR_ENTRY, *PFAT_DIR_ENTRY;\r
+\r
+struct _FATXDirEntry\r
+{\r
+ unsigned char FilenameLength; // 0\r
+ unsigned char Attrib; // 1\r
+ unsigned char Filename[42]; // 2\r
+ unsigned long FirstCluster; // 44\r
+ unsigned long FileSize; // 48\r
+ unsigned short UpdateTime; // 52\r
+ unsigned short UpdateDate; // 54\r
+ unsigned short CreationTime; // 56\r
+ unsigned short CreationDate; // 58\r
+ unsigned short AccessTime; // 60\r
+ unsigned short AccessDate; // 62\r
+};\r
+\r
+struct _slot\r
+{\r
+ unsigned char id; // sequence number for slot\r
+ WCHAR name0_4[5]; // first 5 characters in name\r
+ unsigned char attr; // attribute byte\r
+ unsigned char reserved; // always 0\r
+ unsigned char alias_checksum; // checksum for 8.3 alias\r
+ WCHAR name5_10[6]; // 6 more characters in name\r
+ unsigned char start[2]; // starting cluster number\r
+ WCHAR name11_12[2]; // last 2 characters in name\r
+};\r
+\r
+typedef struct _slot slot;\r
+\r
+#include <poppack.h>\r
+\r
+#define VFAT_CASE_LOWER_BASE 8 // base is lower case\r
+#define VFAT_CASE_LOWER_EXT 16 // extension is lower case\r
+\r
+#define LONGNAME_MAX_LENGTH 256 // max length for a long filename\r
+\r
+#define ENTRY_DELETED(DeviceExt, DirEntry) ((DeviceExt)->Flags & VCB_IS_FATX ? FATX_ENTRY_DELETED(&((DirEntry)->FatX)) : FAT_ENTRY_DELETED(&((DirEntry)->Fat)))\r
+#define ENTRY_VOLUME(DeviceExt, DirEntry) ((DeviceExt)->Flags & VCB_IS_FATX ? FATX_ENTRY_VOLUME(&((DirEntry)->FatX)) : FAT_ENTRY_VOLUME(&((DirEntry)->Fat)))\r
+#define ENTRY_END(DeviceExt, DirEntry) ((DeviceExt)->Flags & VCB_IS_FATX ? FATX_ENTRY_END(&((DirEntry)->FatX)) : FAT_ENTRY_END(&((DirEntry)->Fat)))\r
+\r
+#define FAT_ENTRY_DELETED(DirEntry) ((DirEntry)->Filename[0] == 0xe5)\r
+#define FAT_ENTRY_END(DirEntry) ((DirEntry)->Filename[0] == 0)\r
+#define FAT_ENTRY_LONG(DirEntry) (((DirEntry)->Attrib & 0x3f) == 0x0f)\r
+#define FAT_ENTRY_VOLUME(DirEntry) (((DirEntry)->Attrib & 0x1f) == 0x08)\r
+\r
+#define FATX_ENTRY_DELETED(DirEntry) ((DirEntry)->FilenameLength == 0xe5)\r
+#define FATX_ENTRY_END(DirEntry) ((DirEntry)->FilenameLength == 0xff)\r
+#define FATX_ENTRY_LONG(DirEntry) (FALSE)\r
+#define FATX_ENTRY_VOLUME(DirEntry) (((DirEntry)->Attrib & 0x1f) == 0x08)\r
+\r
+#define FAT_ENTRIES_PER_PAGE (PAGE_SIZE / sizeof (FAT_DIR_ENTRY))\r
+#define FATX_ENTRIES_PER_PAGE (PAGE_SIZE / sizeof (FATX_DIR_ENTRY))\r
+\r
+typedef struct _FATXDirEntry FATX_DIR_ENTRY, *PFATX_DIR_ENTRY;\r
+\r
+union _DIR_ENTRY\r
+{\r
+ FAT_DIR_ENTRY Fat;\r
+ FATX_DIR_ENTRY FatX;\r
+};\r
+\r
+typedef union _DIR_ENTRY DIR_ENTRY, *PDIR_ENTRY;\r
+\r
+#define BLOCKSIZE 512\r
+\r
+#define FAT16 (1)\r
+#define FAT12 (2)\r
+#define FAT32 (3)\r
+#define FATX16 (4)\r
+#define FATX32 (5)\r
+\r
+#define VCB_VOLUME_LOCKED 0x0001\r
+#define VCB_DISMOUNT_PENDING 0x0002\r
+#define VCB_IS_FATX 0x0004\r
+#define VCB_IS_DIRTY 0x4000 /* Volume is dirty */\r
+#define VCB_CLEAR_DIRTY 0x8000 /* Clean dirty flag at shutdown */\r
+\r
+typedef struct\r
+{\r
+ ULONG VolumeID;\r
+ ULONG FATStart;\r
+ ULONG FATCount;\r
+ ULONG FATSectors;\r
+ ULONG rootDirectorySectors;\r
+ ULONG rootStart;\r
+ ULONG dataStart;\r
+ ULONG RootCluster;\r
+ ULONG SectorsPerCluster;\r
+ ULONG BytesPerSector;\r
+ ULONG BytesPerCluster;\r
+ ULONG NumberOfClusters;\r
+ ULONG FatType;\r
+ ULONG Sectors;\r
+ BOOLEAN FixedMedia;\r
+} FATINFO, *PFATINFO;\r
+\r
+struct _VFATFCB;\r
+struct _VFAT_DIRENTRY_CONTEXT;\r
+\r
+typedef struct _HASHENTRY\r
+{\r
+ ULONG Hash;\r
+ struct _VFATFCB* self;\r
+ struct _HASHENTRY* next;\r
+}\r
+HASHENTRY;\r
+\r
+#define FCB_HASH_TABLE_SIZE 65536\r
+\r
+typedef struct DEVICE_EXTENSION *PDEVICE_EXTENSION;\r
+\r
+typedef NTSTATUS (*PGET_NEXT_CLUSTER)(PDEVICE_EXTENSION,ULONG,PULONG);\r
+typedef NTSTATUS (*PFIND_AND_MARK_AVAILABLE_CLUSTER)(PDEVICE_EXTENSION,PULONG);\r
+typedef NTSTATUS (*PWRITE_CLUSTER)(PDEVICE_EXTENSION,ULONG,ULONG,PULONG);\r
+\r
+typedef NTSTATUS (*PGET_NEXT_DIR_ENTRY)(PVOID*,PVOID*,struct _VFATFCB*,struct _VFAT_DIRENTRY_CONTEXT*,BOOLEAN);\r
+\r
+typedef struct DEVICE_EXTENSION\r
+{\r
+ ERESOURCE DirResource;\r
+ ERESOURCE FatResource;\r
+\r
+ KSPIN_LOCK FcbListLock;\r
+ LIST_ENTRY FcbListHead;\r
+ ULONG HashTableSize;\r
+ struct _HASHENTRY** FcbHashTable;\r
+\r
+ PDEVICE_OBJECT StorageDevice;\r
+ PFILE_OBJECT FATFileObject;\r
+ FATINFO FatInfo;\r
+ ULONG LastAvailableCluster;\r
+ ULONG AvailableClusters;\r
+ BOOLEAN AvailableClustersValid;\r
+ ULONG Flags;\r
+ struct _VFATFCB * VolumeFcb;\r
+\r
+ /* Pointers to functions for manipulating FAT. */\r
+ PGET_NEXT_CLUSTER GetNextCluster;\r
+ PFIND_AND_MARK_AVAILABLE_CLUSTER FindAndMarkAvailableCluster;\r
+ PWRITE_CLUSTER WriteCluster;\r
+ ULONG CleanShutBitMask;\r
+\r
+ /* Pointers to functions for manipulating directory entries. */\r
+ PGET_NEXT_DIR_ENTRY GetNextDirEntry;\r
+\r
+ ULONG BaseDateYear;\r
+\r
+ LIST_ENTRY VolumeListEntry;\r
+} DEVICE_EXTENSION, VCB, *PVCB;\r
+\r
+typedef struct\r
+{\r
+ PDRIVER_OBJECT DriverObject;\r
+ PDEVICE_OBJECT DeviceObject;\r
+ ULONG Flags;\r
+ ERESOURCE VolumeListLock;\r
+ LIST_ENTRY VolumeListHead;\r
+ NPAGED_LOOKASIDE_LIST FcbLookasideList;\r
+ NPAGED_LOOKASIDE_LIST CcbLookasideList;\r
+ NPAGED_LOOKASIDE_LIST IrpContextLookasideList;\r
+ FAST_IO_DISPATCH FastIoDispatch;\r
+ CACHE_MANAGER_CALLBACKS CacheMgrCallbacks;\r
+} VFAT_GLOBAL_DATA, *PVFAT_GLOBAL_DATA;\r
+\r
+extern PVFAT_GLOBAL_DATA VfatGlobalData;\r
+\r
+#define FCB_CACHE_INITIALIZED 0x0001\r
+#define FCB_DELETE_PENDING 0x0002\r
+#define FCB_IS_FAT 0x0004\r
+#define FCB_IS_PAGE_FILE 0x0008\r
+#define FCB_IS_VOLUME 0x0010\r
+#define FCB_IS_DIRTY 0x0020\r
+#define FCB_IS_FATX_ENTRY 0x0040\r
+\r
+typedef struct _VFATFCB\r
+{\r
+ /* FCB header required by ROS/NT */\r
+ FSRTL_COMMON_FCB_HEADER RFCB;\r
+ SECTION_OBJECT_POINTERS SectionObjectPointers;\r
+ ERESOURCE MainResource;\r
+ ERESOURCE PagingIoResource;\r
+ /* end FCB header required by ROS/NT */\r
+\r
+ /* directory entry for this file or directory */\r
+ DIR_ENTRY entry;\r
+\r
+ /* Pointer to attributes in entry */\r
+ PUCHAR Attributes;\r
+\r
+ /* long file name, points into PathNameBuffer */\r
+ UNICODE_STRING LongNameU;\r
+\r
+ /* short file name */\r
+ UNICODE_STRING ShortNameU;\r
+\r
+ /* directory name, points into PathNameBuffer */\r
+ UNICODE_STRING DirNameU;\r
+\r
+ /* path + long file name 260 max*/\r
+ UNICODE_STRING PathNameU;\r
+\r
+ /* buffer for PathNameU */\r
+ PWCHAR PathNameBuffer;\r
+\r
+ /* buffer for ShortNameU */\r
+ WCHAR ShortNameBuffer[13];\r
+\r
+ /* */\r
+ LONG RefCount;\r
+\r
+ /* List of FCB's for this volume */\r
+ LIST_ENTRY FcbListEntry;\r
+\r
+ /* pointer to the parent fcb */\r
+ struct _VFATFCB* parentFcb;\r
+\r
+ /* Flags for the fcb */\r
+ ULONG Flags;\r
+\r
+ /* pointer to the file object which has initialized the fcb */\r
+ PFILE_OBJECT FileObject;\r
+\r
+ /* Directory index for the short name entry */\r
+ ULONG dirIndex;\r
+\r
+ /* Directory index where the long name starts */\r
+ ULONG startIndex;\r
+\r
+ /* Share access for the file object */\r
+ SHARE_ACCESS FCBShareAccess;\r
+\r
+ /* Incremented on IRP_MJ_CREATE, decremented on IRP_MJ_CLEANUP */\r
+ ULONG OpenHandleCount;\r
+\r
+ /* Entry into the hash table for the path + long name */\r
+ HASHENTRY Hash;\r
+\r
+ /* Entry into the hash table for the path + short name */\r
+ HASHENTRY ShortHash;\r
+\r
+ /* List of byte-range locks for this file */\r
+ FILE_LOCK FileLock;\r
+\r
+ /*\r
+ * Optimalization: caching of last read/write cluster+offset pair. Can't\r
+ * be in VFATCCB because it must be reset everytime the allocated clusters\r
+ * change.\r
+ */\r
+ FAST_MUTEX LastMutex;\r
+ ULONG LastCluster;\r
+ ULONG LastOffset;\r
+} VFATFCB, *PVFATFCB;\r
+\r
+typedef struct _VFATCCB\r
+{\r
+ LARGE_INTEGER CurrentByteOffset;\r
+ /* for DirectoryControl */\r
+ ULONG Entry;\r
+ /* for DirectoryControl */\r
+ UNICODE_STRING SearchPattern;\r
+} VFATCCB, *PVFATCCB;\r
+\r
+#ifndef TAG\r
+#define TAG(A, B, C, D) (ULONG)(((A)<<0) + ((B)<<8) + ((C)<<16) + ((D)<<24))\r
+#endif\r
+\r
+#define TAG_CCB TAG('V', 'C', 'C', 'B')\r
+#define TAG_FCB TAG('V', 'F', 'C', 'B')\r
+#define TAG_IRP TAG('V', 'I', 'R', 'P')\r
+\r
+#define ENTRIES_PER_SECTOR (BLOCKSIZE / sizeof(FATDirEntry))\r
+\r
+typedef struct __DOSTIME\r
+{\r
+ USHORT Second:5;\r
+ USHORT Minute:6;\r
+ USHORT Hour:5;\r
+}\r
+DOSTIME, *PDOSTIME;\r
+\r
+typedef struct __DOSDATE\r
+{\r
+ USHORT Day:5;\r
+ USHORT Month:4;\r
+ USHORT Year:5;\r
+}\r
+DOSDATE, *PDOSDATE;\r
+\r
+#define IRPCONTEXT_CANWAIT 0x0001\r
+#define IRPCONTEXT_PENDINGRETURNED 0x0002\r
+\r
+typedef struct\r
+{\r
+ PIRP Irp;\r
+ PDEVICE_OBJECT DeviceObject;\r
+ PDEVICE_EXTENSION DeviceExt;\r
+ ULONG Flags;\r
+ WORK_QUEUE_ITEM WorkQueueItem;\r
+ PIO_STACK_LOCATION Stack;\r
+ UCHAR MajorFunction;\r
+ UCHAR MinorFunction;\r
+ PFILE_OBJECT FileObject;\r
+ ULONG RefCount;\r
+ KEVENT Event;\r
+} VFAT_IRP_CONTEXT, *PVFAT_IRP_CONTEXT;\r
+\r
+typedef struct _VFAT_DIRENTRY_CONTEXT\r
+{\r
+ ULONG StartIndex;\r
+ ULONG DirIndex;\r
+ DIR_ENTRY DirEntry;\r
+ UNICODE_STRING LongNameU;\r
+ UNICODE_STRING ShortNameU;\r
+} VFAT_DIRENTRY_CONTEXT, *PVFAT_DIRENTRY_CONTEXT;\r
+\r
+\r
+/* ------------------------------------------------------ shutdown.c */\r
+\r
+NTSTATUS STDCALL VfatShutdown (PDEVICE_OBJECT DeviceObject,\r
+ PIRP Irp);\r
+\r
+/* -------------------------------------------------------- volume.c */\r
+\r
+NTSTATUS VfatQueryVolumeInformation (PVFAT_IRP_CONTEXT IrpContext);\r
+\r
+NTSTATUS VfatSetVolumeInformation (PVFAT_IRP_CONTEXT IrpContext);\r
+\r
+/* ------------------------------------------------------ blockdev.c */\r
+\r
+NTSTATUS VfatReadDisk(IN PDEVICE_OBJECT pDeviceObject,\r
+ IN PLARGE_INTEGER ReadOffset,\r
+ IN ULONG ReadLength,\r
+ IN PUCHAR Buffer,\r
+ IN BOOLEAN Override);\r
+\r
+NTSTATUS VfatReadDiskPartial (IN PVFAT_IRP_CONTEXT IrpContext,\r
+ IN PLARGE_INTEGER ReadOffset,\r
+ IN ULONG ReadLength,\r
+ IN ULONG BufferOffset,\r
+ IN BOOLEAN Wait);\r
+\r
+NTSTATUS VfatWriteDiskPartial(IN PVFAT_IRP_CONTEXT IrpContext,\r
+ IN PLARGE_INTEGER WriteOffset,\r
+ IN ULONG WriteLength,\r
+ IN ULONG BufferOffset,\r
+ IN BOOLEAN Wait);\r
+\r
+NTSTATUS VfatBlockDeviceIoControl (IN PDEVICE_OBJECT DeviceObject,\r
+ IN ULONG CtlCode,\r
+ IN PVOID InputBuffer,\r
+ IN ULONG InputBufferSize,\r
+ IN OUT PVOID OutputBuffer,\r
+ IN OUT PULONG pOutputBufferSize,\r
+ IN BOOLEAN Override);\r
+\r
+/* ----------------------------------------------------------- dir.c */\r
+\r
+NTSTATUS VfatDirectoryControl (PVFAT_IRP_CONTEXT);\r
+\r
+BOOLEAN FsdDosDateTimeToSystemTime (PDEVICE_EXTENSION DeviceExt,\r
+ USHORT DosDate,\r
+ USHORT DosTime,\r
+ PLARGE_INTEGER SystemTime);\r
+\r
+BOOLEAN FsdSystemTimeToDosDateTime (PDEVICE_EXTENSION DeviceExt,\r
+ PLARGE_INTEGER SystemTime,\r
+ USHORT *pDosDate,\r
+ USHORT *pDosTime);\r
+\r
+/* -------------------------------------------------------- create.c */\r
+\r
+NTSTATUS VfatCreate (PVFAT_IRP_CONTEXT IrpContext);\r
+\r
+NTSTATUS VfatOpenFile (PDEVICE_EXTENSION DeviceExt,\r
+ PFILE_OBJECT FileObject,\r
+ PVFATFCB* parentFcb);\r
+\r
+NTSTATUS FindFile (PDEVICE_EXTENSION DeviceExt,\r
+ PVFATFCB Parent,\r
+ PUNICODE_STRING FileToFindU,\r
+ PVFAT_DIRENTRY_CONTEXT DirContext,\r
+ BOOLEAN First);\r
+\r
+VOID vfat8Dot3ToString (PFAT_DIR_ENTRY pEntry,\r
+ PUNICODE_STRING NameU);\r
+\r
+NTSTATUS ReadVolumeLabel(PDEVICE_EXTENSION DeviceExt,\r
+ PVPB Vpb);\r
+\r
+/* --------------------------------------------------------- close.c */\r
+\r
+NTSTATUS VfatClose (PVFAT_IRP_CONTEXT IrpContext);\r
+\r
+NTSTATUS VfatCloseFile(PDEVICE_EXTENSION DeviceExt,\r
+ PFILE_OBJECT FileObject);\r
+\r
+/* ------------------------------------------------------- cleanup.c */\r
+\r
+NTSTATUS VfatCleanup (PVFAT_IRP_CONTEXT IrpContext);\r
+\r
+/* --------------------------------------------------------- fastio.c */\r
+\r
+VOID\r
+VfatInitFastIoRoutines(PFAST_IO_DISPATCH FastIoDispatch);\r
+\r
+BOOLEAN NTAPI\r
+VfatAcquireForLazyWrite(IN PVOID Context,\r
+ IN BOOLEAN Wait);\r
+\r
+VOID NTAPI\r
+VfatReleaseFromLazyWrite(IN PVOID Context);\r
+\r
+BOOLEAN NTAPI\r
+VfatAcquireForReadAhead(IN PVOID Context,\r
+ IN BOOLEAN Wait);\r
+\r
+VOID NTAPI\r
+VfatReleaseFromReadAhead(IN PVOID Context);\r
+\r
+/* --------------------------------------------------------- fsctl.c */\r
+\r
+NTSTATUS VfatFileSystemControl (PVFAT_IRP_CONTEXT IrpContext);\r
+\r
+/* --------------------------------------------------------- finfo.c */\r
+\r
+NTSTATUS VfatQueryInformation (PVFAT_IRP_CONTEXT IrpContext);\r
+\r
+NTSTATUS VfatSetInformation (PVFAT_IRP_CONTEXT IrpContext);\r
+\r
+NTSTATUS\r
+VfatSetAllocationSizeInformation(PFILE_OBJECT FileObject,\r
+ PVFATFCB Fcb,\r
+ PDEVICE_EXTENSION DeviceExt,\r
+ PLARGE_INTEGER AllocationSize);\r
+\r
+/* --------------------------------------------------------- iface.c */\r
+\r
+NTSTATUS STDCALL DriverEntry (PDRIVER_OBJECT DriverObject,\r
+ PUNICODE_STRING RegistryPath);\r
+\r
+/* --------------------------------------------------------- dirwr.c */\r
+\r
+NTSTATUS VfatAddEntry (PDEVICE_EXTENSION DeviceExt,\r
+ PUNICODE_STRING PathNameU,\r
+ PVFATFCB* Fcb,\r
+ PVFATFCB ParentFcb,\r
+ ULONG RequestedOptions,\r
+ UCHAR ReqAttr);\r
+\r
+NTSTATUS VfatUpdateEntry (PVFATFCB pFcb);\r
+\r
+NTSTATUS VfatDelEntry(PDEVICE_EXTENSION, PVFATFCB);\r
+\r
+BOOLEAN\r
+vfatFindDirSpace(PDEVICE_EXTENSION DeviceExt,\r
+ PVFATFCB pDirFcb,\r
+ ULONG nbSlots,\r
+ PULONG start);\r
+\r
+/* -------------------------------------------------------- string.c */\r
+\r
+VOID\r
+vfatSplitPathName(PUNICODE_STRING PathNameU,\r
+ PUNICODE_STRING DirNameU,\r
+ PUNICODE_STRING FileNameU);\r
+\r
+BOOLEAN vfatIsLongIllegal(WCHAR c);\r
+\r
+BOOLEAN wstrcmpjoki (PWSTR s1,\r
+ PWSTR s2);\r
+\r
+/* ----------------------------------------------------------- fat.c */\r
+\r
+NTSTATUS FAT12GetNextCluster(PDEVICE_EXTENSION DeviceExt,\r
+ ULONG CurrentCluster,\r
+ PULONG NextCluster);\r
+\r
+NTSTATUS FAT12FindAndMarkAvailableCluster(PDEVICE_EXTENSION DeviceExt,\r
+ PULONG Cluster);\r
+\r
+NTSTATUS FAT12WriteCluster(PDEVICE_EXTENSION DeviceExt,\r
+ ULONG ClusterToWrite,\r
+ ULONG NewValue,\r
+ PULONG OldValue);\r
+\r
+NTSTATUS FAT16GetNextCluster(PDEVICE_EXTENSION DeviceExt,\r
+ ULONG CurrentCluster,\r
+ PULONG NextCluster);\r
+\r
+NTSTATUS FAT16FindAndMarkAvailableCluster(PDEVICE_EXTENSION DeviceExt,\r
+ PULONG Cluster);\r
+\r
+NTSTATUS FAT16WriteCluster(PDEVICE_EXTENSION DeviceExt,\r
+ ULONG ClusterToWrite,\r
+ ULONG NewValue,\r
+ PULONG OldValue);\r
+\r
+NTSTATUS FAT32GetNextCluster(PDEVICE_EXTENSION DeviceExt,\r
+ ULONG CurrentCluster,\r
+ PULONG NextCluster);\r
+\r
+NTSTATUS FAT32FindAndMarkAvailableCluster(PDEVICE_EXTENSION DeviceExt,\r
+ PULONG Cluster);\r
+\r
+NTSTATUS FAT32WriteCluster(PDEVICE_EXTENSION DeviceExt,\r
+ ULONG ClusterToWrite,\r
+ ULONG NewValue,\r
+ PULONG OldValue);\r
+\r
+NTSTATUS OffsetToCluster (PDEVICE_EXTENSION DeviceExt,\r
+ ULONG FirstCluster,\r
+ ULONG FileOffset,\r
+ PULONG Cluster,\r
+ BOOLEAN Extend);\r
+\r
+ULONGLONG ClusterToSector (PDEVICE_EXTENSION DeviceExt,\r
+ ULONG Cluster);\r
+\r
+NTSTATUS GetNextCluster (PDEVICE_EXTENSION DeviceExt,\r
+ ULONG CurrentCluster,\r
+ PULONG NextCluster);\r
+\r
+NTSTATUS GetNextClusterExtend (PDEVICE_EXTENSION DeviceExt,\r
+ ULONG CurrentCluster,\r
+ PULONG NextCluster);\r
+\r
+NTSTATUS CountAvailableClusters (PDEVICE_EXTENSION DeviceExt,\r
+ PLARGE_INTEGER Clusters);\r
+\r
+NTSTATUS\r
+WriteCluster(PDEVICE_EXTENSION DeviceExt,\r
+ ULONG ClusterToWrite,\r
+ ULONG NewValue);\r
+\r
+/* ------------------------------------------------------ direntry.c */\r
+\r
+ULONG vfatDirEntryGetFirstCluster (PDEVICE_EXTENSION pDeviceExt,\r
+ PDIR_ENTRY pDirEntry);\r
+\r
+BOOLEAN VfatIsDirectoryEmpty(PVFATFCB Fcb);\r
+\r
+NTSTATUS FATGetNextDirEntry(PVOID * pContext,\r
+ PVOID * pPage,\r
+ IN PVFATFCB pDirFcb,\r
+ IN PVFAT_DIRENTRY_CONTEXT DirContext,\r
+ BOOLEAN First);\r
+\r
+NTSTATUS FATXGetNextDirEntry(PVOID * pContext,\r
+ PVOID * pPage,\r
+ IN PVFATFCB pDirFcb,\r
+ IN PVFAT_DIRENTRY_CONTEXT DirContext,\r
+ BOOLEAN First);\r
+\r
+/* ----------------------------------------------------------- fcb.c */\r
+\r
+PVFATFCB vfatNewFCB (PDEVICE_EXTENSION pVCB,\r
+ PUNICODE_STRING pFileNameU);\r
+\r
+VOID vfatDestroyFCB (PVFATFCB pFCB);\r
+\r
+VOID vfatDestroyCCB(PVFATCCB pCcb);\r
+\r
+VOID vfatGrabFCB (PDEVICE_EXTENSION pVCB,\r
+ PVFATFCB pFCB);\r
+\r
+VOID vfatReleaseFCB (PDEVICE_EXTENSION pVCB,\r
+ PVFATFCB pFCB);\r
+\r
+VOID vfatAddFCBToTable (PDEVICE_EXTENSION pVCB,\r
+ PVFATFCB pFCB);\r
+\r
+PVFATFCB vfatGrabFCBFromTable (PDEVICE_EXTENSION pDeviceExt,\r
+ PUNICODE_STRING pFileNameU);\r
+\r
+PVFATFCB vfatMakeRootFCB (PDEVICE_EXTENSION pVCB);\r
+\r
+PVFATFCB vfatOpenRootFCB (PDEVICE_EXTENSION pVCB);\r
+\r
+BOOLEAN vfatFCBIsDirectory (PVFATFCB FCB);\r
+\r
+BOOLEAN vfatFCBIsRoot(PVFATFCB FCB);\r
+\r
+NTSTATUS vfatAttachFCBToFileObject (PDEVICE_EXTENSION vcb,\r
+ PVFATFCB fcb,\r
+ PFILE_OBJECT fileObject);\r
+\r
+NTSTATUS vfatDirFindFile (PDEVICE_EXTENSION pVCB,\r
+ PVFATFCB parentFCB,\r
+ PUNICODE_STRING FileToFindU,\r
+ PVFATFCB * fileFCB);\r
+\r
+NTSTATUS vfatGetFCBForFile (PDEVICE_EXTENSION pVCB,\r
+ PVFATFCB *pParentFCB,\r
+ PVFATFCB *pFCB,\r
+ PUNICODE_STRING pFileNameU);\r
+\r
+NTSTATUS vfatMakeFCBFromDirEntry (PVCB vcb,\r
+ PVFATFCB directoryFCB,\r
+ PVFAT_DIRENTRY_CONTEXT DirContext,\r
+ PVFATFCB * fileFCB);\r
+\r
+/* ------------------------------------------------------------ rw.c */\r
+\r
+NTSTATUS VfatRead (PVFAT_IRP_CONTEXT IrpContext);\r
+\r
+NTSTATUS VfatWrite (PVFAT_IRP_CONTEXT IrpContext);\r
+\r
+NTSTATUS NextCluster(PDEVICE_EXTENSION DeviceExt,\r
+ ULONG FirstCluster,\r
+ PULONG CurrentCluster,\r
+ BOOLEAN Extend);\r
+\r
+/* ----------------------------------------------------------- misc.c */\r
+\r
+NTSTATUS VfatQueueRequest(PVFAT_IRP_CONTEXT IrpContext);\r
+\r
+PVFAT_IRP_CONTEXT VfatAllocateIrpContext(PDEVICE_OBJECT DeviceObject,\r
+ PIRP Irp);\r
+\r
+VOID VfatFreeIrpContext(PVFAT_IRP_CONTEXT IrpContext);\r
+\r
+NTSTATUS STDCALL VfatBuildRequest (PDEVICE_OBJECT DeviceObject,\r
+ PIRP Irp);\r
+\r
+PVOID VfatGetUserBuffer(IN PIRP);\r
+\r
+NTSTATUS VfatLockUserBuffer(IN PIRP, IN ULONG,\r
+ IN LOCK_OPERATION);\r
+\r
+NTSTATUS\r
+VfatSetExtendedAttributes(PFILE_OBJECT FileObject,\r
+ PVOID Ea,\r
+ ULONG EaLength);\r
+/* ------------------------------------------------------------- flush.c */\r
+\r
+NTSTATUS VfatFlush(PVFAT_IRP_CONTEXT IrpContext);\r
+\r
+NTSTATUS VfatFlushVolume(PDEVICE_EXTENSION DeviceExt, PVFATFCB VolumeFcb);\r
+\r
+\r
+/* EOF */\r