ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

vfat.h
Go to the documentation of this file.
00001 #include <ntifs.h>
00002 #include <bugcodes.h>
00003 #include <ntdddisk.h>
00004 #include <debug.h>
00005 #include <dos.h>
00006 
00007 #define USE_ROS_CC_AND_FS
00008 
00009 #define ROUND_DOWN(n, align) \
00010     (((ULONG)n) & ~((align) - 1l))
00011 
00012 #define ROUND_UP(n, align) \
00013     ROUND_DOWN(((ULONG)n) + (align) - 1, (align))
00014 
00015 #include <pshpack1.h>
00016 struct _BootSector
00017 {
00018   unsigned char  magic0, res0, magic1;
00019   unsigned char  OEMName[8];
00020   unsigned short BytesPerSector;
00021   unsigned char  SectorsPerCluster;
00022   unsigned short ReservedSectors;
00023   unsigned char  FATCount;
00024   unsigned short RootEntries, Sectors;
00025   unsigned char  Media;
00026   unsigned short FATSectors, SectorsPerTrack, Heads;
00027   unsigned long  HiddenSectors, SectorsHuge;
00028   unsigned char  Drive, Res1, Sig;
00029   unsigned long  VolumeID;
00030   unsigned char  VolumeLabel[11], SysType[8];
00031   unsigned char  Res2[448];
00032   unsigned short Signatur1;
00033 };
00034 
00035 struct _BootSector32
00036 {
00037   unsigned char  magic0, res0, magic1;          // 0
00038   unsigned char  OEMName[8];                // 3
00039   unsigned short BytesPerSector;            // 11
00040   unsigned char  SectorsPerCluster;         // 13
00041   unsigned short ReservedSectors;           // 14
00042   unsigned char  FATCount;              // 16
00043   unsigned short RootEntries, Sectors;          // 17
00044   unsigned char  Media;                 // 21
00045   unsigned short FATSectors, SectorsPerTrack, Heads;    // 22
00046   unsigned long  HiddenSectors, SectorsHuge;        // 28
00047   unsigned long  FATSectors32;              // 36
00048   unsigned short ExtFlag;               // 40
00049   unsigned short FSVersion;             // 42
00050   unsigned long  RootCluster;               // 44
00051   unsigned short FSInfoSector;              // 48
00052   unsigned short BootBackup;                // 50
00053   unsigned char  Res3[12];              // 52
00054   unsigned char  Drive;                 // 64
00055   unsigned char  Res4;                  // 65
00056   unsigned char  ExtBootSignature;          // 66
00057   unsigned long  VolumeID;              // 67
00058   unsigned char  VolumeLabel[11], SysType[8];       // 71
00059   unsigned char  Res2[420];             // 90
00060   unsigned short Signature1;                // 510
00061 };
00062 
00063 struct _BootSectorFatX
00064 {
00065    unsigned char SysType[4];        // 0
00066    unsigned long VolumeID;          // 4
00067    unsigned long SectorsPerCluster; // 8
00068    unsigned short FATCount;         // 12
00069    unsigned long Unknown;           // 14
00070    unsigned char Unused[4078];      // 18
00071 };
00072 
00073 struct _FsInfoSector
00074 {
00075   unsigned long  ExtBootSignature2;         // 0
00076   unsigned char  Res6[480];             // 4
00077   unsigned long  FSINFOSignature;           // 484
00078   unsigned long  FreeCluster;               // 488
00079   unsigned long  NextCluster;               // 492
00080   unsigned char  Res7[12];              // 496
00081   unsigned long  Signatur2;             // 508
00082 };
00083 
00084 typedef struct _BootSector BootSector;
00085 
00086 struct _FATDirEntry
00087 {
00088   union
00089   {
00090      struct { unsigned char Filename[8], Ext[3]; };
00091      unsigned char ShortName[11];
00092   };
00093   unsigned char  Attrib;
00094   unsigned char  lCase;
00095   unsigned char  CreationTimeMs;
00096   unsigned short CreationTime,CreationDate,AccessDate;
00097   union
00098   {
00099     unsigned short FirstClusterHigh; // FAT32
00100     unsigned short ExtendedAttributes; // FAT12/FAT16
00101   };
00102   unsigned short UpdateTime;                            //time create/update
00103   unsigned short UpdateDate;                            //date create/update
00104   unsigned short FirstCluster;
00105   unsigned long  FileSize;
00106 };
00107 
00108 #define FAT_EAFILE  "EA DATA. SF"
00109 
00110 typedef struct _EAFileHeader FAT_EA_FILE_HEADER, *PFAT_EA_FILE_HEADER;
00111 
00112 struct _EAFileHeader
00113 {
00114   unsigned short Signature; // ED
00115   unsigned short Unknown[15];
00116   unsigned short EASetTable[240];
00117 };
00118 
00119 typedef struct _EASetHeader FAT_EA_SET_HEADER, *PFAT_EA_SET_HEADER;
00120 
00121 struct _EASetHeader
00122 {
00123   unsigned short Signature; // EA
00124   unsigned short Offset; // relative offset, same value as in the EASetTable
00125   unsigned short Unknown1[2];
00126   char TargetFileName[12];
00127   unsigned short Unknown2[3];
00128   unsigned int EALength;
00129   // EA Header
00130 };
00131 
00132 typedef struct _EAHeader FAT_EA_HEADER, *PFAT_EA_HEADER;
00133 
00134 struct _EAHeader
00135 {
00136   unsigned char Unknown;
00137   unsigned char EANameLength;
00138   unsigned short EAValueLength;
00139   // Name Data
00140   // Value Data
00141 };
00142 
00143 typedef struct _FATDirEntry FAT_DIR_ENTRY, *PFAT_DIR_ENTRY;
00144 
00145 struct _FATXDirEntry
00146 {
00147    unsigned char FilenameLength; // 0
00148    unsigned char Attrib;         // 1
00149    unsigned char Filename[42];   // 2
00150    unsigned long FirstCluster;   // 44
00151    unsigned long FileSize;       // 48
00152    unsigned short UpdateTime;    // 52
00153    unsigned short UpdateDate;    // 54
00154    unsigned short CreationTime;  // 56
00155    unsigned short CreationDate;  // 58
00156    unsigned short AccessTime;    // 60
00157    unsigned short AccessDate;    // 62
00158 };
00159 
00160 struct _slot
00161 {
00162   unsigned char id;               // sequence number for slot
00163   WCHAR  name0_4[5];              // first 5 characters in name
00164   unsigned char attr;             // attribute byte
00165   unsigned char reserved;         // always 0
00166   unsigned char alias_checksum;   // checksum for 8.3 alias
00167   WCHAR  name5_10[6];             // 6 more characters in name
00168   unsigned char start[2];         // starting cluster number
00169   WCHAR  name11_12[2];            // last 2 characters in name
00170 };
00171 
00172 typedef struct _slot slot;
00173 
00174 #include <poppack.h>
00175 
00176 #define VFAT_CASE_LOWER_BASE    8       // base is lower case
00177 #define VFAT_CASE_LOWER_EXT     16      // extension is lower case
00178 
00179 #define LONGNAME_MAX_LENGTH     256     // max length for a long filename
00180 
00181 #define ENTRY_DELETED(DeviceExt, DirEntry) ((DeviceExt)->Flags & VCB_IS_FATX ? FATX_ENTRY_DELETED(&((DirEntry)->FatX)) : FAT_ENTRY_DELETED(&((DirEntry)->Fat)))
00182 #define ENTRY_VOLUME(DeviceExt, DirEntry)  ((DeviceExt)->Flags & VCB_IS_FATX ? FATX_ENTRY_VOLUME(&((DirEntry)->FatX)) : FAT_ENTRY_VOLUME(&((DirEntry)->Fat)))
00183 #define ENTRY_END(DeviceExt, DirEntry)     ((DeviceExt)->Flags & VCB_IS_FATX ? FATX_ENTRY_END(&((DirEntry)->FatX)) : FAT_ENTRY_END(&((DirEntry)->Fat)))
00184 
00185 #define FAT_ENTRY_DELETED(DirEntry)  ((DirEntry)->Filename[0] == 0xe5)
00186 #define FAT_ENTRY_END(DirEntry)      ((DirEntry)->Filename[0] == 0)
00187 #define FAT_ENTRY_LONG(DirEntry)     (((DirEntry)->Attrib & 0x3f) == 0x0f)
00188 #define FAT_ENTRY_VOLUME(DirEntry)   (((DirEntry)->Attrib & 0x1f) == 0x08)
00189 
00190 #define FATX_ENTRY_DELETED(DirEntry) ((DirEntry)->FilenameLength == 0xe5)
00191 #define FATX_ENTRY_END(DirEntry)     ((DirEntry)->FilenameLength == 0xff)
00192 #define FATX_ENTRY_LONG(DirEntry)    (FALSE)
00193 #define FATX_ENTRY_VOLUME(DirEntry)  (((DirEntry)->Attrib & 0x1f) == 0x08)
00194 
00195 #define FAT_ENTRIES_PER_PAGE   (PAGE_SIZE / sizeof (FAT_DIR_ENTRY))
00196 #define FATX_ENTRIES_PER_PAGE  (PAGE_SIZE / sizeof (FATX_DIR_ENTRY))
00197 
00198 typedef struct _FATXDirEntry FATX_DIR_ENTRY, *PFATX_DIR_ENTRY;
00199 
00200 union _DIR_ENTRY
00201 {
00202    FAT_DIR_ENTRY Fat;
00203    FATX_DIR_ENTRY FatX;
00204 };
00205 
00206 typedef union _DIR_ENTRY DIR_ENTRY, *PDIR_ENTRY;
00207 
00208 #define BLOCKSIZE 512
00209 
00210 #define FAT16  (1)
00211 #define FAT12  (2)
00212 #define FAT32  (3)
00213 #define FATX16 (4)
00214 #define FATX32 (5)
00215 
00216 #define VCB_VOLUME_LOCKED       0x0001
00217 #define VCB_DISMOUNT_PENDING    0x0002
00218 #define VCB_IS_FATX             0x0004
00219 #define VCB_IS_DIRTY            0x4000 /* Volume is dirty */
00220 #define VCB_CLEAR_DIRTY         0x8000 /* Clean dirty flag at shutdown */
00221 
00222 typedef struct
00223 {
00224   ULONG VolumeID;
00225   ULONG FATStart;
00226   ULONG FATCount;
00227   ULONG FATSectors;
00228   ULONG rootDirectorySectors;
00229   ULONG rootStart;
00230   ULONG dataStart;
00231   ULONG RootCluster;
00232   ULONG SectorsPerCluster;
00233   ULONG BytesPerSector;
00234   ULONG BytesPerCluster;
00235   ULONG NumberOfClusters;
00236   ULONG FatType;
00237   ULONG Sectors;
00238   BOOLEAN FixedMedia;
00239 } FATINFO, *PFATINFO;
00240 
00241 struct _VFATFCB;
00242 struct _VFAT_DIRENTRY_CONTEXT;
00243 
00244 typedef struct _HASHENTRY
00245 {
00246   ULONG Hash;
00247   struct _VFATFCB* self;
00248   struct _HASHENTRY* next;
00249 }
00250 HASHENTRY;
00251 
00252 #define FCB_HASH_TABLE_SIZE 65536
00253 
00254 typedef struct DEVICE_EXTENSION *PDEVICE_EXTENSION;
00255 
00256 typedef NTSTATUS (*PGET_NEXT_CLUSTER)(PDEVICE_EXTENSION,ULONG,PULONG);
00257 typedef NTSTATUS (*PFIND_AND_MARK_AVAILABLE_CLUSTER)(PDEVICE_EXTENSION,PULONG);
00258 typedef NTSTATUS (*PWRITE_CLUSTER)(PDEVICE_EXTENSION,ULONG,ULONG,PULONG);
00259 
00260 typedef NTSTATUS (*PGET_NEXT_DIR_ENTRY)(PVOID*,PVOID*,struct _VFATFCB*,struct _VFAT_DIRENTRY_CONTEXT*,BOOLEAN);
00261 
00262 typedef struct DEVICE_EXTENSION
00263 {
00264   ERESOURCE DirResource;
00265   ERESOURCE FatResource;
00266 
00267   KSPIN_LOCK FcbListLock;
00268   LIST_ENTRY FcbListHead;
00269   ULONG HashTableSize;
00270   struct _HASHENTRY** FcbHashTable;
00271 
00272   PDEVICE_OBJECT StorageDevice;
00273   PFILE_OBJECT FATFileObject;
00274   FATINFO FatInfo;
00275   ULONG LastAvailableCluster;
00276   ULONG AvailableClusters;
00277   BOOLEAN AvailableClustersValid;
00278   ULONG Flags;
00279   struct _VFATFCB * VolumeFcb;
00280 
00281   /* Pointers to functions for manipulating FAT. */
00282   PGET_NEXT_CLUSTER GetNextCluster;
00283   PFIND_AND_MARK_AVAILABLE_CLUSTER FindAndMarkAvailableCluster;
00284   PWRITE_CLUSTER WriteCluster;
00285   ULONG CleanShutBitMask;
00286 
00287   /* Pointers to functions for manipulating directory entries. */
00288   PGET_NEXT_DIR_ENTRY GetNextDirEntry;
00289 
00290   ULONG BaseDateYear;
00291 
00292   LIST_ENTRY VolumeListEntry;
00293 } DEVICE_EXTENSION, VCB, *PVCB;
00294 
00295 typedef struct
00296 {
00297   PDRIVER_OBJECT DriverObject;
00298   PDEVICE_OBJECT DeviceObject;
00299   ULONG Flags;
00300   ERESOURCE VolumeListLock;
00301   LIST_ENTRY VolumeListHead;
00302   NPAGED_LOOKASIDE_LIST FcbLookasideList;
00303   NPAGED_LOOKASIDE_LIST CcbLookasideList;
00304   NPAGED_LOOKASIDE_LIST IrpContextLookasideList;
00305   FAST_IO_DISPATCH FastIoDispatch;
00306   CACHE_MANAGER_CALLBACKS CacheMgrCallbacks;
00307 } VFAT_GLOBAL_DATA, *PVFAT_GLOBAL_DATA;
00308 
00309 extern PVFAT_GLOBAL_DATA VfatGlobalData;
00310 
00311 #define FCB_CACHE_INITIALIZED   0x0001
00312 #define FCB_DELETE_PENDING      0x0002
00313 #define FCB_IS_FAT              0x0004
00314 #define FCB_IS_PAGE_FILE        0x0008
00315 #define FCB_IS_VOLUME           0x0010
00316 #define FCB_IS_DIRTY            0x0020
00317 #define FCB_IS_FATX_ENTRY       0x0040
00318 
00319 typedef struct _VFATFCB
00320 {
00321   /* FCB header required by ROS/NT */
00322   FSRTL_COMMON_FCB_HEADER RFCB;
00323   SECTION_OBJECT_POINTERS SectionObjectPointers;
00324   ERESOURCE MainResource;
00325   ERESOURCE PagingIoResource;
00326   /* end FCB header required by ROS/NT */
00327 
00328   /* directory entry for this file or directory */
00329   DIR_ENTRY entry;
00330 
00331   /* Pointer to attributes in entry */
00332   PUCHAR Attributes;
00333 
00334   /* long file name, points into PathNameBuffer */
00335   UNICODE_STRING LongNameU;
00336 
00337   /* short file name */
00338   UNICODE_STRING ShortNameU;
00339 
00340   /* directory name, points into PathNameBuffer */
00341   UNICODE_STRING DirNameU;
00342 
00343   /* path + long file name 260 max*/
00344   UNICODE_STRING PathNameU;
00345 
00346   /* buffer for PathNameU */
00347   PWCHAR PathNameBuffer;
00348 
00349   /* buffer for ShortNameU */
00350   WCHAR ShortNameBuffer[13];
00351 
00352   /* */
00353   LONG RefCount;
00354 
00355   /* List of FCB's for this volume */
00356   LIST_ENTRY FcbListEntry;
00357 
00358   /* pointer to the parent fcb */
00359   struct _VFATFCB* parentFcb;
00360 
00361   /* Flags for the fcb */
00362   ULONG Flags;
00363 
00364   /* pointer to the file object which has initialized the fcb */
00365   PFILE_OBJECT FileObject;
00366 
00367   /* Directory index for the short name entry */
00368   ULONG dirIndex;
00369 
00370   /* Directory index where the long name starts */
00371   ULONG startIndex;
00372 
00373   /* Share access for the file object */
00374   SHARE_ACCESS FCBShareAccess;
00375 
00376   /* Incremented on IRP_MJ_CREATE, decremented on IRP_MJ_CLEANUP */
00377   ULONG OpenHandleCount;
00378 
00379   /* Entry into the hash table for the path + long name */
00380   HASHENTRY Hash;
00381 
00382   /* Entry into the hash table for the path + short name */
00383   HASHENTRY ShortHash;
00384 
00385   /* List of byte-range locks for this file */
00386   FILE_LOCK FileLock;
00387 
00388   /*
00389    * Optimalization: caching of last read/write cluster+offset pair. Can't
00390    * be in VFATCCB because it must be reset everytime the allocated clusters
00391    * change.
00392    */
00393   FAST_MUTEX LastMutex;
00394   ULONG LastCluster;
00395   ULONG LastOffset;
00396 } VFATFCB, *PVFATFCB;
00397 
00398 typedef struct _VFATCCB
00399 {
00400   LARGE_INTEGER  CurrentByteOffset;
00401   /* for DirectoryControl */
00402   ULONG Entry;
00403   /* for DirectoryControl */
00404   UNICODE_STRING SearchPattern;
00405 } VFATCCB, *PVFATCCB;
00406 
00407 #define TAG_CCB  'BCCV'
00408 #define TAG_FCB  'BCFV'
00409 #define TAG_IRP  'PRIV'
00410 #define TAG_VFAT 'TAFV'
00411 
00412 #define ENTRIES_PER_SECTOR (BLOCKSIZE / sizeof(FATDirEntry))
00413 
00414 typedef struct __DOSTIME
00415 {
00416    USHORT Second:5;
00417    USHORT Minute:6;
00418    USHORT Hour:5;
00419 }
00420 DOSTIME, *PDOSTIME;
00421 
00422 typedef struct __DOSDATE
00423 {
00424    USHORT Day:5;
00425    USHORT Month:4;
00426    USHORT Year:7;
00427 }
00428 DOSDATE, *PDOSDATE;
00429 
00430 #define IRPCONTEXT_CANWAIT      0x0001
00431 #define IRPCONTEXT_PENDINGRETURNED  0x0002
00432 
00433 typedef struct
00434 {
00435    PIRP Irp;
00436    PDEVICE_OBJECT DeviceObject;
00437    PDEVICE_EXTENSION DeviceExt;
00438    ULONG Flags;
00439    WORK_QUEUE_ITEM WorkQueueItem;
00440    PIO_STACK_LOCATION Stack;
00441    UCHAR MajorFunction;
00442    UCHAR MinorFunction;
00443    PFILE_OBJECT FileObject;
00444    ULONG RefCount;
00445    KEVENT Event;
00446 } VFAT_IRP_CONTEXT, *PVFAT_IRP_CONTEXT;
00447 
00448 typedef struct _VFAT_DIRENTRY_CONTEXT
00449 {
00450   ULONG StartIndex;
00451   ULONG DirIndex;
00452   DIR_ENTRY DirEntry;
00453   UNICODE_STRING LongNameU;
00454   UNICODE_STRING ShortNameU;
00455 } VFAT_DIRENTRY_CONTEXT, *PVFAT_DIRENTRY_CONTEXT;
00456 
00457 
00458 /*  ------------------------------------------------------  shutdown.c  */
00459 
00460 DRIVER_DISPATCH VfatShutdown;
00461 NTSTATUS NTAPI VfatShutdown (PDEVICE_OBJECT DeviceObject,
00462                                PIRP Irp);
00463 
00464 /*  --------------------------------------------------------  volume.c  */
00465 
00466 NTSTATUS VfatQueryVolumeInformation (PVFAT_IRP_CONTEXT IrpContext);
00467 
00468 NTSTATUS VfatSetVolumeInformation (PVFAT_IRP_CONTEXT IrpContext);
00469 
00470 /*  ------------------------------------------------------  blockdev.c  */
00471 
00472 NTSTATUS VfatReadDisk(IN PDEVICE_OBJECT pDeviceObject,
00473                       IN PLARGE_INTEGER ReadOffset,
00474                       IN ULONG ReadLength,
00475                       IN PUCHAR Buffer,
00476                       IN BOOLEAN Override);
00477 
00478 NTSTATUS VfatReadDiskPartial (IN PVFAT_IRP_CONTEXT IrpContext,
00479                   IN PLARGE_INTEGER ReadOffset,
00480                   IN ULONG ReadLength,
00481                   IN ULONG BufferOffset,
00482                   IN BOOLEAN Wait);
00483 
00484 NTSTATUS VfatWriteDiskPartial(IN PVFAT_IRP_CONTEXT IrpContext,
00485                   IN PLARGE_INTEGER WriteOffset,
00486                   IN ULONG WriteLength,
00487                   IN ULONG BufferOffset,
00488                   IN BOOLEAN Wait);
00489 
00490 NTSTATUS VfatBlockDeviceIoControl (IN PDEVICE_OBJECT DeviceObject,
00491                    IN ULONG CtlCode,
00492                    IN PVOID InputBuffer,
00493                    IN ULONG InputBufferSize,
00494                    IN OUT PVOID OutputBuffer,
00495                    IN OUT PULONG pOutputBufferSize,
00496                    IN BOOLEAN Override);
00497 
00498 /*  -----------------------------------------------------------  dir.c  */
00499 
00500 NTSTATUS VfatDirectoryControl (PVFAT_IRP_CONTEXT);
00501 
00502 BOOLEAN FsdDosDateTimeToSystemTime (PDEVICE_EXTENSION DeviceExt,
00503                                     USHORT DosDate,
00504                                     USHORT DosTime,
00505                                     PLARGE_INTEGER SystemTime);
00506 
00507 BOOLEAN FsdSystemTimeToDosDateTime (PDEVICE_EXTENSION DeviceExt,
00508                                     PLARGE_INTEGER SystemTime,
00509                                     USHORT *pDosDate,
00510                                     USHORT *pDosTime);
00511 
00512 /*  --------------------------------------------------------  create.c  */
00513 
00514 NTSTATUS VfatCreate (PVFAT_IRP_CONTEXT IrpContext);
00515 
00516 NTSTATUS FindFile (PDEVICE_EXTENSION DeviceExt,
00517                    PVFATFCB Parent,
00518                    PUNICODE_STRING FileToFindU,
00519            PVFAT_DIRENTRY_CONTEXT DirContext,
00520            BOOLEAN First);
00521 
00522 VOID vfat8Dot3ToString (PFAT_DIR_ENTRY pEntry,
00523                         PUNICODE_STRING NameU);
00524 
00525 NTSTATUS ReadVolumeLabel(PDEVICE_EXTENSION DeviceExt,
00526                          PVPB Vpb);
00527 
00528 /*  ---------------------------------------------------------  close.c  */
00529 
00530 NTSTATUS VfatClose (PVFAT_IRP_CONTEXT IrpContext);
00531 
00532 NTSTATUS VfatCloseFile(PDEVICE_EXTENSION DeviceExt,
00533                        PFILE_OBJECT FileObject);
00534 
00535 /*  -------------------------------------------------------  cleanup.c  */
00536 
00537 NTSTATUS VfatCleanup (PVFAT_IRP_CONTEXT IrpContext);
00538 
00539 /*  ---------------------------------------------------------  fastio.c  */
00540 
00541 VOID
00542 VfatInitFastIoRoutines(PFAST_IO_DISPATCH FastIoDispatch);
00543 
00544 BOOLEAN NTAPI
00545 VfatAcquireForLazyWrite(IN PVOID Context,
00546                         IN BOOLEAN Wait);
00547 
00548 VOID NTAPI
00549 VfatReleaseFromLazyWrite(IN PVOID Context);
00550 
00551 BOOLEAN NTAPI
00552 VfatAcquireForReadAhead(IN PVOID Context,
00553                         IN BOOLEAN Wait);
00554 
00555 VOID NTAPI
00556 VfatReleaseFromReadAhead(IN PVOID Context);
00557 
00558 /*  ---------------------------------------------------------  fsctl.c  */
00559 
00560 NTSTATUS VfatFileSystemControl (PVFAT_IRP_CONTEXT IrpContext);
00561 
00562 /*  ---------------------------------------------------------  finfo.c  */
00563 
00564 NTSTATUS VfatQueryInformation (PVFAT_IRP_CONTEXT IrpContext);
00565 
00566 NTSTATUS VfatSetInformation (PVFAT_IRP_CONTEXT IrpContext);
00567 
00568 NTSTATUS
00569 VfatSetAllocationSizeInformation(PFILE_OBJECT FileObject,
00570                  PVFATFCB Fcb,
00571                  PDEVICE_EXTENSION DeviceExt,
00572                  PLARGE_INTEGER AllocationSize);
00573 
00574 /*  ---------------------------------------------------------  iface.c  */
00575 
00576 NTSTATUS NTAPI DriverEntry (PDRIVER_OBJECT DriverObject,
00577                               PUNICODE_STRING RegistryPath);
00578 
00579 /*  ---------------------------------------------------------  dirwr.c  */
00580 
00581 NTSTATUS VfatAddEntry (PDEVICE_EXTENSION DeviceExt,
00582                PUNICODE_STRING PathNameU,
00583                PVFATFCB* Fcb,
00584                PVFATFCB ParentFcb,
00585                ULONG RequestedOptions,
00586                UCHAR ReqAttr);
00587 
00588 NTSTATUS VfatUpdateEntry (PVFATFCB pFcb);
00589 
00590 NTSTATUS VfatDelEntry(PDEVICE_EXTENSION, PVFATFCB);
00591 
00592 BOOLEAN
00593 vfatFindDirSpace(PDEVICE_EXTENSION DeviceExt,
00594                  PVFATFCB pDirFcb,
00595                  ULONG nbSlots,
00596                  PULONG start);
00597 
00598 /*  --------------------------------------------------------  string.c  */
00599 
00600 VOID
00601 vfatSplitPathName(PUNICODE_STRING PathNameU,
00602           PUNICODE_STRING DirNameU,
00603           PUNICODE_STRING FileNameU);
00604 
00605 BOOLEAN vfatIsLongIllegal(WCHAR c);
00606 
00607 BOOLEAN wstrcmpjoki (PWSTR s1,
00608                      PWSTR s2);
00609 
00610 /*  -----------------------------------------------------------  fat.c  */
00611 
00612 NTSTATUS FAT12GetNextCluster(PDEVICE_EXTENSION DeviceExt,
00613                              ULONG CurrentCluster,
00614                              PULONG NextCluster);
00615 
00616 NTSTATUS FAT12FindAndMarkAvailableCluster(PDEVICE_EXTENSION DeviceExt,
00617                                           PULONG Cluster);
00618 
00619 NTSTATUS FAT12WriteCluster(PDEVICE_EXTENSION DeviceExt,
00620                            ULONG ClusterToWrite,
00621                            ULONG NewValue,
00622                            PULONG OldValue);
00623 
00624 NTSTATUS FAT16GetNextCluster(PDEVICE_EXTENSION DeviceExt,
00625                              ULONG CurrentCluster,
00626                              PULONG NextCluster);
00627 
00628 NTSTATUS FAT16FindAndMarkAvailableCluster(PDEVICE_EXTENSION DeviceExt,
00629                                           PULONG Cluster);
00630 
00631 NTSTATUS FAT16WriteCluster(PDEVICE_EXTENSION DeviceExt,
00632                            ULONG ClusterToWrite,
00633                            ULONG NewValue,
00634                            PULONG OldValue);
00635 
00636 NTSTATUS FAT32GetNextCluster(PDEVICE_EXTENSION DeviceExt,
00637                              ULONG CurrentCluster,
00638                              PULONG NextCluster);
00639 
00640 NTSTATUS FAT32FindAndMarkAvailableCluster(PDEVICE_EXTENSION DeviceExt,
00641                                           PULONG Cluster);
00642 
00643 NTSTATUS FAT32WriteCluster(PDEVICE_EXTENSION DeviceExt,
00644                            ULONG ClusterToWrite,
00645                            ULONG NewValue,
00646                            PULONG OldValue);
00647 
00648 NTSTATUS OffsetToCluster (PDEVICE_EXTENSION DeviceExt,
00649                           ULONG FirstCluster,
00650                           ULONG FileOffset,
00651                           PULONG Cluster,
00652                           BOOLEAN Extend);
00653 
00654 ULONGLONG ClusterToSector (PDEVICE_EXTENSION DeviceExt,
00655                ULONG Cluster);
00656 
00657 NTSTATUS GetNextCluster (PDEVICE_EXTENSION DeviceExt,
00658                          ULONG CurrentCluster,
00659                          PULONG NextCluster);
00660 
00661 NTSTATUS GetNextClusterExtend (PDEVICE_EXTENSION DeviceExt,
00662                            ULONG CurrentCluster,
00663                            PULONG NextCluster);
00664 
00665 NTSTATUS CountAvailableClusters (PDEVICE_EXTENSION DeviceExt,
00666                                  PLARGE_INTEGER Clusters);
00667 
00668 NTSTATUS
00669 WriteCluster(PDEVICE_EXTENSION DeviceExt,
00670          ULONG ClusterToWrite,
00671          ULONG NewValue);
00672 
00673 /*  ------------------------------------------------------  direntry.c  */
00674 
00675 ULONG  vfatDirEntryGetFirstCluster (PDEVICE_EXTENSION  pDeviceExt,
00676                                     PDIR_ENTRY  pDirEntry);
00677 
00678 BOOLEAN VfatIsDirectoryEmpty(PVFATFCB Fcb);
00679 
00680 NTSTATUS FATGetNextDirEntry(PVOID * pContext,
00681                  PVOID * pPage,
00682                  IN PVFATFCB pDirFcb,
00683                  IN PVFAT_DIRENTRY_CONTEXT DirContext,
00684                  BOOLEAN First);
00685 
00686 NTSTATUS FATXGetNextDirEntry(PVOID * pContext,
00687                  PVOID * pPage,
00688                  IN PVFATFCB pDirFcb,
00689                  IN PVFAT_DIRENTRY_CONTEXT DirContext,
00690                  BOOLEAN First);
00691 
00692 /*  -----------------------------------------------------------  fcb.c  */
00693 
00694 PVFATFCB vfatNewFCB (PDEVICE_EXTENSION  pVCB,
00695                         PUNICODE_STRING pFileNameU);
00696 
00697 VOID vfatDestroyFCB (PVFATFCB  pFCB);
00698 
00699 VOID vfatDestroyCCB(PVFATCCB pCcb);
00700 
00701 VOID vfatGrabFCB (PDEVICE_EXTENSION  pVCB,
00702                   PVFATFCB  pFCB);
00703 
00704 VOID vfatReleaseFCB (PDEVICE_EXTENSION  pVCB,
00705                      PVFATFCB  pFCB);
00706 
00707 VOID vfatAddFCBToTable (PDEVICE_EXTENSION  pVCB,
00708                         PVFATFCB  pFCB);
00709 
00710 PVFATFCB vfatGrabFCBFromTable (PDEVICE_EXTENSION  pDeviceExt,
00711                                PUNICODE_STRING  pFileNameU);
00712 
00713 PVFATFCB vfatMakeRootFCB (PDEVICE_EXTENSION  pVCB);
00714 
00715 PVFATFCB vfatOpenRootFCB (PDEVICE_EXTENSION  pVCB);
00716 
00717 BOOLEAN vfatFCBIsDirectory (PVFATFCB FCB);
00718 
00719 BOOLEAN vfatFCBIsRoot(PVFATFCB FCB);
00720 
00721 NTSTATUS vfatAttachFCBToFileObject (PDEVICE_EXTENSION  vcb,
00722                                     PVFATFCB  fcb,
00723                                     PFILE_OBJECT  fileObject);
00724 
00725 NTSTATUS vfatDirFindFile (PDEVICE_EXTENSION  pVCB,
00726                           PVFATFCB  parentFCB,
00727                           PUNICODE_STRING FileToFindU,
00728                           PVFATFCB * fileFCB);
00729 
00730 NTSTATUS vfatGetFCBForFile (PDEVICE_EXTENSION  pVCB,
00731                             PVFATFCB  *pParentFCB,
00732                             PVFATFCB  *pFCB,
00733                             PUNICODE_STRING pFileNameU);
00734 
00735 NTSTATUS vfatMakeFCBFromDirEntry (PVCB  vcb,
00736                                   PVFATFCB  directoryFCB,
00737                   PVFAT_DIRENTRY_CONTEXT DirContext,
00738                                   PVFATFCB * fileFCB);
00739 
00740 /*  ------------------------------------------------------------  rw.c  */
00741 
00742 NTSTATUS VfatRead (PVFAT_IRP_CONTEXT IrpContext);
00743 
00744 NTSTATUS VfatWrite (PVFAT_IRP_CONTEXT IrpContext);
00745 
00746 NTSTATUS NextCluster(PDEVICE_EXTENSION DeviceExt,
00747                      ULONG FirstCluster,
00748                      PULONG CurrentCluster,
00749                      BOOLEAN Extend);
00750 
00751 /*  -----------------------------------------------------------  misc.c  */
00752 
00753 NTSTATUS VfatQueueRequest(PVFAT_IRP_CONTEXT IrpContext);
00754 
00755 PVFAT_IRP_CONTEXT VfatAllocateIrpContext(PDEVICE_OBJECT DeviceObject,
00756                                          PIRP Irp);
00757 
00758 VOID VfatFreeIrpContext(PVFAT_IRP_CONTEXT IrpContext);
00759 
00760 DRIVER_DISPATCH VfatBuildRequest;
00761 NTSTATUS NTAPI VfatBuildRequest (PDEVICE_OBJECT DeviceObject,
00762                                    PIRP Irp);
00763 
00764 PVOID VfatGetUserBuffer(IN PIRP);
00765 
00766 NTSTATUS VfatLockUserBuffer(IN PIRP, IN ULONG,
00767                             IN LOCK_OPERATION);
00768 
00769 NTSTATUS
00770 VfatSetExtendedAttributes(PFILE_OBJECT FileObject,
00771               PVOID Ea,
00772               ULONG EaLength);
00773 /*  ------------------------------------------------------------- flush.c  */
00774 
00775 NTSTATUS VfatFlush(PVFAT_IRP_CONTEXT IrpContext);
00776 
00777 NTSTATUS VfatFlushVolume(PDEVICE_EXTENSION DeviceExt, PVFATFCB VolumeFcb);
00778 
00779 /*  --------------------------------------------------------------- pnp.c  */
00780 
00781 NTSTATUS VfatPnp(PVFAT_IRP_CONTEXT IrpContext);
00782 
00783 /* EOF */

Generated on Sun May 27 2012 04:27:46 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.