//--------------------------------------------------------------------------- void __fastcall TForm1::Button4Click(TObject *Sender) { memset(file_buf, 0xFF, sizeof(file_buf)); Hex2Bin(edtWorkFilename->Text, false); if (ComboBox1->ItemIndex == 0) { TFileStream * file = new TFileStream(ExtractFilePath(Application->ExeName)+"csp850aupdate.bin", fmCreate); file->Write(file_buf+0x4000, max_address-0x4000); delete file; ShowMessage("生成升级文件"); } else if (ComboBox1->ItemIndex == 1) { TFileStream * file = new TFileStream(ExtractFilePath(Application->ExeName)+"smartpower_update.bin", fmCreate); //xor 0x87 for (int i=0x4000;i<max_address;i++) { file_buf[i] ^= 0x87; } file->Write(file_buf+0x4000, max_address-0x4000); delete file; ShowMessage("生成升级文件"); } }
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ void Save_Base(TProgType aProgType, AnsiString aFileName, TTreeView *tv1, TTreeView *tv2, TTreeView *tv3, TTreeView *tv4) { TFileStream* FileStream; // ------------- try { FileStream = new TFileStream(aFileName, fmCreate); } catch ( ... ) { MessageBox(NULL, " Невозможно записать файл 'Estimate.dat' \n\n Данные на диск не будут записаны", " Ошибка записи файла ...", MB_ICONERROR); return; } // ------------- int FileVersion = 21; FileStream->Write(&DataFileDescription1, DataFileDescription1[0] + 1); FileStream->Write(&DataFileDescription2, DataFileDescription2[0] + 1); FileStream->Write(&DataFileDescription3, DataFileDescription3[0] + 1); FileStream->Write(&DataFileDescription4, DataFileDescription4[0] + 1); FileStream->Write(&DataFileDescription5, DataFileDescription5[0] + 1); FileStream->Write(&FileVersion , sizeof(FileVersion)); // ------------- Save_(FileStream, aProgType, tv1, &GlobalElementCounter); Save_(FileStream, aProgType, tv2, &GlobalMaterialCounter); Save_(FileStream, aProgType, tv3, &GlobalMashineCounter); Save_(FileStream, aProgType, tv4, &GlobalEnergoCounter); // ------------- delete FileStream; }
//--------------------------------------------------------------------------- void __fastcall TFrmUserDataView::BtnSavePKGDataClick(TObject *Sender) { BtnSavePKGData->Enabled = false; BtnInputPKGData->Enabled = true; UserData_PKG_SaveToSEQ(); UserData_PKG_SaveToDB(); UserData_PKG_ReadFromDB(); UserData_PKG_ReadFromSEQ(); TFileStream *File; TDateTime dt = Now(); String FolderName = dt.FormatString("yyyy-mm-dd"); String FileName = dt.FormatString("yyyy-mm-dd hh-nn-ss"); ForceDirectories("C:\\KOSES\\History\\PKGParamLog\\"+ FolderName); String FullPath = "C:\\KOSES\\History\\PKGParamLog\\"+ FolderName+"\\"+FileName+".txt"; File = new TFileStream(FullPath, fmCreate | fmOpenReadWrite); File->Position = 0; String Strtemp = "PKGParamLog \r\n"; for(int i=0; i<PkgParamGrid->RowCount; i++) { Strtemp += " No:"+IntToStr(i)+ ":"+ PkgParamGrid->Cells[3][i+1] +"\r\n"; } File->Write(Strtemp.c_str(),Strtemp.Length()); delete File; }
//--------------------------------------------------------------------------- //Guarda la lista de funciones a archivo bool TFunciones::SaveToFile(AnsiString FileName) { int InfoSize; TInfoFuncion F; TInfoInt I; TFCabecera FCabecera; TFFuncion FFuncion; TFIntervalo FIntervalo; TFileStream *Archivo; try{ if( FileExists(FileName) ) Archivo = new TFileStream(FileName, fmOpenWrite|fmShareExclusive); else Archivo = new TFileStream(FileName, fmOpenWrite|fmShareExclusive|fmCreate); Archivo->Seek(0, soFromBeginning); InfoSize = sizeof(TFCabecera); strcpy(FCabecera.ID, ID); FCabecera.Version = Version; FCabecera.NFunciones = FCount; Archivo->Write(&FCabecera,InfoSize); for( int i = 0; i < FCabecera.NFunciones; i++){ F = GetFuncion(i); strcpy(FFuncion.Nombre, F.Nombre); FFuncion.Graficar = F.Graficar; FFuncion.NIntervalos = uIntervaloH::Count(F.Intervalo); InfoSize = sizeof(TFFuncion); Archivo->Write(&FFuncion,InfoSize); InfoSize = sizeof(TFIntervalo); for( int j = 0; j < FFuncion.NIntervalos; j++){ I = Find(F.Intervalo, j)->Info; FIntervalo.Min = I.Min; FIntervalo.Max = I.Max; strcpy(FIntervalo.Expresion, I.Expresion); FIntervalo.TipoGrafico = I.TipoGrafico; FIntervalo.Color = I.Color; FIntervalo.Grosor = I.Grosor; Archivo->Write(&FIntervalo,InfoSize);} } delete Archivo; FModificado = false; return true; } catch(...){ return false;} }
//--------------------------------------------------------------------------- void __fastcall TForm1::Button3Click(TObject *Sender) { memset(file_buf, 0xFF, sizeof(file_buf)); Hex2Bin(edtIapFilename->Text, false); Hex2Bin(edtWorkFilename->Text, false); if (ComboBox1->ItemIndex == 0) { TFileStream * file = new TFileStream(ExtractFilePath(Application->ExeName)+"CSP850A_iap.bin", fmCreate); file->Write(file_buf, 65536); delete file; ShowMessage("生成下载文件"); } else if (ComboBox1->ItemIndex == 1) { TFileStream * file = new TFileStream(ExtractFilePath(Application->ExeName)+"smartpower_iap.bin", fmCreate); file->Write(file_buf, 131072); delete file; ShowMessage("生成下载文件"); } }
//=========================================================================== void TfrmTargetList::Targets_Save(AnsiString aFileName) { TFileStream* FileStream; // ------------- try { FileStream = new TFileStream(aFileName, fmCreate); } catch ( ... ) { MessageBox(this, " Невозможно записать данные\n\n Данные на диск не будут записаны", " Ошибка записи файла ...", MB_ICONERROR); return; } // ------------- FileStream->Write(&Targets_Count, sizeof(Targets_Count)); for (int i = 0; i < Targets_Count; i++) { FileStream->Write(&Targets[i]->R0, sizeof(Targets[i]->R0)); FileStream->Write(&Targets[i]->B0, sizeof(Targets[i]->B0)); FileStream->Write(&Targets[i]->V0, sizeof(Targets[i]->V0)); FileStream->Write(&Targets[i]->H0, sizeof(Targets[i]->H0)); FileStream->Write(&Targets[i]->K0, sizeof(Targets[i]->K0)); FileStream->Write(&Targets[i]->id, sizeof(Targets[i]->id)); } // ------------- delete FileStream; }
//--------------------------------------------------------------------------- //Exporta una funcion definida a archivo bool TFunciones::ExportFunction(int Index, AnsiString FileName) { int InfoSize; TInfoFuncion F; TInfoInt I; TFFuncion FFuncion; TFIntervalo FIntervalo; TFileStream *Archivo; try{ if( FileExists(FileName) ) Archivo = new TFileStream(FileName, fmOpenWrite|fmShareExclusive); else Archivo = new TFileStream(FileName, fmOpenWrite|fmShareExclusive|fmCreate); Archivo->Seek(0, soFromBeginning); InfoSize = sizeof(TFFuncion); F = GetFuncion(Index); strcpy(FFuncion.Nombre, F.Nombre); FFuncion.Graficar = F.Graficar; FFuncion.NIntervalos = uIntervaloH::Count(F.Intervalo); Archivo->Write(&FFuncion,InfoSize); InfoSize = sizeof(TFIntervalo); for( int i = 0; i < FFuncion.NIntervalos; i++){ I = Find(F.Intervalo, i)->Info; FIntervalo.Min = I.Min; FIntervalo.Max = I.Max; strcpy(FIntervalo.Expresion, I.Expresion); FIntervalo.TipoGrafico = I.TipoGrafico; FIntervalo.Color = I.Color; FIntervalo.Grosor = I.Grosor; Archivo->Write(&FIntervalo,InfoSize);} delete Archivo; return true; } catch(...){ return false;} }
//=========================================================================== void __fastcall TfrmTable::ToolButton1Click(TObject *Sender) { // --- Параметры Save Диалога ---- SaveDialog1->Filter = "Table files (*.txt)|*.txt"; SaveDialog1->Title = "Save Table"; SaveDialog1->InitialDir = ExtractFilePath( Application -> ExeName ); SaveDialog1->FileName = ""; if (SaveDialog1->Execute()){ AnsiString aFileName = SaveDialog1->FileName; if (ExtractFileExt(aFileName) == "") aFileName = aFileName + ".txt"; // ------ TFileStream* FileStream; try { FileStream = new TFileStream(aFileName, fmCreate); } catch ( ... ) { MessageBox(NULL, " Cannot save data", " Write error ...", MB_OK|MB_ICONERROR|MB_APPLMODAL); return; } // ------ AnsiString as0 = "\n"; AnsiString as_ = "\t"; for (int i =0; i < StringGrid1->RowCount; i++){ AnsiString as1 = StringGrid1->Cells[0][i]; AnsiString as2 = StringGrid1->Cells[1][i]; FileStream->Write(as1.data(), as1.Length()); FileStream->Write(as_.data(), as_.Length()); FileStream->Write(as2.data(), as2.Length()); FileStream->Write(as0.data(), as0.Length()); } // ------ delete FileStream; } }
//=========================================================================== // スレッド実行 //=========================================================================== void __fastcall TAttacheCaseFileEncrypt::Execute() { int i, c; int res; float ProgressPercentNumF; //進捗パーセンテージ(浮動小数点) z_stream z; // zlibライブラリとやりとりするための構造体 int flush, status; // zlib //出力する暗号化ファイルのタイムスタンプを元ファイルに合わせる HANDLE hFile; //_WIN32_FIND_DATAW first_fd; ZeroMemory(&first_fd, sizeof(_WIN32_FIND_DATAW)); int len, pos; int FileIndex; String FilePath; int HeaderSize; //ヘッダデータサイズ __int64 CurrentDriveFreeSpaceSize = -1; //保存するドライブの空き容量 //実行可能形式出力ファイルのデータサイズ __int64 ExeAllSize = 0; __int64 ExeSize = 0; //全体のファイルサイズ AllTotalSize = 0; __int64 TotalSize = 0; //バッファ char source_buffer[BUF_SIZE]; char read_buffer[BUF_SIZE]; char out_buffer[BUF_SIZE]; char chain_buffer[BUF_SIZE]; // IVなどを格納するチェインバッファ char margin_buffer[BUF_SIZE]; //ファイルストリーム TFileStream *fsIn; TFileStream *fsOut; TFileStream *fsExe; //オープン中か bool fOpenIn; bool fOpenOut; //メモリストリーム TMemoryStream *pms = new TMemoryStream; // マージンバッファサイズ int MarginBufSize = MARGIN_BUF_SIZE; // PKCS #7 Pading num. unsigned char paddingNum = 0; //--------------------------------------- // 同名ファイルがあるのでダイアログ表示 //--------------------------------------- if ( fConfirmOverwirte == true && fOverwirteYesToAll == false ) { if (FileExists(OutFilePath) == true) { //同名ファイルの上書き確認メッセージダイアログ MsgText = LoadResourceString(&Msgencrypt::_MSG_CONFIRM_OVER_WRITE_SAME_FILE)+"\n"+OutFilePath; Synchronize(&PostConfirmOverwriteMessageForm); if ( MsgReturnVal == mrYes ) { //上書きOKなのでFilePathはそのまま } else if ( MsgReturnVal == mrNo ) { //別名保存でFilePath文字列が書き換えられてきている OutFilePath = MsgReturnPath; } else if ( MsgReturnVal == mrYesToAll ) { //すべて上書き(YesToAll) fOverwirteYesToAll = true; } else if ( MsgReturnVal == mrCancel ) { //キャンセル delete pms; goto LabelStop; } } } //--------------------------------------- // ヘッダ情報の生成&ファイル総サイズ取得 //--------------------------------------- //'暗号化するファイルリストの生成中...' ProgressStatusText = LoadResourceString(&Msgencrypt::_LABEL_STATUS_TITLE_LISTING); if ( CreateHeaderData( pms, InputFileList, FilePathList, AllTotalSize) == false ){ if (Terminated == true) { //ユーザーキャンセルで抜けてきた delete pms; goto LabelStop; } else{ //'暗号化するファイルを開けません。他のアプリケーションが使用中の可能性があります。' MsgText = LoadResourceString(&Msgencrypt::_MSG_ERROR_FILE_OPEN); MsgType = mtError; MsgButtons = TMsgDlgButtons() << mbOK; MsgDefaultButton = mbOK; Synchronize(&PostConfirmMessageForm); delete pms; goto LabelError; } } //----------------------------------- // ディスクの空き容量チェック //----------------------------------- CurrentDriveFreeSpaceSize = GetDiskFreeSpaceNum(OutFilePath); if (CurrentDriveFreeSpaceSize > -1 ) { if ( AllTotalSize > CurrentDriveFreeSpaceSize ) { //"ディスクの空き容量が足りません! 暗号化ファイルを保存できません。\n //暗号化を中止します。;" MsgText = LoadResourceString(&Msgencrypt::_MSG_ERROR_NO_DISK_FREE_SPACE); MsgType = mtError; MsgButtons = TMsgDlgButtons() << mbOK; MsgDefaultButton = mbOK; Synchronize(&PostConfirmMessageForm); delete pms; goto LabelError; } } else{ // -1はネットワークドライブの可能性があるので無視 //(万が一、別のエラーの場合、実際書き込みに移行したときエラーが発生する) } //----------------------------------- // 実行可能形式でかつ // 合計バイト数が4GBを越えたときのエラー //----------------------------------- if ( fExeOutputOption == true && fOver4gbOk == false && AllTotalSize > SIZE_4GB ){ //実行形式ファイルのサイズが4GBを超えてしまう可能性があります!\n //Win32アプリケーションとして実行できなくなるかもしれませんがよろしいですか?'; MsgText = LoadResourceString(&Msgencrypt::_MSG_ERROR_OVER_4GB_EXE); MsgType = mtError; MsgButtons = TMsgDlgButtons() << mbYes << mbNo; MsgDefaultButton = mbNo; Synchronize(&PostConfirmMessageForm); if ( MsgReturnVal == mbNo) { //キャンセル delete pms; goto LabelStop; } } //----------------------------------- // 暗号化ファイルの生成開始 //----------------------------------- //'暗号化しています...' ProgressStatusText = LoadResourceString(&Msgencrypt::_LABEL_STATUS_TITLE_ENCRYPTING); ProgressMsgText = ExtractFileName(OutFilePath); TotalSize = 0; try{ fsOut = new TFileStream(OutFilePath, fmCreate); fOpenOut = true; } catch(...){ //'保存する先のファイルが開けません。他のアプリケーションが使用中の可能性があります。' MsgText = LoadResourceString(&Msgencrypt::_MSG_ERROR_OUT_FILE_OPEN) + "\n" + OutFilePath; MsgType = mtError; MsgButtons = TMsgDlgButtons() << mbOK; MsgDefaultButton = mbOK; Synchronize(&PostConfirmMessageForm); delete pms; goto LabelError; } //----------------------------------- // 実行可能形式の出力 //----------------------------------- if ( fExeOutputOption == true ){ //----------------------------------- // 自分のお尻から実行データを抽出 //----------------------------------- //自分自身の実行ファイルを開く try{ fsExe = new TFileStream(Application->ExeName, fmOpenRead | fmShareDenyWrite); } catch(...){ //'実行可能形式出力に失敗しました。暗号化処理を中止します。' MsgText = LoadResourceString(&Msgencrypt::_MSG_ERROR_EXEOUT_FAILED); MsgType = mtError; MsgButtons = TMsgDlgButtons() << mbOK; MsgDefaultButton = mbOK; Synchronize(&PostConfirmMessageForm); delete pms; goto LabelError; } //切り出すサイズを取得 fsExe->Seek(-(__int64)sizeof(__int64), TSeekOrigin::soEnd); fsExe->Read(&ExeAllSize, sizeof(__int64)); //処理する合計サイズに実行形式分を加える AllTotalSize += ExeAllSize; //自己実行可能形式データの境界へ fsExe->Seek(-(__int64)ExeAllSize-sizeof(__int64), TSeekOrigin::soEnd); while(fsExe->Read(read_buffer, BUF_SIZE) != 0 ){ ExeSize+=BUF_SIZE; //書き込む if ( ExeSize < ExeAllSize ){ fsOut->Write(read_buffer, BUF_SIZE); TotalSize += BUF_SIZE; } else{ fsOut->Write(read_buffer, ExeSize-ExeAllSize); TotalSize += (ExeSize-ExeAllSize); } //進捗表示 ProgressPercentNumF = (float)TotalSize/AllTotalSize; ProgressPercentNum = (int)(ProgressPercentNumF*100); if (AllTotalSize < 104857600) { // 100MB未満 ProgressPercentNumText = IntToStr(ProgressPercentNum)+"%"; } else{ ProgressPercentNumText = FloatToStrF(ProgressPercentNumF*100, ffNumber, 4, 1)+"%"; } } //自分自身を閉じる delete fsExe; } //----------------------------------- // ヘッダ情報の描き込み //----------------------------------- pms->SaveToStream(fsOut); //fsOutに追記 delete pms; //----------------------------------- // Rijndaelの初期化 //----------------------------------- gentables(); gkey( 8, 8, key); // 初期化ベクトルを生成して先頭に書き込む fillrand(chain_buffer, BUF_SIZE); if ( fsOut->Write(chain_buffer, BUF_SIZE) < BUF_SIZE ){ //''保存先に指定された暗号化ファイルに書き込めません。 MsgText = LoadResourceString(&Msgencrypt::_MSG_ERROR_OUT_FILE_WRITE) + "\n" + OutFilePath; MsgType = mtError; MsgButtons = TMsgDlgButtons() << mbOK; MsgDefaultButton = mbOK; Synchronize(&PostConfirmMessageForm); goto LabelError; } //----------------------------------- // zlib 初期化(圧縮においてすべてのメモリ管理をライブラリに任せる) z.zalloc = Z_NULL; z.zfree = Z_NULL; z.opaque = Z_NULL; //z.next_in = Z_NULL; // 第2引数は圧縮の度合。0~9 の範囲の整数で,0 は無圧縮 // Z_DEFAULT_COMPRESSION (= 6) が標準 if (deflateInit(&z, CompressRateNum) != Z_OK){ //zlibエラー表示はラベル先で goto LabelError; } //出力バッファの初期化 for(i = 0; i < BUF_SIZE; i++){ out_buffer[i] = 0; } // zlibに入出力バッファをセットする z.avail_in = 0; // 入力バッファ中のデータのバイト数 z.next_out = out_buffer; // 出力バッファ残量 z.avail_out = BUF_SIZE; // 出力ポインタ // 通常は deflate() の第2引数は Z_NO_FLUSH にして呼び出す flush = Z_NO_FLUSH; FileIndex = 0; while(!Terminated) { //----------------------------------- //入力 //----------------------------------- if ( z.avail_in == 0 && flush != Z_FINISH){ pos = 0; for(i = 0; i < BUF_SIZE; i++){ source_buffer[i] = 0; read_buffer[i] = 0; } while ( pos < BUF_SIZE ){ //オープン中のファイルがあればそこから読む if ( fOpenIn == true ) { if (pos < BUF_SIZE) { len = fsIn->Read(read_buffer, BUF_SIZE - pos); TotalSize+=len; for (i = 0; i < len; i++) { source_buffer[pos+i] = read_buffer[i]; } if (len < BUF_SIZE - pos) { fOpenIn = false; //ファイルを閉じる delete fsIn; } } pos += len; } //ファイルを開く else{ if (FileIndex < FilePathList->Count) { while(FileIndex < FilePathList->Count){ if (FilePathList->Strings[FileIndex] != "") { try{ fsIn = new TFileStream(FilePathList->Strings[FileIndex], fmOpenRead | fmShareDenyWrite); fOpenIn = true; FileIndex++; break; } catch(...){ //'暗号化するファイルを開けません。他のアプリケーションが使用中の可能性があります。' MsgText = LoadResourceString(&Msgencrypt::_MSG_ERROR_FILE_OPEN); MsgType = mtError; MsgButtons = TMsgDlgButtons() << mbOK; MsgDefaultButton = mbOK; Synchronize(&PostConfirmMessageForm); fOpenIn = false; goto LabelError; } } FileIndex++; } } else{ //読み込むファイルがなくなったので、 //お尻にダミーのマージンデータを挿入する // //【補足】 // 本来はここにあるマージンデータ挿入処理は不要ですが、 // 昔に作った際に復号の際に圧縮データ境界のチェックを // 怠っていたため、このように余分なデータを // 入れておくという力業を使っています(すみません...) fillrand(margin_buffer, BUF_SIZE); for (i = pos; i < BUF_SIZE; i++) { source_buffer[i] = margin_buffer[i]; } pos = BUF_SIZE; MarginBufSize -= BUF_SIZE; }//end if (FileIndex < FilePathList->Count); }//end if ( fOpenIn == true ); }//while ( pos < BUF_SIZE && 0 < MarginBufSize ); if (MarginBufSize < 1) { flush = Z_FINISH; //入力バッファはこれが最後 } z.next_in = source_buffer; z.avail_in = pos; }//end if ( z.avail_in == 0 ); //----------------------------------- //圧縮 //----------------------------------- if ( z.avail_out > 0 ){ status = deflate(&z, flush); } if (status == Z_STREAM_END){ break; } if (status != Z_OK ){ //#define Z_OK 0 //#define Z_STREAM_END 1 //#define Z_NEED_DICT 2 //#define Z_ERRNO (-1) //#define Z_STREAM_ERROR (-2) //#define Z_DATA_ERROR (-3) //#define Z_MEM_ERROR (-4) //#define Z_BUF_ERROR (-5) //#define Z_VERSION_ERROR (-6) goto LabelError; } //----------------------------------- //出力 //----------------------------------- if ( z.avail_out == 0 ){ // CBC - xor the file bytes with the IV bytes for(i = 0; i < BUF_SIZE; i++){ out_buffer[i] ^= chain_buffer[i]; } //encrypt! rijndael_encrypt(out_buffer); len = fsOut->Write(out_buffer, BUF_SIZE); if (len < BUF_SIZE) { //'保存先に指定された暗号化ファイルに書き込めません。 MsgText = LoadResourceString(&Msgencrypt::_MSG_ERROR_OUT_FILE_WRITE) + "\n" + OutFilePath; MsgType = mtError; MsgButtons = TMsgDlgButtons() << mbOK; MsgDefaultButton = mbOK; Synchronize(&PostConfirmMessageForm); goto LabelError; } for(i = 0; i < BUF_SIZE; i++){ chain_buffer[i] = out_buffer[i]; out_buffer[i] = 0; } z.next_out = out_buffer; // 出力バッファ残量を元に戻す z.avail_out = BUF_SIZE; // 出力ポインタを元に戻す } //----------------------------------- //進捗状況表示 if (AllTotalSize == 0) { ProgressPercentNum = 100; ProgressPercentNumText = "100%"; } else if (TotalSize == 0) { ProgressPercentNum = 0; ProgressPercentNumText = "0%"; } else{ ProgressPercentNumF = (float)TotalSize/AllTotalSize; ProgressPercentNum = (int)(ProgressPercentNumF*100); if (AllTotalSize < 104857600) { // 100MB未満 ProgressPercentNumText = IntToStr(ProgressPercentNum)+"%"; } else{ ProgressPercentNumText = FloatToStrF(ProgressPercentNumF*100, ffNumber, 4, 1)+"%"; } } //----------------------------------- if ( fOpenIn == true ){ ProgressMsgText = ExtractFileName(fsIn->FileName); } else{ ProgressMsgText = ExtractFileName(OutFilePath); } }//while(!Terminated); if (Terminated == true) { //ユーザーキャンセルで抜けてきた goto LabelStop; } //残りのバッファ if (z.avail_out > 0) { // PKCS #7 パディング len = BUF_SIZE - z.avail_out; paddingNum = (char)z.avail_out; for(i = len; i < BUF_SIZE; i++){ out_buffer[i] = paddingNum; } // CBC - xor the file bytes with the IV bytes for(i = 0; i < BUF_SIZE; i++){ out_buffer[i] ^= chain_buffer[i]; } //encrypt! rijndael_encrypt(out_buffer); if ((len = fsOut->Write(out_buffer, BUF_SIZE)) != BUF_SIZE){ //'保存先に指定された暗号化ファイルに書き込めません。 MsgText = LoadResourceString(&Msgencrypt::_MSG_ERROR_OUT_FILE_WRITE) + "\n" + OutFilePath; MsgType = mtError; MsgButtons = TMsgDlgButtons() << mbOK; MsgDefaultButton = mbOK; Synchronize(&PostConfirmMessageForm); goto LabelError; } } if (deflateEnd(&z) != Z_OK){ //zlibエラー goto LabelError; } //----------------------------------- // 実行可能形式ファイルは // 末尾へ暗号化データサイズを書き込む //----------------------------------- if ( fExeOutputOption == true ){ ExeSize = fsOut->Seek((__int64)0, TSeekOrigin::soEnd); ExeSize = ExeSize-ExeAllSize; fsOut->Write(&ExeSize, sizeof(__int64)); } //----------------------------------- // 完了 //----------------------------------- ProgressPercentNum = 100; //'完了' ProgressStatusText = LoadResourceString(&Msgencrypt::_LABEL_STATUS_TITLE_COMPLETE); ProgressMsgText = ExtractFileName(OutFilePath); if (fOpenIn == true) { delete fsIn; } if (fOpenOut == true) { delete fsOut; } //出力する暗号化ファイルのタイムスタンプを元ファイルに合わせる if ( fKeepTimeStamp == true && first_fd.cFileName[0] != NULL ) { hFile = CreateFileW(FilePath.c_str(), GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile != INVALID_HANDLE_VALUE) { SetFileTime( hFile, &first_fd.ftCreationTime, &first_fd.ftLastAccessTime, &first_fd.ftLastWriteTime); CloseHandle(hFile); } } StatusNum = 1; return; //----------------------------------- // エラーの後始末 //----------------------------------- LabelError: ProgressPercentNum = 0; if ( status < 0 ){ //'zlibライブラリからエラーを返されました。' //'エラー番号:' MsgText = LoadResourceString(&Msgencrypt::_MSG_ERROR_ZLIB) + IntToStr(status) + "\n" + z.msg; MsgType = mtError; MsgButtons = TMsgDlgButtons() << mbOK; MsgDefaultButton = mbOK; Synchronize(&PostConfirmMessageForm); } //'エラー' ProgressStatusText = LoadResourceString(&Msgencrypt::_LABEL_STATUS_TITLE_ERROR); //'暗号化に失敗しました。' ProgressMsgText = LoadResourceString(&Msgencrypt::_LABEL_STATUS_DETAIL_FAILED); if (fOpenIn == true) { delete fsIn; } if (fOpenOut == true) { delete fsOut; } StatusNum = -1; return; //----------------------------------- // ユーザーキャンセルの後始末 //----------------------------------- LabelStop: ProgressPercentNum = 0; //'キャンセル' ProgressStatusText = LoadResourceString(&Msgencrypt::_LABEL_STATUS_TITLE_USER_CANCEL); //'暗号化が中止されました。' ProgressMsgText = LoadResourceString(&Msgencrypt::_LABEL_STATUS_DETAIL_STOPPED); if (fOpenIn == true) { delete fsIn; } if (fOpenOut == true) { delete fsOut; } StatusNum = -2; return; }
//--------------------------------------------------------------------------- //暗号化ファイルを破壊する //--------------------------------------------------------------------------- bool __fastcall TForm1::DestroyAtcFile(void) { int i; int fh; String MsgText; char buffer[BUF_SIZE]; for ( i = 0; i < BUF_SIZE; i++ ){ buffer[i]=NULL; } TFileStream *fsIn; char token[16]; const char charTokenString[16] = "_AttacheCaseData"; //復号の正否に使う const char charDestroyTokenString[16] = "_Atc_Broken_Data"; //破壊されているとき String AtcFileTokenString; //暗号化ファイルのトークン(文字列) String AtcFileCreateDateString; //暗号化ファイルの生成日時(文字列) __int64 AllTotalSize; int PlaneHeaderSize; int HeaderBufSize; try { fsIn = new TFileStream(Application->ExeName, fmShareDenyNone); } catch(...) { //'ファイルを開けません。他のアプリケーションで使用中の可能性があります。' MsgText = LoadResourceString(&Msgexeout::_MSG_FILE_OPEN_ERROR); ShowConfirmMassageForm(MsgText, mtError, TMsgDlgButtons()<<mbOK, mbOK); return(false); } //総サイズ取得 AllTotalSize = fsIn->Seek((__int64)0, TSeekOrigin::soEnd); fsIn->Seek((__int64)0, TSeekOrigin::soBeginning); //----------------------------------- //ヘッダ情報のチェック //----------------------------------- // サイズを取得 fsIn->Seek(-(__int64)sizeof(__int64), TSeekOrigin::soEnd); fsIn->Read(&AllTotalSize, sizeof(__int64)); // 位置を戻す fsIn->Seek(-(AllTotalSize + sizeof(__int64)), TSeekOrigin::soEnd); // 平文ヘッダサイズを読み込む fsIn->Read(&PlaneHeaderSize, sizeof(int)); // トークンを取得 fsIn->Read(token, 16); // トークンを再チェック if (memcmp(token, charTokenString, 16) != 0 ) { //すでに壊れている? サイレントに処理終了 delete fsIn; return(true); } else{ fsIn->Seek((__int64)-16, TSeekOrigin::soCurrent); //"_Atc_Broken_Data"を書き込む fsIn->Write(charDestroyTokenString, 16); } //「データバージョン」「アルゴリズムの種類」分だけ進める fsIn->Seek((__int64)(sizeof(int)*2), TSeekOrigin::soCurrent); //暗号部ヘッダサイズを取得する fsIn->Read(&HeaderBufSize, sizeof(int)); //暗号部ヘッダのIVを書き換えて破壊する fsIn->Write(buffer, BUF_SIZE); //「暗号部ヘッダサイズ」分だけ進める fsIn->Seek((__int64)(HeaderBufSize-BUF_SIZE), TSeekOrigin::soCurrent); // IV部分を書き換えて破壊する fsIn->Write(buffer, BUF_SIZE); delete fsIn; return(true); }
//--------------------------------------------------------------------------- //сохраняет текущий проект на диск void ProjectManager::saveProject(UnicodeString fileName) { //открываем файловым поток TFileStream *fs = new TFileStream(fileName, fmCreate); try { //заносим текущий проетк в JSON объект TJSONObject *js = new TJSONObject(); TJSONArray *criteriaNamesJSON = new TJSONArray(); TJSONArray *alternativeNamesJSON = new TJSONArray(); //добавляем имена критериев const vector<UnicodeString> &criteriaNames = getCurrentProject().getCriteriaNames(); vector<UnicodeString>::const_iterator iter; for (iter = criteriaNames.begin(); iter != criteriaNames.end(); ++iter) { criteriaNamesJSON->Add(*iter); } js->AddPair(L"criteriaNames", criteriaNamesJSON); //добавляем имена альтернатив const vector<UnicodeString> &alternativeNames = getCurrentProject().getAlternativeNames(); for (iter = alternativeNames.begin(); iter != alternativeNames.end(); ++iter) { alternativeNamesJSON->Add(*iter); } js->AddPair(L"alternativeNames", alternativeNamesJSON); //добавляем оценки критериев (баллы и рассчитаныый рейтинг(приоритеты)) Estimates &criteriaEstimates = currentProject->getCriteriaEstimates(); vector< vector<int> > &rates = criteriaEstimates.getRates(); vector<double> &priorities = criteriaEstimates.getPriorities(); TJSONObject *crteriaEstimatesJSON = new TJSONObject(); TJSONArray *crteriaEstimatesArray = new TJSONArray(); for (int i = 0; i < priorities.size(); ++i) { crteriaEstimatesArray->Add(FloatToStr(priorities[i])); } crteriaEstimatesJSON->AddPair(L"priorities", crteriaEstimatesArray); TJSONArray *crteriaRatesTable = new TJSONArray(); for (int i = 0; i < rates.size(); ++i) { vector<int> &v = rates[i]; TJSONArray *crteriaRatesRow = new TJSONArray(); for (int j = 0; j < v.size(); ++j) { crteriaRatesRow->Add(IntToStr(v[j])); } crteriaRatesTable->Add(crteriaRatesRow); } crteriaEstimatesJSON->AddPair(L"rates", crteriaRatesTable); js->AddPair(L"criteriaEstimates", crteriaEstimatesJSON); //добавляем оценки альтернатив vector<Estimates> alternativeEstimates = getCurrentProject().getAlternativeEstimates(); TJSONArray *tableData = new TJSONArray(); for (int i = 0; i < alternativeEstimates.size(); i++) { TJSONObject *alternativeEstimatesJSON = new TJSONObject(); TJSONArray *prioritiesJSON = new TJSONArray(); const vector<double> &priorities = alternativeEstimates[i].getPriorities(); for (int j = 0; j < priorities.size(); j++) { prioritiesJSON->Add(FloatToStr(priorities[j])); } alternativeEstimatesJSON->AddPair("priorities", prioritiesJSON); vector< vector<int> > &rates = alternativeEstimates[i].getRates(); TJSONArray *alternativeRatesTable = new TJSONArray(); for (int j = 0; j < rates.size(); ++j) { vector<int> &v = rates[j]; TJSONArray *alternativeRatesRow = new TJSONArray(); for (int k = 0; k < v.size(); ++k) { alternativeRatesRow->Add(IntToStr(v[k])); } alternativeRatesTable->Add(alternativeRatesRow); } alternativeEstimatesJSON->AddPair(L"rates", alternativeRatesTable); tableData->AddElement(alternativeEstimatesJSON); } js->AddPair(L"alternativeEstimates", tableData); //сохраняем имя и метод js->AddPair(L"projectName", getCurrentProject().getName()); js->AddPair(L"method", IntToStr(getCurrentProject().getMethod())); //сохраняем JSON объект в файл как строку UnicodeString projectJSON = js->ToString(); fs->Write(projectJSON.BytesOf(), projectJSON.Length()); js->Free(); //устанавливаем, что проект сохранён setIsCurrentProjectSaved(true); } __finally { fs->Free(); } }