void writeDriverDescriptorMap(AbstractFile* file, DriverDescriptorRecord* DDM, ChecksumFunc dataForkChecksum, void* dataForkToken, ResourceKey **resources) { AbstractFile* bufferFile; BLKXTable* blkx; ChecksumToken uncompressedToken; DriverDescriptorRecord* buffer; buffer = (DriverDescriptorRecord*) malloc(DDM_SIZE * SECTOR_SIZE); memcpy(buffer, DDM, DDM_SIZE * SECTOR_SIZE); memset(&uncompressedToken, 0, sizeof(uncompressedToken)); flipDriverDescriptorRecord(buffer, TRUE); bufferFile = createAbstractFileFromMemory((void**)&buffer, DDM_SIZE * SECTOR_SIZE); blkx = insertBLKX(file, bufferFile, DDM_OFFSET, DDM_SIZE, DDM_DESCRIPTOR, CHECKSUM_CRC32, &CRCProxy, &uncompressedToken, dataForkChecksum, dataForkToken, NULL); blkx->checksum.data[0] = uncompressedToken.crc; *resources = insertData(*resources, "blkx", -1, "Driver Descriptor Map (DDM : 0)", (const char*) blkx, sizeof(BLKXTable) + (blkx->blocksRunCount * sizeof(BLKXRun)), ATTRIBUTE_HDIUTIL); free(buffer); bufferFile->close(bufferFile); free(blkx); }
int writeDriverDescriptorMap(int pNum, AbstractFile* file, DriverDescriptorRecord* DDM, unsigned int BlockSize, ChecksumFunc dataForkChecksum, void* dataForkToken, ResourceKey **resources) { AbstractFile* bufferFile; BLKXTable* blkx; ChecksumToken uncompressedToken; DriverDescriptorRecord* buffer; buffer = (DriverDescriptorRecord*) malloc(DDM_SIZE * BlockSize); memcpy(buffer, DDM, DDM_SIZE * BlockSize); memset(&uncompressedToken, 0, sizeof(uncompressedToken)); flipDriverDescriptorRecord(buffer, TRUE); bufferFile = createAbstractFileFromMemory((void**)&buffer, DDM_SIZE * BlockSize); blkx = insertBLKX(file, bufferFile, DDM_OFFSET, DDM_SIZE, DDM_DESCRIPTOR, CHECKSUM_CRC32, &CRCProxy, &uncompressedToken, dataForkChecksum, dataForkToken, NULL, 0); blkx->checksum.data[0] = uncompressedToken.crc; char pName[100]; sprintf(pName, "Driver Descriptor Map (DDM : %d)", pNum + 1); *resources = insertData(*resources, "blkx", pNum, pName, (const char*) blkx, sizeof(BLKXTable) + (blkx->blocksRunCount * sizeof(BLKXRun)), ATTRIBUTE_HDIUTIL); free(buffer); bufferFile->close(bufferFile); free(blkx); pNum++; if((DDM_SIZE * BlockSize / SECTOR_SIZE) - DDM_SIZE > 0) pNum = writeFreePartition(pNum, file, DDM_SIZE, (DDM_SIZE * BlockSize / SECTOR_SIZE) - DDM_SIZE, resources); return pNum; }
int writeApplePartitionMap(int pNum, AbstractFile* file, Partition* partitions, unsigned int BlockSize, ChecksumFunc dataForkChecksum, void* dataForkToken, ResourceKey **resources, NSizResource** nsizIn) { AbstractFile* bufferFile; BLKXTable* blkx; ChecksumToken uncompressedToken; Partition* buffer; NSizResource* nsiz; CSumResource csum; size_t realPartitionSize = (PARTITION_SIZE * SECTOR_SIZE) / BlockSize * BlockSize; buffer = (Partition*) malloc(realPartitionSize); memcpy(buffer, partitions, realPartitionSize); memset(&uncompressedToken, 0, sizeof(uncompressedToken)); flipPartition(buffer, TRUE, BlockSize); bufferFile = createAbstractFileFromMemory((void**)&buffer, realPartitionSize); blkx = insertBLKX(file, bufferFile, PARTITION_OFFSET * BlockSize / SECTOR_SIZE, realPartitionSize / SECTOR_SIZE, pNum, CHECKSUM_CRC32, &BlockCRC, &uncompressedToken, dataForkChecksum, dataForkToken, NULL, 0); bufferFile->close(bufferFile); *((uint32_t*)blkx->checksum.data) = uncompressedToken.crc; csum.version = 1; csum.type = CHECKSUM_MKBLOCK; csum.checksum = uncompressedToken.block; char pName[100]; sprintf(pName, "Apple (Apple_partition_map : %d)", pNum + 1); *resources = insertData(*resources, "blkx", pNum, pName, (const char*) blkx, sizeof(BLKXTable) + (blkx->blocksRunCount * sizeof(BLKXRun)), ATTRIBUTE_HDIUTIL); *resources = insertData(*resources, "cSum", 0, "", (const char*) (&csum), sizeof(csum), 0); nsiz = (NSizResource*) malloc(sizeof(NSizResource)); memset(nsiz, 0, sizeof(NSizResource)); nsiz->isVolume = FALSE; nsiz->blockChecksum2 = uncompressedToken.block; nsiz->partitionNumber = 0; nsiz->version = 6; nsiz->next = NULL; if((*nsizIn) == NULL) { *nsizIn = nsiz; } else { nsiz->next = (*nsizIn)->next; (*nsizIn)->next = nsiz; } free(buffer); free(blkx); return pNum + 1; }
void writeATAPI(AbstractFile* file, ChecksumFunc dataForkChecksum, void* dataForkToken, ResourceKey **resources, NSizResource** nsizIn) { AbstractFile* bufferFile; BLKXTable* blkx; ChecksumToken uncompressedToken; NSizResource* nsiz; CSumResource csum; char* atapi; memset(&uncompressedToken, 0, sizeof(uncompressedToken)); atapi = (char*) malloc(ATAPI_SIZE * SECTOR_SIZE); printf("malloc: %p %d\n", atapi, ATAPI_SIZE * SECTOR_SIZE); fflush(stdout); memcpy(atapi, atapi_data, ATAPI_SIZE * SECTOR_SIZE); bufferFile = createAbstractFileFromMemory((void**)&atapi, ATAPI_SIZE * SECTOR_SIZE); blkx = insertBLKX(file, bufferFile, ATAPI_OFFSET, ATAPI_SIZE, 1, CHECKSUM_CRC32, &BlockCRC, &uncompressedToken, dataForkChecksum, dataForkToken, NULL); bufferFile->close(bufferFile); free(atapi); blkx->checksum.data[0] = uncompressedToken.crc; csum.version = 1; csum.type = CHECKSUM_MKBLOCK; csum.checksum = uncompressedToken.block; *resources = insertData(*resources, "blkx", 1, "Macintosh (Apple_Driver_ATAPI : 2)", (const char*) blkx, sizeof(BLKXTable) + (blkx->blocksRunCount * sizeof(BLKXRun)), ATTRIBUTE_HDIUTIL); *resources = insertData(*resources, "cSum", 1, "", (const char*) (&csum), sizeof(csum), 0); nsiz = (NSizResource*) malloc(sizeof(NSizResource)); memset(nsiz, 0, sizeof(NSizResource)); nsiz->isVolume = FALSE; nsiz->blockChecksum2 = uncompressedToken.block; nsiz->partitionNumber = 1; nsiz->version = 6; nsiz->next = NULL; if((*nsizIn) == NULL) { *nsizIn = nsiz; } else { nsiz->next = (*nsizIn)->next; (*nsizIn)->next = nsiz; } free(blkx); }