int MultipleFatCheck(RDWRHandle handle) { unsigned short sectorsperfat = GetSectorsPerFat(handle); unsigned char numberoffats = GetNumberOfFats(handle); unsigned long bytesinfat = GetBytesInFat(handle), compared = 0, rest; SECTOR fat1start = GetFatStart(handle), fat2start = fat1start, i, j; char buffer1[BYTESPERSECTOR]; char buffer2[BYTESPERSECTOR]; if ((sectorsperfat == 0) || (numberoffats == 0) || (fat1start == 0) || (bytesinfat == 0)) return FAIL; /* Not succeeded. */ if (numberoffats == 1) return TRUE; /* Succeeded when only one fat? */ rest = bytesinfat % BYTESPERSECTOR; for (i = 0; i < numberoffats - 1; i++) { fat2start += sectorsperfat; for (j = 0; j < sectorsperfat; j++) { if (ReadSectors(handle, 1, fat1start + j, buffer1) == -1) return FAIL; if (ReadSectors(handle, 1, fat2start + j, buffer2) == -1) return FAIL; if (compared == bytesinfat - rest) { if (memcmp(buffer1, buffer2, (int) rest) != 0) return FALSE; compared = 0; } else { if (memcmp(buffer1, buffer2, BYTESPERSECTOR) != 0) return FALSE; compared += BYTESPERSECTOR; } } } return TRUE; }
SECTOR GetDirectoryStart(RDWRHandle handle) { unsigned short reserved; unsigned char fats; unsigned long SectorsPerFat; if (handle->dirbegin == 0) { reserved = GetReservedSectors(handle); if (reserved == 0) RETURN_FTEERR(FALSE); fats = GetNumberOfFats(handle); if (fats == 0) RETURN_FTEERR(FALSE); SectorsPerFat = GetSectorsPerFat(handle); if (SectorsPerFat == 0) RETURN_FTEERR(FALSE); handle->dirbegin = (SECTOR) reserved + ((SECTOR)fats * SectorsPerFat); } return handle->dirbegin; }