// 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;
}