From 424c30c96bf0387c469e850e118350c077419093 Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Sun, 17 Mar 2019 23:25:45 +0000 Subject: [PATCH] Read CompactDisc deduplication tables. --- include/dicformat/context.h | 6 +++++- src/close.c | 4 ++++ src/open.c | 36 +++++++++++++++++++++++++++++++++++- 3 files changed, 44 insertions(+), 2 deletions(-) diff --git a/include/dicformat/context.h b/include/dicformat/context.h index 7ce2359..713547d 100644 --- a/include/dicformat/context.h +++ b/include/dicformat/context.h @@ -34,6 +34,7 @@ #include #include +#include typedef struct dicformatContext { @@ -50,10 +51,13 @@ typedef struct dicformatContext unsigned char *sectorSuffixCorrected; unsigned char *sectorSubchannel; unsigned char *mode2Subheaders; - byte shift; + unsigned char shift; bool inMemoryDdt; uint64_t *userDataDdt; size_t mappedMemoryDdtSize; + uint32_t *sectorPrefixDdt; + uint32_t *sectorSuffixDdt; + } dicformatContext; typedef struct dataLinkedList diff --git a/src/close.c b/src/close.c index 7179db3..a027d2e 100644 --- a/src/close.c +++ b/src/close.c @@ -87,6 +87,10 @@ int close(void *context) { munmap(ctx->userDataDdt, ctx->mappedMemoryDdtSize); } + + free(ctx->sectorPrefixDdt); + free(ctx->sectorSuffixDdt); + free(context); return 0; diff --git a/src/open.c b/src/open.c index 823e467..07d509e 100644 --- a/src/open.c +++ b/src/open.c @@ -36,7 +36,6 @@ #include #include #include -#include #include // TODO: Check CRC64 on structures @@ -423,6 +422,41 @@ void *open(const char *filepath) } } + else if(idxEntries[i].dataType == CdSectorPrefixCorrected || + idxEntries[i].dataType == CdSectorSuffixCorrected) + { + switch(ddtHeader.compression) + { + case None:data = malloc(ddtHeader.entries * sizeof(uint32_t)); + + if(mediaTag == NULL) + { + fprintf(stderr, "libdicformat: Cannot allocate memory for deduplication table."); + break; + } + + readBytes = fread(data, ddtHeader.entries * sizeof(uint32_t), 1, ctx->imageStream); + + if(readBytes != ddtHeader.entries * sizeof(uint32_t)) + { + free(data); + fprintf(stderr, "Could not read deduplication table, continuing..."); + break; + } + + if(idxEntries[i].dataType == CdSectorPrefixCorrected) + ctx->sectorPrefixCorrected = data; + else if(idxEntries[i].dataType == CdSectorSuffixCorrected) + ctx->sectorPrefixCorrected = data; + + break; + default: + fprintf(stderr, + "libdicformat: Found unknown compression type %d, continuing...", + blockHeader.compression); + break; + } + } break; case GeometryBlock: // TODO