⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rartool.h

📁 一个解压程序,只要设定了解压路径和解压文件的种类,就可以随意解压
💻 H
字号:
#ifndef AFX_RARTOOL_H__2AE8B602_4430_11D4_8D96_9277B4F74C35__INCLUDED_
#define AFX_RARTOOL_H__2AE8B602_4430_11D4_8D96_9277B4F74C35__INCLUDED_

#include "Tool.h"

#define  Min(x,y) (((x)<(y)) ? (x):(y))
#define  Max(x,y) (((x)>(y)) ? (x):(y))

#define MAXWINSIZE      0x100000
#define MAXWINMASK      (MAXWINSIZE-1)

#define  SIZEOF_MARKHEAD         7
#define  SIZEOF_OLDMHD           7
#define  SIZEOF_NEWMHD          13
#define  SIZEOF_OLDLHD          21
#define  SIZEOF_NEWLHD          32
#define  SIZEOF_SHORTBLOCKHEAD   7
#define  SIZEOF_LONGBLOCKHEAD   11
#define  SIZEOF_COMMHEAD        13
#define  SIZEOF_PROTECTHEAD     26

#define  PACK_VER       20
#define  UNP_VER        20
#define  PROTECT_VER    20

enum { M_DENYREAD,M_DENYWRITE,M_DENYNONE,M_DENYALL };
enum { FILE_EMPTY,FILE_ADD,FILE_UPDATE,FILE_COPYOLD,FILE_COPYBLOCK };
enum { ARG_RESET,ARG_NEXT,ARG_REMOVE };
enum { ARC=1,VOL,SFX };
enum { SUCCESS,WARNING,FATAL_ERROR,CRC_ERROR,LOCK_ERROR,WRITE_ERROR,
       OPEN_ERROR,USER_ERROR,MEMORY_ERROR,USER_BREAK=255,IMM_ABORT=0x8000 };
enum { EN_LOCK=1,EN_VOL=2 };
enum { SD_MEMORY=1,SD_FILES=2 };
enum { ASK_OVERWR=0,ALL_OVERWR=1,NO_OVERWR=2 };
enum { ALARM_SOUND,ERROR_SOUND };
enum { MSG_STDOUT,MSG_STDERR,MSG_NULL };
enum { COMPARE_PATH,NOT_COMPARE_PATH };
enum { NAMES_DONTCHANGE,NAMES_UPPERCASE,NAMES_LOWERCASE };
enum { LOG_ARC=1,LOG_FILE=2 };
enum { CRC16=1,CRC32=2 };
enum { OLD_DECODE=0,OLD_ENCODE=1,NEW_CRYPT=2 };
enum { OLD_UNPACK,NEW_UNPACK };
enum { KEEP_TIME=1,LATEST_TIME };

#define  MHD_MULT_VOL       1
#define  MHD_COMMENT        2
#define  MHD_LOCK           4
#define  MHD_SOLID          8
#define  MHD_PACK_COMMENT   16
#define  MHD_AV             32
#define  MHD_PROTECT        64

#define  LHD_SPLIT_BEFORE   1
#define  LHD_SPLIT_AFTER    2
#define  LHD_PASSWORD       4
#define  LHD_COMMENT        8
#define  LHD_SOLID          16

#define  LHD_WINDOWMASK     0x00e0
#define  LHD_WINDOW64       0
#define  LHD_WINDOW128      32
#define  LHD_WINDOW256      64
#define  LHD_WINDOW512      96
#define  LHD_WINDOW1024     128
#define  LHD_DIRECTORY      0x00e0

#define  SKIP_IF_UNKNOWN    0x4000
#define  LONG_BLOCK         0x8000

#define READSUBBLOCK	0x8000

enum { ALL_HEAD=0,MARK_HEAD=0x72,MAIN_HEAD=0x73,FILE_HEAD=0x74,
       COMM_HEAD=0x75,AV_HEAD=0x76,SUB_HEAD=0x77,PROTECT_HEAD=0x78};
enum { EA_HEAD=0x100 };
enum { MS_DOS=0,OS2=1,WIN_32=2,UNIX=3 };
enum { OLD=1,NEW=2};
enum { EEMPTY=-1,EBREAK=1,EWRITE,EREAD,EOPEN,ECREAT,ECLOSE,ESEEK,
       EMEMORY,EARCH };

