Move decoding of DDT v1 entries to separate function.

This commit is contained in:
2025-08-05 01:05:31 +01:00
parent 23d656ecab
commit a9ca79e5a4
3 changed files with 52 additions and 23 deletions

View File

@@ -37,5 +37,7 @@ void process_cicm_block(aaruformatContext *ctx, const IndexEntry *entry);
void process_dumphw_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 process_checksum_block(aaruformatContext *ctx, const IndexEntry *entry);
void add_subindex_entries(aaruformatContext *ctx, UT_array *index_entries, IndexEntry *subindex_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 #endif // LIBAARUFORMAT_INTERNAL_H

View File

@@ -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; return AARUF_STATUS_OK;
} }

View File

@@ -21,6 +21,8 @@
#include <aaruformat.h> #include <aaruformat.h>
#include "internal.h"
int32_t aaruf_read_media_tag(void *context, uint8_t *data, int32_t tag, uint32_t *length) int32_t aaruf_read_media_tag(void *context, uint8_t *data, int32_t tag, uint32_t *length)
{ {
aaruformatContext *ctx; 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) int32_t aaruf_read_sector(void *context, uint64_t sectorAddress, uint8_t *data, uint32_t *length)
{ {
aaruformatContext *ctx = NULL; aaruformatContext *ctx = NULL;
uint64_t ddtEntry = 0; uint64_t offset = 0;
uint32_t offsetMask = 0; uint64_t blockOffset = 0;
uint64_t offset = 0; BlockHeader *blockHeader = NULL;
uint64_t blockOffset = 0; uint8_t *block = NULL;
BlockHeader *blockHeader = NULL; size_t readBytes = 0;
uint8_t *block = NULL;
size_t readBytes = 0;
uint8_t lzmaProperties[LZMA_PROPERTIES_LENGTH]; uint8_t lzmaProperties[LZMA_PROPERTIES_LENGTH];
size_t lzmaSize = 0; size_t lzmaSize = 0;
uint8_t *cmpData = NULL; uint8_t *cmpData = NULL;
int errorNo = 0; int errorNo = 0;
uint8_t sectorStatus = 0;
if(context == NULL) return AARUF_ERROR_NOT_AARUFORMAT; 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; if(sectorAddress > ctx->imageInfo.Sectors - 1) return AARUF_ERROR_SECTOR_OUT_OF_BOUNDS;
ddtEntry = ctx->userDataDdt[sectorAddress]; if(ctx->ddtVersion == 1)
offsetMask = (uint32_t)((1 << ctx->shift) - 1); errorNo = decode_ddt_entry_v1(ctx, sectorAddress, &offset, &blockOffset, &sectorStatus);
offset = ddtEntry & offsetMask; else if(ctx->ddtVersion == 2)
blockOffset = ddtEntry >> ctx->shift; 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 :/ // 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); memset(data, 0, ctx->imageInfo.SectorSize);
*length = 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) int32_t aaruf_read_sector_long(void *context, uint64_t sectorAddress, uint8_t *data, uint32_t *length)
{ {
aaruformatContext *ctx = NULL; aaruformatContext *ctx = NULL;
uint32_t bareLength = 0; uint32_t bareLength = 0;
uint32_t tagLength = 0; uint32_t tagLength = 0;
uint8_t *bareData = NULL; uint8_t *bareData = NULL;
int32_t res = 0; int32_t res = 0;
TrackEntry trk; TrackEntry trk;
int i = 0; int i = 0;
bool trkFound = false; bool trkFound = false;
if(context == NULL) return AARUF_ERROR_NOT_AARUFORMAT; if(context == NULL) return AARUF_ERROR_NOT_AARUFORMAT;