//--------------------------------------------------------------------------- void __fastcall TfrmMain::btnPreviewClick(TObject *Sender) { int i,j; TJvDesktopAlert* DA; TJvDesktopAlertOptions FOptions; for (i = 0; i < udWindowCount->Position; i++) { DA = new TJvDesktopAlert(this); DA->Images = imlCustBtns; DA->HeaderText = Format("%s (%d)", ARRAYOFCONST((edHeader->Text, FCount))); DA->MessageText = edMessage->Text; DA->Image = Image1->Picture; DA->OnMessageClick = DoMessageClick; DA->OnShow = DoAlertShow; DA->OnClose = DoAlertClose; FOptions = TJvDesktopAlertOptions(); DA->Options = FOptions; DA->Location->AlwaysResetPosition = false; DA->Location->Position = static_cast<TJvDesktopAlertPosition>(cbLocation->ItemIndex); DA->Location->Width = StrToIntDef(edWidth->Text,0); DA->Location->Height = StrToIntDef(edHeight->Text,0); if (DA->Location->Position == dapCustom) { DA->Location->Left = random(Screen->Width - 200); DA->Location->Top = random(Screen->Height - 100); } DA->AlertStyle = static_cast<TJvAlertStyle>(cmbStyle->ItemIndex); DA->StyleHandler->StartInterval = udFadeIn->Position; DA->StyleHandler->StartSteps = udStartSteps->Position; DA->StyleHandler->DisplayDuration = udWait->Position; // + Random(WaitTime); DA->StyleHandler->EndInterval = udFadeOut->Position; DA->StyleHandler->EndSteps = udEndSteps->Position; if (chkClickable->Checked) FOptions << daoCanClick; if (chkMovable->Checked) FOptions << daoCanMove; if (chkClose->Checked) FOptions << daoCanClose; DA->Options = FOptions; if (chkShowDropDown->Checked) DA->DropDownMenu = PopupMenu1; for (j = 0; j < udButtons->Position; j++) { TJvDesktopAlertButtonItem* btn = DA->Buttons->Add(); btn->ImageIndex = random(imlCustBtns->Count); btn->Tag = j; btn->OnClick = DoButtonClick; } DA->Execute(); } }
//--------------------------------------------------------------------------- bool __fastcall TForm8::CheckValues() { switch (BeaconDevice1->BeaconType) { case TBeaconDeviceMode::Standard: case TBeaconDeviceMode::Alternative: if (!CheckUUID()) { return False; } break; case TBeaconDeviceMode::EddystoneUID: SetNamespaceGeneration(); switch (BeaconDevice1->NamespaceGenerator) { case ngNone: case ngHashFQDN: if (EdtEddyNamespace->Text == "") { ShowMessage("Please, enter a valid Namespace"); EdtEddyNamespace->SetFocus(); return False; } break; case ngElidedUUID: if (!CheckUUID()) { return False; } break; } if (EdtEddyInstance->Text == "") { ShowMessage("Please, enter a valid Instance value"); EdtEddyNamespace->SetFocus(); return False; } break; case TBeaconDeviceMode::EddystoneURL: if (EdtEddyURL->Text == "") { ShowMessage("Please, enter a URL"); EdtEddyURL->SetFocus(); return False; } break; } FMajor = StrToIntDef(EdtBeaconMajor->Text, 0); EdtBeaconMajor->Text = IntToStr(FMajor); FMinor = StrToIntDef(EdtBeaconMinor->Text, 0); EdtBeaconMinor->Text = IntToStr(FMinor); FTxPower = StrToIntDef(EdTxPower->Text, -56); EdTxPower->Text = IntToStr(FTxPower); FEddyNamespace = EdtEddyNamespace->Text; FEddyInstance = EdtEddyInstance->Text; FEddyURL = EdtEddyURL->Text; return True; }
//--------------------------------------------------------------------------- bool __fastcall TRawPrint::ValidaComando(AnsiString Comando) { bool Retorno; AnsiString Parametro; int Indice = 1; int Valor; try { for(int i = 0; i < Comando.Length() / 3; i++)//Percorre o Comando { Parametro = Comando.SubString(Indice, 3); if(Indice < 4) Indice = Indice + 3 + i; else Indice = Indice + 3;//Índice de Início do Último Parâmetro (7) Valor = StrToIntDef(Parametro, -1); //Verifica se é Inteiro if(Valor >= 0 && Valor < 256) //Verifica se o Valor do Parâmetro está de acordo com Manual da Epson { Retorno = true; } else { Retorno = false; } } } catch(Exception & E) { Erro("Erro ao validar Comando informado no Texto.\r\n\r\n" + E.Message + "\r\n"); } return Retorno; };
//----------------------------------------------------------- //return no of times function key {xx y} will be pressed //strip out count charcters int GetFunctionKeyCount(CString &fk) { int rv=1; int numstart=fk.LastDelimiter(" "); if (numstart!=0 && numstart<fk.GetLength()) { //extract count rv=StrToIntDef(fk.SubString(numstart,999),-1); //valid numeric characters? if (rv>=0) { //strip out count characters fk=fk.SubString(1,numstart-1); } else { rv=1; } } return rv; }
string CWRequest::GetScriptURL(bool bRelative) { if(bRelative) return Env->GetValue("SCRIPT_NAME"); string link = ""; int server_port = StrToIntDef(Env->GetValue("SERVER_PORT"), -1); if(Env->GetValue("HTTPS") == "on") { link.append("https://"); link.append(Env->GetValue("SERVER_NAME")); if(server_port > 0 && server_port != 443) link.append(":" + IntToStr(server_port)); } else { link.append("http://"); link.append(Env->GetValue("SERVER_NAME")); if(server_port > 0 && server_port != 80) link.append(":" + IntToStr(server_port)); } link.append(Env->GetValue("SCRIPT_NAME")); return link; }
void __fastcall TFormOptions::btnOKClick(TObject *Sender) { FormMain->VideoInterval = StrToIntDef(EditVideoInt->Text, 100); FormMain->PenWidth = StrToIntDef(EditPenWidth->Text,2); FormMain->Dir_AceToolBox = EditDirAce->Text; FormMain->Dir_SegTools = EditDirSeg->Text; FormMain->Dir_StoredData = EditDirOut->Text; FormMain->SegExe = EditSegExe->Text; FormMain->SegOptions = EditSegOptions->Text; FormMain->ActionForward->ShortCut = HotKeyFrameFWD->HotKey; FormMain->ActionBackward->ShortCut = HotKeyFrameREW->HotKey; FormMain->ActionBBWI->ShortCut = HotKeyBBWI->HotKey; FormMain->ActionBBWD->ShortCut = HotKeyBBWD->HotKey; FormMain->ActionBBHI->ShortCut = HotKeyBBHI->HotKey; FormMain->ActionBBHD->ShortCut = HotKeyBBHD->HotKey; }
int TFastIniSection::ReadInteger(AnsiString Key, int Default) { int index = SearchKey(Key); if (index >= 0){ return StrToIntDef(Values(index), Default); }else{ return Default; } }
//--------------------------------------------------------------------------- bool __fastcall TForm8::CheckValues() { try { FGuid = StringToGUID("{" + EdtBeaconUUID->Text + "}"); } catch (EConvertError &e) { ShowMessage(EdtBeaconUUID->Text + " is not a valid UUID value"); return False; } FMajor = StrToIntDef(EdtBeaconMajor->Text, 0); EdtBeaconMajor->Text = IntToStr(FMajor); FMinor = StrToIntDef(EdtBeaconMinor->Text, 0); EdtBeaconMinor->Text = IntToStr(FMinor); FTxPower = StrToIntDef(EdTxPower->Text, -56); EdTxPower->Text = IntToStr(FTxPower); return True; }
void __fastcall TTimelineMainForm::btnAddClick(TObject *Sender) { TJvTimeItem* aItem; aItem = TimeLine1->Items->Add(); aItem->Caption = edCaption->Text; aItem->ImageIndex = StrToIntDef(edImIndex->Text, -1); aItem->Level = StrToIntDef(edLevel->Text, 0); aItem->Date = dtpItemDate->Date; aItem->Color = FCurColor; if( FCurColor != clWhite ) { aItem->TextColor = clWhite; } else { aItem->TextColor = clBlack; } }
//--------------------------------------------------------------------------- TDrawing::TDrawing(AnsiString S) : TList(), m_nTool(0), m_TmpItem(NULL), m_nDragMode(0), m_nDragIndex(0), m_bDrawRequest(true), m_bModified(false), m_nPenColor(TColor(0x7fffffff)), m_nBrushColor(TColor(-1)) { //文字列からデコード int count = StrToIntDef(AnsiString("0x") + S.SubString(1, 8), 0); int pos = 9; for (int i = 0 ; i < count ; i++) { int len = StrToIntDef(AnsiString("0x") + S.SubString(pos, 8), 0); pos += 8; Add(new TDrawingItem(S.SubString(pos, len))); pos += len; } }
long TIniFile::ReadInteger(const wxString &Section, const wxString &Ident, long Default) { long result; wxString IntStr; IntStr = ReadString(Section, Ident, wxT("")); // convert a Hex-Value if ((Length(IntStr) > 2) && (IntStr.GetChar(1) == '0') && ((IntStr.GetChar(2) == 'X') || (IntStr.GetChar(2) == 'x'))) IntStr = wxT("$") + Copy(IntStr, 3, MaxInt); result = StrToIntDef(IntStr, Default); return result; }
//--------------------------------------------------------------------------- void TFileFr::FromDialog(TStorageFile * p) { p->SetFileName(FileEdit->Text); if( RotationRB2->Checked ) p->rotation_type = 1; else if( RotationRB3->Checked ) p->rotation_type = 2; else p->rotation_type = 0; p->rotation_size = StrToIntDef(SizeEdit->Text, 10); if( p->rotation_size < 1 ) p->rotation_size = 1; if( MultCB->ItemIndex == -1 ) p->rotation_mult = 1; else p->rotation_mult = MultCB->ItemIndex; if( MomentCB->ItemIndex == -1 ) p->rotation_moment = 1; else p->rotation_moment = MomentCB->ItemIndex; p->rotation_hour = StrToIntDef(HourEdit->Text, 0); if( p->rotation_hour < 0 || p->rotation_hour > 23 ) p->rotation_hour = 0; if( RenamingRB0->Checked ) p->rotation_renaming = 0; else p->rotation_renaming = 1; p->rotation_name = NewNameEdit->Text.Trim(); p->rotation_count = StrToIntDef(CountEdit->Text, 1); if( p->rotation_count < 1 ) p->rotation_count = 1; }
void __fastcall TfrmPropVisor::UpClickInt(TObject *Sender) { const int inc = 1; int value; try{ value = StrToIntDef(((TEdit*)((TCSpinButton*)Sender)->FocusControl)->Text, 1); }catch(...){ return;} if( (value + inc) <= ((TEdit*)((TCSpinButton*)Sender)->FocusControl)->Tag ) value += inc; else value = ((TEdit*)((TCSpinButton*)Sender)->FocusControl)->Tag; ((TEdit*)((TCSpinButton*)Sender)->FocusControl)->Text = FloatToStr(value); }
//--------------------------------------------------------------------------- void __fastcall TEditorForm::GoToLine() { UnicodeString Str; if (InputDialog(LoadStr(EDITOR_GO_TO_LINE), LoadStr(EDITOR_LINE_NUMBER), Str)) { int Line = StrToIntDef(Str, -1); if (Line <= 0 || Line > EditorMemo->Lines->Count) { throw Exception(MainInstructions(LoadStr(EDITOR_INVALID_LINE))); } else { EditorMemo->CaretPos = TPoint(0, Line-1); } } }
bool TController::editLink(TLink *lnk) { if (lnk == NULL) //создание новой ссылки { TLink *link = new TLink; link->szNumber = STR(formLink->teNum->Text); link->ulWorkNum = StrToIntDef(formLink->teWorkNum->Text, 0); link->dtDate = formLink->dtDate->Date; link->center = VController->nowPoint; link->slText->Text = formLink->memoTitle->Text; bool isCorrect = true; for(int i=0; i<selectedKHR->Works.size(); i++) { if (link->ulWorkNum == selectedKHR->Works[i]->ulWorkNum) isCorrect = false; } if (link->ulWorkNum == 0) isCorrect = false; if (isCorrect) { selectedKHR->Links.push_back(link); return true; } else { link->ulWorkNum = 100000 + selectedKHR->Links.size() + 1; // ShowMessage("Неверная ссылка"); // delete link; // return false; selectedKHR->Links.push_back(link); return true; } } else // редактирование { lnk->szNumber = STR(formLink->teNum->Text); lnk->ulWorkNum = StrToInt(formLink->teWorkNum->Text); lnk->dtDate = formLink->dtDate->Date; lnk->center = VController->nowPoint; lnk->slText->Text = formLink->memoTitle->Text; } }
void __fastcall TfrmDSAKeys::btnCreateKeysClick(TObject *Sender) { Screen->Cursor = crHourGlass; StatusBar1->SimpleText = "Generating key pair, this may take a while"; try { LbDSA1->PrimeTestIterations = (unsigned char) StrToIntDef(edtIterations->Text, 20); LbDSA1->KeySize = TLbAsymKeySize(cbxKeySize->ItemIndex); LbDSA1->GenerateKeyPair(); UpdatePrivateKeyFields(); UpdatePublicKeyFields(); } __finally { Screen->Cursor = crDefault; StatusBar1->SimpleText = ""; } }
//--------------------------------------------------------------------------- void __fastcall TForm1::btnCreateKeysClick(TObject *Sender) { Screen->Cursor = crHourGlass; StatusBar1->SimpleText = "Generating key pair, this may take a while"; try { LbRSA1->PrimeTestIterations = StrToIntDef(edtIterations->Text, 20); LbRSA1->KeySize = TLbAsymKeySize(cbxKeySize->ItemIndex); LbRSA1->GenerateKeyPair(); edtPublicE->Text = LbRSA1->PublicKey->ExponentAsString; edtPublicM->Text = LbRSA1->PublicKey->ModulusAsString; edtPrivateE->Text = LbRSA1->PrivateKey->ExponentAsString; edtPrivateM->Text = LbRSA1->PrivateKey->ModulusAsString; } catch (...) { } // swallow any errors Screen->Cursor = crDefault; StatusBar1->SimpleText = ""; }
//--------------------------------------------------------------------------- void __fastcall TSynchronizeChecklistDialog::CreateParams(TCreateParams & Params) { if (!FFormRestored) { FFormRestored = True; UnicodeString WindowParams = CustomWinConfiguration->SynchronizeChecklist.WindowParams; bool CustomPos = (StrToIntDef(::CutToChar(WindowParams, L';', true), 0) != 0); if (!CustomPos && (Application->MainForm != NULL)) { BoundsRect = Application->MainForm->BoundsRect; } else { RestoreForm(WindowParams, this); } } TForm::CreateParams(Params); }
//--------------------------------------------------------------------------- void __fastcall TfrmMain::btnLaunchClick(TObject *Sender) { TJvIconKind LIcon; int LImageIndex; int LVisibleTime; TControl * LCtrl; if (rgrDefaultIcon->ItemIndex >= 0) LIcon = static_cast<TJvIconKind>(rgrDefaultIcon->ItemIndex); else LIcon = ikNone; LImageIndex = -1; if (LIcon == Jvballoonhint::ikCustom) { LImageIndex = ilbDefaultImageIndex->ItemIndex; if (LImageIndex < 0) LIcon = ikNone; } if (cmbAnchorCtrl->ItemIndex >= 0) LCtrl = dynamic_cast<TControl*>(cmbAnchorCtrl->Items->Objects[cmbAnchorCtrl->ItemIndex]); else LCtrl = NULL; LVisibleTime = StrToIntDef(edtVisibleTime->Text, 5000); switch(LIcon) { case ikNone: JvBalloonHint1->ActivateHint(LCtrl, memMessage->Text, edtHeader->Text, LVisibleTime); case Jvballoonhint::ikCustom: JvBalloonHint1->ActivateHint(LCtrl, memMessage->Text, LImageIndex, edtHeader->Text, LVisibleTime); default: JvBalloonHint1->ActivateHint(LCtrl, memMessage->Text, LIcon, edtHeader->Text, LVisibleTime); } }
void TGuiToProfile::_actionTypeSettings() { // Shortcut for readability & convenience: TFrameActionTypeSettings* frACTSETS = f_Main->fr_ActionTypeSettings; // Shortcut for readability: abakt::TConfig::TActions* act = &PProfile->config.Actions; #ifdef ABT_TEST if (act == NULL) ShowMessage(__FUNC__ ": [act] can not be NULL"); #endif // Zip: /* The cmbx_Zip_... objects get their values from act->Zip, so it is safe to use setIndex(). */ act->Zip->eMethod->setIndex( _actZipMethod() ); act->Zip->eStorePath->setIndex( (TActZipStorePath)frACTSETS->cmbx_Zip_StorePath->ItemIndex ); act->Zip->iCompression->set( frACTSETS->ud_Zip_Compression->Position ); act->Zip->tPassword->value = frACTSETS->ed_Zip_Password->Text; act->Zip->bSplit->value = frACTSETS->cb_Zip_Split->Checked; act->Zip->eSplitPreset->setIndex( frACTSETS->cmbx_Zip_SplitVolumeSizePreset->ItemIndex ); act->Zip->iSplitCustomSize->set( StrToIntDef(frACTSETS->ed_Zip_SplitCustomSize->Text, act->Zip->iSplitCustomSize->getMin()) ); act->Zip->bAddComment->value = frACTSETS->cb_Zip_AddComment->Checked; act->Zip->tCommentTemplate->value = frACTSETS->ed_Zip_CommentTemplate->Text; // 7-Zip: act->SevenZip->tCommandLineTemplate->value = frACTSETS->ed_7z_Template->Text; act->SevenZip->tCommand->value = frACTSETS->ed_7z_Command->Text; act->SevenZip->tArchiveType->value = frACTSETS->cmbx_7z_ArchiveType->Text; act->SevenZip->tPassword->value = frACTSETS->ed_7z_Password->Text; // File: act->File->bOverwrite->value = frACTSETS->cb_File_Overwrite->Checked; act->File->bOverwriteReadOnly->value = frACTSETS->cb_File_OverwriteReadOnly->Checked; act->File->bUseRecycleBin->value = frACTSETS->cb_File_UseRecycleBin->Checked; //removed 095b1: act->File->bUseSHFileOperation->value = frACTSETS->cb_File_UseSHFileOperation->Checked; act->File->ePathInformation->setIndex( (TActZipStorePath)frACTSETS->cmbx_File_PathInformation->ItemIndex ); }
//--------------------------------------------------------------------- bool __fastcall TSynchronizeChecklistDialog::Execute(TSynchronizeChecklist * Checklist) { FChecklist = Checklist; bool Result = (ShowModal() == DefaultResult(this)); if (Result) { for (int Index = 0; Index < ListView->Items->Count; Index++) { TListItem * Item = ListView->Items->Item[Index]; // const violation ! TSynchronizeChecklist::TItem * ChecklistItem = static_cast<TSynchronizeChecklist::TItem *>(Item->Data); ChecklistItem->Checked = Item->Checked; } TSynchronizeChecklistConfiguration FormConfiguration = CustomWinConfiguration->SynchronizeChecklist; FormConfiguration.ListParams = ListView->ColProperties->ParamsStr; UnicodeString WindowParams = FormConfiguration.WindowParams; // if there is no main window, keep previous "custom pos" indication, bool CustomPos = (StrToIntDef(::CutToChar(WindowParams, L';', true), 0) != 0); if (Application->MainForm != NULL) { CustomPos = (Application->MainForm->BoundsRect != BoundsRect); } FormConfiguration.WindowParams = FORMAT(L"%d;%s", ((CustomPos ? 1 : 0), StoreForm(this))); CustomWinConfiguration->SynchronizeChecklist = FormConfiguration; } return Result; }
//--------------------------------------------------------------------------- TDrawingItem::TDrawingItem(AnsiString S) : TList(), m_bSelected(true), m_bExist(true) { //文字列からデコード m_nType = StrToIntDef(AnsiString("0x") + S.SubString(1, 8), 0); m_nPenColor = (TColor)StrToIntDef(AnsiString("0x") + S.SubString(9, 8), 0); m_nBrushColor = (TColor)StrToIntDef(AnsiString("0x") + S.SubString(17, 8), 0); int count = StrToIntDef(AnsiString("0x") + S.SubString(25, 8), 0); int pos = 33; for (int i = 0 ; i < 4 ; i++) { int l = StrToIntDef(AnsiString("0x") + S.SubString(pos, 8), 0); pos += 8; m_Rect[i] = *(float*)&l; } for (int i = 0 ; i < count ; i++) { Add((void*)StrToIntDef(AnsiString("0x") + S.SubString(pos, 8), 0)); pos += 8; } }
//--------------------------------------------------------------------------- void __fastcall TfrmMain::edtCustomAnimationTimeChange(TObject *Sender) { JvBalloonHint1->CustomAnimationTime = StrToIntDef(edtCustomAnimationTime->Text, 0); }
//=========================================================================== //スレッド実行 //=========================================================================== void __fastcall TAttacheCaseFileDecrypt2::Execute() { int i, c, len; float ProgressPercentNumF; //進捗パーセンテージ(浮動小数点) // バッファ char source_buffer[BUF_SIZE]; char temp_buffer[BUF_SIZE]; char chain_buffer[BUF_SIZE]; char output_buffer[LARGE_BUF_SIZE]; char *headerbuffer; //パスワード bool fPasswordOk; //const int KeyArrayNum = sizeof(key)/sizeof(key[0]); String FilePath, FileName; // ファイルストリーム TFileStream *fsIn; TFileStream *fsOut; bool fInputFileOpen = false; bool fOutputFileOpen = false; float free_space_required; __int64 CurrentPos, TotalSize; __int64 CurrentDriveFreeSpaceSize; //処理する合計サイズ AllTotalSize = 0; int ret; //バッファ出力の返値 int FileIndex = 0; char token[17] = {0, }; const char charTokenString[17] = "_AttacheCaseData"; //復号の正否に使う const char charBrokenToken[17] = "_Atc_Broken_Data"; //ファイルが破壊されていることを示すトークン String AtcFileTokenString; //暗号化ファイルのトークン(文字列) String AtcFileCreateDateString; //暗号化ファイルの生成日時(文字列) //「復号したファイルを関連付けされたソフトで開く」一時的な設定 fTempOpenFile = fOpenFile; //フォルダーを一度開いたか(深いフォルダーすべてを開かないように) fOpenFolderOnce = false; // 出力するディレクトリ OutDirPath = IncludeTrailingPathDelimiter(OutDirPath); String TempRelativePath; // 平文ヘッダサイズ(データサブバージョン、破壊設定など) int PlainHeaderSize = 0; // 暗号化部分のヘッダサイズ int EncryptHeaderSize = 0; int DataVersion; // ver.2.00~は "5", ver.2.70~は "6" int AlgorismType; char reserved; // 0 //int TypeLimits; // ミスタイプ回数 0~10 (グローバル:public宣言とした) //bool fDestroy; // 破壊するか否か 0 or 1 (グローバル:public宣言とした) String PrefixString; //ファイルリストの接頭辞(Fn_*, U_*) int flush, status; // zlib z_stream z; // zlibライブラリとやりとりするための構造体 bool fInputEnd = false; // 入力ストリームの終了 //ヘッダデータから必要情報を取り出すための TMemoryStream *pms; // メモリストリーム int idx; TStringList *DataList; TStringList *tsv; TStringList *FileList = new TStringList(); // 0: ファイル名 __int64 *FileSizeList = 0; // 1: ファイルサイズ(フォルダは-1) int *FileAttrList = 0; // 2: 属性 int *FileDtChangeList = 0; // 3: 更新日 int *FileTmChangeList = 0; // 4: 更新時 int *FileDtCreateList = 0; // 5: 作成日 int *FileTmCreateList = 0; // 6: 作成時 int rest; int buf_size; //---------------------------------------------------------------------- // 平文のヘッダ内容チェック try { fsIn = new TFileStream(AtcFilePath, fmOpenRead | fmShareDenyNone); } catch(...) { //'復号するファイルを開けません。他のアプリケーションが使用中の可能性があります。' MsgText = LoadResourceString(&Msgdecrypt::_MSG_ERROR_FILE_OPEN); MsgType = mtError; MsgButtons = TMsgDlgButtons() << mbOK; MsgDefaultButton = mbOK; Synchronize(&PostConfirmMessageForm); goto LabelError; } fInputFileOpen = true; // 平文ヘッダサイズを取得 fsIn->Read(&PlainHeaderSize, sizeof(int)); // トークンを取得 fsIn->Read(token, 16); if (StrComp(token, charTokenString) != 0 ) { //-------------------------------------------------------- //実は自己実行形式ファイル?(拡張子偽装されている場合も) //-------------------------------------------------------- // サイズを再取得 fsIn->Seek(-(__int64)sizeof(__int64), TSeekOrigin::soEnd); fsIn->Read(&AllTotalSize, sizeof(__int64)); // 位置を戻す fsIn->Seek(-(AllTotalSize + sizeof(__int64)), TSeekOrigin::soEnd); // もう一度、平文ヘッダサイズを読み込む fsIn->Read(&PlainHeaderSize, sizeof(int)); // もう一度、トークンを取得 fsIn->Read(token, 16); // トークンを再チェック if (StrComp(token, charTokenString) != 0 ) { if ( StrComp(token, charBrokenToken) == 0 ) { //'復号するファイルを開けません。この暗号化ファイルは破壊されています。' MsgText = LoadResourceString(&Msgdecrypt::_MSG_ERROR_FILE_BROKEN); MsgType = mtError; MsgButtons = TMsgDlgButtons() << mbOK; MsgDefaultButton = mbOK; Synchronize(&PostConfirmMessageForm); } else { // '暗号化ファイルではありません。アタッシェケースによって暗号化されたファイルでないか、'+#13+ // 'ファイルが壊れている可能性があります。' MsgText = LoadResourceString(&Msgdecrypt::_MSG_ERROR_FILE_NOT_ATC); MsgType = mtError; MsgButtons = TMsgDlgButtons() << mbOK; MsgDefaultButton = mbOK; Synchronize(&PostConfirmMessageForm); } goto LabelError; } } //----------------------------------- // データバージョンチェック //----------------------------------- DataVersion = -1; fsIn->Read(&DataVersion, sizeof(int)); if (DataVersion > ATC_DATA_FILE_VERSION && DataVersion < 200) { //'データバージョンがちがいます。復号できません。'+#13+ //'ファイルは上位バージョンのアタッシェケースで暗号化されています。'+#13+ //'最新版を入手して復号を試みてください。'; MsgText = LoadResourceString(&Msgdecrypt::_MSG_ERROR_FILE_HIGHER_VERSION); MsgType = mtError; MsgButtons = TMsgDlgButtons() << mbOK; MsgDefaultButton = mbOK; Synchronize(&PostConfirmMessageForm); goto LabelError; } else if (DataVersion <= 103) { // Blowfishで暗号化されたファイル // 正式版では正常に復号されるが、ここではエラーとする //'データバージョンがちがいます。復号できません。'+#13+ //'ファイルはver.1のアタッシェケースで暗号化されています。'+#13+ //'古いバージョン(ver.2.75以前)か正式版を入手して復号を試みてください。'; MsgText = LoadResourceString(&Msgdecrypt::_MSG_ERROR_FILE_LOWER_VERSION); MsgType = mtError; MsgButtons = TMsgDlgButtons() << mbOK; MsgDefaultButton = mbOK; Synchronize(&PostConfirmMessageForm); goto LabelError; } else { // 104 ~ // Rijndaelで暗号化されている // アルゴリズムタイプ fsIn->Read(&AlgorismType, sizeof(int)); // ヘッダサイズを読み込む fsIn->Read(&EncryptHeaderSize, sizeof(int)); // int型からポインタキャストでchar配列を取り出す headerbuffer = (char*) & PlainHeaderSize; // データサブバージョンチェック(ver.2.70~) if (headerbuffer[0] >= 6) { TypeLimits = (int)headerbuffer[2]; fDestroy = (bool)headerbuffer[3]; // 有効範囲(1~10)かチェック if (TypeLimits < 1 || 10 < TypeLimits) { TypeLimits = 3; // デフォルト } } else { // headerbuffer[0] == 5 //旧バージョン TypeLimits = 3; fDestroy = false; } } //----------------------------------- // 復号の準備 //----------------------------------- // テーブル生成 gentables(); // パスワードのセット gkey(8, 8, key); //----------------------------------- // 暗号部ヘッダの復号 //----------------------------------- pms = new TMemoryStream; // IVの読み込み fsIn->Read(chain_buffer, BUF_SIZE); len = 0; while (len < EncryptHeaderSize) { // 読み出しバッファ for (c = 0; c < BUF_SIZE; c++) { source_buffer[c] = 0; } // 暗号化されたデータブロックの読み出し len += fsIn->Read(source_buffer, BUF_SIZE); for (c = 0; c < BUF_SIZE; c++) { // あとのxorのためによけておく temp_buffer[c] = source_buffer[c]; } // 復号処理 rijndael_decrypt(source_buffer); // xor for (c = 0; c < BUF_SIZE; c++) { source_buffer[c] ^= chain_buffer[c]; chain_buffer[c] = temp_buffer[c]; // CBC } pms->Write(source_buffer, BUF_SIZE); } pms->Seek((__int64)0, TSeekOrigin::soBeginning); //ポインタを先頭へ戻す DataList = new TStringList; DataList->LoadFromStream(pms, TEncoding::GetEncoding(932)); // shift-jis //----------------------------------- // 復号正否(復号できたか) //----------------------------------- //MsgText = DataList->Strings[0]; //MsgType = mtError; //MsgButtons = TMsgDlgButtons() << mbOK; //MsgDefaultButton = mbOK; //Synchronize(&PostConfirmMessageForm); if (DataList->Count == 0 || DataList->Strings[0].Pos("AttacheCase") == 0) { fPasswordOk = false; } else{ fPasswordOk = true; //パスワード合致 } if ( fPasswordOk == false ) { //'パスワードがちがいます。復号できません。'+#13+ //'場合によってはファイルが壊れている可能性もあります。'; MsgText = LoadResourceString(&Msgdecrypt::_MSG_ERROR_PASSWORD_WRONG); if ( fCompare == true ) { //メッセージに'コンペアに失敗しました。'を追加 MsgText += "\n" + LoadResourceString(&Msgdecrypt::_MSG_ERROR_COMPARE_FILE); } MsgType = mtError; MsgButtons = TMsgDlgButtons() << mbOK; MsgDefaultButton = mbOK; Synchronize(&PostConfirmMessageForm); delete DataList; goto LabelTypeMiss; } //----------------------------------- // 復号時のエンコーディング判定 //----------------------------------- pms->Position = 0; //DataList->LoadFromStream(pms, TEncoding::UTF8); DataList->LoadFromStream(pms, TEncoding::GetEncoding(65001)); PrefixString = "Fn_"; for (i = 0; i < DataList->Count; i++) { if ( DataList->Strings[i].Pos("U_0") == 1){ PrefixString = "U_"; //新バージョン(ver.2.8.0~)で暗号化されているようだ break; } } // Unicodeではないので従来のShift-JISで再度読み直し if (PrefixString == "Fn_") { pms->Position = 0; DataList->LoadFromStream(pms, TEncoding::GetEncoding(932)); } //=================================== // デバッグ //ShowMessage(DataList->Text); //=================================== #ifdef _DEBUG DataList->SaveToFile(OutDirPath + ExtractFileName(AtcFilePath) + ".txt"); #endif delete pms; //----------------------------------- // 暗号化ファイルの生成日時 //----------------------------------- //※特に今は使用していないが、将来的に // 期限付きでファイルを復号できなくなる // などの機能を追加しても良いかも。 //----------------------------------- AtcFileCreateDateString = DataList->Strings[1]; //----------------------------------- // ヘッダデータからファイルリストや // ファイル情報などを各変数を動的確保 //----------------------------------- FileSizeList = new __int64[DataList->Count]; // 1: ファイルサイズ(フォルダは-1) FileAttrList = new int[DataList->Count]; // 2: 属性 FileDtChangeList = new int[DataList->Count]; // 3: 更新日 FileTmChangeList = new int[DataList->Count]; // 4: 更新時 FileDtCreateList = new int[DataList->Count]; // 5: 作成日 FileTmCreateList = new int[DataList->Count]; // 6: 作成時 DataList->NameValueSeparator = ':'; tsv = new TStringList; tsv->Delimiter = '\t'; tsv->StrictDelimiter = true; char lpPath[MAX_PATH]; for (i = 0; i < DataList->Count; i++) { idx = DataList->IndexOfName(PrefixString+IntToStr(i)); if (idx > 0) { tsv->DelimitedText = DataList->ValueFromIndex[idx]; // ディレクトリ・トラバーサル対策(ver.2.8.5.0~) bool fDirectoryTraversal = false; AnsiString CanonicalizePath = AnsiString(OutDirPath + tsv->Strings[0]); if (CanonicalizePath.Length() < MAX_PATH) { // ファイルパスを正規化 if (PathCanonicalize(lpPath, CanonicalizePath.c_str()) == true) { // 正規化したパスが保存先と一致するか if (AnsiString(lpPath).Pos(OutDirPath) != 1 ){ fDirectoryTraversal = true; } } else{ fDirectoryTraversal = true; } } else{ fDirectoryTraversal = true; } if (fDirectoryTraversal == true) { //'不正なファイルパスが含まれています。復号できません。'; MsgText = LoadResourceString(&Msgdecrypt::_MSG_ERROR_INVALID_FILE_PATH) + "\n" + CanonicalizePath; MsgType = mtError; MsgButtons = TMsgDlgButtons() << mbOK; MsgDefaultButton = mbOK; Synchronize(&PostConfirmMessageForm); delete DataList; goto LabelTypeMiss; } FileList->Add(tsv->Strings[0]); // 0: ファイルパス FileSizeList[i] = StrToIntDef(tsv->Strings[1], -1); // 1: ファイルサイズ(フォルダは-1) FileAttrList[i] = StrToIntDef(tsv->Strings[2], -1); // 2: 属性 FileDtChangeList[i] = StrToIntDef(tsv->Strings[3], -1);// 3: 更新日 FileTmChangeList[i] = StrToIntDef(tsv->Strings[4], -1);// 4: 更新時 FileDtCreateList[i] = StrToIntDef(tsv->Strings[5], -1);// 5: 作成日 FileTmCreateList[i] = StrToIntDef(tsv->Strings[6], -1);// 6: 作成時 } } delete tsv; delete DataList; //----------------------------------- //ディスクの空き容量チェック //----------------------------------- CurrentDriveFreeSpaceSize = GetDiskFreeSpaceNum(OutDirPath); if (CurrentDriveFreeSpaceSize > -1 && fCompare == false) { if ( AllTotalSize > CurrentDriveFreeSpaceSize ) { //'復号する先のドライブの空き容量が足りません。'+#13+ //'復号するには、約%dMBの空き容量が必要です。復号処理を中止します。'; MsgText = LoadResourceString(&Msgdecrypt::_MSG_ERROR_DRIVE_NO_FREE_SPACE); free_space_required = (float)AllTotalSize/1024/1024; // MB MsgText = String().sprintf(MsgText.c_str(), free_space_required); MsgType = mtError; MsgButtons = TMsgDlgButtons() << mbOK; MsgDefaultButton = mbOK; Synchronize(&PostConfirmMessageForm); goto LabelError; } } else{ // OK! // } //----------------------------------- //複数フォルダ/ファイルを開こうとしているので確認 //----------------------------------- //復号したファイルを関連付けされたソフトで開くか if ( fTempOpenFile == true && FileList->Count > 4 && fCompare == false) { //'5つ以上のファイルを復号後に開こうとしていますが、処理を続けますか?'+#13+ //'「いいえ」を選択すると、開かず復号します。'; MsgText = LoadResourceString(&Msgdecrypt::_MSG_CONFIRM_OPEN_DECRYPTED_FILES); MsgType = mtConfirmation; MsgButtons = TMsgDlgButtons() << mbYes << mbNo << mbCancel; MsgDefaultButton = mbCancel; Synchronize(&PostConfirmMessageForm); if ( MsgReturnVal == mrCancel ) { goto LabelStop; } else if ( MsgReturnVal == mrNo ) { fTempOpenFile = true; } } //----------------------------------- // 復号開始 //----------------------------------- if (fCompare == false) { //'復号しています...' ProgressStatusText = LoadResourceString(&Msgdecrypt::_LABEL_STATUS_TITLE_DECRYPTING); ProgressMsgText = ExtractFileName(AtcFilePath); } else{ //'コンペアしています...' ProgressStatusText = LoadResourceString(&Msgdecrypt::_LABEL_STATUS_TITLE_COMPARING); ProgressMsgText = ExtractFileName(AtcFilePath); } // ファイル(データ本体)サイズを取得する AllTotalSize = fsIn->Size - fsIn->Position + 1; // 初期化ベクトルの読み出し TotalSize = fsIn->Read(chain_buffer, BUF_SIZE); // zlib 前準備 // 圧縮においてすべてのメモリ管理をライブラリに任せる z.zalloc = Z_NULL; z.zfree = Z_NULL; z.opaque = Z_NULL; if (inflateInit(&z) != Z_OK) { // エラー // zlibエラーは最後でまとめてメッセージ処理 goto LabelError; } // 通常は deflate() の第2引数は Z_NO_FLUSH にして呼び出す flush = Z_NO_FLUSH; // 入出力バッファ for (i = 0; i < LARGE_BUF_SIZE; i++) { output_buffer[i] = 0; } z.avail_in = 0; // 入力バッファ中のデータのバイト数 z.next_in = Z_NULL; // 入力バッファ中のデータのバイト数 z.next_out = output_buffer; // 出力バッファ残量 z.avail_out = LARGE_BUF_SIZE; // 出力ポインタ(展開するので大きめに) status = Z_OK; while (Terminated == false) { //----------------------------------- // 入力 //----------------------------------- if (z.avail_in == 0) { TotalSize = InputBuffer(len, source_buffer, chain_buffer, fsIn, fInputFileOpen, TotalSize); z.avail_in = len; z.next_in = source_buffer; if ( len == 0 ) { //入力ストリーム終了 fInputEnd = true; } } //----------------------------------- // 展開 //----------------------------------- status = inflate(&z, flush); //----------------------------------- // 処理ステータス //----------------------------------- if ( status == Z_OK ){ if ( z.avail_out == 0 ) { ret = OutputBuffer(output_buffer, LARGE_BUF_SIZE, fsOut, fOutputFileOpen, FileList, FileIndex, FileSizeList, FileAttrList, FileDtChangeList, FileTmChangeList, FileDtCreateList, FileTmCreateList); if ( ret == 0) { z.next_out = output_buffer; z.avail_out = LARGE_BUF_SIZE; } else if (ret == -1) { goto LabelError; } else{ goto LabelStop; } }//end if (z.avail_out == 0); } //----------------------------------- // バッファエラー //----------------------------------- else if ( status == Z_BUF_ERROR ) { //出力バッファがいっぱいの可能性 //出力バッファをクリアにして継続させる len = LARGE_BUF_SIZE - z.avail_out; ret = OutputBuffer(output_buffer, len, fsOut, fOutputFileOpen, FileList, FileIndex, FileSizeList, FileAttrList, FileDtChangeList, FileTmChangeList, FileDtCreateList, FileTmCreateList); if (ret == 0) { z.next_out = output_buffer; z.avail_out = LARGE_BUF_SIZE; } else if ( ret == -1) { goto LabelError; } else{ goto LabelStop; } } //----------------------------------- // 終了 //----------------------------------- else if (status == Z_STREAM_END) { break; } //----------------------------------- // エラー //----------------------------------- else{ // #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; } //----------------------------------- //進捗状況表示 ProgressPercentNumF = (float)TotalSize/AllTotalSize; ProgressPercentNum = (int)(ProgressPercentNumF*100); if (AllTotalSize < 104857600) { // 100MB未満 ProgressPercentNumText = IntToStr(ProgressPercentNum)+"%"; } else{ ProgressPercentNumText = FloatToStrF(ProgressPercentNumF*100, ffNumber, 4, 1)+"%"; } if ( fInputEnd == true) { break; } }//while (!Terminated); if (Terminated == true) { //ユーザーキャンセルで抜けてきた goto LabelStop; } //---------------------------------------------------------------------- // 万が一、出力バッファに余りがある場合 //---------------------------------------------------------------------- len = LARGE_BUF_SIZE - z.avail_out; ret = OutputBuffer(output_buffer, len, fsOut, fOutputFileOpen, FileList, FileIndex, FileSizeList, FileAttrList, FileDtChangeList, FileTmChangeList, FileDtCreateList, FileTmCreateList); if ( ret == 0 ) { } else if ( ret == -1 ){ goto LabelError; } else{ goto LabelStop; } if (inflateEnd(&z) != Z_OK) { goto LabelError; } ProgressPercentNum = 100; //'完了' ProgressStatusText = LoadResourceString(&Msgdecrypt::_LABEL_STATUS_TITLE_COMPLETE); ProgressMsgText = ExtractFileName(AtcFilePath); if ( fInputFileOpen == true ) { delete fsIn; fInputFileOpen = false; } if ( fOutputFileOpen == true ) { delete fsOut; fOutputFileOpen = false; } delete FileList; delete [] FileSizeList; // 1: ファイルサイズ(フォルダは-1) delete [] FileAttrList; // 2: 属性 delete [] FileDtChangeList; // 3: 更新日 delete [] FileTmChangeList; // 4: 更新時 delete [] FileDtCreateList; // 5: 作成日 delete [] FileTmCreateList; // 6: 作成時 //復号成功 StatusNum = 1; return; //----------------------------------- //パスワード入力ミスの後始末 //----------------------------------- LabelTypeMiss: ProgressPercentNum = 0; //'エラー' ProgressStatusText = LoadResourceString(&Msgdecrypt::_LABEL_STATUS_TITLE_ERROR); //'復号に失敗しました。' ProgressMsgText = LoadResourceString(&Msgdecrypt::_LABEL_STATUS_DETAIL_FAILED); if ( fInputFileOpen == true ) { delete fsIn; fInputFileOpen = false; } if ( fOutputFileOpen == true ) { delete fsOut; fOutputFileOpen = false; } delete FileList; delete [] FileSizeList; delete [] FileAttrList; delete [] FileDtChangeList; delete [] FileTmChangeList; delete [] FileDtCreateList; delete [] FileTmCreateList; StatusNum = -1; return; //----------------------------------- //エラーの後始末 //----------------------------------- LabelError: ProgressPercentNum = 0; if ( status < 0 ){ //'zlibライブラリからエラーを返されました。' //'エラー番号:' MsgText = LoadResourceString(&Msgdecrypt::_MSG_ERROR_ZLIB) + IntToStr(status) + "\n" + z.msg; if ( fCompare == true ) { //メッセージに'コンペアに失敗しました。'を追加 MsgText += "\n" + LoadResourceString(&Msgdecrypt::_MSG_ERROR_COMPARE_FILE); } MsgType = mtError; MsgButtons = TMsgDlgButtons() << mbOK; MsgDefaultButton = mbOK; Synchronize(&PostConfirmMessageForm); } //'エラー' ProgressStatusText = LoadResourceString(&Msgdecrypt::_LABEL_STATUS_TITLE_ERROR); if (fCompare == true) { //'コンペアで問題を見つけたようです。'; ProgressMsgText = LoadResourceString(&Msgdecrypt::_LABEL_STATUS_DETAIL_COMPARE_FAILED); } else{ //'復号に失敗しました。' ProgressMsgText = LoadResourceString(&Msgdecrypt::_LABEL_STATUS_DETAIL_FAILED); } if ( fInputFileOpen == true ) { delete fsIn; fInputFileOpen = false; } if ( fOutputFileOpen == true ) { delete fsOut; fOutputFileOpen = false; } delete FileList; delete [] FileSizeList; delete [] FileAttrList; delete [] FileDtChangeList; delete [] FileTmChangeList; delete [] FileDtCreateList; delete [] FileTmCreateList; StatusNum = -2; return; //----------------------------------- //ユーザーキャンセルの後始末 //----------------------------------- LabelStop: ProgressPercentNum = 0; //'キャンセル' ProgressStatusText = LoadResourceString(&Msgdecrypt::_LABEL_STATUS_TITLE_USER_CANCEL); //'復号が中止されました。' ProgressMsgText = LoadResourceString(&Msgdecrypt::_LABEL_STATUS_DETAIL_STOPPED); if ( fInputFileOpen == true ) { delete fsIn; fInputFileOpen = false; } if ( fOutputFileOpen == true ) { delete fsOut; fOutputFileOpen = false; } delete FileList; delete [] FileSizeList; delete [] FileAttrList; delete [] FileDtChangeList; delete [] FileTmChangeList; delete [] FileDtCreateList; delete [] FileTmCreateList; StatusNum = 0; return; }
void __fastcall TfrmPropVisor::edtWidthGridYChange(TObject *Sender) { if( StrToIntDef(edtWidthGridY->Text,1) > 0) dsgPrevia->GridY->Width = StrToIntDef(edtWidthGridY->Text,1); }
void __fastcall TfrmPropVisor::edtZoomYChange(TObject *Sender) { if( StrToIntDef(edtZoomY->Text, 100) > 0 ) dsgPrevia->ZoomAxeY = StrToIntDef(edtZoomY->Text, 100); }
DWORD WINAPI _readOutputThread(LPVOID hPipeRead) // Monitors handle for input. Exits when child exits or pipe breaks. { String str, substr; int bsCount = 0; CHAR lpBuffer[128]; DWORD nBytesRead; FORMACTION->logB("< --- " + _("Reading Output") + " - " + _("Please wait") + " --- >", 1); Application->ProcessMessages(); while (1) { // if (_aborted) break; if ( !ReadFile(hPipeRead, lpBuffer, sizeof(lpBuffer), &nBytesRead, NULL) ) { if (GetLastError() == ERROR_BROKEN_PIPE) break; // pipe done - normal exit path. else { FORMACTION->log(__FUNC__ ": Something bad happened, please report."); Application->ProcessMessages(); break; } } str = str + AnsiString(lpBuffer, nBytesRead); str = ecc::ReplaceStr(str, "\r", ""); // Eat "\b" and the character before "\b": int pos = str.Pos("\b"); bool percCharFound = false; String perc = ""; while (pos && (pos > 1)) { ++bsCount; perc = str.SubString(pos - 1, 1) + perc; // Append char in reverse. if (bsCount == 4) { if (perc.Pos("%")) // If the line is too long perc does not contain a '%'. { percCharFound = true; FORMACTION->lbl_ProfilePerc->Caption = perc.Trim(); FORMACTION->pb_Profile->Position = StrToIntDef(ecc::ReplaceStr(perc.Trim(), "%", ""), 0); FORMACTION->updateAppTitlePerc(); //092b8 Application->ProcessMessages(); } perc = ""; bsCount = 0; } str.Delete(pos - 1, 2); pos = str.Pos("\b"); } // Split lines: pos = str.Pos("\n"); while (pos) { substr = str.SubString(1, pos - 1); bool suppressLog = false; //093b1 // If string starts with "Compressing" calculate and display progress percentage: if (substr.Pos("Compressing") == 1) { if (!PGlobals->LogFullAction) suppressLog = true; //093b1: Do not log succesful "Compressing..." messages. ++__compressingFileCount; float perc = ((float)__compressingFileCount / (float)FORMACTION->abtFileList->incFilesTotalCount) * 100; if (!percCharFound) { // Since 7z 4.19b the '%' character is not present in the captured output. FORMACTION->lbl_ProfilePerc->Caption = IntToStr((int)perc) + "%"; FORMACTION->pb_Profile->Position = (int)perc; FORMACTION->updateAppTitlePerc(); //092b8 } } if (!suppressLog) //093b1 FORMACTION->log(substr); //093b1 Application->ProcessMessages(); str.Delete(1, pos); pos = str.Pos("\n"); } } FORMACTION->logB("< --- " + _("Finished Reading Output") + " --- >", 1); Application->ProcessMessages(); __threadIsRunning = false; return 1; }
//=========================================================================== //スレッド実行 //=========================================================================== void __fastcall TAttacheCaseFileDecrypt1::Execute() { int i, c, len; float ProgressPercentNumF; //進捗パーセンテージ(浮動小数点) // バッファ char buffer[BUF_SIZE]; char source_buffer[BUF_SIZE]; char temp_buffer[BUF_SIZE]; char output_buffer[LARGE_BUF_SIZE]; char *headerbuffer; //パスワード bool fPasswordOk; String FilePath, FileName; // ファイルストリーム TFileStream *fsIn; TFileStream *fsOut; bool fInputFileOpen = false; bool fOutputFileOpen = false; float free_space_required; __int64 CurrentPos, TotalSize; __int64 CurrentDriveFreeSpaceSize; //処理する合計サイズ AllTotalSize = 0; int ret; //バッファ出力の返値 int FileIndex = 0; //Blowfish CBlowFish *bf; char token[17] = {0, }; const String PrefixString = "Fn_"; const char charTokenString[17] = "_AttacheCaseData"; //復号の正否に使う String AtcFileTokenString; //暗号化ファイルのトークン(文字列) String AtcFileCreateDateString; //暗号化ファイルの生成日時(文字列) //同名ファイル/フォルダーはすべて上書きして復号する //(ユーザーがダイアログで「すべてはい」を選択したとき = true ) fOverwirteYesToAll = false; //「復号したファイルを関連付けされたソフトで開く」一時的な設定 fTempOpenFile = fOpenFile; //フォルダーを一度開いたか(深いフォルダーすべてを開かないように) fOpenFolderOnce = false; // 出力するディレクトリ OutDirPath = IncludeTrailingPathDelimiter(OutDirPath); String TempRelativePath; // 暗号化部分のヘッダサイズ int EncryptHeaderSize = 0; int DataVersion; // ver.2.00~は "5", ver.2.70~は "6" int flush, status; // zlib z_stream z; // zlibライブラリとやりとりするための構造体 bool fInputEnd = false; // 入力ストリームの終了 //ヘッダデータから必要情報を取り出すための TMemoryStream *pms; // メモリストリーム int idx; TStringList *DataList; TStringList *tsv; TStringList *FileList = new TStringList(); // 0: ファイル名 __int64 *FileSizeList = 0; // 1: ファイルサイズ(フォルダは-1) int *FileAttrList = 0; // 2: 属性 int *FileAgeList = 0; // 3: タイムスタンプ int rest; int buf_size; //---------------------------------------------------------------------- // 平文のヘッダ内容チェック try { fsIn = new TFileStream(AtcFilePath, fmOpenRead | fmShareDenyNone); } catch(...) { //'復号するファイルを開けません。他のアプリケーションが使用中の可能性があります。' MsgText = LoadResourceString(&Msgdecrypt::_MSG_ERROR_FILE_OPEN); MsgType = mtError; MsgButtons = TMsgDlgButtons() << mbOK; MsgDefaultButton = mbOK; Synchronize(&PostConfirmMessageForm); goto LabelError; } fInputFileOpen = true; // 暗号部ヘッダサイズを取得 fsIn->Read(&EncryptHeaderSize, sizeof(int)); // トークンを取得 fsIn->Read(token, 16); if (StrComp(token, charTokenString) != 0 ) { //-------------------------------------------------------- //実は自己実行形式ファイル?(拡張子偽装されている場合も) //-------------------------------------------------------- // サイズを再取得 fsIn->Seek(-(__int64)sizeof(__int64), TSeekOrigin::soEnd); fsIn->Read(&AllTotalSize, sizeof(__int64)); // 位置を戻す fsIn->Seek(-(AllTotalSize + sizeof(__int64)), TSeekOrigin::soEnd); // もう一度、暗号部ヘッダサイズを取得 fsIn->Read(&EncryptHeaderSize, sizeof(int)); // もう一度、トークンを取得 fsIn->Read(token, 16); // トークンを再チェック if (StrComp(token, charTokenString) != 0 ) { // '暗号化ファイルではありません。アタッシェケースによって暗号化されたファイルでないか、'+#13+ // 'ファイルが壊れている可能性があります。' MsgText = LoadResourceString(&Msgdecrypt::_MSG_ERROR_FILE_NOT_ATC); MsgType = mtError; MsgButtons = TMsgDlgButtons() << mbOK; MsgDefaultButton = mbOK; Synchronize(&PostConfirmMessageForm); goto LabelError; } } else{ AllTotalSize = fsIn->Size; } //----------------------------------- // データバージョンチェック //----------------------------------- DataVersion = -1; fsIn->Read(&DataVersion, sizeof(int)); if (DataVersion <= 103) { // Blowfishで暗号化されたファイル } else{ //'バージョンがちがいます。復号できません。'+#13+ //'ファイルはver.1のアタッシェケースで暗号化されていません。'; MsgText = LoadResourceString(&Msgdecrypt::_MSG_ERROR_NOT_BLOWFISH_ENCRYPTION); MsgType = mtError; MsgButtons = TMsgDlgButtons() << mbOK; MsgDefaultButton = mbOK; Synchronize(&PostConfirmMessageForm); goto LabelError; } //----------------------------------- // 復号の準備 //----------------------------------- bf = new CBlowFish; bf->Initialize( KeyString.c_str(), KeyString.Length() ); //初期化 //----------------------------------- // 暗号部ヘッダの復号(ECBモード) //----------------------------------- pms = new TMemoryStream; len = 0; while (len < EncryptHeaderSize) { // 読み出しバッファ for (c = 0; c < BUF_SIZE; c++) { source_buffer[c] = 0; } // 暗号化されたデータブロックの読み出し len += fsIn->Read(source_buffer, BUF_SIZE); // 復号処理 bf->Decode( source_buffer, buffer, BUF_SIZE); pms->Write(buffer, BUF_SIZE); } pms->Seek((__int64)0, TSeekOrigin::soBeginning); //ポインタを先頭へ戻す DataList = new TStringList; DataList->LoadFromStream(pms, TEncoding::GetEncoding(932)); // shift-jis //----------------------------------- // 復号正否(復号できたか) //----------------------------------- if (DataList->Count == 0 || DataList->Strings[0].Pos("AttacheCase") == 0) { fPasswordOk = false; } else{ fPasswordOk = true; //パスワード合致 } if ( fPasswordOk == false ) { //'パスワードがちがいます。復号できません。'+#13+ //'場合によってはファイルが壊れている可能性もあります。'; MsgText = LoadResourceString(&Msgdecrypt::_MSG_ERROR_PASSWORD_WRONG); MsgType = mtError; MsgButtons = TMsgDlgButtons() << mbOK; MsgDefaultButton = mbOK; Synchronize(&PostConfirmMessageForm); delete DataList; goto LabelTypeMiss; } //----------------------------------- // 復号時のエンコーディング判定 //----------------------------------- pms->Position = 0; DataList->LoadFromStream(pms, TEncoding::GetEncoding(932)); // shift-jis //=================================== // デバッグ //ShowMessage(DataList->Text); //=================================== delete pms; //----------------------------------- // 暗号化ファイルの生成日時 //----------------------------------- //※特に今は使用していないが、将来的に // 期限付きでファイルを復号できなくなる // などの機能を追加しても良いかも。 //----------------------------------- AtcFileCreateDateString = DataList->Strings[1]; //----------------------------------- // ヘッダデータからファイルリストや // ファイル情報などを各変数を動的確保 //----------------------------------- FileSizeList = new __int64[DataList->Count]; // 1: ファイルサイズ(フォルダは-1) FileAttrList = new int[DataList->Count]; // 2: 属性 FileAgeList = new int[DataList->Count]; // 3: タイムスタンプ DataList->NameValueSeparator = ':'; tsv = new TStringList; tsv->Delimiter = '\t'; tsv->StrictDelimiter = true; char lpPath[MAX_PATH]; for (i = 0; i < DataList->Count; i++) { idx = DataList->IndexOfName(PrefixString+IntToStr(i)); if (idx > 0) { tsv->DelimitedText = DataList->ValueFromIndex[idx]; // ディレクトリ・トラバーサル対策(ver.2.8.5.0~) bool fDirectoryTraversal = false; AnsiString CanonicalizePath = AnsiString(OutDirPath + tsv->Strings[0]); if (CanonicalizePath.Length() < MAX_PATH) { // ファイルパスを正規化 if (PathCanonicalize(lpPath, CanonicalizePath.c_str()) == true) { // 正規化したパスが保存先と一致するか if (AnsiString(lpPath).Pos(OutDirPath) != 1 ){ fDirectoryTraversal = true; } } else{ fDirectoryTraversal = true; } } else{ fDirectoryTraversal = true; } if (fDirectoryTraversal == true) { //'不正なファイルパスが含まれています。復号できません。'; MsgText = LoadResourceString(&Msgdecrypt::_MSG_ERROR_INVALID_FILE_PATH) + "\n" + CanonicalizePath; MsgType = mtError; MsgButtons = TMsgDlgButtons() << mbOK; MsgDefaultButton = mbOK; Synchronize(&PostConfirmMessageForm); delete DataList; goto LabelTypeMiss; } FileList->Add(tsv->Strings[0]); // 0: ファイルパス FileSizeList[i] = StrToIntDef(tsv->Strings[1], -1); // 1: ファイルサイズ(フォルダは-1) FileAttrList[i] = StrToIntDef(tsv->Strings[2], -1); // 2: 属性 FileAgeList[i] = StrToIntDef(tsv->Strings[3], -1); // 3: タイムスタンプ } } delete tsv; delete DataList; //----------------------------------- //ディスクの空き容量チェック //----------------------------------- CurrentDriveFreeSpaceSize = GetDiskFreeSpaceNum(OutDirPath); if (CurrentDriveFreeSpaceSize > -1) { if ( AllTotalSize > CurrentDriveFreeSpaceSize ) { //'復号する先のドライブの空き容量が足りません。'+#13+ //'復号するには、約%dMBの空き容量が必要です。復号処理を中止します。'; MsgText = LoadResourceString(&Msgdecrypt::_MSG_ERROR_DRIVE_NO_FREE_SPACE); free_space_required = (float)AllTotalSize/1024/1024; // MB MsgText = String().sprintf(MsgText.c_str(), free_space_required); MsgType = mtError; MsgButtons = TMsgDlgButtons() << mbOK; MsgDefaultButton = mbOK; Synchronize(&PostConfirmMessageForm); goto LabelError; } } else{ // OK! // } //----------------------------------- //複数フォルダ/ファイルを開こうとしているので確認 //----------------------------------- //復号したファイルを関連付けされたソフトで開くか if ( fTempOpenFile == true && FileList->Count > 4) { //'5つ以上のファイルを復号後に開こうとしていますが、処理を続けますか?'+#13+ //'「いいえ」を選択すると、開かず復号します。'; MsgText = LoadResourceString(&Msgdecrypt::_MSG_CONFIRM_OPEN_DECRYPTED_FILES); MsgType = mtConfirmation; MsgButtons = TMsgDlgButtons() << mbYes << mbNo << mbCancel; MsgDefaultButton = mbCancel; Synchronize(&PostConfirmMessageForm); if ( MsgReturnVal == mrCancel ) { goto LabelStop; } else if ( MsgReturnVal == mrNo ) { fTempOpenFile = true; } } //----------------------------------- // 復号開始 //----------------------------------- //'復号しています...' ProgressStatusText = LoadResourceString(&Msgdecrypt::_LABEL_STATUS_TITLE_DECRYPTING); ProgressMsgText = ExtractFileName(AtcFilePath); // ファイル(データ本体)サイズを取得する AllTotalSize = fsIn->Size - fsIn->Position + 1; // zlib 前準備 // 圧縮においてすべてのメモリ管理をライブラリに任せる z.zalloc = Z_NULL; z.zfree = Z_NULL; z.opaque = Z_NULL; if (inflateInit(&z) != Z_OK) { // エラー // zlibエラーは最後でまとめてメッセージ処理 goto LabelError; } // 通常は deflate() の第2引数は Z_NO_FLUSH にして呼び出す flush = Z_NO_FLUSH; // 入出力バッファ for (i = 0; i < LARGE_BUF_SIZE; i++) { output_buffer[i] = 0; } z.avail_in = 0; // 入力バッファ中のデータのバイト数 z.next_in = Z_NULL; // 入力バッファ中のデータのバイト数 z.next_out = output_buffer; // 出力バッファ残量 z.avail_out = LARGE_BUF_SIZE; // 出力ポインタ(展開するので大きめに) status = Z_OK; while (Terminated == false) { //----------------------------------- // 入力 //----------------------------------- if (z.avail_in == 0) { TotalSize = InputBuffer(bf, len, source_buffer, fsIn, fInputFileOpen, TotalSize); z.avail_in = len; z.next_in = source_buffer; if ( len == 0 ) { //入力ストリーム終了 fInputEnd = true; } } //----------------------------------- // 展開 //----------------------------------- status = inflate(&z, flush); //----------------------------------- // 処理ステータス //----------------------------------- if ( status == Z_OK ){ if ( z.avail_out == 0 ) { ret = OutputBuffer(output_buffer, LARGE_BUF_SIZE, fsOut, fOutputFileOpen, FileList, FileIndex, FileSizeList, FileAttrList, FileAgeList); if ( ret == 0) { z.next_out = output_buffer; z.avail_out = LARGE_BUF_SIZE; } else if (ret == -1) { goto LabelError; } else{ goto LabelStop; } }//end if (z.avail_out == 0); } //----------------------------------- // バッファエラー //----------------------------------- else if ( status == Z_BUF_ERROR ) { //出力バッファがいっぱいの可能性 //出力バッファをクリアにして継続させる len = LARGE_BUF_SIZE - z.avail_out; ret = OutputBuffer(output_buffer, len, fsOut, fOutputFileOpen, FileList, FileIndex, FileSizeList, FileAttrList, FileAgeList); if (ret == 0) { z.next_out = output_buffer; z.avail_out = LARGE_BUF_SIZE; } else if ( ret == -1) { goto LabelError; } else{ goto LabelStop; } } //----------------------------------- // 終了 //----------------------------------- else if (status == Z_STREAM_END) { break; } //----------------------------------- // エラー //----------------------------------- else{ // #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; } //----------------------------------- //進捗状況表示 ProgressPercentNumF = (float)TotalSize/AllTotalSize; ProgressPercentNum = (int)(ProgressPercentNumF*100); if (AllTotalSize < 104857600) { // 100MB未満 ProgressPercentNumText = IntToStr(ProgressPercentNum)+"%"; } else{ ProgressPercentNumText = FloatToStrF(ProgressPercentNumF*100, ffNumber, 4, 1)+"%"; } if ( fInputEnd == true) { break; } }//while (!Terminated); if (Terminated == true) { //ユーザーキャンセルで抜けてきた goto LabelStop; } //---------------------------------------------------------------------- // 万が一、出力バッファに余りがある場合 //---------------------------------------------------------------------- len = LARGE_BUF_SIZE - z.avail_out; ret = OutputBuffer(output_buffer, len, fsOut, fOutputFileOpen, FileList, FileIndex, FileSizeList, FileAttrList, FileAgeList); if ( ret == 0 ) { } else if ( ret == -1 ){ goto LabelError; } else{ goto LabelStop; } if (inflateEnd(&z) != Z_OK) { goto LabelError; } ProgressPercentNum = 100; //'完了' ProgressStatusText = LoadResourceString(&Msgdecrypt::_LABEL_STATUS_TITLE_COMPLETE); ProgressMsgText = ExtractFileName(AtcFilePath); if ( fInputFileOpen == true ) { delete fsIn; fInputFileOpen = false; } if ( fOutputFileOpen == true ) { delete fsOut; fOutputFileOpen = false; } delete FileList; delete [] FileSizeList; // 1: ファイルサイズ(フォルダは-1) delete [] FileAttrList; // 2: 属性 delete [] FileAgeList; // 3: 更新日 //復号成功 StatusNum = 1; return; //----------------------------------- //パスワード入力ミスの後始末 //----------------------------------- LabelTypeMiss: ProgressPercentNum = 0; //'エラー' ProgressStatusText = LoadResourceString(&Msgdecrypt::_LABEL_STATUS_TITLE_ERROR); //'復号に失敗しました。' ProgressMsgText = LoadResourceString(&Msgdecrypt::_LABEL_STATUS_DETAIL_FAILED); if ( fInputFileOpen == true ) { delete fsIn; fInputFileOpen = false; } if ( fOutputFileOpen == true ) { delete fsOut; fOutputFileOpen = false; } delete FileList; delete [] FileSizeList; delete [] FileAttrList; delete [] FileAgeList; StatusNum = -1; return; //----------------------------------- //エラーの後始末 //----------------------------------- LabelError: ProgressPercentNum = 0; if ( status < 0 ){ //'zlibライブラリからエラーを返されました。' //'エラー番号:' MsgText = LoadResourceString(&Msgdecrypt::_MSG_ERROR_ZLIB) + IntToStr(status) + "\n" + z.msg; MsgType = mtError; MsgButtons = TMsgDlgButtons() << mbOK; MsgDefaultButton = mbOK; Synchronize(&PostConfirmMessageForm); } //'エラー' ProgressStatusText = LoadResourceString(&Msgdecrypt::_LABEL_STATUS_TITLE_ERROR); //'復号に失敗しました。' ProgressMsgText = LoadResourceString(&Msgdecrypt::_LABEL_STATUS_DETAIL_FAILED); if ( fInputFileOpen == true ) { delete fsIn; fInputFileOpen = false; } if ( fOutputFileOpen == true ) { delete fsOut; fOutputFileOpen = false; } delete FileList; delete [] FileSizeList; delete [] FileAttrList; delete [] FileAgeList; StatusNum = -2; return; //----------------------------------- //ユーザーキャンセルの後始末 //----------------------------------- LabelStop: ProgressPercentNum = 0; //'キャンセル' ProgressStatusText = LoadResourceString(&Msgdecrypt::_LABEL_STATUS_TITLE_USER_CANCEL); //'復号が中止されました。' ProgressMsgText = LoadResourceString(&Msgdecrypt::_LABEL_STATUS_DETAIL_STOPPED); if ( fInputFileOpen == true ) { delete fsIn; fInputFileOpen = false; } if ( fOutputFileOpen == true ) { delete fsOut; fOutputFileOpen = false; } delete FileList; delete [] FileSizeList; delete [] FileAttrList; delete [] FileAgeList; StatusNum = 0; return; }
//--------------------------------------------------------------------------- void __fastcall RestoreForm(UnicodeString Data, TForm * Form) { assert(Form); if (!Data.IsEmpty()) { Forms::TMonitor * Monitor = FormMonitor(Form); UnicodeString LeftStr = ::CutToChar(Data, L';', true); UnicodeString TopStr = ::CutToChar(Data, L';', true); UnicodeString RightStr = ::CutToChar(Data, L';', true); UnicodeString BottomStr = ::CutToChar(Data, L';', true); TWindowState State = (TWindowState)StrToIntDef(::CutToChar(Data, L';', true), (int)wsNormal); int PixelsPerInch = LoadPixelsPerInch(::CutToChar(Data, L';', true)); TRect Bounds = Form->BoundsRect; int Left = StrToDimensionDef(LeftStr, PixelsPerInch, Bounds.Left); int Top = StrToDimensionDef(TopStr, PixelsPerInch, Bounds.Top); bool DefaultPos = (Left == -1) && (Top == -1); if (!DefaultPos) { Bounds.Left = Left; Bounds.Top = Top; } else { Bounds.Left = 0; Bounds.Top = 0; } Bounds.Right = StrToDimensionDef(RightStr, PixelsPerInch, Bounds.Right); Bounds.Bottom = StrToDimensionDef(BottomStr, PixelsPerInch, Bounds.Bottom); Form->WindowState = State; if (State == wsNormal) { // move to the target monitor OffsetRect(Bounds, Monitor->Left, Monitor->Top); // reduce window size to that of monitor size // (this does not cut window into monitor!) if (Bounds.Width() > Monitor->WorkareaRect.Width()) { Bounds.Right -= (Bounds.Width() - Monitor->WorkareaRect.Width()); } if (Bounds.Height() > Monitor->WorkareaRect.Height()) { Bounds.Bottom -= (Bounds.Height() - Monitor->WorkareaRect.Height()); } if (DefaultPos || ((Bounds.Left < Monitor->Left) || (Bounds.Left > Monitor->Left + Monitor->WorkareaRect.Width() - 20) || (Bounds.Top < Monitor->Top) || (Bounds.Top > Monitor->Top + Monitor->WorkareaRect.Height() - 20))) { if (Monitor->Primary) { if ((Application->MainForm == NULL) || (Application->MainForm == Form)) { Form->Position = poDefaultPosOnly; } else { Form->Position = poOwnerFormCenter; } Form->Width = Bounds.Width(); Form->Height = Bounds.Height(); } else { // when positioning on non-primary monitor, we need // to handle that ourselves, so place window to center Form->SetBounds(Monitor->Left + ((Monitor->Width - Bounds.Width()) / 2), Monitor->Top + ((Monitor->Height - Bounds.Height()) / 2), Bounds.Width(), Bounds.Height()); Form->Position = poDesigned; } } else { Form->Position = poDesigned; Form->BoundsRect = Bounds; } } else if (State == wsMaximized) { Form->Position = poDesigned; Bounds = Form->BoundsRect; OffsetRect(Bounds, Monitor->Left, Monitor->Top); Form->BoundsRect = Bounds; } } else if (Form->Position == poDesigned) { Form->Position = poDefaultPosOnly; } }