//this file is part of eMule //Copyright (C)2002 Merkur ( merkur-@users.sourceforge.net / http://www.emule-project.net ) // //This program is free software; you can redistribute it and/or //modify it under the terms of the GNU General Public License //as published by the Free Software Foundation; either //version 2 of the License, or (at your option) any later version. // //This program is distributed in the hope that it will be useful, //but WITHOUT ANY WARRANTY; without even the implied warranty of //MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //GNU General Public License for more details. // //You should have received a copy of the GNU General Public License //along with this program; if not, write to the Free Software //Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #pragma once #include "loggable.h" class CPartFile; struct Gap_Struct; #define ZIP_LOCAL_HEADER_MAGIC 0x04034b50 #define ZIP_LOCAL_HEADER_EXT_MAGIC 0x08074b50 #define ZIP_CD_MAGIC 0x02014b50 #define ZIP_END_CD_MAGIC 0x06054b50 #define ZIP_COMMENT "Recovered by eMule" #define RAR_HEAD_FILE 0x74 #define RAR_START_OF_FILE { \ 0x52, 0x61, 0x72, 0x21, 0x1a, 0x07, 0x00, 0x08, 0x1A, 0x73, 0x02, 0x00, 0x3B, 0x00, 0x00, 0x00, \ 0x00, 0x00, 0x00, 0x00, 0xCA, 0x44, 0x75, 0x00, 0x00, 0x2E, 0x00, 0x12, 0x00, 0x14, 0x34, 0x2B, \ 0x4A, 0x08, 0x15, 0x48, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0A, 0x2B, 0xF9, 0x0E, 0xE2, 0xC1, \ 0x32, 0xFB, 0x9E, 0x04, 0x10, 0x50, 0xD7, 0xFE, 0xCD, 0x75, 0x87, 0x9C, 0x28, 0x85, 0xDF, 0xA3, \ 0x97, 0xE0 } #pragma pack(1) //??? struct ZIP_Entry { uint32 header; uint16 versionToExtract; uint16 generalPurposeFlag; uint16 compressionMethod; uint16 lastModFileTime; uint16 lastModFileDate; uint32 crc32; uint32 lenCompressed; uint32 lenUncompressed; uint16 lenFilename; uint16 lenExtraField; BYTE *filename; BYTE *extraField; BYTE *compressedData; }; #pragma pack() #pragma pack(1) struct ZIP_CentralDirectory { uint32 header; uint16 versionMadeBy; uint16 versionToExtract; uint16 generalPurposeFlag; uint16 compressionMethod; uint16 lastModFileTime; uint16 lastModFileDate; uint32 crc32; uint32 lenCompressed; uint32 lenUnompressed; uint16 lenFilename; uint16 lenExtraField; uint16 lenComment; uint16 diskNumberStart; uint16 internalFileAttributes; uint32 externalFileAttributes; uint32 relativeOffsetOfLocalHeader; BYTE *filename; BYTE *extraField; BYTE *comment; }; #pragma pack() #pragma pack(1) struct RAR_BlockFile { // This indicates the position in the input file just after the filename ULONGLONG offsetData; // This indicates how much of the block is after this offset uint32 dataLength; uint16 HEAD_CRC; BYTE HEAD_TYPE; uint16 HEAD_FLAGS; uint16 HEAD_SIZE; uint32 PACK_SIZE; uint32 UNP_SIZE; BYTE HOST_OS; uint32 FILE_CRC; uint32 FTIME; BYTE UNP_VER; BYTE METHOD; uint16 NAME_SIZE; uint32 ATTR; uint32 HIGH_PACK_SIZE; uint32 HIGH_UNP_SIZE; BYTE *FILE_NAME; }; #pragma pack() struct ThreadParam { CPartFile *partFile; CTypedPtrList *filled; bool preview; }; class CArchiveRecovery: public CLoggable { public: static void recover(CPartFile *partFile, bool preview = false); private: CArchiveRecovery(void); // Just use static recover method static UINT AFX_CDECL run(LPVOID lpParam); static bool performRecovery(CPartFile *partFile, CTypedPtrList *filled, bool preview); static bool recoverZip(CFile *zipInput, CFile *zipOutput, CTypedPtrList *filled, bool fullSize); static bool recoverRar(CFile *rarInput, CFile *rarOutput, CTypedPtrList *filled); static bool scanForZipMarker(CFile *input, uint32 marker, uint32 available); static bool processZipEntry(CFile *zipInput, CFile *zipOutput, uint32 available, CTypedPtrList *centralDirectoryEntries); static bool readZipCentralDirectory(CFile *zipInput, CTypedPtrList *centralDirectoryEntries, CTypedPtrList *filled); static RAR_BlockFile *scanForRarFileHeader(CFile *input, uint32 available); static bool validateRarFileBlock(RAR_BlockFile *block); static void writeRarBlock(CFile *input, CFile *output, RAR_BlockFile *block); static bool CopyFile(CPartFile *partFile, CTypedPtrList *filled, CString tempFileName); static void DeleteMemory(ThreadParam *tp); static bool IsFilled(uint32 start, uint32 end, CTypedPtrList *filled); static uint16 readUInt16(CFile *input); static uint32 readUInt32(CFile *input); static uint16 calcUInt16(BYTE *input); static uint32 calcUInt32(BYTE *input); static void writeUInt16(CFile *output, uint16 val); static void writeUInt32(CFile *output, uint32 val); };