struct MarkHeader
{
	BYTE Mark[7];
};
struct OldMainHeader
{
	BYTE Mark[4];
	WORD HeadSize;
	BYTE Flags;
};
struct NewMainArchiveHeader
{
	WORD HeadCRC;
	BYTE HeadType;
	WORD Flags;
	WORD HeadSize;
	WORD Reserved;
	DWORD Reserved1;
};
struct OldFileHeader
{
	DWORD PackSize;
	DWORD UnpSize;
	WORD FileCRC;
	WORD HeadSize;
	DWORD FileTime;
	BYTE FileAttr;
	BYTE Flags;
	BYTE UnpVer;
	BYTE NameSize;
	BYTE Method;
};
struct NewFileHeader
{
	WORD HeadCRC;
	BYTE HeadType;
	WORD Flags;
	WORD HeadSize;
	DWORD PackSize;
	DWORD UnpSize;
	BYTE HostOS;
	DWORD FileCRC;
	DWORD FileTime;
	BYTE UnpVer;
	BYTE Method;
	WORD NameSize;
	DWORD FileAttr;
};
struct BlockHeader
{
	WORD HeadCRC;
	BYTE HeadType;
	WORD Flags;
	WORD HeadSize;
	DWORD DataSize;
};
struct SubBlockHeader
{
	WORD HeadCRC;
	BYTE HeadType;
	WORD Flags;
	WORD HeadSize;
	DWORD DataSize;
	WORD SubType;
	BYTE Level;
};
struct CommentHeader
{
	WORD HeadCRC;
	BYTE HeadType;
	WORD Flags;
	WORD HeadSize;
	WORD UnpSize;
	BYTE UnpVer;
	BYTE Method;
	WORD CommCRC;
};
struct ProtectHeader
{
	WORD HeadCRC;
	BYTE HeadType;
	WORD Flags;
	WORD HeadSize;
	DWORD DataSize;
	BYTE Version;
	WORD RecSectors;
	DWORD TotalBlocks;
	BYTE Mark[8];
};

#define NC 298
#define DC 48
#define RC 28
#define BC 19
#define MC 257

struct LitDecode
{
  unsigned int MaxNum;
  unsigned int DecodeLen[16];
  unsigned int DecodePos[16];
  unsigned int DecodeNum[NC];
};

struct DistDecode
{
  unsigned int MaxNum;
  unsigned int DecodeLen[16];
  unsigned int DecodePos[16];
  unsigned int DecodeNum[DC];
};

struct RepDecode
{
  unsigned int MaxNum;
  unsigned int DecodeLen[16];
  unsigned int DecodePos[16];
  unsigned int DecodeNum[RC];
};

struct MultDecode
{
  unsigned int MaxNum;
  unsigned int DecodeLen[16];
  unsigned int DecodePos[16];
  unsigned int DecodeNum[MC];
};

struct BitDecode
{
  unsigned int MaxNum;
  unsigned int DecodeLen[16];
  unsigned int DecodePos[16];
  unsigned int DecodeNum[BC];
};

struct Decode
{
  unsigned int MaxNum;
  unsigned int DecodeLen[16];
  unsigned int DecodePos[16];
  unsigned int DecodeNum[2];
};

struct AudioVariables
{
  int K1,K2,K3,K4,K5;
  int D1,D2,D3,D4;
  int LastDelta;
  unsigned int Dif[11];
  unsigned int ByteCount;
  int LastChar;
};

class CRarTool : public CTool
{
//
// original source is
//
// Unrar
//   http://www.rarsoft.com
// by Eugene Roshal
//
public:
	CRarTool() : CTool( "Rar 揥奐" )
		{
			InitCRC();
			MDPtr[0]=&MD[0],MDPtr[1]=&MD[1],MDPtr[2]=&MD[2],MDPtr[3]=&MD[3];
		}

	bool IsType( const char* ext )
//		{return 0==stricmp(ext,"rar");}
		{return 0==strcmp(ext,"rar");} //by uema2.

	bool Check( const char* fname, unsigned long fsize );
	bool Extract( const char* fname, const char* ddir );

private:
	bool IsArchive(bool bStrict);
	int ReadHeader(int BlockType);
	int ReadBlock(int BlockType);
	bool GetNextVolume();
	DWORD UnpRead(BYTE *Addr,DWORD Count);
	DWORD UnpWrite(BYTE *Addr,DWORD Count);
	void Unstore();

