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) // "ED" 626 #define EA_SET_SIGNATURE (0x4145) // "EA" 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 ULONG SectorBeginSignature
struct _FAT_TIME_STAMP FAT_TIME_STAMP
UCHAR RootDirFirstCluster[4]
struct _PACKED_BIOS_PARAMETER_BLOCK_EX PACKED_BIOS_PARAMETER_BLOCK_EX
FAT_TIME_STAMP CreationTime
UCHAR LargeSectorsPerFat[4]
EA_FILE_HEADER * PEA_FILE_HEADER
struct _PACKED_EA PACKED_EA
struct _FSINFO_SECTOR FSINFO_SECTOR
struct _PACKED_BOOT_SECTOR PACKED_BOOT_SECTOR
struct _PACKED_DIRENT PACKED_DIRENT
PACKED_BIOS_PARAMETER_BLOCK_EX PackedBpb
USHORT FirstClusterOfFileHi
UCHAR PhysicalDriveNumber
struct _EA_FILE_HEADER EA_FILE_HEADER
_Reserved_ PVOID Reserved
PACKED_BOOT_SECTOR_EX * PPACKED_BOOT_SECTOR_EX
UCHAR PhysicalDriveNumber
EA_OFF_TABLE * PEA_OFF_TABLE
PACKED_BIOS_PARAMETER_BLOCK PackedBpb
ULONG32 LargeSectorsPerFat
EA_SET_HEADER * PEA_SET_HEADER
UCHAR BackupBootSector[2]
struct BIOS_PARAMETER_BLOCK BIOS_PARAMETER_BLOCK
PACKED_BIOS_PARAMETER_BLOCK * PPACKED_BIOS_PARAMETER_BLOCK
struct BIOS_PARAMETER_BLOCK * PBIOS_PARAMETER_BLOCK
struct _EA_SET_HEADER EA_SET_HEADER
PACKED_DIRENT * PPACKED_DIRENT
UCHAR SectorsPerCluster[1]
USHORT FirstClusterOfFile
struct _FAT_DATE FAT_DATE
FAT_TIME_STAMP LastWriteTime
struct _FAT_TIME FAT_TIME
FAT_TIME_STAMP * PFAT_TIME_STAMP
ULONG32 RootDirFirstCluster
struct _FSINFO_SECTOR * PFSINFO_SECTOR
PACKED_BIOS_PARAMETER_BLOCK_EX * PPACKED_BIOS_PARAMETER_BLOCK_EX
PACKED_BOOT_SECTOR * PPACKED_BOOT_SECTOR
UCHAR SectorsPerCluster[1]
struct _PACKED_BIOS_PARAMETER_BLOCK PACKED_BIOS_PARAMETER_BLOCK
USHORT ExtendedAttributes
struct _PACKED_BOOT_SECTOR_EX PACKED_BOOT_SECTOR_EX