#pragma mark -␊ |
␊ |
static␊ |
int FATCacheInit(void)␊ |
int FATCacheInit(int invalidate)␊ |
{␊ |
␉if (!gFATCacheBuffer)␊ |
␉{␊ |
|
␉␉{␊ |
␉␉␉return -1;␊ |
␉␉}␊ |
␉␉invalidate = 1;␊ |
␉}␊ |
␉gCachedFATBlockAddress = INVALID_FAT_ADDRESS;␊ |
␉if (invalidate)␊ |
␉{␊ |
␉␉gCachedFATBlockAddress = INVALID_FAT_ADDRESS;␊ |
␉}␊ |
␉return 0;␊ |
}␊ |
␊ |
|
␉␉lcba = cluster >> shift;␊ |
␉␉if (lcba != gCachedFATBlockAddress)␊ |
␉␉{␊ |
␉␉␉Seek(gCurrentIH, (((long long) gFATOffset) << gBPSShift) + (((long long) lcba) << gBPCBShift));␊ |
␉␉␉Read(gCurrentIH, (long) gFATCacheBuffer, CacheBlockSize());␊ |
␉␉␉CacheRead(gCurrentIH,␊ |
␉␉␉␉␉ (char*) gFATCacheBuffer,␊ |
␉␉␉␉␉ (((long long) gFATOffset) << gBPSShift) + (((long long) lcba) << gBPCBShift),␊ |
␉␉␉␉␉ CacheBlockSize(),␊ |
␉␉␉␉␉ 1);␊ |
␉␉␉gCachedFATBlockAddress = lcba;␊ |
␉␉}␊ |
␉␉lcba = cluster + 1;␊ |
|
␉␉toRead = (uint16_t) (1 << (gBPCBShift - gBPSShift));␊ |
␉␉if (pIter->lsa + toRead > pIter->lsa_end)␊ |
␉␉␉toRead = (uint16_t) (pIter->lsa_end - pIter->lsa);␊ |
␉␉Seek(gCurrentIH, (long long) (pIter->lsa << gBPSShift));␊ |
␉␉Read(gCurrentIH, (long) pIter->buffer, ((long) toRead) << gBPSShift);␊ |
␉␉CacheRead(gCurrentIH,␊ |
␉␉␉␉ (char*) pIter->buffer,␊ |
␉␉␉␉ (long long) (pIter->lsa << gBPSShift),␊ |
␉␉␉␉ ((uint32_t) toRead) << gBPSShift,␊ |
␉␉␉␉ 1);␊ |
␉␉pIter->lsa += toRead;␊ |
␉␉pIter->entry_offset = 0;␊ |
␉}␊ |
|
␉if (!ih)␊ |
␉␉return -1;␊ |
␉if (gCurrentIH == ih)␊ |
␉␉return FATCacheInit();␊ |
␉{␊ |
␉␉CacheInit(ih, CacheBlockSize());␊ |
␉␉return FATCacheInit(0);␊ |
␉}␊ |
␊ |
␉buffer = (uint8_t*) malloc(BPS);␊ |
␉if (!buffer)␊ |
|
␉␉return -1;␊ |
␉}␊ |
␊ |
␉if (FATCacheInit() < 0) {␊ |
␉if (FATCacheInit(1) < 0)␊ |
␉{␊ |
␉␉free(buffer);␊ |
␉␉return -1;␊ |
␉}␊ |
|
␊ |
␉gCurrentIH = ih;␊ |
␊ |
␉CacheInit(ih, CacheBlockSize());␊ |
␊ |
␉free(buffer);␊ |
␉return 0;␊ |
}␊ |