MCPcopy Create free account
hub / github.com/Gregwar/fatcat / parseHeader

Method parseHeader

src/core/FatSystem.cpp:134–194  ·  view source on GitHub ↗

* Parses FAT header */

Source from the content-addressed store, hash-verified

132 * Parses FAT header
133 */
134void FatSystem::parseHeader()
135{
136 char buffer[128];
137
138 readData(0x0, buffer, sizeof(buffer));
139 bytesPerSector = FAT_READ_SHORT(buffer, FAT_BYTES_PER_SECTOR)&0xffff;
140 sectorsPerCluster = buffer[FAT_SECTORS_PER_CLUSTER]&0xff;
141 reservedSectors = FAT_READ_SHORT(buffer, FAT_RESERVED_SECTORS)&0xffff;
142 oemName = string(buffer+FAT_DISK_OEM, FAT_DISK_OEM_SIZE);
143 fats = buffer[FAT_FATS];
144
145 sectorsPerFat = FAT_READ_SHORT(buffer, FAT16_SECTORS_PER_FAT)&0xffff;
146
147 if (sectorsPerFat != 0) {
148 type = FAT16;
149 diskLabel = string(buffer+FAT16_DISK_LABEL, FAT16_DISK_LABEL_SIZE);
150 fsType = string(buffer+FAT16_DISK_FS, FAT16_DISK_FS_SIZE);
151 rootEntries = FAT_READ_SHORT(buffer, FAT16_ROOT_ENTRIES)&0xffff;
152 rootDirectory = 0;
153
154 totalSectors = FAT_READ_SHORT(buffer, FAT16_TOTAL_SECTORS)&0xffff;
155 if (!totalSectors) {
156 totalSectors = FAT_READ_LONG(buffer, FAT_TOTAL_SECTORS)&0xffffffff;
157 }
158
159 unsigned int rootDirSectors =
160 (rootEntries*FAT_ENTRY_SIZE + bytesPerSector-1)/bytesPerSector;
161 unsigned long dataSectors = totalSectors -
162 (reservedSectors + fats*sectorsPerFat + rootDirSectors);
163 unsigned long totalClusters = dataSectors/sectorsPerCluster;
164 bits = (totalClusters > MAX_FAT12) ? 16 : 12;
165 } else {
166 type = FAT32;
167 bits = 32;
168 sectorsPerFat = FAT_READ_LONG(buffer, FAT_SECTORS_PER_FAT)&0xffffffff;
169 totalSectors = FAT_READ_LONG(buffer, FAT_TOTAL_SECTORS)&0xffffffff;
170 diskLabel = string(buffer+FAT_DISK_LABEL, FAT_DISK_LABEL_SIZE);
171 rootDirectory = FAT_READ_LONG(buffer, FAT_ROOT_DIRECTORY)&0xffffffff;
172 fsType = string(buffer+FAT_DISK_FS, FAT_DISK_FS_SIZE);
173 }
174
175 if (bytesPerSector != 512) {
176 printf("WARNING: Bytes per sector is not 512 (%llu)\n", bytesPerSector);
177 strange++;
178 }
179
180 if (sectorsPerCluster > 128) {
181 printf("WARNING: Sectors per cluster high (%llu)\n", sectorsPerCluster);
182 strange++;
183 }
184
185 if (fats == 0) {
186 printf("WARNING: Fats numbner is 0\n");
187 strange++;
188 }
189
190 if (rootDirectory != 2 && type == FAT32) {
191 printf("WARNING: Root directory is not 2 (%llu)\n", rootDirectory);

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected