#ifndef __FAT_H__ #define __FAT_H__ typedef struct { unsigned char Drive; //useless unsigned char FlagsNT; unsigned char Signature; // 0x28 or 0x29 unsigned SerialNumber; char VolumeLabel[11]; char SysIDString[8]; // unreliable } __attribute__((packed)) BPB_EXT_16; typedef struct { unsigned SectorsPerFAT; unsigned short Flags; unsigned short Version; unsigned ClusterOfRootDirectory; unsigned short ClusterOfFSInfo; unsigned short ClusterOfBackupBootSector; unsigned char Reserved[12]; // Should be 0 at format unsigned char Drive; unsigned char FlagsNT; unsigned char Signature; // 0x28 or 0x29 unsigned SerialNumber; char VolumeLabel[11]; char SysIDString[8]; // always FAT12 } __attribute__((packed)) BPB_EXT_32; typedef struct { unsigned char _ignore[3]; // Bios Parameter Block char OEMIdentify[8]; unsigned short BytesPerSector; unsigned char SectorsPerCluster; unsigned short ReservedSectors; unsigned char NumberOfFATs; unsigned short NumberOfDirectoryEntries; unsigned short NumberOfSectors; unsigned char MediaDescriptorType; unsigned short SectorsPerFAT; unsigned short SectorsPerTrack; unsigned short HeadsPerCylinder; unsigned HiddenSectors; unsigned NumberOfSectorsLong; union { BPB_EXT_16 Ext16; BPB_EXT_32 Ext32; } Extended; } __attribute__((packed)) FATBootSector, *FATBootSectorPointer; typedef struct { unsigned NumberOfSectors; unsigned SizeOfSector; unsigned FatOffset; unsigned NumberOfRootEntries; unsigned RootOffset; unsigned SizeOfRoot; unsigned SizeOfFat; unsigned SizeOfFatEntry; unsigned SizeOfCluster; void (*ReadSector) (void* buffer, int lba); } FatMountInfo, *FatMountInfoPointer; typedef struct { char FileName[8]; char Extension[3]; unsigned char Atributes; unsigned char Reserved; unsigned char CreateTimeFine; unsigned short CreateTime; unsigned short CreateDate; unsigned short LastAccessedDate; unsigned short EAIndex; unsigned short LastModifiedTime; unsigned short LastModifiedDate; unsigned short FirstCluster; unsigned FileSize; } __attribute__((packed)) FatDirectoryEntry, *FatDirectoryEntryPointer; extern FatMountInfo FloppyMount(int drive); #endif