diff --git a/include/internal.h b/include/internal.h index 310ac43..a634863 100644 --- a/include/internal.h +++ b/include/internal.h @@ -37,5 +37,7 @@ void process_cicm_block(aaruformatContext *ctx, const IndexEntry *entry); void process_dumphw_block(aaruformatContext *ctx, const IndexEntry *entry); void process_checksum_block(aaruformatContext *ctx, const IndexEntry *entry); void add_subindex_entries(aaruformatContext *ctx, UT_array *index_entries, IndexEntry *subindex_entry); +int32_t decode_ddt_entry_v1(aaruformatContext *ctx, uint64_t sectorAddress, uint64_t *offset, uint64_t *blockOffset, + uint8_t *sectorStatus); #endif // LIBAARUFORMAT_INTERNAL_H diff --git a/src/ddt/ddt_v1.c b/src/ddt/ddt_v1.c index 62bcb27..36dfcef 100644 --- a/src/ddt/ddt_v1.c +++ b/src/ddt/ddt_v1.c @@ -275,5 +275,29 @@ int32_t process_ddt_v1(aaruformatContext *ctx, IndexEntry *entry, bool *foundUse } } + return AARUF_STATUS_OK; +} + +int32_t decode_ddt_entry_v1(aaruformatContext *ctx, uint64_t sectorAddress, uint64_t *offset, uint64_t *blockOffset, + uint8_t *sectorStatus) +{ + // Check if the context and image stream are valid + if(ctx == NULL || ctx->imageStream == NULL) + { + fprintf(stderr, "Invalid context or image stream.\n"); + return AARUF_ERROR_NOT_AARUFORMAT; + } + + const uint64_t ddtEntry = ctx->userDataDdt[sectorAddress]; + const uint32_t offsetMask = (uint32_t)((1 << ctx->shift) - 1); + *offset = ddtEntry & offsetMask; + *blockOffset = ddtEntry >> ctx->shift; + + // Partially written image... as we can't know the real sector size just assume it's common :/ + if(ddtEntry == 0) + *sectorStatus = SectorStatusNotDumped; + else + *sectorStatus = SectorStatusDumped; + return AARUF_STATUS_OK; } \ No newline at end of file diff --git a/src/read.c b/src/read.c index 731680d..e265069 100644 --- a/src/read.c +++ b/src/read.c @@ -21,6 +21,8 @@ #include +#include "internal.h" + int32_t aaruf_read_media_tag(void *context, uint8_t *data, int32_t tag, uint32_t *length) { aaruformatContext *ctx; @@ -55,18 +57,17 @@ int32_t aaruf_read_media_tag(void *context, uint8_t *data, int32_t tag, uint32_t int32_t aaruf_read_sector(void *context, uint64_t sectorAddress, uint8_t *data, uint32_t *length) { - aaruformatContext *ctx = NULL; - uint64_t ddtEntry = 0; - uint32_t offsetMask = 0; - uint64_t offset = 0; - uint64_t blockOffset = 0; - BlockHeader *blockHeader = NULL; - uint8_t *block = NULL; - size_t readBytes = 0; + aaruformatContext *ctx = NULL; + uint64_t offset = 0; + uint64_t blockOffset = 0; + BlockHeader *blockHeader = NULL; + uint8_t *block = NULL; + size_t readBytes = 0; uint8_t lzmaProperties[LZMA_PROPERTIES_LENGTH]; - size_t lzmaSize = 0; - uint8_t *cmpData = NULL; - int errorNo = 0; + size_t lzmaSize = 0; + uint8_t *cmpData = NULL; + int errorNo = 0; + uint8_t sectorStatus = 0; if(context == NULL) return AARUF_ERROR_NOT_AARUFORMAT; @@ -77,13 +78,15 @@ int32_t aaruf_read_sector(void *context, uint64_t sectorAddress, uint8_t *data, if(sectorAddress > ctx->imageInfo.Sectors - 1) return AARUF_ERROR_SECTOR_OUT_OF_BOUNDS; - ddtEntry = ctx->userDataDdt[sectorAddress]; - offsetMask = (uint32_t)((1 << ctx->shift) - 1); - offset = ddtEntry & offsetMask; - blockOffset = ddtEntry >> ctx->shift; + if(ctx->ddtVersion == 1) + errorNo = decode_ddt_entry_v1(ctx, sectorAddress, &offset, &blockOffset, §orStatus); + else if(ctx->ddtVersion == 2) + return AARUF_ERROR_CANNOT_READ_BLOCK; + + if(errorNo != AARUF_STATUS_OK) return errorNo; // Partially written image... as we can't know the real sector size just assume it's common :/ - if(ddtEntry == 0) + if(sectorStatus == SectorStatusNotDumped) { memset(data, 0, ctx->imageInfo.SectorSize); *length = ctx->imageInfo.SectorSize; @@ -279,14 +282,14 @@ int32_t aaruf_read_track_sector(void *context, uint8_t *data, uint64_t sectorAdd int32_t aaruf_read_sector_long(void *context, uint64_t sectorAddress, uint8_t *data, uint32_t *length) { - aaruformatContext *ctx = NULL; - uint32_t bareLength = 0; - uint32_t tagLength = 0; - uint8_t *bareData = NULL; - int32_t res = 0; + aaruformatContext *ctx = NULL; + uint32_t bareLength = 0; + uint32_t tagLength = 0; + uint8_t *bareData = NULL; + int32_t res = 0; TrackEntry trk; - int i = 0; - bool trkFound = false; + int i = 0; + bool trkFound = false; if(context == NULL) return AARUF_ERROR_NOT_AARUFORMAT;