Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenvfat.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
1.7.6.1
|