	// Unpacker(OLD) ////////////////////
	void OldUnpack(bool bSolid);
	void ShortLZ();
	void LongLZ();
	void HuffDecode();
	void GetFlagsBuf();
	void OldUnpInitData(bool bSolid);
	void InitHuff(void);
	void CorrHuff(unsigned int *CharSet,unsigned int *NumToPlace);
	void OldCopyString(unsigned int Distance,unsigned int Length);
	unsigned int DecodeNum(int Num,unsigned int StartPos,unsigned int *DecTab,unsigned int *PosTab);

	unsigned int FlagBuf;
	int LCount;
	int FlagsCnt;
	unsigned int ChSet[256];
	unsigned int Place[256];
	unsigned int NToPl[256];
	unsigned int ChSetA[256];
	unsigned int PlaceA[256];
	unsigned int ChSetB[256];
	unsigned int PlaceB[256];
	unsigned int NToPlB[256];
	unsigned int ChSetC[256];
	unsigned int PlaceC[256];
	unsigned int NToPlC[256];
	unsigned int AvrPlc;
	unsigned int AvrPlcB;
	unsigned int AvrLn1;
	unsigned int AvrLn2;
	unsigned int AvrLn3;
	int NumHuf;
	int StMode;
	unsigned int Nhfb,Nlzb;
	unsigned int MaxDist3;
	int Buf60;

	// Unpacker(NEW) ////////////////////
	void Unpack(bool bSolid);
	void UnpReadBuf(int FirstBuf);
	void UnpWriteBuf();
	void ReadTables();
	void ReadLastTables();
	void MakeDecodeTables(unsigned char *LenTab,struct Decode *Dec,int Size);
	void DecodeNumber(struct Decode *Dec);
	void CopyString();
	void UnpInitData(bool bSolid);
	BYTE DecodeAudio(int Delta);

	LitDecode  LD;
	DistDecode DD;
	RepDecode  RD;
	MultDecode MD[4];
	MultDecode *MDPtr[4];
	BitDecode  BD;
	AudioVariables AudV[4];

	unsigned int UnpPtr,WrPtr;
	unsigned int BitField;
	unsigned int Number;
	unsigned char InBuf[8192];
	unsigned char UnpOldTable[MC*4];
	unsigned int InAddr,InBit,ReadTop;
	unsigned int LastDist,LastLength;
	unsigned int Length,Distance;
	unsigned int OldDist[4],OldDistPtr;
	int UnpAudioBlock,UnpChannels,CurChannel,ChannelDelta;

	// Globals //////////////////////////
	FILE *arc,*out;
	char ArcName[MAX_PATH*2];
	BYTE* UnpMemory;

	MarkHeader MarkHead;
	OldMainHeader OldMhd;
	NewMainArchiveHeader NewMhd;
	OldFileHeader OldLhd;
	NewFileHeader NewLhd;
	BlockHeader BlockHead;
	CommentHeader CommHead;
	ProtectHeader ProtectHead;

	int ArcFormat;
	int Encryption;
	bool bSolid,bNeedNextVol;
	DWORD HeaderCRC;
	char ExtrName[MAX_PATH*2];
	int NextBlockPos,MainHeadSize;
	int UnpPackedSize,DestUnpSize;
	DWORD CurUnpRead,CurUnpWrite;

	// CRC ///////////////////////////////
	DWORD UnpFileCRC,PackedCRC;//,PackFileCRC
	DWORD crcTable[256];
	DWORD Key[4];
	WORD OldKey[4];
	BYTE PN1,PN2,PN3;
	BYTE SubstTable[256];
	void InitCRC();
	DWORD UpdateChecker( DWORD StartVal,BYTE *ptr,DWORD Size,bool b32Bit );
	void EncryptBlock(BYTE *Buf);
	void DecryptBlock(BYTE *Buf);
	void Encode13(BYTE *Data,DWORD Count);
	void Crypt(BYTE *Data,DWORD Count,int Method);
	void Decode13(BYTE *Data,DWORD Count);
	void Crypt15(BYTE *Data,DWORD Count);
	void UpdKeys(BYTE *Buf);
	void Swap(BYTE *Ch1,BYTE *Ch2);
	void SetCryptKeys(char *Password);
	void SetOldKeys(char *Password);
};

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -