首页
社区
课程
招聘
[原创]仙劍奇俠傳,文件加密解密算法.放出來喏~!
2010-6-28 20:54 9670

[原创]仙劍奇俠傳,文件加密解密算法.放出來喏~!

2010-6-28 20:54
9670
// RSTEncDec.h: interface for the CRSTEncDec class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_RSTENCDEC_H__20112A8E_16B6_4E06_9829_9CB5FC1F209C__INCLUDED_)
#define AFX_RSTENCDEC_H__20112A8E_16B6_4E06_9829_9CB5FC1F209C__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include "DBDecEnc.h"

//-------------------------------------------------------------------------------------------------------------
typedef struct	_PACKFILE_HEADER_INFO{
	DWORD	_01dwLogon;	//0x1A545352 "RST"
	DWORD	_02dwUnk  ; //04
	DWORD	_03dwIndexSeek  ; //08
	DWORD	_04dwDataSeek   ; //0C
	DWORD	_05dwLenSub  ; //10
	DWORD	_06dwFileNum ; //14
	DWORD	_07dwUnk  ; //18
	DWORD	_08dwUnk  ; //1C
	DWORD	_09dwUnk  ; //20
	DWORD	_0AdwUnk  ; //24
	DWORD	_0BdwUnk  ; //28
	DWORD	_0CdwFileSize  ; //2C
	DWORD	_10dwUnk[0x14] ; //30
}_HEADER_INFO,_HEADERINFO;


class CPALFile
{
public:
	CPALFile();
	virtual ~CPALFile();
public:
	HANDLE	hOpen;
	HANDLE  hWrite;
	DWORD	m_dwCpkRead;
public:
	int	      GetSize();
public:
	HANDLE	  PalOpen(LPCTSTR strOpen);
	HANDLE	  PalOpen(LPCTSTR strOpen,DWORD	dwAccess,DWORD	dwShare,LPSECURITY_ATTRIBUTES lpSAttributes,
					  DWORD	dwMode,DWORD dwFlag,HANDLE	hTemp);
	HANDLE	  PalCreate(LPCTSTR strCreate);
	int       PalRead  (HANDLE hFile, LPVOID pbuf, DWORD dwlen);
	int		  PalRead  (HANDLE hFile, DWORD dwSeek,LPVOID pbuf, DWORD dwlen);
	int       PalWrite (HANDLE hFile, LPVOID pbuf, DWORD dwlen);
	int		  PalWrite (HANDLE hFile, DWORD dwSeek,LPVOID pbuf, DWORD dwlen);
	void      PalClose (HANDLE hFile) { ::CloseHandle(hFile); hFile=NULL; }
};

//-------------------------------------------------------------------------------------------------------------
typedef struct  _RST_DATA_INDEXLIST{
	DWORD	_01dwUnk;
	DWORD	_02dwUnk;
	DWORD	_03dwUnk;
	DWORD	_04dwSeek;     //文件位置
	DWORD	_05dwLenght1;  //加密后长度
	DWORD	_06dwLenght2;  //解密后长度
	DWORD	_07dwNumber;
	DWORD	_08dwEnd;
}_DATA_LIST;

class CRSTEncDec  
{
public:
	CRSTEncDec();
	virtual ~CRSTEncDec();
private:
	char	  DecKey[0x0100];
public:
	char	  m_chrData[0x02][0x1000];
public:
	int       RSTLoadKey(char *key1=NULL,char *key2=NULL,char *key3=NULL);
	int		  RSTDecrpyt(LPVOID	pdat,DWORD	dwnum,LPVOID pkey=NULL);
	int		  RSTDecIndex(LPVOID pbuf,DWORD len);
};


class CCPKFile : public CRSTEncDec,public CDBDecEnc
{
public:
	CCPKFile();
	virtual ~CCPKFile();
public:
	CPALFile		file;
	_HEADERINFO		_hdi;
	_DATA_LIST	   *_plist;
	int            m_iListNum;
	DWORD		    dwFileSize;
	LPBYTE			pData;
public:
	_DATA_LIST*   GetIndexList()
	{
		return (_DATA_LIST*)pData;
	}
public:
	int   DecCPKFile(LPCTSTR strOpen,LPCTSTR strSave);
	int	  DecCPKIndex(LPCTSTR strOpen);
	int	  WriteData(LPCTSTR strpath);
	char* GetDecType(LPVOID pheader);

public:
	int   DecData (char *pdat,int len,LPCTSTR strpath);
	int   SaveFile(int num,char *pdat,int len,LPCTSTR strpath,LPCTSTR strname);
};

class CSMPFile : public CRSTEncDec
{
public:
	CSMPFile();
	virtual ~CSMPFile();
public:
	CPALFile		file;
	_HEADERINFO		_hdi;
	_DATA_LIST	   *_plist;
	int            m_iListNum;
	DWORD		    dwFileSize;
	LPBYTE			pData;
public:
	_DATA_LIST*   GetIndexList()
	{
		return (_DATA_LIST*)pData;
	}
public:
	int   DecSMPFile(LPCTSTR strOpen,LPCTSTR strSave,LPCTSTR name=NULL);
	int	  DecSMPIndex(LPCTSTR strOpen);
	int	  WriteData(LPCTSTR strpath,LPCTSTR name);
	char* GetDecType(LPVOID pheader);
public:
	int   SaveFile(int num,char *name);
};

#endif // !defined(AFX_RSTENCDEC_H__20112A8E_16B6_4E06_9829_9CB5FC1F209C__INCLUDED_)




// RSTEncDec.cpp: implementation of the CRSTEncDec class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Pal4DecPack.h"
#include "RSTEncDec.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//-----------------------------------------------------------------------------------------------------------------

CPALFile::CPALFile()
{
	hOpen =NULL;
	hWrite=NULL;

	m_dwCpkRead=0x00;
}
CPALFile::~CPALFile()
{
}

int	  CPALFile::GetSize(){ return ::GetFileSize(hOpen,NULL); }

HANDLE CPALFile::PalOpen(LPCTSTR strOpen,DWORD	dwAccess,DWORD	dwShare,LPSECURITY_ATTRIBUTES lpSAttributes,
					  DWORD	dwMode,DWORD dwFlag,HANDLE	hTemp)
{
	hOpen=::CreateFile(strOpen,dwAccess,dwShare,lpSAttributes,
						dwMode,dwFlag,hTemp);
	return hOpen;
}

HANDLE CPALFile::PalOpen(LPCTSTR strOpen)
{
	hOpen=::CreateFile(strOpen,
		             GENERIC_READ,
				     FILE_SHARE_READ,
					 NULL,
					 OPEN_EXISTING,
					 FILE_ATTRIBUTE_NORMAL,
					 NULL);
	return hOpen;
}

