101#define IsBpbFat32(bpb) (*(USHORT *)(&(bpb)->SectorsPerFat) == 0)
136#define FatUnpackBios(Bios,Pbios) { \
137 CopyUchar2(&(Bios)->BytesPerSector, &(Pbios)->BytesPerSector[0] ); \
138 CopyUchar1(&(Bios)->SectorsPerCluster, &(Pbios)->SectorsPerCluster[0]); \
139 CopyUchar2(&(Bios)->ReservedSectors, &(Pbios)->ReservedSectors[0] ); \
140 CopyUchar1(&(Bios)->Fats, &(Pbios)->Fats[0] ); \
141 CopyUchar2(&(Bios)->RootEntries, &(Pbios)->RootEntries[0] ); \
142 CopyUchar2(&(Bios)->Sectors, &(Pbios)->Sectors[0] ); \
143 CopyUchar1(&(Bios)->Media, &(Pbios)->Media[0] ); \
144 CopyUchar2(&(Bios)->SectorsPerFat, &(Pbios)->SectorsPerFat[0] ); \
145 CopyUchar2(&(Bios)->SectorsPerTrack, &(Pbios)->SectorsPerTrack[0] ); \
146 CopyUchar2(&(Bios)->Heads, &(Pbios)->Heads[0] ); \
147 CopyUchar4(&(Bios)->HiddenSectors, &(Pbios)->HiddenSectors[0] ); \
148 CopyUchar4(&(Bios)->LargeSectors, &(Pbios)->LargeSectors[0] ); \
149 CopyUchar4(&(Bios)->LargeSectorsPerFat,&((PPACKED_BIOS_PARAMETER_BLOCK_EX)Pbios)->LargeSectorsPerFat[0] ); \
150 CopyUchar2(&(Bios)->ExtendedFlags, &((PPACKED_BIOS_PARAMETER_BLOCK_EX)Pbios)->ExtendedFlags[0] ); \
151 CopyUchar2(&(Bios)->FsVersion, &((PPACKED_BIOS_PARAMETER_BLOCK_EX)Pbios)->FsVersion[0] ); \
152 CopyUchar4(&(Bios)->RootDirFirstCluster, \
153 &((PPACKED_BIOS_PARAMETER_BLOCK_EX)Pbios)->RootDirFirstCluster[0] ); \
154 CopyUchar2(&(Bios)->FsInfoSector, &((PPACKED_BIOS_PARAMETER_BLOCK_EX)Pbios)->FsInfoSector[0] ); \
155 CopyUchar2(&(Bios)->BackupBootSector, &((PPACKED_BIOS_PARAMETER_BLOCK_EX)Pbios)->BackupBootSector[0] ); \
204#define FSINFO_SECTOR_BEGIN_SIGNATURE 0x41615252
205#define FSINFO_SECTOR_END_SIGNATURE 0xAA550000
207#define FSINFO_SIGNATURE 0x61417272
213#define FAT_BOOT_SECTOR_DIRTY 0x01
214#define FAT_BOOT_SECTOR_TEST_SURFACE 0x02
227#define FAT32_ENTRY_MASK 0x0FFFFFFFUL
234#define FAT_CLEAN_VOLUME (~FAT32_ENTRY_MASK | 0)
235#define FAT_DIRTY_VOLUME (~FAT32_ENTRY_MASK | 1)
237#define FAT_DIRTY_BIT_INDEX 1
245#define FAT_CLEAN_ENTRY (~0)
247#define FAT12_DIRTY_ENTRY 0x7ff
248#define FAT16_DIRTY_ENTRY 0x7fff
249#define FAT32_DIRTY_ENTRY 0x7fffffff
255#define FAT_CLUSTER_AVAILABLE (FAT_ENTRY)0x00000000
256#define FAT_CLUSTER_RESERVED (FAT_ENTRY)0x0ffffff0
257#define FAT_CLUSTER_BAD (FAT_ENTRY)0x0ffffff7
258#define FAT_CLUSTER_LAST (FAT_ENTRY)0x0fffffff
334#define FAT_DIRENT_NEVER_USED 0x00
335#define FAT_DIRENT_REALLY_0E5 0x05
336#define FAT_DIRENT_DIRECTORY_ALIAS 0x2e
337#define FAT_DIRENT_DELETED 0xe5
353#define FAT_DIRENT_NT_BYTE_ENCRYPTED 0x01
354#define FAT_DIRENT_NT_BYTE_BIG_HEADER 0x02
361#define FAT_DIRENT_NT_BYTE_8_LOWER_CASE 0x08
362#define FAT_DIRENT_NT_BYTE_3_LOWER_CASE 0x10
368#define FAT_DIRENT_ATTR_READ_ONLY 0x01
369#define FAT_DIRENT_ATTR_HIDDEN 0x02
370#define FAT_DIRENT_ATTR_SYSTEM 0x04
371#define FAT_DIRENT_ATTR_VOLUME_ID 0x08
372#define FAT_DIRENT_ATTR_DIRECTORY 0x10
373#define FAT_DIRENT_ATTR_ARCHIVE 0x20
374#define FAT_DIRENT_ATTR_DEVICE 0x40
375#define FAT_DIRENT_ATTR_LFN (FAT_DIRENT_ATTR_READ_ONLY | \
376 FAT_DIRENT_ATTR_HIDDEN | \
377 FAT_DIRENT_ATTR_SYSTEM | \
378 FAT_DIRENT_ATTR_VOLUME_ID)
384#define FAT_EFS_EXTENSION L".PFILE"
385#define FAT_EFS_EXTENSION_CHARCOUNT (6)
386#define FAT_EFS_EXTENSION_BYTECOUNT (12)
408#define FatBytesPerCluster(B) ((ULONG)((B)->BytesPerSector * (B)->SectorsPerCluster))
410#define FatBytesPerFat(B) (IsBpbFat32(B)? \
411 ((ULONG)((B)->BytesPerSector * (B)->LargeSectorsPerFat)) : \
412 ((ULONG)((B)->BytesPerSector * (B)->SectorsPerFat)))
414#define FatReservedBytes(B) ((ULONG)((B)->BytesPerSector * (B)->ReservedSectors))
427#define FatRootDirectorySize(B) ((ULONG)((B)->RootEntries * sizeof(DIRENT)))
445#define FatRootDirectoryLbo(B) (FatReservedBytes(B) + ((B)->Fats * FatBytesPerFat(B)))
446#define FatRootDirectoryLbo32(B) (FatFileAreaLbo(B)+((B)->RootDirFirstCluster-2)*FatBytesPerCluster(B))
458#define FatFileAreaLbo(B) (FatRootDirectoryLbo(B) + FatRootDirectorySize(B))
482#define FatNumberOfClusters(B) ( \
486 ((((B)->Sectors ? (B)->Sectors : (B)->LargeSectors) \
488 - ((B)->ReservedSectors + \
489 (B)->Fats * (B)->LargeSectorsPerFat )) \
493 (B)->SectorsPerCluster) \
495 ((((B)->Sectors ? (B)->Sectors : (B)->LargeSectors) \
497 - ((B)->ReservedSectors + \
498 (B)->Fats * (B)->SectorsPerFat + \
499 (B)->RootEntries * sizeof(DIRENT) / (B)->BytesPerSector ) ) \
503 (B)->SectorsPerCluster) \
515#define FatIndexBitSize(B) \
516 ((UCHAR)(IsBpbFat32(B) ? 32 : (FatNumberOfClusters(B) < 4087 ? 12 : 16)))
532#define FatVerifyIndexIsValid(IC,V,I) { \
533 if (((I) < 2) || ((I) > ((V)->AllocationSupport.NumberOfClusters + 1))) { \
534 FatRaiseStatus(IC,STATUS_FILE_CORRUPT_ERROR); \
559#define FatGetLboFromIndex(VCB,FAT_INDEX) ( \
561 (VCB)->AllocationSupport.FileAreaLbo + \
562 (((LBO)((FAT_INDEX) - 2)) << (VCB)->AllocationSupport.LogOfBytesPerCluster) \
566#define FatGetIndexFromLbo(VCB,LBO) ( \
568 (((LBO) - (VCB)->AllocationSupport.FileAreaLbo) >> \
569 (VCB)->AllocationSupport.LogOfBytesPerCluster) + 2 \
584#define FatLookup12BitEntry(FAT,INDEX,ENTRY) { \
586 CopyUchar2((PUCHAR)(ENTRY), (PUCHAR)(FAT) + (INDEX) * 3 / 2); \
588 *ENTRY = (FAT_ENTRY)(0xfff & (((INDEX) & 1) ? (*(ENTRY) >> 4) : \
603#define FatSet12BitEntry(FAT,INDEX,ENTRY) { \
605 FAT_ENTRY TmpFatEntry; \
607 CopyUchar2((PUCHAR)&TmpFatEntry, (PUCHAR)(FAT) + (INDEX) * 3 / 2); \
609 TmpFatEntry = (FAT_ENTRY) \
610 (((INDEX) & 1) ? ((ENTRY) << 4) | (TmpFatEntry & 0xf) \
611 : (ENTRY) | (TmpFatEntry & 0xf000)); \
613 *((UNALIGNED UCHAR2 *)((PUCHAR)(FAT) + (INDEX) * 3 / 2)) = *((UNALIGNED UCHAR2 *)(&TmpFatEntry)); \
620#define FatAreTimesEqual(TIME1,TIME2) ( \
621 RtlEqualMemory((TIME1),(TIME2), sizeof(FAT_TIME_STAMP)) \
625#define EA_FILE_SIGNATURE (0x4445)
626#define EA_SET_SIGNATURE (0x4145)
674#define SIZE_OF_EA_SET_HEADER 30
676#define MAXIMUM_EA_SIZE 0x0000ffff
678#define GetcbList(EASET) (((EASET)->cbList[0] << 0) + \
679 ((EASET)->cbList[1] << 8) + \
680 ((EASET)->cbList[2] << 16) + \
681 ((EASET)->cbList[3] << 24))
683#define SetcbList(EASET,CB) { \
684 (EASET)->cbList[0] = (CB >> 0) & 0x0ff; \
685 (EASET)->cbList[1] = (CB >> 8) & 0x0ff; \
686 (EASET)->cbList[2] = (CB >> 16) & 0x0ff; \
687 (EASET)->cbList[3] = (CB >> 24) & 0x0ff; \
719#define GetEaValueLength(EA,LEN) { \
721 CopyUchar2( (LEN), (EA)->EaValueLength ); \
724#define SetEaValueLength(EA,LEN) { \
725 CopyUchar2( &((EA)->EaValueLength), (LEN) ); \
738#define SizeOfPackedEa(EA,SIZE) { \
739 ULONG _NL,_DL; _NL = 0; _DL = 0; \
740 CopyUchar1(&_NL, &(EA)->EaNameLength); \
741 GetEaValueLength(EA, &_DL); \
742 *(SIZE) = 1 + 1 + 2 + _NL + 1 + _DL; \
745#define EA_NEED_EA_FLAG 0x80
746#define MIN_EA_HANDLE 1
747#define MAX_EA_HANDLE 30719
748#define UNUSED_EA_HANDLE 0xffff
749#define EA_CBLIST_OFFSET 0x1a
750#define MAX_EA_BASE_INDEX 240
751#define MAX_EA_OFFSET_INDEX 128
PACKED_DIRENT * PPACKED_DIRENT
EA_OFF_TABLE * PEA_OFF_TABLE
EA_SET_HEADER * PEA_SET_HEADER
struct _EA_SET_HEADER EA_SET_HEADER
struct _PACKED_BOOT_SECTOR_EX PACKED_BOOT_SECTOR_EX
struct _PACKED_BIOS_PARAMETER_BLOCK PACKED_BIOS_PARAMETER_BLOCK
struct BIOS_PARAMETER_BLOCK * PBIOS_PARAMETER_BLOCK
struct _PACKED_EA PACKED_EA
struct _EA_FILE_HEADER EA_FILE_HEADER
PACKED_BIOS_PARAMETER_BLOCK_EX * PPACKED_BIOS_PARAMETER_BLOCK_EX
struct _FSINFO_SECTOR * PFSINFO_SECTOR
EA_FILE_HEADER * PEA_FILE_HEADER
PACKED_BOOT_SECTOR * PPACKED_BOOT_SECTOR
struct _FAT_DATE FAT_DATE
struct _PACKED_BOOT_SECTOR PACKED_BOOT_SECTOR
struct _PACKED_DIRENT PACKED_DIRENT
struct BIOS_PARAMETER_BLOCK BIOS_PARAMETER_BLOCK
struct _FAT_TIME_STAMP FAT_TIME_STAMP
struct _PACKED_BIOS_PARAMETER_BLOCK_EX PACKED_BIOS_PARAMETER_BLOCK_EX
FAT_TIME_STAMP * PFAT_TIME_STAMP
PACKED_BOOT_SECTOR_EX * PPACKED_BOOT_SECTOR_EX
struct _FAT_TIME FAT_TIME
struct _FSINFO_SECTOR FSINFO_SECTOR
PACKED_BIOS_PARAMETER_BLOCK * PPACKED_BIOS_PARAMETER_BLOCK
ULONG32 LargeSectorsPerFat
ULONG32 RootDirFirstCluster
ULONG SectorBeginSignature
UCHAR RootDirFirstCluster[4]
UCHAR LargeSectorsPerFat[4]
UCHAR BackupBootSector[2]
UCHAR SectorsPerCluster[1]
UCHAR SectorsPerCluster[1]
UCHAR PhysicalDriveNumber
PACKED_BIOS_PARAMETER_BLOCK_EX PackedBpb
UCHAR PhysicalDriveNumber
PACKED_BIOS_PARAMETER_BLOCK PackedBpb
FAT_TIME_STAMP CreationTime
USHORT FirstClusterOfFile
USHORT ExtendedAttributes
USHORT FirstClusterOfFileHi
FAT_TIME_STAMP LastWriteTime
_Reserved_ PVOID Reserved