87 const uint32_t initial_length = length == NULL ? 0U : *length;
89 TRACE(
"Entering aaruf_read_media_tag(%p, %p, %d, %u)", context, data, tag, initial_length);
95 FATAL(
"Invalid context");
96 TRACE(
"Exiting aaruf_read_media_tag() = AARUF_ERROR_NOT_AARUFORMAT");
102 FATAL(
"Invalid length pointer");
103 TRACE(
"Exiting aaruf_read_media_tag() = AARUF_ERROR_INCORRECT_DATA_SIZE");
112 FATAL(
"Invalid context");
113 TRACE(
"Exiting aaruf_read_media_tag() = AARUF_ERROR_NOT_AARUFORMAT");
117 TRACE(
"Finding media tag %d", tag);
118 HASH_FIND_INT(ctx->
mediaTags, &tag, item);
122 TRACE(
"Media tag not found");
125 TRACE(
"Exiting aaruf_read_media_tag() = AARUF_ERROR_MEDIA_TAG_NOT_PRESENT");
129 if(data == NULL || *length < item->length)
131 TRACE(
"Buffer too small for media tag %d, required %u bytes", tag, item->
length);
134 TRACE(
"Exiting aaruf_read_media_tag() = AARUF_ERROR_BUFFER_TOO_SMALL");
141 TRACE(
"Media tag %d read successfully, length %u", tag, *length);
142 TRACE(
"Exiting aaruf_read_media_tag() = AARUF_STATUS_OK");
250int32_t
aaruf_read_sector(
void *context,
const uint64_t sector_address,
bool negative, uint8_t *data, uint32_t *length)
252 const uint32_t initial_length = length == NULL ? 0U : *length;
254 TRACE(
"Entering aaruf_read_sector(%p, %" PRIu64
", %d, %p, %u)", context, sector_address, negative, data,
259 uint64_t block_offset = 0;
261 uint8_t *block = NULL;
262 size_t read_bytes = 0;
264 size_t lzma_size = 0;
265 uint8_t *cmp_data = NULL;
267 uint8_t sector_status = 0;
271 FATAL(
"Invalid context");
273 TRACE(
"Exiting aaruf_read_sector() = AARUF_ERROR_NOT_AARUFORMAT");
281 FATAL(
"Invalid length pointer");
283 TRACE(
"Exiting aaruf_read_sector() = AARUF_ERROR_INCORRECT_DATA_SIZE");
290 FATAL(
"Invalid context");
292 TRACE(
"Exiting aaruf_read_sector() = AARUF_ERROR_NOT_AARUFORMAT");
298 FATAL(
"Sector address out of bounds");
300 TRACE(
"Exiting aaruf_read_sector() = AARUF_ERROR_SECTOR_OUT_OF_BOUNDS");
306 FATAL(
"Sector address out of bounds");
308 TRACE(
"Exiting aaruf_read_sector() = AARUF_ERROR_SECTOR_OUT_OF_BOUNDS");
316 FATAL(
"Negative sector addresses not supported in this image");
320 error_no =
decode_ddt_entry_v1(ctx, sector_address, &offset, &block_offset, §or_status);
323 error_no =
decode_ddt_entry_v2(ctx, sector_address, negative, &offset, &block_offset, §or_status);
327 FATAL(
"Error %d decoding DDT entry", error_no);
329 TRACE(
"Exiting aaruf_read_sector() = %d", error_no);
338 TRACE(
"Exiting aaruf_read_sector() = AARUF_STATUS_SECTOR_NOT_DUMPED");
343 TRACE(
"Checking if block header is cached");
347 if(block_header == NULL)
349 TRACE(
"Allocating memory for block header");
351 if(block_header == NULL)
353 FATAL(
"Not enough memory for block header");
355 TRACE(
"Exiting aaruf_read_sector() = AARUF_ERROR_NOT_ENOUGH_MEMORY");
359 TRACE(
"Reading block header");
360 if(fseek(ctx->
imageStream, block_offset, SEEK_SET) != 0)
362 FATAL(
"Could not seek to block header");
365 TRACE(
"Exiting aaruf_read_sector() = AARUF_ERROR_CANNOT_READ_HEADER");
373 FATAL(
"Error reading block header");
376 TRACE(
"Exiting aaruf_read_sector() = AARUF_ERROR_CANNOT_READ_HEADER");
380 TRACE(
"Adding block header to cache");
385 FATAL(
"Could not seek past cached block header");
387 TRACE(
"Exiting aaruf_read_sector() = AARUF_ERROR_CANNOT_READ_HEADER");
391 if(data == NULL || *length < block_header->sectorSize)
393 TRACE(
"Buffer too small for sector, required %u bytes", block_header->
sectorSize);
396 TRACE(
"Exiting aaruf_read_sector() = AARUF_ERROR_BUFFER_TOO_SMALL");
401 TRACE(
"Checking if block is cached");
406 TRACE(
"Getting data from cache");
410 TRACE(
"Exiting aaruf_read_sector() = AARUF_STATUS_OK");
418 TRACE(
"Allocating memory for block");
419 block = (uint8_t *)malloc(block_header->
length);
422 FATAL(
"Not enough memory for block");
424 TRACE(
"Exiting aaruf_read_sector() = AARUF_ERROR_NOT_ENOUGH_MEMORY");
428 TRACE(
"Reading block into memory");
431 if(read_bytes != block_header->
length)
433 FATAL(
"Could not read block");
436 TRACE(
"Exiting aaruf_read_sector() = AARUF_ERROR_CANNOT_READ_BLOCK");
444 FATAL(
"Invalid LZMA block lengths (cmpLength=%u, length=%u)", block_header->
cmpLength,
447 TRACE(
"Exiting aaruf_read_sector() = AARUF_ERROR_CANNOT_DECOMPRESS_BLOCK");
452 TRACE(
"Allocating memory for compressed data of size %zu bytes", lzma_size);
453 cmp_data = malloc(lzma_size);
457 FATAL(
"Cannot allocate memory for block...");
459 TRACE(
"Exiting aaruf_read_sector() = AARUF_ERROR_NOT_ENOUGH_MEMORY");
463 TRACE(
"Allocating memory for block of size %zu bytes", block_header->
length);
464 block = malloc(block_header->
length);
467 FATAL(
"Cannot allocate memory for block...");
470 TRACE(
"Exiting aaruf_read_sector() = AARUF_ERROR_NOT_ENOUGH_MEMORY");
478 FATAL(
"Could not read LZMA properties...");
482 TRACE(
"Exiting aaruf_read_sector() = AARUF_ERROR_CANNOT_DECOMPRESS_BLOCK");
486 read_bytes = fread(cmp_data, 1, lzma_size, ctx->
imageStream);
487 if(read_bytes != lzma_size)
489 FATAL(
"Could not read compressed block...");
493 TRACE(
"Exiting aaruf_read_sector() = AARUF_ERROR_CANNOT_DECOMPRESS_BLOCK");
497 TRACE(
"Decompressing block of size %zu bytes", block_header->
length);
498 read_bytes = block_header->
length;
504 FATAL(
"Got error %d from LZMA...", error_no);
508 TRACE(
"Exiting aaruf_read_sector() = AARUF_ERROR_CANNOT_DECOMPRESS_BLOCK");
512 if(read_bytes != block_header->
length)
514 FATAL(
"Error decompressing block, should be {0} bytes but got {1} bytes...");
518 TRACE(
"Exiting aaruf_read_sector() = AARUF_ERROR_CANNOT_DECOMPRESS_BLOCK");
526 TRACE(
"Allocating memory for compressed data of size %zu bytes", block_header->
cmpLength);
527 cmp_data = malloc(block_header->
cmpLength);
531 FATAL(
"Cannot allocate memory for block...");
533 TRACE(
"Exiting aaruf_read_sector() = AARUF_ERROR_NOT_ENOUGH_MEMORY");
537 TRACE(
"Allocating memory for block of size %zu bytes", block_header->
length);
538 block = malloc(block_header->
length);
541 FATAL(
"Cannot allocate memory for block...");
544 TRACE(
"Exiting aaruf_read_sector() = AARUF_ERROR_NOT_ENOUGH_MEMORY");
548 TRACE(
"Reading compressed data into memory");
550 if(read_bytes != block_header->
cmpLength)
552 FATAL(
"Could not read compressed block...");
556 TRACE(
"Exiting aaruf_read_sector() = AARUF_ERROR_CANNOT_DECOMPRESS_BLOCK");
560 TRACE(
"Decompressing block of size %zu bytes", block_header->
length);
564 if(read_bytes != block_header->
length)
566 FATAL(
"Error decompressing block, should be {0} bytes but got {1} bytes...");
570 TRACE(
"Exiting aaruf_read_sector() = AARUF_ERROR_CANNOT_DECOMPRESS_BLOCK");
579 TRACE(
"Exiting aaruf_read_sector() = AARUF_ERROR_UNSUPPORTED_COMPRESSION");
584 TRACE(
"Adding block to cache");
590 TRACE(
"Exiting aaruf_read_sector() = AARUF_STATUS_OK");
666 const uint32_t initial_length = length == NULL ? 0U : *length;
668 TRACE(
"Entering aaruf_read_track_sector(%p, %p, %" PRIu64
", %u, %d)", context, data, sector_address,
669 initial_length, track);
673 FATAL(
"Invalid context");
675 TRACE(
"Exiting aaruf_read_track_sector() = AARUF_ERROR_NOT_AARUFORMAT");
683 FATAL(
"Invalid length pointer");
685 TRACE(
"Exiting aaruf_read_track_sector() = AARUF_ERROR_INCORRECT_DATA_SIZE");
692 FATAL(
"Invalid context");
694 TRACE(
"Exiting aaruf_read_track_sector() = AARUF_ERROR_NOT_AARUFORMAT");
700 FATAL(
"Incorrect media type %d, expected OpticalDisc", ctx->imageInfo.XmlMediaType);
702 TRACE(
"Exiting aaruf_read_track_sector() = AARUF_ERROR_INCORRECT_MEDIA_TYPE");
710 TRACE(
"Track %d not found", track);
711 TRACE(
"Exiting aaruf_read_track_sector() = AARUF_ERROR_TRACK_NOT_FOUND");
818 const uint32_t initial_length = length == NULL ? 0U : *length;
820 TRACE(
"Entering aaruf_read_sector_long(%p, %" PRIu64
", %d, %p, %u)", context, sector_address, data,
824 uint32_t bare_length = 0;
825 uint32_t tag_length = 0;
826 uint8_t *bare_data = NULL;
828 int32_t query_status;
831 bool trk_found =
false;
835 FATAL(
"Invalid context");
837 TRACE(
"Exiting aaruf_read_sector_long() = AARUF_ERROR_NOT_AARUFORMAT");
845 FATAL(
"Invalid length pointer");
847 TRACE(
"Exiting aaruf_read_sector_long() = AARUF_ERROR_INCORRECT_DATA_SIZE");
854 FATAL(
"Invalid context");
856 TRACE(
"Exiting aaruf_read_sector_long() = AARUF_ERROR_NOT_AARUFORMAT");
862 FATAL(
"Sector address out of bounds");
864 TRACE(
"Exiting aaruf_read_sector_long() = AARUF_ERROR_SECTOR_OUT_OF_BOUNDS");
870 FATAL(
"Sector address out of bounds");
872 TRACE(
"Exiting aaruf_read_sector_long() = AARUF_ERROR_SECTOR_OUT_OF_BOUNDS");
876 uint64_t corrected_sector_address = sector_address;
900 if(*length < 2064 || data == NULL)
903 FATAL(
"Buffer too small for sector, required %u bytes", *length);
905 TRACE(
"Exiting aaruf_read_sector_long() = AARUF_ERROR_BUFFER_TOO_SMALL");
910 query_status =
aaruf_read_sector(context, sector_address, negative, NULL, &bare_length);
914 TRACE(
"Exiting aaruf_read_sector_long() = %d", query_status);
920 FATAL(
"Invalid bare sector length (0)");
922 TRACE(
"Exiting aaruf_read_sector_long() = AARUF_ERROR_INCORRECT_DATA_SIZE");
926 TRACE(
"Allocating memory for bare data");
927 bare_data = (uint8_t *)malloc(bare_length);
929 if(bare_data == NULL)
931 FATAL(
"Could not allocate memory for bare data");
933 TRACE(
"Exiting aaruf_read_sector_long() = AARUF_ERROR_NOT_ENOUGH_MEMORY");
937 res =
aaruf_read_sector(context, sector_address, negative, bare_data, &bare_length);
944 TRACE(
"Exiting aaruf_read_sector_long() = %d", res);
948 memcpy(data, ctx->
sector_id + corrected_sector_address * 4, 4);
949 memcpy(data + 4, ctx->
sector_ied + corrected_sector_address * 2, 2);
950 memcpy(data + 6, ctx->
sector_cpr_mai + corrected_sector_address * 6, 6);
951 memcpy(data + 12, bare_data, 2048);
952 memcpy(data + 2060, ctx->
sector_edc + corrected_sector_address * 4, 4);
960 if(*length < 2352 || data == NULL)
963 FATAL(
"Buffer too small for sector, required %u bytes", *length);
965 TRACE(
"Exiting aaruf_read_sector_long() = AARUF_ERROR_BUFFER_TOO_SMALL");
975 query_status =
aaruf_read_sector(context, sector_address, negative, NULL, &bare_length);
979 TRACE(
"Exiting aaruf_read_sector_long() = %d", query_status);
985 FATAL(
"Invalid bare sector length (0)");
987 TRACE(
"Exiting aaruf_read_sector_long() = AARUF_ERROR_INCORRECT_DATA_SIZE");
991 TRACE(
"Allocating memory for bare data");
992 bare_data = (uint8_t *)malloc(bare_length);
994 if(bare_data == NULL)
996 FATAL(
"Could not allocate memory for bare data");
998 TRACE(
"Exiting aaruf_read_sector_long() = AARUF_ERROR_NOT_ENOUGH_MEMORY");
1002 res =
aaruf_read_sector(context, sector_address, negative, bare_data, &bare_length);
1008 TRACE(
"Exiting aaruf_read_sector_long() = %d", res);
1015 if(sector_address >= ctx->
data_tracks[i].
start && sector_address <= ctx->data_tracks[i].end)
1024 FATAL(
"Track not found");
1027 TRACE(
"Exiting aaruf_read_sector_long() = AARUF_ERROR_TRACK_NOT_FOUND");
1035 memcpy(data, bare_data, bare_length);
1036 *length = bare_length;
1040 memcpy(data + 16, bare_data, 2048);
1045 const uint32_t prefix_status = prefix_ddt_entry >> 60;
1046 const uint64_t prefix_index = prefix_ddt_entry & 0x0FFFFFFFFFFFFFFF;
1059 memcpy(data, ctx->
sector_prefix + corrected_sector_address * 16, 16);
1077 TRACE(
"Exiting aaruf_read_sector_long() = AARUF_ERROR_REACHED_UNREACHABLE_CODE");
1092 const uint64_t suffix_status = suffix_ddt_entry >> 60;
1093 const uint64_t suffix_index = suffix_ddt_entry & 0x0FFFFFFFFFFFFFFF;
1103 memcpy(data + 2064, ctx->
sector_suffix + suffix_index * 288, 288);
1106 memcpy(data + 2064, ctx->
sector_suffix + corrected_sector_address * 288, 288);
1124 TRACE(
"Exiting aaruf_read_sector_long() = AARUF_ERROR_REACHED_UNREACHABLE_CODE");
1138 const uint64_t prefix_status = prefix_ddt_entry >> 60;
1139 const uint64_t prefix_index = prefix_ddt_entry & 0x0FFFFFFFFFFFFFFF;
1152 memcpy(data, ctx->
sector_prefix + corrected_sector_address * 16, 16);
1170 TRACE(
"Exiting aaruf_read_sector_long() = AARUF_ERROR_REACHED_UNREACHABLE_CODE");
1184 memcpy(data + 16, ctx->
mode2_subheaders + corrected_sector_address * 8, 8);
1186 const uint64_t suffix_status = suffix_ddt_entry >> 60;
1187 const uint64_t suffix_index = suffix_ddt_entry & 0x0FFFFFFFFFFFFFFF;
1191 memcpy(data + 24, bare_data, 2048);
1197 memcpy(data + 24, bare_data, 2324);
1205 memcpy(data + 24, bare_data, 2328);
1209 memcpy(data + 16, ctx->
mode2_subheaders + corrected_sector_address * 8, 8);
1213 memcpy(data + 24, bare_data, 2048);
1219 memcpy(data + 24, bare_data, 2324);
1227 memcpy(data + 24, bare_data, 2328);
1231 memcpy(data + 16, ctx->
mode2_subheaders + corrected_sector_address * 8, 8);
1232 memcpy(data + 24, bare_data, 2328);
1235 memcpy(data + 16, bare_data, 2336);
1241 FATAL(
"Invalid track type %d", trk.
type);
1244 TRACE(
"Exiting aaruf_read_sector_long() = AARUF_ERROR_INVALID_TRACK_FORMAT");
1274 FATAL(
"Unsupported media type %d", ctx->imageInfo.MediaType);
1276 TRACE(
"Exiting aaruf_read_sector_long() = AARUF_ERROR_INCORRECT_MEDIA_TYPE");
1282 if(*length < tag_length + bare_length || data == NULL)
1284 *length = tag_length + bare_length;
1285 FATAL(
"Buffer too small for sector, required %u bytes", *length);
1287 TRACE(
"Exiting aaruf_read_sector_long() = AARUF_ERROR_BUFFER_TOO_SMALL");
1291 TRACE(
"Allocating memory for bare data of size %u bytes", bare_length);
1292 bare_data = malloc(bare_length);
1294 if(bare_data == NULL)
1296 FATAL(
"Could not allocate memory for bare data");
1298 TRACE(
"Exiting aaruf_read_sector_long() = AARUF_ERROR_NOT_ENOUGH_MEMORY");
1302 res =
aaruf_read_sector(context, sector_address, negative, bare_data, &bare_length);
1308 TRACE(
"Exiting aaruf_read_sector_long() = %d", res);
1312 if(bare_length != 512)
1314 FATAL(
"Bare data length is %u, expected 512", bare_length);
1317 TRACE(
"Exiting aaruf_read_sector_long() = AARUF_ERROR_INCORRECT_DATA_SIZE");
1321 memcpy(data + bare_length, ctx->
sector_subchannel + corrected_sector_address * tag_length,
1323 memcpy(data, bare_data, bare_length);
1324 *length = tag_length + bare_length;
1328 TRACE(
"Exiting aaruf_read_sector_long() = AARUF_STATUS_OK");
1331 FATAL(
"Incorrect media type %d for long sector reading", ctx->imageInfo.MediaType);
1333 TRACE(
"Exiting aaruf_read_sector_long() = AARUF_ERROR_INCORRECT_MEDIA_TYPE");
1337 FATAL(
"Incorrect media type %d for long sector reading", ctx->imageInfo.MediaType);
1339 TRACE(
"Exiting aaruf_read_sector_long() = AARUF_ERROR_INCORRECT_MEDIA_TYPE");
1464 uint32_t *length,
const int32_t tag)
1466 const uint32_t initial_length = length == NULL ? 0U : *length;
1468 TRACE(
"Entering aaruf_read_sector_tag(%p, %" PRIu64
", %d, %p, %u, %d)", context, sector_address, negative, buffer,
1469 initial_length, tag);
1475 FATAL(
"Invalid context");
1477 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_NOT_AARUFORMAT");
1485 FATAL(
"Invalid length pointer");
1487 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_INCORRECT_DATA_SIZE");
1494 FATAL(
"Invalid context");
1496 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_NOT_AARUFORMAT");
1502 FATAL(
"Sector address out of bounds");
1504 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_SECTOR_OUT_OF_BOUNDS");
1510 FATAL(
"Sector address out of bounds");
1512 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_SECTOR_OUT_OF_BOUNDS");
1516 uint64_t corrected_sector_address = sector_address;
1529 FATAL(
"Invalid media type for tag");
1530 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_INCORRECT_MEDIA_TYPE");
1534 if(*length != 1 || buffer == NULL)
1537 FATAL(
"Incorrect tag size");
1538 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_INCORRECT_DATA_SIZE");
1543 if(sector_address >= ctx->
track_entries[i].
start && sector_address <= ctx->track_entries[i].end)
1546 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_STATUS_OK");
1550 FATAL(
"Track not found");
1555 FATAL(
"Invalid media type for tag");
1556 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_INCORRECT_MEDIA_TYPE");
1560 if(*length != 12 || buffer == NULL)
1563 FATAL(
"Incorrect tag size");
1564 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_INCORRECT_DATA_SIZE");
1569 if(sector_address >= ctx->
track_entries[i].
start && sector_address <= ctx->track_entries[i].end)
1572 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_STATUS_OK");
1576 FATAL(
"Track not found");
1581 FATAL(
"Invalid media type for tag");
1582 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_INCORRECT_MEDIA_TYPE");
1586 if(*length != 96 || buffer == NULL)
1589 FATAL(
"Incorrect tag size");
1590 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_INCORRECT_DATA_SIZE");
1596 FATAL(
"Sector tag not found");
1597 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_SECTOR_TAG_NOT_PRESENT");
1602 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_STATUS_OK");
1607 FATAL(
"Invalid media type for tag");
1608 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_INCORRECT_MEDIA_TYPE");
1612 if(*length != 1 || buffer == NULL)
1615 FATAL(
"Incorrect tag size");
1616 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_INCORRECT_DATA_SIZE");
1622 FATAL(
"Sector tag not found");
1623 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_SECTOR_TAG_NOT_PRESENT");
1627 memcpy(buffer, ctx->
sector_cpr_mai + corrected_sector_address * 6, 1);
1628 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_STATUS_OK");
1633 FATAL(
"Invalid media type for tag");
1634 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_INCORRECT_MEDIA_TYPE");
1638 if(*length != 1 || buffer == NULL)
1641 FATAL(
"Incorrect tag size");
1642 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_INCORRECT_DATA_SIZE");
1648 FATAL(
"Sector tag not found");
1649 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_SECTOR_TAG_NOT_PRESENT");
1653 memcpy(buffer, ctx->
sector_id + corrected_sector_address * 4, 1);
1654 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_STATUS_OK");
1659 FATAL(
"Invalid media type for tag");
1660 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_INCORRECT_MEDIA_TYPE");
1664 if(*length != 3 || buffer == NULL)
1667 FATAL(
"Incorrect tag size");
1668 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_INCORRECT_DATA_SIZE");
1674 FATAL(
"Sector tag not found");
1675 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_SECTOR_TAG_NOT_PRESENT");
1679 memcpy(buffer, ctx->
sector_id + corrected_sector_address * 4 + 1, 3);
1680 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_STATUS_OK");
1685 FATAL(
"Invalid media type for tag");
1686 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_INCORRECT_MEDIA_TYPE");
1690 if(*length != 2 || buffer == NULL)
1693 FATAL(
"Incorrect tag size");
1694 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_INCORRECT_DATA_SIZE");
1700 FATAL(
"Sector tag not found");
1701 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_SECTOR_TAG_NOT_PRESENT");
1705 memcpy(buffer, ctx->
sector_ied + corrected_sector_address * 2, 2);
1706 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_STATUS_OK");
1711 FATAL(
"Invalid media type for tag");
1712 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_INCORRECT_MEDIA_TYPE");
1716 if(*length != 4 || buffer == NULL)
1719 FATAL(
"Incorrect tag size");
1720 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_INCORRECT_DATA_SIZE");
1726 FATAL(
"Sector tag not found");
1727 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_SECTOR_TAG_NOT_PRESENT");
1731 memcpy(buffer, ctx->
sector_edc + corrected_sector_address * 4, 4);
1732 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_STATUS_OK");
1737 FATAL(
"Invalid media type for tag");
1738 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_INCORRECT_MEDIA_TYPE");
1742 if(*length != 5 || buffer == NULL)
1745 FATAL(
"Incorrect tag size");
1746 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_INCORRECT_DATA_SIZE");
1752 FATAL(
"Sector tag not found");
1753 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_SECTOR_TAG_NOT_PRESENT");
1758 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_STATUS_OK");
1763 FATAL(
"Invalid media type for tag");
1764 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_INCORRECT_MEDIA_TYPE");
1768 if(*length != 12 || buffer == NULL)
1771 FATAL(
"Incorrect tag size");
1772 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_INCORRECT_DATA_SIZE");
1778 FATAL(
"Sector tag not found");
1779 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_SECTOR_TAG_NOT_PRESENT");
1784 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_STATUS_OK");
1789 FATAL(
"Invalid media type for tag");
1790 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_INCORRECT_MEDIA_TYPE");
1794 if(*length != 20 || buffer == NULL)
1797 FATAL(
"Incorrect tag size");
1798 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_INCORRECT_DATA_SIZE");
1804 FATAL(
"Sector tag not found");
1805 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_SECTOR_TAG_NOT_PRESENT");
1810 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_STATUS_OK");
1815 FATAL(
"Invalid media type for tag");
1816 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_INCORRECT_MEDIA_TYPE");
1820 if(*length != 24 || buffer == NULL)
1823 FATAL(
"Incorrect tag size");
1824 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_INCORRECT_DATA_SIZE");
1830 FATAL(
"Sector tag not found");
1831 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_SECTOR_TAG_NOT_PRESENT");
1836 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_STATUS_OK");
1839 TRACE(
"Do not know how to read sector tag %d", tag);
#define CD_DFIX_MASK
Mask for extracting positional index (lower 24 bits) in Compact Disc suffix/prefix deduplicated block...
#define LZMA_PROPERTIES_LENGTH
Size in bytes of the fixed LZMA properties header (lc/lp/pb + dictionary size).
#define AARU_MAGIC
Magic identifier for AaruFormat container (ASCII "AARUFRMT").
#define CD_XFIX_MASK
Mask for extracting correction / fix flags in Compact Disc suffix/prefix DDT entries.
int32_t aaruf_lzma_decode_buffer(uint8_t *dst_buffer, size_t *dst_size, const uint8_t *src_buffer, size_t *src_size, const uint8_t *props, size_t props_size)
Decodes an LZMA-compressed buffer.
void aaruf_ecc_cd_reconstruct_prefix(uint8_t *sector, uint8_t type, int64_t lba)
Reconstructs the prefix (sync, address, mode) of a CD sector.
void aaruf_ecc_cd_reconstruct(void *context, uint8_t *sector, uint8_t type)
Reconstructs the EDC and ECC fields of a CD sector.
size_t aaruf_flac_decode_redbook_buffer(uint8_t *dst_buffer, size_t dst_size, const uint8_t *src_buffer, size_t src_size)
Decodes a FLAC-compressed Red Book audio buffer.
@ SectorStatusNotDumped
Sector(s) not yet acquired during image dumping.
@ SectorStatusMode2Form2NoCrc
Suffix matches MODE 2 Form 2 but CRC empty/missing.
@ SectorStatusMode1Correct
Valid MODE 1 data with regenerable suffix/prefix.
@ SectorStatusMode2Form2Ok
Suffix matches MODE 2 Form 2 with valid CRC.
@ SectorStatusMode2Form1Ok
Suffix verified/regenerable for MODE 2 Form 1.
@ Correct
Sector(s) contain valid MODE 1 data with regenerable suffix/prefix.
@ Mode2Form2Ok
Sector suffix valid for MODE 2 Form 2 with correct CRC.
@ Mode2Form1Ok
Sector suffix valid for MODE 2 Form 1; regenerable.
@ NotDumped
Sector(s) have not yet been dumped.
@ Mode2Form2NoCrc
Sector suffix valid for MODE 2 Form 2 but CRC absent/empty.
@ OpticalDisc
Purely optical discs.
@ BlockMedia
Media that is physically block-based or abstracted like that.
@ CdMode1
Compact Disc Mode 1 data track.
@ Data
Generic data track (not further specified).
@ CdMode2Form2
Compact Disc Mode 2 Form 2 data track.
@ CdMode2Form1
Compact Disc Mode 2 Form 1 data track.
@ CdMode2Formless
Compact Disc Mode 2 (formless) data track.
@ CdSectorSubchannel
Compact Disc subchannel data.
@ AppleProfileTag
Apple Profile (20‑byte) tag.
@ DvdSectorIed
DVD ID Error Detection Code (IED)
@ AppleSonyTag
Apple Sony (12‑byte) tag.
@ PriamDataTowerTag
Priam Data Tower (24‑byte) tag.
@ DvdSectorEdc
DVD Error Detection Code (EDC)
#define AARUF_STATUS_OK
Sector present and read without uncorrectable errors.
#define AARUF_ERROR_INCORRECT_MEDIA_TYPE
Operation incompatible with image media type.
#define AARUF_ERROR_TRACK_NOT_FOUND
Referenced track number not present.
#define AARUF_ERROR_CANNOT_READ_HEADER
Failed to read container header.
#define AARUF_ERROR_NOT_ENOUGH_MEMORY
Memory allocation failure (critical).
#define AARUF_ERROR_SECTOR_OUT_OF_BOUNDS
Requested logical sector outside media bounds.
#define AARUF_ERROR_INVALID_TRACK_FORMAT
Track metadata internally inconsistent or malformed.
#define AARUF_ERROR_CANNOT_READ_BLOCK
Generic block read failure (seek/read error).
#define AARUF_ERROR_INCORRECT_DATA_SIZE
Data size does not match expected size.
#define AARUF_ERROR_SECTOR_TAG_NOT_PRESENT
Requested sector tag (e.g. subchannel/prefix) not stored.
#define AARUF_STATUS_SECTOR_NOT_DUMPED
Sector not captured (gap / missing / intentionally skipped).
#define AARUF_ERROR_NOT_AARUFORMAT
Input file/stream failed magic or structural validation.
#define AARUF_ERROR_CANNOT_DECOMPRESS_BLOCK
Decompression routine failed or size mismatch.
#define AARUF_ERROR_INVALID_TAG
Invalid or unsupported media or sector tag format.
#define AARUF_ERROR_MEDIA_TAG_NOT_PRESENT
Requested media tag absent.
#define AARUF_ERROR_BUFFER_TOO_SMALL
Caller-supplied buffer insufficient for data.
#define AARUF_ERROR_UNSUPPORTED_COMPRESSION
Block marked with unsupported compression algorithm.
#define AARUF_ERROR_REACHED_UNREACHABLE_CODE
Internal logic assertion hit unexpected path.
int32_t decode_ddt_entry_v1(aaruformat_context *ctx, uint64_t sector_address, uint64_t *offset, uint64_t *block_offset, uint8_t *sector_status)
Decodes a DDT v1 entry for a given sector address.
int32_t decode_ddt_entry_v2(aaruformat_context *ctx, uint64_t sector_address, bool negative, uint64_t *offset, uint64_t *block_offset, uint8_t *sector_status)
Decodes a DDT v2 entry for a given sector address.
void add_to_cache_uint64(struct CacheHeader *cache, uint64_t key, void *value)
Adds a value to the cache with a uint64_t key, using string conversion.
void * find_in_cache_uint64(struct CacheHeader *cache, uint64_t key)
Finds a value in the cache by uint64_t key, using string conversion.
int32_t aaruf_read_media_tag(void *context, uint8_t *data, const int32_t tag, uint32_t *length)
Reads a media tag from the AaruFormat image.
int32_t aaruf_read_sector_tag(const void *context, const uint64_t sector_address, const bool negative, uint8_t *buffer, uint32_t *length, const int32_t tag)
Reads a specific sector tag from the AaruFormat image.
int32_t aaruf_read_track_sector(void *context, uint8_t *data, const uint64_t sector_address, uint32_t *length, const uint8_t track)
Reads a sector from a specific track in the AaruFormat image.
int32_t aaruf_read_sector(void *context, const uint64_t sector_address, bool negative, uint8_t *data, uint32_t *length)
Reads a sector from the AaruFormat image.
int32_t aaruf_read_sector_long(void *context, const uint64_t sector_address, bool negative, uint8_t *data, uint32_t *length)
Reads a complete sector with all metadata from the AaruFormat image.
uint32_t MediaType
Media type identifier (see MediaType enum; 0=Unknown)
uint8_t MetadataMediaType
Media type for sidecar generation (internal archival use)
uint32_t SectorSize
Size of each logical sector in bytes (512, 2048, 2352, 4096, etc.)
uint64_t Sectors
Total count of addressable logical sectors/blocks.
Single optical disc track descriptor (sequence, type, LBAs, session, ISRC, flags).
uint8_t flags
Control / attribute bitfield (see file documentation for suggested bit mapping).
uint8_t sequence
Track number (1..99 typical for CD audio/data). 0 may indicate placeholder/non-standard.
int64_t start
Inclusive starting LBA of the track.
uint8_t type
Track type (value from TrackType).
uint8_t isrc[13]
ISRC raw 13-byte code (no null terminator). All zeros if not present.
Master context representing an open or in‑creation Aaru image.
DdtHeader2 user_data_ddt_header
Active user data DDT v2 header (primary table meta).
uint8_t * sector_cpr_mai
DVD sector CPR_MAI (6 bytes) if present.
uint8_t * sector_prefix_corrected
Corrected variant (post error correction) if stored.
TrackEntry * data_tracks
Filtered list of data tracks (subset of trackEntries).
struct CacheHeader block_header_cache
LRU/Cache header for block headers.
uint8_t * sector_ied
DVD sector IED (2 bytes) if present.
uint8_t * sector_prefix
Raw per-sector prefix (e.g., sync+header) uncorrected.
uint64_t * sector_suffix_ddt2
CD sector suffix DDT V2.
uint8_t * sector_edc
DVD sector EDC (4 bytes) if present.
CdEccContext * ecc_cd_context
CD ECC/EDC helper tables (allocated on demand).
struct CacheHeader block_cache
LRU/Cache header for block payloads.
uint32_t * sector_suffix_ddt
Legacy CD sector suffix DDT.
uint8_t * sector_suffix
Raw per-sector suffix (EDC/ECC) uncorrected.
int ddt_version
DDT version in use (1=legacy, 2=v2 hierarchical).
uint64_t magic
File magic (AARU_MAGIC) post-open.
uint64_t * sector_prefix_ddt2
CD sector prefix DDT V2.
mediaTagEntry * mediaTags
Hash table of extra media tags (uthash root).
uint8_t * sector_decrypted_title_key
DVD decrypted title key (5 bytes) if present.
uint8_t * sector_subchannel
Raw 96-byte subchannel (if captured).
FILE * imageStream
Underlying FILE* stream (binary mode).
uint8_t * mode2_subheaders
MODE2 Form1/Form2 8-byte subheaders (concatenated).
ImageInfo image_info
Exposed high-level image info summary.
uint8_t * sector_id
DVD sector ID (4 bytes) if present.
uint32_t * sector_prefix_ddt
Legacy CD sector prefix DDT (deprecated by *2).
TrackEntry * track_entries
Full track list (tracksHeader.entries elements).
uint8_t number_of_data_tracks
Count of tracks considered "data" (sequence 1..99 heuristics).
uint8_t * sector_suffix_corrected
Corrected suffix if stored separately.
TracksHeader tracks_header
Tracks header (optical) if present.
Hash table entry for an arbitrary media tag (e.g., proprietary drive/medium descriptor).
uint8_t * data
Tag data blob (opaque to library core); length bytes long.
uint32_t length
Length in bytes of data.