Advertisement
Guest User

Untitled

a guest
Jun 6th, 2012
724
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.56 KB | None | 0 0
  1. void rgFrame::ExtractFile(wxString infile, wxString path, bool islog)
  2. {
  3.     wxMessageDialog *Msg_Dialog = NULL;
  4.     unsigned char buf[1024];
  5.     wxString outfile,logfile;
  6.     SubInfo tmpInfo;
  7.     vector<SubInfo> SubFileInfo;
  8.     SubFileInfo.clear();
  9.     unsigned long flag = 0, flag1 = 0;
  10.     unsigned long magickey = 0xDEADCAFE;
  11.     WCHAR wch_tmp[256];
  12.     char endofline[] = {0x0D, 0x0A};
  13.  
  14.     wxFileInputStream rgssad_file(infile);
  15.     wxFile sp_file;
  16.  
  17.     if (!rgssad_file.IsOk())
  18.     {
  19.         Msg_Dialog = new wxMessageDialog(NULL, wxT("エェRGSSADホトシハァーワ"), wxT("error"), wxOK | wxICON_ERROR);
  20.         Msg_Dialog->ShowModal();
  21.         delete Msg_Dialog;
  22.         Msg_Dialog = NULL;
  23.         return;
  24.     }
  25.     rgssad_file.Read(&flag, 4);
  26.     rgssad_file.Read(&flag1, 4);
  27.     if (flag != 0x53534752 || flag1 != 0x01004441)
  28.     {
  29.         Msg_Dialog = new wxMessageDialog(NULL, wxT("ユ箚サハヌメサクミミァオトRGSSADホトシ"), wxT("error"), wxOK | wxICON_ERROR);
  30.         Msg_Dialog->ShowModal();
  31.         delete Msg_Dialog;
  32.         Msg_Dialog = NULL;
  33.         return;
  34.     }
  35.  
  36.     logfile.Printf("%srgssad_sp.log", path);
  37.     wxFileOutputStream *log_file = NULL;
  38.     if(islog)
  39.     {
  40.         log_file = new wxFileOutputStream(logfile);
  41.     }
  42.  
  43.     // ソェハシキヨホトシ
  44.     rgssad_file.Read(&tmpInfo.filenamesize, 4);
  45.     while(!rgssad_file.Eof())
  46.     {
  47.         tmpInfo.filenamesize ^= magickey;
  48.         magickey = magickey * 7 + 3;
  49.         rgssad_file.Read(tmpInfo.filename, tmpInfo.filenamesize);
  50.         for(unsigned long i = 0; i < tmpInfo.filenamesize; i++)
  51.         {
  52.             tmpInfo.filename[i] ^= magickey & 0xFF;
  53.             magickey = magickey * 7 + 3;
  54.         }
  55.         tmpInfo.filename[i] = 0;
  56.         MultiByteToWideChar(CP_UTF8, 0, tmpInfo.filename, -1, wch_tmp, 256);
  57.         WideCharToMultiByte(CP_ACP, 0, wch_tmp, -1, tmpInfo.filename, 256, NULL, NULL);
  58.         rgssad_file.Read(&tmpInfo.filesize, 4);
  59.         tmpInfo.filesize ^= magickey;
  60.         magickey = magickey * 7 + 3;
  61.         tmpInfo.offset = rgssad_file.TellI();
  62.         tmpInfo.magickey = magickey;
  63.         SubFileInfo.push_back(tmpInfo);
  64.         rgssad_file.SeekI(tmpInfo.filesize, wxFromCurrent);
  65.         rgssad_file.Read(&tmpInfo.filenamesize, 4);
  66.     }
  67.  
  68.     // reset wxGauge
  69.     m_gauge1->SetRange(SubFileInfo.size());
  70.  
  71.     // ソェハシキヨス簧トシ
  72.     unsigned long leftsize;
  73.     for(unsigned long i = 0; i < SubFileInfo.size(); i++)
  74.     {
  75.         outfile.Printf("%s%s", path, SubFileInfo[i].filename);
  76.         sp_file.Open(outfile, wxFile::write);
  77.         if(!sp_file.IsOpened())
  78.         {
  79.             check_path(outfile);
  80.             sp_file.Open(outfile, wxFile::write);
  81.             if(!sp_file.IsOpened())
  82.             {
  83.                 if(log_file)
  84.                 {
  85.                     outfile += " failed.";
  86.                     log_file->Write(outfile, outfile.Len());
  87.                     log_file->Write(endofline, 2);
  88.                 }
  89.                 continue;
  90.             }
  91.         }
  92.         rgssad_file.SeekI(SubFileInfo[i].offset, wxFromStart);
  93.         magickey = SubFileInfo[i].magickey;
  94.         leftsize = SubFileInfo[i].filesize;
  95.         unsigned long j = 0;
  96.         while(leftsize > 1023)
  97.         {
  98.             rgssad_file.Read(buf, 1024);
  99.             for(j = 0; j < 1024; j+=4)
  100.             {
  101.                 *(unsigned long *)(&buf[j]) ^= magickey;
  102.                 magickey = magickey * 7 + 3;
  103.             }
  104.             sp_file.Write(buf, 1024);
  105.             leftsize -= 1024;
  106.         }
  107.         rgssad_file.Read(buf, leftsize);
  108.         for(j = 0; j < leftsize; j+=4)
  109.         {
  110.             *(unsigned long *)(&buf[j]) ^= magickey;
  111.             magickey = magickey * 7 + 3;
  112.         }
  113.         sp_file.Write(buf, leftsize);
  114.         sp_file.Close();
  115.         if(log_file)
  116.         {
  117.             outfile += " done.\n";
  118.             log_file->Write(outfile, outfile.Len());
  119.             log_file->Write(endofline, 2);
  120.         }
  121.         m_gauge1->SetValue(i);
  122.     }
  123.     m_gauge1->SetValue(i);
  124.     delete log_file;
  125.     Msg_Dialog = new wxMessageDialog(NULL, wxT("ス箍・・マ"), wxT("haha"), wxOK | wxICON_INFORMATION);
  126.     Msg_Dialog->ShowModal();
  127.     delete Msg_Dialog;
  128. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement