mirror of
https://github.com/aaru-dps/libaaruformat.git
synced 2025-12-16 19:24:40 +00:00
Move decoding of DDT v1 entries to separate function.
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
49
src/read.c
49
src/read.c
@@ -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, §orStatus);
|
||||||
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;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user