mirror of
https://github.com/aaru-dps/libaaruformat.git
synced 2025-12-16 19:24:40 +00:00
Reformat
This commit is contained in:
@@ -5,6 +5,7 @@ set(CMAKE_C_STANDARD 99)
|
|||||||
add_compile_definitions(__STDC_FORMAT_MACROS=1)
|
add_compile_definitions(__STDC_FORMAT_MACROS=1)
|
||||||
|
|
||||||
add_library(dicformat SHARED include/dicformat/consts.h include/dicformat/enums.h include/dic.h include/dicformat.h
|
add_library(dicformat SHARED include/dicformat/consts.h include/dicformat/enums.h include/dic.h include/dicformat.h
|
||||||
include/dicformat/decls.h include/dicformat/structs.h src/identify.c src/open.c include/dicformat/context.h src/close.c include/dicformat/errors.h src/read.c src/crc64.c src/cst.c src/ecc_cd.c src/helpers.c)
|
include/dicformat/decls.h include/dicformat/structs.h src/identify.c src/open.c include/dicformat/context.h
|
||||||
|
src/close.c include/dicformat/errors.h src/read.c src/crc64.c src/cst.c src/ecc_cd.c src/helpers.c)
|
||||||
|
|
||||||
include_directories(include include/dicformat)
|
include_directories(include include/dicformat)
|
||||||
1427
include/dic.h
1427
include/dic.h
File diff suppressed because it is too large
Load Diff
@@ -36,11 +36,11 @@
|
|||||||
#define LIBDICFORMAT_MAJOR_VERSION 1
|
#define LIBDICFORMAT_MAJOR_VERSION 1
|
||||||
#define LIBDICFORMAT_MINOR_VERSION 0
|
#define LIBDICFORMAT_MINOR_VERSION 0
|
||||||
|
|
||||||
#include "dicformat/errors.h"
|
|
||||||
#include "dicformat/consts.h"
|
#include "dicformat/consts.h"
|
||||||
#include "dicformat/enums.h"
|
|
||||||
#include "dicformat/decls.h"
|
|
||||||
#include "dicformat/structs.h"
|
|
||||||
#include "dicformat/context.h"
|
#include "dicformat/context.h"
|
||||||
|
#include "dicformat/decls.h"
|
||||||
|
#include "dicformat/enums.h"
|
||||||
|
#include "dicformat/errors.h"
|
||||||
|
#include "dicformat/structs.h"
|
||||||
|
|
||||||
#endif //LIBDICFORMAT_DICFORMAT_H
|
#endif // LIBDICFORMAT_DICFORMAT_H
|
||||||
|
|||||||
@@ -37,7 +37,8 @@
|
|||||||
|
|
||||||
/** Magic identidier = "DICMFMT". */
|
/** Magic identidier = "DICMFMT". */
|
||||||
#define DIC_MAGIC 0x544D52464D434944
|
#define DIC_MAGIC 0x544D52464D434944
|
||||||
/** Image format version. A change in this number indicates an incompatible change to the format that prevents older implementations from reading it correctly, if at all. */
|
/** Image format version. A change in this number indicates an incompatible change to the format that prevents older
|
||||||
|
* implementations from reading it correctly, if at all. */
|
||||||
#define DICF_VERSION 1
|
#define DICF_VERSION 1
|
||||||
/** Maximum read cache size, 256MiB. */
|
/** Maximum read cache size, 256MiB. */
|
||||||
#define MAX_CACHE_SIZE 256 * 1024 * 1024
|
#define MAX_CACHE_SIZE 256 * 1024 * 1024
|
||||||
@@ -59,6 +60,6 @@
|
|||||||
#define CRC64_ECMA_POLY 0xC96C5795D7870F42
|
#define CRC64_ECMA_POLY 0xC96C5795D7870F42
|
||||||
#define CRC64_ECMA_SEED 0xFFFFFFFFFFFFFFFF
|
#define CRC64_ECMA_SEED 0xFFFFFFFFFFFFFFFF
|
||||||
|
|
||||||
#endif //LIBDICFORMAT_CONSTS_H
|
#endif // LIBDICFORMAT_CONSTS_H
|
||||||
|
|
||||||
#pragma clang diagnostic pop
|
#pragma clang diagnostic pop
|
||||||
@@ -32,68 +32,68 @@
|
|||||||
#ifndef LIBDICFORMAT_CONTEXT_H
|
#ifndef LIBDICFORMAT_CONTEXT_H
|
||||||
#define LIBDICFORMAT_CONTEXT_H
|
#define LIBDICFORMAT_CONTEXT_H
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdbool.h>
|
|
||||||
|
|
||||||
typedef struct dicformatContext
|
typedef struct dicformatContext
|
||||||
{
|
{
|
||||||
uint64_t magic;
|
uint64_t magic;
|
||||||
uint8_t libraryMajorVersion;
|
uint8_t libraryMajorVersion;
|
||||||
uint8_t libraryMinorVersion;
|
uint8_t libraryMinorVersion;
|
||||||
FILE *imageStream;
|
FILE * imageStream;
|
||||||
DicHeader header;
|
DicHeader header;
|
||||||
struct dataLinkedList *mediaTagsHead;
|
struct dataLinkedList * mediaTagsHead;
|
||||||
struct dataLinkedList *mediaTagsTail;
|
struct dataLinkedList * mediaTagsTail;
|
||||||
uint8_t *sectorPrefix;
|
uint8_t * sectorPrefix;
|
||||||
uint8_t *sectorPrefixCorrected;
|
uint8_t * sectorPrefixCorrected;
|
||||||
uint8_t *sectorSuffix;
|
uint8_t * sectorSuffix;
|
||||||
uint8_t *sectorSuffixCorrected;
|
uint8_t * sectorSuffixCorrected;
|
||||||
uint8_t *sectorSubchannel;
|
uint8_t * sectorSubchannel;
|
||||||
uint8_t *mode2Subheaders;
|
uint8_t * mode2Subheaders;
|
||||||
uint8_t shift;
|
uint8_t shift;
|
||||||
bool inMemoryDdt;
|
bool inMemoryDdt;
|
||||||
uint64_t *userDataDdt;
|
uint64_t * userDataDdt;
|
||||||
size_t mappedMemoryDdtSize;
|
size_t mappedMemoryDdtSize;
|
||||||
uint32_t *sectorPrefixDdt;
|
uint32_t * sectorPrefixDdt;
|
||||||
uint32_t *sectorSuffixDdt;
|
uint32_t * sectorSuffixDdt;
|
||||||
GeometryBlockHeader geometryBlock;
|
GeometryBlockHeader geometryBlock;
|
||||||
MetadataBlockHeader metadataBlockHeader;
|
MetadataBlockHeader metadataBlockHeader;
|
||||||
uint8_t *metadataBlock;
|
uint8_t * metadataBlock;
|
||||||
TracksHeader tracksHeader;
|
TracksHeader tracksHeader;
|
||||||
TrackEntry *trackEntries;
|
TrackEntry * trackEntries;
|
||||||
CicmMetadataBlock cicmBlockHeader;
|
CicmMetadataBlock cicmBlockHeader;
|
||||||
uint8_t *cicmBlock;
|
uint8_t * cicmBlock;
|
||||||
DumpHardwareHeader dumpHardwareHeader;
|
DumpHardwareHeader dumpHardwareHeader;
|
||||||
struct DumpHardwareEntriesWithData *dumpHardwareEntriesWithData;
|
struct DumpHardwareEntriesWithData *dumpHardwareEntriesWithData;
|
||||||
struct ImageInfo imageInfo;
|
struct ImageInfo imageInfo;
|
||||||
CdEccContext *eccCdContext;
|
CdEccContext * eccCdContext;
|
||||||
uint8_t numberOfDataTracks;
|
uint8_t numberOfDataTracks;
|
||||||
TrackEntry *dataTracks;
|
TrackEntry * dataTracks;
|
||||||
bool *readableSectorTags;
|
bool * readableSectorTags;
|
||||||
} dicformatContext;
|
} dicformatContext;
|
||||||
|
|
||||||
typedef struct dataLinkedList
|
typedef struct dataLinkedList
|
||||||
{
|
{
|
||||||
struct dataLinkedList *previous;
|
struct dataLinkedList *previous;
|
||||||
struct dataLinkedList *next;
|
struct dataLinkedList *next;
|
||||||
uint8_t *data;
|
uint8_t * data;
|
||||||
int32_t type;
|
int32_t type;
|
||||||
uint32_t length;
|
uint32_t length;
|
||||||
} dataLinkedList;
|
} dataLinkedList;
|
||||||
|
|
||||||
typedef struct DumpHardwareEntriesWithData
|
typedef struct DumpHardwareEntriesWithData
|
||||||
{
|
{
|
||||||
DumpHardwareEntry entry;
|
DumpHardwareEntry entry;
|
||||||
struct DumpExtent *extents;
|
struct DumpExtent *extents;
|
||||||
uint8_t *manufacturer;
|
uint8_t * manufacturer;
|
||||||
uint8_t *model;
|
uint8_t * model;
|
||||||
uint8_t *revision;
|
uint8_t * revision;
|
||||||
uint8_t *firmware;
|
uint8_t * firmware;
|
||||||
uint8_t *serial;
|
uint8_t * serial;
|
||||||
uint8_t *softwareName;
|
uint8_t * softwareName;
|
||||||
uint8_t *softwareVersion;
|
uint8_t * softwareVersion;
|
||||||
uint8_t *softwareOperatingSystem;
|
uint8_t * softwareOperatingSystem;
|
||||||
} DumpHardwareEntriesWithData;
|
} DumpHardwareEntriesWithData;
|
||||||
|
|
||||||
#pragma pack(push, 1)
|
#pragma pack(push, 1)
|
||||||
@@ -106,4 +106,4 @@ typedef struct DumpExtent
|
|||||||
|
|
||||||
#pragma pack(pop)
|
#pragma pack(pop)
|
||||||
|
|
||||||
#endif //LIBDICFORMAT_CONTEXT_H
|
#endif // LIBDICFORMAT_CONTEXT_H
|
||||||
|
|||||||
@@ -33,9 +33,9 @@
|
|||||||
#ifndef LIBDICFORMAT_DECLS_H
|
#ifndef LIBDICFORMAT_DECLS_H
|
||||||
#define LIBDICFORMAT_DECLS_H
|
#define LIBDICFORMAT_DECLS_H
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdbool.h>
|
|
||||||
|
|
||||||
int identify(const char *filename);
|
int identify(const char *filename);
|
||||||
|
|
||||||
@@ -71,37 +71,37 @@ bool ecc_cd_is_suffix_correct(void *context, const uint8_t *sector);
|
|||||||
|
|
||||||
bool ecc_cd_is_suffix_correct_mode2(void *context, const uint8_t *sector);
|
bool ecc_cd_is_suffix_correct_mode2(void *context, const uint8_t *sector);
|
||||||
|
|
||||||
bool ecc_cd_check(void *context,
|
bool ecc_cd_check(void * context,
|
||||||
const uint8_t *address,
|
const uint8_t *address,
|
||||||
const uint8_t *data,
|
const uint8_t *data,
|
||||||
uint32_t majorCount,
|
uint32_t majorCount,
|
||||||
uint32_t minorCount,
|
uint32_t minorCount,
|
||||||
uint32_t majorMult,
|
uint32_t majorMult,
|
||||||
uint32_t minorInc,
|
uint32_t minorInc,
|
||||||
const uint8_t *ecc,
|
const uint8_t *ecc,
|
||||||
int32_t addressOffset,
|
int32_t addressOffset,
|
||||||
int32_t dataOffset,
|
int32_t dataOffset,
|
||||||
int32_t eccOffset);
|
int32_t eccOffset);
|
||||||
|
|
||||||
void ecc_cd_write(void *context,
|
void ecc_cd_write(void * context,
|
||||||
const uint8_t *address,
|
const uint8_t *address,
|
||||||
const uint8_t *data,
|
const uint8_t *data,
|
||||||
uint32_t majorCount,
|
uint32_t majorCount,
|
||||||
uint32_t minorCount,
|
uint32_t minorCount,
|
||||||
uint32_t majorMult,
|
uint32_t majorMult,
|
||||||
uint32_t minorInc,
|
uint32_t minorInc,
|
||||||
uint8_t *ecc,
|
uint8_t * ecc,
|
||||||
int32_t addressOffset,
|
int32_t addressOffset,
|
||||||
int32_t dataOffset,
|
int32_t dataOffset,
|
||||||
int32_t eccOffset);
|
int32_t eccOffset);
|
||||||
|
|
||||||
void ecc_cd_write_sector(void *context,
|
void ecc_cd_write_sector(void * context,
|
||||||
const uint8_t *address,
|
const uint8_t *address,
|
||||||
const uint8_t *data,
|
const uint8_t *data,
|
||||||
uint8_t *ecc,
|
uint8_t * ecc,
|
||||||
int32_t addressOffset,
|
int32_t addressOffset,
|
||||||
int32_t dataOffset,
|
int32_t dataOffset,
|
||||||
int32_t eccOffset);
|
int32_t eccOffset);
|
||||||
|
|
||||||
void cd_lba_to_msf(int64_t pos, uint8_t *minute, uint8_t *second, uint8_t *frame);
|
void cd_lba_to_msf(int64_t pos, uint8_t *minute, uint8_t *second, uint8_t *frame);
|
||||||
|
|
||||||
@@ -117,4 +117,4 @@ int32_t GetMediaTagTypeForDataType(int32_t type);
|
|||||||
|
|
||||||
int32_t GetXmlMediaType(int32_t type);
|
int32_t GetXmlMediaType(int32_t type);
|
||||||
|
|
||||||
#endif //LIBDICFORMAT_DECLS_H
|
#endif // LIBDICFORMAT_DECLS_H
|
||||||
|
|||||||
@@ -7,211 +7,215 @@
|
|||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
/** Not compressed */
|
/** Not compressed */
|
||||||
None = 0, /** LZMA */
|
None = 0, /** LZMA */
|
||||||
Lzma = 1, /** FLAC */
|
Lzma = 1, /** FLAC */
|
||||||
Flac = 2, /** LZMA in Claunia Subchannel Transform processed data */
|
Flac = 2, /** LZMA in Claunia Subchannel Transform processed data */
|
||||||
LzmaClauniaSubchannelTransform = 3
|
LzmaClauniaSubchannelTransform = 3
|
||||||
} CompressionType;
|
} CompressionType;
|
||||||
|
|
||||||
/** List of known data types */
|
/** List of known data types */
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
/** No data */
|
/** No data */
|
||||||
NoData = 0,
|
NoData = 0,
|
||||||
/** User data */
|
/** User data */
|
||||||
UserData = 1,
|
UserData = 1,
|
||||||
/** CompactDisc partial Table of Contents */
|
/** CompactDisc partial Table of Contents */
|
||||||
CompactDiscPartialToc = 2,
|
CompactDiscPartialToc = 2,
|
||||||
/** CompactDisc session information */
|
/** CompactDisc session information */
|
||||||
CompactDiscSessionInfo = 3,
|
CompactDiscSessionInfo = 3,
|
||||||
/** CompactDisc Table of Contents */
|
/** CompactDisc Table of Contents */
|
||||||
CompactDiscToc = 4,
|
CompactDiscToc = 4,
|
||||||
/** CompactDisc Power Management Area */
|
/** CompactDisc Power Management Area */
|
||||||
CompactDiscPma = 5,
|
CompactDiscPma = 5,
|
||||||
/** CompactDisc Absolute Time In Pregroove */
|
/** CompactDisc Absolute Time In Pregroove */
|
||||||
CompactDiscAtip = 6,
|
CompactDiscAtip = 6,
|
||||||
/** CompactDisc Lead-in's CD-Text */
|
/** CompactDisc Lead-in's CD-Text */
|
||||||
CompactDiscLeadInCdText = 7,
|
CompactDiscLeadInCdText = 7,
|
||||||
/** DVD Physical Format Information */
|
/** DVD Physical Format Information */
|
||||||
DvdPfi = 8,
|
DvdPfi = 8,
|
||||||
/** DVD Lead-in's Copyright Management Information */
|
/** DVD Lead-in's Copyright Management Information */
|
||||||
DvdLeadInCmi = 9,
|
DvdLeadInCmi = 9,
|
||||||
/** DVD Disc Key */
|
/** DVD Disc Key */
|
||||||
DvdDiscKey = 10,
|
DvdDiscKey = 10,
|
||||||
/** DVD Burst Cutting Area */
|
/** DVD Burst Cutting Area */
|
||||||
DvdBca = 11,
|
DvdBca = 11,
|
||||||
/** DVD DMI */
|
/** DVD DMI */
|
||||||
DvdDmi = 12,
|
DvdDmi = 12,
|
||||||
/** DVD Media Identifier */
|
/** DVD Media Identifier */
|
||||||
DvdMediaIdentifier = 13,
|
DvdMediaIdentifier = 13,
|
||||||
/** DVD Media Key Block */
|
/** DVD Media Key Block */
|
||||||
DvdMediaKeyBlock = 14,
|
DvdMediaKeyBlock = 14,
|
||||||
/** DVD-RAM Disc Definition Structure */
|
/** DVD-RAM Disc Definition Structure */
|
||||||
DvdRamDds = 15,
|
DvdRamDds = 15,
|
||||||
/** DVD-RAM Medium Status */
|
/** DVD-RAM Medium Status */
|
||||||
DvdRamMediumStatus = 16,
|
DvdRamMediumStatus = 16,
|
||||||
/** DVD-RAM Spare Area Information */
|
/** DVD-RAM Spare Area Information */
|
||||||
DvdRamSpareArea = 17,
|
DvdRamSpareArea = 17,
|
||||||
/** DVD-R RMD */
|
/** DVD-R RMD */
|
||||||
DvdRRmd = 18,
|
DvdRRmd = 18,
|
||||||
/** DVD-R Pre-recorded Information */
|
/** DVD-R Pre-recorded Information */
|
||||||
DvdRPrerecordedInfo = 19,
|
DvdRPrerecordedInfo = 19,
|
||||||
/** DVD-R Media Identifier */
|
/** DVD-R Media Identifier */
|
||||||
DvdRMediaIdentifier = 20,
|
DvdRMediaIdentifier = 20,
|
||||||
/** DVD-R Physical Format Information */
|
/** DVD-R Physical Format Information */
|
||||||
DvdRPfi = 21,
|
DvdRPfi = 21,
|
||||||
/** DVD ADress In Pregroove */
|
/** DVD ADress In Pregroove */
|
||||||
DvdAdip = 22,
|
DvdAdip = 22,
|
||||||
/** HD DVD Copy Protection Information */
|
/** HD DVD Copy Protection Information */
|
||||||
HdDvdCpi = 23,
|
HdDvdCpi = 23,
|
||||||
/** HD DVD Medium Status */
|
/** HD DVD Medium Status */
|
||||||
HdDvdMediumStatus = 24,
|
HdDvdMediumStatus = 24,
|
||||||
/** DVD DL Layer Capacity */
|
/** DVD DL Layer Capacity */
|
||||||
DvdDlLayerCapacity = 25,
|
DvdDlLayerCapacity = 25,
|
||||||
/** DVD DL Middle Zone Address */
|
/** DVD DL Middle Zone Address */
|
||||||
DvdDlMiddleZoneAddress = 26,
|
DvdDlMiddleZoneAddress = 26,
|
||||||
/** DVD DL Jump Interval Size */
|
/** DVD DL Jump Interval Size */
|
||||||
DvdDlJumpIntervalSize = 27,
|
DvdDlJumpIntervalSize = 27,
|
||||||
/** DVD DL Manual Layer Jump LBA */
|
/** DVD DL Manual Layer Jump LBA */
|
||||||
DvdDlManualLayerJumpLba = 28,
|
DvdDlManualLayerJumpLba = 28,
|
||||||
/** Bluray Disc Information */
|
/** Bluray Disc Information */
|
||||||
BlurayDi = 29,
|
BlurayDi = 29,
|
||||||
/** Bluray Burst Cutting Area */
|
/** Bluray Burst Cutting Area */
|
||||||
BlurayBca = 30,
|
BlurayBca = 30,
|
||||||
/** Bluray Disc Definition Structure */
|
/** Bluray Disc Definition Structure */
|
||||||
BlurayDds = 31,
|
BlurayDds = 31,
|
||||||
/** Bluray Cartridge Status */
|
/** Bluray Cartridge Status */
|
||||||
BlurayCartridgeStatus = 32,
|
BlurayCartridgeStatus = 32,
|
||||||
/** Bluray Spare Area Information */
|
/** Bluray Spare Area Information */
|
||||||
BluraySpareArea = 33,
|
BluraySpareArea = 33,
|
||||||
/** AACS Volume Identifier */
|
/** AACS Volume Identifier */
|
||||||
AacsVolumeIdentifier = 34,
|
AacsVolumeIdentifier = 34,
|
||||||
/** AACS Serial Number */
|
/** AACS Serial Number */
|
||||||
AacsSerialNumber = 35,
|
AacsSerialNumber = 35,
|
||||||
/** AACS Media Identifier */
|
/** AACS Media Identifier */
|
||||||
AacsMediaIdentifier = 36,
|
AacsMediaIdentifier = 36,
|
||||||
/** AACS Media Key Block */
|
/** AACS Media Key Block */
|
||||||
AacsMediaKeyBlock = 37,
|
AacsMediaKeyBlock = 37,
|
||||||
/** AACS Data Keys */
|
/** AACS Data Keys */
|
||||||
AacsDataKeys = 38,
|
AacsDataKeys = 38,
|
||||||
/** AACS LBA Extents */
|
/** AACS LBA Extents */
|
||||||
AacsLbaExtents = 39,
|
AacsLbaExtents = 39,
|
||||||
/** CPRM Media Key Block */
|
/** CPRM Media Key Block */
|
||||||
CprmMediaKeyBlock = 40,
|
CprmMediaKeyBlock = 40,
|
||||||
/** Recognized Layers */
|
/** Recognized Layers */
|
||||||
HybridRecognizedLayers = 41,
|
HybridRecognizedLayers = 41,
|
||||||
/** MMC Write Protection */
|
/** MMC Write Protection */
|
||||||
ScsiMmcWriteProtection = 42,
|
ScsiMmcWriteProtection = 42,
|
||||||
/** MMC Disc Information */
|
/** MMC Disc Information */
|
||||||
ScsiMmcDiscInformation = 43,
|
ScsiMmcDiscInformation = 43,
|
||||||
/** MMC Track Resources Information */
|
/** MMC Track Resources Information */
|
||||||
ScsiMmcTrackResourcesInformation = 44,
|
ScsiMmcTrackResourcesInformation = 44,
|
||||||
/** MMC POW Resources Information */
|
/** MMC POW Resources Information */
|
||||||
ScsiMmcPowResourcesInformation = 45,
|
ScsiMmcPowResourcesInformation = 45,
|
||||||
/** SCSI INQUIRY RESPONSE */
|
/** SCSI INQUIRY RESPONSE */
|
||||||
ScsiInquiry = 46,
|
ScsiInquiry = 46,
|
||||||
/** SCSI MODE PAGE 2Ah */
|
/** SCSI MODE PAGE 2Ah */
|
||||||
ScsiModePage2A = 47,
|
ScsiModePage2A = 47,
|
||||||
/** ATA IDENTIFY response */
|
/** ATA IDENTIFY response */
|
||||||
AtaIdentify = 48,
|
AtaIdentify = 48,
|
||||||
/** ATAPI IDENTIFY response */
|
/** ATAPI IDENTIFY response */
|
||||||
AtapiIdentify = 49,
|
AtapiIdentify = 49,
|
||||||
/** PCMCIA CIS */
|
/** PCMCIA CIS */
|
||||||
PcmciaCis = 50,
|
PcmciaCis = 50,
|
||||||
/** SecureDigital CID */
|
/** SecureDigital CID */
|
||||||
SecureDigitalCid = 51,
|
SecureDigitalCid = 51,
|
||||||
/** SecureDigital CSD */
|
/** SecureDigital CSD */
|
||||||
SecureDigitalCsd = 52,
|
SecureDigitalCsd = 52,
|
||||||
/** SecureDigital SCR */
|
/** SecureDigital SCR */
|
||||||
SecureDigitalScr = 53,
|
SecureDigitalScr = 53,
|
||||||
/** SecureDigital OCR */
|
/** SecureDigital OCR */
|
||||||
SecureDigitalOcr = 54,
|
SecureDigitalOcr = 54,
|
||||||
/** MultiMediaCard CID */
|
/** MultiMediaCard CID */
|
||||||
MultiMediaCardCid = 55,
|
MultiMediaCardCid = 55,
|
||||||
/** MultiMediaCard CSD */
|
/** MultiMediaCard CSD */
|
||||||
MultiMediaCardCsd = 56,
|
MultiMediaCardCsd = 56,
|
||||||
/** MultiMediaCard OCR */
|
/** MultiMediaCard OCR */
|
||||||
MultiMediaCardOcr = 57,
|
MultiMediaCardOcr = 57,
|
||||||
/** MultiMediaCard Extended CSD */
|
/** MultiMediaCard Extended CSD */
|
||||||
MultiMediaCardExtendedCsd = 58,
|
MultiMediaCardExtendedCsd = 58,
|
||||||
/** Xbox Security Sector */
|
/** Xbox Security Sector */
|
||||||
XboxSecuritySector = 59,
|
XboxSecuritySector = 59,
|
||||||
/** Floppy Lead-out */
|
/** Floppy Lead-out */
|
||||||
FloppyLeadOut = 60,
|
FloppyLeadOut = 60,
|
||||||
/** Dvd Disc Control Block */
|
/** Dvd Disc Control Block */
|
||||||
DvdDiscControlBlock = 61,
|
DvdDiscControlBlock = 61,
|
||||||
/** CompactDisc First track pregap */
|
/** CompactDisc First track pregap */
|
||||||
CompactDiscFirstTrackPregap = 62,
|
CompactDiscFirstTrackPregap = 62,
|
||||||
/** CompactDisc Lead-out */
|
/** CompactDisc Lead-out */
|
||||||
CompactDiscLeadOut = 63,
|
CompactDiscLeadOut = 63,
|
||||||
/** SCSI MODE SENSE (6) response */
|
/** SCSI MODE SENSE (6) response */
|
||||||
ScsiModeSense6 = 64,
|
ScsiModeSense6 = 64,
|
||||||
/** SCSI MODE SENSE (10) response */
|
/** SCSI MODE SENSE (10) response */
|
||||||
ScsiModeSense10 = 65,
|
ScsiModeSense10 = 65,
|
||||||
/** USB descriptors */
|
/** USB descriptors */
|
||||||
UsbDescriptors = 66,
|
UsbDescriptors = 66,
|
||||||
/** Xbox DMI */
|
/** Xbox DMI */
|
||||||
XboxDmi = 67,
|
XboxDmi = 67,
|
||||||
/** Xbox Physical Format Information */
|
/** Xbox Physical Format Information */
|
||||||
XboxPfi = 68,
|
XboxPfi = 68,
|
||||||
/** CompactDisc sector prefix (sync, header */
|
/** CompactDisc sector prefix (sync, header */
|
||||||
CdSectorPrefix = 69,
|
CdSectorPrefix = 69,
|
||||||
/** CompactDisc sector suffix (edc, ecc p, ecc q) */
|
/** CompactDisc sector suffix (edc, ecc p, ecc q) */
|
||||||
CdSectorSuffix = 70,
|
CdSectorSuffix = 70,
|
||||||
/** CompactDisc subchannel */
|
/** CompactDisc subchannel */
|
||||||
CdSectorSubchannel = 71,
|
CdSectorSubchannel = 71,
|
||||||
/** Apple Profile (20 byte) tag */
|
/** Apple Profile (20 byte) tag */
|
||||||
AppleProfileTag = 72,
|
AppleProfileTag = 72,
|
||||||
/** Apple Sony (12 byte) tag */
|
/** Apple Sony (12 byte) tag */
|
||||||
AppleSonyTag = 73,
|
AppleSonyTag = 73,
|
||||||
/** Priam Data Tower (24 byte) tag */
|
/** Priam Data Tower (24 byte) tag */
|
||||||
PriamDataTowerTag = 74,
|
PriamDataTowerTag = 74,
|
||||||
/** CompactDisc Media Catalogue Number (as in Lead-in), 13 bytes, ASCII */
|
/** CompactDisc Media Catalogue Number (as in Lead-in), 13 bytes, ASCII */
|
||||||
CompactDiscMediaCatalogueNumber = 75,
|
CompactDiscMediaCatalogueNumber = 75,
|
||||||
/** CompactDisc sector prefix (sync, header), only incorrect stored */
|
/** CompactDisc sector prefix (sync, header), only incorrect stored */
|
||||||
CdSectorPrefixCorrected = 76,
|
CdSectorPrefixCorrected = 76,
|
||||||
/** CompactDisc sector suffix (edc, ecc p, ecc q), only incorrect stored */
|
/** CompactDisc sector suffix (edc, ecc p, ecc q), only incorrect stored */
|
||||||
CdSectorSuffixCorrected = 77,
|
CdSectorSuffixCorrected = 77,
|
||||||
/** CompactDisc MODE 2 subheader */
|
/** CompactDisc MODE 2 subheader */
|
||||||
CompactDiscMode2Subheader = 78,
|
CompactDiscMode2Subheader = 78,
|
||||||
/** CompactDisc Lead-in */
|
/** CompactDisc Lead-in */
|
||||||
CompactDiscLeadIn = 79
|
CompactDiscLeadIn = 79
|
||||||
} DataType;
|
} DataType;
|
||||||
|
|
||||||
/** List of known blocks types */
|
/** List of known blocks types */
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
/** Block containing data */
|
/** Block containing data */
|
||||||
DataBlock = 0x4B4C4244,
|
DataBlock = 0x4B4C4244,
|
||||||
/** Block containing a deduplication table */
|
/** Block containing a deduplication table */
|
||||||
DeDuplicationTable = 0X2A544444,
|
DeDuplicationTable = 0X2A544444,
|
||||||
/** Block containing the index */
|
/** Block containing the index */
|
||||||
IndexBlock = 0X58444E49,
|
IndexBlock = 0X58444E49,
|
||||||
/** Block containing logical geometry */
|
/** Block containing logical geometry */
|
||||||
GeometryBlock = 0x4D4F4547,
|
GeometryBlock = 0x4D4F4547,
|
||||||
/** Block containing metadata */
|
/** Block containing metadata */
|
||||||
MetadataBlock = 0x4154454D,
|
MetadataBlock = 0x4154454D,
|
||||||
/** Block containing optical disc tracks */
|
/** Block containing optical disc tracks */
|
||||||
TracksBlock = 0x534B5254,
|
TracksBlock = 0x534B5254,
|
||||||
/** Block containing CICM XML metadata */
|
/** Block containing CICM XML metadata */
|
||||||
CicmBlock = 0x4D434943,
|
CicmBlock = 0x4D434943,
|
||||||
/** Block containing contents checksums */
|
/** Block containing contents checksums */
|
||||||
ChecksumBlock = 0x4D534B43,
|
ChecksumBlock = 0x4D534B43,
|
||||||
/** TODO: Block containing data position measurements */
|
/** TODO: Block containing data position measurements */
|
||||||
DataPositionMeasurementBlock = 0x2A4D5044,
|
DataPositionMeasurementBlock = 0x2A4D5044,
|
||||||
/** TODO: Block containing a snapshot index */
|
/** TODO: Block containing a snapshot index */
|
||||||
SnapshotBlock = 0x50414E53,
|
SnapshotBlock = 0x50414E53,
|
||||||
/** TODO: Block containing how to locate the parent image */
|
/** TODO: Block containing how to locate the parent image */
|
||||||
ParentBlock = 0x50524E54,
|
ParentBlock = 0x50524E54,
|
||||||
/** Block containing an array of hardware used to create the image */
|
/** Block containing an array of hardware used to create the image */
|
||||||
DumpHardwareBlock = 0x2A504D44,
|
DumpHardwareBlock = 0x2A504D44,
|
||||||
/** TODO: Block containing list of files for a tape image */
|
/** TODO: Block containing list of files for a tape image */
|
||||||
TapeFileBlock = 0x454C4654
|
TapeFileBlock = 0x454C4654
|
||||||
} BlockType;
|
} BlockType;
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
Invalid = 0, Md5 = 1, Sha1 = 2, Sha256 = 3, SpamSum = 4
|
Invalid = 0,
|
||||||
|
Md5 = 1,
|
||||||
|
Sha1 = 2,
|
||||||
|
Sha256 = 3,
|
||||||
|
SpamSum = 4
|
||||||
} ChecksumAlgorithm;
|
} ChecksumAlgorithm;
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
@@ -227,12 +231,12 @@ typedef enum
|
|||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
/** Audio track */
|
/** Audio track */
|
||||||
Audio = 0, /** Data track (not any of the below defined ones) */
|
Audio = 0, /** Data track (not any of the below defined ones) */
|
||||||
Data = 1, /** Data track, compact disc mode 1 */
|
Data = 1, /** Data track, compact disc mode 1 */
|
||||||
CdMode1 = 2, /** Data track, compact disc mode 2, formless */
|
CdMode1 = 2, /** Data track, compact disc mode 2, formless */
|
||||||
CdMode2Formless = 3, /** Data track, compact disc mode 2, form 1 */
|
CdMode2Formless = 3, /** Data track, compact disc mode 2, form 1 */
|
||||||
CdMode2Form1 = 4, /** Data track, compact disc mode 2, form 2 */
|
CdMode2Form1 = 4, /** Data track, compact disc mode 2, form 2 */
|
||||||
CdMode2Form2 = 5
|
CdMode2Form2 = 5
|
||||||
} TrackType;
|
} TrackType;
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
@@ -248,19 +252,19 @@ typedef enum
|
|||||||
/**
|
/**
|
||||||
* Purely optical discs
|
* Purely optical discs
|
||||||
*/
|
*/
|
||||||
OpticalDisc = 0, /**
|
OpticalDisc = 0, /**
|
||||||
* Media that is physically block-based or abstracted like that
|
* Media that is physically block-based or abstracted like that
|
||||||
|
|
||||||
*/
|
*/
|
||||||
BlockMedia = 1, /**
|
BlockMedia = 1, /**
|
||||||
* Media that can be accessed by-byte or by-bit, like chips
|
* Media that can be accessed by-byte or by-bit, like chips
|
||||||
*/
|
*/
|
||||||
LinearMedia = 2, /**
|
LinearMedia = 2, /**
|
||||||
* Media that can only store data when it is modulated to audio
|
* Media that can only store data when it is modulated to audio
|
||||||
*/
|
*/
|
||||||
AudioMedia = 3
|
AudioMedia = 3
|
||||||
} XmlMediaType;
|
} XmlMediaType;
|
||||||
|
|
||||||
#endif //LIBDICFORMAT_ENUMS_H
|
#endif // LIBDICFORMAT_ENUMS_H
|
||||||
|
|
||||||
#pragma clang diagnostic pop
|
#pragma clang diagnostic pop
|
||||||
@@ -27,4 +27,4 @@
|
|||||||
#define DICF_STATUS_SECTOR_WITH_ERRORS 2
|
#define DICF_STATUS_SECTOR_WITH_ERRORS 2
|
||||||
#define DICF_STATUS_SECTOR_DELETED 3
|
#define DICF_STATUS_SECTOR_DELETED 3
|
||||||
|
|
||||||
#endif //LIBDICFORMAT_ERRORS_H
|
#endif // LIBDICFORMAT_ERRORS_H
|
||||||
|
|||||||
@@ -37,34 +37,35 @@
|
|||||||
|
|
||||||
#pragma pack(push, 1)
|
#pragma pack(push, 1)
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <dic.h>
|
|
||||||
#include "enums.h"
|
#include "enums.h"
|
||||||
|
|
||||||
|
#include <dic.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
/**Header, at start of file */
|
/**Header, at start of file */
|
||||||
typedef struct DicHeader
|
typedef struct DicHeader
|
||||||
{
|
{
|
||||||
/**Header identifier, <see cref="DIC_MAGIC" /> */
|
/**Header identifier, <see cref="DIC_MAGIC" /> */
|
||||||
uint64_t identifier;
|
uint64_t identifier;
|
||||||
/**UTF-16LE name of the application that created the image */
|
/**UTF-16LE name of the application that created the image */
|
||||||
uint8_t application[64];
|
uint8_t application[64];
|
||||||
/**Image format major version. A new major version means a possibly incompatible change of format */
|
/**Image format major version. A new major version means a possibly incompatible change of format */
|
||||||
uint8_t imageMajorVersion;
|
uint8_t imageMajorVersion;
|
||||||
/**Image format minor version. A new minor version indicates a compatible change of format */
|
/**Image format minor version. A new minor version indicates a compatible change of format */
|
||||||
uint8_t imageMinorVersion;
|
uint8_t imageMinorVersion;
|
||||||
/**Major version of the application that created the image */
|
/**Major version of the application that created the image */
|
||||||
uint8_t applicationMajorVersion;
|
uint8_t applicationMajorVersion;
|
||||||
/**Minor version of the application that created the image */
|
/**Minor version of the application that created the image */
|
||||||
uint8_t applicationMinorVersion;
|
uint8_t applicationMinorVersion;
|
||||||
/**Type of media contained on image */
|
/**Type of media contained on image */
|
||||||
uint32_t mediaType;
|
uint32_t mediaType;
|
||||||
/**Offset to index */
|
/**Offset to index */
|
||||||
uint64_t indexOffset;
|
uint64_t indexOffset;
|
||||||
/**Windows filetime (100 nanoseconds since 1601/01/01 00:00:00 UTC) of image creation time */
|
/**Windows filetime (100 nanoseconds since 1601/01/01 00:00:00 UTC) of image creation time */
|
||||||
int64_t creationTime;
|
int64_t creationTime;
|
||||||
/**Windows filetime (100 nanoseconds since 1601/01/01 00:00:00 UTC) of image last written time */
|
/**Windows filetime (100 nanoseconds since 1601/01/01 00:00:00 UTC) of image last written time */
|
||||||
int64_t lastWrittenTime;
|
int64_t lastWrittenTime;
|
||||||
} DicHeader;
|
} DicHeader;
|
||||||
|
|
||||||
/**Header for a deduplication table. Table follows it */
|
/**Header for a deduplication table. Table follows it */
|
||||||
@@ -77,7 +78,7 @@ typedef struct DdtHeader
|
|||||||
/**Compression algorithm used to compress the DDT */
|
/**Compression algorithm used to compress the DDT */
|
||||||
uint16_t compression;
|
uint16_t compression;
|
||||||
/**Each entry is ((uint8_t offset in file) << shift) + (sector offset in block) */
|
/**Each entry is ((uint8_t offset in file) << shift) + (sector offset in block) */
|
||||||
uint8_t shift;
|
uint8_t shift;
|
||||||
/**How many entries are in the table */
|
/**How many entries are in the table */
|
||||||
uint64_t entries;
|
uint64_t entries;
|
||||||
/**Compressed length for the DDT */
|
/**Compressed length for the DDT */
|
||||||
@@ -151,9 +152,9 @@ typedef struct MetadataBlockHeader
|
|||||||
/**Size in uint8_ts of this whole metadata block */
|
/**Size in uint8_ts of this whole metadata block */
|
||||||
uint32_t blockSize;
|
uint32_t blockSize;
|
||||||
/**Sequence of media set this media beint64_ts to */
|
/**Sequence of media set this media beint64_ts to */
|
||||||
int32_t mediaSequence;
|
int32_t mediaSequence;
|
||||||
/**Total number of media on the media set this media beint64_ts to */
|
/**Total number of media on the media set this media beint64_ts to */
|
||||||
int32_t lastMediaSequence;
|
int32_t lastMediaSequence;
|
||||||
/**Offset to start of creator string from start of this block */
|
/**Offset to start of creator string from start of this block */
|
||||||
uint32_t creatorOffset;
|
uint32_t creatorOffset;
|
||||||
/**Length in uint8_ts of the null-terminated UTF-16LE creator string */
|
/**Length in uint8_ts of the null-terminated UTF-16LE creator string */
|
||||||
@@ -291,14 +292,14 @@ typedef struct ChecksumHeader
|
|||||||
/**Length in uint8_ts of the block */
|
/**Length in uint8_ts of the block */
|
||||||
uint32_t length;
|
uint32_t length;
|
||||||
/**How many checksums follow */
|
/**How many checksums follow */
|
||||||
uint8_t entries;
|
uint8_t entries;
|
||||||
} ChecksumHeader;
|
} ChecksumHeader;
|
||||||
|
|
||||||
/**Checksum entry, followed by checksum data itself */
|
/**Checksum entry, followed by checksum data itself */
|
||||||
typedef struct ChecksumEntry
|
typedef struct ChecksumEntry
|
||||||
{
|
{
|
||||||
/**Checksum algorithm */
|
/**Checksum algorithm */
|
||||||
uint8_t type;
|
uint8_t type;
|
||||||
/**Length in uint8_ts of checksum that follows this structure */
|
/**Length in uint8_ts of checksum that follows this structure */
|
||||||
uint32_t length;
|
uint32_t length;
|
||||||
} ChecksumEntry;
|
} ChecksumEntry;
|
||||||
@@ -312,14 +313,14 @@ typedef struct Crc64Context
|
|||||||
|
|
||||||
typedef struct CdEccContext
|
typedef struct CdEccContext
|
||||||
{
|
{
|
||||||
bool initedEdc;
|
bool initedEdc;
|
||||||
uint8_t *eccBTable;
|
uint8_t * eccBTable;
|
||||||
uint8_t *eccFTable;
|
uint8_t * eccFTable;
|
||||||
uint32_t *edcTable;
|
uint32_t *edcTable;
|
||||||
} CdEccContext;
|
} CdEccContext;
|
||||||
|
|
||||||
#pragma pack(pop)
|
#pragma pack(pop)
|
||||||
|
|
||||||
#endif //LIBDICFORMAT_STRUCTS_H
|
#endif // LIBDICFORMAT_STRUCTS_H
|
||||||
|
|
||||||
#pragma clang diagnostic pop
|
#pragma clang diagnostic pop
|
||||||
12
src/close.c
12
src/close.c
@@ -30,10 +30,10 @@
|
|||||||
// Copyright © 2011-2019 Natalia Portillo
|
// Copyright © 2011-2019 Natalia Portillo
|
||||||
// ****************************************************************************/
|
// ****************************************************************************/
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <dicformat.h>
|
#include <dicformat.h>
|
||||||
#include <malloc.h>
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#include <malloc.h>
|
||||||
|
#include <stdio.h>
|
||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
|
|
||||||
int close(void *context)
|
int close(void *context)
|
||||||
@@ -54,8 +54,7 @@ int close(void *context)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// This may do nothing if imageStream is NULL, but as the behaviour is undefined, better sure than sorry
|
// This may do nothing if imageStream is NULL, but as the behaviour is undefined, better sure than sorry
|
||||||
if(ctx->imageStream != NULL)
|
if(ctx->imageStream != NULL) fclose(ctx->imageStream);
|
||||||
fclose(ctx->imageStream);
|
|
||||||
|
|
||||||
free(ctx->sectorPrefix);
|
free(ctx->sectorPrefix);
|
||||||
free(ctx->sectorPrefixCorrected);
|
free(ctx->sectorPrefixCorrected);
|
||||||
@@ -82,10 +81,7 @@ int close(void *context)
|
|||||||
free(ctx->mediaTagsHead);
|
free(ctx->mediaTagsHead);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!ctx->inMemoryDdt)
|
if(!ctx->inMemoryDdt) { munmap(ctx->userDataDdt, ctx->mappedMemoryDdtSize); }
|
||||||
{
|
|
||||||
munmap(ctx->userDataDdt, ctx->mappedMemoryDdtSize);
|
|
||||||
}
|
|
||||||
|
|
||||||
free(ctx->sectorPrefixDdt);
|
free(ctx->sectorPrefixDdt);
|
||||||
free(ctx->sectorSuffixDdt);
|
free(ctx->sectorSuffixDdt);
|
||||||
|
|||||||
26
src/crc64.c
26
src/crc64.c
@@ -30,10 +30,10 @@
|
|||||||
// Copyright © 2011-2019 Natalia Portillo
|
// Copyright © 2011-2019 Natalia Portillo
|
||||||
// ****************************************************************************/
|
// ****************************************************************************/
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <malloc.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <dicformat.h>
|
#include <dicformat.h>
|
||||||
|
#include <malloc.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
void *crc64_init(uint64_t polynomial, uint64_t seed)
|
void *crc64_init(uint64_t polynomial, uint64_t seed)
|
||||||
{
|
{
|
||||||
@@ -41,8 +41,7 @@ void *crc64_init(uint64_t polynomial, uint64_t seed)
|
|||||||
|
|
||||||
ctx = malloc(sizeof(Crc64Context));
|
ctx = malloc(sizeof(Crc64Context));
|
||||||
|
|
||||||
if(ctx == NULL)
|
if(ctx == NULL) return NULL;
|
||||||
return NULL;
|
|
||||||
|
|
||||||
memset(ctx, 1, sizeof(Crc64Context));
|
memset(ctx, 1, sizeof(Crc64Context));
|
||||||
|
|
||||||
@@ -52,7 +51,7 @@ void *crc64_init(uint64_t polynomial, uint64_t seed)
|
|||||||
for(int i = 0; i < 256; i++)
|
for(int i = 0; i < 256; i++)
|
||||||
{
|
{
|
||||||
uint64_t entry = (uint64_t)i;
|
uint64_t entry = (uint64_t)i;
|
||||||
for(int j = 0; j < 8; j++)
|
for(int j = 0; j < 8; j++)
|
||||||
if((entry & 1) == 1)
|
if((entry & 1) == 1)
|
||||||
entry = (entry >> 1) ^ polynomial;
|
entry = (entry >> 1) ^ polynomial;
|
||||||
else
|
else
|
||||||
@@ -64,18 +63,13 @@ void *crc64_init(uint64_t polynomial, uint64_t seed)
|
|||||||
return ctx;
|
return ctx;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *crc64_init_ecma(void)
|
void *crc64_init_ecma(void) { return crc64_init(CRC64_ECMA_POLY, CRC64_ECMA_SEED); }
|
||||||
{
|
|
||||||
return crc64_init(CRC64_ECMA_POLY, CRC64_ECMA_SEED);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void crc64_update(void *context, const uint8_t *data, size_t len)
|
void crc64_update(void *context, const uint8_t *data, size_t len)
|
||||||
{
|
{
|
||||||
Crc64Context *ctx = context;
|
Crc64Context *ctx = context;
|
||||||
|
|
||||||
for(size_t i = 0; i < len; i++)
|
for(size_t i = 0; i < len; i++) ctx->hashInt = (ctx->hashInt >> 8) ^ ctx->table[data[i] ^ (ctx->hashInt & 0xFF)];
|
||||||
ctx->hashInt = (ctx->hashInt >> 8) ^ ctx->table[data[i] ^ (ctx->hashInt & 0xFF)];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t crc64_final(void *context)
|
uint64_t crc64_final(void *context)
|
||||||
@@ -93,7 +87,7 @@ uint64_t crc64_data(const uint8_t *data, size_t len, uint64_t polynomial, uint64
|
|||||||
for(int i = 0; i < 256; i++)
|
for(int i = 0; i < 256; i++)
|
||||||
{
|
{
|
||||||
uint64_t entry = (uint64_t)i;
|
uint64_t entry = (uint64_t)i;
|
||||||
for(int j = 0; j < 8; j++)
|
for(int j = 0; j < 8; j++)
|
||||||
if((entry & 1) == 1)
|
if((entry & 1) == 1)
|
||||||
entry = (entry >> 1) ^ polynomial;
|
entry = (entry >> 1) ^ polynomial;
|
||||||
else
|
else
|
||||||
@@ -102,8 +96,7 @@ uint64_t crc64_data(const uint8_t *data, size_t len, uint64_t polynomial, uint64
|
|||||||
table[i] = entry;
|
table[i] = entry;
|
||||||
}
|
}
|
||||||
|
|
||||||
for(size_t i = 0; i < len; i++)
|
for(size_t i = 0; i < len; i++) hashInt = (hashInt >> 8) ^ table[data[i] ^ (hashInt & 0xFF)];
|
||||||
hashInt = (hashInt >> 8) ^ table[data[i] ^ (hashInt & 0xFF)];
|
|
||||||
|
|
||||||
return hashInt ^ seed;
|
return hashInt ^ seed;
|
||||||
}
|
}
|
||||||
@@ -112,4 +105,3 @@ uint64_t crc64_data_ecma(const uint8_t *data, size_t len)
|
|||||||
{
|
{
|
||||||
return crc64_data(data, len, CRC64_ECMA_POLY, CRC64_ECMA_SEED);
|
return crc64_data(data, len, CRC64_ECMA_POLY, CRC64_ECMA_SEED);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
38
src/cst.c
38
src/cst.c
@@ -30,24 +30,23 @@
|
|||||||
// Copyright © 2011-2019 Natalia Portillo
|
// Copyright © 2011-2019 Natalia Portillo
|
||||||
// ****************************************************************************/
|
// ****************************************************************************/
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <malloc.h>
|
|
||||||
#include <dicformat.h>
|
#include <dicformat.h>
|
||||||
|
#include <malloc.h>
|
||||||
|
#include <stdint.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
int32_t cst_transform(const uint8_t *interleaved, uint8_t *sequential, size_t length)
|
int32_t cst_transform(const uint8_t *interleaved, uint8_t *sequential, size_t length)
|
||||||
{
|
{
|
||||||
uint8_t *p, *q, *r, *s, *t, *u, *v, *w;
|
uint8_t *p, *q, *r, *s, *t, *u, *v, *w;
|
||||||
size_t qStart;
|
size_t qStart;
|
||||||
size_t rStart;
|
size_t rStart;
|
||||||
size_t sStart;
|
size_t sStart;
|
||||||
size_t tStart;
|
size_t tStart;
|
||||||
size_t uStart;
|
size_t uStart;
|
||||||
size_t vStart;
|
size_t vStart;
|
||||||
size_t wStart;
|
size_t wStart;
|
||||||
|
|
||||||
if(interleaved == NULL || sequential == NULL)
|
if(interleaved == NULL || sequential == NULL) return DICF_ERROR_BUFFER_TOO_SMALL;
|
||||||
return DICF_ERROR_BUFFER_TOO_SMALL;
|
|
||||||
|
|
||||||
p = malloc(length / 8);
|
p = malloc(length / 8);
|
||||||
q = malloc(length / 8);
|
q = malloc(length / 8);
|
||||||
@@ -172,16 +171,15 @@ int32_t cst_transform(const uint8_t *interleaved, uint8_t *sequential, size_t le
|
|||||||
int32_t cst_untransform(const uint8_t *sequential, uint8_t *interleaved, size_t length)
|
int32_t cst_untransform(const uint8_t *sequential, uint8_t *interleaved, size_t length)
|
||||||
{
|
{
|
||||||
uint8_t *p, *q, *r, *s, *t, *u, *v, *w;
|
uint8_t *p, *q, *r, *s, *t, *u, *v, *w;
|
||||||
size_t qStart;
|
size_t qStart;
|
||||||
size_t rStart;
|
size_t rStart;
|
||||||
size_t sStart;
|
size_t sStart;
|
||||||
size_t tStart;
|
size_t tStart;
|
||||||
size_t uStart;
|
size_t uStart;
|
||||||
size_t vStart;
|
size_t vStart;
|
||||||
size_t wStart;
|
size_t wStart;
|
||||||
|
|
||||||
if(interleaved == NULL || sequential == NULL)
|
if(interleaved == NULL || sequential == NULL) return DICF_ERROR_BUFFER_TOO_SMALL;
|
||||||
return DICF_ERROR_BUFFER_TOO_SMALL;
|
|
||||||
|
|
||||||
p = malloc(length / 8);
|
p = malloc(length / 8);
|
||||||
q = malloc(length / 8);
|
q = malloc(length / 8);
|
||||||
|
|||||||
217
src/ecc_cd.c
217
src/ecc_cd.c
@@ -31,21 +31,20 @@
|
|||||||
// ECC algorithm from ECM(c) 2002-2011 Neill Corlett
|
// ECC algorithm from ECM(c) 2002-2011 Neill Corlett
|
||||||
// ****************************************************************************/
|
// ****************************************************************************/
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <malloc.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <dicformat.h>
|
#include <dicformat.h>
|
||||||
|
#include <malloc.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
void *ecc_cd_init()
|
void *ecc_cd_init()
|
||||||
{
|
{
|
||||||
CdEccContext *context;
|
CdEccContext *context;
|
||||||
uint32_t edc, i, j;
|
uint32_t edc, i, j;
|
||||||
|
|
||||||
context = (CdEccContext *)malloc(sizeof(CdEccContext));
|
context = (CdEccContext *)malloc(sizeof(CdEccContext));
|
||||||
|
|
||||||
if(context == NULL)
|
if(context == NULL) return NULL;
|
||||||
return NULL;
|
|
||||||
|
|
||||||
context->eccFTable = (uint8_t *)malloc(sizeof(uint8_t) * 256);
|
context->eccFTable = (uint8_t *)malloc(sizeof(uint8_t) * 256);
|
||||||
|
|
||||||
@@ -75,12 +74,11 @@ void *ecc_cd_init()
|
|||||||
|
|
||||||
for(i = 0; i < 256; i++)
|
for(i = 0; i < 256; i++)
|
||||||
{
|
{
|
||||||
edc = i;
|
edc = i;
|
||||||
j = (uint32_t)((i << 1) ^ ((i & 0x80) == 0x80 ? 0x11D : 0));
|
j = (uint32_t)((i << 1) ^ ((i & 0x80) == 0x80 ? 0x11D : 0));
|
||||||
context->eccFTable[i] = (uint8_t)j;
|
context->eccFTable[i] = (uint8_t)j;
|
||||||
context->eccBTable[i ^ j] = (uint8_t)i;
|
context->eccBTable[i ^ j] = (uint8_t)i;
|
||||||
for(j = 0; j < 8; j++)
|
for(j = 0; j < 8; j++) edc = (edc >> 1) ^ ((edc & 1) > 0 ? 0xD8018001 : 0);
|
||||||
edc = (edc >> 1) ^ ((edc & 1) > 0 ? 0xD8018001 : 0);
|
|
||||||
context->edcTable[i] = edc;
|
context->edcTable[i] = edc;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -92,42 +90,32 @@ void *ecc_cd_init()
|
|||||||
bool ecc_cd_is_suffix_correct(void *context, const uint8_t *sector)
|
bool ecc_cd_is_suffix_correct(void *context, const uint8_t *sector)
|
||||||
{
|
{
|
||||||
CdEccContext *ctx;
|
CdEccContext *ctx;
|
||||||
uint32_t storedEdc, edc, calculatedEdc;
|
uint32_t storedEdc, edc, calculatedEdc;
|
||||||
int size, pos;
|
int size, pos;
|
||||||
|
|
||||||
if(context == NULL || sector == NULL)
|
if(context == NULL || sector == NULL) return false;
|
||||||
return false;
|
|
||||||
|
|
||||||
ctx = (CdEccContext *)context;
|
ctx = (CdEccContext *)context;
|
||||||
|
|
||||||
if(!ctx->initedEdc)
|
if(!ctx->initedEdc) return false;
|
||||||
return false;
|
|
||||||
|
|
||||||
if(sector[0x814] != 0x00 ||
|
if(sector[0x814] != 0x00 ||
|
||||||
// reserved (8 bytes)
|
// reserved (8 bytes)
|
||||||
sector[0x815] != 0x00 ||
|
sector[0x815] != 0x00 || sector[0x816] != 0x00 || sector[0x817] != 0x00 || sector[0x818] != 0x00 ||
|
||||||
sector[0x816] != 0x00 ||
|
sector[0x819] != 0x00 || sector[0x81A] != 0x00 || sector[0x81B] != 0x00)
|
||||||
sector[0x817] != 0x00 ||
|
|
||||||
sector[0x818] != 0x00 ||
|
|
||||||
sector[0x819] != 0x00 ||
|
|
||||||
sector[0x81A] != 0x00 ||
|
|
||||||
sector[0x81B] != 0x00)
|
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
bool correctEccP = ecc_cd_check(context, sector, sector, 86, 24, 2, 86, sector, 0xC, 0x10, 0x81C);
|
bool correctEccP = ecc_cd_check(context, sector, sector, 86, 24, 2, 86, sector, 0xC, 0x10, 0x81C);
|
||||||
if(!correctEccP)
|
if(!correctEccP) return false;
|
||||||
return false;
|
|
||||||
|
|
||||||
bool correctEccQ = ecc_cd_check(context, sector, sector, 52, 43, 86, 88, sector, 0xC, 0x10, 0x81C + 0xAC);
|
bool correctEccQ = ecc_cd_check(context, sector, sector, 52, 43, 86, 88, sector, 0xC, 0x10, 0x81C + 0xAC);
|
||||||
if(!correctEccQ)
|
if(!correctEccQ) return false;
|
||||||
return false;
|
|
||||||
|
|
||||||
storedEdc = sector[0x810]; // TODO: Check casting
|
storedEdc = sector[0x810]; // TODO: Check casting
|
||||||
edc = 0;
|
edc = 0;
|
||||||
size = 0x810;
|
size = 0x810;
|
||||||
pos = 0;
|
pos = 0;
|
||||||
for(; size > 0; size--)
|
for(; size > 0; size--) edc = (edc >> 8) ^ ctx->edcTable[(edc ^ sector[pos++]) & 0xFF];
|
||||||
edc = (edc >> 8) ^ ctx->edcTable[(edc ^ sector[pos++]) & 0xFF];
|
|
||||||
calculatedEdc = edc;
|
calculatedEdc = edc;
|
||||||
|
|
||||||
return calculatedEdc == storedEdc;
|
return calculatedEdc == storedEdc;
|
||||||
@@ -136,115 +124,102 @@ bool ecc_cd_is_suffix_correct(void *context, const uint8_t *sector)
|
|||||||
bool ecc_cd_is_suffix_correct_mode2(void *context, const uint8_t *sector)
|
bool ecc_cd_is_suffix_correct_mode2(void *context, const uint8_t *sector)
|
||||||
{
|
{
|
||||||
CdEccContext *ctx;
|
CdEccContext *ctx;
|
||||||
uint32_t storedEdc, edc, calculatedEdc;
|
uint32_t storedEdc, edc, calculatedEdc;
|
||||||
int size, pos;
|
int size, pos;
|
||||||
uint8_t zeroaddress[4];
|
uint8_t zeroaddress[4];
|
||||||
|
|
||||||
if(context == NULL || sector == NULL)
|
if(context == NULL || sector == NULL) return false;
|
||||||
return false;
|
|
||||||
|
|
||||||
ctx = (CdEccContext *)context;
|
ctx = (CdEccContext *)context;
|
||||||
|
|
||||||
if(!ctx->initedEdc)
|
if(!ctx->initedEdc) return false;
|
||||||
return false;
|
|
||||||
|
|
||||||
memset(&zeroaddress, 4, sizeof(uint8_t));
|
memset(&zeroaddress, 4, sizeof(uint8_t));
|
||||||
|
|
||||||
bool correctEccP = ecc_cd_check(context, zeroaddress, sector, 86, 24, 2, 86, sector, 0, 0x10, 0x81C);
|
bool correctEccP = ecc_cd_check(context, zeroaddress, sector, 86, 24, 2, 86, sector, 0, 0x10, 0x81C);
|
||||||
if(!correctEccP)
|
if(!correctEccP) return false;
|
||||||
return false;
|
|
||||||
|
|
||||||
bool
|
bool correctEccQ = ecc_cd_check(context, zeroaddress, sector, 52, 43, 86, 88, sector, 0, 0x10, 0x81C + 0xAC);
|
||||||
correctEccQ =
|
if(!correctEccQ) return false;
|
||||||
ecc_cd_check(context, zeroaddress, sector, 52, 43, 86, 88, sector, 0, 0x10, 0x81C + 0xAC);
|
|
||||||
if(!correctEccQ)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
storedEdc = sector[0x818]; // TODO: Check cast
|
storedEdc = sector[0x818]; // TODO: Check cast
|
||||||
edc = 0;
|
edc = 0;
|
||||||
size = 0x808;
|
size = 0x808;
|
||||||
pos = 0x10;
|
pos = 0x10;
|
||||||
for(; size > 0; size--)
|
for(; size > 0; size--) edc = (edc >> 8) ^ ctx->edcTable[(edc ^ sector[pos++]) & 0xFF];
|
||||||
edc = (edc >> 8) ^ ctx->edcTable[(edc ^ sector[pos++]) & 0xFF];
|
|
||||||
calculatedEdc = edc;
|
calculatedEdc = edc;
|
||||||
|
|
||||||
return calculatedEdc == storedEdc;
|
return calculatedEdc == storedEdc;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ecc_cd_check(void *context,
|
bool ecc_cd_check(void * context,
|
||||||
const uint8_t *address,
|
const uint8_t *address,
|
||||||
const uint8_t *data,
|
const uint8_t *data,
|
||||||
uint32_t majorCount,
|
uint32_t majorCount,
|
||||||
uint32_t minorCount,
|
uint32_t minorCount,
|
||||||
uint32_t majorMult,
|
uint32_t majorMult,
|
||||||
uint32_t minorInc,
|
uint32_t minorInc,
|
||||||
const uint8_t *ecc,
|
const uint8_t *ecc,
|
||||||
int32_t addressOffset,
|
int32_t addressOffset,
|
||||||
int32_t dataOffset,
|
int32_t dataOffset,
|
||||||
int32_t eccOffset)
|
int32_t eccOffset)
|
||||||
{
|
{
|
||||||
CdEccContext *ctx;
|
CdEccContext *ctx;
|
||||||
uint32_t size, major, idx, minor;
|
uint32_t size, major, idx, minor;
|
||||||
uint8_t eccA, eccB, temp;
|
uint8_t eccA, eccB, temp;
|
||||||
|
|
||||||
if(context == NULL || address == NULL || data == NULL || ecc == NULL)
|
if(context == NULL || address == NULL || data == NULL || ecc == NULL) return false;
|
||||||
return false;
|
|
||||||
|
|
||||||
ctx = (CdEccContext *)context;
|
ctx = (CdEccContext *)context;
|
||||||
|
|
||||||
if(!ctx->initedEdc)
|
if(!ctx->initedEdc) return false;
|
||||||
return false;
|
|
||||||
|
|
||||||
size = majorCount * minorCount;
|
size = majorCount * minorCount;
|
||||||
for(major = 0; major < majorCount; major++)
|
for(major = 0; major < majorCount; major++)
|
||||||
{
|
{
|
||||||
idx = (major >> 1) * majorMult + (major & 1);
|
idx = (major >> 1) * majorMult + (major & 1);
|
||||||
eccA = 0;
|
eccA = 0;
|
||||||
eccB = 0;
|
eccB = 0;
|
||||||
for(minor = 0; minor < minorCount; minor++)
|
for(minor = 0; minor < minorCount; minor++)
|
||||||
{
|
{
|
||||||
temp = idx < 4 ? address[idx + addressOffset] : data[idx + dataOffset - 4];
|
temp = idx < 4 ? address[idx + addressOffset] : data[idx + dataOffset - 4];
|
||||||
idx += minorInc;
|
idx += minorInc;
|
||||||
if(idx >= size)
|
if(idx >= size) idx -= size;
|
||||||
idx -= size;
|
|
||||||
eccA ^= temp;
|
eccA ^= temp;
|
||||||
eccB ^= temp;
|
eccB ^= temp;
|
||||||
eccA = ctx->eccFTable[eccA];
|
eccA = ctx->eccFTable[eccA];
|
||||||
}
|
}
|
||||||
|
|
||||||
eccA = ctx->eccBTable[ctx->eccFTable[eccA] ^ eccB];
|
eccA = ctx->eccBTable[ctx->eccFTable[eccA] ^ eccB];
|
||||||
if(ecc[major + eccOffset] != eccA || ecc[major + majorCount + eccOffset] != (eccA ^ eccB))
|
if(ecc[major + eccOffset] != eccA || ecc[major + majorCount + eccOffset] != (eccA ^ eccB)) return false;
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ecc_cd_write(void *context,
|
void ecc_cd_write(void * context,
|
||||||
const uint8_t *address,
|
const uint8_t *address,
|
||||||
const uint8_t *data,
|
const uint8_t *data,
|
||||||
uint32_t majorCount,
|
uint32_t majorCount,
|
||||||
uint32_t minorCount,
|
uint32_t minorCount,
|
||||||
uint32_t majorMult,
|
uint32_t majorMult,
|
||||||
uint32_t minorInc,
|
uint32_t minorInc,
|
||||||
uint8_t *ecc,
|
uint8_t * ecc,
|
||||||
int32_t addressOffset,
|
int32_t addressOffset,
|
||||||
int32_t dataOffset,
|
int32_t dataOffset,
|
||||||
int32_t eccOffset)
|
int32_t eccOffset)
|
||||||
{
|
{
|
||||||
CdEccContext *ctx;
|
CdEccContext *ctx;
|
||||||
uint32_t size, major, idx, minor;
|
uint32_t size, major, idx, minor;
|
||||||
uint8_t eccA, eccB, temp;
|
uint8_t eccA, eccB, temp;
|
||||||
|
|
||||||
if(context == NULL || address == NULL || data == NULL || ecc == NULL)
|
if(context == NULL || address == NULL || data == NULL || ecc == NULL) return;
|
||||||
return;
|
|
||||||
|
|
||||||
ctx = (CdEccContext *)context;
|
ctx = (CdEccContext *)context;
|
||||||
|
|
||||||
if(!ctx->initedEdc)
|
if(!ctx->initedEdc) return;
|
||||||
return;
|
|
||||||
|
|
||||||
size = majorCount * minorCount;
|
size = majorCount * minorCount;
|
||||||
for(major = 0; major < majorCount; major++)
|
for(major = 0; major < majorCount; major++)
|
||||||
{
|
{
|
||||||
idx = (major >> 1) * majorMult + (major & 1);
|
idx = (major >> 1) * majorMult + (major & 1);
|
||||||
@@ -255,28 +230,27 @@ void ecc_cd_write(void *context,
|
|||||||
{
|
{
|
||||||
temp = idx < 4 ? address[idx + addressOffset] : data[idx + dataOffset - 4];
|
temp = idx < 4 ? address[idx + addressOffset] : data[idx + dataOffset - 4];
|
||||||
idx += minorInc;
|
idx += minorInc;
|
||||||
if(idx >= size)
|
if(idx >= size) idx -= size;
|
||||||
idx -= size;
|
|
||||||
eccA ^= temp;
|
eccA ^= temp;
|
||||||
eccB ^= temp;
|
eccB ^= temp;
|
||||||
eccA = ctx->eccFTable[eccA];
|
eccA = ctx->eccFTable[eccA];
|
||||||
}
|
}
|
||||||
|
|
||||||
eccA = ctx->eccBTable[ctx->eccFTable[eccA] ^ eccB];
|
eccA = ctx->eccBTable[ctx->eccFTable[eccA] ^ eccB];
|
||||||
ecc[major + eccOffset] = eccA;
|
ecc[major + eccOffset] = eccA;
|
||||||
ecc[major + majorCount + eccOffset] = (eccA ^ eccB);
|
ecc[major + majorCount + eccOffset] = (eccA ^ eccB);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ecc_cd_write_sector(void *context,
|
void ecc_cd_write_sector(void * context,
|
||||||
const uint8_t *address,
|
const uint8_t *address,
|
||||||
const uint8_t *data,
|
const uint8_t *data,
|
||||||
uint8_t *ecc,
|
uint8_t * ecc,
|
||||||
int32_t addressOffset,
|
int32_t addressOffset,
|
||||||
int32_t dataOffset,
|
int32_t dataOffset,
|
||||||
int32_t eccOffset)
|
int32_t eccOffset)
|
||||||
{
|
{
|
||||||
ecc_cd_write(context, address, data, 86, 24, 2, 86, ecc, addressOffset, dataOffset, eccOffset); // P
|
ecc_cd_write(context, address, data, 86, 24, 2, 86, ecc, addressOffset, dataOffset, eccOffset); // P
|
||||||
ecc_cd_write(context, address, data, 52, 43, 86, 88, ecc, addressOffset, dataOffset, eccOffset + 0xAC); // Q
|
ecc_cd_write(context, address, data, 52, 43, 86, 88, ecc, addressOffset, dataOffset, eccOffset + 0xAC); // Q
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -287,14 +261,13 @@ void cd_lba_to_msf(int64_t pos, uint8_t *minute, uint8_t *second, uint8_t *frame
|
|||||||
*frame = (uint8_t)((pos + 150) % 75);
|
*frame = (uint8_t)((pos + 150) % 75);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void ecc_cd_reconstruct_prefix(uint8_t *sector, // must point to a full 2352-byte sector
|
void ecc_cd_reconstruct_prefix(uint8_t *sector, // must point to a full 2352-byte sector
|
||||||
uint8_t type, int64_t lba)
|
uint8_t type,
|
||||||
|
int64_t lba)
|
||||||
{
|
{
|
||||||
uint8_t minute, second, frame;
|
uint8_t minute, second, frame;
|
||||||
|
|
||||||
if(sector == NULL)
|
if(sector == NULL) return;
|
||||||
return;
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Sync
|
// Sync
|
||||||
@@ -345,34 +318,36 @@ void ecc_cd_reconstruct_prefix(uint8_t *sector, // must point to a full 2352-byt
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ecc_cd_reconstruct(void *context, uint8_t *sector, // must point to a full 2352-byte sector
|
void ecc_cd_reconstruct(void * context,
|
||||||
uint8_t type)
|
uint8_t *sector, // must point to a full 2352-byte sector
|
||||||
|
uint8_t type)
|
||||||
{
|
{
|
||||||
uint32_t computedEdc;
|
uint32_t computedEdc;
|
||||||
uint8_t zeroaddress[4];
|
uint8_t zeroaddress[4];
|
||||||
|
|
||||||
CdEccContext *ctx;
|
CdEccContext *ctx;
|
||||||
|
|
||||||
if(context == NULL || sector == NULL)
|
if(context == NULL || sector == NULL) return;
|
||||||
return;
|
|
||||||
|
|
||||||
ctx = (CdEccContext *)context;
|
ctx = (CdEccContext *)context;
|
||||||
|
|
||||||
if(!ctx->initedEdc)
|
if(!ctx->initedEdc) return;
|
||||||
return;
|
|
||||||
|
|
||||||
switch(type)
|
switch(type)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
// Compute EDC
|
// Compute EDC
|
||||||
//
|
//
|
||||||
case CdMode1:computedEdc = edc_cd_compute(context, 0, sector, 0x810, 0);
|
case CdMode1:
|
||||||
|
computedEdc = edc_cd_compute(context, 0, sector, 0x810, 0);
|
||||||
memcpy(sector + 0x810, &computedEdc, 4);
|
memcpy(sector + 0x810, &computedEdc, 4);
|
||||||
break;
|
break;
|
||||||
case CdMode2Form1:computedEdc = edc_cd_compute(context, 0, sector, 0x808, 0x10);
|
case CdMode2Form1:
|
||||||
|
computedEdc = edc_cd_compute(context, 0, sector, 0x808, 0x10);
|
||||||
memcpy(sector + 0x818, &computedEdc, 4);
|
memcpy(sector + 0x818, &computedEdc, 4);
|
||||||
break;
|
break;
|
||||||
case CdMode2Form2:computedEdc = edc_cd_compute(context, 0, sector, 0x91C, 0x10);
|
case CdMode2Form2:
|
||||||
|
computedEdc = edc_cd_compute(context, 0, sector, 0x91C, 0x10);
|
||||||
memcpy(sector + 0x92C, &computedEdc, 4);
|
memcpy(sector + 0x92C, &computedEdc, 4);
|
||||||
break;
|
break;
|
||||||
default: return;
|
default: return;
|
||||||
@@ -399,8 +374,7 @@ void ecc_cd_reconstruct(void *context, uint8_t *sector, // must point to a full
|
|||||||
sector[0x81B] = 0x00;
|
sector[0x81B] = 0x00;
|
||||||
ecc_cd_write_sector(context, sector, sector, sector, 0xC, 0x10, 0x81C);
|
ecc_cd_write_sector(context, sector, sector, sector, 0xC, 0x10, 0x81C);
|
||||||
break;
|
break;
|
||||||
case CdMode2Form1:ecc_cd_write_sector(context, zeroaddress, sector, sector, 0, 0x10, 0x81C);
|
case CdMode2Form1: ecc_cd_write_sector(context, zeroaddress, sector, sector, 0, 0x10, 0x81C); break;
|
||||||
break;
|
|
||||||
default: return;
|
default: return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -413,16 +387,13 @@ uint32_t edc_cd_compute(void *context, uint32_t edc, const uint8_t *src, int siz
|
|||||||
{
|
{
|
||||||
CdEccContext *ctx;
|
CdEccContext *ctx;
|
||||||
|
|
||||||
if(context == NULL || src == NULL)
|
if(context == NULL || src == NULL) return 0;
|
||||||
return 0;
|
|
||||||
|
|
||||||
ctx = (CdEccContext *)context;
|
ctx = (CdEccContext *)context;
|
||||||
|
|
||||||
if(!ctx->initedEdc)
|
if(!ctx->initedEdc) return 0;
|
||||||
return 0;
|
|
||||||
|
|
||||||
for(; size > 0; size--)
|
for(; size > 0; size--) edc = (edc >> 8) ^ ctx->edcTable[(edc ^ src[pos++]) & 0xFF];
|
||||||
edc = (edc >> 8) ^ ctx->edcTable[(edc ^ src[pos++]) & 0xFF];
|
|
||||||
|
|
||||||
return edc;
|
return edc;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,9 +30,9 @@
|
|||||||
// Copyright © 2011-2019 Natalia Portillo
|
// Copyright © 2011-2019 Natalia Portillo
|
||||||
// ****************************************************************************/
|
// ****************************************************************************/
|
||||||
|
|
||||||
|
#include <dicformat.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <dicformat.h>
|
|
||||||
|
|
||||||
//! Identifies a file as dicformat, using path
|
//! Identifies a file as dicformat, using path
|
||||||
/*!
|
/*!
|
||||||
@@ -47,8 +47,7 @@ int identify(const char *filename)
|
|||||||
|
|
||||||
stream = fopen(filename, "rb");
|
stream = fopen(filename, "rb");
|
||||||
|
|
||||||
if(stream == NULL)
|
if(stream == NULL) return errno;
|
||||||
return errno;
|
|
||||||
|
|
||||||
int ret = identifyStream(stream);
|
int ret = identifyStream(stream);
|
||||||
|
|
||||||
@@ -72,11 +71,9 @@ int identifyStream(FILE *imageStream)
|
|||||||
|
|
||||||
size_t ret = fread(&header, sizeof(DicHeader), 1, imageStream);
|
size_t ret = fread(&header, sizeof(DicHeader), 1, imageStream);
|
||||||
|
|
||||||
if(ret < sizeof(DicHeader))
|
if(ret < sizeof(DicHeader)) return 0;
|
||||||
return 0;
|
|
||||||
|
|
||||||
if(header.identifier == DIC_MAGIC && header.imageMajorVersion <= DICF_VERSION)
|
if(header.identifier == DIC_MAGIC && header.imageMajorVersion <= DICF_VERSION) return 100;
|
||||||
return 100;
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
335
src/open.c
335
src/open.c
@@ -30,32 +30,31 @@
|
|||||||
// Copyright © 2011-2019 Natalia Portillo
|
// Copyright © 2011-2019 Natalia Portillo
|
||||||
// ****************************************************************************/
|
// ****************************************************************************/
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <dicformat.h>
|
#include <dicformat.h>
|
||||||
#include <malloc.h>
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
|
#include <malloc.h>
|
||||||
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
|
|
||||||
void *open(const char *filepath)
|
void *open(const char *filepath)
|
||||||
{
|
{
|
||||||
dicformatContext *ctx;
|
dicformatContext *ctx;
|
||||||
int errorNo;
|
int errorNo;
|
||||||
size_t readBytes;
|
size_t readBytes;
|
||||||
long pos;
|
long pos;
|
||||||
IndexHeader idxHeader;
|
IndexHeader idxHeader;
|
||||||
IndexEntry *idxEntries;
|
IndexEntry * idxEntries;
|
||||||
uint8_t *data;
|
uint8_t * data;
|
||||||
uint32_t *cdDdt;
|
uint32_t * cdDdt;
|
||||||
uint64_t crc64;
|
uint64_t crc64;
|
||||||
uint8_t temp8u;
|
uint8_t temp8u;
|
||||||
|
|
||||||
ctx = (dicformatContext *)malloc(sizeof(dicformatContext));
|
ctx = (dicformatContext *)malloc(sizeof(dicformatContext));
|
||||||
memset(ctx, 0, sizeof(dicformatContext));
|
memset(ctx, 0, sizeof(dicformatContext));
|
||||||
|
|
||||||
if(ctx == NULL)
|
if(ctx == NULL) return NULL;
|
||||||
return NULL;
|
|
||||||
|
|
||||||
ctx->imageStream = fopen(filepath, "rb");
|
ctx->imageStream = fopen(filepath, "rb");
|
||||||
|
|
||||||
@@ -159,7 +158,8 @@ void *open(const char *filepath)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(stderr, "libdicformat: Index at %"PRIu64" contains %d entries", ctx->header.indexOffset, idxHeader.entries);
|
fprintf(
|
||||||
|
stderr, "libdicformat: Index at %" PRIu64 " contains %d entries", ctx->header.indexOffset, idxHeader.entries);
|
||||||
|
|
||||||
idxEntries = (IndexEntry *)malloc(sizeof(IndexEntry) * idxHeader.entries);
|
idxEntries = (IndexEntry *)malloc(sizeof(IndexEntry) * idxHeader.entries);
|
||||||
|
|
||||||
@@ -186,13 +186,14 @@ void *open(const char *filepath)
|
|||||||
|
|
||||||
for(int i = 0; i < idxHeader.entries; i++)
|
for(int i = 0; i < idxHeader.entries; i++)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "libdicformat: Block type %4.4s with data type %4.4s is indexed to be at %"PRIu64"",
|
fprintf(stderr,
|
||||||
|
"libdicformat: Block type %4.4s with data type %4.4s is indexed to be at %" PRIu64 "",
|
||||||
(char *)&idxEntries[i].blockType,
|
(char *)&idxEntries[i].blockType,
|
||||||
(char *)&idxEntries[i].dataType,
|
(char *)&idxEntries[i].dataType,
|
||||||
idxEntries[i].offset);
|
idxEntries[i].offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool foundUserDataDdt = false;
|
bool foundUserDataDdt = false;
|
||||||
ctx->imageInfo.ImageSize = 0;
|
ctx->imageInfo.ImageSize = 0;
|
||||||
for(int i = 0; i < idxHeader.entries; i++)
|
for(int i = 0; i < idxHeader.entries; i++)
|
||||||
{
|
{
|
||||||
@@ -201,7 +202,7 @@ void *open(const char *filepath)
|
|||||||
if(pos < 0 || ftell(ctx->imageStream) != idxEntries[i].offset)
|
if(pos < 0 || ftell(ctx->imageStream) != idxEntries[i].offset)
|
||||||
{
|
{
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"libdicformat: Could not seek to %"PRIu64" as indicated by index entry %d, continuing...",
|
"libdicformat: Could not seek to %" PRIu64 " as indicated by index entry %d, continuing...",
|
||||||
idxEntries[i].offset,
|
idxEntries[i].offset,
|
||||||
i);
|
i);
|
||||||
|
|
||||||
@@ -215,14 +216,13 @@ void *open(const char *filepath)
|
|||||||
{
|
{
|
||||||
case DataBlock:
|
case DataBlock:
|
||||||
// NOP block, skip
|
// NOP block, skip
|
||||||
if(idxEntries[i].dataType == NoData)
|
if(idxEntries[i].dataType == NoData) break;
|
||||||
break;
|
|
||||||
|
|
||||||
readBytes = fread(&blockHeader, sizeof(BlockHeader), 1, ctx->imageStream);
|
readBytes = fread(&blockHeader, sizeof(BlockHeader), 1, ctx->imageStream);
|
||||||
|
|
||||||
if(readBytes != sizeof(BlockHeader))
|
if(readBytes != sizeof(BlockHeader))
|
||||||
{
|
{
|
||||||
fprintf(stderr, "libdicformat: Could not read block header at %"PRIu64"", idxEntries[i].offset);
|
fprintf(stderr, "libdicformat: Could not read block header at %" PRIu64 "", idxEntries[i].offset);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -241,7 +241,7 @@ void *open(const char *filepath)
|
|||||||
if(blockHeader.identifier != idxEntries[i].blockType)
|
if(blockHeader.identifier != idxEntries[i].blockType)
|
||||||
{
|
{
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"libdicformat: Incorrect identifier for data block at position %"PRIu64"",
|
"libdicformat: Incorrect identifier for data block at position %" PRIu64 "",
|
||||||
idxEntries[i].offset);
|
idxEntries[i].offset);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -249,14 +249,16 @@ void *open(const char *filepath)
|
|||||||
if(blockHeader.type != idxEntries[i].dataType)
|
if(blockHeader.type != idxEntries[i].dataType)
|
||||||
{
|
{
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"libdicformat: Expected block with data type %4.4s at position %"PRIu64" but found data type %4.4s",
|
"libdicformat: Expected block with data type %4.4s at position %" PRIu64
|
||||||
|
" but found data type %4.4s",
|
||||||
(char *)&idxEntries[i].blockType,
|
(char *)&idxEntries[i].blockType,
|
||||||
idxEntries[i].offset,
|
idxEntries[i].offset,
|
||||||
(char *)&blockHeader.type);
|
(char *)&blockHeader.type);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(stderr, "libdicformat: Found data block with type %4.4s at position %"PRIu64"",
|
fprintf(stderr,
|
||||||
|
"libdicformat: Found data block with type %4.4s at position %" PRIu64 "",
|
||||||
(char *)&idxEntries[i].blockType,
|
(char *)&idxEntries[i].blockType,
|
||||||
idxEntries[i].offset);
|
idxEntries[i].offset);
|
||||||
|
|
||||||
@@ -290,7 +292,8 @@ void *open(const char *filepath)
|
|||||||
if(crc64 != blockHeader.crc64)
|
if(crc64 != blockHeader.crc64)
|
||||||
{
|
{
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"libdicformat: Incorrect CRC found: 0x%"PRIx64" found, expected 0x%"PRIx64", continuing...",
|
"libdicformat: Incorrect CRC found: 0x%" PRIx64 " found, expected 0x%" PRIx64
|
||||||
|
", continuing...",
|
||||||
crc64,
|
crc64,
|
||||||
blockHeader.crc64);
|
blockHeader.crc64);
|
||||||
break;
|
break;
|
||||||
@@ -303,10 +306,7 @@ void *open(const char *filepath)
|
|||||||
{
|
{
|
||||||
case CdSectorPrefix:
|
case CdSectorPrefix:
|
||||||
case CdSectorPrefixCorrected:
|
case CdSectorPrefixCorrected:
|
||||||
if(idxEntries[i].dataType == CdSectorPrefixCorrected)
|
if(idxEntries[i].dataType == CdSectorPrefixCorrected) { ctx->sectorPrefixCorrected = data; }
|
||||||
{
|
|
||||||
ctx->sectorPrefixCorrected = data;
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
ctx->sectorPrefix = data;
|
ctx->sectorPrefix = data;
|
||||||
|
|
||||||
@@ -327,16 +327,17 @@ void *open(const char *filepath)
|
|||||||
ctx->readableSectorTags[CdSectorEccQ] = true;
|
ctx->readableSectorTags[CdSectorEccQ] = true;
|
||||||
ctx->readableSectorTags[CdSectorEdc] = true;
|
ctx->readableSectorTags[CdSectorEdc] = true;
|
||||||
break;
|
break;
|
||||||
case CdSectorSubchannel:ctx->sectorSubchannel = data;
|
case CdSectorSubchannel:
|
||||||
|
ctx->sectorSubchannel = data;
|
||||||
ctx->readableSectorTags[CdSectorSubchannel] = true;
|
ctx->readableSectorTags[CdSectorSubchannel] = true;
|
||||||
break;
|
break;
|
||||||
case AppleProfileTag:
|
case AppleProfileTag:
|
||||||
case AppleSonyTag:
|
case AppleSonyTag:
|
||||||
case PriamDataTowerTag:ctx->sectorSubchannel = data;
|
case PriamDataTowerTag:
|
||||||
|
ctx->sectorSubchannel = data;
|
||||||
ctx->readableSectorTags[AppleSectorTag] = true;
|
ctx->readableSectorTags[AppleSectorTag] = true;
|
||||||
break;
|
break;
|
||||||
case CompactDiscMode2Subheader:ctx->mode2Subheaders = data;
|
case CompactDiscMode2Subheader: ctx->mode2Subheaders = data; break;
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
if(ctx->mediaTagsHead != NULL)
|
if(ctx->mediaTagsHead != NULL)
|
||||||
{
|
{
|
||||||
@@ -359,8 +360,7 @@ void *open(const char *filepath)
|
|||||||
|
|
||||||
// If we mediaTag is NULL means we have arrived the end of the list without finding a duplicate
|
// If we mediaTag is NULL means we have arrived the end of the list without finding a duplicate
|
||||||
// or the list was empty
|
// or the list was empty
|
||||||
if(mediaTag != NULL)
|
if(mediaTag != NULL) break;
|
||||||
break;
|
|
||||||
|
|
||||||
mediaTag = (dataLinkedList *)malloc(sizeof(dataLinkedList));
|
mediaTag = (dataLinkedList *)malloc(sizeof(dataLinkedList));
|
||||||
|
|
||||||
@@ -375,10 +375,7 @@ void *open(const char *filepath)
|
|||||||
mediaTag->data = data;
|
mediaTag->data = data;
|
||||||
mediaTag->length = blockHeader.length;
|
mediaTag->length = blockHeader.length;
|
||||||
|
|
||||||
if(ctx->mediaTagsHead == NULL)
|
if(ctx->mediaTagsHead == NULL) { ctx->mediaTagsHead = mediaTag; }
|
||||||
{
|
|
||||||
ctx->mediaTagsHead = mediaTag;
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
mediaTag->previous = ctx->mediaTagsTail;
|
mediaTag->previous = ctx->mediaTagsTail;
|
||||||
@@ -391,11 +388,12 @@ void *open(const char *filepath)
|
|||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case DeDuplicationTable:readBytes = fread(&ddtHeader, sizeof(DdtHeader), 1, ctx->imageStream);
|
case DeDuplicationTable:
|
||||||
|
readBytes = fread(&ddtHeader, sizeof(DdtHeader), 1, ctx->imageStream);
|
||||||
|
|
||||||
if(readBytes != sizeof(DdtHeader))
|
if(readBytes != sizeof(DdtHeader))
|
||||||
{
|
{
|
||||||
fprintf(stderr, "libdicformat: Could not read block header at %"PRIu64"", idxEntries[i].offset);
|
fprintf(stderr, "libdicformat: Could not read block header at %" PRIu64 "", idxEntries[i].offset);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -412,14 +410,14 @@ void *open(const char *filepath)
|
|||||||
// Check for DDT compression
|
// Check for DDT compression
|
||||||
switch(ddtHeader.compression)
|
switch(ddtHeader.compression)
|
||||||
{
|
{
|
||||||
case None:ctx->mappedMemoryDdtSize = sizeof(uint64_t) * ddtHeader.entries;
|
case None:
|
||||||
ctx->userDataDdt =
|
ctx->mappedMemoryDdtSize = sizeof(uint64_t) * ddtHeader.entries;
|
||||||
mmap(NULL,
|
ctx->userDataDdt = mmap(NULL,
|
||||||
ctx->mappedMemoryDdtSize,
|
ctx->mappedMemoryDdtSize,
|
||||||
PROT_READ,
|
PROT_READ,
|
||||||
MAP_SHARED,
|
MAP_SHARED,
|
||||||
fileno(ctx->imageStream),
|
fileno(ctx->imageStream),
|
||||||
idxEntries[i].offset + sizeof(ddtHeader));
|
idxEntries[i].offset + sizeof(ddtHeader));
|
||||||
|
|
||||||
if(ctx->userDataDdt == MAP_FAILED)
|
if(ctx->userDataDdt == MAP_FAILED)
|
||||||
{
|
{
|
||||||
@@ -436,7 +434,6 @@ void *open(const char *filepath)
|
|||||||
blockHeader.compression);
|
blockHeader.compression);
|
||||||
foundUserDataDdt = false;
|
foundUserDataDdt = false;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(idxEntries[i].dataType == CdSectorPrefixCorrected ||
|
else if(idxEntries[i].dataType == CdSectorPrefixCorrected ||
|
||||||
@@ -444,7 +441,8 @@ void *open(const char *filepath)
|
|||||||
{
|
{
|
||||||
switch(ddtHeader.compression)
|
switch(ddtHeader.compression)
|
||||||
{
|
{
|
||||||
case None:cdDdt = (uint32_t *)malloc(ddtHeader.entries * sizeof(uint32_t));
|
case None:
|
||||||
|
cdDdt = (uint32_t *)malloc(ddtHeader.entries * sizeof(uint32_t));
|
||||||
|
|
||||||
if(mediaTag == NULL)
|
if(mediaTag == NULL)
|
||||||
{
|
{
|
||||||
@@ -478,7 +476,8 @@ void *open(const char *filepath)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
// Logical geometry block. It doesn't have a CRC coz, well, it's not so important
|
// Logical geometry block. It doesn't have a CRC coz, well, it's not so important
|
||||||
case GeometryBlock:readBytes = fread(&ctx->geometryBlock, sizeof(GeometryBlockHeader), 1, ctx->imageStream);
|
case GeometryBlock:
|
||||||
|
readBytes = fread(&ctx->geometryBlock, sizeof(GeometryBlockHeader), 1, ctx->imageStream);
|
||||||
|
|
||||||
if(readBytes != sizeof(GeometryBlockHeader))
|
if(readBytes != sizeof(GeometryBlockHeader))
|
||||||
{
|
{
|
||||||
@@ -504,11 +503,8 @@ void *open(const char *filepath)
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
// Metadata block
|
// Metadata block
|
||||||
case MetadataBlock: readBytes =
|
case MetadataBlock:
|
||||||
fread(&ctx->metadataBlockHeader,
|
readBytes = fread(&ctx->metadataBlockHeader, sizeof(MetadataBlockHeader), 1, ctx->imageStream);
|
||||||
sizeof(MetadataBlockHeader),
|
|
||||||
1,
|
|
||||||
ctx->imageStream);
|
|
||||||
|
|
||||||
if(readBytes != sizeof(MetadataBlockHeader))
|
if(readBytes != sizeof(MetadataBlockHeader))
|
||||||
{
|
{
|
||||||
@@ -521,7 +517,7 @@ void *open(const char *filepath)
|
|||||||
{
|
{
|
||||||
memset(&ctx->metadataBlockHeader, 0, sizeof(MetadataBlockHeader));
|
memset(&ctx->metadataBlockHeader, 0, sizeof(MetadataBlockHeader));
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"libdicformat: Incorrect identifier for data block at position %"PRIu64"",
|
"libdicformat: Incorrect identifier for data block at position %" PRIu64 "",
|
||||||
idxEntries[i].offset);
|
idxEntries[i].offset);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -558,7 +554,7 @@ void *open(const char *filepath)
|
|||||||
|
|
||||||
if(ctx->metadataBlockHeader.creatorLength > 0 &&
|
if(ctx->metadataBlockHeader.creatorLength > 0 &&
|
||||||
ctx->metadataBlockHeader.creatorOffset + ctx->metadataBlockHeader.creatorLength <=
|
ctx->metadataBlockHeader.creatorOffset + ctx->metadataBlockHeader.creatorLength <=
|
||||||
ctx->metadataBlockHeader.blockSize)
|
ctx->metadataBlockHeader.blockSize)
|
||||||
{
|
{
|
||||||
ctx->imageInfo.Creator = (uint8_t *)malloc(ctx->metadataBlockHeader.creatorLength);
|
ctx->imageInfo.Creator = (uint8_t *)malloc(ctx->metadataBlockHeader.creatorLength);
|
||||||
if(ctx->imageInfo.Creator != NULL)
|
if(ctx->imageInfo.Creator != NULL)
|
||||||
@@ -571,7 +567,7 @@ void *open(const char *filepath)
|
|||||||
|
|
||||||
if(ctx->metadataBlockHeader.commentsLength > 0 &&
|
if(ctx->metadataBlockHeader.commentsLength > 0 &&
|
||||||
ctx->metadataBlockHeader.commentsOffset + ctx->metadataBlockHeader.commentsLength <=
|
ctx->metadataBlockHeader.commentsOffset + ctx->metadataBlockHeader.commentsLength <=
|
||||||
ctx->metadataBlockHeader.blockSize)
|
ctx->metadataBlockHeader.blockSize)
|
||||||
{
|
{
|
||||||
ctx->imageInfo.Comments = (uint8_t *)malloc(ctx->metadataBlockHeader.commentsLength);
|
ctx->imageInfo.Comments = (uint8_t *)malloc(ctx->metadataBlockHeader.commentsLength);
|
||||||
if(ctx->imageInfo.Comments != NULL)
|
if(ctx->imageInfo.Comments != NULL)
|
||||||
@@ -584,7 +580,7 @@ void *open(const char *filepath)
|
|||||||
|
|
||||||
if(ctx->metadataBlockHeader.mediaTitleLength > 0 &&
|
if(ctx->metadataBlockHeader.mediaTitleLength > 0 &&
|
||||||
ctx->metadataBlockHeader.mediaTitleOffset + ctx->metadataBlockHeader.mediaTitleLength <=
|
ctx->metadataBlockHeader.mediaTitleOffset + ctx->metadataBlockHeader.mediaTitleLength <=
|
||||||
ctx->metadataBlockHeader.blockSize)
|
ctx->metadataBlockHeader.blockSize)
|
||||||
{
|
{
|
||||||
ctx->imageInfo.MediaTitle = (uint8_t *)malloc(ctx->metadataBlockHeader.mediaTitleLength);
|
ctx->imageInfo.MediaTitle = (uint8_t *)malloc(ctx->metadataBlockHeader.mediaTitleLength);
|
||||||
if(ctx->imageInfo.MediaTitle != NULL)
|
if(ctx->imageInfo.MediaTitle != NULL)
|
||||||
@@ -597,10 +593,11 @@ void *open(const char *filepath)
|
|||||||
|
|
||||||
if(ctx->metadataBlockHeader.mediaManufacturerLength > 0 &&
|
if(ctx->metadataBlockHeader.mediaManufacturerLength > 0 &&
|
||||||
ctx->metadataBlockHeader.mediaManufacturerOffset +
|
ctx->metadataBlockHeader.mediaManufacturerOffset +
|
||||||
ctx->metadataBlockHeader.mediaManufacturerLength <= ctx->metadataBlockHeader.blockSize)
|
ctx->metadataBlockHeader.mediaManufacturerLength <=
|
||||||
|
ctx->metadataBlockHeader.blockSize)
|
||||||
{
|
{
|
||||||
ctx->imageInfo.MediaManufacturer =
|
ctx->imageInfo.MediaManufacturer =
|
||||||
(uint8_t *)malloc(ctx->metadataBlockHeader.mediaManufacturerLength);
|
(uint8_t *)malloc(ctx->metadataBlockHeader.mediaManufacturerLength);
|
||||||
if(ctx->imageInfo.MediaManufacturer != NULL)
|
if(ctx->imageInfo.MediaManufacturer != NULL)
|
||||||
{
|
{
|
||||||
memcpy(ctx->imageInfo.MediaManufacturer,
|
memcpy(ctx->imageInfo.MediaManufacturer,
|
||||||
@@ -611,7 +608,7 @@ void *open(const char *filepath)
|
|||||||
|
|
||||||
if(ctx->metadataBlockHeader.mediaModelLength > 0 &&
|
if(ctx->metadataBlockHeader.mediaModelLength > 0 &&
|
||||||
ctx->metadataBlockHeader.mediaModelOffset + ctx->metadataBlockHeader.mediaModelLength <=
|
ctx->metadataBlockHeader.mediaModelOffset + ctx->metadataBlockHeader.mediaModelLength <=
|
||||||
ctx->metadataBlockHeader.blockSize)
|
ctx->metadataBlockHeader.blockSize)
|
||||||
{
|
{
|
||||||
ctx->imageInfo.MediaModel = (uint8_t *)malloc(ctx->metadataBlockHeader.mediaModelOffset);
|
ctx->imageInfo.MediaModel = (uint8_t *)malloc(ctx->metadataBlockHeader.mediaModelOffset);
|
||||||
if(ctx->imageInfo.MediaModel != NULL)
|
if(ctx->imageInfo.MediaModel != NULL)
|
||||||
@@ -624,10 +621,11 @@ void *open(const char *filepath)
|
|||||||
|
|
||||||
if(ctx->metadataBlockHeader.mediaSerialNumberLength > 0 &&
|
if(ctx->metadataBlockHeader.mediaSerialNumberLength > 0 &&
|
||||||
ctx->metadataBlockHeader.mediaSerialNumberOffset +
|
ctx->metadataBlockHeader.mediaSerialNumberOffset +
|
||||||
ctx->metadataBlockHeader.mediaSerialNumberLength <= ctx->metadataBlockHeader.blockSize)
|
ctx->metadataBlockHeader.mediaSerialNumberLength <=
|
||||||
|
ctx->metadataBlockHeader.blockSize)
|
||||||
{
|
{
|
||||||
ctx->imageInfo.MediaSerialNumber =
|
ctx->imageInfo.MediaSerialNumber =
|
||||||
(uint8_t *)malloc(ctx->metadataBlockHeader.mediaSerialNumberLength);
|
(uint8_t *)malloc(ctx->metadataBlockHeader.mediaSerialNumberLength);
|
||||||
if(ctx->imageInfo.MediaSerialNumber != NULL)
|
if(ctx->imageInfo.MediaSerialNumber != NULL)
|
||||||
{
|
{
|
||||||
memcpy(ctx->imageInfo.MediaSerialNumber,
|
memcpy(ctx->imageInfo.MediaSerialNumber,
|
||||||
@@ -638,7 +636,7 @@ void *open(const char *filepath)
|
|||||||
|
|
||||||
if(ctx->metadataBlockHeader.mediaBarcodeLength > 0 &&
|
if(ctx->metadataBlockHeader.mediaBarcodeLength > 0 &&
|
||||||
ctx->metadataBlockHeader.mediaBarcodeOffset + ctx->metadataBlockHeader.mediaBarcodeLength <=
|
ctx->metadataBlockHeader.mediaBarcodeOffset + ctx->metadataBlockHeader.mediaBarcodeLength <=
|
||||||
ctx->metadataBlockHeader.blockSize)
|
ctx->metadataBlockHeader.blockSize)
|
||||||
{
|
{
|
||||||
ctx->imageInfo.MediaBarcode = (uint8_t *)malloc(ctx->metadataBlockHeader.mediaBarcodeLength);
|
ctx->imageInfo.MediaBarcode = (uint8_t *)malloc(ctx->metadataBlockHeader.mediaBarcodeLength);
|
||||||
if(ctx->imageInfo.MediaBarcode != NULL)
|
if(ctx->imageInfo.MediaBarcode != NULL)
|
||||||
@@ -651,7 +649,7 @@ void *open(const char *filepath)
|
|||||||
|
|
||||||
if(ctx->metadataBlockHeader.mediaPartNumberLength > 0 &&
|
if(ctx->metadataBlockHeader.mediaPartNumberLength > 0 &&
|
||||||
ctx->metadataBlockHeader.mediaPartNumberOffset + ctx->metadataBlockHeader.mediaPartNumberLength <=
|
ctx->metadataBlockHeader.mediaPartNumberOffset + ctx->metadataBlockHeader.mediaPartNumberLength <=
|
||||||
ctx->metadataBlockHeader.blockSize)
|
ctx->metadataBlockHeader.blockSize)
|
||||||
{
|
{
|
||||||
ctx->imageInfo.MediaPartNumber = (uint8_t *)malloc(ctx->metadataBlockHeader.mediaPartNumberLength);
|
ctx->imageInfo.MediaPartNumber = (uint8_t *)malloc(ctx->metadataBlockHeader.mediaPartNumberLength);
|
||||||
if(ctx->imageInfo.MediaPartNumber != NULL)
|
if(ctx->imageInfo.MediaPartNumber != NULL)
|
||||||
@@ -664,10 +662,11 @@ void *open(const char *filepath)
|
|||||||
|
|
||||||
if(ctx->metadataBlockHeader.driveManufacturerLength > 0 &&
|
if(ctx->metadataBlockHeader.driveManufacturerLength > 0 &&
|
||||||
ctx->metadataBlockHeader.driveManufacturerOffset +
|
ctx->metadataBlockHeader.driveManufacturerOffset +
|
||||||
ctx->metadataBlockHeader.driveManufacturerLength <= ctx->metadataBlockHeader.blockSize)
|
ctx->metadataBlockHeader.driveManufacturerLength <=
|
||||||
|
ctx->metadataBlockHeader.blockSize)
|
||||||
{
|
{
|
||||||
ctx->imageInfo.DriveManufacturer =
|
ctx->imageInfo.DriveManufacturer =
|
||||||
(uint8_t *)malloc(ctx->metadataBlockHeader.driveManufacturerLength);
|
(uint8_t *)malloc(ctx->metadataBlockHeader.driveManufacturerLength);
|
||||||
if(ctx->imageInfo.DriveManufacturer != NULL)
|
if(ctx->imageInfo.DriveManufacturer != NULL)
|
||||||
{
|
{
|
||||||
memcpy(ctx->imageInfo.DriveManufacturer,
|
memcpy(ctx->imageInfo.DriveManufacturer,
|
||||||
@@ -678,7 +677,7 @@ void *open(const char *filepath)
|
|||||||
|
|
||||||
if(ctx->metadataBlockHeader.driveModelLength > 0 &&
|
if(ctx->metadataBlockHeader.driveModelLength > 0 &&
|
||||||
ctx->metadataBlockHeader.driveModelOffset + ctx->metadataBlockHeader.driveModelLength <=
|
ctx->metadataBlockHeader.driveModelOffset + ctx->metadataBlockHeader.driveModelLength <=
|
||||||
ctx->metadataBlockHeader.blockSize)
|
ctx->metadataBlockHeader.blockSize)
|
||||||
{
|
{
|
||||||
ctx->imageInfo.DriveModel = (uint8_t *)malloc(ctx->metadataBlockHeader.driveModelLength);
|
ctx->imageInfo.DriveModel = (uint8_t *)malloc(ctx->metadataBlockHeader.driveModelLength);
|
||||||
if(ctx->imageInfo.DriveModel != NULL)
|
if(ctx->imageInfo.DriveModel != NULL)
|
||||||
@@ -691,10 +690,11 @@ void *open(const char *filepath)
|
|||||||
|
|
||||||
if(ctx->metadataBlockHeader.driveSerialNumberLength > 0 &&
|
if(ctx->metadataBlockHeader.driveSerialNumberLength > 0 &&
|
||||||
ctx->metadataBlockHeader.driveSerialNumberOffset +
|
ctx->metadataBlockHeader.driveSerialNumberOffset +
|
||||||
ctx->metadataBlockHeader.driveSerialNumberLength <= ctx->metadataBlockHeader.blockSize)
|
ctx->metadataBlockHeader.driveSerialNumberLength <=
|
||||||
|
ctx->metadataBlockHeader.blockSize)
|
||||||
{
|
{
|
||||||
ctx->imageInfo.DriveSerialNumber =
|
ctx->imageInfo.DriveSerialNumber =
|
||||||
(uint8_t *)malloc(ctx->metadataBlockHeader.driveSerialNumberLength);
|
(uint8_t *)malloc(ctx->metadataBlockHeader.driveSerialNumberLength);
|
||||||
if(ctx->imageInfo.DriveSerialNumber != NULL)
|
if(ctx->imageInfo.DriveSerialNumber != NULL)
|
||||||
{
|
{
|
||||||
memcpy(ctx->imageInfo.DriveSerialNumber,
|
memcpy(ctx->imageInfo.DriveSerialNumber,
|
||||||
@@ -705,10 +705,11 @@ void *open(const char *filepath)
|
|||||||
|
|
||||||
if(ctx->metadataBlockHeader.driveManufacturerLength > 0 &&
|
if(ctx->metadataBlockHeader.driveManufacturerLength > 0 &&
|
||||||
ctx->metadataBlockHeader.driveFirmwareRevisionOffset +
|
ctx->metadataBlockHeader.driveFirmwareRevisionOffset +
|
||||||
ctx->metadataBlockHeader.driveManufacturerLength <= ctx->metadataBlockHeader.blockSize)
|
ctx->metadataBlockHeader.driveManufacturerLength <=
|
||||||
|
ctx->metadataBlockHeader.blockSize)
|
||||||
{
|
{
|
||||||
ctx->imageInfo.DriveFirmwareRevision =
|
ctx->imageInfo.DriveFirmwareRevision =
|
||||||
(uint8_t *)malloc(ctx->metadataBlockHeader.driveFirmwareRevisionLength);
|
(uint8_t *)malloc(ctx->metadataBlockHeader.driveFirmwareRevisionLength);
|
||||||
if(ctx->imageInfo.DriveFirmwareRevision != NULL)
|
if(ctx->imageInfo.DriveFirmwareRevision != NULL)
|
||||||
{
|
{
|
||||||
memcpy(ctx->imageInfo.DriveFirmwareRevision,
|
memcpy(ctx->imageInfo.DriveFirmwareRevision,
|
||||||
@@ -718,7 +719,8 @@ void *open(const char *filepath)
|
|||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case TracksBlock: readBytes = fread(&ctx->tracksHeader, sizeof(TracksHeader), 1, ctx->imageStream);
|
case TracksBlock:
|
||||||
|
readBytes = fread(&ctx->tracksHeader, sizeof(TracksHeader), 1, ctx->imageStream);
|
||||||
|
|
||||||
if(readBytes != sizeof(TracksHeader))
|
if(readBytes != sizeof(TracksHeader))
|
||||||
{
|
{
|
||||||
@@ -731,7 +733,7 @@ void *open(const char *filepath)
|
|||||||
{
|
{
|
||||||
memset(&ctx->tracksHeader, 0, sizeof(TracksHeader));
|
memset(&ctx->tracksHeader, 0, sizeof(TracksHeader));
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"libdicformat: Incorrect identifier for data block at position %"PRIu64"",
|
"libdicformat: Incorrect identifier for data block at position %" PRIu64 "",
|
||||||
idxEntries[i].offset);
|
idxEntries[i].offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -756,19 +758,19 @@ void *open(const char *filepath)
|
|||||||
}
|
}
|
||||||
|
|
||||||
crc64 =
|
crc64 =
|
||||||
crc64_data_ecma((const uint8_t *)ctx->trackEntries,
|
crc64_data_ecma((const uint8_t *)ctx->trackEntries, ctx->tracksHeader.entries * sizeof(TrackEntry));
|
||||||
ctx->tracksHeader.entries * sizeof(TrackEntry));
|
|
||||||
if(crc64 != ctx->tracksHeader.crc64)
|
if(crc64 != ctx->tracksHeader.crc64)
|
||||||
{
|
{
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"libdicformat: Incorrect CRC found: 0x%"PRIx64" found, expected 0x%"PRIx64", continuing...",
|
"libdicformat: Incorrect CRC found: 0x%" PRIx64 " found, expected 0x%" PRIx64
|
||||||
|
", continuing...",
|
||||||
crc64,
|
crc64,
|
||||||
ctx->tracksHeader.crc64);
|
ctx->tracksHeader.crc64);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"libdicformat: Found %d tracks at position %"PRIu64".",
|
"libdicformat: Found %d tracks at position %" PRIu64 ".",
|
||||||
ctx->tracksHeader.entries,
|
ctx->tracksHeader.entries,
|
||||||
idxEntries[i].offset);
|
idxEntries[i].offset);
|
||||||
|
|
||||||
@@ -788,25 +790,23 @@ void *open(const char *filepath)
|
|||||||
{
|
{
|
||||||
ctx->dataTracks = (TrackEntry *)malloc(sizeof(TrackEntry) * temp8u);
|
ctx->dataTracks = (TrackEntry *)malloc(sizeof(TrackEntry) * temp8u);
|
||||||
|
|
||||||
if(ctx->dataTracks == NULL)
|
if(ctx->dataTracks == NULL) break;
|
||||||
break;
|
|
||||||
|
|
||||||
ctx->numberOfDataTracks = temp8u;
|
ctx->numberOfDataTracks = temp8u;
|
||||||
|
|
||||||
for(i = 0, temp8u = 0; i < ctx->tracksHeader.entries; i++)
|
for(i = 0, temp8u = 0; i < ctx->tracksHeader.entries; i++)
|
||||||
{
|
{
|
||||||
if(ctx->trackEntries[i].sequence > 99)
|
if(ctx->trackEntries[i].sequence > 99) continue;
|
||||||
continue;
|
|
||||||
|
|
||||||
memcpy(&ctx->dataTracks[ctx->trackEntries[i].sequence],
|
memcpy(
|
||||||
&ctx->trackEntries[i],
|
&ctx->dataTracks[ctx->trackEntries[i].sequence], &ctx->trackEntries[i], sizeof(TrackEntry));
|
||||||
sizeof(TrackEntry));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
// CICM XML metadata block
|
// CICM XML metadata block
|
||||||
case CicmBlock:readBytes = fread(&ctx->cicmBlockHeader, sizeof(CicmMetadataBlock), 1, ctx->imageStream);
|
case CicmBlock:
|
||||||
|
readBytes = fread(&ctx->cicmBlockHeader, sizeof(CicmMetadataBlock), 1, ctx->imageStream);
|
||||||
|
|
||||||
if(readBytes != sizeof(CicmMetadataBlock))
|
if(readBytes != sizeof(CicmMetadataBlock))
|
||||||
{
|
{
|
||||||
@@ -819,7 +819,7 @@ void *open(const char *filepath)
|
|||||||
{
|
{
|
||||||
memset(&ctx->cicmBlockHeader, 0, sizeof(CicmMetadataBlock));
|
memset(&ctx->cicmBlockHeader, 0, sizeof(CicmMetadataBlock));
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"libdicformat: Incorrect identifier for data block at position %"PRIu64"",
|
"libdicformat: Incorrect identifier for data block at position %" PRIu64 "",
|
||||||
idxEntries[i].offset);
|
idxEntries[i].offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -844,14 +844,11 @@ void *open(const char *filepath)
|
|||||||
fprintf(stderr, "libdicformat: Could not read CICM XML metadata block, continuing...");
|
fprintf(stderr, "libdicformat: Could not read CICM XML metadata block, continuing...");
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(stderr, "libdicformat: Found CICM XML metadata block %"PRIu64".", idxEntries[i].offset);
|
fprintf(stderr, "libdicformat: Found CICM XML metadata block %" PRIu64 ".", idxEntries[i].offset);
|
||||||
break;
|
break;
|
||||||
// Dump hardware block
|
// Dump hardware block
|
||||||
case DumpHardwareBlock: readBytes =
|
case DumpHardwareBlock:
|
||||||
fread(&ctx->dumpHardwareHeader,
|
readBytes = fread(&ctx->dumpHardwareHeader, sizeof(DumpHardwareHeader), 1, ctx->imageStream);
|
||||||
sizeof(DumpHardwareHeader),
|
|
||||||
1,
|
|
||||||
ctx->imageStream);
|
|
||||||
|
|
||||||
if(readBytes != sizeof(DumpHardwareHeader))
|
if(readBytes != sizeof(DumpHardwareHeader))
|
||||||
{
|
{
|
||||||
@@ -864,7 +861,7 @@ void *open(const char *filepath)
|
|||||||
{
|
{
|
||||||
memset(&ctx->dumpHardwareHeader, 0, sizeof(DumpHardwareHeader));
|
memset(&ctx->dumpHardwareHeader, 0, sizeof(DumpHardwareHeader));
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"libdicformat: Incorrect identifier for data block at position %"PRIu64"",
|
"libdicformat: Incorrect identifier for data block at position %" PRIu64 "",
|
||||||
idxEntries[i].offset);
|
idxEntries[i].offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -880,7 +877,8 @@ void *open(const char *filepath)
|
|||||||
{
|
{
|
||||||
free(data);
|
free(data);
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"libdicformat: Incorrect CRC found: 0x%"PRIx64" found, expected 0x%"PRIx64", continuing...",
|
"libdicformat: Incorrect CRC found: 0x%" PRIx64 " found, expected 0x%" PRIx64
|
||||||
|
", continuing...",
|
||||||
crc64,
|
crc64,
|
||||||
ctx->dumpHardwareHeader.crc64);
|
ctx->dumpHardwareHeader.crc64);
|
||||||
break;
|
break;
|
||||||
@@ -891,9 +889,8 @@ void *open(const char *filepath)
|
|||||||
fseek(ctx->imageStream, -readBytes, SEEK_CUR);
|
fseek(ctx->imageStream, -readBytes, SEEK_CUR);
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx->dumpHardwareEntriesWithData =
|
ctx->dumpHardwareEntriesWithData = (DumpHardwareEntriesWithData *)malloc(
|
||||||
(DumpHardwareEntriesWithData *)malloc(sizeof(DumpHardwareEntriesWithData) *
|
sizeof(DumpHardwareEntriesWithData) * ctx->dumpHardwareHeader.entries);
|
||||||
ctx->dumpHardwareHeader.entries);
|
|
||||||
|
|
||||||
if(ctx->dumpHardwareEntriesWithData == NULL)
|
if(ctx->dumpHardwareEntriesWithData == NULL)
|
||||||
{
|
{
|
||||||
@@ -908,11 +905,8 @@ void *open(const char *filepath)
|
|||||||
|
|
||||||
for(uint16_t e = 0; e < ctx->dumpHardwareHeader.entries; e++)
|
for(uint16_t e = 0; e < ctx->dumpHardwareHeader.entries; e++)
|
||||||
{
|
{
|
||||||
readBytes =
|
readBytes = fread(
|
||||||
fread(&ctx->dumpHardwareEntriesWithData[e].entry,
|
&ctx->dumpHardwareEntriesWithData[e].entry, sizeof(DumpHardwareEntry), 1, ctx->imageStream);
|
||||||
sizeof(DumpHardwareEntry),
|
|
||||||
1,
|
|
||||||
ctx->imageStream);
|
|
||||||
|
|
||||||
if(readBytes != sizeof(DumpHardwareEntry))
|
if(readBytes != sizeof(DumpHardwareEntry))
|
||||||
{
|
{
|
||||||
@@ -924,22 +918,22 @@ void *open(const char *filepath)
|
|||||||
if(ctx->dumpHardwareEntriesWithData[e].entry.manufacturerLength > 0)
|
if(ctx->dumpHardwareEntriesWithData[e].entry.manufacturerLength > 0)
|
||||||
{
|
{
|
||||||
ctx->dumpHardwareEntriesWithData[e].manufacturer =
|
ctx->dumpHardwareEntriesWithData[e].manufacturer =
|
||||||
(uint8_t *)malloc(ctx->dumpHardwareEntriesWithData[e].entry.manufacturerLength);
|
(uint8_t *)malloc(ctx->dumpHardwareEntriesWithData[e].entry.manufacturerLength);
|
||||||
|
|
||||||
if(ctx->dumpHardwareEntriesWithData[e].manufacturer != NULL)
|
if(ctx->dumpHardwareEntriesWithData[e].manufacturer != NULL)
|
||||||
{
|
{
|
||||||
readBytes =
|
readBytes = fread(&ctx->dumpHardwareEntriesWithData[e].manufacturer,
|
||||||
fread(&ctx->dumpHardwareEntriesWithData[e].manufacturer,
|
ctx->dumpHardwareEntriesWithData[e].entry.manufacturerLength,
|
||||||
ctx->dumpHardwareEntriesWithData[e].entry.manufacturerLength,
|
1,
|
||||||
1,
|
ctx->imageStream);
|
||||||
ctx->imageStream);
|
|
||||||
|
|
||||||
if(readBytes != ctx->dumpHardwareEntriesWithData[e].entry.manufacturerLength)
|
if(readBytes != ctx->dumpHardwareEntriesWithData[e].entry.manufacturerLength)
|
||||||
{
|
{
|
||||||
free(ctx->dumpHardwareEntriesWithData[e].manufacturer);
|
free(ctx->dumpHardwareEntriesWithData[e].manufacturer);
|
||||||
ctx->dumpHardwareEntriesWithData[e].entry.manufacturerLength = 0;
|
ctx->dumpHardwareEntriesWithData[e].entry.manufacturerLength = 0;
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"libdicformat: Could not read dump hardware block entry manufacturer, continuing...");
|
"libdicformat: Could not read dump hardware block entry manufacturer, "
|
||||||
|
"continuing...");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -947,15 +941,14 @@ void *open(const char *filepath)
|
|||||||
if(ctx->dumpHardwareEntriesWithData[e].entry.modelLength > 0)
|
if(ctx->dumpHardwareEntriesWithData[e].entry.modelLength > 0)
|
||||||
{
|
{
|
||||||
ctx->dumpHardwareEntriesWithData[e].model =
|
ctx->dumpHardwareEntriesWithData[e].model =
|
||||||
(uint8_t *)malloc(ctx->dumpHardwareEntriesWithData[e].entry.modelLength);
|
(uint8_t *)malloc(ctx->dumpHardwareEntriesWithData[e].entry.modelLength);
|
||||||
|
|
||||||
if(ctx->dumpHardwareEntriesWithData[e].model != NULL)
|
if(ctx->dumpHardwareEntriesWithData[e].model != NULL)
|
||||||
{
|
{
|
||||||
readBytes =
|
readBytes = fread(&ctx->dumpHardwareEntriesWithData[e].model,
|
||||||
fread(&ctx->dumpHardwareEntriesWithData[e].model,
|
ctx->dumpHardwareEntriesWithData[e].entry.modelLength,
|
||||||
ctx->dumpHardwareEntriesWithData[e].entry.modelLength,
|
1,
|
||||||
1,
|
ctx->imageStream);
|
||||||
ctx->imageStream);
|
|
||||||
|
|
||||||
if(readBytes != ctx->dumpHardwareEntriesWithData[e].entry.modelLength)
|
if(readBytes != ctx->dumpHardwareEntriesWithData[e].entry.modelLength)
|
||||||
{
|
{
|
||||||
@@ -970,22 +963,22 @@ void *open(const char *filepath)
|
|||||||
if(ctx->dumpHardwareEntriesWithData[e].entry.revisionLength > 0)
|
if(ctx->dumpHardwareEntriesWithData[e].entry.revisionLength > 0)
|
||||||
{
|
{
|
||||||
ctx->dumpHardwareEntriesWithData[e].revision =
|
ctx->dumpHardwareEntriesWithData[e].revision =
|
||||||
(uint8_t *)malloc(ctx->dumpHardwareEntriesWithData[e].entry.revisionLength);
|
(uint8_t *)malloc(ctx->dumpHardwareEntriesWithData[e].entry.revisionLength);
|
||||||
|
|
||||||
if(ctx->dumpHardwareEntriesWithData[e].revision != NULL)
|
if(ctx->dumpHardwareEntriesWithData[e].revision != NULL)
|
||||||
{
|
{
|
||||||
readBytes =
|
readBytes = fread(&ctx->dumpHardwareEntriesWithData[e].revision,
|
||||||
fread(&ctx->dumpHardwareEntriesWithData[e].revision,
|
ctx->dumpHardwareEntriesWithData[e].entry.revisionLength,
|
||||||
ctx->dumpHardwareEntriesWithData[e].entry.revisionLength,
|
1,
|
||||||
1,
|
ctx->imageStream);
|
||||||
ctx->imageStream);
|
|
||||||
|
|
||||||
if(readBytes != ctx->dumpHardwareEntriesWithData[e].entry.revisionLength)
|
if(readBytes != ctx->dumpHardwareEntriesWithData[e].entry.revisionLength)
|
||||||
{
|
{
|
||||||
free(ctx->dumpHardwareEntriesWithData[e].revision);
|
free(ctx->dumpHardwareEntriesWithData[e].revision);
|
||||||
ctx->dumpHardwareEntriesWithData[e].entry.revisionLength = 0;
|
ctx->dumpHardwareEntriesWithData[e].entry.revisionLength = 0;
|
||||||
fprintf(stderr,
|
fprintf(
|
||||||
"libdicformat: Could not read dump hardware block entry revision, continuing...");
|
stderr,
|
||||||
|
"libdicformat: Could not read dump hardware block entry revision, continuing...");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -993,22 +986,22 @@ void *open(const char *filepath)
|
|||||||
if(ctx->dumpHardwareEntriesWithData[e].entry.firmwareLength > 0)
|
if(ctx->dumpHardwareEntriesWithData[e].entry.firmwareLength > 0)
|
||||||
{
|
{
|
||||||
ctx->dumpHardwareEntriesWithData[e].firmware =
|
ctx->dumpHardwareEntriesWithData[e].firmware =
|
||||||
(uint8_t *)malloc(ctx->dumpHardwareEntriesWithData[e].entry.firmwareLength);
|
(uint8_t *)malloc(ctx->dumpHardwareEntriesWithData[e].entry.firmwareLength);
|
||||||
|
|
||||||
if(ctx->dumpHardwareEntriesWithData[e].firmware != NULL)
|
if(ctx->dumpHardwareEntriesWithData[e].firmware != NULL)
|
||||||
{
|
{
|
||||||
readBytes =
|
readBytes = fread(&ctx->dumpHardwareEntriesWithData[e].firmware,
|
||||||
fread(&ctx->dumpHardwareEntriesWithData[e].firmware,
|
ctx->dumpHardwareEntriesWithData[e].entry.firmwareLength,
|
||||||
ctx->dumpHardwareEntriesWithData[e].entry.firmwareLength,
|
1,
|
||||||
1,
|
ctx->imageStream);
|
||||||
ctx->imageStream);
|
|
||||||
|
|
||||||
if(readBytes != ctx->dumpHardwareEntriesWithData[e].entry.firmwareLength)
|
if(readBytes != ctx->dumpHardwareEntriesWithData[e].entry.firmwareLength)
|
||||||
{
|
{
|
||||||
free(ctx->dumpHardwareEntriesWithData[e].firmware);
|
free(ctx->dumpHardwareEntriesWithData[e].firmware);
|
||||||
ctx->dumpHardwareEntriesWithData[e].entry.firmwareLength = 0;
|
ctx->dumpHardwareEntriesWithData[e].entry.firmwareLength = 0;
|
||||||
fprintf(stderr,
|
fprintf(
|
||||||
"libdicformat: Could not read dump hardware block entry firmware, continuing...");
|
stderr,
|
||||||
|
"libdicformat: Could not read dump hardware block entry firmware, continuing...");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1016,15 +1009,14 @@ void *open(const char *filepath)
|
|||||||
if(ctx->dumpHardwareEntriesWithData[e].entry.serialLength > 0)
|
if(ctx->dumpHardwareEntriesWithData[e].entry.serialLength > 0)
|
||||||
{
|
{
|
||||||
ctx->dumpHardwareEntriesWithData[e].serial =
|
ctx->dumpHardwareEntriesWithData[e].serial =
|
||||||
(uint8_t *)malloc(ctx->dumpHardwareEntriesWithData[e].entry.serialLength);
|
(uint8_t *)malloc(ctx->dumpHardwareEntriesWithData[e].entry.serialLength);
|
||||||
|
|
||||||
if(ctx->dumpHardwareEntriesWithData[e].serial != NULL)
|
if(ctx->dumpHardwareEntriesWithData[e].serial != NULL)
|
||||||
{
|
{
|
||||||
readBytes =
|
readBytes = fread(&ctx->dumpHardwareEntriesWithData[e].serial,
|
||||||
fread(&ctx->dumpHardwareEntriesWithData[e].serial,
|
ctx->dumpHardwareEntriesWithData[e].entry.serialLength,
|
||||||
ctx->dumpHardwareEntriesWithData[e].entry.serialLength,
|
1,
|
||||||
1,
|
ctx->imageStream);
|
||||||
ctx->imageStream);
|
|
||||||
|
|
||||||
if(readBytes != ctx->dumpHardwareEntriesWithData[e].entry.serialLength)
|
if(readBytes != ctx->dumpHardwareEntriesWithData[e].entry.serialLength)
|
||||||
{
|
{
|
||||||
@@ -1039,22 +1031,22 @@ void *open(const char *filepath)
|
|||||||
if(ctx->dumpHardwareEntriesWithData[e].entry.softwareNameLength > 0)
|
if(ctx->dumpHardwareEntriesWithData[e].entry.softwareNameLength > 0)
|
||||||
{
|
{
|
||||||
ctx->dumpHardwareEntriesWithData[e].softwareName =
|
ctx->dumpHardwareEntriesWithData[e].softwareName =
|
||||||
(uint8_t *)malloc(ctx->dumpHardwareEntriesWithData[e].entry.softwareNameLength);
|
(uint8_t *)malloc(ctx->dumpHardwareEntriesWithData[e].entry.softwareNameLength);
|
||||||
|
|
||||||
if(ctx->dumpHardwareEntriesWithData[e].softwareName != NULL)
|
if(ctx->dumpHardwareEntriesWithData[e].softwareName != NULL)
|
||||||
{
|
{
|
||||||
readBytes =
|
readBytes = fread(&ctx->dumpHardwareEntriesWithData[e].softwareName,
|
||||||
fread(&ctx->dumpHardwareEntriesWithData[e].softwareName,
|
ctx->dumpHardwareEntriesWithData[e].entry.softwareNameLength,
|
||||||
ctx->dumpHardwareEntriesWithData[e].entry.softwareNameLength,
|
1,
|
||||||
1,
|
ctx->imageStream);
|
||||||
ctx->imageStream);
|
|
||||||
|
|
||||||
if(readBytes != ctx->dumpHardwareEntriesWithData[e].entry.softwareNameLength)
|
if(readBytes != ctx->dumpHardwareEntriesWithData[e].entry.softwareNameLength)
|
||||||
{
|
{
|
||||||
free(ctx->dumpHardwareEntriesWithData[e].softwareName);
|
free(ctx->dumpHardwareEntriesWithData[e].softwareName);
|
||||||
ctx->dumpHardwareEntriesWithData[e].entry.softwareNameLength = 0;
|
ctx->dumpHardwareEntriesWithData[e].entry.softwareNameLength = 0;
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"libdicformat: Could not read dump hardware block entry software name, continuing...");
|
"libdicformat: Could not read dump hardware block entry software name, "
|
||||||
|
"continuing...");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1062,22 +1054,22 @@ void *open(const char *filepath)
|
|||||||
if(ctx->dumpHardwareEntriesWithData[e].entry.softwareVersionLength > 0)
|
if(ctx->dumpHardwareEntriesWithData[e].entry.softwareVersionLength > 0)
|
||||||
{
|
{
|
||||||
ctx->dumpHardwareEntriesWithData[e].softwareVersion =
|
ctx->dumpHardwareEntriesWithData[e].softwareVersion =
|
||||||
(uint8_t *)malloc(ctx->dumpHardwareEntriesWithData[e].entry.softwareVersionLength);
|
(uint8_t *)malloc(ctx->dumpHardwareEntriesWithData[e].entry.softwareVersionLength);
|
||||||
|
|
||||||
if(ctx->dumpHardwareEntriesWithData[e].softwareVersion != NULL)
|
if(ctx->dumpHardwareEntriesWithData[e].softwareVersion != NULL)
|
||||||
{
|
{
|
||||||
readBytes =
|
readBytes = fread(&ctx->dumpHardwareEntriesWithData[e].softwareVersion,
|
||||||
fread(&ctx->dumpHardwareEntriesWithData[e].softwareVersion,
|
ctx->dumpHardwareEntriesWithData[e].entry.softwareVersionLength,
|
||||||
ctx->dumpHardwareEntriesWithData[e].entry.softwareVersionLength,
|
1,
|
||||||
1,
|
ctx->imageStream);
|
||||||
ctx->imageStream);
|
|
||||||
|
|
||||||
if(readBytes != ctx->dumpHardwareEntriesWithData[e].entry.softwareVersionLength)
|
if(readBytes != ctx->dumpHardwareEntriesWithData[e].entry.softwareVersionLength)
|
||||||
{
|
{
|
||||||
free(ctx->dumpHardwareEntriesWithData[e].softwareVersion);
|
free(ctx->dumpHardwareEntriesWithData[e].softwareVersion);
|
||||||
ctx->dumpHardwareEntriesWithData[e].entry.softwareVersionLength = 0;
|
ctx->dumpHardwareEntriesWithData[e].entry.softwareVersionLength = 0;
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"libdicformat: Could not read dump hardware block entry software version, continuing...");
|
"libdicformat: Could not read dump hardware block entry software version, "
|
||||||
|
"continuing...");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1085,42 +1077,41 @@ void *open(const char *filepath)
|
|||||||
if(ctx->dumpHardwareEntriesWithData[e].entry.softwareOperatingSystemLength > 0)
|
if(ctx->dumpHardwareEntriesWithData[e].entry.softwareOperatingSystemLength > 0)
|
||||||
{
|
{
|
||||||
ctx->dumpHardwareEntriesWithData[e].softwareOperatingSystem =
|
ctx->dumpHardwareEntriesWithData[e].softwareOperatingSystem =
|
||||||
(uint8_t *)malloc(ctx->dumpHardwareEntriesWithData[e].entry
|
(uint8_t *)malloc(ctx->dumpHardwareEntriesWithData[e].entry.softwareOperatingSystemLength);
|
||||||
.softwareOperatingSystemLength);
|
|
||||||
|
|
||||||
if(ctx->dumpHardwareEntriesWithData[e].softwareOperatingSystem != NULL)
|
if(ctx->dumpHardwareEntriesWithData[e].softwareOperatingSystem != NULL)
|
||||||
{
|
{
|
||||||
readBytes =
|
readBytes = fread(&ctx->dumpHardwareEntriesWithData[e].softwareOperatingSystem,
|
||||||
fread(&ctx->dumpHardwareEntriesWithData[e].softwareOperatingSystem,
|
ctx->dumpHardwareEntriesWithData[e].entry.softwareOperatingSystemLength,
|
||||||
ctx->dumpHardwareEntriesWithData[e].entry.softwareOperatingSystemLength,
|
1,
|
||||||
1,
|
ctx->imageStream);
|
||||||
ctx->imageStream);
|
|
||||||
|
|
||||||
if(readBytes != ctx->dumpHardwareEntriesWithData[e].entry.softwareOperatingSystemLength)
|
if(readBytes != ctx->dumpHardwareEntriesWithData[e].entry.softwareOperatingSystemLength)
|
||||||
{
|
{
|
||||||
free(ctx->dumpHardwareEntriesWithData[e].softwareOperatingSystem);
|
free(ctx->dumpHardwareEntriesWithData[e].softwareOperatingSystem);
|
||||||
ctx->dumpHardwareEntriesWithData[e].entry.softwareOperatingSystemLength = 0;
|
ctx->dumpHardwareEntriesWithData[e].entry.softwareOperatingSystemLength = 0;
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"libdicformat: Could not read dump hardware block entry manufacturer, continuing...");
|
"libdicformat: Could not read dump hardware block entry manufacturer, "
|
||||||
|
"continuing...");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx->dumpHardwareEntriesWithData[e].extents =
|
ctx->dumpHardwareEntriesWithData[e].extents =
|
||||||
(DumpExtent *)malloc(sizeof(DumpExtent) * ctx->dumpHardwareEntriesWithData->entry.extents);
|
(DumpExtent *)malloc(sizeof(DumpExtent) * ctx->dumpHardwareEntriesWithData->entry.extents);
|
||||||
|
|
||||||
if(ctx->dumpHardwareEntriesWithData[e].extents == NULL)
|
if(ctx->dumpHardwareEntriesWithData[e].extents == NULL)
|
||||||
{
|
{
|
||||||
fprintf(stderr,
|
fprintf(
|
||||||
"libdicformat: Could not allocate memory for dump hardware block extents, continuing...");
|
stderr,
|
||||||
|
"libdicformat: Could not allocate memory for dump hardware block extents, continuing...");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
readBytes =
|
readBytes = fread(ctx->dumpHardwareEntriesWithData[e].extents,
|
||||||
fread(ctx->dumpHardwareEntriesWithData[e].extents,
|
sizeof(DumpExtent),
|
||||||
sizeof(DumpExtent),
|
ctx->dumpHardwareEntriesWithData[e].entry.extents,
|
||||||
ctx->dumpHardwareEntriesWithData[e].entry.extents,
|
ctx->imageStream);
|
||||||
ctx->imageStream);
|
|
||||||
|
|
||||||
if(readBytes != sizeof(DumpExtent) * ctx->dumpHardwareEntriesWithData->entry.extents)
|
if(readBytes != sizeof(DumpExtent) * ctx->dumpHardwareEntriesWithData->entry.extents)
|
||||||
{
|
{
|
||||||
@@ -1135,7 +1126,7 @@ void *open(const char *filepath)
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"libdicformat: Unhandled block type %4.4s with data type %4.4s is indexed to be at %"PRIu64"",
|
"libdicformat: Unhandled block type %4.4s with data type %4.4s is indexed to be at %" PRIu64 "",
|
||||||
(char *)&idxEntries[i].blockType,
|
(char *)&idxEntries[i].blockType,
|
||||||
(char *)&idxEntries[i].dataType,
|
(char *)&idxEntries[i].dataType,
|
||||||
idxEntries[i].offset);
|
idxEntries[i].offset);
|
||||||
@@ -1156,7 +1147,7 @@ void *open(const char *filepath)
|
|||||||
ctx->imageInfo.LastModificationTime = ctx->header.lastWrittenTime;
|
ctx->imageInfo.LastModificationTime = ctx->header.lastWrittenTime;
|
||||||
ctx->imageInfo.XmlMediaType = GetXmlMediaType(ctx->header.mediaType);
|
ctx->imageInfo.XmlMediaType = GetXmlMediaType(ctx->header.mediaType);
|
||||||
|
|
||||||
if(ctx->geometryBlock.identifier != GeometryBlock/* && ctx->imageInfo.XmlMediaType == XmlMediaType.BlockMedia*/)
|
if(ctx->geometryBlock.identifier != GeometryBlock && ctx->imageInfo.XmlMediaType == BlockMedia)
|
||||||
{
|
{
|
||||||
ctx->imageInfo.Cylinders = (uint32_t)(ctx->imageInfo.Sectors / 16 / 63);
|
ctx->imageInfo.Cylinders = (uint32_t)(ctx->imageInfo.Sectors / 16 / 63);
|
||||||
ctx->imageInfo.Heads = 16;
|
ctx->imageInfo.Heads = 16;
|
||||||
|
|||||||
126
src/read.c
126
src/read.c
@@ -37,16 +37,14 @@
|
|||||||
int32_t read_media_tag(void *context, uint8_t *data, int32_t tag, uint32_t *length)
|
int32_t read_media_tag(void *context, uint8_t *data, int32_t tag, uint32_t *length)
|
||||||
{
|
{
|
||||||
dicformatContext *ctx;
|
dicformatContext *ctx;
|
||||||
dataLinkedList *item;
|
dataLinkedList * item;
|
||||||
|
|
||||||
if(context == NULL)
|
if(context == NULL) return DICF_ERROR_NOT_DICFORMAT;
|
||||||
return DICF_ERROR_NOT_DICFORMAT;
|
|
||||||
|
|
||||||
ctx = context;
|
ctx = context;
|
||||||
|
|
||||||
// Not a libdicformat context
|
// Not a libdicformat context
|
||||||
if(ctx->magic != DIC_MAGIC)
|
if(ctx->magic != DIC_MAGIC) return DICF_ERROR_NOT_DICFORMAT;
|
||||||
return DICF_ERROR_NOT_DICFORMAT;
|
|
||||||
|
|
||||||
item = ctx->mediaTagsHead;
|
item = ctx->mediaTagsHead;
|
||||||
|
|
||||||
@@ -74,25 +72,22 @@ int32_t read_media_tag(void *context, uint8_t *data, int32_t tag, uint32_t *leng
|
|||||||
int32_t read_sector(void *context, uint64_t sectorAddress, uint8_t *data, uint32_t *length)
|
int32_t read_sector(void *context, uint64_t sectorAddress, uint8_t *data, uint32_t *length)
|
||||||
{
|
{
|
||||||
dicformatContext *ctx;
|
dicformatContext *ctx;
|
||||||
uint64_t ddtEntry;
|
uint64_t ddtEntry;
|
||||||
uint32_t offsetMask;
|
uint32_t offsetMask;
|
||||||
uint64_t offset;
|
uint64_t offset;
|
||||||
uint64_t blockOffset;
|
uint64_t blockOffset;
|
||||||
BlockHeader blockHeader;
|
BlockHeader blockHeader;
|
||||||
uint8_t *block;
|
uint8_t * block;
|
||||||
size_t readBytes;
|
size_t readBytes;
|
||||||
|
|
||||||
if(context == NULL)
|
if(context == NULL) return DICF_ERROR_NOT_DICFORMAT;
|
||||||
return DICF_ERROR_NOT_DICFORMAT;
|
|
||||||
|
|
||||||
ctx = context;
|
ctx = context;
|
||||||
|
|
||||||
// Not a libdicformat context
|
// Not a libdicformat context
|
||||||
if(ctx->magic != DIC_MAGIC)
|
if(ctx->magic != DIC_MAGIC) return DICF_ERROR_NOT_DICFORMAT;
|
||||||
return DICF_ERROR_NOT_DICFORMAT;
|
|
||||||
|
|
||||||
if(sectorAddress > ctx->imageInfo.Sectors - 1)
|
if(sectorAddress > ctx->imageInfo.Sectors - 1) return DICF_ERROR_SECTOR_OUT_OF_BOUNDS;
|
||||||
return DICF_ERROR_SECTOR_OUT_OF_BOUNDS;
|
|
||||||
|
|
||||||
ddtEntry = ctx->userDataDdt[sectorAddress];
|
ddtEntry = ctx->userDataDdt[sectorAddress];
|
||||||
offsetMask = (uint32_t)((1 << ctx->shift) - 1);
|
offsetMask = (uint32_t)((1 << ctx->shift) - 1);
|
||||||
@@ -114,8 +109,7 @@ int32_t read_sector(void *context, uint64_t sectorAddress, uint8_t *data, uint32
|
|||||||
fseek(ctx->imageStream, blockOffset, SEEK_SET);
|
fseek(ctx->imageStream, blockOffset, SEEK_SET);
|
||||||
readBytes = fread(&blockHeader, sizeof(BlockHeader), 1, ctx->imageStream);
|
readBytes = fread(&blockHeader, sizeof(BlockHeader), 1, ctx->imageStream);
|
||||||
|
|
||||||
if(readBytes != sizeof(BlockHeader))
|
if(readBytes != sizeof(BlockHeader)) return DICF_ERROR_CANNOT_READ_HEADER;
|
||||||
return DICF_ERROR_CANNOT_READ_HEADER;
|
|
||||||
|
|
||||||
if(data == NULL || *length < blockHeader.sectorSize)
|
if(data == NULL || *length < blockHeader.sectorSize)
|
||||||
{
|
{
|
||||||
@@ -126,9 +120,9 @@ int32_t read_sector(void *context, uint64_t sectorAddress, uint8_t *data, uint32
|
|||||||
// Decompress block
|
// Decompress block
|
||||||
switch(blockHeader.compression)
|
switch(blockHeader.compression)
|
||||||
{
|
{
|
||||||
case None:block = (uint8_t *)malloc(blockHeader.length);
|
case None:
|
||||||
if(block == NULL)
|
block = (uint8_t *)malloc(blockHeader.length);
|
||||||
return DICF_ERROR_NOT_ENOUGH_MEMORY;
|
if(block == NULL) return DICF_ERROR_NOT_ENOUGH_MEMORY;
|
||||||
|
|
||||||
readBytes = fread(block, blockHeader.length, 1, ctx->imageStream);
|
readBytes = fread(block, blockHeader.length, 1, ctx->imageStream);
|
||||||
|
|
||||||
@@ -139,7 +133,7 @@ int32_t read_sector(void *context, uint64_t sectorAddress, uint8_t *data, uint32
|
|||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
default:return DICF_ERROR_UNSUPPORTED_COMPRESSION;
|
default: return DICF_ERROR_UNSUPPORTED_COMPRESSION;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if cache needs to be emptied
|
// Check if cache needs to be emptied
|
||||||
@@ -157,26 +151,21 @@ int32_t read_sector(void *context, uint64_t sectorAddress, uint8_t *data, uint32
|
|||||||
int32_t read_track_sector(void *context, uint8_t *data, uint64_t sectorAddress, uint32_t *length, uint8_t track)
|
int32_t read_track_sector(void *context, uint8_t *data, uint64_t sectorAddress, uint32_t *length, uint8_t track)
|
||||||
{
|
{
|
||||||
dicformatContext *ctx;
|
dicformatContext *ctx;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if(context == NULL)
|
if(context == NULL) return DICF_ERROR_NOT_DICFORMAT;
|
||||||
return DICF_ERROR_NOT_DICFORMAT;
|
|
||||||
|
|
||||||
ctx = context;
|
ctx = context;
|
||||||
|
|
||||||
// Not a libdicformat context
|
// Not a libdicformat context
|
||||||
if(ctx->magic != DIC_MAGIC)
|
if(ctx->magic != DIC_MAGIC) return DICF_ERROR_NOT_DICFORMAT;
|
||||||
return DICF_ERROR_NOT_DICFORMAT;
|
|
||||||
|
|
||||||
if(ctx->imageInfo.XmlMediaType != OpticalDisc)
|
if(ctx->imageInfo.XmlMediaType != OpticalDisc) return DICF_ERROR_INCORRECT_MEDIA_TYPE;
|
||||||
return DICF_ERROR_INCORRECT_MEDIA_TYPE;
|
|
||||||
|
|
||||||
for(i = 0; i < ctx->numberOfDataTracks; i++)
|
for(i = 0; i < ctx->numberOfDataTracks; i++)
|
||||||
{
|
{
|
||||||
if(ctx->dataTracks[i].sequence == track)
|
if(ctx->dataTracks[i].sequence == track)
|
||||||
{
|
{ return read_sector(context, ctx->dataTracks[i].start + sectorAddress, data, length); }
|
||||||
return read_sector(context, ctx->dataTracks[i].start + sectorAddress, data, length);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return DICF_ERROR_TRACK_NOT_FOUND;
|
return DICF_ERROR_TRACK_NOT_FOUND;
|
||||||
@@ -185,22 +174,20 @@ int32_t read_track_sector(void *context, uint8_t *data, uint64_t sectorAddress,
|
|||||||
int32_t read_sector_long(void *context, uint8_t *data, uint64_t sectorAddress, uint32_t *length)
|
int32_t read_sector_long(void *context, uint8_t *data, uint64_t sectorAddress, uint32_t *length)
|
||||||
{
|
{
|
||||||
dicformatContext *ctx;
|
dicformatContext *ctx;
|
||||||
uint32_t bareLength;
|
uint32_t bareLength;
|
||||||
uint32_t tagLength;
|
uint32_t tagLength;
|
||||||
uint8_t *bareData;
|
uint8_t * bareData;
|
||||||
int32_t res;
|
int32_t res;
|
||||||
TrackEntry trk;
|
TrackEntry trk;
|
||||||
int i;
|
int i;
|
||||||
bool trkFound;
|
bool trkFound;
|
||||||
|
|
||||||
if(context == NULL)
|
if(context == NULL) return DICF_ERROR_NOT_DICFORMAT;
|
||||||
return DICF_ERROR_NOT_DICFORMAT;
|
|
||||||
|
|
||||||
ctx = context;
|
ctx = context;
|
||||||
|
|
||||||
// Not a libdicformat context
|
// Not a libdicformat context
|
||||||
if(ctx->magic != DIC_MAGIC)
|
if(ctx->magic != DIC_MAGIC) return DICF_ERROR_NOT_DICFORMAT;
|
||||||
return DICF_ERROR_NOT_DICFORMAT;
|
|
||||||
|
|
||||||
switch(ctx->imageInfo.XmlMediaType)
|
switch(ctx->imageInfo.XmlMediaType)
|
||||||
{
|
{
|
||||||
@@ -219,13 +206,11 @@ int32_t read_sector_long(void *context, uint8_t *data, uint64_t sectorAddress, u
|
|||||||
|
|
||||||
bareData = (uint8_t *)malloc(bareLength);
|
bareData = (uint8_t *)malloc(bareLength);
|
||||||
|
|
||||||
if(bareData == NULL)
|
if(bareData == NULL) return DICF_ERROR_NOT_ENOUGH_MEMORY;
|
||||||
return DICF_ERROR_NOT_ENOUGH_MEMORY;
|
|
||||||
|
|
||||||
res = read_sector(context, sectorAddress, bareData, &bareLength);
|
res = read_sector(context, sectorAddress, bareData, &bareLength);
|
||||||
|
|
||||||
if(res < DICF_STATUS_OK)
|
if(res < DICF_STATUS_OK) return res;
|
||||||
return res;
|
|
||||||
|
|
||||||
trkFound = false;
|
trkFound = false;
|
||||||
|
|
||||||
@@ -239,15 +224,14 @@ int32_t read_sector_long(void *context, uint8_t *data, uint64_t sectorAddress, u
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!trkFound)
|
if(!trkFound) return DICF_ERROR_TRACK_NOT_FOUND;
|
||||||
return DICF_ERROR_TRACK_NOT_FOUND;
|
|
||||||
|
|
||||||
switch(trk.type)
|
switch(trk.type)
|
||||||
{
|
{
|
||||||
case Audio:
|
case Audio:
|
||||||
case Data:memcpy(bareData, data, bareLength);
|
case Data: memcpy(bareData, data, bareLength); return res;
|
||||||
return res;
|
case CdMode1:
|
||||||
case CdMode1:memcpy(bareData, data + 16, 2048);
|
memcpy(bareData, data + 16, 2048);
|
||||||
|
|
||||||
if(ctx->sectorPrefix != NULL)
|
if(ctx->sectorPrefix != NULL)
|
||||||
memcpy(data, ctx->sectorPrefix + (sectorAddress * 16), 16);
|
memcpy(data, ctx->sectorPrefix + (sectorAddress * 16), 16);
|
||||||
@@ -266,7 +250,7 @@ int32_t read_sector_long(void *context, uint8_t *data, uint64_t sectorAddress, u
|
|||||||
{
|
{
|
||||||
memcpy(data,
|
memcpy(data,
|
||||||
ctx->sectorPrefixCorrected +
|
ctx->sectorPrefixCorrected +
|
||||||
((ctx->sectorPrefixDdt[sectorAddress] & CD_DFIX_MASK) - 1) * 16,
|
((ctx->sectorPrefixDdt[sectorAddress] & CD_DFIX_MASK) - 1) * 16,
|
||||||
16);
|
16);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -279,7 +263,6 @@ int32_t read_sector_long(void *context, uint8_t *data, uint64_t sectorAddress, u
|
|||||||
{
|
{
|
||||||
if((ctx->sectorSuffixDdt[sectorAddress] & CD_XFIX_MASK) == Correct)
|
if((ctx->sectorSuffixDdt[sectorAddress] & CD_XFIX_MASK) == Correct)
|
||||||
{
|
{
|
||||||
|
|
||||||
ecc_cd_reconstruct(ctx->eccCdContext, data, trk.type);
|
ecc_cd_reconstruct(ctx->eccCdContext, data, trk.type);
|
||||||
res = DICF_STATUS_OK;
|
res = DICF_STATUS_OK;
|
||||||
}
|
}
|
||||||
@@ -291,7 +274,7 @@ int32_t read_sector_long(void *context, uint8_t *data, uint64_t sectorAddress, u
|
|||||||
{
|
{
|
||||||
memcpy(data + 2064,
|
memcpy(data + 2064,
|
||||||
ctx->sectorSuffixCorrected +
|
ctx->sectorSuffixCorrected +
|
||||||
((ctx->sectorSuffixDdt[sectorAddress] & CD_DFIX_MASK) - 1) * 288,
|
((ctx->sectorSuffixDdt[sectorAddress] & CD_DFIX_MASK) - 1) * 288,
|
||||||
288);
|
288);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -319,7 +302,7 @@ int32_t read_sector_long(void *context, uint8_t *data, uint64_t sectorAddress, u
|
|||||||
{
|
{
|
||||||
memcpy(data,
|
memcpy(data,
|
||||||
ctx->sectorPrefixCorrected +
|
ctx->sectorPrefixCorrected +
|
||||||
((ctx->sectorPrefixDdt[sectorAddress] & CD_DFIX_MASK) - 1) * 16,
|
((ctx->sectorPrefixDdt[sectorAddress] & CD_DFIX_MASK) - 1) * 16,
|
||||||
16);
|
16);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -352,7 +335,7 @@ int32_t read_sector_long(void *context, uint8_t *data, uint64_t sectorAddress, u
|
|||||||
memcpy(data + 16, bareData, 2336);
|
memcpy(data + 16, bareData, 2336);
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
default:return DICF_ERROR_INVALID_TRACK_FORMAT;
|
default: return DICF_ERROR_INVALID_TRACK_FORMAT;
|
||||||
}
|
}
|
||||||
case BlockMedia:
|
case BlockMedia:
|
||||||
switch(ctx->imageInfo.MediaType)
|
switch(ctx->imageInfo.MediaType)
|
||||||
@@ -363,21 +346,17 @@ int32_t read_sector_long(void *context, uint8_t *data, uint64_t sectorAddress, u
|
|||||||
case AppleSonyDS:
|
case AppleSonyDS:
|
||||||
case AppleWidget:
|
case AppleWidget:
|
||||||
case PriamDataTower:
|
case PriamDataTower:
|
||||||
if(ctx->sectorSubchannel == NULL)
|
if(ctx->sectorSubchannel == NULL) return read_sector(context, sectorAddress, data, length);
|
||||||
return read_sector(context, sectorAddress, data, length);
|
|
||||||
|
|
||||||
switch(ctx->imageInfo.MediaType)
|
switch(ctx->imageInfo.MediaType)
|
||||||
{
|
{
|
||||||
case AppleFileWare:
|
case AppleFileWare:
|
||||||
case AppleProfile:
|
case AppleProfile:
|
||||||
case AppleWidget:tagLength = 20;
|
case AppleWidget: tagLength = 20; break;
|
||||||
break;
|
|
||||||
case AppleSonySS:
|
case AppleSonySS:
|
||||||
case AppleSonyDS:tagLength = 12;
|
case AppleSonyDS: tagLength = 12; break;
|
||||||
break;
|
case PriamDataTower: tagLength = 24; break;
|
||||||
case PriamDataTower:tagLength = 24;
|
default: return DICF_ERROR_INCORRECT_MEDIA_TYPE;
|
||||||
break;
|
|
||||||
default:return DICF_ERROR_INCORRECT_MEDIA_TYPE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bareLength = 512;
|
bareLength = 512;
|
||||||
@@ -390,13 +369,11 @@ int32_t read_sector_long(void *context, uint8_t *data, uint64_t sectorAddress, u
|
|||||||
|
|
||||||
bareData = malloc(bareLength);
|
bareData = malloc(bareLength);
|
||||||
|
|
||||||
if(bareData == NULL)
|
if(bareData == NULL) return DICF_ERROR_NOT_ENOUGH_MEMORY;
|
||||||
return DICF_ERROR_NOT_ENOUGH_MEMORY;
|
|
||||||
|
|
||||||
res = read_sector(context, sectorAddress, bareData, &bareLength);
|
res = read_sector(context, sectorAddress, bareData, &bareLength);
|
||||||
|
|
||||||
if(bareLength != 512)
|
if(bareLength != 512) return res;
|
||||||
return res;
|
|
||||||
|
|
||||||
memcpy(data, ctx->sectorSubchannel + sectorAddress * tagLength, tagLength);
|
memcpy(data, ctx->sectorSubchannel + sectorAddress * tagLength, tagLength);
|
||||||
memcpy(data, bareData, 512);
|
memcpy(data, bareData, 512);
|
||||||
@@ -404,9 +381,8 @@ int32_t read_sector_long(void *context, uint8_t *data, uint64_t sectorAddress, u
|
|||||||
free(bareData);
|
free(bareData);
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
default:return DICF_ERROR_INCORRECT_MEDIA_TYPE;
|
default: return DICF_ERROR_INCORRECT_MEDIA_TYPE;
|
||||||
|
|
||||||
}
|
}
|
||||||
default:return DICF_ERROR_INCORRECT_MEDIA_TYPE;
|
default: return DICF_ERROR_INCORRECT_MEDIA_TYPE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user