*** empty log message ***
[reactos.git] / reactos / drivers / fs / vfat / vfat.h
index f9fef6e..037fa3c 100644 (file)
@@ -1,3 +1,5 @@
+#include <wchar.h>
+
 
 
 
@@ -30,7 +32,8 @@ struct _BootSector32 {
   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));
@@ -66,49 +69,13 @@ typedef struct _slot slot;
 
 #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;
@@ -118,21 +85,71 @@ typedef struct
    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);
@@ -153,9 +170,35 @@ BOOLEAN VFATWriteSectors(IN PDEVICE_OBJECT pDeviceObject,
                          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) {}