unsigned short FSVersion; // 42
unsigned long RootCluster; // 44
unsigned short FSInfoSector; // 48
- unsigned long BootBackup; // 50
- unsigned char Res3[10]; // 54
+ unsigned short BootBackup; // 50
+ unsigned char Res3[12]; // 52
unsigned char Drive; // 64
unsigned char Res4; // 65
unsigned char ExtBootSignature; // 66
unsigned long Signature1; // 508
} __attribute__((packed));
-struct _BootBackupSector
+struct _FsInfoSector
{
unsigned long ExtBootSignature2; // 0
unsigned char Res6[480]; // 4
typedef struct _BootSector BootSector;
+#define VFAT_CASE_LOWER_BASE 8 // base is lower case
+#define VFAT_CASE_LOWER_EXT 16 // extension is lower case
+
struct _FATDirEntry
{
- unsigned char Filename[8], Ext[3], Attrib, Res[2];
+ unsigned char Filename[8], Ext[3];
+ unsigned char Attrib;
+ unsigned char lCase;
+ unsigned char CreationTimeMs;
unsigned short CreationTime,CreationDate,AccessDate;
unsigned short FirstClusterHigh; // higher
unsigned short UpdateTime; //time create/update
struct _VFATFCB;
+typedef struct _HASHENTRY
+{
+ ULONG Hash;
+ struct _VFATFCB* self;
+ struct _HASHENTRY* next;
+}
+HASHENTRY;
+
+#define FCB_HASH_TABLE_SIZE 1024
+
typedef struct
{
ERESOURCE DirResource;
BOOLEAN AvailableClustersValid;
ULONG Flags;
struct _VFATFCB * VolumeFcb;
+ struct _HASHENTRY* FcbHashTable[FCB_HASH_TABLE_SIZE];
+
+ LIST_ENTRY VolumeListEntry;
} DEVICE_EXTENSION, *PDEVICE_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;
} VFAT_GLOBAL_DATA, *PVFAT_GLOBAL_DATA;
extern PVFAT_GLOBAL_DATA VfatGlobalData;
#define FCB_IS_FAT 0x0004
#define FCB_IS_PAGE_FILE 0x0008
#define FCB_IS_VOLUME 0x0010
-#define FCB_UPDATE_DIRENTRY 0x0020
typedef struct _VFATFCB
{
WCHAR *ObjectName;
/* path+filename 260 max */
WCHAR PathName[MAX_PATH];
+ WCHAR ShortName[14];
LONG RefCount;
PDEVICE_EXTENSION pDevExt;
LIST_ENTRY FcbListEntry;
ULONG Flags;
PFILE_OBJECT FileObject;
ULONG dirIndex;
+ ULONG startIndex;
ERESOURCE PagingIoResource;
ERESOURCE MainResource;
ULONG TimerCount;
SHARE_ACCESS FCBShareAccess;
+ HASHENTRY Hash;
+ HASHENTRY ShortHash;
+ FILE_LOCK FileLock;
/* Structure members used only for paging files. */
ULONG FatChainSize;
} 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))
PULONG pDirIndex,
PULONG pDirIndex2);
-VOID vfat8Dot3ToString (PCHAR pBasename,
- PCHAR pExtension,
+VOID vfat8Dot3ToString (PFAT_DIR_ENTRY pEntry,
PWSTR pName);
NTSTATUS ReadVolumeLabel(PDEVICE_EXTENSION DeviceExt,
/* -------------------------------------------------------- string.c */
-VOID vfat_initstr (wchar_t *wstr,
- ULONG wsize);
-
-wchar_t* vfat_wcsncat (wchar_t * dest,
- const wchar_t * src,
- size_t wstart,
- size_t wcount);
-
-wchar_t* vfat_wcsncpy (wchar_t * dest,
- const wchar_t *src,
- size_t wcount);
-
-wchar_t* vfat_movstr (wchar_t *src,
- ULONG dpos,
- ULONG spos,
- ULONG len);
-
-BOOLEAN wstrcmpi (PWSTR s1,
- PWSTR s2);
-
BOOLEAN wstrcmpjoki (PWSTR s1,
PWSTR s2);
PULONG Cluster,
BOOLEAN Extend);
-ULONG ClusterToSector (PDEVICE_EXTENSION DeviceExt,
- ULONG Cluster);
+ULONGLONG ClusterToSector (PDEVICE_EXTENSION DeviceExt,
+ ULONG Cluster);
NTSTATUS GetNextCluster (PDEVICE_EXTENSION DeviceExt,
ULONG CurrentCluster,
PULONG NextCluster,
BOOLEAN Extend);
-NTSTATUS GetNextSector (PDEVICE_EXTENSION DeviceExt,
- ULONG CurrentSector,
- PULONG NextSector,
- BOOLEAN Extend);
-
NTSTATUS CountAvailableClusters (PDEVICE_EXTENSION DeviceExt,
PLARGE_INTEGER Clusters);
VOID vfatGetDirEntryName (PFAT_DIR_ENTRY pDirEntry,
PWSTR pEntryName);
-NTSTATUS vfatGetNextDirEntry (PDEVICE_EXTENSION pDeviceExt,
- PVFATFCB pDirectoryFCB,
- ULONG * pDirectoryIndex,
- PWSTR pLongFileName,
- PFAT_DIR_ENTRY pDirEntry);
+NTSTATUS vfatGetNextDirEntry(PVOID * pContext,
+ PVOID * pPage,
+ IN PVFATFCB pDirFcb,
+ IN OUT PULONG pDirIndex,
+ OUT PWSTR pFileName,
+ OUT PFAT_DIR_ENTRY pDirEntry,
+ OUT PULONG pStartIndex);
/* ----------------------------------------------------------- fcb.c */
PVFATFCB vfatOpenRootFCB (PDEVICE_EXTENSION pVCB);
-BOOL vfatFCBIsDirectory (PDEVICE_EXTENSION pVCB,
- PVFATFCB FCB);
+BOOL vfatFCBIsDirectory (PVFATFCB FCB);
NTSTATUS vfatAttachFCBToFileObject (PDEVICE_EXTENSION vcb,
PVFATFCB fcb,
PVFATFCB directoryFCB,
PWSTR longName,
PFAT_DIR_ENTRY dirEntry,
+ ULONG startIndex,
ULONG dirIndex,
PVFATFCB * fileFCB);
NTSTATUS VfatWrite (PVFAT_IRP_CONTEXT IrpContext);
-NTSTATUS VfatWriteFile (PDEVICE_EXTENSION DeviceExt,
- PFILE_OBJECT FileObject,
- PVOID Buffer,
- ULONG Length,
- ULONG WriteOffset,
- BOOLEAN NoCache,
- BOOLEAN PageIo);
-
-
-NTSTATUS VfatReadFile (PDEVICE_EXTENSION DeviceExt,
- PFILE_OBJECT FileObject,
- PVOID Buffer, ULONG Length,
- ULONG ReadOffset,
- PULONG LengthRead,
- ULONG NoCache);
-
NTSTATUS NextCluster(PDEVICE_EXTENSION DeviceExt,
PVFATFCB Fcb,
ULONG FirstCluster,
VfatSetExtendedAttributes(PFILE_OBJECT FileObject,
PVOID Ea,
ULONG EaLength);
+/* ------------------------------------------------------------- flush.c */
+
+NTSTATUS VfatFlush(PVFAT_IRP_CONTEXT IrpContext);
+
+NTSTATUS VfatFlushVolume(PDEVICE_EXTENSION DeviceExt, PVFATFCB VolumeFcb);
+
/* EOF */