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");
254 uint8_t *data, uint32_t *length, uint8_t *sector_status)
256 const uint32_t initial_length = length == NULL ? 0U : *length;
258 TRACE(
"Entering aaruf_read_sector(%p, %" PRIu64
", %d, %p, %u)", context, sector_address, negative, data,
263 uint64_t block_offset = 0;
265 uint8_t *block = NULL;
266 size_t read_bytes = 0;
268 size_t lzma_size = 0;
269 uint8_t *cmp_data = NULL;
275 FATAL(
"Invalid context");
277 TRACE(
"Exiting aaruf_read_sector() = AARUF_ERROR_NOT_AARUFORMAT");
285 FATAL(
"Invalid length pointer");
287 TRACE(
"Exiting aaruf_read_sector() = AARUF_ERROR_INCORRECT_DATA_SIZE");
294 FATAL(
"Invalid context");
296 TRACE(
"Exiting aaruf_read_sector() = AARUF_ERROR_NOT_AARUFORMAT");
302 FATAL(
"Sector address out of bounds");
304 TRACE(
"Exiting aaruf_read_sector() = AARUF_ERROR_SECTOR_OUT_OF_BOUNDS");
310 FATAL(
"Sector address out of bounds");
312 TRACE(
"Exiting aaruf_read_sector() = AARUF_ERROR_SECTOR_OUT_OF_BOUNDS");
320 FATAL(
"Negative sector addresses not supported in this image");
324 error_no =
decode_ddt_entry_v1(ctx, sector_address, &offset, &block_offset, sector_status);
327 error_no =
decode_ddt_entry_v2(ctx, sector_address, negative, &offset, &block_offset, sector_status);
331 FATAL(
"Error %d decoding DDT entry", error_no);
333 TRACE(
"Exiting aaruf_read_sector() = %d", error_no);
342 TRACE(
"Exiting aaruf_read_sector() = AARUF_STATUS_SECTOR_NOT_DUMPED");
347 TRACE(
"Checking if block header is cached");
351 if(block_header == NULL)
353 TRACE(
"Allocating memory for block header");
355 if(block_header == NULL)
357 FATAL(
"Not enough memory for block header");
359 TRACE(
"Exiting aaruf_read_sector() = AARUF_ERROR_NOT_ENOUGH_MEMORY");
363 TRACE(
"Reading block header");
364 if(fseek(ctx->
imageStream, block_offset, SEEK_SET) != 0)
366 FATAL(
"Could not seek to block header");
369 TRACE(
"Exiting aaruf_read_sector() = AARUF_ERROR_CANNOT_READ_HEADER");
377 FATAL(
"Error reading block header");
380 TRACE(
"Exiting aaruf_read_sector() = AARUF_ERROR_CANNOT_READ_HEADER");
384 TRACE(
"Adding block header to cache");
389 FATAL(
"Could not seek past cached block header");
391 TRACE(
"Exiting aaruf_read_sector() = AARUF_ERROR_CANNOT_READ_HEADER");
395 if(data == NULL || *length < block_header->sectorSize)
397 TRACE(
"Buffer too small for sector, required %u bytes", block_header->
sectorSize);
400 TRACE(
"Exiting aaruf_read_sector() = AARUF_ERROR_BUFFER_TOO_SMALL");
405 TRACE(
"Checking if block is cached");
410 TRACE(
"Getting data from cache");
414 TRACE(
"Exiting aaruf_read_sector() = AARUF_STATUS_OK");
422 TRACE(
"Allocating memory for block");
423 block = (uint8_t *)malloc(block_header->
length);
426 FATAL(
"Not enough memory for block");
428 TRACE(
"Exiting aaruf_read_sector() = AARUF_ERROR_NOT_ENOUGH_MEMORY");
432 TRACE(
"Reading block into memory");
435 if(read_bytes != block_header->
length)
437 FATAL(
"Could not read block");
440 TRACE(
"Exiting aaruf_read_sector() = AARUF_ERROR_CANNOT_READ_BLOCK");
448 FATAL(
"Invalid LZMA block lengths (cmpLength=%u, length=%u)", block_header->
cmpLength,
451 TRACE(
"Exiting aaruf_read_sector() = AARUF_ERROR_CANNOT_DECOMPRESS_BLOCK");
456 TRACE(
"Allocating memory for compressed data of size %zu bytes", lzma_size);
457 cmp_data = malloc(lzma_size);
461 FATAL(
"Cannot allocate memory for block...");
463 TRACE(
"Exiting aaruf_read_sector() = AARUF_ERROR_NOT_ENOUGH_MEMORY");
467 TRACE(
"Allocating memory for block of size %zu bytes", block_header->
length);
468 block = malloc(block_header->
length);
471 FATAL(
"Cannot allocate memory for block...");
474 TRACE(
"Exiting aaruf_read_sector() = AARUF_ERROR_NOT_ENOUGH_MEMORY");
482 FATAL(
"Could not read LZMA properties...");
486 TRACE(
"Exiting aaruf_read_sector() = AARUF_ERROR_CANNOT_DECOMPRESS_BLOCK");
490 read_bytes = fread(cmp_data, 1, lzma_size, ctx->
imageStream);
491 if(read_bytes != lzma_size)
493 FATAL(
"Could not read compressed block...");
497 TRACE(
"Exiting aaruf_read_sector() = AARUF_ERROR_CANNOT_DECOMPRESS_BLOCK");
501 TRACE(
"Decompressing block of size %zu bytes", block_header->
length);
502 read_bytes = block_header->
length;
508 FATAL(
"Got error %d from LZMA...", error_no);
512 TRACE(
"Exiting aaruf_read_sector() = AARUF_ERROR_CANNOT_DECOMPRESS_BLOCK");
516 if(read_bytes != block_header->
length)
518 FATAL(
"Error decompressing block, should be {0} bytes but got {1} bytes...");
522 TRACE(
"Exiting aaruf_read_sector() = AARUF_ERROR_CANNOT_DECOMPRESS_BLOCK");
530 TRACE(
"Allocating memory for compressed data of size %zu bytes", block_header->
cmpLength);
531 cmp_data = malloc(block_header->
cmpLength);
535 FATAL(
"Cannot allocate memory for block...");
537 TRACE(
"Exiting aaruf_read_sector() = AARUF_ERROR_NOT_ENOUGH_MEMORY");
541 TRACE(
"Allocating memory for block of size %zu bytes", block_header->
length);
542 block = malloc(block_header->
length);
545 FATAL(
"Cannot allocate memory for block...");
548 TRACE(
"Exiting aaruf_read_sector() = AARUF_ERROR_NOT_ENOUGH_MEMORY");
552 TRACE(
"Reading compressed data into memory");
554 if(read_bytes != block_header->
cmpLength)
556 FATAL(
"Could not read compressed block...");
560 TRACE(
"Exiting aaruf_read_sector() = AARUF_ERROR_CANNOT_DECOMPRESS_BLOCK");
564 TRACE(
"Decompressing block of size %zu bytes", block_header->
length);
568 if(read_bytes != block_header->
length)
570 FATAL(
"Error decompressing block, should be {0} bytes but got {1} bytes...");
574 TRACE(
"Exiting aaruf_read_sector() = AARUF_ERROR_CANNOT_DECOMPRESS_BLOCK");
583 TRACE(
"Exiting aaruf_read_sector() = AARUF_ERROR_UNSUPPORTED_COMPRESSION");
588 TRACE(
"Adding block to cache");
594 TRACE(
"Exiting aaruf_read_sector() = AARUF_STATUS_OK");
671 uint32_t *length,
const uint8_t track, uint8_t *sector_status)
673 const uint32_t initial_length = length == NULL ? 0U : *length;
675 TRACE(
"Entering aaruf_read_track_sector(%p, %p, %" PRIu64
", %u, %d)", context, data, sector_address,
676 initial_length, track);
680 FATAL(
"Invalid context");
682 TRACE(
"Exiting aaruf_read_track_sector() = AARUF_ERROR_NOT_AARUFORMAT");
690 FATAL(
"Invalid length pointer");
692 TRACE(
"Exiting aaruf_read_track_sector() = AARUF_ERROR_INCORRECT_DATA_SIZE");
699 FATAL(
"Invalid context");
701 TRACE(
"Exiting aaruf_read_track_sector() = AARUF_ERROR_NOT_AARUFORMAT");
707 FATAL(
"Incorrect media type %d, expected OpticalDisc", ctx->imageInfo.XmlMediaType);
709 TRACE(
"Exiting aaruf_read_track_sector() = AARUF_ERROR_INCORRECT_MEDIA_TYPE");
718 TRACE(
"Track %d not found", track);
719 TRACE(
"Exiting aaruf_read_track_sector() = AARUF_ERROR_TRACK_NOT_FOUND");
827 uint8_t *data, uint32_t *length, uint8_t *sector_status)
829 const uint32_t initial_length = length == NULL ? 0U : *length;
831 TRACE(
"Entering aaruf_read_sector_long(%p, %" PRIu64
", %d, %p, %u)", context, sector_address, data,
835 uint32_t bare_length = 0;
836 uint32_t tag_length = 0;
837 uint8_t *bare_data = NULL;
839 int32_t query_status;
842 bool trk_found =
false;
846 FATAL(
"Invalid context");
848 TRACE(
"Exiting aaruf_read_sector_long() = AARUF_ERROR_NOT_AARUFORMAT");
856 FATAL(
"Invalid length pointer");
858 TRACE(
"Exiting aaruf_read_sector_long() = AARUF_ERROR_INCORRECT_DATA_SIZE");
865 FATAL(
"Invalid context");
867 TRACE(
"Exiting aaruf_read_sector_long() = AARUF_ERROR_NOT_AARUFORMAT");
873 FATAL(
"Sector address out of bounds");
875 TRACE(
"Exiting aaruf_read_sector_long() = AARUF_ERROR_SECTOR_OUT_OF_BOUNDS");
881 FATAL(
"Sector address out of bounds");
883 TRACE(
"Exiting aaruf_read_sector_long() = AARUF_ERROR_SECTOR_OUT_OF_BOUNDS");
887 uint64_t corrected_sector_address = sector_address;
909 return aaruf_read_sector(context, sector_address, negative, data, length, sector_status);
911 if(*length < 2064 || data == NULL)
914 FATAL(
"Buffer too small for sector, required %u bytes", *length);
916 TRACE(
"Exiting aaruf_read_sector_long() = AARUF_ERROR_BUFFER_TOO_SMALL");
921 query_status =
aaruf_read_sector(context, sector_address, negative, NULL, &bare_length, sector_status);
925 TRACE(
"Exiting aaruf_read_sector_long() = %d", query_status);
931 FATAL(
"Invalid bare sector length (0)");
933 TRACE(
"Exiting aaruf_read_sector_long() = AARUF_ERROR_INCORRECT_DATA_SIZE");
937 TRACE(
"Allocating memory for bare data");
938 bare_data = (uint8_t *)malloc(bare_length);
940 if(bare_data == NULL)
942 FATAL(
"Could not allocate memory for bare data");
944 TRACE(
"Exiting aaruf_read_sector_long() = AARUF_ERROR_NOT_ENOUGH_MEMORY");
948 res =
aaruf_read_sector(context, sector_address, negative, bare_data, &bare_length, sector_status);
955 TRACE(
"Exiting aaruf_read_sector_long() = %d", res);
959 memcpy(data, ctx->
sector_id + corrected_sector_address * 4, 4);
960 memcpy(data + 4, ctx->
sector_ied + corrected_sector_address * 2, 2);
961 memcpy(data + 6, ctx->
sector_cpr_mai + corrected_sector_address * 6, 6);
962 memcpy(data + 12, bare_data, 2048);
963 memcpy(data + 2060, ctx->
sector_edc + corrected_sector_address * 4, 4);
971 if(*length < 2352 || data == NULL)
974 FATAL(
"Buffer too small for sector, required %u bytes", *length);
976 TRACE(
"Exiting aaruf_read_sector_long() = AARUF_ERROR_BUFFER_TOO_SMALL");
983 return aaruf_read_sector(context, sector_address, negative, data, length, sector_status);
986 query_status =
aaruf_read_sector(context, sector_address, negative, NULL, &bare_length, sector_status);
990 TRACE(
"Exiting aaruf_read_sector_long() = %d", query_status);
996 FATAL(
"Invalid bare sector length (0)");
998 TRACE(
"Exiting aaruf_read_sector_long() = AARUF_ERROR_INCORRECT_DATA_SIZE");
1002 TRACE(
"Allocating memory for bare data");
1003 bare_data = (uint8_t *)malloc(bare_length);
1005 if(bare_data == NULL)
1007 FATAL(
"Could not allocate memory for bare data");
1009 TRACE(
"Exiting aaruf_read_sector_long() = AARUF_ERROR_NOT_ENOUGH_MEMORY");
1013 res =
aaruf_read_sector(context, sector_address, negative, bare_data, &bare_length, sector_status);
1019 TRACE(
"Exiting aaruf_read_sector_long() = %d", res);
1026 if(sector_address >= ctx->
data_tracks[i].
start && sector_address <= ctx->data_tracks[i].end)
1035 FATAL(
"Track not found");
1038 TRACE(
"Exiting aaruf_read_sector_long() = AARUF_ERROR_TRACK_NOT_FOUND");
1046 memcpy(data, bare_data, bare_length);
1047 *length = bare_length;
1051 memcpy(data + 16, bare_data, 2048);
1056 const uint32_t prefix_status = prefix_ddt_entry >> 60;
1057 const uint64_t prefix_index = prefix_ddt_entry & 0x0FFFFFFFFFFFFFFF;
1070 memcpy(data, ctx->
sector_prefix + corrected_sector_address * 16, 16);
1088 TRACE(
"Exiting aaruf_read_sector_long() = AARUF_ERROR_REACHED_UNREACHABLE_CODE");
1103 const uint64_t suffix_status = suffix_ddt_entry >> 60;
1104 const uint64_t suffix_index = suffix_ddt_entry & 0x0FFFFFFFFFFFFFFF;
1114 memcpy(data + 2064, ctx->
sector_suffix + suffix_index * 288, 288);
1117 memcpy(data + 2064, ctx->
sector_suffix + corrected_sector_address * 288, 288);
1135 TRACE(
"Exiting aaruf_read_sector_long() = AARUF_ERROR_REACHED_UNREACHABLE_CODE");
1149 const uint64_t prefix_status = prefix_ddt_entry >> 60;
1150 const uint64_t prefix_index = prefix_ddt_entry & 0x0FFFFFFFFFFFFFFF;
1163 memcpy(data, ctx->
sector_prefix + corrected_sector_address * 16, 16);
1181 TRACE(
"Exiting aaruf_read_sector_long() = AARUF_ERROR_REACHED_UNREACHABLE_CODE");
1195 memcpy(data + 16, ctx->
mode2_subheaders + corrected_sector_address * 8, 8);
1197 const uint64_t suffix_status = suffix_ddt_entry >> 60;
1198 const uint64_t suffix_index = suffix_ddt_entry & 0x0FFFFFFFFFFFFFFF;
1202 memcpy(data + 24, bare_data, 2048);
1208 memcpy(data + 24, bare_data, 2324);
1216 memcpy(data + 24, bare_data, 2328);
1220 memcpy(data + 16, ctx->
mode2_subheaders + corrected_sector_address * 8, 8);
1224 memcpy(data + 24, bare_data, 2048);
1230 memcpy(data + 24, bare_data, 2324);
1238 memcpy(data + 24, bare_data, 2328);
1242 memcpy(data + 16, ctx->
mode2_subheaders + corrected_sector_address * 8, 8);
1243 memcpy(data + 24, bare_data, 2328);
1246 memcpy(data + 16, bare_data, 2336);
1252 FATAL(
"Invalid track type %d", trk.
type);
1255 TRACE(
"Exiting aaruf_read_sector_long() = AARUF_ERROR_INVALID_TRACK_FORMAT");
1268 return aaruf_read_sector(context, sector_address, negative, data, length, sector_status);
1285 FATAL(
"Unsupported media type %d", ctx->imageInfo.MediaType);
1287 TRACE(
"Exiting aaruf_read_sector_long() = AARUF_ERROR_INCORRECT_MEDIA_TYPE");
1293 if(*length < tag_length + bare_length || data == NULL)
1295 *length = tag_length + bare_length;
1296 FATAL(
"Buffer too small for sector, required %u bytes", *length);
1298 TRACE(
"Exiting aaruf_read_sector_long() = AARUF_ERROR_BUFFER_TOO_SMALL");
1302 TRACE(
"Allocating memory for bare data of size %u bytes", bare_length);
1303 bare_data = malloc(bare_length);
1305 if(bare_data == NULL)
1307 FATAL(
"Could not allocate memory for bare data");
1309 TRACE(
"Exiting aaruf_read_sector_long() = AARUF_ERROR_NOT_ENOUGH_MEMORY");
1313 res =
aaruf_read_sector(context, sector_address, negative, bare_data, &bare_length, sector_status);
1319 TRACE(
"Exiting aaruf_read_sector_long() = %d", res);
1323 if(bare_length != 512)
1325 FATAL(
"Bare data length is %u, expected 512", bare_length);
1328 TRACE(
"Exiting aaruf_read_sector_long() = AARUF_ERROR_INCORRECT_DATA_SIZE");
1332 memcpy(data + bare_length, ctx->
sector_subchannel + corrected_sector_address * tag_length,
1334 memcpy(data, bare_data, bare_length);
1335 *length = tag_length + bare_length;
1339 TRACE(
"Exiting aaruf_read_sector_long() = AARUF_STATUS_OK");
1342 FATAL(
"Incorrect media type %d for long sector reading", ctx->imageInfo.MediaType);
1344 TRACE(
"Exiting aaruf_read_sector_long() = AARUF_ERROR_INCORRECT_MEDIA_TYPE");
1348 FATAL(
"Incorrect media type %d for long sector reading", ctx->imageInfo.MediaType);
1350 TRACE(
"Exiting aaruf_read_sector_long() = AARUF_ERROR_INCORRECT_MEDIA_TYPE");
1475 const bool negative, uint8_t *buffer, uint32_t *length,
1478 const uint32_t initial_length = length == NULL ? 0U : *length;
1480 TRACE(
"Entering aaruf_read_sector_tag(%p, %" PRIu64
", %d, %p, %u, %d)", context, sector_address, negative, buffer,
1481 initial_length, tag);
1487 FATAL(
"Invalid context");
1489 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_NOT_AARUFORMAT");
1497 FATAL(
"Invalid length pointer");
1499 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_INCORRECT_DATA_SIZE");
1506 FATAL(
"Invalid context");
1508 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_NOT_AARUFORMAT");
1514 FATAL(
"Sector address out of bounds");
1516 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_SECTOR_OUT_OF_BOUNDS");
1522 FATAL(
"Sector address out of bounds");
1524 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_SECTOR_OUT_OF_BOUNDS");
1528 uint64_t corrected_sector_address = sector_address;
1541 FATAL(
"Invalid media type for tag");
1542 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_INCORRECT_MEDIA_TYPE");
1546 if(*length != 1 || buffer == NULL)
1549 FATAL(
"Incorrect tag size");
1550 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_INCORRECT_DATA_SIZE");
1555 if(sector_address >= ctx->
track_entries[i].
start && sector_address <= ctx->track_entries[i].end)
1558 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_STATUS_OK");
1562 FATAL(
"Track not found");
1567 FATAL(
"Invalid media type for tag");
1568 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_INCORRECT_MEDIA_TYPE");
1572 if(*length != 12 || buffer == NULL)
1575 FATAL(
"Incorrect tag size");
1576 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_INCORRECT_DATA_SIZE");
1581 if(sector_address >= ctx->
track_entries[i].
start && sector_address <= ctx->track_entries[i].end)
1584 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_STATUS_OK");
1588 FATAL(
"Track not found");
1593 FATAL(
"Invalid media type for tag");
1594 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_INCORRECT_MEDIA_TYPE");
1598 if(*length != 96 || buffer == NULL)
1601 FATAL(
"Incorrect tag size");
1602 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_INCORRECT_DATA_SIZE");
1608 FATAL(
"Sector tag not found");
1609 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_SECTOR_TAG_NOT_PRESENT");
1614 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_STATUS_OK");
1619 FATAL(
"Invalid media type for tag");
1620 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_INCORRECT_MEDIA_TYPE");
1624 if(*length != 1 || buffer == NULL)
1627 FATAL(
"Incorrect tag size");
1628 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_INCORRECT_DATA_SIZE");
1634 FATAL(
"Sector tag not found");
1635 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_SECTOR_TAG_NOT_PRESENT");
1639 memcpy(buffer, ctx->
sector_cpr_mai + corrected_sector_address * 6, 1);
1640 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_STATUS_OK");
1645 FATAL(
"Invalid media type for tag");
1646 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_INCORRECT_MEDIA_TYPE");
1650 if(*length != 1 || buffer == NULL)
1653 FATAL(
"Incorrect tag size");
1654 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_INCORRECT_DATA_SIZE");
1660 FATAL(
"Sector tag not found");
1661 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_SECTOR_TAG_NOT_PRESENT");
1665 memcpy(buffer, ctx->
sector_id + corrected_sector_address * 4, 1);
1666 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_STATUS_OK");
1671 FATAL(
"Invalid media type for tag");
1672 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_INCORRECT_MEDIA_TYPE");
1676 if(*length != 3 || buffer == NULL)
1679 FATAL(
"Incorrect tag size");
1680 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_INCORRECT_DATA_SIZE");
1686 FATAL(
"Sector tag not found");
1687 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_SECTOR_TAG_NOT_PRESENT");
1691 memcpy(buffer, ctx->
sector_id + corrected_sector_address * 4 + 1, 3);
1692 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_STATUS_OK");
1697 FATAL(
"Invalid media type for tag");
1698 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_INCORRECT_MEDIA_TYPE");
1702 if(*length != 2 || buffer == NULL)
1705 FATAL(
"Incorrect tag size");
1706 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_INCORRECT_DATA_SIZE");
1712 FATAL(
"Sector tag not found");
1713 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_SECTOR_TAG_NOT_PRESENT");
1717 memcpy(buffer, ctx->
sector_ied + corrected_sector_address * 2, 2);
1718 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_STATUS_OK");
1723 FATAL(
"Invalid media type for tag");
1724 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_INCORRECT_MEDIA_TYPE");
1728 if(*length != 4 || buffer == NULL)
1731 FATAL(
"Incorrect tag size");
1732 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_INCORRECT_DATA_SIZE");
1738 FATAL(
"Sector tag not found");
1739 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_SECTOR_TAG_NOT_PRESENT");
1743 memcpy(buffer, ctx->
sector_edc + corrected_sector_address * 4, 4);
1744 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_STATUS_OK");
1749 FATAL(
"Invalid media type for tag");
1750 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_INCORRECT_MEDIA_TYPE");
1754 if(*length != 5 || buffer == NULL)
1757 FATAL(
"Incorrect tag size");
1758 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_INCORRECT_DATA_SIZE");
1764 FATAL(
"Sector tag not found");
1765 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_SECTOR_TAG_NOT_PRESENT");
1770 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_STATUS_OK");
1775 FATAL(
"Invalid media type for tag");
1776 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_INCORRECT_MEDIA_TYPE");
1780 if(*length != 12 || buffer == NULL)
1783 FATAL(
"Incorrect tag size");
1784 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_INCORRECT_DATA_SIZE");
1790 FATAL(
"Sector tag not found");
1791 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_SECTOR_TAG_NOT_PRESENT");
1796 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_STATUS_OK");
1801 FATAL(
"Invalid media type for tag");
1802 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_INCORRECT_MEDIA_TYPE");
1806 if(*length != 20 || buffer == NULL)
1809 FATAL(
"Incorrect tag size");
1810 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_INCORRECT_DATA_SIZE");
1816 FATAL(
"Sector tag not found");
1817 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_SECTOR_TAG_NOT_PRESENT");
1822 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_STATUS_OK");
1827 FATAL(
"Invalid media type for tag");
1828 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_INCORRECT_MEDIA_TYPE");
1832 if(*length != 24 || buffer == NULL)
1835 FATAL(
"Incorrect tag size");
1836 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_INCORRECT_DATA_SIZE");
1842 FATAL(
"Sector tag not found");
1843 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_ERROR_SECTOR_TAG_NOT_PRESENT");
1848 TRACE(
"Exiting aaruf_read_sector_tag() = AARUF_STATUS_OK");
1851 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.
#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_sector(void *context, const uint64_t sector_address, bool negative, uint8_t *data, uint32_t *length, uint8_t *sector_status)
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, uint8_t *sector_status)
Reads a complete sector with all metadata 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, uint8_t *sector_status)
Reads a sector from a specific track in the AaruFormat image.
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.
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.