1 #pragma once 2 3 #include "Types.h" 4 #include "Stream.h" 5 6 class CIszImageStream : public Framework::CStream 7 { 8 public: 9 CIszImageStream(Framework::CStream*); 10 virtual ~CIszImageStream(); 11 12 virtual void Seek(int64, Framework::STREAM_SEEK_DIRECTION) override; 13 virtual uint64 Tell() override; 14 virtual uint64 Read(void*, uint64) override; 15 virtual uint64 Write(const void*, uint64) override; 16 virtual bool IsEOF() override; 17 18 private: 19 #pragma pack(push, 1) 20 struct HEADER 21 { 22 char signature[4]; 23 uint8 headerSize; 24 int8 version; 25 uint32 volumeSerialNumber; 26 27 uint16 sectorSize; 28 uint32 totalSectors; 29 30 int8 hasPassword; 31 32 int64 segmentSize; 33 34 uint32 blockNumber; 35 uint32 blockSize; 36 uint8 blockPtrLength; 37 38 int8 segmentNumber; 39 40 uint32 blockPtrOffset; 41 uint32 segmentPtrOffset; 42 uint32 dataOffset; 43 44 int8 reserved; 45 }; 46 #pragma pack(pop) 47 48 struct BLOCKDESCRIPTOR 49 { 50 uint32 size; 51 uint8 storageType; 52 }; 53 54 enum HASPASSWORD 55 { 56 ADI_PLAIN = 0, 57 ADI_PASSWORD = 1, 58 ADI_AES128 = 2, 59 ADI_AES192 = 3, 60 ADI_AES256 = 4 61 }; 62 63 enum STORAGETYPE 64 { 65 ADI_ZERO = 0, 66 ADI_DATA = 1, 67 ADI_ZLIB = 2, 68 ADI_BZ2 = 3 69 }; 70 71 void ReadBlockDescriptorTable(); 72 uint64 GetTotalSize() const; 73 const BLOCKDESCRIPTOR& SeekToBlock(uint64); 74 void SyncCache(); 75 76 void ReadZeroBlock(uint32); 77 void ReadDataBlock(uint32); 78 void ReadGzipBlock(uint32); 79 void ReadBz2Block(uint32); 80 81 Framework::CStream* m_baseStream = nullptr; 82 HEADER m_header; 83 BLOCKDESCRIPTOR* m_blockDescriptorTable = nullptr; 84 int64 m_cachedBlockNumber = -1; 85 uint8* m_cachedBlock = nullptr; 86 uint8* m_readBuffer = nullptr; 87 uint64 m_position = 0; 88 }; 89