HANDLE CPALFile::PalCreate(LPCTSTR strCreate)
{
    hWrite=CreateFile(strCreate,
		            GENERIC_READ|GENERIC_WRITE,
		            FILE_SHARE_READ|FILE_SHARE_WRITE,
					NULL,
					CREATE_NEW,
					FILE_ATTRIBUTE_NORMAL,
					NULL);
   if(hWrite==INVALID_HANDLE_VALUE)
	{
		hWrite=CreateFile(strCreate,
			GENERIC_READ|GENERIC_WRITE,
			FILE_SHARE_READ|FILE_SHARE_WRITE,
			NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
		if(hWrite==INVALID_HANDLE_VALUE)
		{
			return NULL;
		}
	}
	return hWrite;
}

int CPALFile::PalRead(HANDLE hFile, LPVOID pbuf, DWORD dwlen)
{
	int iRe=ReadFile(hFile,pbuf,dwlen,&m_dwCpkRead,NULL);

	int result = iRe==0x01;

	if(dwlen != m_dwCpkRead){ result=0; }
	return result;
}

int CPALFile::PalRead(HANDLE hFile,DWORD dwSeek, LPVOID pbuf, DWORD dwlen)
{
	OVERLAPPED oap;
	memset(&oap,0x00,sizeof(OVERLAPPED));
	oap.Offset=dwSeek;
	int iRe=ReadFile(hFile,(LPBYTE)pbuf,dwlen,&m_dwCpkRead,&oap);

	if(dwlen != m_dwCpkRead){ return m_dwCpkRead; }
	return dwlen;
}

int CPALFile::PalWrite(HANDLE hFile, LPVOID pbuf, DWORD dwlen)
{
	int iRe=::WriteFile(hFile,pbuf,dwlen,&m_dwCpkRead,NULL);

	int result = iRe==0x01;

	if(dwlen != m_dwCpkRead){ result=0; }
	return result;
}

int CPALFile::PalWrite(HANDLE hFile,DWORD dwSeek, LPVOID pbuf, DWORD dwlen)
{
	OVERLAPPED oap;
	memset(&oap,0x00,sizeof(OVERLAPPED));
	oap.Offset=dwSeek;
	int iRe=::WriteFile(hFile,(LPBYTE)pbuf,dwlen,&m_dwCpkRead,&oap);
	
	if(dwlen != m_dwCpkRead){ return m_dwCpkRead; }
	return dwlen;
}




//---------------------------------------------------------------------------------------------------------------



//---------------------------------------------------------------------------------------------------------------
char	szVampire[0x10] ="Vampire.C.J at ";
char    szTechn  [0x20] ="Softstar Technology (ShangHai)";
char    szCoLtd  [0x10] =" Co., Ltd";

DWORD	FILE_LOGON=0x1A545352; //"RST"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CRSTEncDec::CRSTEncDec()
{
	memset(DecKey,0x00,0x0100);
}

CRSTEncDec::~CRSTEncDec()
{

}

int       CRSTEncDec::RSTLoadKey(char *key1,char *key2,char *key3)
{
	memset(DecKey,0x00,0x100);
	if(key1==NULL||key2==NULL||key3==NULL)
	{
		strcpy(DecKey,szVampire);
		strcat(DecKey,szTechn);
		strcat(DecKey,szCoLtd);
	}else{
		strcpy(DecKey,key1);
		strcat(DecKey,key2);
		strcat(DecKey,key3);
	}

	return 0;
}

int		  CRSTEncDec::RSTDecrpyt(LPVOID	pdat,DWORD	dwnum,LPVOID pkey)
{
	DWORD	dwedx;
	DWORD	dweax;
	DWORD	dwebp;
	DWORD	dwebx = dwnum;
	if(dwebx < 0x02) { return -1; }

	if(pkey==NULL){pkey=(LPVOID)&DecKey[0];}

	LPDWORD  pdwdat=(LPDWORD)pdat;
	LPDWORD  pdwkey=(LPDWORD)pkey;

	DWORD    dwesi=pdwdat[0];

	DWORD    esp10=dwebx;
	DWORD    esp14=0x00;

	dweax=(DWORD)floor( (double)( 52.00f / (float)esp10 + 6.00f) ) * 0x9E3779B9;
	esp10=dweax;

	if(dweax != 0x00)
	{
		do{
			DWORD   dwecx= dweax;
			DWORD   esp1c=(dwecx / 0x04) & 0x03;

			dwecx = dwebx -0x01;

			if(dwecx > 0x00)
			{
				do{
					dwedx =pdwdat[dwecx -0x01];
					dwebx =dwesi * 0x04;

					dweax =dwedx;
					dwebp =dwedx;

					dweax /= 0x20;
					dwebx ^= dweax;
					dweax  =dwesi;
					dweax /= 0x08;
					dwebp *= 0x10;
					dweax ^= dwebp;
					dwebp  =esp1c;

					dwebx +=dweax;
					dweax  =dwecx;
					dweax &=0x03;
					dweax ^=dwebp;
					dwebp  =pdwkey[dweax];
					dweax  =esp10;  //esp+10
					dwebp ^=dwedx;
					dwedx  =dweax;
					dwedx ^=dwesi;
					dwesi  =pdwdat[dwecx];
					dwebp +=dwedx;
					dwebx ^=dwebp;
					dwesi -=dwebx;

					pdwdat[dwecx] =dwesi;
					dwecx--;

				}while(dwecx);

				dwebx = dwnum;
			}
				dwebx = pdwdat[dwebx-1];
				dwedx = dwesi * 0x04;
				dwebp = dwebx;

				dwecx &= 0x03;
				dwebp /= 0x20;
				dwedx ^= dwebp;
				dwebp  = dwesi;
				dwebp /= 0x08;
				dwebx *= 0x10;
				dwebp ^= dwebx;

				dwebx  = esp1c;
				dwecx ^= dwebx;
				dwedx += dwebp;

				dwecx  = pdwkey[dwecx];
				dwebx  = dwnum;
				dwebp  = pdwdat[dwebx-1];

				dwecx ^=dwebp;
				dwebp  =dweax;
				dwebp ^=dwesi;
				dwesi  =pdwdat[0];
				dwecx +=dwebp;
				dwedx ^=dwecx;
				dwesi -=dwedx;
				dweax +=0x61C88647;
				pdwdat[0] =dwesi;
				esp10  =dweax;
		}while(dweax);
	}

	return 0;
}


int		  CRSTEncDec::RSTDecIndex(LPVOID pbuf,DWORD len)
{
	LPBYTE	pbybuf1=(LPBYTE)pbuf;
	LPBYTE	pbybuf2=&pbybuf1[len-0x1000];

	if(len>0x2000)
	{
		RSTLoadKey();
		memset(m_chrData[0x00],0x00,0x1000);
		memset(m_chrData[0x01],0x00,0x1000);

		int num=0;
		do{
			memcpy(&m_chrData[0x00][num],&pbybuf1[num],0x08);
			memcpy(&m_chrData[0x01][num + 0x04],&pbybuf2[num -0x01 ],0x08);
			num += 0x08;
		}while(num<0x1000);

		RSTDecrpyt( &m_chrData[0x00][0x00],0x0400,DecKey);
		RSTDecrpyt( &m_chrData[0x01][0x04],0x0400,DecKey);

		int n=0;

		do{
			memcpy(&pbybuf1[n],&m_chrData[0x00][n],0x08);
			memcpy(&pbybuf2[n -0x01 ],&m_chrData[0x01][n + 0x04],0x08);

			n++;
			num--;
		}while(num);

		return 1;
	}
	return 0;
}


//----------------------------------------------------------------------------------------------------------------------


CCPKFile::CCPKFile()
{
	_plist     = NULL;
	m_iListNum = 0;
	dwFileSize = 0;
	pData      = NULL;
	memset(&_hdi,0x00,sizeof(_HEADER_INFO));
}

CCPKFile::~CCPKFile()
{
	if(pData!=NULL)
	{
		//删除内存分配
		delete [] pData; pData=NULL;
	}

	if(file.hOpen != NULL)
	{
		file.PalClose(file.hOpen);
		file.hOpen =NULL;
	}
}

int   CCPKFile::DecCPKFile(LPCTSTR strOpen,LPCTSTR strSave)
{
	if(pData==NULL)
	{
		//分配内存
		pData = new BYTE[0x100000];
	}else{ memset(pData,0x00,0x100000);}

	HANDLE	hOpen=file.PalOpen(strOpen);
	if(hOpen==INVALID_HANDLE_VALUE) {return -1;}

	//获取文件大小
	dwFileSize=::GetFileSize(hOpen,NULL);

	//读取索引头
	DecCPKIndex(strOpen);

	CString ss=strSave;
	ss +="index.bin";
	HFILE	hf=::_lcreat(ss,NULL);
	::_lwrite(hf,(LPCTSTR)pData,0x100000);
	::_lclose(hf);

	//写文件:
	WriteData(strSave);

	//清除句柄:
	if(file.hOpen != NULL)
	{
		file.PalClose(file.hOpen);
		file.hOpen =NULL;
	}

	if(file.hWrite != NULL)
	{
		file.PalClose(file.hWrite);
		file.hWrite =NULL;
	}

	delete [] pData;

	return 0;
}

int	   CCPKFile::DecCPKIndex(LPCTSTR strOpen)
{
	memset(&_hdi,0x00,sizeof(_HEADER_INFO));
	file.PalRead(file.hOpen,&_hdi,sizeof(_HEADER_INFO));

	m_iListNum=_hdi._06dwFileNum;

	if(_hdi._01dwLogon == FILE_LOGON)
	{
		if(file.PalRead(file.hOpen,pData,_hdi._05dwLenSub*0x20)!=0)
		{
			int re=RSTDecIndex(pData,0x100000);
			_plist=GetIndexList();
			return re;
		}
	}

	return 0;
}

char*	CCPKFile::GetDecType(LPVOID pheader)
{
	DWORD  dwType=(*(LPDWORD)pheader & 0x00FFFFFF);

	if(strcmp((char*)&dwType,"BIK")==0x00){ return "BIK";}

	return "unk";
}

int	    CCPKFile::WriteData(LPCTSTR strpath)
{
	if(dwFileSize<=0x100000){return -1;}
	int		size  = dwFileSize -0x100000;
	int     rsize = 0x100000;
	int     seek  = 0x100000;
	
	char	ss  [MAX_PATH] = {0};

	theApp.m_Dlg->AddLog("分配内存 ...!",0x01);
	LPBYTE	pbuf = new BYTE[size];

	int		num  = size/0x100000;
	if( size<0x100000 ){ rsize=size; }
	if( (size%0x100000)>0x00 ){ num++; }
	
	//循环读取文件
	do{
		int iRe = file.PalRead(file.hOpen,seek,pbuf +(seek - 0x100000),rsize);
		seek += rsize;

		wsprintf(ss,"(%d)装载文件: %d / %d",num,seek - 0x100000 ,size);
		theApp.m_Dlg->AddLog(ss,0x01);
		theApp.m_Dlg->m_pgsLog.SetPos( ((seek/0x1000)*100) /(dwFileSize/0x1000) );

		if( (dwFileSize-seek)<0x100000){ rsize = dwFileSize - seek; }
		num--;
	}while(num);
	
	theApp.m_Dlg->AddLog("读取完成,解密文件 ...!",0x01);
	
	//保存文件
	DecData((char*)pbuf,size,strpath);

	delete [] pbuf;

	return 0;
}

int     CCPKFile::DecData(char *pdat,int len,LPCTSTR strpath)
{
	char   ss[MAX_PATH] = {0};
	strcpy(ss,strpath);

	for( int num = 0 ; num < m_iListNum ; num++ )
	{	
		int	  size        =_plist[num]._05dwLenght1;
		int   seek        =_plist[num]._04dwSeek   -0x100000;
		char*  psrc = pdat + seek;

		if(_plist[num]._05dwLenght1==0x00&&_plist[num]._06dwLenght2 == 0x00)
		{
			wsprintf(ss,"%s%s",strpath,(char*)(psrc+size));
			::CreateDirectory(ss,NULL);
			strcpy(ss,strpath);
			continue;
		}

		DWORD	dstlen=0x00;
		if(_plist[num]._06dwLenght2 <= 0x1000) { dstlen=0x1000; }
		if(_plist[num]._06dwLenght2 >  0x1000) { dstlen=(_plist[num]._06dwLenght2/0x1000)*0x1000 + 0x1000 ;}

		char*  pdst = new char[dstlen];

		if(_plist[num]._05dwLenght1 != _plist[num]._06dwLenght2)
		{
			int iRe=DBDecrpyt(psrc,size,pdst,&dstlen,0x00);
			SaveFile(num,pdst,dstlen,ss,(char*)(psrc+size));
		}else{
			SaveFile(num,psrc,size,ss,(char*)(psrc+size));
		}

		delete [] pdst;
	}
	return 0;
}

int		CCPKFile::SaveFile(int num,char *pdat,int len,LPCTSTR strpath,LPCTSTR strname)
{
	char	ss  [MAX_PATH] = {0};
	char	path[MAX_PATH] = {0};

	wsprintf(path,"%s\\%s",strpath,strname);
	if(file.PalCreate(path)<0)
	{
		wsprintf(ss,"(%d)创建文件[%02X]<0x%08X>:%s  ...创建错误!",
				num,_plist[num]._07dwNumber,_plist[num]._04dwSeek,strname);

		theApp.m_Dlg->AddLog(ss);
		return 0; 
	}

	wsprintf(ss,"(%d)创建文件[%02X]<0x%08X>:%s  ...创建成功!",
			num,_plist[num]._07dwNumber,_plist[num]._04dwSeek,strname);
	theApp.m_Dlg->AddLog(ss);

	if( len > 0x00)
	{
		int wlen=0x1000;
		int size=0x00;
		int n = len / 0x1000;
		if( len<0x1000 ){ wlen=len; }
		if( (len % 0x1000)> 0x00 ){ n++; }

		do{
			file.PalWrite (file.hWrite,pdat+size,wlen);
			size += wlen;
			
			int p=100;
			if(size > 0x00) { 
			if((size/0x1000)>0x00){ p= ((size /0x1000) *100)/ (len /0x1000);} 
			}

			wsprintf(ss,"(%d)%s: (%d/%d) [%s%d]",
					num,strname,size ,len ,"%",p);
			theApp.m_Dlg->AddLog(ss,0x01);
			theApp.m_Dlg->m_pgsLog.SetPos( p );

			if( (len-size) <0x1000 && (len-size)>0x00 ) { wlen= len-size;}
			if( (len-size) <0x00 ){break;}
			n--;
		}while(n);
	}

	file.PalClose(file.hWrite); file.hWrite=NULL;
	return 1;
}

/*

int	    CCPKFile::WriteData(LPCTSTR strpath)
{
	char	path[MAX_PATH] = {0};
	char	ss  [MAX_PATH] = {0};

	for(int num =0; num < m_iListNum; num++)
	{
		BYTE	pdat[0x10]={0};

		int iRe=file.PalRead(file.hOpen,_plist[num]._04dwSeek,pdat,0x10); if(iRe<0){ break; }

		wsprintf(path,"%sPAL4_Dec_%02X.%s",strpath,num,GetDecType(pdat));
		if(file.PalCreate(path)<0)
		{
			wsprintf(ss,"(%d)创建文件[%02X]<0x%08X>:PAL4_Dec_%02X.%s  ...创建错误!",
				num,_plist[num]._07dwNumber,_plist[num]._04dwSeek,num,GetDecType(pdat));

			theApp.m_Dlg->AddLog(ss);
			continue; 
		}
		wsprintf(ss,"(%d)创建文件[%02X]<0x%08X>:PAL4_Dec_%02X.%s  ...创建成功!",
				num,_plist[num]._07dwNumber,_plist[num]._04dwSeek,num,GetDecType(pdat));

		theApp.m_Dlg->AddLog(ss);

		SaveFile(num,GetDecType(pdat));

		file.PalClose(file.hWrite); file.hWrite=NULL;

	}

	return 0;
}

int     CCPKFile::SaveFile(int num,char *sztype)
{
	char    pdat[0x1000]   = {0};
	char	ss  [MAX_PATH] = {0};
	int	  size        =_plist[num]._05dwLenght1;
	int   seek        =_plist[num]._04dwSeek   ;
	int   len         =0;

	if(size>=0x1000){ len=0x1000;}else{len=size;}

	theApp.m_Dlg->m_pgsLog.SetPos(0);
	int  wsize=0;

	do{
		int  iRe=file.PalRead(file.hOpen,seek,pdat,len);if(iRe<0){break;}
		file.PalWrite (file.hWrite,pdat,iRe);
		seek  += len;
		wsize += len;

		int p=100;
		if(wsize > 0x00) { 
			if((wsize/0x1000)>0x00){ p= ((wsize /0x1000) *100)/ (size /0x1000);} 
		}

		wsprintf(ss,"PAL4_Dec_%02X.%s ->处理:%d/%d [%s%d]",
				num,sztype,wsize ,_plist[num]._05dwLenght1,"%",
				 p);
		
		theApp.m_Dlg->AddLog(ss,0x01);
		theApp.m_Dlg->m_pgsLog.SetPos( p );
		if((size -wsize) < 0x1000){ len=size -wsize ;}
	}while(len>0);
	
	wsprintf(ss,"(%d)处理成功:PAL4_Dec_%02X.%s ->[处理%dByte/原始%dByte]!",
		num,num,sztype,wsize,_plist[num]._05dwLenght1);
	theApp.m_Dlg->AddLog(ss,0x00);

	return 0;
}
*/



//----------------------------------------------------------------------------------------------------------------------


//----------------------------------------------------------------------------------------------------------------------


CSMPFile::CSMPFile()
{
	_plist     = NULL;
	m_iListNum = 0;
	dwFileSize = 0;
	pData      = NULL;
	memset(&_hdi,0x00,sizeof(_HEADER_INFO));
}

CSMPFile::~CSMPFile()
{
	if(pData!=NULL)
	{
		//删除内存分配
		delete [] pData; pData=NULL;
	}

	if(file.hOpen != NULL)
	{
		file.PalClose(file.hOpen);
		file.hOpen =NULL;
	}
}

int   CSMPFile::DecSMPFile(LPCTSTR strOpen,LPCTSTR strSave,LPCTSTR name)
{
	if(pData==NULL)
	{
		//分配内存
		pData = new BYTE[0x100000];
	}else{ memset(pData,0x00,0x100000);}

	HANDLE	hOpen=file.PalOpen(strOpen);
	if(hOpen==INVALID_HANDLE_VALUE) {return -1;}

	//获取文件大小
	dwFileSize=::GetFileSize(hOpen,NULL);

	//读取索引头
	DecSMPIndex(strOpen);

	if(name==NULL)
	{
	//写文件:
	WriteData(strSave,"PAL4_DEC");
	}else{WriteData(strSave,name);}


	//清除句柄:
	if(file.hOpen != NULL)
	{
		file.PalClose(file.hOpen);
		file.hOpen =NULL;
	}

	if(file.hWrite != NULL)
	{
		file.PalClose(file.hWrite);
		file.hWrite =NULL;
	}

	delete [] pData;

	return 0;
}

int	   CSMPFile::DecSMPIndex(LPCTSTR strOpen)
{
	memset(&_hdi,0x00,sizeof(_HEADER_INFO));
	file.PalRead(file.hOpen,&_hdi,sizeof(_HEADER_INFO));

	m_iListNum=_hdi._06dwFileNum;

	if(_hdi._01dwLogon == FILE_LOGON)
	{
		if(file.PalRead(file.hOpen,pData,_hdi._05dwLenSub*0x20)!=0)
		{
			int re=RSTDecIndex(pData,0x100000);
			_plist=GetIndexList();
			return re;
		}
	}

	return 0;
}

char*	CSMPFile::GetDecType(LPVOID pheader)
{
	DWORD  dwType=(*(LPDWORD)pheader & 0x00FFFFFF);

	//if(strcmp((char*)&dwType,"BIK")==0x00){ return "BIK";}

	return "MP3";
}

int	    CSMPFile::WriteData(LPCTSTR strpath,LPCTSTR name)
{
	char	path[MAX_PATH] = {0};
	char	ss  [MAX_PATH] = {0};
	char	cc  [MAX_PATH] = {0};

	RSTLoadKey();

	for(int num =0; num < m_iListNum; num++)
	{
		BYTE	pdat[0x10]={0};

		int iRe=file.PalRead(file.hOpen,_plist[num]._04dwSeek,pdat,0x10); if(iRe<0){ break; }

		if(num==0){wsprintf(cc,"%s.%s",name,GetDecType(pdat));}
		else{wsprintf(cc,"%s_%02X.%s",name,num,GetDecType(pdat));}

		wsprintf(path,"%s%s",strpath,cc);
		if(file.PalCreate(path)<0)
		{
			wsprintf(ss,"(%d)创建文件[%02X]<0x%08X>:%s  ...创建错误!",
				num,_plist[num]._07dwNumber,_plist[num]._04dwSeek,cc);

			theApp.m_Dlg->AddLog(ss);
			continue; 
		}
		wsprintf(ss,"(%d)创建文件[%02X]<0x%08X>:%s  ...创建成功!",
				num,_plist[num]._07dwNumber,_plist[num]._04dwSeek,cc);

		theApp.m_Dlg->AddLog(ss);

		SaveFile(num,cc);

		file.PalClose(file.hWrite); file.hWrite=NULL;

	}

	return 0;
}

int     CSMPFile::SaveFile(int num,char *name)
{
	char  ss[MAX_PATH]= {0};
	int	  size        =_plist[num]._05dwLenght1;
	int   seek        =_plist[num]._04dwSeek   ;
	int   len         =0;

	char    *pdat=new char[size];
	memset  (pdat,0x00,size);

	if(size>=0x1000){ len=0x1000;}else{len=size;}

	theApp.m_Dlg->m_pgsLog.SetPos(0);
	int  wsize=0;
	int  iRe=file.PalRead(file.hOpen,seek,pdat,size);
	if(iRe<0){return -1;}
	
	RSTDecrpyt(pdat,size /4);

	do{
		file.PalWrite (file.hWrite,&pdat[wsize],len);
		wsize += len;

		wsprintf(ss,"%s ->处理:%d/%d [%s%d]",
				name,wsize ,_plist[num]._05dwLenght1,"%",
				((wsize/0x1000)*100)/(size/0x1000) );
		
		theApp.m_Dlg->AddLog(ss,0x01);
		theApp.m_Dlg->m_pgsLog.SetPos( ((wsize/0x1000)*100)/(size/0x1000) );
		if((size -wsize) < 0x1000){ len=size -wsize ;}
	}while(len>0);
	
	delete [] pdat;
	wsprintf(ss,"(%d)处理成功:%s ->[处理%dByte/原始%dByte]!",
		num,name,wsize,_plist[num]._05dwLenght1);
	theApp.m_Dlg->AddLog(ss,0x00);

	return 0;
}


[培训]《安卓高级研修班(网课)》月薪三万计划

收藏
点赞6
打赏
分享
最新回复 (12)
雪    币: 293
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
onbadday 2010-6-28 23:23
2
0
这是仙剑几啊
雪    币: 68
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
splitpants 2010-6-29 10:05
3
0
拜女牛人。。。。
雪    币: 252
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
sunwayking 2010-6-29 10:12
4
0
这个... 呃,游戏汉化人员爱捣鼓的东西.不过这个游戏是中文的.
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
fallenbird 2010-6-30 11:31
5
0
哪个版本的仙剑?仙剑95?
雪    币: 101
活跃值: (104)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
tmxfh 2010-6-30 15:47
6
0
顶下楼主MM
雪    币: 285
活跃值: (415)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lwykj 2010-7-1 02:47
7
0
怎么可以 顶lzmm呢?
要支持嘛
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
quiem 2010-7-2 15:51
8
0
顶下楼主支持
雪    币: 1402
活跃值: (341)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wbflike 2010-7-2 17:39
9
0
我是来顶楼主的。。。。
雪    币: 4
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cxcxs 2010-7-2 18:16
10
0
纯属支持!

绝无恶意!
雪    币: 276
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
loveqqc 2010-7-3 07:02
11
0
轻轻顶下楼主MM
雪    币: 191
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yuprxk 2010-7-3 23:06
12
0
我也要顶,也绝无恶意
雪    币: 221
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
film 2010-7-3 23:19
13
0
先回答问题,各位没看代码吧。这样应该是PAL4(PAL4_DEC)
呵呵,一定支持。不顶了。
游客
登录 | 注册 方可回帖
返回