+#include <wchar.h>
+
unsigned short FATSectors, SectorsPerTrack, Heads;
unsigned long HiddenSectors, SectorsHuge;
unsigned long FATSectors32;
- unsigned char x[31];
+ unsigned char x[27];
+ unsigned long VolumeID;
unsigned char VolumeLabel[11], SysType[8];
unsigned char Res2[422];
} __attribute__((packed));
#define BLOCKSIZE 512
-// Put the rest in struct.h
-/*
-typedef unsigned int uint32;
-
-typedef struct _SFsdIdentifier {
- uint32 NodeType;
- uint32 NodeSize;
-} SFsdIdentifier, *PtrSFsdIdentifier;
-
-typedef struct _SFsdNTRequiredFCB {
- FSRTL_COMMON_FCB_HEADER CommonFCBHeader;
- SECTION_OBJECT_POINTERS SectionObject;
- ERESOURCE MainResource;
- ERESOURCE PagingIoResource;
-} SFsdNTRequiredFCB, *PtrSFsdNTRequiredFCB;
-
-typedef struct _SFsdFileControlBlock {
- SFsdIdentifier NodeIdentifier;
- SFsdNTRequiredFCB NTRequiredFCB;
- SFsdDiskDependentFCB DiskDependentFCB;
- struct _SFsdVolumeControlBlock *PtrVCB;
- LIST_ENTRY NextFCB;
- uint32 FCBFlags;
- LIST_ENTRY NextCCB;
- SHARE_ACCESS FCBShareAccess;
- uint32 LazyWriterThreadID;
- uint32 ReferenceCount;
- uint32 OpenHandleCount;
- PtrSFsdObjectName FCBName;
- LARGE_INTEGER CreationTime;
- LARGE_INTEGER LastAccessTime;
- LARGE_INTEGER LastWriteTime;
- SFsdFileLockAnchorFCB ByteRangeLock;
- OPLOCK FCBOplock;
-} SFsdFCB, *PtrSFsdFCB;
-
-*/
#define FAT16 (1)
#define FAT12 (2)
#define FAT32 (3)
typedef struct
{
+ ERESOURCE Resource;
PDEVICE_OBJECT StorageDevice;
BootSector *Boot;
int rootDirectorySectors, FATStart, rootStart, dataStart;
unsigned char* FAT;
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
-typedef struct
+typedef struct _FSRTL_COMMON_FCB_HEADER{
+ char IsFastIoPossible;//is char the realtype ?
+ ERESOURCE Resource;
+ ERESOURCE PagingIoResource;
+ ULONG Flags;// is long the real type ?
+ LARGE_INTEGER AllocationSize;
+ LARGE_INTEGER FileSize;
+ LARGE_INTEGER ValidDataLength;
+ // other fields ??
+} FSRTL_COMMON_FCB_HEADER;
+
+typedef struct _SFsdNTRequiredFCB {
+ FSRTL_COMMON_FCB_HEADER CommonFCBHeader;
+ SECTION_OBJECT_POINTERS SectionObject;
+ ERESOURCE MainResource;
+ ERESOURCE PagingIoResource;
+} SFsdNTRequiredFCB, *PtrSFsdNTRequiredFCB;
+
+struct _VfatFCB;
+typedef struct _VfatFCB
{
+ SFsdNTRequiredFCB NTRequiredFCB;
FATDirEntry entry;
- WCHAR ObjectName[251];// filename has 250 characters max
- ULONG StartSector;
- ULONG StartEntry;//for DirectoryControl
-} FCB, *PFCB;
+ WCHAR *ObjectName; // point on filename (250 chars max) in PathName
+ WCHAR PathName[MAX_PATH];// path+filename 260 max
+ long RefCount;
+ PDEVICE_EXTENSION pDevExt;
+ struct _VfatFCB * nextFcb, *prevFcb;
+ struct _VfatFCB * parentFcb;
+} VfatFCB, *PVfatFCB;
+
+typedef struct
+{
+ VfatFCB * pFcb;
+ LIST_ENTRY NextCCB;
+ PFILE_OBJECT PtrFileObject;
+ LARGE_INTEGER CurrentByteOffset;
+ ULONG StartSector; // for DirectoryControl
+ ULONG StartEntry; //for DirectoryControl
+// PSTRING DirectorySearchPattern;// for DirectoryControl ?
+} VfatCCB, *PVfatCCB;
#define ENTRIES_PER_SECTOR (BLOCKSIZE / sizeof(FATDirEntry))
+typedef struct __DOSTIME
+{
+ WORD Second:5;
+ WORD Minute:6;
+ WORD Hour:5;
+} DOSTIME, *PDOSTIME;
+
+typedef struct __DOSDATE
+{
+ WORD Day:5;
+ WORD Month:4;
+ WORD Year:5;
+} DOSDATE, *PDOSDATE;
+
+
+extern PVfatFCB pFirstFcb;
// functions called by i/o manager :
-NTSTATUS DriverEntry(PDRIVER_OBJECT _DriverObject,PUNICODE_STRING RegistryPath);
+NTSTATUS STDCALL DriverEntry(PDRIVER_OBJECT _DriverObject,PUNICODE_STRING RegistryPath);
NTSTATUS FsdDirectoryControl(PDEVICE_OBJECT DeviceObject, PIRP Irp);
NTSTATUS FsdRead(PDEVICE_OBJECT DeviceObject, PIRP Irp);
NTSTATUS FsdWrite(PDEVICE_OBJECT DeviceObject, PIRP Irp);
IN ULONG SectorCount,
IN UCHAR* Buffer);
+//internal functions in dir.c :
+BOOL FsdDosDateTimeToFileTime(WORD wDosDate,WORD wDosTime, TIME *FileTime);
+
//internal functions in iface.c :
-NTSTATUS FsdGetStandardInformation(PFCB FCB, PDEVICE_OBJECT DeviceObject,
+NTSTATUS FindFile(PDEVICE_EXTENSION DeviceExt, PVfatFCB Fcb,
+ PVfatFCB Parent, PWSTR FileToFind,ULONG *StartSector,ULONG *Entry);
+NTSTATUS FsdCloseFile(PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject);
+NTSTATUS FsdGetStandardInformation(PVfatFCB FCB, PDEVICE_OBJECT DeviceObject,
PFILE_STANDARD_INFORMATION StandardInfo);
-NTSTATUS FindFile(PDEVICE_EXTENSION DeviceExt, PFCB Fcb,
- PFCB Parent, PWSTR FileToFind,ULONG *StartSector,ULONG *Entry);
+NTSTATUS FsdOpenFile(PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject,
+ PWSTR FileName);
+NTSTATUS FsdReadFile(PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject,
+ PVOID Buffer, ULONG Length, ULONG ReadOffset,
+ PULONG LengthRead);
+NTSTATUS FsdWriteFile(PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject,
+ PVOID Buffer, ULONG Length, ULONG WriteOffset);
+ULONG GetNextWriteCluster(PDEVICE_EXTENSION DeviceExt, ULONG CurrentCluster);
+BOOLEAN IsDeletedEntry(PVOID Block, ULONG Offset);
+BOOLEAN IsLastEntry(PVOID Block, ULONG Offset);
wchar_t * vfat_wcsncpy(wchar_t * dest, const wchar_t *src,size_t wcount);
+void VFATWriteCluster(PDEVICE_EXTENSION DeviceExt, PVOID Buffer, ULONG Cluster);
+
+//internal functions in dirwr.c
+NTSTATUS addEntry(PDEVICE_EXTENSION DeviceExt
+ ,PFILE_OBJECT pFileObject,ULONG RequestedOptions,UCHAR ReqAttr);
+NTSTATUS updEntry(PDEVICE_EXTENSION DeviceExt,PFILE_OBJECT pFileObject);
+
+
+//FIXME : following defines must be removed
+//FIXME when this functions will work.
+#define ExAcquireResourceExclusiveLite(x,y) {}
+#define ExReleaseResourceForThreadLite(x,y) {}