From f7193f873c1eb2a1c5003abe7daf2349080b88a4 Mon Sep 17 00:00:00 2001 From: nbb1967 <81534939+nbb1967@users.noreply.github.com> Date: Thu, 22 Jan 2026 20:17:35 +0300 Subject: [PATCH 01/35] CreateProperties. CreateProperties. Move hardcoded strings to Resources (w/o listbox (!)). --- cppcryptfs/cppcryptfs.rc | Bin 38514 -> 40124 bytes cppcryptfs/resource.h | Bin 12678 -> 13668 bytes cppcryptfs/ui/CreatePropertyPage.cpp | 71 +++++++++++++++++++-------- 3 files changed, 50 insertions(+), 21 deletions(-) diff --git a/cppcryptfs/cppcryptfs.rc b/cppcryptfs/cppcryptfs.rc index b2039b072cb49e329fd75782eb865a049e1f5aed..80c3e365ed50902fcdfced3cb9fc512177468f42 100644 GIT binary patch delta 1495 zcmbu9&1w@-6vq!;6seRhs)+4oh&z#jPf*gyq!p8zCXL!vi0Kpu)32o3W;L7AF0;5G z_zo@l(r$h7e-i$dLF3o!4 zo@Y{$hWYhq{%%VGsY*>YWy?H${BXG|p|qvX>@oJ_h`Gmmn{iL}IS z=g&4CJpAoj&RxshfjP$$m^F*JmgB`UpMnSRxSzb-)YVPc>LZXw#!Dct$+dy6q;ei8 zPJM`@k%O3*P);Ob=}4CB=8`oyV1Cc{F$T4m8m}7fP(T;BMjf%be4{)cc}=MhcN(^D zOC4*S1Az1?h;K=|WSk~EPMDvB19MnPQiiZDugJb`Ny{XW=HQsDjTrr*rPJt@YCuCJ zYdiSUcI&gM`Gm3yOvFxwm}p^$FALFje#xjKAh5#5g~aMP4OD&W*9S%q%H%BlzpxVB zpkjRT)@-(1DW2HIzc|R5kO~ABSuq`)>#-e}ubcC+W}pcTu1sLE))gpyc@E_YeNg7n zM6N4(7sigfW6!0lLmT!Djk&|)GRiMRlT%%Uu3}@qPCz1~Nm<)qYr&IdpOoPzSJ>@j zRFU8=wGEuR5|qrw+~TSpMvp6Jg;`5}h$)wM?)3=D>Qz{a4om+}V432b`{wug!nZ%e HkJJAE;so*j delta 26 icmdn9lj+kMrVTCqlO5bxCQsUuvufO(6Xh&tF8c zwj#cp=_`7mOWc%(#aTAjJ12{*2&^HcNcO{vOh?>}n)`)Y;@7M(Cjq~pd*m&QMgqS^ zN_#nrCw7Nj0IiHlllAF($DA@odPYV_!Y-pm#`;O>Da%ayyPoN8Sx+exBD#jcIr>eo z*nKulYfW+vF}o0m)TH{GBYyY;2b?nlLw-RY+LAf0ryvf2_HB9Di~q3t-R(}!T33hP Dv7Kb! delta 16 XcmaEo)t0=$f_?G password2(MAX_PASSWORD_LEN + 1, false); if (!password.IsLocked() || !password2.IsLocked()) { - MessageBox(L"could not lock password buffers", L"cppcryptefs", MB_OK | MB_ICONERROR); - return; + CString strMessage; + if (strMessage.LoadString(IDS_COULD_NOT_LOCK_BUFFER)) { + MessageBox(strMessage, L"cppcryptefs", MB_OK | MB_ICONERROR); + return; + } } CSecureEdit *pPass = &m_password; @@ -120,8 +123,11 @@ void CCreatePropertyPage::CreateCryptfs() return; if (wcslen(password.m_buf) < 1) { - MessageBox(L"please enter a password", L"cppcryptfs", MB_OK | MB_ICONEXCLAMATION); - return; + CString strMessage; + if (strMessage.LoadString(IDS_PASSWORD_EMPTY)) { + MessageBox(strMessage, L"cppcryptfs", MB_OK | MB_ICONEXCLAMATION); + return; + } } CSecureEdit *pPass2 = &m_password2; @@ -130,13 +136,19 @@ void CCreatePropertyPage::CreateCryptfs() return; if (wcslen(password2.m_buf) < 1) { - MessageBox(L"please repeat the password", L"cppcryptfs", MB_OK | MB_ICONEXCLAMATION); - return; + CString strMessage; + if (strMessage.LoadString(IDS_PASSWORD_REPEAT_EMPTY)) { + MessageBox(strMessage, L"cppcryptfs", MB_OK | MB_ICONEXCLAMATION); + return; + } } if (wcscmp(password.m_buf, password2.m_buf)) { - MessageBox(L"passwords do not match", L"cppcryptfs", MB_OK | MB_ICONEXCLAMATION); - return; + CString strMessage; + if (strMessage.LoadString(IDS_PASSWORD_DO_NOT_MATCH)) { + MessageBox(strMessage, L"cppcryptfs", MB_OK | MB_ICONEXCLAMATION); + return; + } } pPass->SetRealText(L""); @@ -147,17 +159,23 @@ void CCreatePropertyPage::CreateCryptfs() pWnd->GetWindowTextW(cpath); if (cpath.GetLength() < 1) { - MessageBox(L"please enter a path", L"cppcryptfs", MB_OK | MB_ICONEXCLAMATION); - return; + CString strMessage; + if (strMessage.LoadString(IDS_PATH_EMPTY)) { + MessageBox(strMessage, L"cppcryptfs", MB_OK | MB_ICONEXCLAMATION); + return; + } } if (!PathFileExists(cpath)) { - CString mes; + CString mes, strMessage; mes += cpath; - mes += L" does not exist. Do you want to create it?"; + strMessage.LoadString(IDS_PATH_DOES_NOT_EXIST); + mes += strMessage; + if (MessageBox(mes, L"cppcryptfs", MB_YESNO | MB_ICONINFORMATION) == IDYES) { if (!CreateDirectory(cpath, NULL)) { - mes = L"Could not create "; + strMessage.LoadString(IDS_PATH_COULD_NOT_CREATE); + mes = strMessage; mes += cpath; MessageBox(mes, L"cppcryptfs", MB_OK | MB_ICONEXCLAMATION); return; @@ -255,9 +273,11 @@ void CCreatePropertyPage::CreateCryptfs() return; } - CString mes; + CString mes, strMsgReverse, strMsgForward; + strMsgReverse.LoadString(IDS_CREATED_REVERSE_FS); + strMsgForward.LoadString(IDS_CREATED_FORWARD_FS); - mes = reverse ? L"Created reverse encrypted filesystem in " : L"Created encrypted filesystem in "; + mes = reverse ? strMsgReverse : strMsgForward; mes.Append(cpath); @@ -345,8 +365,11 @@ void CCreatePropertyPage::OnClickedSelect() return; if (!IsDlgButtonChecked(IDC_REVERSE) && !can_delete_directory(cpath, TRUE)) { - MessageBox(L"directory must be empty", L"cppcryptfs", MB_OK | MB_ICONEXCLAMATION); - return; + CString strMessage; + if (strMessage.LoadString(IDS_DIRECTORY_NOT_EMPTY)) { + MessageBox(strMessage, L"cppcryptfs", MB_OK | MB_ICONEXCLAMATION); + return; + } } CWnd *pWnd = GetDlgItem(IDC_PATH); @@ -452,7 +475,10 @@ BOOL CCreatePropertyPage::OnInitDialog() pLbox->EnableWindow(IsDlgButtonChecked(IDC_LONG_FILE_NAMES)); if (!m_password.ArePasswordBuffersLocked() || !m_password2.ArePasswordBuffersLocked()) { - MessageBox(L"unable to lock password buffers", L"cppcryptfs", MB_OK | MB_ICONERROR); + CString strMessage; + if (strMessage.LoadString(IDS_UNABLE_LOCK_BUFFER)) { + MessageBox(strMessage, L"cppcryptfs", MB_OK | MB_ICONERROR); + } } const auto scryptN = theApp.GetProfileIntW(L"CreateOptions", L"ScryptN", DEFAULT_SCRYPTN); @@ -580,16 +606,19 @@ void CCreatePropertyPage::OnSelchangeScryptn() int scryptN = stoi((LPCTSTR)sel); int mem = (1<= 1024) { - suffix = L" GB required"; + suffix = strMsgGB; mem /= 1024; } auto pScryptMemReq = (CStatic*)GetDlgItem(IDC_SCRYPTMEMREQ); if (pScryptMemReq) { - pScryptMemReq->SetWindowText((std::to_wstring(mem) + suffix).c_str()); + pScryptMemReq->SetWindowText((std::to_wstring(mem) + (LPCTSTR)suffix).c_str()); } } From 9bca4229de58976903d497848a320c17f77cf95d Mon Sep 17 00:00:00 2001 From: nbb1967 <81534939+nbb1967@users.noreply.github.com> Date: Fri, 23 Jan 2026 13:10:48 +0300 Subject: [PATCH 02/35] FsInfoDialog FsInfoDialog. Hardcoded strings move to rc. --- cppcryptfs/cppcryptfs.rc | Bin 40124 -> 41040 bytes cppcryptfs/resource.h | Bin 13668 -> 14280 bytes cppcryptfs/ui/FsInfoDialog.cpp | 39 ++++++++++++++++++++++++--------- 3 files changed, 29 insertions(+), 10 deletions(-) diff --git a/cppcryptfs/cppcryptfs.rc b/cppcryptfs/cppcryptfs.rc index 80c3e365ed50902fcdfced3cb9fc512177468f42..d6476d8ae18f71752034b17f5fd7ff492a5cea2c 100644 GIT binary patch delta 518 zcmZutO-lk%6up>DlOtM`MT9ZA$rcs;1Sr zw1nNzoVe18s3%-_(|%wdYWgOYr$lu0J0$%sC`Jw!`%XL?)$i&;1vPBzBIKeSAMDj_ z2uS-yD2+>`lMcK$da~!{fhGH5%D6ShCPEaaFhwXtQOZz?f)vM&dtoR=d90c<t^Dnl5Ks2W+7 zq6&6Zjwq@=s)AK%qM8*1v@;BdgMc=>!qpowm@pVmc4U?W*{+VN1LW2qhHwT)AnAgv zW3nTsJeo_r8JyrMI2nv4_iKXPponTB$Yy6`bqpqx9~w%7>_&4fB& 0) { txt = to_wstring(m_info.cacheTTL); - txt += L" sec"; + txt += strMsgSec; } else { - txt = L"infinite"; + txt = strMsgInfinite; } SetDlgItemText(IDC_CACHE_TTL, txt.c_str()); WCHAR buf[32]; @@ -138,7 +157,7 @@ BOOL CFsInfoDialog::OnInitDialog() SetDlgItemText(IDC_CASE_CACHE_HR, txt.c_str()); r = m_info.lfnCacheHitRatio; if (r < 0.0f) { - txt = L"n/a"; + txt = strMsgNA; } else { _snwprintf_s(buf, _TRUNCATE, L"%.2f", r*100.0f); txt = buf; @@ -147,7 +166,7 @@ BOOL CFsInfoDialog::OnInitDialog() SetDlgItemText(IDC_LFN_CACHE_HR, txt.c_str()); r = m_info.dirIvCacheHitRatio; if (r < 0.0f) { - txt = L"n/a"; + txt = strMsgNA; } else { _snwprintf_s(buf, _TRUNCATE, L"%.2f", r*100.0f); txt = buf; From 0e7e60a5967d0248b5c0a542eededa31445a28d5 Mon Sep 17 00:00:00 2001 From: nbb1967 <81534939+nbb1967@users.noreply.github.com> Date: Sun, 25 Jan 2026 00:46:22 +0300 Subject: [PATCH 03/35] MountPropertyPage MountPropertyPage. Hardcoded strings moved to resources. --- cppcryptfs/cppcryptfs.rc | Bin 41040 -> 45902 bytes cppcryptfs/resource.h | Bin 14280 -> 16480 bytes cppcryptfs/ui/CreatePropertyPage.cpp | 2 +- cppcryptfs/ui/MountPropertyPage.cpp | 146 +++++++++++++++++++-------- 4 files changed, 107 insertions(+), 41 deletions(-) diff --git a/cppcryptfs/cppcryptfs.rc b/cppcryptfs/cppcryptfs.rc index d6476d8ae18f71752034b17f5fd7ff492a5cea2c..9d0d9451932350c2c5747561d6c003b7185f1529 100644 GIT binary patch delta 2854 zcmd5;-%s0B6hB#5$N1F&h1zwDFRg%E1&1zClVSL}7KZ`aw1rJGSCJNI##&Yii^gR9 z0Y<*`&{C2;EXGHjof@AsPUGWT{14QZMPE#O^Tou^x!>=%KM;Lh8o1wk@44rk&pDrS z?)~Y(kw=e@R7%@Cakhoa+nX5M*x1qdE8{#b8AImW*uvPwCwFqzzKkv0RQQ;;-fH7d z3K=z?<`2|(kMF4c>D~9${Ne5<7fPpizWAY9e_UKqW2CggmC`l!ePS=F#^hd{D|<`o z`>FC(HEx#UYJ6CpSL4(B*Z7Z8^D!S~C`%b0+xPJ4;!A4pO7Q}JZ}ei`(f%5RC{78A zkWMk)DGkDd-lNNuqC9_QjCCjIB6eo+3oE%-Da1DoFFz=^c_Xwy>-gP*g&ZYGqeZM_ z#3HA51AIQw%U`;BIWp19e_d{CU4vX2yLr<1JHzePX_}(2uTzlTfDdyN!z{?ZIs=0m zB-f#FfmWeAg)vF*VlL-3+Q43lMxn*ak9Hi#-o&{mg>mu>uU%;Ni)VRSf#fRWGPG>X zOr7sxEytaE9?wA!W`J@ISmXRnF%UT1gBw7xp-`k0W<=M-Bk}aw@f0L6{HCCB7TBhM zYwWCtuM}MaD!TAZFi8B;k|BjHNuwAw{{8jg+s`2?;=7<0$sBD$a#5WzSMoq5@mPk$ zEqtxwr(vFz2wPdXjxWiHWaoy8o9w*W)!8{HzT=Tc^?~oiKlQ!4%iNO~x9>91QCY#CU zp1j=hE4t%&sIL0`s``Z!oBXK}XpbY~VN_`x{EhI4?rxCo?)PCQi(Cp%Z60Z0kq_)J zb+`jQdKMCS6)9o4$#szlHJpM~KCbsc-mY?~VBu*D|7%mb#CsFa01PM7%4?E${GbBaHAKErQ2PqqfZ*fgpRK8U4G z>46E@v3dkL;opTmUdy}CYO+xl%gX8|(=H-qJgy(K*cqQ$3^7g%j>MTsJ|a zNqkFyUOM4gp=n${-Z>xa*OMu)2)2Rtkwk#=7J`g5=HRF3mn%X;__OeR!@{|$NRq$Bfv}Qq+gdzyqG3X)J)5N61uS2_Fo>BPCh84lLd0ma7bQRg^bcBH+#6LR&a^ai_ z!#^nkB}rG|XHsc0Tk8nox(Z#3bX`30)I2epDl{R7C^FtI4RdA4!5__c9j#h**W~{l z>${;Y{(8VAv;tufMf@SIHo8K(Z9uyFkQKT^0g6-pNrYtz#}jZxR75eG$CofZ0Qu;m=ozR3FA#5H-+F5~b+d|KHZ^m&gF0d%o$#|F^RSKN?>k zH5=+>;J1q+hQv<+l~7GW)QGB^N24vbMVt9*FmHal0MG*QPns1f* zy4OI78iC|aja&UpPD_c&onCh_r`aY^hcpeknfkh@-ln5=BWlBZ8VK9FKGipaq&-zMZFkUZ|?cx?taDb E55&fXPXGV_ delta 191 zcmX^2jOoGwrVZ2jCvQ+=nY^gKWU@mr%j6vs6(&Dhs5JS*1fj`g6V$+BD<(8dHkeog zl`ooHwM1;P$D|39A51EmJRycBGS4)N$@`|UO%9rt0;IDh8%z(I+&4XB@+%;HK#py)-;9XK21YECH_eEe jEHX1}a?#9)$(Lp(a4Iq6G2{br>SRX_(arPLY+wTb7P3^o diff --git a/cppcryptfs/resource.h b/cppcryptfs/resource.h index 8394c565f10b99747988f1b6dd84987820cf91e5..03287077fdc1fa7b775cc9a4c11ad8924c3fb4ec 100755 GIT binary patch delta 1298 zcmZ`&TW-@(6g(kLTL+RN@lq637Lck6C~6y&w*2AN33Z`K6g!pR$14ET4Io&(2l z>ITRk%YdCQb04-78u`Pr@60)KXU_Tk<jwJ!s; zxEJ8N*?22MNhOo1gp#PgwHa23k*6|L?=}r?(Id`N&pMB{ zeQ^)!%WD-@TRhth<-N?%C6q`$pwnCud_^VnksMfb^U+6~&Cto!@})0F>hO;4(_O7~ z3FI8g($$LU$AM9XJ3e=JWZwi&4AvM*Vyl83uDdz@(BY?A$(dzkTKE5avO_=U-c~)6 z)%y_r-FV+l;K>!LTlZ1l+?p8VGf1Ix0{2oVodPw4>QGMchn(BkWSZ=}Rs{92u3va* z+_b6fG0{wxJ(FSMvadl0gwC-+4qIrqCNhW18o1 z%w%7#=jg4;{bClParam = lParam; } - +CString strMsgPassEmpty, strMsg; CMountPropertyPage::CMountPropertyPage() : CCryptPropertyPage(IDD_MOUNT) @@ -169,14 +169,23 @@ CString CMountPropertyPage::Mount(LPCWSTR argPath, LPCWSTR argMountPoint, LPCWST LockZeroBuffer password(MAX_PASSWORD_LEN + 1, false); if (!password.IsLocked()) { - return CString(L"unable to lock password buffer"); + CString strMessage; + strMessage.LoadString(IDS_UNABLE_LOCK_BUFFER); + return strMessage; } - if (wcscpy_s(password.m_buf, MAX_PASSWORD_LEN + 1, argPassword ? argPassword : pPass->m_strRealText)) - return CString(L"unable to get password"); + if (wcscpy_s(password.m_buf, MAX_PASSWORD_LEN + 1, argPassword ? argPassword : pPass->m_strRealText)) { + CString strMessage; + strMessage.LoadString(IDS_UNABLE_GET_PASS); + return strMessage; + } - if (wcslen(password.m_buf) < 1) - return CString(L"password cannot be empty"); + if (wcslen(password.m_buf) < 1) { + CString strMessage; + strMessage.LoadString(IDS_PASS_CANNOT_BE_EMPTY); + return strMessage; + + } CListCtrl *pList = (CListCtrl*)GetDlgItem(IDC_DRIVE_LETTERS); @@ -199,7 +208,10 @@ CString CMountPropertyPage::Mount(LPCWSTR argPath, LPCWSTR argMountPoint, LPCWST nItem = pList->FindItem(&fi); if (nItem < 0) { if (is_mountpoint_a_drive(str)) { - return CString(L"Mount point ") + str + CString(L" is already in use."); + CString strMsgMountPoint, strMsgAlreadyUsed; + strMsgMountPoint.LoadString(IDS_MOUNT_POINT); + strMsgAlreadyUsed.LoadString(IDS_ALREADY_USED); + return strMsgMountPoint + str + strMsgAlreadyUsed; } else { int i = pList->GetItemCount(); nItem = pList->InsertItem(LVIF_TEXT | (m_imageIndex >= 0 ? LVIF_IMAGE : 0) | LVIF_STATE, i, str, @@ -225,7 +237,7 @@ CString CMountPropertyPage::Mount(LPCWSTR argPath, LPCWSTR argMountPoint, LPCWST : pList->GetItemText(nItem, DL_INDEX); if (cmp.GetLength() < 1) - return CString(L"unable to get drive letter");; + return CString(L"unable to get drive letter"); BOOL dlInUse = is_mountpoint_a_drive(cmp) && !IsDriveLetterAvailable(*(LPCWSTR)cmp); @@ -235,9 +247,12 @@ CString CMountPropertyPage::Mount(LPCWSTR argPath, LPCWSTR argMountPoint, LPCWST dlInUse = true; if (dlInUse) { - CString mes = L"Mount point "; + CString mes, strMsgMountPoint, strMsgAlreadyUsed; + strMsgMountPoint.LoadString(IDS_MOUNT_POINT); + strMsgAlreadyUsed.LoadString(IDS_ALREADY_USED); + mes = strMsgMountPoint; mes += cmp; - mes += L" is already being used."; + mes += strMsgAlreadyUsed; return mes; } @@ -253,8 +268,11 @@ CString CMountPropertyPage::Mount(LPCWSTR argPath, LPCWSTR argMountPoint, LPCWST else pWnd->GetWindowTextW(cpath); - if (cpath.GetLength() < 1) - return CString(L"path length is zero"); + if (cpath.GetLength() < 1) { + CString strMessage; + strMessage.LoadString(IDS_PATH_ZERO); + return strMessage; + } CString config_path; @@ -292,9 +310,11 @@ CString CMountPropertyPage::Mount(LPCWSTR argPath, LPCWSTR argMountPoint, LPCWST } if (pathInUse) { + CString strMessage; + strMessage.LoadString(IDS_ALREADY_MOUNTED); CString mes = L""; mes += cpath; - mes += L" is already mounted on "; + mes += strMessage; mes += mdl; return mes; } @@ -323,14 +343,20 @@ CString CMountPropertyPage::Mount(LPCWSTR argPath, LPCWSTR argMountPoint, LPCWST CryptSettings::getInstance().GetSettings(opts); if (opts.denyothersessions || opts.denyservices) { - if (!CanGetSessionIdOk()) { - return CString(L"Unable to get session id. Deny other sessions/Deny services setting will not work and must be disabled."); + if (!CanGetSessionIdOk()) { + CString strMessage; + strMessage.LoadString(IDS_UNABLE_GET_SESSION_ID); + return strMessage; } if (!have_sessionid()) { - return CString(L"Unable to get current process session id. Deny other sessions/Deny services setting will not work and must be disabled."); + CString strMessage; + strMessage.LoadString(IDS_UNABLE_GET_PROCESS_SESSION_ID); + return strMessage; } if (get_sessionid() == 0) { - return CString(L"Current session id is 0. Deny other sessions/Deny services setting will not work and must be disabled."); + CString strMessage; + strMessage.LoadString(IDS_SESSION_ID_ZERO); + return strMessage; } } @@ -358,7 +384,9 @@ CString CMountPropertyPage::Mount(LPCWSTR argPath, LPCWSTR argMountPoint, LPCWST if (IsDlgButtonChecked(IDC_SAVE_PASSWORD)) { if (!SavedPasswords::SavePassword(cpath, password.m_buf)) { - MessageBox(L"unable to save password", L"cppcryptfs", MB_ICONEXCLAMATION | MB_OK); + CString strMessage; + strMessage.LoadString(IDS_UNABLE_SAVE_PASS); + MessageBox(strMessage, L"cppcryptfs", MB_ICONEXCLAMATION | MB_OK); } } @@ -492,7 +520,9 @@ BOOL CMountPropertyPage::OnInitDialog() // or using the string table resource CWnd *pWnd = GetDlgItem(IDC_SAVE_PASSWORD); if (pWnd) { - m_ToolTip.AddTool(pWnd, _T("To enable \"Save password\", turn on \"Enable saved passwords\" in the Settings tab.")); + CString strMessage; + strMessage.LoadString(IDS_TOOLTIP_ENABLE_SAVE_PASS); + m_ToolTip.AddTool(pWnd, strMessage); } } @@ -531,9 +561,13 @@ BOOL CMountPropertyPage::OnInitDialog() mountPointColumnWidth = 79; } - pList->InsertColumn(DL_INDEX, L"Mount Point", LVCFMT_LEFT, mountPointColumnWidth); + CString strMsgColHdrMountPoint, strMsgColHdrPath; + strMsgColHdrMountPoint.LoadString(IDS_COLUMN_HEADER_MOUNT_POINT); + strMsgColHdrPath.LoadString(IDS_COLUMN_HEADER_PATH); + + pList->InsertColumn(DL_INDEX, strMsgColHdrMountPoint, LVCFMT_LEFT, mountPointColumnWidth); - pList->InsertColumn(PATH_INDEX, L"Path", LVCFMT_LEFT, 454-mountPointColumnWidth); + pList->InsertColumn(PATH_INDEX, strMsgColHdrPath, LVCFMT_LEFT, 454-mountPointColumnWidth); CString lastMountPoint = theApp.GetProfileString(L"MountPoints", L"LastMountPoint", L""); @@ -619,8 +653,11 @@ BOOL CMountPropertyPage::OnInitDialog() if (pCombo) pCombo->LimitText(MAX_PATH); - if (!m_password.ArePasswordBuffersLocked()) - MessageBox(L"unable to lock password buffer", L"cppcryptfs", MB_OK | MB_ICONERROR); + if (!m_password.ArePasswordBuffersLocked()) { + CString strMessage; + strMessage.LoadString(IDS_UNABLE_LOCK_BUFFER); + MessageBox(strMessage, L"cppcryptfs", MB_OK | MB_ICONERROR); + } ProcessCommandLine(GetCommandLine(), TRUE); @@ -767,6 +804,9 @@ CString CMountPropertyPage::Dismount(LPCWSTR argMountPoint, bool interactive, bo int nItem; if (argMountPoint && wcslen(argMountPoint) > 0) { + CString strMsgDrive, strMsgNoMountedFS; + strMsgDrive.LoadString(IDS_DRIVE); + strMsgNoMountedFS.LoadString(IDS_NO_MOUNTED_FS); LVFINDINFO fi; memset(&fi, 0, sizeof(fi)); fi.flags = LVFI_STRING; @@ -774,7 +814,7 @@ CString CMountPropertyPage::Dismount(LPCWSTR argMountPoint, bool interactive, bo fi.psz = str; nItem = pList->FindItem(&fi); if (nItem < 0) - return CString(L"Drive ") + str + CString(L" does not have a mounted cppcryptfs filesystem."); + return strMsgDrive + str + strMsgNoMountedFS; } else { nItem = pList->GetNextSelectedItem(pos); } @@ -789,8 +829,12 @@ CString CMountPropertyPage::Dismount(LPCWSTR argMountPoint, bool interactive, bo CString cpath = pList->GetItemText(nItem, PATH_INDEX); - if (cpath.GetLength() < 1) - return CString(L"Drive ") + cmp + CString(L" does not have a mounted cppcryptfs filesystem."); + if (cpath.GetLength() < 1) { + CString strMsgDrive, strMsgNoMountedFS; + strMsgDrive.LoadString(IDS_DRIVE); + strMsgNoMountedFS.LoadString(IDS_NO_MOUNTED_FS); + return strMsgDrive + cmp + strMsgNoMountedFS; + } CString mes; @@ -811,9 +855,11 @@ CString CMountPropertyPage::Dismount(LPCWSTR argMountPoint, bool interactive, bo theApp.DoWaitCursor(-1); if (!bresult) { + CString strMessage; + strMessage.LoadString(IDS_CANNOT_UNMOUNT); if (mes.GetLength() > 0) mes += L". "; - mes += L"cannot unmount "; + mes += strMessage; mes.Append(cmp); if (wmes.length() > 0) { mes += L" "; @@ -902,16 +948,22 @@ CString CMountPropertyPage::DismountAll(bool interactive, bool forceDismount) if (hadFailure) { if (hadSuccess) { - mes = L"Some of the drives could not be dismounted"; + CString strMessage; + strMessage.LoadString(IDS_SOME_DRV_NOT_DISMOUNTED); + mes = strMessage; } else { - mes = L"Unable to dismount"; + CString strMessage; + strMessage.LoadString(IDS_UNABLE_DISMOUNT); + mes = strMessage; } } if (volnameFailure) { + CString strMessage; + strMessage.LoadString(IDS_UNABLE_UPDATE_LABELS); if (mes.GetLength() > 0) mes += L". "; - mes += L"unable to update one or more volume labels"; + mes += strMessage; } return mes; @@ -961,14 +1013,18 @@ BOOL CMountPropertyPage::OnSetActive() if (flags & AUTO_MOUNT_FLAG) { CString mountPoint = theApp.GetProfileString(L"MountPoints", path_hash, NULL); if (mountPoint.GetLength() == 0) { - MessageBox(L"Fail to retrive MountPoint for " + m_lastDirs[i], L"cppcryptfs", MB_OK | MB_ICONEXCLAMATION); + CString strMessage; + strMessage.LoadString(IDS_FAIL_RETRIVE_MPOINT); + MessageBox(strMessage + m_lastDirs[i], L"cppcryptfs", MB_OK | MB_ICONEXCLAMATION); continue; } LockZeroBuffer password(MAX_PASSWORD_LEN + 1, true); if (!SavedPasswords::RetrievePassword(m_lastDirs[i], password.m_buf, password.m_len)) { - MessageBox(L"Fail to retrive password for " + m_lastDirs[i], L"cppcryptfs", MB_OK | MB_ICONEXCLAMATION); + CString strMessage; + strMessage.LoadString(IDS_FAIL_RETRIVE_PASS); + MessageBox(strMessage + m_lastDirs[i], L"cppcryptfs", MB_OK | MB_ICONEXCLAMATION); continue; } @@ -1723,7 +1779,14 @@ void CMountPropertyPage::OnContextMenu(CWnd* pWnd, CPoint point) if (!menu.CreatePopupMenu()) return; - menu.AppendMenu(MF_ENABLED, AddMountPointV, L"&Add Mount Point..."); + CString strMsgMenuAdd, strMsgMenuOpen, strMsgMenuProperties, strMsgMenuDismount, strMsgMenuDeleteMountPoint; + strMsgMenuAdd.LoadString(IDS_MENU_ADD_MOUNT_POINT); + strMsgMenuOpen.LoadString(IDS_MENU_OPEN); + strMsgMenuProperties.LoadString(IDS_MENU_PROPERTIES); + strMsgMenuDismount.LoadString(IDS_MENU_DISMOUNT); + strMsgMenuDeleteMountPoint.LoadString(IDS_DELETE_MOUNT_POINT); + + menu.AppendMenu(MF_ENABLED, AddMountPointV, strMsgMenuAdd); int item = -1; @@ -1740,12 +1803,12 @@ void CMountPropertyPage::OnContextMenu(CWnd* pWnd, CPoint point) wstring mpstr; bool mounted = MountPointManager::getInstance().find(cmp, mpstr); if (mounted) { - menu.AppendMenu(MF_ENABLED, OpenV, L"Open...\tdouble-click"); - menu.AppendMenu(MF_ENABLED, PropertiesV, L"&Properties..."); - menu.AppendMenu(MF_ENABLED, DismountV, L"&Dismount"); + menu.AppendMenu(MF_ENABLED, OpenV, strMsgMenuOpen); + menu.AppendMenu(MF_ENABLED, PropertiesV, strMsgMenuProperties); + menu.AppendMenu(MF_ENABLED, DismountV, strMsgMenuDismount); } if (is_mountpoint_a_dir(cmp)) { - menu.AppendMenu(mounted ? MF_DISABLED : MF_ENABLED, DeleteMountPointV, L"Dele&te Mount Point"); + menu.AppendMenu(mounted ? MF_DISABLED : MF_ENABLED, DeleteMountPointV, strMsgMenuDeleteMountPoint); } } @@ -1806,8 +1869,9 @@ void CMountPropertyPage::AddMountPoint(const CString & path) return; if (!is_suitable_mountpoint(path)) { - MessageBox(L"The path is not suitable for use as a mount point. The folder must be empty, and it must reside on an NTFS filesystem", - L"cppcyrptfs", MB_OK | MB_ICONEXCLAMATION); + CString strMessage; + strMessage.LoadString(IDS_PATH_NOT_SUITABLE_MPOINT); + MessageBox(strMessage, L"cppcyrptfs", MB_OK | MB_ICONEXCLAMATION); return; } @@ -1816,7 +1880,9 @@ void CMountPropertyPage::AddMountPoint(const CString & path) int i = 0; for (CString mp = mountPointsStr.Tokenize(L"|", i); i >= 0; mp = mountPointsStr.Tokenize(L"|", i)) { if (!lstrcmpi(path, mp)) { - MessageBox(L"Mount point has already been added.", L"cppcryptfs", MB_OK | MB_ICONEXCLAMATION); + CString strMessage; + strMessage.LoadString(IDS_MPOINT_ALREADY_ADDED); + MessageBox(strMessage, L"cppcryptfs", MB_OK | MB_ICONEXCLAMATION); return; } } From 6b69a26f27a71631ff13a121564e0425cfa4f025 Mon Sep 17 00:00:00 2001 From: nbb1967 <81534939+nbb1967@users.noreply.github.com> Date: Sun, 25 Jan 2026 00:50:18 +0300 Subject: [PATCH 04/35] CryptPropertySheet CryptPropertySheet. Hardcoded strings moved to resources. --- cppcryptfs/cppcryptfs.rc | Bin 45902 -> 46154 bytes cppcryptfs/resource.h | Bin 16480 -> 16558 bytes cppcryptfs/ui/CryptPropertySheet.cpp | 5 ++++- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/cppcryptfs/cppcryptfs.rc b/cppcryptfs/cppcryptfs.rc index 9d0d9451932350c2c5747561d6c003b7185f1529..e4df5e7bf9cc2441a537b901b99252dff9e9a68d 100644 GIT binary patch delta 146 zcmX^2jOo-1rVSI;O!iqIpz6Zl$q>xo%izxt%HYQk!Vu5k$lwEn@jwwjAnD2w!QeT0 zqlo0>1PvBeM}{1RoXNA7*fJJR&JB{B{B9|qr5=L?b>Nh;E*@W&;}lC>|uj delta 18 acmX^0g6Z5drVSI;O!na5+dOOS1~vd)0SNd2 diff --git a/cppcryptfs/resource.h b/cppcryptfs/resource.h index 03287077fdc1fa7b775cc9a4c11ad8924c3fb4ec..1a7b3ba1e49a0d69b76712e2f27e41150646b5c9 100755 GIT binary patch delta 66 zcmaFRz__lFaf5(}z6*mVLokCcgFizkgC9c(Lp*~cgAWkK14aCRq$@)NP(=s>ClDGj Pm`_gRmESBN5}*SB+Efg~ delta 14 VcmZ42$oQavaf5)!<~Wf69RMpk1qT2C diff --git a/cppcryptfs/ui/CryptPropertySheet.cpp b/cppcryptfs/ui/CryptPropertySheet.cpp index f1ad8a3..5b9e197 100755 --- a/cppcryptfs/ui/CryptPropertySheet.cpp +++ b/cppcryptfs/ui/CryptPropertySheet.cpp @@ -80,8 +80,11 @@ CCryptPropertySheet::~CCryptPropertySheet() BOOL CCryptPropertySheet::CanClose() { if (!MountPointManager::getInstance().empty()) { + + CString strMessage; + strMessage.LoadString(IDS_DISMOUNT_ALL_ON_EXIT); - if (MessageBox(L"All mounted cppcryptfs filesystems will be dismounted. Do you really wish to exit?", L"cppcryptfs", + if (MessageBox(strMessage, L"cppcryptfs", MB_YESNO | MB_ICONEXCLAMATION) == IDYES) { CString open_handles_mes = CheckOpenHandles(m_hWnd, nullptr, true, false).c_str(); From 1756a5121c403ff5d314198e2322c13258489fb0 Mon Sep 17 00:00:00 2001 From: nbb1967 <81534939+nbb1967@users.noreply.github.com> Date: Tue, 27 Jan 2026 10:40:58 +0300 Subject: [PATCH 05/35] Refactoring Refactoring. FolderDialog. locutils. --- cppcryptfs/cppcryptfs.rc | Bin 46154 -> 48388 bytes cppcryptfs/resource.h | Bin 16558 -> 17234 bytes cppcryptfs/ui/CreatePropertyPage.cpp | 90 +++++--------- cppcryptfs/ui/CryptAboutPropertyPage.cpp | 30 +++-- cppcryptfs/ui/CryptPropertySheet.cpp | 6 +- cppcryptfs/ui/FolderDialog.cpp | 7 +- cppcryptfs/ui/FsInfoDialog.cpp | 28 ++--- cppcryptfs/ui/MountPropertyPage.cpp | 146 ++++++++--------------- cppcryptfs/ui/locutils.cpp | 10 ++ cppcryptfs/ui/locutils.h | 7 ++ 10 files changed, 135 insertions(+), 189 deletions(-) create mode 100644 cppcryptfs/ui/locutils.cpp create mode 100644 cppcryptfs/ui/locutils.h diff --git a/cppcryptfs/cppcryptfs.rc b/cppcryptfs/cppcryptfs.rc index e4df5e7bf9cc2441a537b901b99252dff9e9a68d..73f0c171fe1ea511f0782882647f3f7441beb278 100644 GIT binary patch delta 1892 zcmdT_OHWf#5FQE`#04Z!2*kjJ+Nj}G9tHtXN zB{Gc^6O9RjxRTh)Fp7$oC8AV3*k9#~_xromtt|E0<8K*I@d?}fO`g?v^Fz9$ut5s- zQ>Xa8U=$sTO~;aw82QP|GIe$Fs!n8W9T&69m7;aIRJz?<{-w<&;_b5{&FPn=BB5Kk zuKHF&I^kP+qdr=*>+;-mnfk~@y=0>ya*6i!lZnwRQM#ThP0X#oF1L_}B6y+{2bx=0 zg|X(D_cAth?D<57Fg-0)KfP$k)EriC+|yR8iCpnvV?_;ap3sRO3;B&!8ivQ$SjbJV0O_(a*EwTL$*RSq=?aeQSk*YoyM-7TJW5Ow1G@=rvOY48VW$CYT9WU ztW0obC@!+++5o3M9UKRl0jQ6<=n??fXi&T=E6{sjdYpWFvVB+v?-{H)R}9q*P%W6P zI2*=@!?lm9A@Rsl9F|uG$7%8cTo`sal{4C@2+k`s0NoJ2D&TsYrZnjObkMs1w;vz| zq2`8>J|s&y^i(3KC{1b(6*?tBPD_@iCA&$kE9#hA$-HE_0X!=xgeaZ>fcYiZJ{e3c zwaNS#+L;LGAIggv!Av6n4qE|rwNh^Y{_jE>hFn2G?OCX(F;R1h4ffiLlbpp#%uH|$ z+8n_h@pYjj@NbM*!AK{p96WzB5`v!_@aVyq`5!sCpN$i}c()9VX7fF1*+7!2M%fZTl;GT%8fg6@~@lFfxfWzy>~oDz5tZ~kZT-y(#n zMr|{_b(4dph)q_Q+ytcsCZCzyv^i)B7ZanxdY0GY&1t{vcLp^ z$whPiOfH(MH~G^noyiyGCQL4yziIP>d3zW^jL8q?@lCdKWZRsu(2HsE9)7vW3H(yr zE(}EsnG9tNsSFB}1E+{H`!V=W-nm$PvcOCUpkuc&CQn|uM0T>!0*TF!mSiw8mTvZ5 i=E^+T2q?Q|Wfj-e^m*^wLsOA#Nn1ALwXDlK#z@}AS(kZBmU&*0Q1Vih8t#>cb9(|y_7i-!=WxXM z%JFe)C%sObGODJFJEwv@N5>)-m4iO>eO1Gta&fIH|8!U*6?{$M`^GZM<3;77N1KcT|b{vA2YP1%K<{^a0p_hiW$>eNJ9qFVD~l+ zSR;0w90~TUFs3`#)9}m0ydg)I6KG4@oFielFa8fhhYU*(42`_^BCUT&7n@vYz!=4g z)JskjeDY%jFVi?yiQ9-h)X$>FEcna8$B=nkO7*`%hLG5h>NnZ_!2#t>YJDAkO}$sT Xto=z&y32N4%W8b9KfT&5toeTcDiWnk delta 258 zcmXAiu}Z^G7=>@DhzaE8-kTszEmsk>n5mQ+oTW-#6dc4=-@q-Sc5p1h*9Q9=%qnBu=hSIM`O$6eO})Nj)@Jm=blHzBg=z6=3={XO fIOoghSXxH0;jU?!#$C=sJ53r5%Fe=bkPfqd#}Y@A diff --git a/cppcryptfs/ui/CreatePropertyPage.cpp b/cppcryptfs/ui/CreatePropertyPage.cpp index caf746f..7154736 100755 --- a/cppcryptfs/ui/CreatePropertyPage.cpp +++ b/cppcryptfs/ui/CreatePropertyPage.cpp @@ -41,6 +41,7 @@ THE SOFTWARE. #include "crypt/cryptdefs.h" #include "util/LockZeroBuffer.h" #include "util/util.h" +#include "locutils.h" static const WCHAR *filename_encryption_types[] = { L"AES256-EME", @@ -110,11 +111,8 @@ void CCreatePropertyPage::CreateCryptfs() LockZeroBuffer password2(MAX_PASSWORD_LEN + 1, false); if (!password.IsLocked() || !password2.IsLocked()) { - CString strMessage; - if (strMessage.LoadString(IDS_COULD_NOT_LOCK_BUFFER)) { - MessageBox(strMessage, L"cppcryptefs", MB_OK | MB_ICONERROR); - return; - } + MessageBox(LocUtils::GetStringFromResources(IDS_COULD_NOT_LOCK_BUFFER), L"cppcryptefs", MB_OK | MB_ICONERROR); + return; } CSecureEdit *pPass = &m_password; @@ -123,11 +121,8 @@ void CCreatePropertyPage::CreateCryptfs() return; if (wcslen(password.m_buf) < 1) { - CString strMessage; - if (strMessage.LoadString(IDS_PASSWORD_EMPTY)) { - MessageBox(strMessage, L"cppcryptfs", MB_OK | MB_ICONEXCLAMATION); - return; - } + MessageBox(LocUtils::GetStringFromResources(IDS_PASSWORD_EMPTY), L"cppcryptfs", MB_OK | MB_ICONEXCLAMATION); + return; } CSecureEdit *pPass2 = &m_password2; @@ -136,19 +131,13 @@ void CCreatePropertyPage::CreateCryptfs() return; if (wcslen(password2.m_buf) < 1) { - CString strMessage; - if (strMessage.LoadString(IDS_PASSWORD_REPEAT_EMPTY)) { - MessageBox(strMessage, L"cppcryptfs", MB_OK | MB_ICONEXCLAMATION); - return; - } + MessageBox(LocUtils::GetStringFromResources(IDS_PASSWORD_REPEAT_EMPTY), L"cppcryptfs", MB_OK | MB_ICONEXCLAMATION); + return; } if (wcscmp(password.m_buf, password2.m_buf)) { - CString strMessage; - if (strMessage.LoadString(IDS_PASSWORD_DO_NOT_MATCH)) { - MessageBox(strMessage, L"cppcryptfs", MB_OK | MB_ICONEXCLAMATION); - return; - } + MessageBox(LocUtils::GetStringFromResources(IDS_PASSWORD_DO_NOT_MATCH), L"cppcryptfs", MB_OK | MB_ICONEXCLAMATION); + return; } pPass->SetRealText(L""); @@ -159,27 +148,20 @@ void CCreatePropertyPage::CreateCryptfs() pWnd->GetWindowTextW(cpath); if (cpath.GetLength() < 1) { - CString strMessage; - if (strMessage.LoadString(IDS_PATH_EMPTY)) { - MessageBox(strMessage, L"cppcryptfs", MB_OK | MB_ICONEXCLAMATION); - return; - } + MessageBox(LocUtils::GetStringFromResources(IDS_PATH_EMPTY), L"cppcryptfs", MB_OK | MB_ICONEXCLAMATION); + return; } if (!PathFileExists(cpath)) { - CString mes, strMessage; - mes += cpath; - strMessage.LoadString(IDS_PATH_DOES_NOT_EXIST); - mes += strMessage; + CString mes; + mes.Format(LocUtils::GetStringFromResources(IDS_PATH_DOES_NOT_EXIST), cpath); if (MessageBox(mes, L"cppcryptfs", MB_YESNO | MB_ICONINFORMATION) == IDYES) { - if (!CreateDirectory(cpath, NULL)) { - strMessage.LoadString(IDS_PATH_COULD_NOT_CREATE); - mes = strMessage; - mes += cpath; - MessageBox(mes, L"cppcryptfs", MB_OK | MB_ICONEXCLAMATION); - return; - } + if (!CreateDirectory(cpath, NULL)) { + mes.Format(LocUtils::GetStringFromResources(IDS_PATH_COULD_NOT_CREATE), cpath); + MessageBox(mes, L"cppcryptfs", MB_OK | MB_ICONEXCLAMATION); + return; + } } else { return; } @@ -273,13 +255,9 @@ void CCreatePropertyPage::CreateCryptfs() return; } - CString mes, strMsgReverse, strMsgForward; - strMsgReverse.LoadString(IDS_CREATED_REVERSE_FS); - strMsgForward.LoadString(IDS_CREATED_FORWARD_FS); - - mes = reverse ? strMsgReverse : strMsgForward; + CString mes; - mes.Append(cpath); + reverse ? mes.Format(LocUtils::GetStringFromResources(IDS_CREATED_REVERSE_FS), cpath) : mes.Format(LocUtils::GetStringFromResources(IDS_CREATED_FORWARD_FS), cpath); MessageBox(mes, L"cppcryptfs", MB_OK | MB_ICONINFORMATION); @@ -365,11 +343,8 @@ void CCreatePropertyPage::OnClickedSelect() return; if (!IsDlgButtonChecked(IDC_REVERSE) && !can_delete_directory(cpath, TRUE)) { - CString strMessage; - if (strMessage.LoadString(IDS_DIRECTORY_NOT_EMPTY)) { - MessageBox(strMessage, L"cppcryptfs", MB_OK | MB_ICONEXCLAMATION); - return; - } + MessageBox(LocUtils::GetStringFromResources(IDS_DIRECTORY_NOT_EMPTY), L"cppcryptfs", MB_OK | MB_ICONEXCLAMATION); + return; } CWnd *pWnd = GetDlgItem(IDC_PATH); @@ -475,10 +450,7 @@ BOOL CCreatePropertyPage::OnInitDialog() pLbox->EnableWindow(IsDlgButtonChecked(IDC_LONG_FILE_NAMES)); if (!m_password.ArePasswordBuffersLocked() || !m_password2.ArePasswordBuffersLocked()) { - CString strMessage; - if (strMessage.LoadString(IDS_UNABLE_LOCK_BUFFERS)) { - MessageBox(strMessage, L"cppcryptfs", MB_OK | MB_ICONERROR); - } + MessageBox(LocUtils::GetStringFromResources(IDS_UNABLE_LOCK_BUFFERS), L"cppcryptfs", MB_OK | MB_ICONERROR); } const auto scryptN = theApp.GetProfileIntW(L"CreateOptions", L"ScryptN", DEFAULT_SCRYPTN); @@ -606,19 +578,17 @@ void CCreatePropertyPage::OnSelchangeScryptn() int scryptN = stoi((LPCTSTR)sel); int mem = (1<= 1024) - { - suffix = strMsgGB; + + CString suffix; + suffix.Format(LocUtils::GetStringFromResources(IDS_MB_REQUIRED), mem); + + if (mem >= 1024) { mem /= 1024; + suffix.Format(LocUtils::GetStringFromResources(IDS_GB_REQUIRED), mem); } auto pScryptMemReq = (CStatic*)GetDlgItem(IDC_SCRYPTMEMREQ); if (pScryptMemReq) { - pScryptMemReq->SetWindowText((std::to_wstring(mem) + (LPCTSTR)suffix).c_str()); + pScryptMemReq->SetWindowText(suffix); } } diff --git a/cppcryptfs/ui/CryptAboutPropertyPage.cpp b/cppcryptfs/ui/CryptAboutPropertyPage.cpp index 40c6c64..28766ea 100755 --- a/cppcryptfs/ui/CryptAboutPropertyPage.cpp +++ b/cppcryptfs/ui/CryptAboutPropertyPage.cpp @@ -40,6 +40,7 @@ THE SOFTWARE. #include "crypt/aes.h" #include "openssl/crypto.h" #include "../libcommonutil/commonutil.h" +#include "locutils.h" // CCryptAboutPropertyPage dialog @@ -68,17 +69,24 @@ BEGIN_MESSAGE_MAP(CCryptAboutPropertyPage, CCryptPropertyPage) ON_NOTIFY(LVN_ITEMCHANGED, IDC_COMPONENTS_LIST, &CCryptAboutPropertyPage::OnItemchangedComponentsList) END_MESSAGE_MAP() - - -static const WCHAR * components[] = { - L"cppcryptfs - Copyright (C) 2016-2025 Bailey Brown. All Rights Reserved.", - L"OpenSSL - Copyright (c) 1998-2019 The OpenSSL Project. All rights reserved.", - L"RapidJSON - Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.", - L"Dokany (mirror) - Copyright (C) 2020 - 2021 Google, Inc.; Copyright (C) 2015 - 2019 Adrien J., Maxime C.; Copyright (C) 2007 - 2011 Hiroki Asakawa", - L"Dokany (library) - Copyright (C) 2020 - 2021 Google, Inc.; Copyright (C) 2015 - 2019 Adrien J., Maxime C.; Copyright (C) 2007 - 2011 Hiroki Asakawa", - L"100% free Secure Edit control MFC class - Copyright (c) 2003 Dominik Reichl", - L"getopt_port - Copyright (c) 2012-2017, Kim Grasman . All rights reserved.", - L"aes-siv - Copyright (c) 2015 ARKconcepts / Sasha Kotlyar", +CString strMsgCppcryptfs = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_CPPCRYPTFS); +CString strMsgOpenSSL = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_OPENSSL); +CString strMsgRapidJSON = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_RAPIDJSON); +CString strMsgDokanyMir = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_DOKANY_MIR); +CString strMsgDokanyLib = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_DOKANY_LIB); +CString strMsgSecuryEdit = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_SECURE_EDIT); +CString strMsgGetOpt = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_GETOPT_PORT); +CString strMsgAESSIV = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_AES_SIV); + +static const WCHAR* components[] = { + strMsgCppcryptfs, + strMsgOpenSSL, + strMsgRapidJSON, + strMsgDokanyMir, + strMsgDokanyLib, + strMsgSecuryEdit, + strMsgGetOpt, + strMsgAESSIV, NULL }; diff --git a/cppcryptfs/ui/CryptPropertySheet.cpp b/cppcryptfs/ui/CryptPropertySheet.cpp index 5b9e197..c16f26a 100755 --- a/cppcryptfs/ui/CryptPropertySheet.cpp +++ b/cppcryptfs/ui/CryptPropertySheet.cpp @@ -46,6 +46,7 @@ THE SOFTWARE. #include "../libcppcryptfs/util/KeyCache.h" #include "crypt/crypt.h" #include "cryptdefaults.h" +#include "locutils.h" // CryptPropertySheet @@ -81,10 +82,7 @@ BOOL CCryptPropertySheet::CanClose() { if (!MountPointManager::getInstance().empty()) { - CString strMessage; - strMessage.LoadString(IDS_DISMOUNT_ALL_ON_EXIT); - - if (MessageBox(strMessage, L"cppcryptfs", + if (MessageBox(LocUtils::GetStringFromResources(IDS_DISMOUNT_ALL_ON_EXIT), L"cppcryptfs", MB_YESNO | MB_ICONEXCLAMATION) == IDYES) { CString open_handles_mes = CheckOpenHandles(m_hWnd, nullptr, true, false).c_str(); diff --git a/cppcryptfs/ui/FolderDialog.cpp b/cppcryptfs/ui/FolderDialog.cpp index 8758ddf..1579f82 100755 --- a/cppcryptfs/ui/FolderDialog.cpp +++ b/cppcryptfs/ui/FolderDialog.cpp @@ -5,7 +5,9 @@ // from http://www.codeguru.com/cpp/w-d/dislog/dialogforselectingfolders/article.php/c1941/MFC-Wrapper-for-SHBrowseForFolder.htm #include "stdafx.h" +#include "cppcryptfs.h" #include "FolderDialog.h" +#include "locutils.h" #ifdef _DEBUG #undef THIS_FILE @@ -44,10 +46,13 @@ CFolderDialog::CFolderDialog(LPCTSTR lpszFolderName, DWORD dwFlags, CWnd* pParen else m_bi.hwndOwner = pParentWnd->GetSafeHwnd(); + static CString strMessageSelDir; + strMessageSelDir = LocUtils::GetStringFromResources(IDS_SELECT_DIRECTORY); + // Fill in the rest of the structure m_bi.pidlRoot = NULL; m_bi.pszDisplayName = m_szDisplayName; - m_bi.lpszTitle = _T("Select a directory"); + m_bi.lpszTitle = (LPCTSTR)strMessageSelDir; m_bi.ulFlags = dwFlags | BIF_NEWDIALOGSTYLE; m_bi.lpfn = BrowseDirectoryCallback; m_bi.lParam = (LPARAM)this; diff --git a/cppcryptfs/ui/FsInfoDialog.cpp b/cppcryptfs/ui/FsInfoDialog.cpp index 0912c28..ecfdcea 100644 --- a/cppcryptfs/ui/FsInfoDialog.cpp +++ b/cppcryptfs/ui/FsInfoDialog.cpp @@ -34,6 +34,7 @@ THE SOFTWARE. #include "cppcryptfs.h" #include "FsInfoDialog.h" #include "afxdialogex.h" +#include "locutils.h" #ifdef _DEBUG @@ -88,15 +89,13 @@ BOOL CFsInfoDialog::OnInitDialog() CDialog::OnInitDialog(); CString strMsgYes, strMsgNo, strMsgNA, strMsgReverse, strMsgForward, strMsgKB, strMsgSec, strMsgInfinite, strMsgNone; - strMsgYes.LoadString(IDS_FSINFO_YES); - strMsgNo.LoadString(IDS_FSINFO_NO); - strMsgNA.LoadString(IDS_FSINFO_NA); - strMsgReverse.LoadString(IDS_FSINFO_REVERSE); - strMsgForward.LoadString(IDS_FSINFO_FORWARD); - strMsgKB.LoadString(IDS_FSINFO_KB); - strMsgSec.LoadString(IDS_FSINFO_SEC); - strMsgInfinite.LoadString(IDS_FSINFO_INFINITE); - strMsgNone.LoadString(IDS_FSINFO_NAME_ENCRYPTION_NO); + strMsgYes = LocUtils::GetStringFromResources(IDS_FSINFO_YES); + strMsgNo = LocUtils::GetStringFromResources(IDS_FSINFO_NO); + strMsgNA = LocUtils::GetStringFromResources(IDS_FSINFO_NA); + strMsgReverse = LocUtils::GetStringFromResources(IDS_FSINFO_REVERSE); + strMsgForward = LocUtils::GetStringFromResources(IDS_FSINFO_FORWARD); + strMsgInfinite = LocUtils::GetStringFromResources(IDS_FSINFO_INFINITE); + strMsgNone = LocUtils::GetStringFromResources(IDS_FSINFO_NAME_ENCRYPTION_NO); LPCWSTR yes = strMsgYes; LPCWSTR no = strMsgNo; @@ -132,17 +131,18 @@ BOOL CFsInfoDialog::OnInitDialog() wstring txt; txt = to_wstring(m_info.ioBufferSize); - txt += strMsgKB; - SetDlgItemText(IDC_IO_BUF_SIZE, txt.c_str()); + strMsgKB.Format(LocUtils::GetStringFromResources(IDS_FSINFO_KB), txt); + SetDlgItemText(IDC_IO_BUF_SIZE, strMsgKB); txt = m_info.multhreaded ? yes : no; SetDlgItemText(IDC_THREADS, txt.c_str()); if (m_info.cacheTTL > 0) { txt = to_wstring(m_info.cacheTTL); - txt += strMsgSec; + strMsgSec.Format(LocUtils::GetStringFromResources(IDS_FSINFO_SEC), txt); + SetDlgItemText(IDC_CACHE_TTL, strMsgSec); } else { - txt = strMsgInfinite; + SetDlgItemText(IDC_CACHE_TTL, strMsgInfinite); } - SetDlgItemText(IDC_CACHE_TTL, txt.c_str()); + WCHAR buf[32]; *buf = '\0'; float r; diff --git a/cppcryptfs/ui/MountPropertyPage.cpp b/cppcryptfs/ui/MountPropertyPage.cpp index 22c3591..4764a5e 100644 --- a/cppcryptfs/ui/MountPropertyPage.cpp +++ b/cppcryptfs/ui/MountPropertyPage.cpp @@ -52,7 +52,7 @@ THE SOFTWARE. #include "dokan/MountPointManager.h" #include "../libipc/server.h" #include "../libcommonutil/commonutil.h" - +#include "locutils.h" #include // CMountPropertyPage dialog @@ -134,7 +134,7 @@ void CMountPropertyPage::HandleTooltipsActivation(MSG * pMsg, CWnd * This, CWnd pMsg->lParam = lParam; } -CString strMsgPassEmpty, strMsg; + CMountPropertyPage::CMountPropertyPage() : CCryptPropertyPage(IDD_MOUNT) @@ -169,22 +169,15 @@ CString CMountPropertyPage::Mount(LPCWSTR argPath, LPCWSTR argMountPoint, LPCWST LockZeroBuffer password(MAX_PASSWORD_LEN + 1, false); if (!password.IsLocked()) { - CString strMessage; - strMessage.LoadString(IDS_UNABLE_LOCK_BUFFER); - return strMessage; + return LocUtils::GetStringFromResources(IDS_UNABLE_LOCK_BUFFER); } if (wcscpy_s(password.m_buf, MAX_PASSWORD_LEN + 1, argPassword ? argPassword : pPass->m_strRealText)) { - CString strMessage; - strMessage.LoadString(IDS_UNABLE_GET_PASS); - return strMessage; + return LocUtils::GetStringFromResources(IDS_UNABLE_GET_PASS); } if (wcslen(password.m_buf) < 1) { - CString strMessage; - strMessage.LoadString(IDS_PASS_CANNOT_BE_EMPTY); - return strMessage; - + return LocUtils::GetStringFromResources(IDS_PASS_CANNOT_BE_EMPTY); } CListCtrl *pList = (CListCtrl*)GetDlgItem(IDC_DRIVE_LETTERS); @@ -208,10 +201,9 @@ CString CMountPropertyPage::Mount(LPCWSTR argPath, LPCWSTR argMountPoint, LPCWST nItem = pList->FindItem(&fi); if (nItem < 0) { if (is_mountpoint_a_drive(str)) { - CString strMsgMountPoint, strMsgAlreadyUsed; - strMsgMountPoint.LoadString(IDS_MOUNT_POINT); - strMsgAlreadyUsed.LoadString(IDS_ALREADY_USED); - return strMsgMountPoint + str + strMsgAlreadyUsed; + CString strMsg; + strMsg.Format(LocUtils::GetStringFromResources(IDS_MPOINT_ALREADY_USED), str); + return strMsg; } else { int i = pList->GetItemCount(); nItem = pList->InsertItem(LVIF_TEXT | (m_imageIndex >= 0 ? LVIF_IMAGE : 0) | LVIF_STATE, i, str, @@ -247,12 +239,8 @@ CString CMountPropertyPage::Mount(LPCWSTR argPath, LPCWSTR argMountPoint, LPCWST dlInUse = true; if (dlInUse) { - CString mes, strMsgMountPoint, strMsgAlreadyUsed; - strMsgMountPoint.LoadString(IDS_MOUNT_POINT); - strMsgAlreadyUsed.LoadString(IDS_ALREADY_USED); - mes = strMsgMountPoint; - mes += cmp; - mes += strMsgAlreadyUsed; + CString mes; + mes.Format(LocUtils::GetStringFromResources(IDS_MPOINT_ALREADY_USED), cmp); return mes; } @@ -269,9 +257,7 @@ CString CMountPropertyPage::Mount(LPCWSTR argPath, LPCWSTR argMountPoint, LPCWST pWnd->GetWindowTextW(cpath); if (cpath.GetLength() < 1) { - CString strMessage; - strMessage.LoadString(IDS_PATH_ZERO); - return strMessage; + return LocUtils::GetStringFromResources(IDS_PATH_ZERO); } CString config_path; @@ -310,12 +296,8 @@ CString CMountPropertyPage::Mount(LPCWSTR argPath, LPCWSTR argMountPoint, LPCWST } if (pathInUse) { - CString strMessage; - strMessage.LoadString(IDS_ALREADY_MOUNTED); - CString mes = L""; - mes += cpath; - mes += strMessage; - mes += mdl; + CString mes; + mes.Format(LocUtils::GetStringFromResources(IDS_ALREADY_MOUNTED), cpath, mdl); return mes; } @@ -344,19 +326,13 @@ CString CMountPropertyPage::Mount(LPCWSTR argPath, LPCWSTR argMountPoint, LPCWST if (opts.denyothersessions || opts.denyservices) { if (!CanGetSessionIdOk()) { - CString strMessage; - strMessage.LoadString(IDS_UNABLE_GET_SESSION_ID); - return strMessage; + return LocUtils::GetStringFromResources(IDS_UNABLE_GET_SESSION_ID); } if (!have_sessionid()) { - CString strMessage; - strMessage.LoadString(IDS_UNABLE_GET_PROCESS_SESSION_ID); - return strMessage; + return LocUtils::GetStringFromResources(IDS_UNABLE_GET_PROCESS_SESSION_ID); } if (get_sessionid() == 0) { - CString strMessage; - strMessage.LoadString(IDS_SESSION_ID_ZERO); - return strMessage; + return LocUtils::GetStringFromResources(IDS_SESSION_ID_ZERO); } } @@ -384,9 +360,7 @@ CString CMountPropertyPage::Mount(LPCWSTR argPath, LPCWSTR argMountPoint, LPCWST if (IsDlgButtonChecked(IDC_SAVE_PASSWORD)) { if (!SavedPasswords::SavePassword(cpath, password.m_buf)) { - CString strMessage; - strMessage.LoadString(IDS_UNABLE_SAVE_PASS); - MessageBox(strMessage, L"cppcryptfs", MB_ICONEXCLAMATION | MB_OK); + MessageBox(LocUtils::GetStringFromResources(IDS_UNABLE_SAVE_PASS), L"cppcryptfs", MB_ICONEXCLAMATION | MB_OK); } } @@ -520,9 +494,7 @@ BOOL CMountPropertyPage::OnInitDialog() // or using the string table resource CWnd *pWnd = GetDlgItem(IDC_SAVE_PASSWORD); if (pWnd) { - CString strMessage; - strMessage.LoadString(IDS_TOOLTIP_ENABLE_SAVE_PASS); - m_ToolTip.AddTool(pWnd, strMessage); + m_ToolTip.AddTool(pWnd, LocUtils::GetStringFromResources(IDS_TOOLTIP_ENABLE_SAVE_PASS)); } } @@ -561,13 +533,9 @@ BOOL CMountPropertyPage::OnInitDialog() mountPointColumnWidth = 79; } - CString strMsgColHdrMountPoint, strMsgColHdrPath; - strMsgColHdrMountPoint.LoadString(IDS_COLUMN_HEADER_MOUNT_POINT); - strMsgColHdrPath.LoadString(IDS_COLUMN_HEADER_PATH); + pList->InsertColumn(DL_INDEX, LocUtils::GetStringFromResources(IDS_COLUMN_HEADER_MOUNT_POINT), LVCFMT_LEFT, mountPointColumnWidth); - pList->InsertColumn(DL_INDEX, strMsgColHdrMountPoint, LVCFMT_LEFT, mountPointColumnWidth); - - pList->InsertColumn(PATH_INDEX, strMsgColHdrPath, LVCFMT_LEFT, 454-mountPointColumnWidth); + pList->InsertColumn(PATH_INDEX, LocUtils::GetStringFromResources(IDS_COLUMN_HEADER_PATH), LVCFMT_LEFT, 454-mountPointColumnWidth); CString lastMountPoint = theApp.GetProfileString(L"MountPoints", L"LastMountPoint", L""); @@ -654,9 +622,7 @@ BOOL CMountPropertyPage::OnInitDialog() pCombo->LimitText(MAX_PATH); if (!m_password.ArePasswordBuffersLocked()) { - CString strMessage; - strMessage.LoadString(IDS_UNABLE_LOCK_BUFFER); - MessageBox(strMessage, L"cppcryptfs", MB_OK | MB_ICONERROR); + MessageBox(LocUtils::GetStringFromResources(IDS_UNABLE_LOCK_BUFFER), L"cppcryptfs", MB_OK | MB_ICONERROR); } ProcessCommandLine(GetCommandLine(), TRUE); @@ -804,17 +770,17 @@ CString CMountPropertyPage::Dismount(LPCWSTR argMountPoint, bool interactive, bo int nItem; if (argMountPoint && wcslen(argMountPoint) > 0) { - CString strMsgDrive, strMsgNoMountedFS; - strMsgDrive.LoadString(IDS_DRIVE); - strMsgNoMountedFS.LoadString(IDS_NO_MOUNTED_FS); LVFINDINFO fi; memset(&fi, 0, sizeof(fi)); fi.flags = LVFI_STRING; CString str = wcslen(argMountPoint) == 1 ? CString(*argMountPoint) + L":" : argMountPoint; fi.psz = str; nItem = pList->FindItem(&fi); - if (nItem < 0) - return strMsgDrive + str + strMsgNoMountedFS; + if (nItem < 0) { + CString msg; + msg.Format(LocUtils::GetStringFromResources(IDS_DRIVE_WITHOUT_MOUNTED_FS), str); + return msg; + } } else { nItem = pList->GetNextSelectedItem(pos); } @@ -830,10 +796,9 @@ CString CMountPropertyPage::Dismount(LPCWSTR argMountPoint, bool interactive, bo CString cpath = pList->GetItemText(nItem, PATH_INDEX); if (cpath.GetLength() < 1) { - CString strMsgDrive, strMsgNoMountedFS; - strMsgDrive.LoadString(IDS_DRIVE); - strMsgNoMountedFS.LoadString(IDS_NO_MOUNTED_FS); - return strMsgDrive + cmp + strMsgNoMountedFS; + CString msg; + msg.Format(LocUtils::GetStringFromResources(IDS_DRIVE_WITHOUT_MOUNTED_FS), cmp); + return msg; } CString mes; @@ -855,12 +820,12 @@ CString CMountPropertyPage::Dismount(LPCWSTR argMountPoint, bool interactive, bo theApp.DoWaitCursor(-1); if (!bresult) { - CString strMessage; - strMessage.LoadString(IDS_CANNOT_UNMOUNT); - if (mes.GetLength() > 0) + if (mes.GetLength() > 0) { mes += L". "; + } + CString strMessage; + strMessage.Format(LocUtils::GetStringFromResources(IDS_CANNOT_UNMOUNT), cmp); mes += strMessage; - mes.Append(cmp); if (wmes.length() > 0) { mes += L" "; mes += wmes.c_str(); @@ -948,22 +913,16 @@ CString CMountPropertyPage::DismountAll(bool interactive, bool forceDismount) if (hadFailure) { if (hadSuccess) { - CString strMessage; - strMessage.LoadString(IDS_SOME_DRV_NOT_DISMOUNTED); - mes = strMessage; + mes = LocUtils::GetStringFromResources(IDS_SOME_DRV_NOT_DISMOUNTED); } else { - CString strMessage; - strMessage.LoadString(IDS_UNABLE_DISMOUNT); - mes = strMessage; + mes = LocUtils::GetStringFromResources(IDS_UNABLE_DISMOUNT); } } if (volnameFailure) { - CString strMessage; - strMessage.LoadString(IDS_UNABLE_UPDATE_LABELS); if (mes.GetLength() > 0) mes += L". "; - mes += strMessage; + mes += LocUtils::GetStringFromResources(IDS_UNABLE_UPDATE_LABELS); } return mes; @@ -1014,8 +973,8 @@ BOOL CMountPropertyPage::OnSetActive() CString mountPoint = theApp.GetProfileString(L"MountPoints", path_hash, NULL); if (mountPoint.GetLength() == 0) { CString strMessage; - strMessage.LoadString(IDS_FAIL_RETRIVE_MPOINT); - MessageBox(strMessage + m_lastDirs[i], L"cppcryptfs", MB_OK | MB_ICONEXCLAMATION); + strMessage.Format(LocUtils::GetStringFromResources(IDS_FAIL_RETRIVE_MPOINT), m_lastDirs[i]); + MessageBox(strMessage, L"cppcryptfs", MB_OK | MB_ICONEXCLAMATION); continue; } @@ -1023,8 +982,8 @@ BOOL CMountPropertyPage::OnSetActive() if (!SavedPasswords::RetrievePassword(m_lastDirs[i], password.m_buf, password.m_len)) { CString strMessage; - strMessage.LoadString(IDS_FAIL_RETRIVE_PASS); - MessageBox(strMessage + m_lastDirs[i], L"cppcryptfs", MB_OK | MB_ICONEXCLAMATION); + strMessage.Format(LocUtils::GetStringFromResources(IDS_FAIL_RETRIVE_PASS), m_lastDirs[i]); + MessageBox(strMessage, L"cppcryptfs", MB_OK | MB_ICONEXCLAMATION); continue; } @@ -1779,14 +1738,7 @@ void CMountPropertyPage::OnContextMenu(CWnd* pWnd, CPoint point) if (!menu.CreatePopupMenu()) return; - CString strMsgMenuAdd, strMsgMenuOpen, strMsgMenuProperties, strMsgMenuDismount, strMsgMenuDeleteMountPoint; - strMsgMenuAdd.LoadString(IDS_MENU_ADD_MOUNT_POINT); - strMsgMenuOpen.LoadString(IDS_MENU_OPEN); - strMsgMenuProperties.LoadString(IDS_MENU_PROPERTIES); - strMsgMenuDismount.LoadString(IDS_MENU_DISMOUNT); - strMsgMenuDeleteMountPoint.LoadString(IDS_DELETE_MOUNT_POINT); - - menu.AppendMenu(MF_ENABLED, AddMountPointV, strMsgMenuAdd); + menu.AppendMenu(MF_ENABLED, AddMountPointV, LocUtils::GetStringFromResources(IDS_MENU_ADD_MOUNT_POINT)); int item = -1; @@ -1803,12 +1755,12 @@ void CMountPropertyPage::OnContextMenu(CWnd* pWnd, CPoint point) wstring mpstr; bool mounted = MountPointManager::getInstance().find(cmp, mpstr); if (mounted) { - menu.AppendMenu(MF_ENABLED, OpenV, strMsgMenuOpen); - menu.AppendMenu(MF_ENABLED, PropertiesV, strMsgMenuProperties); - menu.AppendMenu(MF_ENABLED, DismountV, strMsgMenuDismount); + menu.AppendMenu(MF_ENABLED, OpenV, LocUtils::GetStringFromResources(IDS_MENU_OPEN)); + menu.AppendMenu(MF_ENABLED, PropertiesV, LocUtils::GetStringFromResources(IDS_MENU_PROPERTIES)); + menu.AppendMenu(MF_ENABLED, DismountV, LocUtils::GetStringFromResources(IDS_MENU_DISMOUNT)); } if (is_mountpoint_a_dir(cmp)) { - menu.AppendMenu(mounted ? MF_DISABLED : MF_ENABLED, DeleteMountPointV, strMsgMenuDeleteMountPoint); + menu.AppendMenu(mounted ? MF_DISABLED : MF_ENABLED, DeleteMountPointV, LocUtils::GetStringFromResources(IDS_DELETE_MOUNT_POINT)); } } @@ -1869,9 +1821,7 @@ void CMountPropertyPage::AddMountPoint(const CString & path) return; if (!is_suitable_mountpoint(path)) { - CString strMessage; - strMessage.LoadString(IDS_PATH_NOT_SUITABLE_MPOINT); - MessageBox(strMessage, L"cppcyrptfs", MB_OK | MB_ICONEXCLAMATION); + MessageBox(LocUtils::GetStringFromResources(IDS_PATH_NOT_SUITABLE_MPOINT), L"cppcyrptfs", MB_OK | MB_ICONEXCLAMATION); return; } @@ -1880,9 +1830,7 @@ void CMountPropertyPage::AddMountPoint(const CString & path) int i = 0; for (CString mp = mountPointsStr.Tokenize(L"|", i); i >= 0; mp = mountPointsStr.Tokenize(L"|", i)) { if (!lstrcmpi(path, mp)) { - CString strMessage; - strMessage.LoadString(IDS_MPOINT_ALREADY_ADDED); - MessageBox(strMessage, L"cppcryptfs", MB_OK | MB_ICONEXCLAMATION); + MessageBox(LocUtils::GetStringFromResources(IDS_MPOINT_ALREADY_ADDED), L"cppcryptfs", MB_OK | MB_ICONEXCLAMATION); return; } } diff --git a/cppcryptfs/ui/locutils.cpp b/cppcryptfs/ui/locutils.cpp new file mode 100644 index 0000000..a3f45d5 --- /dev/null +++ b/cppcryptfs/ui/locutils.cpp @@ -0,0 +1,10 @@ +#include "stdafx.h" +#include "locutils.h" + +CString LocUtils::GetStringFromResources(UINT nID) { + CString str; + if (!str.LoadString(AfxGetResourceHandle(), nID)) { + return _T("Error: String not found"); + } + return str; +} \ No newline at end of file diff --git a/cppcryptfs/ui/locutils.h b/cppcryptfs/ui/locutils.h new file mode 100644 index 0000000..4a26311 --- /dev/null +++ b/cppcryptfs/ui/locutils.h @@ -0,0 +1,7 @@ +#pragma once +#include + +class LocUtils { +public: + static CString GetStringFromResources(UINT nID); +}; From 98eea70c06a8295d3b179087180f579e78532b30 Mon Sep 17 00:00:00 2001 From: nbb1967 Date: Fri, 30 Jan 2026 20:48:42 +0300 Subject: [PATCH 06/35] Licenses to RCDATA. Folder lic for licenses.txt. CryptAboutPropertyPage --- cppcryptfs/cppcryptfs.rc | Bin 48388 -> 50428 bytes cppcryptfs/cppcryptfs.vcxproj | 12 + cppcryptfs/res/lic/en_aessiv.txt | Bin 0 -> 2284 bytes cppcryptfs/res/lic/en_cppcryptfs.txt | Bin 0 -> 3390 bytes cppcryptfs/res/lic/en_dokany_lib.txt | Bin 0 -> 15434 bytes cppcryptfs/res/lic/en_dokany_mir.txt | Bin 0 -> 2904 bytes cppcryptfs/res/lic/en_getopt.txt | Bin 0 -> 3322 bytes cppcryptfs/res/lic/en_openssl.txt | Bin 0 -> 11388 bytes cppcryptfs/res/lic/en_rapidjson.txt | Bin 0 -> 10124 bytes cppcryptfs/res/lic/en_secuty_edit.txt | Bin 0 -> 878 bytes cppcryptfs/resource.h | Bin 17234 -> 18472 bytes cppcryptfs/ui/CryptAboutPropertyPage.cpp | 546 ++--------------------- 12 files changed, 57 insertions(+), 501 deletions(-) create mode 100644 cppcryptfs/res/lic/en_aessiv.txt create mode 100644 cppcryptfs/res/lic/en_cppcryptfs.txt create mode 100644 cppcryptfs/res/lic/en_dokany_lib.txt create mode 100644 cppcryptfs/res/lic/en_dokany_mir.txt create mode 100644 cppcryptfs/res/lic/en_getopt.txt create mode 100644 cppcryptfs/res/lic/en_openssl.txt create mode 100644 cppcryptfs/res/lic/en_rapidjson.txt create mode 100644 cppcryptfs/res/lic/en_secuty_edit.txt diff --git a/cppcryptfs/cppcryptfs.rc b/cppcryptfs/cppcryptfs.rc index 73f0c171fe1ea511f0782882647f3f7441beb278..7a7dff4082bc21b0ef590b43756c0d32e7e2cb54 100644 GIT binary patch delta 1188 zcmbW1T}u>E9L67W%UoSHZHK`X+Fb{+4JzLdy3)zrY|z|wokUSsS9cNLR@vP|yYa>w z?}EQ|6$C|j5vC#tQ6Hg;K7xLY=%VLLNRmMZISg~o;W^Lm|8i!weq8yvU48KASjKm5 zNZ&hOT^bX}z`+0>%VDTVrh{Q=f9aDCM~yPQUoR)mJLTJ6Pjd=sBr%Lpjv-_*##M%M z2Pv_4TV=}(%UcOIC6K}(Y$_)%sM@MptK6-g|U zcaPrx^AGG>S$+Q!E3wKv@>n2Yg(Mxu{R1nf&&bnvk(?qnSPfP6k{0FTp|yEgit5db z4uui1)9mq6_DbFOB)jIY+fg+(y_bFvWj1RT&)6oFYJp|tRn-h*fM}PWNcs#;wtNlM q&*|gmh^%;bMi=_~`&55{F&POOz51*iS?X5KW9?6ZM}x + @@ -260,6 +261,7 @@ + @@ -316,6 +318,16 @@ + + + + + + + + + + diff --git a/cppcryptfs/res/lic/en_aessiv.txt b/cppcryptfs/res/lic/en_aessiv.txt new file mode 100644 index 0000000000000000000000000000000000000000..f97934ec262b5f52af54af52299594f5bec7c99b GIT binary patch literal 2284 zcmai!-)|CY5QgX4#Q$OAl_qM{#2fEcN|lJ9fHvonR;;T~2vnQ?^Xl__!-kf_$q89@ zcYeI{&O7t%pWmxk$1=XhEY9O9s`$zKJYMm15e=4aSkB@p-eoM}D5m&-U^nZMi1T8b z#U`F`HSsI%$33hoe&^`q+GR0VwtcIM1 z+%H(B@bKPn7jsQT|EHj3gq|yG);z@PVad(v@;MY`=eN78sM$~@b+g`0JVGbCpU{Ok zb823r%bd4gT=RI0HG5o>{{%Mbc|~p&b#!CQy`jfd$ytyib319kx-4G1oTH`M+4nU* zF;(I&!&Wm{iZ~_n-#HbyGf@7ovNdFqbF@+wLvZCd=GWhLzt6&%tmtqJ&kHa_XlFLZ zCZ|i#+=^Dc!#j}HyE!WGlYG@!^DIlXAHt}I!c%JJE;#|Cdw4qB`v+=UzjJ`^Ls&i{ z=S4h==kb!KI!5sht5dN9w_HVzxW-i76tya1mU!m$@1(`|`cT*|V6frW&Ng?{Q!*=? z(kkcH?Dqbq_)@_m(Cyk?+)zi2&(OooZ#PX=8{)oVbtBvc&s=7Ty)=0limPKXaL{x?&}h!#cet)-&5H)%xY_WUHYptUIQIF1(EC zms4V&s??#1duaWATh5^a)&PWVd_HasrvrR^9iWmR=@c4T-l$=PZjc z$bFc!+Mi$@f^1)YuiTnc_!H0FZ3i_Ob@7Ok`?O2Yzfk$6rW}2i*4*otCsfHdS_dBDJ5I!DeX`F&L#P^eI=i0e$vj& zeLicwwx1-wl>MEMJlj;VGfDknAM~C5p4*SwITjO^kL?$-36_bT=Nip>+1(1yqxLd0 zTlp^~_ap=>?H5A5(#}qL6OV4|ae#K>94vGWAC*>>@hU#*uPHK1#8} z@5G};w$hpm&V(K|6R!*Hkv}9JYu*xzPud~!eck=KsOoA-m315eEHKX{_osK$HG1Cbo__fl7TWSfo+IcgzL=4zNLhKv|Nq9!~3%=n^yr zl5f^S^lSLS7HmyDuQ53`-W7BE#!+w@^+PAmY?U& zmM$6H#l%JeoAhX)L35$?i~GQ9>RhG`r!z@L*U~d{-+5Lhi9c0pc+XRf`v4!U@`QlNW);y15iflblQ^+*XgA%F3t=zCJ&}=hDkW@C zFEMGs5HaQ(JYYq>c%m*o-QR4#-Tz z?2cOA*CMKz#f7}VaI?Z9-l*Orb(o#V9kmeio!+6Z*0L2hV~(%crN^?Fr{c(N?OGP@ z?appArylhG)X;Z2+AB1NhC2DEd+bWPSK2v|1Sg!Ics)M&Eq5!qvEO!KV<@@4*1t*? z+x(~2_tnpm@5>hXytZH5$F;0s^-lh<-Sg?)ai7ScajAJemLA`2?OoLV`qJW-?YbT} zZXg|LztAco+((7w@CUMVsjVV4hW~5E#Cz(WmN+T1<6@*YHPfn^;m+ gXRcrONLWb~Hg+7Z5f;umnG0OeJ$O!ts%K!iX literal 0 HcmV?d00001 diff --git a/cppcryptfs/res/lic/en_dokany_lib.txt b/cppcryptfs/res/lic/en_dokany_lib.txt new file mode 100644 index 0000000000000000000000000000000000000000..0a98ec4d6492d52649a2b342b7b92d09143ef09f GIT binary patch literal 15434 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 Rx}6JLau*yF&(+AA=|AxS){p=I literal 0 HcmV?d00001 diff --git a/cppcryptfs/res/lic/en_getopt.txt b/cppcryptfs/res/lic/en_getopt.txt new file mode 100644 index 0000000000000000000000000000000000000000..2afb3d4b2aea160c060f31e89591da0dd8538ac1 GIT binary patch literal 3322 zcmd6pTTfF_5QXR2#Q$)@6B@vYZ>HPLhR5=2CwCIJcQi?W=vUp)IVi3!P8xwcd_xEXj!^16$MW)XwageUtP|cQd^o z%W5I{xt^c(oJzW|hxS0)=lUD!eC4-CHh151>$_F>&(`=abT_e)N4|b@BFT|F5x;Om zWA}C&`K8dz^eLn_m7lS!#yaCMc^)eQnaq}G`|=kW+>lFAiG9tps?HY+IJlD6v9ddn zpB(X2vY}#3g!zkjg`IkZ{;ISd$?l~+w-x|A=wM?~p=do*&oXS(iN@d^;d^7v5=SVi-lGa;uY>?@@JO6=usY`XIO>_%N*oF`6VnXP>@Eiz;S(Q~xU5Z!52TaTr;ndNQ z|7_VK_sKuHqPqUK^N)&+#7T5dLeW40nv!Z}eKFsAPO(}tnDKzQ3O_jPpD zbqrW=PgczOz~jV@U>nDtg&){LH*gRqvS!}lBb}ok7Ved)fv4D1)xQmFpd)#>6oS|e ziMzB>=Dsh6^24vha2bhN2gRjFh&{qA=G`(EhS&&sM|N%7cC3_MX>HrIt{qrSTcIII z$oF(=+rCa4l5R-8ZijkeiB?^=dy;gdu_akovTezluHSLrHPsSJbX(Fucinn=YwMlp zD~ifDF<11REchl`!#*hrxJuW<4((k@oB9r9fxY9_U6+==S9av3F1?;m@V@2JKtP|h z9W{P-_319XfsU<|GQCfBP{OgLj|Ze*qZv|HyR6mqv5X9 zJNT$H5#R;(<=wY@YR#N;aQRc+`vrO2a4#Cunsw$TY83R9$+059sTvh9>|zA{x4%1 z4|GTEnVPy{L{w%nbt2kv%F|6WPJuM_LGELa9>{+~@p#5e;wMjf?RRIu7n4t?E?#m1`qXSw&6c)ndQK8pnJH51A2*5On;h+v|ZR6ktelG`KGxKuC7b* oba!LIMw&1pum@`D2X-eoU^|#ho@0tZb#pu9E@Ok-?Cv%D1u2CW3IG5A literal 0 HcmV?d00001 diff --git a/cppcryptfs/res/lic/en_openssl.txt b/cppcryptfs/res/lic/en_openssl.txt new file mode 100644 index 0000000000000000000000000000000000000000..8698358e3b84322b45fc013df192606eef9853c5 GIT binary patch literal 11388 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 GnEnP+B5Fhc literal 0 HcmV?d00001 diff --git a/cppcryptfs/res/lic/en_secuty_edit.txt b/cppcryptfs/res/lic/en_secuty_edit.txt new file mode 100644 index 0000000000000000000000000000000000000000..914b704e3777029100ba0d20d1c432a06a906fbd GIT binary patch literal 878 zcmZvb-Acni5QXPj@Ez6*p#@v~xf2ngDtO_I`T{Xcn_!Y^5|zHZ`kmRvXepulH)qc| zvornvO6`>|wZ_)Woh_`jVDF5HEiJQic9pGcZUwP|lQ}1e)jk)@Dba?z8WR{ILXnQM zKzx_N2&|MI!Kdgo%r~ym*>rPf(Aka3Z47qb_WrSiUmj_%P+!AdkWG%GfwSZ+MYYC9 z%u`G!cFcDOZsDG?Esxvm%CbSF1b1(@He*iNDZAFa&31Sgff<85b+t2A*PtpK)%;%A zKj2CJa=7H{4nKiRR=icLkDPVH3xCH!Gk^{D>B!Qn^bA+5qFy=PQUwFI6R*yiwdy-4 zR3MdG0gsRs+JRNVN*t~G&Cto&M_#$_85&lRJHE3zBXUiNJh^gBrmY=#e#*bU8-0Da zj(ke_jl46^J&Srr9j8o%QDtMlsRK)|M|7$;lKQ}&Z2YRr<#|ag<~O|J5oeiAI8VT+ hx?Abk2Cm`~&uVn;8HA literal 0 HcmV?d00001 diff --git a/cppcryptfs/resource.h b/cppcryptfs/resource.h index 1a0a0781d8caf2789c5dd4826242287ed7b1b108..d51a14b95b9cbb3f9bf7a2723bb7d58917661a25 100755 GIT binary patch delta 644 zcmZ{i&q~8U5XPr%kme8?i6(?nLj?^A;-A=hH8w%2wG|sHo=P9YgBQ=nd4k?N3ci3o zf#4f>@gASRZ?`mUL&K7=nfZO+&dlcfsqp$-cvEcF)fF}^T~legJZkbtbKD+XQ%GIv zV|8dq1AN_J-=-d-Db1g&bvHoll6=JP^GQ14kyGW5vf}#i>Vs~B4zQ2#wB$ROIfFke zN`7yi@8YZ|SLZ?HZ%UQjq+>e68Byvfsuo02acqx{a9rp~3q_;iD~p{AI55?}jOz&;)?`0wBAd zpEN4uv1Um@QW1iTrs;|3PV$pQ9kn;*z}XaN93F9xar diff --git a/cppcryptfs/ui/CryptAboutPropertyPage.cpp b/cppcryptfs/ui/CryptAboutPropertyPage.cpp index 28766ea..bec7851 100755 --- a/cppcryptfs/ui/CryptAboutPropertyPage.cpp +++ b/cppcryptfs/ui/CryptAboutPropertyPage.cpp @@ -42,6 +42,41 @@ THE SOFTWARE. #include "../libcommonutil/commonutil.h" #include "locutils.h" +const int LICENSES_COUNT = 8; // Adjust when the number of licenses is changed +static const WCHAR* licenses[LICENSES_COUNT + 1] = { 0 }; +static CStringW storage[LICENSES_COUNT]; + +void LoadLicensesFromResource() { + static bool loaded = false; + if (loaded) return; + + UINT startId = IDR_LICENSE_CPPCRYPTFS; + + for (int i = 0; i < LICENSES_COUNT; i++) { + UINT currentId = startId + i; + licenses[i] = L""; + + HRSRC hRes = FindResource(AfxGetResourceHandle(), MAKEINTRESOURCE(currentId), RT_RCDATA); + if (!hRes) continue; + + HGLOBAL hData = LoadResource(AfxGetResourceHandle(), hRes); + DWORD size = SizeofResource(AfxGetResourceHandle(), hRes); + const void* pData = LockResource(hData); + + if (pData && size > 0) { + int charCount = size / sizeof(WCHAR); + + LPWSTR pBuf = storage[i].GetBufferSetLength(charCount); + memcpy(pBuf, pData, size); + storage[i].ReleaseBuffer(charCount); + + licenses[i] = (const WCHAR*)storage[i]; + } + } + + licenses[LICENSES_COUNT] = NULL; + loaded = true; +} // CCryptAboutPropertyPage dialog @@ -50,7 +85,7 @@ IMPLEMENT_DYNAMIC(CCryptAboutPropertyPage, CCryptPropertyPage) CCryptAboutPropertyPage::CCryptAboutPropertyPage() : CCryptPropertyPage(IDD_ABOUTBOX) { - + LoadLicensesFromResource(); } CCryptAboutPropertyPage::~CCryptAboutPropertyPage() @@ -90,499 +125,6 @@ static const WCHAR* components[] = { NULL }; -static const WCHAR *licenses[] = { - - // cppcryptfs - L"cppcryptfs - Copyright (C) 2016-2025 Bailey Brown. All rights reserved.\r\n\r\n" - L"project url: github.com/bailey27/cppcryptfs\r\n\r\n" - L"cppcryptfs is a user-mode cryptographic virtual overlay filesystem\r\n\r\n" - L"cppcryptfs is based on the design of gocryptfs (github.com/rfjakob/gocryptfs)\r\n\r\n" - L"cppcryptfs links with and incorporates source code from several open source projects.\r\n\r\n" - L"All incorporated sources use the MIT license or other permissive open source licenses.\r\n\r\n" - L"All statically linked libraries use a permissive open source license.\r\n" - L"\r\n" - L"Some libraries which are linked with dynamically use the GNU LGPL.\r\n" - L"\r\n" - L"cppcryptfs itself uses an MIT license which is as follows:\r\n" - L"\r\n" - L"The MIT License (MIT)\r\n" - L"\r\n" - L"Permission is hereby granted, free of charge, to any person obtaining a copy\r\n" - L"of this software and associated documentation files (the \"Software\"), to deal\r\n" - L"in the Software without restriction, including without limitation the rights\r\n" - L"to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n" - L"copies of the Software, and to permit persons to whom the Software is\r\n" - L"furnished to do so, subject to the following conditions:\r\n" - L"\r\n" - L"The above copyright notice and this permission notice shall be included in\r\n" - L"all copies or substantial portions of the Software.\r\n" - L"\r\n" - L"THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n" - L"IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n" - L"FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n" - L"AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n" - L"LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n" - L"OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n" - L"THE SOFTWARE.\r\n" - L"\r\n", - - // openssl - - L"poject url: github.com/openssl/openssl\r\n\r\n" - L"cppcryptfs usage: statically linked library\r\n\r\n" - L"OpenSSL copyright and license:\r\n\r\n" - LR"(LICENSE ISSUES - ============== - - The OpenSSL toolkit stays under a double license, i.e.both the conditions of - the OpenSSL License and the original SSLeay license apply to the toolkit. - See below for the actual license texts. - - OpenSSL License - -------------- - - - /* ==================================================================== - * Copyright (c) 1998-2019 The OpenSSL Project. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. All advertising materials mentioning features or use of this - * software must display the following acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit. (http://www.openssl.org/) " - * - * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to - * endorse or promote products derived from this software without - * prior written permission. For written permission, please contact - * openssl-core@openssl.org. - * - * 5. Products derived from this software may not be called "OpenSSL" - * nor may "OpenSSL" appear in their names without prior written - * permission of the OpenSSL Project. - * - * 6. Redistributions of any form whatsoever must retain the following - * acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit (http://www.openssl.org/) " - * - * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY - * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * ==================================================================== - * - * This product includes cryptographic software written by Eric Young - * (eay@cryptsoft.com). This product includes software written by Tim - * Hudson (tjh@cryptsoft.com). - * - */ - - Original SSLeay License - ---------------------- - - - /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) - * All rights reserved. - * - * This package is an SSL implementation written - * by Eric Young (eay@cryptsoft.com). - * The implementation was written so as to conform with Netscapes SSL. - * - * This library is free for commercial and non-commercial use as long as - * the following conditions are aheared to. The following conditions - * apply to all code found in this distribution, be it the RC4, RSA, - * lhash, DES, etc., code; not just the SSL code. The SSL documentation - * included with this distribution is covered by the same copyright terms - * except that the holder is Tim Hudson (tjh@cryptsoft.com). - * - * Copyright remains Eric Young's, and as such any Copyright notices in - * the code are not to be removed. - * If this package is used in a product, Eric Young should be given attribution - * as the author of the parts of the library used. - * This can be in the form of a textual message at program startup or - * in documentation (online or textual) provided with the package. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * "This product includes cryptographic software written by - * Eric Young (eay@cryptsoft.com) " - * The word 'cryptographic' can be left out if the rouines from the library - * being used are not cryptographic related :-). - * 4. If you include any Windows specific code (or a derivative thereof) from - * the apps directory (application code) you must include an acknowledgement: - * "This product includes software written by Tim Hudson (tjh@cryptsoft.com) " - * - * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * The licence and distribution terms for any publically available version or - * derivative of this code cannot be changed. i.e. this code cannot simply be - * copied and put under another distribution licence - * [including the GNU Public Licence.] - */)", - - // rapidjson - L"project url: github.com/miloyip/rapidjson\r\n\r\n" - L"cppcryptfs usage: included header files\r\n\r\n" - L"RapidJSON copyright and license:\r\n\r\n" - L"Tencent is pleased to support the open source community by making RapidJSON available. \r\n" - L" \r\n" - L"Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.\r\n" - L"\r\n" - L"If you have downloaded a copy of the RapidJSON binary from Tencent, please note that the RapidJSON binary is licensed under the MIT License.\r\n" - L"If you have downloaded a copy of the RapidJSON source code from Tencent, please note that RapidJSON source code is licensed under the MIT License, except for the third-party components listed below which are subject to different license terms. Your integration of RapidJSON into your own projects may require compliance with the MIT License, as well as the other licenses applicable to the third-party components included within RapidJSON. To avoid the problematic JSON license in your own projects, it's sufficient to exclude the bin/jsonchecker/ directory, as it's the only code under the JSON license.\r\n" - L"A copy of the MIT License is included in this file.\r\n" - L"\r\n" - L"Other dependencies and licenses:\r\n" - L"\r\n" - L"Open Source Software Licensed Under the BSD License:\r\n" - L"--------------------------------------------------------------------\r\n" - L"\r\n" - L"The msinttypes r29 \r\n" - L"Copyright (c) 2006-2013 Alexander Chemeris \r\n" - L"All rights reserved.\r\n" - L"\r\n" - L"Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\r\n" - L"\r\n" - L"* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. \r\n" - L"* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\r\n" - L"* Neither the name of copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.\r\n" - L"\r\n" - L"THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n" - L"\r\n" - L"Open Source Software Licensed Under the JSON License:\r\n" - L"--------------------------------------------------------------------\r\n" - L"\r\n" - L"json.org \r\n" - L"Copyright (c) 2002 JSON.org\r\n" - L"All Rights Reserved.\r\n" - L"\r\n" - L"JSON_checker\r\n" - L"Copyright (c) 2002 JSON.org\r\n" - L"All Rights Reserved.\r\n" - L"\r\n" - L"\r\n" - L"Terms of the JSON License:\r\n" - L"---------------------------------------------------\r\n" - L"\r\n" - L"Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\r\n" - L"\r\n" - L"The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\r\n" - L"\r\n" - L"The Software shall be used for Good, not Evil.\r\n" - L"\r\n" - L"THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n" - L"\r\n" - L"\r\n" - L"Terms of the MIT License:\r\n" - L"--------------------------------------------------------------------\r\n" - L"\r\n" - L"Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\r\n" - L"\r\n" - L"The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\r\n" - L"\r\n" - L"THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n", - - // Dokany (mirror) - - L"project url: github.com/dokan-dev/dokany\r\n\r\n" - L"cppcryptfs usage: code from the mirror.c sample program from Dokany was used in modifed form in cppcryptfs (in cryptdokan.cpp).\r\n\r\n" - L"Dokany mirror.c copyright and license (MIT license):\r\n\r\n" - L"Copyright (C) 2020 - 2021 Google, Inc.\r\n" - L"Copyright (C) 2015 - 2019 Adrien J. and Maxime C. \r\n" - L"Copyright (C) 2007 - 2011 Hiroki Asakawa \r\n" - L"\r\n" - L"Permission is hereby granted, free of charge, to any person obtaining a copy\r\n" - L"of this software and associated documentation files (the \"Software\"), to deal\r\n" - L"in the Software without restriction, including without limitation the rights\r\n" - L"to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n" - L"copies of the Software, and to permit persons to whom the Software is\r\n" - L"furnished to do so, subject to the following conditions:\r\n" - L"\r\n" - L"The above copyright notice and this permission notice shall be included in\r\n" - L"all copies or substantial portions of the Software.\r\n" - L"\r\n" - L"THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n" - L"IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n" - L"FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n" - L"AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n" - L"LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n" - L"OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n" - L"THE SOFTWARE.\r\n", - - // dokany (library) - - L"project url: github.com/dokan-dev/dokany\r\n\r\n" - L"cppcryptfs usage: dynamically linked library\r\n\r\n" - L"Dokany library copyright and license (GNU LGPL):\r\n\r\n" - L"Copyright (C) 2020 - 2021 Google, Inc.\r\n" - L"Copyright (C) 2015 - 2019 Adrien J. and Maxime C. \r\n" - L"Copyright (C) 2007 - 2011 Hiroki Asakawa \r\n\r\n" - L" GNU LESSER GENERAL PUBLIC LICENSE\r\n" - L" Version 3, 29 June 2007\r\n" - L"\r\n" - L" Copyright (C) 2007 Free Software Foundation, Inc. \r\n" - L" Everyone is permitted to copy and distribute verbatim copies\r\n" - L" of this license document, but changing it is not allowed.\r\n" - L"\r\n" - L"\r\n" - L" This version of the GNU Lesser General Public License incorporates\r\n" - L"the terms and conditions of version 3 of the GNU General Public\r\n" - L"License, supplemented by the additional permissions listed below.\r\n" - L"\r\n" - L" 0. Additional Definitions. \r\n" - L"\r\n" - L" As used herein, \"this License\" refers to version 3 of the GNU Lesser\r\n" - L"General Public License, and the \"GNU GPL\" refers to version 3 of the GNU\r\n" - L"General Public License.\r\n" - L"\r\n" - L" \"The Library\" refers to a covered work governed by this License,\r\n" - L"other than an Application or a Combined Work as defined below.\r\n" - L"\r\n" - L" An \"Application\" is any work that makes use of an interface provided\r\n" - L"by the Library, but which is not otherwise based on the Library.\r\n" - L"Defining a subclass of a class defined by the Library is deemed a mode\r\n" - L"of using an interface provided by the Library.\r\n" - L"\r\n" - L" A \"Combined Work\" is a work produced by combining or linking an\r\n" - L"Application with the Library. The particular version of the Library\r\n" - L"with which the Combined Work was made is also called the \"Linked\r\n" - L"Version\".\r\n" - L"\r\n" - L" The \"Minimal Corresponding Source\" for a Combined Work means the\r\n" - L"Corresponding Source for the Combined Work, excluding any source code\r\n" - L"for portions of the Combined Work that, considered in isolation, are\r\n" - L"based on the Application, and not on the Linked Version.\r\n" - L"\r\n" - L" The \"Corresponding Application Code\" for a Combined Work means the\r\n" - L"object code and/or source code for the Application, including any data\r\n" - L"and utility programs needed for reproducing the Combined Work from the\r\n" - L"Application, but excluding the System Libraries of the Combined Work.\r\n" - L"\r\n" - L" 1. Exception to Section 3 of the GNU GPL.\r\n" - L"\r\n" - L" You may convey a covered work under sections 3 and 4 of this License\r\n" - L"without being bound by section 3 of the GNU GPL.\r\n" - L"\r\n" - L" 2. Conveying Modified Versions.\r\n" - L"\r\n" - L" If you modify a copy of the Library, and, in your modifications, a\r\n" - L"facility refers to a function or data to be supplied by an Application\r\n" - L"that uses the facility (other than as an argument passed when the\r\n" - L"facility is invoked), then you may convey a copy of the modified\r\n" - L"version:\r\n" - L"\r\n" - L" a) under this License, provided that you make a good faith effort to\r\n" - L" ensure that, in the event an Application does not supply the\r\n" - L" function or data, the facility still operates, and performs\r\n" - L" whatever part of its purpose remains meaningful, or\r\n" - L"\r\n" - L" b) under the GNU GPL, with none of the additional permissions of\r\n" - L" this License applicable to that copy.\r\n" - L"\r\n" - L" 3. Object Code Incorporating Material from Library Header Files.\r\n" - L"\r\n" - L" The object code form of an Application may incorporate material from\r\n" - L"a header file that is part of the Library. You may convey such object\r\n" - L"code under terms of your choice, provided that, if the incorporated\r\n" - L"material is not limited to numerical parameters, data structure\r\n" - L"layouts and accessors, or small macros, inline functions and templates\r\n" - L"(ten or fewer lines in length), you do both of the following:\r\n" - L"\r\n" - L" a) Give prominent notice with each copy of the object code that the\r\n" - L" Library is used in it and that the Library and its use are\r\n" - L" covered by this License.\r\n" - L"\r\n" - L" b) Accompany the object code with a copy of the GNU GPL and this license\r\n" - L" document.\r\n" - L"\r\n" - L" 4. Combined Works.\r\n" - L"\r\n" - L" You may convey a Combined Work under terms of your choice that,\r\n" - L"taken together, effectively do not restrict modification of the\r\n" - L"portions of the Library contained in the Combined Work and reverse\r\n" - L"engineering for debugging such modifications, if you also do each of\r\n" - L"the following:\r\n" - L"\r\n" - L" a) Give prominent notice with each copy of the Combined Work that\r\n" - L" the Library is used in it and that the Library and its use are\r\n" - L" covered by this License.\r\n" - L"\r\n" - L" b) Accompany the Combined Work with a copy of the GNU GPL and this license\r\n" - L" document.\r\n" - L"\r\n" - L" c) For a Combined Work that displays copyright notices during\r\n" - L" execution, include the copyright notice for the Library among\r\n" - L" these notices, as well as a reference directing the user to the\r\n" - L" copies of the GNU GPL and this license document.\r\n" - L"\r\n" - L" d) Do one of the following:\r\n" - L"\r\n" - L" 0) Convey the Minimal Corresponding Source under the terms of this\r\n" - L" License, and the Corresponding Application Code in a form\r\n" - L" suitable for, and under terms that permit, the user to\r\n" - L" recombine or relink the Application with a modified version of\r\n" - L" the Linked Version to produce a modified Combined Work, in the\r\n" - L" manner specified by section 6 of the GNU GPL for conveying\r\n" - L" Corresponding Source.\r\n" - L"\r\n" - L" 1) Use a suitable shared library mechanism for linking with the\r\n" - L" Library. A suitable mechanism is one that (a) uses at run time\r\n" - L" a copy of the Library already present on the user's computer\r\n" - L" system, and (b) will operate properly with a modified version\r\n" - L" of the Library that is interface-compatible with the Linked\r\n" - L" Version. \r\n" - L"\r\n" - L" e) Provide Installation Information, but only if you would otherwise\r\n" - L" be required to provide such information under section 6 of the\r\n" - L" GNU GPL, and only to the extent that such information is\r\n" - L" necessary to install and execute a modified version of the\r\n" - L" Combined Work produced by recombining or relinking the\r\n" - L" Application with a modified version of the Linked Version. (If\r\n" - L" you use option 4d0, the Installation Information must accompany\r\n" - L" the Minimal Corresponding Source and Corresponding Application\r\n" - L" Code. If you use option 4d1, you must provide the Installation\r\n" - L" Information in the manner specified by section 6 of the GNU GPL\r\n" - L" for conveying Corresponding Source.)\r\n" - L"\r\n" - L" 5. Combined Libraries.\r\n" - L"\r\n" - L" You may place library facilities that are a work based on the\r\n" - L"Library side by side in a single library together with other library\r\n" - L"facilities that are not Applications and are not covered by this\r\n" - L"License, and convey such a combined library under terms of your\r\n" - L"choice, if you do both of the following:\r\n" - L"\r\n" - L" a) Accompany the combined library with a copy of the same work based\r\n" - L" on the Library, uncombined with any other library facilities,\r\n" - L" conveyed under the terms of this License.\r\n" - L"\r\n" - L" b) Give prominent notice with the combined library that part of it\r\n" - L" is a work based on the Library, and explaining where to find the\r\n" - L" accompanying uncombined form of the same work.\r\n" - L"\r\n" - L" 6. Revised Versions of the GNU Lesser General Public License.\r\n" - L"\r\n" - L" The Free Software Foundation may publish revised and/or new versions\r\n" - L"of the GNU Lesser General Public License from time to time. Such new\r\n" - L"versions will be similar in spirit to the present version, but may\r\n" - L"differ in detail to address new problems or concerns.\r\n" - L"\r\n" - L" Each version is given a distinguishing version number. If the\r\n" - L"Library as you received it specifies that a certain numbered version\r\n" - L"of the GNU Lesser General Public License \"or any later version\"\r\n" - L"applies to it, you have the option of following the terms and\r\n" - L"conditions either of that published version or of any later version\r\n" - L"published by the Free Software Foundation. If the Library as you\r\n" - L"received it does not specify a version number of the GNU Lesser\r\n" - L"General Public License, you may choose any version of the GNU Lesser\r\n" - L"General Public License ever published by the Free Software Foundation.\r\n" - L"\r\n" - L" If the Library as you received it specifies that a proxy can decide\r\n" - L"whether future versions of the GNU Lesser General Public License shall\r\n" - L"apply, that proxy's public statement of acceptance of any version is\r\n" - L"permanent authorization for you to choose that version for the\r\n" - L"Library.\r\n", - - // Secure Edit - L"cppcryptfs usage: modified and incorporated into cppcryptfs (as SecureEdit.cpp and SecureEdit.h).\r\n\r\n" - L"Secure Edit copyright and license:\r\n\r\n" - L"100% free Secure Edit control MFC class\r\n" - L"Copyright (c) 2003 Dominik Reichl\r\n" - L"If you use this class I would be more than happy if you mention\r\n" - L"my name somewhere in your application. Thanks!\r\n" - L"Do you have any questions or want to tell me that you are using\r\n" - L"my class, e-mail me: .\r\n", - - // getopt - - L"project url: github.com/kimgr/getopt_port\r\n\r\n" - L"cppcryptfs usage: getopt.c and getopt.h from this project were modified and incorporated into cppcryptfs.\r\n\r\n" - L"getopt_port copyright and license:\r\n\r\n" - L"Copyright (c) 2012-2017, Kim Grasman \r\n" - L"All rights reserved.\r\n" - L"\r\n" - L"Redistribution and use in source and binary forms, with or without\r\n" - L"modification, are permitted provided that the following conditions are met:\r\n" - L" * Redistributions of source code must retain the above copyright\r\n" - L" notice, this list of conditions and the following disclaimer.\r\n" - L" * Redistributions in binary form must reproduce the above copyright\r\n" - L" notice, this list of conditions and the following disclaimer in the\r\n" - L" documentation and/or other materials provided with the distribution.\r\n" - L" * Neither the name of Kim Grasman nor the\r\n" - L" names of contributors may be used to endorse or promote products\r\n" - L" derived from this software without specific prior written permission.\r\n" - L"\r\n" - L"THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n" - L"ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n" - L"WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n" - L"DISCLAIMED. IN NO EVENT SHALL KIM GRASMAN BE LIABLE FOR ANY\r\n" - L"DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n" - L"(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\n" - L"LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\n" - L"ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n" - L"(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\n" - L"SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n", - - // aes-siv - - L"project url: github.com/arktronic/aes-siv\r\n\r\n" - L"cppcryptfs usage: code from this project was modified and incorporated into cppcryptfs (in the cppcryptfs/aes-siv directory). " - L"The low-level, third-party AES implementation included with aes-siv was replaced with a new implementation that uses OpenSSL.\r\n\r\n" - L"aes-siv copyright and license:\r\n\r\n" - L"This project is licensed under the OSI-approved ISC License:\r\n" - L"\r\n" - L"Copyright (c) 2015 ARKconcepts / Sasha Kotlyar\r\n" - L"\r\n" - L"Permission to use, copy, modify, and/or distribute this software for any\r\n" - L"purpose with or without fee is hereby granted, provided that the above\r\n" - L"copyright notice and this permission notice appear in all copies.\r\n" - L"\r\n" - L"THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\n" - L"REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND\r\n" - L"FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\n" - L"INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\n" - L"LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\n" - L"OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\n" - L"PERFORMANCE OF THIS SOFTWARE.\r\n", - - NULL -}; - static CString lf_to_crlf(const wchar_t* txt) { CString fixed; @@ -616,7 +158,7 @@ BOOL CCryptAboutPropertyPage::OnInitDialog() wstring prod = L"cppryptfs"; wstring ver = L"1.0"; - wstring copyright = L"Copyright (C) 2016-2025 Bailey Brown. All Rights Reserved."; + wstring copyright = LocUtils::GetStringFromResources(IDS_COPYRIGHT); GetProductVersionInfo(prod, ver, copyright); @@ -647,25 +189,27 @@ BOOL CCryptAboutPropertyPage::OnInitDialog() std::wstring dok_ver; CString dokany_version; if (get_dokany_version(dok_ver, dv)) { - dokany_version = CString(L"; using Dokany ") + dok_ver.c_str(); + dokany_version.Format(LocUtils::GetStringFromResources(IDS_DOKANY_VERSION), dok_ver.c_str()); } wstring aes_ni; if (AES::use_aes_ni()) { - aes_ni = L"; AES-NI detected"; + aes_ni = LocUtils::GetStringFromResources(IDS_AESNI_DETECTED); } else { - aes_ni = L"; AES-NI not detected"; + aes_ni = LocUtils::GetStringFromResources(IDS_AESNI_NOT_DETECTED); } - SetDlgItemText(IDC_LINKAGES, L"linked with " + openssl_ver + dokany_version); + CString strMsgOpenSSLVersion; + strMsgOpenSSLVersion.Format(LocUtils::GetStringFromResources(IDS_OPENSSL_VERSION), openssl_ver); + SetDlgItemText(IDC_LINKAGES, strMsgOpenSSLVersion + dokany_version); bool is_admin = theApp.IsRunningAsAdministrator(); CString prod_ver = prod.c_str(); prod_ver += L" "; prod_ver += ver.c_str(); - prod_ver += sizeof(void*) == 8 ? L" 64-bit" : L" 32-bit"; - prod_ver += (is_admin ? L" (admin)" : L""); + prod_ver += sizeof(void*) == 8 ? LocUtils::GetStringFromResources(IDS_64BIT) : LocUtils::GetStringFromResources(IDS_32BIT); + prod_ver += (is_admin ? LocUtils::GetStringFromResources(IDS_ADMIN) : L""); SetDlgItemText(IDC_PROD_VERSION, prod_ver + CString(aes_ni.c_str())); SetDlgItemText(IDC_COPYRIGHT, copyright.c_str()); From aa29978f2d913001193e7a69ddb071d3140979ed Mon Sep 17 00:00:00 2001 From: nbb1967 Date: Sat, 31 Jan 2026 12:35:34 +0300 Subject: [PATCH 07/35] SettingsPropertyPage --- cppcryptfs/cppcryptfs.rc | Bin 50428 -> 53426 bytes cppcryptfs/res/lic/en_openssl.txt | Bin 11388 -> 11384 bytes cppcryptfs/resource.h | Bin 18472 -> 19982 bytes cppcryptfs/ui/CryptAboutPropertyPage.cpp | 16 +++++----- cppcryptfs/ui/SettingsPropertyPage.cpp | 39 ++++++++++++++++------- 5 files changed, 36 insertions(+), 19 deletions(-) diff --git a/cppcryptfs/cppcryptfs.rc b/cppcryptfs/cppcryptfs.rc index 7a7dff4082bc21b0ef590b43756c0d32e7e2cb54..75eb24c5c9d432a3f8bd1e8eb795b4653cfa524c 100644 GIT binary patch delta 1326 zcma)6(MwZd6hCX4*Nkdzvxbaq*Q^)uZq|yPV$)#7($Hl=#h7kO(QVCb#a;$UL_$#O z)W9AV8wfoVMMJCzqI`?!fAAj&eT^Raeb=krIl^(d-}&zM{l4Eh=XcI`|1KCmRE+Pl z9jyu}Bp1_We$?^Ch!6gHz{bDYB!0NsS&JY1@s_VYKhhea5CwT<(aYW#L0Av3eNqm~uZHzDV$BT^keky_ z6qASCO`*LSx*6_M8aHec+^1=i8@37b8I2pZ3G_J)4cmy`*7`DCq+wJ=uXTc^DM>lX zQmjtvEv#PaUD$1{x3JJyr}f@wz1Dl7>$UzLIzS_Il}6RhL)F_w-%X+Ca{O)C#_LZd zN0_cbg&>|Vv=~7Lhslp_6+P>taeh^@vAfvC56Ye06X;mcw-LIFSrqeWier>XW|#k@ zT~=2z7_(4t4mxh4(Bst48!vmUgK9j(suz_Xo`yJ5vGe0fSG%|kIbgG#sP^#wlEpEE z{UF|u8j(+nQ-9L+>{g2@Mze5*lEHNZ^H~tM4CjT*qxBT}quu;-=~$a~mS?KH!X=OT zj~l}j;CHWWJu;*b3Fg(ncG7Z+Ym0R)aidIq!XwX@EqrrHvhTzbr9R*$)P{1Zg52Y^ z7iL3-@0YF0ZbAEjbt2gm#wfDUXO*P9@L>{sLZnF)Qv5(>_(t`tL6z5BpKAcokMYK` zL*(hzvrVCJ8R(Tlk@Db+!=@;K*&H};YrEKEpJe4L3oU%B delta 64 zcmdnAkoiw1^M(@c$p^SZCiif!0n!qa&#`lCj^VkpcCrTt-{c2YESo%LokB^gC~$wXHcK4&!@P#OqGcp0JKvGc>n+a diff --git a/cppcryptfs/resource.h b/cppcryptfs/resource.h index d51a14b95b9cbb3f9bf7a2723bb7d58917661a25..0c37078cb55239152c5cb0fb4a433b383d7f43a5 100755 GIT binary patch delta 888 zcmZ{i!AiqG5QZn3swt@rR6z)73@RQ(>9$euq_Gt$#8zxnJO$sReE|{X>ZLc2idPTf z8~6x5fMB0MXO|{scaFz3ZqrI`cpW89#tqOMm_WN^DHt-?vNpyk#o&B zHM6JSZ&x)lhQ$eFYD#K&UGRJm3lYjJKsx_wIKdP;wr9uB>w=ek?o F{sH7@jQ0Ql delta 14 VcmeC1!? 0) { - int result = MessageBox(L"Delete all saved passwords?", L"cppcryptfs", MB_ICONWARNING | MB_YESNO); + int result = MessageBox(LocUtils::GetStringFromResources(IDS_DELETE_ALL_SAVED_PASS), L"cppcryptfs", MB_ICONWARNING | MB_YESNO); if (result == IDYES) { if (SavedPasswords::ClearSavedPasswords(TRUE) != numSavedPasswords) { - MessageBox(L"unable to delete saved passwords", L"cppcryptfs", MB_ICONEXCLAMATION | MB_OK); + MessageBox(LocUtils::GetStringFromResources(IDS_UNABLE_DELETE_SAVED_PASS), L"cppcryptfs", MB_ICONEXCLAMATION | MB_OK); } } } @@ -329,8 +347,7 @@ void CSettingsPropertyPage::OnClickedNeverSaveHistory() CryptSettings::getInstance().GetSettingCurrent(ENABLE_SAVING_PASSWORDS, enablesavingpasswords); if (enablesavingpasswords) { - MessageBox(L"If you turn on \"Never save history\", saved passwords will not be deleted, but new passwords will not " - L"be saved. To delete any saved passwords, uncheck \"Enable saved passwords\".", + MessageBox(LocUtils::GetStringFromResources(IDS_NEVER_SAVE_HISTORY_HINT), L"cppcryptfs", MB_OK | MB_ICONINFORMATION); } @@ -354,7 +371,7 @@ void CSettingsPropertyPage::OnClickedNeverSaveHistory() DeleteAllRegisteryValues(CPPCRYPTFS_REG_PATH L"CreateOptions", mes); error += mes; if (!error.empty()) { - MessageBox(L"unable to delete history from registry", L"cppcryptfs", + MessageBox(LocUtils::GetStringFromResources(IDS_UNABLE_DELETE_HISTORY), L"cppcryptfs", MB_OK | MB_ICONEXCLAMATION); } } From 359ccf94379a68ba8e4af1acbd4e9b1c12faa69e Mon Sep 17 00:00:00 2001 From: nbb1967 Date: Sat, 31 Jan 2026 12:55:13 +0300 Subject: [PATCH 08/35] rename en_secure.txt --- cppcryptfs/cppcryptfs.rc | Bin 53426 -> 53426 bytes cppcryptfs/cppcryptfs.vcxproj | 2 +- ...{en_secuty_edit.txt => en_secure_edit.txt} | Bin 3 files changed, 1 insertion(+), 1 deletion(-) rename cppcryptfs/res/lic/{en_secuty_edit.txt => en_secure_edit.txt} (100%) diff --git a/cppcryptfs/cppcryptfs.rc b/cppcryptfs/cppcryptfs.rc index 75eb24c5c9d432a3f8bd1e8eb795b4653cfa524c..9c0e8937bd85f5f1065f7f410e767156dd2eb8de 100644 GIT binary patch delta 32 ncmdnAka^QW<_(Wd@D?$oGQhXi>YK$*&S3`t&%X=? delta 32 ocmdnAka^QW<_(Wd@Rl%CGQ=~aGNdqMGL%eCJf^-`?BpDF0MUC48~^|S diff --git a/cppcryptfs/cppcryptfs.vcxproj b/cppcryptfs/cppcryptfs.vcxproj index 28d5eab..bbcd4b9 100755 --- a/cppcryptfs/cppcryptfs.vcxproj +++ b/cppcryptfs/cppcryptfs.vcxproj @@ -326,7 +326,7 @@ - + diff --git a/cppcryptfs/res/lic/en_secuty_edit.txt b/cppcryptfs/res/lic/en_secure_edit.txt similarity index 100% rename from cppcryptfs/res/lic/en_secuty_edit.txt rename to cppcryptfs/res/lic/en_secure_edit.txt From 70bd032e3ff22db8ffebb42ede35160070f3bf50 Mon Sep 17 00:00:00 2001 From: nbb1967 Date: Thu, 5 Feb 2026 10:56:08 +0300 Subject: [PATCH 09/35] cryptdokan. GetStringFromResources() ALT edition --- cppcryptfs/cppcryptfs.rc | Bin 53426 -> 60260 bytes cppcryptfs/cppcryptfs.vcxproj | 5 ++ cppcryptfs/dokan/cryptdokan.cpp | 144 ++++++++++++++++++++++---------- cppcryptfs/resource.h | Bin 19982 -> 23398 bytes cppcryptfs/ui/locutils.cpp | 2 +- cppcryptfs/ui/locutilsalt.cpp | 11 +++ cppcryptfs/ui/locutilsalt.h | 9 ++ cppcryptfs/ui/uiutil.cpp | 9 +- 8 files changed, 130 insertions(+), 50 deletions(-) create mode 100644 cppcryptfs/ui/locutilsalt.cpp create mode 100644 cppcryptfs/ui/locutilsalt.h diff --git a/cppcryptfs/cppcryptfs.rc b/cppcryptfs/cppcryptfs.rc index 9c0e8937bd85f5f1065f7f410e767156dd2eb8de..86718da2a13231b31c22e8fe2f38a7b36d9644c2 100644 GIT binary patch delta 3576 zcmb_fTTfJ17~NJFhKmfhfsW%iGm^g!zL!}i?uIJ`ld-A`p~rU18Ta~-gB7YV$-C}$+>Xm?C-L^ z^{xGJXJ+%SKX1M@lqpLY1@dv`4cuRrM``wjcd{Urs=1XMhdX_hgIM2abFCy-MzeEQ8$fZXv&bejVWOiyLRy9gytW@?l7RtMmS-H%Z zF`h)WQ9KRH!I)P*oGaw_PW?U5tx|QW0hk}db3_h*lP{NMGURznHf?O`kcIKmeayB` zd#AlY9SL)f;;j!+H>+x(=R=%P#CaAmcFNOlUFlW$r5PR?#Wfj}YvXzH`)r1z7dD1) zbRwoQby`{{i{$d;Ho2UhCr_pdb8A&SP^d&a6?lrMYFTy^OU`!%&R*DW({Y^CzE2^N zE*VMBmuI6nxrQ%X(}<%=RmjNwpzM8+mv0!tH3JqRdR5MRj=xHKBI@*80nd!M71v7r z9FowyKiH|g5=UY|)1$h)O z6{>?()8!3#GFa6iW@gd_ZqB4R!5Djf9V&iA^S2cYP9QN|ksW(GOZGSCZCObcp>@Qm zW_Kqqq+Hb@VGo^> zi^|u)u4zieuh#@)LEb?0O&TS$hm4%amp@{8TZjfrZPBL4N&WPxc8x#t(>si8n)l`# z`WwAI3R{iPtG3xd@eY(*Yek$G$r-cT2hb3|jQPFs?!!v95eZp^le%(@yAy2rgB#mo zgq=8v!m#Q$_S~!Ot+n-{xYpX)m6}ArF`rDe*c@a^68oh5YrmrzXx1Zc?jX8pt4d_D z#a?86%dEL`ur{1JfSAWZEQA$Y71nzX_x|HxQroP%bmM%v>#*|NMfl9Q0Qyf9*Gv%0 zF1OsdzBL%ex5*R43$%7sCQa&1MAfKw(1urRGToB0E}KEsjW`ClPp$FXHX9UZDBdP{ zW`r^~n*~fE1QPnZOm2;*a3V;HGg+cv1&UY1N8`zr4+d|W|QpLZq8GziyVq=*K<(LM4{Zhoh>&Ow_&H+?(RT7?`eF8 zVZ-o~(+<#0NKFP5lMA|)Po8EJmHU7&)BN|zl|Kv? z#b>5?Pu8d!REV8<`_u9umEMHJe(b`*H(hIil)qxT{OstJ)v(4+H+^0Mdr*Dou~(j# z*&GQwOekvY8_s&fPyJcDO3y~AQ53UN4v%}+C}3h$(hR(BBQ4byG>jYXBjvMh7iMVq zw|KkqKZa@*|IH$HD(61w-)Spb=^Y?$sh73SBx}f9=u4=UgzQdv@@mS$vxisg^3iaC TOg*}w?-yROFTD2SxlMlqDe^xe delta 65 zcmaEIjd{~T<_#s>tojW43`!FVg(r7#uVDsqChzBxoP3U*V{-^k)6UH^9<1O1i(Y&w QJ2~cM8Hm04;>*d500J`@nE(I) diff --git a/cppcryptfs/cppcryptfs.vcxproj b/cppcryptfs/cppcryptfs.vcxproj index bbcd4b9..bbca838 100755 --- a/cppcryptfs/cppcryptfs.vcxproj +++ b/cppcryptfs/cppcryptfs.vcxproj @@ -228,6 +228,7 @@ + @@ -262,6 +263,10 @@ + + false + NotUsing + diff --git a/cppcryptfs/dokan/cryptdokan.cpp b/cppcryptfs/dokan/cryptdokan.cpp index 6f1a30e..82be6b8 100755 --- a/cppcryptfs/dokan/cryptdokan.cpp +++ b/cppcryptfs/dokan/cryptdokan.cpp @@ -98,6 +98,8 @@ THE SOFTWARE. #include "MountPointManager.h" #include "../libcommonutil/commonutil.h" +#include "resource.h" +#include "ui/locutilsalt.h" static DWORD g_SessionId; static BOOL g_GotSessionId = FALSE; @@ -2022,7 +2024,8 @@ int mount_crypt_fs(const WCHAR* mountpoint, const WCHAR *path, config_path = NULL; if (mountpoint == NULL) { - mes = L"invalid mountpoint"; + CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_INVALID_MPOINT); + mes = strMsg; return -1; } @@ -2030,9 +2033,11 @@ int mount_crypt_fs(const WCHAR* mountpoint, const WCHAR *path, if (mount_point_is_a_dir && !is_suitable_mountpoint(mountpoint)) { if (!PathFileExists(mountpoint)) { - mes = L"the mount point directory does not exist"; + CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_MPOINT_DIR_NOT_EXIST); + mes = strMsg; } else { - mes = L"mount point directory must be empty and reside on NTFS volume"; + CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_MPOINT_DIR_EMPTY_NTFS); + mes = strMsg; } return -1; } @@ -2041,7 +2046,8 @@ int mount_crypt_fs(const WCHAR* mountpoint, const WCHAR *path, bool already_mounted = MountPointManager::getInstance().find(mountpoint, dummy); if (already_mounted) { - mes = L"drive letter/mount point already in use\n"; + CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_LETTER_MPOINT_ALREADY_USE); + mes = strMsg; return -1; } @@ -2059,7 +2065,8 @@ int mount_crypt_fs(const WCHAR* mountpoint, const WCHAR *path, } if (!tdata) { - mes = L"Failed to allocate tdata\n"; + CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_FAILED_ALLOCATE_TDATA); + mes = strMsg; throw(-1); } @@ -2155,8 +2162,10 @@ int mount_crypt_fs(const WCHAR* mountpoint, const WCHAR *path, dokanOptions->MountPoint = tdata->mountpoint.c_str(); if (!config->read(mes, config_path, reverse)) { - if (mes.length() < 1) - mes = L"unable to load config\n"; + if (mes.length() < 1) { + CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_UNABLE_LOAD_CONF); + mes = strMsg; + } throw(-1); } @@ -2183,7 +2192,8 @@ int mount_crypt_fs(const WCHAR* mountpoint, const WCHAR *path, #endif if (!config->decrypt_key(password)) { - mes = L"password incorrect\n"; + CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_PASS_INCORRECT); + mes = strMsg; throw(-1); } @@ -2193,7 +2203,8 @@ int mount_crypt_fs(const WCHAR* mountpoint, const WCHAR *path, throw(-1); } } catch (...) { - mes = L"unable to initialize eme context"; + CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_UNABLE_INIT_EME); + mes = strMsg; throw(-1); } } @@ -2202,7 +2213,8 @@ int mount_crypt_fs(const WCHAR* mountpoint, const WCHAR *path, try { con->m_siv.SetKey(config->GetMasterKey(), 32, config->m_HKDF, config); } catch (...) { - mes = L"unable to intialize AESSIV context"; + CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_UNABLE_INIT_AESSIV); + mes = strMsg; throw(-1); } } @@ -2284,7 +2296,8 @@ int mount_crypt_fs(const WCHAR* mountpoint, const WCHAR *path, && !con->GetConfig()->m_reverse; if (!con->FinalInitBeforeMounting(opts.cachekeysinmemory)) { - mes = L"context final init failed"; + CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_FINAL_INIT_FAILED); + mes = strMsg; throw(-1); } @@ -2294,7 +2307,8 @@ int mount_crypt_fs(const WCHAR* mountpoint, const WCHAR *path, hThread = CreateThread(NULL, 0, CryptThreadProc, tdata, 0, NULL); if (!hThread) { - mes = L"unable to create thread for drive letter/mount point\n"; + CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_UNABLE_CREATE_TREAD); + mes = strMsg; throw(-1); } @@ -2303,7 +2317,8 @@ int mount_crypt_fs(const WCHAR* mountpoint, const WCHAR *path, // MountPointManager owns tdata from this point on, even if it fails to add (will delete it) if (!MountPointManager::getInstance().add(mountpoint, tdata)) { - mes = L"unable to add mount point to MountPointManager\n"; + CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_UNABLE_ADD_MPOINT); + mes = strMsg; throw(-1); } @@ -2345,12 +2360,15 @@ int mount_crypt_fs(const WCHAR* mountpoint, const WCHAR *path, if (wait_result != WAIT_OBJECT_0) { if (wait_result == (WAIT_OBJECT_0 + 1)) { // thread exited without mounting - mes = L"mount operation failed\n"; + CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_MOUNT_FAILED); + mes = strMsg; } else if (wait_result == WAIT_TIMEOUT) { - mes = L"mount operation timed out\n"; + CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_MOUNT_TIMED_OUT); + mes = strMsg; tdata = NULL; // deleting it would probably cause crash } else { - mes = L"error waiting for mount operation\n"; + CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_MOUNT_ERROR_WAITING); + mes = strMsg; tdata = NULL; // deleting it would probably cause crash } throw(-1); @@ -2372,8 +2390,9 @@ BOOL unmount_crypt_fs(const WCHAR* mountpoint, bool wait, wstring& mes) { wstring mpstr; if (!MountPointManager::getInstance().find(mountpoint, mpstr)) { - mes += L"unable to find mount point"; - return FALSE; + CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_UNABLE_FIND_MPOINT); + mes += strMsg; + return FALSE; } if (!DokanRemoveMountPoint(mpstr.c_str())) { mes += GetWindowsErrorString(GetLastError()); @@ -2383,7 +2402,9 @@ BOOL unmount_crypt_fs(const WCHAR* mountpoint, bool wait, wstring& mes) { if (wait) { bool res = MountPointManager::getInstance().wait_and_destroy(mpstr.c_str()); if (!res) { - mes += L"wait on umount returned an error " + GetWindowsErrorString(GetLastError()); + CString strMsg; + strMsg.Format(LocUtilsAlt::GetStringFromResources(IDS_WAIT_UNMOUNT_ERROR), GetWindowsErrorString(GetLastError())); + mes += strMsg; } return res; } else { @@ -2421,7 +2442,8 @@ BOOL write_volume_name_if_changed(WCHAR dl, wstring& mes) { CryptThreadData *tdata = MountPointManager::getInstance().get(fs_root.c_str()); if (!tdata) { - mes += L"mount point not found"; + CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_MPOINT_NOT_FOUND); + mes += strMsg; return FALSE; } @@ -2430,7 +2452,8 @@ BOOL write_volume_name_if_changed(WCHAR dl, wstring& mes) { CryptContext *con = &tdata->con; if (!con) { - mes += L"mount point has null context"; + CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_MPOINT_NULL); + mes += strMsg; return FALSE; } @@ -2443,7 +2466,9 @@ BOOL write_volume_name_if_changed(WCHAR dl, wstring& mes) { NULL, NULL, 0)) { DWORD error = GetLastError(); DbgPrint(L"update volume name error = %u\n", error); - mes += L"Unable to get volume information, " + GetWindowsErrorString(error); + CString strMsg; + strMsg.Format(LocUtilsAlt::GetStringFromResources(IDS_UNABLE_GET_VOLUME_INFO), GetWindowsErrorString(error)); + mes += strMsg; return FALSE; } @@ -2451,7 +2476,8 @@ BOOL write_volume_name_if_changed(WCHAR dl, wstring& mes) { con->GetConfig()->m_VolumeName = volbuf; bool res = con->GetConfig()->write_updated_config_file(nullptr, nullptr, 0); if (!res) { - mes += L"unable to write new volume name to config file"; + CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_UNABLE_WRITE_NEW_VOL_NAME); + mes += strMsg; return FALSE; } } @@ -2504,7 +2530,8 @@ wstring transform_path(const wchar_t* path, wstring& mes) _locale_t locale = _create_locale(LC_ALL, ""); if (locale == NULL) { - mes = L"cannot create locale"; + CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_CANNOT_CREATE_LOCALE); + mes = strMsg; return nullptr; } @@ -2527,7 +2554,8 @@ wstring transform_path(const wchar_t* path, wstring& mes) _free_locale(locale); if (!tdata) { - mes = L"could not found mount point or base dir"; + CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_NOT_FOUND_MPOINT_BASE_DIR); + mes = strMsg; return L""; } @@ -2537,12 +2565,14 @@ wstring transform_path(const wchar_t* path, wstring& mes) if (tdata->con.GetConfig()->m_reverse) { if (!encrypt_path(&tdata->con, p, storage)) { - mes = L"failed to convert path"; + CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_FAILED_CONVERT_PATH); + mes = strMsg; return L""; } } else { if (!unencrypt_path(&tdata->con, p, storage)) { - mes = L"failed to unencrypt path"; + CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_FAILED_UNENCRYPT_PATH); + mes = strMsg; return L""; } } @@ -2556,7 +2586,8 @@ wstring transform_path(const wchar_t* path, wstring& mes) FileNameEnc enc(&dfi, p, nullptr, false); auto pconv = static_cast(enc); if (!pconv) { - mes = L"failed to encrypt path"; + CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_FAILED_ENCRYPT_PATH); + mes = strMsg; return L""; } return pconv + std::size(L"\\\\?\\") - 1; @@ -2569,19 +2600,22 @@ BOOL list_files(const WCHAR *path, list &findDatas, err_mes = L""; if (!path) { - err_mes = L"path is null"; + CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_PATH_NULL); + err_mes = strMsg; return FALSE; } if (wcslen(path) > MAX_PATH - 1) { - err_mes = L"path is too long"; + CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_PATH_TOO_LONG); + err_mes = strMsg; return FALSE; } WCHAR newpath[MAX_PATH + 1]; if (!PathCanonicalize(newpath, path)) { - err_mes = L"failed to canonicalize path"; + CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_FAILED_CANONICALIZE_PATH); + err_mes = strMsg; return FALSE; } @@ -2590,17 +2624,20 @@ BOOL list_files(const WCHAR *path, list &findDatas, int dl = *path; if (dl < 'A' || dl > 'Z') { - err_mes = L"invalid drive letter"; + CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_INVALID_DRIVE_LETTER); + err_mes = strMsg; return FALSE; } if (wcslen(path) < 3) { - err_mes = L"path is too short"; + CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_PATH_TOO_SHORT); + err_mes = strMsg; return FALSE; } if (path[1] != ':' || path[2] != '\\') { - err_mes = L"invalid path"; + CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_INVALID_PATH); + err_mes = strMsg; return FALSE; } @@ -2614,7 +2651,8 @@ BOOL list_files(const WCHAR *path, list &findDatas, _locale_t locale = _create_locale(LC_ALL, ""); if (locale == NULL) { - err_mes = L"cannot create locale"; + CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_CANNOT_CREATE_LOCALE); + err_mes = strMsg; return FALSE; } @@ -2640,7 +2678,8 @@ BOOL list_files(const WCHAR *path, list &findDatas, _free_locale(locale); if (!tdata) { - err_mes = L"drive not mounted"; + CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_DRIVE_NOT_MOUNTED); + err_mes = strMsg; return FALSE; } @@ -2670,7 +2709,8 @@ BOOL list_files(const WCHAR *path, list &findDatas, if (find_files(con, filePath.CorrectCasePath(), filePath, crypt_fill_find_data_list, NULL, &findDatas) != 0) { - err_mes = L"error listing files"; + CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_ERROR_LISTING_FILES); + err_mes = strMsg; return FALSE; } } else if (PathFileExists(filePath)) { @@ -2697,7 +2737,8 @@ BOOL list_files(const WCHAR *path, list &findDatas, } else { - err_mes = L"path does not exist"; + CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_PATH_NOT_EXIST); + err_mes = strMsg; return FALSE; } @@ -2759,7 +2800,8 @@ bool check_dokany_version(wstring& mes) vector v; if (!get_dokany_version(ver, v)) { - mes = L"unable to get dokany version"; + CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_UNABLE_GET_DOKANY_VERSION); + mes = strMsg; return false; } @@ -2775,17 +2817,23 @@ bool check_dokany_version(wstring& mes) } if (major != required_major) { - mes = L"The installed Dokany version " + ver + L" is not compatible. Please install Dokany " + required_ver; + CString strMsg; + strMsg.Format(LocUtilsAlt::GetStringFromResources(IDS_DOKANY_VER_NOT_COMPATIBLE), ver, required_ver); + mes = strMsg; return false; // error } if (major == required_major && middle < required_middle) { - mes = L"The installed Dokany version " + ver + L" is not compatible. Please install Dokany " + required_ver; + CString strMsg; + strMsg.Format(LocUtilsAlt::GetStringFromResources(IDS_DOKANY_VER_NOT_COMPATIBLE), ver, required_ver); + mes = strMsg; return false; // error } if (major == required_major && middle > required_middle) { - mes = L"The installed Dokany version is " + ver + L", and it has not been tested with cppcryptfs. Please install Dokany " + required_ver; + CString strMsg; + strMsg.Format(LocUtilsAlt::GetStringFromResources(IDS_DOKANY_VER_NOT_TESTED), ver, required_ver); + mes = strMsg; return true; // warning } @@ -2826,7 +2874,9 @@ static void InitLogging() const WCHAR* logdir = L"C:\\cppcryptfslogs"; if (!PathFileExists(logdir)) { - ::MessageBox(NULL, (wstring(L"Unable to init logging. Please create ") + logdir).c_str(), L"cppcryptfs", MB_OK | MB_ICONEXCLAMATION); + CString strMsg; + strMsg.Format(LocUtilsAlt::GetStringFromResources(IDS_UNABLE_INIT_LOGGING), logdir); + ::MessageBox(NULL, strMsg, L"cppcryptfs", MB_OK | MB_ICONEXCLAMATION); return; } @@ -2862,9 +2912,13 @@ static void InitLogging() const int result = _wfopen_s(&g_DebugLogFile, logname.c_str(), L"at+"); if (result == 0) { - ::MessageBox(NULL, (wstring(L"Logging to ") + logname).c_str(), L"cppcryptfs", MB_OK | MB_ICONINFORMATION); + CString strMsg; + strMsg.Format(LocUtilsAlt::GetStringFromResources(IDS_LOGGING_TO_LOGNAME), logname); + ::MessageBox(NULL, strMsg, L"cppcryptfs", MB_OK | MB_ICONINFORMATION); } else { - ::MessageBox(NULL, (wstring(L"Unable to open ") + logname.c_str()).c_str(), L"cppcryptfs", MB_OK | MB_ICONERROR); + CString strMsg; + strMsg.Format(LocUtilsAlt::GetStringFromResources(IDS_UNABLE_OPEN_LOGNAME), logname); + ::MessageBox(NULL, strMsg, L"cppcryptfs", MB_OK | MB_ICONERROR); } } diff --git a/cppcryptfs/resource.h b/cppcryptfs/resource.h index 0c37078cb55239152c5cb0fb4a433b383d7f43a5..6e001bd25a7f8d7791c1b6b71f22807a21962081 100755 GIT binary patch delta 1959 zcma)6O-~b16n%wKsL&5OZIn#vbf^g+Ar;yZFfJTvftu1{sUR*Kx_9B)mHYwxcv~0x z4@^vqOS<827&dN&f8aUqb$C;7VJ0)}ygB#d+$8#(xh`2r`*hp`oM#Fj@^rWhdWVn^)a`=PSx3T72xBlm1ZoovES7gt?$ zWY2OZ12*(`nR1plkrDaUMGan?u&WO;7USJGx}8u&)mJGiws&HC#dg>ekV17Z(X1NAg< zdkJS@6K5^OLPypYgOWHGh*O zdNHPKY3_tb&`m+PwZ4P3GYrq}=lWQScDnwiJNrt_|l6;ez$nV3l2?V+6 z`qNi{>Mz*xOCd9NfE>tym=>M~_|=wt_Xhp1%98EM?dha5+@V07R4hFMH=^dNd^3L^ zzIKrTt3_=+fp^ZbkIHk_;_{d4$fK#)Qg{ZmqW6L8D63sqb;Y)dhIrz^KjwxSsN-g? zhiWE$JdGW#(4)zaMr8k?H66xi-+Fqctm}2IiWStElXc7Pf>RqTSPP>A+OJ4f8H~!q zj6C3oZK%oS270OLVB%LrnM%L5rTRsCTveH0q4?8@WIl+#hni58M!obg*gGz3ezon8 ztBFK^?AzsNUS6crPS7`_c}~Uv1&^p($>^4>^;Xm~;A8jb{iSywt56>7piFLfhXzar zTZfvJCo^{=Re9_&mzex8lX1-krV^+i_OSu=Xw3mV<-#s&8zj}tO&w%jm3?5iUznxd zLhRNSE}eJ4ZaDon&x+gk{{jqXQpx}T delta 116 zcmaF1jj?YIqRn~G8jz$Xd(?1RhnF(F9qTA ogZMUJwj(EqEizfoKm*Kg6oBw63_#{BG=P|pXePf|#?VU(0Quk~RsaA1 diff --git a/cppcryptfs/ui/locutils.cpp b/cppcryptfs/ui/locutils.cpp index a3f45d5..16bdb05 100644 --- a/cppcryptfs/ui/locutils.cpp +++ b/cppcryptfs/ui/locutils.cpp @@ -7,4 +7,4 @@ CString LocUtils::GetStringFromResources(UINT nID) { return _T("Error: String not found"); } return str; -} \ No newline at end of file +} diff --git a/cppcryptfs/ui/locutilsalt.cpp b/cppcryptfs/ui/locutilsalt.cpp new file mode 100644 index 0000000..5416e13 --- /dev/null +++ b/cppcryptfs/ui/locutilsalt.cpp @@ -0,0 +1,11 @@ +#include "locutilsalt.h" + +CString LocUtilsAlt::GetStringFromResources(UINT nID) { + CString str; + static HINSTANCE hExe = GetModuleHandle(NULL); + if (hExe == NULL || !str.LoadString(hExe, nID)) { + return _T("Error: String not found"); + } + return str; +} + diff --git a/cppcryptfs/ui/locutilsalt.h b/cppcryptfs/ui/locutilsalt.h new file mode 100644 index 0000000..05deeaf --- /dev/null +++ b/cppcryptfs/ui/locutilsalt.h @@ -0,0 +1,9 @@ +#pragma once +#include +#include + +class LocUtilsAlt { +public: + static CString GetStringFromResources(UINT nID); +}; + diff --git a/cppcryptfs/ui/uiutil.cpp b/cppcryptfs/ui/uiutil.cpp index df26be2..8ca2015 100644 --- a/cppcryptfs/ui/uiutil.cpp +++ b/cppcryptfs/ui/uiutil.cpp @@ -28,7 +28,7 @@ THE SOFTWARE. #include "stdafx.h" #include "uiutil.h" - +#include #include #include "ui/MountMangerDialog.h" @@ -36,6 +36,7 @@ THE SOFTWARE. #include "ui/certutil.h" #include "ui/CryptSettings.h" #include "dokan/cryptdokan.h" +#include "locutils.h" using namespace std; @@ -118,9 +119,9 @@ wstring CheckOpenHandles(HWND hWnd, const wchar_t* mp, bool interactive, bool fo } else if (open_handle_count > 0) { if (interactive) { - auto res = ::MessageBox(hWnd, mp ? (wstring(mp) + L" is still in use. Do you wish to continue dismounting?").c_str() : - L"Filesystem(s) are still in use. Do you wish to continue dismounting?", - L"cppcryptfs", MB_YESNO | MB_ICONHAND); + CString strMsg; + strMsg.Format(LocUtils::GetStringFromResources(IDS_IS_STILL_IN_USE), mp); + auto res = ::MessageBox(hWnd, mp ? strMsg : LocUtils::GetStringFromResources(IDS_FS_IS_STILL_IN_USE), L"cppcryptfs", MB_YESNO | MB_ICONHAND); if (res == IDYES) return L""; else From d69ccc51c6b8992e39abe68efa053c8ee89791b3 Mon Sep 17 00:00:00 2001 From: nbb1967 Date: Thu, 5 Feb 2026 11:21:15 +0300 Subject: [PATCH 10/35] simplification --- cppcryptfs/dokan/cryptdokan.cpp | 99 +++++++++++---------------------- 1 file changed, 33 insertions(+), 66 deletions(-) diff --git a/cppcryptfs/dokan/cryptdokan.cpp b/cppcryptfs/dokan/cryptdokan.cpp index 82be6b8..00d7777 100755 --- a/cppcryptfs/dokan/cryptdokan.cpp +++ b/cppcryptfs/dokan/cryptdokan.cpp @@ -2024,8 +2024,7 @@ int mount_crypt_fs(const WCHAR* mountpoint, const WCHAR *path, config_path = NULL; if (mountpoint == NULL) { - CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_INVALID_MPOINT); - mes = strMsg; + mes = LocUtilsAlt::GetStringFromResources(IDS_INVALID_MPOINT); return -1; } @@ -2033,11 +2032,9 @@ int mount_crypt_fs(const WCHAR* mountpoint, const WCHAR *path, if (mount_point_is_a_dir && !is_suitable_mountpoint(mountpoint)) { if (!PathFileExists(mountpoint)) { - CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_MPOINT_DIR_NOT_EXIST); - mes = strMsg; + mes = LocUtilsAlt::GetStringFromResources(IDS_MPOINT_DIR_NOT_EXIST); } else { - CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_MPOINT_DIR_EMPTY_NTFS); - mes = strMsg; + mes = LocUtilsAlt::GetStringFromResources(IDS_MPOINT_DIR_EMPTY_NTFS); } return -1; } @@ -2046,8 +2043,7 @@ int mount_crypt_fs(const WCHAR* mountpoint, const WCHAR *path, bool already_mounted = MountPointManager::getInstance().find(mountpoint, dummy); if (already_mounted) { - CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_LETTER_MPOINT_ALREADY_USE); - mes = strMsg; + mes = LocUtilsAlt::GetStringFromResources(IDS_LETTER_MPOINT_ALREADY_USE); return -1; } @@ -2065,8 +2061,7 @@ int mount_crypt_fs(const WCHAR* mountpoint, const WCHAR *path, } if (!tdata) { - CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_FAILED_ALLOCATE_TDATA); - mes = strMsg; + mes = LocUtilsAlt::GetStringFromResources(IDS_FAILED_ALLOCATE_TDATA); throw(-1); } @@ -2163,8 +2158,7 @@ int mount_crypt_fs(const WCHAR* mountpoint, const WCHAR *path, if (!config->read(mes, config_path, reverse)) { if (mes.length() < 1) { - CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_UNABLE_LOAD_CONF); - mes = strMsg; + mes = LocUtilsAlt::GetStringFromResources(IDS_UNABLE_LOAD_CONF); } throw(-1); } @@ -2192,8 +2186,7 @@ int mount_crypt_fs(const WCHAR* mountpoint, const WCHAR *path, #endif if (!config->decrypt_key(password)) { - CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_PASS_INCORRECT); - mes = strMsg; + mes = LocUtilsAlt::GetStringFromResources(IDS_PASS_INCORRECT); throw(-1); } @@ -2203,8 +2196,7 @@ int mount_crypt_fs(const WCHAR* mountpoint, const WCHAR *path, throw(-1); } } catch (...) { - CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_UNABLE_INIT_EME); - mes = strMsg; + mes = LocUtilsAlt::GetStringFromResources(IDS_UNABLE_INIT_EME); throw(-1); } } @@ -2213,8 +2205,7 @@ int mount_crypt_fs(const WCHAR* mountpoint, const WCHAR *path, try { con->m_siv.SetKey(config->GetMasterKey(), 32, config->m_HKDF, config); } catch (...) { - CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_UNABLE_INIT_AESSIV); - mes = strMsg; + mes = LocUtilsAlt::GetStringFromResources(IDS_UNABLE_INIT_AESSIV); throw(-1); } } @@ -2296,8 +2287,7 @@ int mount_crypt_fs(const WCHAR* mountpoint, const WCHAR *path, && !con->GetConfig()->m_reverse; if (!con->FinalInitBeforeMounting(opts.cachekeysinmemory)) { - CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_FINAL_INIT_FAILED); - mes = strMsg; + mes = LocUtilsAlt::GetStringFromResources(IDS_FINAL_INIT_FAILED); throw(-1); } @@ -2307,8 +2297,7 @@ int mount_crypt_fs(const WCHAR* mountpoint, const WCHAR *path, hThread = CreateThread(NULL, 0, CryptThreadProc, tdata, 0, NULL); if (!hThread) { - CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_UNABLE_CREATE_TREAD); - mes = strMsg; + mes = LocUtilsAlt::GetStringFromResources(IDS_UNABLE_CREATE_TREAD); throw(-1); } @@ -2317,8 +2306,7 @@ int mount_crypt_fs(const WCHAR* mountpoint, const WCHAR *path, // MountPointManager owns tdata from this point on, even if it fails to add (will delete it) if (!MountPointManager::getInstance().add(mountpoint, tdata)) { - CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_UNABLE_ADD_MPOINT); - mes = strMsg; + mes = LocUtilsAlt::GetStringFromResources(IDS_UNABLE_ADD_MPOINT); throw(-1); } @@ -2360,15 +2348,12 @@ int mount_crypt_fs(const WCHAR* mountpoint, const WCHAR *path, if (wait_result != WAIT_OBJECT_0) { if (wait_result == (WAIT_OBJECT_0 + 1)) { // thread exited without mounting - CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_MOUNT_FAILED); - mes = strMsg; + mes = LocUtilsAlt::GetStringFromResources(IDS_MOUNT_FAILED); } else if (wait_result == WAIT_TIMEOUT) { - CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_MOUNT_TIMED_OUT); - mes = strMsg; + mes = LocUtilsAlt::GetStringFromResources(IDS_MOUNT_TIMED_OUT); tdata = NULL; // deleting it would probably cause crash } else { - CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_MOUNT_ERROR_WAITING); - mes = strMsg; + mes = LocUtilsAlt::GetStringFromResources(IDS_MOUNT_ERROR_WAITING); tdata = NULL; // deleting it would probably cause crash } throw(-1); @@ -2390,8 +2375,7 @@ BOOL unmount_crypt_fs(const WCHAR* mountpoint, bool wait, wstring& mes) { wstring mpstr; if (!MountPointManager::getInstance().find(mountpoint, mpstr)) { - CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_UNABLE_FIND_MPOINT); - mes += strMsg; + mes += LocUtilsAlt::GetStringFromResources(IDS_UNABLE_FIND_MPOINT); return FALSE; } if (!DokanRemoveMountPoint(mpstr.c_str())) { @@ -2442,8 +2426,7 @@ BOOL write_volume_name_if_changed(WCHAR dl, wstring& mes) { CryptThreadData *tdata = MountPointManager::getInstance().get(fs_root.c_str()); if (!tdata) { - CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_MPOINT_NOT_FOUND); - mes += strMsg; + mes += LocUtilsAlt::GetStringFromResources(IDS_MPOINT_NOT_FOUND); return FALSE; } @@ -2452,8 +2435,7 @@ BOOL write_volume_name_if_changed(WCHAR dl, wstring& mes) { CryptContext *con = &tdata->con; if (!con) { - CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_MPOINT_NULL); - mes += strMsg; + mes += LocUtilsAlt::GetStringFromResources(IDS_MPOINT_NULL); return FALSE; } @@ -2476,8 +2458,7 @@ BOOL write_volume_name_if_changed(WCHAR dl, wstring& mes) { con->GetConfig()->m_VolumeName = volbuf; bool res = con->GetConfig()->write_updated_config_file(nullptr, nullptr, 0); if (!res) { - CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_UNABLE_WRITE_NEW_VOL_NAME); - mes += strMsg; + mes += LocUtilsAlt::GetStringFromResources(IDS_UNABLE_WRITE_NEW_VOL_NAME); return FALSE; } } @@ -2530,8 +2511,7 @@ wstring transform_path(const wchar_t* path, wstring& mes) _locale_t locale = _create_locale(LC_ALL, ""); if (locale == NULL) { - CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_CANNOT_CREATE_LOCALE); - mes = strMsg; + mes = LocUtilsAlt::GetStringFromResources(IDS_CANNOT_CREATE_LOCALE); return nullptr; } @@ -2554,8 +2534,7 @@ wstring transform_path(const wchar_t* path, wstring& mes) _free_locale(locale); if (!tdata) { - CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_NOT_FOUND_MPOINT_BASE_DIR); - mes = strMsg; + mes = LocUtilsAlt::GetStringFromResources(IDS_NOT_FOUND_MPOINT_BASE_DIR); return L""; } @@ -2565,14 +2544,12 @@ wstring transform_path(const wchar_t* path, wstring& mes) if (tdata->con.GetConfig()->m_reverse) { if (!encrypt_path(&tdata->con, p, storage)) { - CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_FAILED_CONVERT_PATH); - mes = strMsg; + mes = LocUtilsAlt::GetStringFromResources(IDS_FAILED_CONVERT_PATH); return L""; } } else { if (!unencrypt_path(&tdata->con, p, storage)) { - CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_FAILED_UNENCRYPT_PATH); - mes = strMsg; + mes = LocUtilsAlt::GetStringFromResources(IDS_FAILED_UNENCRYPT_PATH); return L""; } } @@ -2600,22 +2577,19 @@ BOOL list_files(const WCHAR *path, list &findDatas, err_mes = L""; if (!path) { - CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_PATH_NULL); - err_mes = strMsg; + err_mes = LocUtilsAlt::GetStringFromResources(IDS_PATH_NULL); return FALSE; } if (wcslen(path) > MAX_PATH - 1) { - CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_PATH_TOO_LONG); - err_mes = strMsg; + err_mes = LocUtilsAlt::GetStringFromResources(IDS_PATH_TOO_LONG); return FALSE; } WCHAR newpath[MAX_PATH + 1]; if (!PathCanonicalize(newpath, path)) { - CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_FAILED_CANONICALIZE_PATH); - err_mes = strMsg; + err_mes = LocUtilsAlt::GetStringFromResources(IDS_FAILED_CANONICALIZE_PATH); return FALSE; } @@ -2624,20 +2598,17 @@ BOOL list_files(const WCHAR *path, list &findDatas, int dl = *path; if (dl < 'A' || dl > 'Z') { - CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_INVALID_DRIVE_LETTER); - err_mes = strMsg; + err_mes = LocUtilsAlt::GetStringFromResources(IDS_INVALID_DRIVE_LETTER); return FALSE; } if (wcslen(path) < 3) { - CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_PATH_TOO_SHORT); - err_mes = strMsg; + err_mes = LocUtilsAlt::GetStringFromResources(IDS_PATH_TOO_SHORT); return FALSE; } if (path[1] != ':' || path[2] != '\\') { - CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_INVALID_PATH); - err_mes = strMsg; + err_mes = LocUtilsAlt::GetStringFromResources(IDS_INVALID_PATH); return FALSE; } @@ -2678,8 +2649,7 @@ BOOL list_files(const WCHAR *path, list &findDatas, _free_locale(locale); if (!tdata) { - CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_DRIVE_NOT_MOUNTED); - err_mes = strMsg; + err_mes = LocUtilsAlt::GetStringFromResources(IDS_DRIVE_NOT_MOUNTED); return FALSE; } @@ -2709,8 +2679,7 @@ BOOL list_files(const WCHAR *path, list &findDatas, if (find_files(con, filePath.CorrectCasePath(), filePath, crypt_fill_find_data_list, NULL, &findDatas) != 0) { - CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_ERROR_LISTING_FILES); - err_mes = strMsg; + err_mes = LocUtilsAlt::GetStringFromResources(IDS_ERROR_LISTING_FILES); return FALSE; } } else if (PathFileExists(filePath)) { @@ -2737,8 +2706,7 @@ BOOL list_files(const WCHAR *path, list &findDatas, } else { - CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_PATH_NOT_EXIST); - err_mes = strMsg; + err_mes = LocUtilsAlt::GetStringFromResources(IDS_PATH_NOT_EXIST); return FALSE; } @@ -2800,8 +2768,7 @@ bool check_dokany_version(wstring& mes) vector v; if (!get_dokany_version(ver, v)) { - CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_UNABLE_GET_DOKANY_VERSION); - mes = strMsg; + mes = LocUtilsAlt::GetStringFromResources(IDS_UNABLE_GET_DOKANY_VERSION); return false; } From 5431c4f02babf1d74b8ecbdda6bfa5125f26598b Mon Sep 17 00:00:00 2001 From: nbb1967 Date: Fri, 6 Feb 2026 13:09:42 +0300 Subject: [PATCH 11/35] correct, additions --- cppcryptfs/cppcryptfs.rc | Bin 60260 -> 61752 bytes cppcryptfs/cppcryptfs.vcxproj | 1 + cppcryptfs/dokan/cryptdokan.cpp | 5 ++--- cppcryptfs/resource.h | Bin 23398 -> 24186 bytes cppcryptfs/ui/CreatePropertyPage.cpp | 6 ++++-- cppcryptfs/ui/CryptAboutPropertyPage.cpp | 23 ++++++++++---------- cppcryptfs/ui/MountPropertyPage.cpp | 26 +++++++++++------------ cppcryptfs/ui/locutilsalt.cpp | 1 - cppcryptfs/ui/locutilsalt.h | 4 ++-- cppcryptfs/ui/uiutil.cpp | 15 +++++++------ 10 files changed, 42 insertions(+), 39 deletions(-) diff --git a/cppcryptfs/cppcryptfs.rc b/cppcryptfs/cppcryptfs.rc index 86718da2a13231b31c22e8fe2f38a7b36d9644c2..3b31b26d592569abb05d6009bb2e814fc2f024a2 100644 GIT binary patch delta 874 zcmZ`%Ur1A79Q_St>J*vToT+mgZWxpj1lpr6O@yU3rxN{{|K<{w6TK-Cgos2>%{b8pM?!qO+hG9nJV+_57wcOaID&YHN$#loFw?5-5XW)@8bE=mku6wN!) zuvQ84O0FeL-neMukO7HML6b3w;8X07!XmMpO}sPio_|q7c!4!6K>{^C2T2L;6Q=NO z(T&FmQ%WFrz9YMu+v8r)A<{dZilEa z_N&n$s)mrf<%}I&){JO)ZKPPUczHKb&Ld~}?2=AIQ#MRrFd5pBd{t~4VA3OuAShv8 zdolFO6lJf-IFhOI*y`PxVw;z}c*Ms+`E;Rf%KD^}yY!1j*s*Rg;<~jo%T3xNE5AQv zMOViU0u|h;fxii9Q;}XXG_tmk6 z&9!`(KbGR+whQZvW!9e%hg>2}of{SD6wWMIRf(biv)jwiuMe{Y=eDcSdpNtknK+&- zeE^d>TczhyVg=_MMsVb9uW`CLdU{=RugByI4FRT}sd}LnD* zd(0*aiKXt44#u0UQnMrVYdjk0s}}ymm!HEbF$$C pNp@ofBQ$xC2wZ-0)?Oz@g~_Y;s!qOlfMavkzIoi6cb%?N1pt#$R{sD1 diff --git a/cppcryptfs/cppcryptfs.vcxproj b/cppcryptfs/cppcryptfs.vcxproj index bbca838..4cce077 100755 --- a/cppcryptfs/cppcryptfs.vcxproj +++ b/cppcryptfs/cppcryptfs.vcxproj @@ -266,6 +266,7 @@ false NotUsing + NotUsing diff --git a/cppcryptfs/dokan/cryptdokan.cpp b/cppcryptfs/dokan/cryptdokan.cpp index 00d7777..e555c5b 100755 --- a/cppcryptfs/dokan/cryptdokan.cpp +++ b/cppcryptfs/dokan/cryptdokan.cpp @@ -2272,7 +2272,7 @@ int mount_crypt_fs(const WCHAR* mountpoint, const WCHAR *path, if (opts.mountmanagerwarn && !have_security_name_privilege()) { if (!mountmanager_continue_mounting()) { - mes = L"operation cancelled by user"; + mes = LocUtilsAlt::GetStringFromResources(IDS_CANCELED_BY_USER); throw(-1); } } @@ -2622,8 +2622,7 @@ BOOL list_files(const WCHAR *path, list &findDatas, _locale_t locale = _create_locale(LC_ALL, ""); if (locale == NULL) { - CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_CANNOT_CREATE_LOCALE); - err_mes = strMsg; + err_mes = LocUtilsAlt::GetStringFromResources(IDS_CANNOT_CREATE_LOCALE); return FALSE; } diff --git a/cppcryptfs/resource.h b/cppcryptfs/resource.h index 6e001bd25a7f8d7791c1b6b71f22807a21962081..e911b57c12505fe8aabbe94bd5fc6f446498e398 100755 GIT binary patch delta 880 zcmZWnOH30{6n!Wf3!2Vb` zRb&%vmd&vWE3*Pyrd9kmhS?CVM^jLZAjZQZ*vMKKk|TH&b`TS~$tL4R*v7KpU|eX& zF6~tzgYQC;-bgs0`=mICZZU~Xnrn3aMEjmNgvag4Ei;JUWV$OQQH^%vmK5PB){IbX zTRJ?|%p1gI*>3Tx8phY9GuW|p*j+)aN;;-OCUm(IYHtknXa?&tW$uj`MdGw@g3Bj^<&EX?lBP$lwNGggQzREpP_Y$ ztCnXawuJL)ALn~0$FQOD3fgkynPXF=>xoFh`Jnc|Qu=-Vyy`nj0^c$&-jVICMmE)f zqz~eiYQobq*il{V>Nbv4H*g6JC50I+gS=s5Q**IJyI*@-eJUT;A7$49n;bjNn2%MVyk_1k2MX(BvvJ@|=pJu7)s`m9d`{@ZN|~e8Y`H z6+>7yEhNnQeL3o#InuGfe68}tb&{>nx=7j=7^&988|9hmrc~QAw}avYg_S6%46W_7 z__y7%c%!B1V`jv9HHcw8!n`fFGP$ICEW+g5v(Xr_%2)Boc5vHEU@anGJng_+OrUOuVE4L6Mi9Ho@vm{B^E(xH=x z?FULJ9io#sNG0G<9P&3fIb|$Gf`~Xd`6ewdFW>L;;eqG*{`*$A_*yu-r_)Vl80r>p z^*VoZ$)IQ`o$@Y>CVOVoF^rg(jTv^0Tf8t*21dfMnzos8VMuzW!=@?em>Fkk?x{aA zbG}Q-s?}oMQ=XDdVEcTwX8BN*{U6rl)HTc|#$L&1$4+=`k4vN+>kd6TCa>9?)_iQo z;-?+4yKM2s@mVcNM7hphsZF;Wuu&U__zV<_U3oY^&8(=h;Y2(YX`#b`yv>Pd@kf!7 zXe;u}3%TzmYI|P{*>}h6APgt9F5Q5ZXpnm`+d|Uya@Ox8y!HgIgcwKA%LH?km@PND zuIaE{aX44{Qzc`{i+JJ(c>X^5O{+ihPp0`D#JZ`O+KP4+w$}7;nijw2&&`h3)*fh& wwC8*Yn&lO(b)}Sh@+dAW@iCa=P$vDgh2ag1YRbb!bz!x^(PGp;tq$-02VXdlSO5S3 diff --git a/cppcryptfs/ui/CreatePropertyPage.cpp b/cppcryptfs/ui/CreatePropertyPage.cpp index 7154736..6a1ef6d 100755 --- a/cppcryptfs/ui/CreatePropertyPage.cpp +++ b/cppcryptfs/ui/CreatePropertyPage.cpp @@ -43,9 +43,11 @@ THE SOFTWARE. #include "util/util.h" #include "locutils.h" +static const CString strMsgPlainText = LocUtils::GetStringFromResources(IDS_PLAIN_TEXT); + static const WCHAR *filename_encryption_types[] = { L"AES256-EME", - L"Plain text" + strMsgPlainText }; #define NUM_FN_ENC_TYPES (sizeof(filename_encryption_types)/sizeof(filename_encryption_types[0])) @@ -203,7 +205,7 @@ void CCreatePropertyPage::CreateCryptfs() if (cfenc == L"AES256-EME") eme = true; - else if (cfenc == "Plain text") + else if (cfenc == strMsgPlainText) plaintext = true; if (!plaintext) { diff --git a/cppcryptfs/ui/CryptAboutPropertyPage.cpp b/cppcryptfs/ui/CryptAboutPropertyPage.cpp index 0f2588c..28a149a 100755 --- a/cppcryptfs/ui/CryptAboutPropertyPage.cpp +++ b/cppcryptfs/ui/CryptAboutPropertyPage.cpp @@ -181,7 +181,7 @@ BOOL CCryptAboutPropertyPage::OnInitDialog() wstring openssl_ver_w; if (!utf8_to_unicode(openssl_ver_s.c_str(), openssl_ver_w)) - openssl_ver_w = L"error getting openssl version"; + openssl_ver_w = LocUtils::GetStringFromResources(IDS_ERR_GET_OPENSSL_VERSION); CString openssl_ver = openssl_ver_w.c_str(); @@ -189,29 +189,28 @@ BOOL CCryptAboutPropertyPage::OnInitDialog() std::wstring dok_ver; CString dokany_version; if (get_dokany_version(dok_ver, dv)) { - dokany_version.Format(LocUtils::GetStringFromResources(IDS_DOKANY_VERSION), dok_ver.c_str()); + dokany_version = dok_ver.c_str(); } - wstring aes_ni; + CString aes_ni; if (AES::use_aes_ni()) { aes_ni = LocUtils::GetStringFromResources(IDS_AESNI_DETECTED); } else { aes_ni = LocUtils::GetStringFromResources(IDS_AESNI_NOT_DETECTED); } - CString strMsgOpenSSLVersion; - strMsgOpenSSLVersion.Format(LocUtils::GetStringFromResources(IDS_OPENSSL_VERSION), openssl_ver); - SetDlgItemText(IDC_LINKAGES, strMsgOpenSSLVersion + dokany_version); + CString strMsgLibraryVersions; + strMsgLibraryVersions.Format(LocUtils::GetStringFromResources(IDS_LIBRARY_VERSIONS), openssl_ver, dokany_version); + SetDlgItemText(IDC_LINKAGES, strMsgLibraryVersions); bool is_admin = theApp.IsRunningAsAdministrator(); - CString prod_ver = prod.c_str(); - prod_ver += L" "; - prod_ver += ver.c_str(); - prod_ver += sizeof(void*) == 8 ? LocUtils::GetStringFromResources(IDS_64BIT) : LocUtils::GetStringFromResources(IDS_32BIT); - prod_ver += (is_admin ? LocUtils::GetStringFromResources(IDS_ADMIN) : L""); + int prod_bit_depth = sizeof(void*) == 8 ? 64 : 32; + CString prod_admin = (is_admin ? L" " + LocUtils::GetStringFromResources(IDS_ADMIN) : L""); + CString strMsgCopyright; + strMsgCopyright.Format(LocUtils::GetStringFromResources(IDS_ABOUT_COPYRIGHT), ver.c_str(), prod_bit_depth, prod_admin, aes_ni); - SetDlgItemText(IDC_PROD_VERSION, prod_ver + CString(aes_ni.c_str())); + SetDlgItemText(IDC_PROD_VERSION, strMsgCopyright); SetDlgItemText(IDC_COPYRIGHT, copyright.c_str()); CListCtrl *pList = (CListCtrl*)GetDlgItem(IDC_COMPONENTS_LIST); diff --git a/cppcryptfs/ui/MountPropertyPage.cpp b/cppcryptfs/ui/MountPropertyPage.cpp index 4764a5e..48ef1f8 100644 --- a/cppcryptfs/ui/MountPropertyPage.cpp +++ b/cppcryptfs/ui/MountPropertyPage.cpp @@ -154,7 +154,7 @@ void CMountPropertyPage::DefaultAction() { CString mes = Mount(); - if (mes.GetLength() > 0 && mes != L"password cannot be empty") + if (mes.GetLength() > 0 && mes != LocUtils::GetStringFromResources(IDS_PASS_CANNOT_BE_EMPTY)) MessageBox(mes, L"cppcryptfs", MB_OK | MB_ICONEXCLAMATION); } @@ -183,12 +183,12 @@ CString CMountPropertyPage::Mount(LPCWSTR argPath, LPCWSTR argMountPoint, LPCWST CListCtrl *pList = (CListCtrl*)GetDlgItem(IDC_DRIVE_LETTERS); if (!pList) - return CString(L"unable to get list control"); + return LocUtils::GetStringFromResources(IDS_UNABLE_GET_LIST); pos = pList->GetFirstSelectedItemPosition(); if (!pos) - return CString(L"unable to get selected entry"); + return LocUtils::GetStringFromResources(IDS_UNABLE_GET_SELECTED); int nItem = -1; @@ -222,14 +222,14 @@ CString CMountPropertyPage::Mount(LPCWSTR argPath, LPCWSTR argMountPoint, LPCWST } if (nItem < 0) - return CString(L"unable to find item"); + return LocUtils::GetStringFromResources(IDS_UNABLE_FIND_ITEM); CString cmp = argMountPoint && wcslen(argMountPoint) > 0 ? (wcslen(argMountPoint) == 1 ? CString(*argMountPoint) + L":" : argMountPoint) : pList->GetItemText(nItem, DL_INDEX); if (cmp.GetLength() < 1) - return CString(L"unable to get drive letter"); + return LocUtils::GetStringFromResources(IDS_UNABLE_GET_LETTER); BOOL dlInUse = is_mountpoint_a_drive(cmp) && !IsDriveLetterAvailable(*(LPCWSTR)cmp); @@ -247,7 +247,7 @@ CString CMountPropertyPage::Mount(LPCWSTR argPath, LPCWSTR argMountPoint, LPCWST CWnd *pWnd = GetDlgItem(IDC_PATH); if (!pWnd) - return CString(L"unable to get window"); + return LocUtils::GetStringFromResources(IDS_UNABLE_GET_WINDOW); CString cpath; @@ -267,7 +267,7 @@ CString CMountPropertyPage::Mount(LPCWSTR argPath, LPCWSTR argMountPoint, LPCWST } else { pWnd = GetDlgItem(IDC_CONFIG_PATH); if (!pWnd) - return CString(L"unable to get window for config path"); + return LocUtils::GetStringFromResources(IDS_UNABLE_GET_CONF_WINDOW); pWnd->GetWindowTextW(config_path); } @@ -750,7 +750,7 @@ void CMountPropertyPage::OnClickedMount() void CMountPropertyPage::OnClickedDismount() { CString mes = Dismount(nullptr, true, false); - if (mes.GetLength() > 0 && mes != L"operation cancelled by user") + if (mes.GetLength() > 0 && mes != LocUtils::GetStringFromResources(IDS_CANCELED_BY_USER)) MessageBox(mes, L"cppcryptfs", MB_OK | MB_ICONEXCLAMATION); } @@ -760,12 +760,12 @@ CString CMountPropertyPage::Dismount(LPCWSTR argMountPoint, bool interactive, bo CListCtrl *pList = (CListCtrl*)GetDlgItem(IDC_DRIVE_LETTERS); if (!pList) - return CString(L"unable to get list"); + return LocUtils::GetStringFromResources(IDS_UNABLE_GET_LIST); POSITION pos = pList->GetFirstSelectedItemPosition(); if (!pos) - return CString(L"unable to get selection"); + return LocUtils::GetStringFromResources(IDS_UNABLE_GET_SELECTED); int nItem; @@ -786,12 +786,12 @@ CString CMountPropertyPage::Dismount(LPCWSTR argMountPoint, bool interactive, bo } if (nItem < 0) - return CString(L"unable to find item"); + return LocUtils::GetStringFromResources(IDS_UNABLE_FIND_ITEM); CString cmp = pList->GetItemText(nItem, DL_INDEX); if (cmp.GetLength() < 1) - return CString(L"unable to get drive letter"); + return LocUtils::GetStringFromResources(IDS_UNABLE_GET_LETTER); CString cpath = pList->GetItemText(nItem, PATH_INDEX); @@ -856,7 +856,7 @@ CString CMountPropertyPage::DismountAll(bool interactive, bool forceDismount) CListCtrl *pList = (CListCtrl*)GetDlgItem(IDC_DRIVE_LETTERS); if (!pList) - return CString(L"unable to get list"); + return LocUtils::GetStringFromResources(IDS_UNABLE_GET_LIST); int count = pList->GetItemCount(); diff --git a/cppcryptfs/ui/locutilsalt.cpp b/cppcryptfs/ui/locutilsalt.cpp index 5416e13..72a30ad 100644 --- a/cppcryptfs/ui/locutilsalt.cpp +++ b/cppcryptfs/ui/locutilsalt.cpp @@ -8,4 +8,3 @@ CString LocUtilsAlt::GetStringFromResources(UINT nID) { } return str; } - diff --git a/cppcryptfs/ui/locutilsalt.h b/cppcryptfs/ui/locutilsalt.h index 05deeaf..5a9f5ff 100644 --- a/cppcryptfs/ui/locutilsalt.h +++ b/cppcryptfs/ui/locutilsalt.h @@ -4,6 +4,6 @@ class LocUtilsAlt { public: - static CString GetStringFromResources(UINT nID); + // + static ATL::CString GetStringFromResources(UINT nID); }; - diff --git a/cppcryptfs/ui/uiutil.cpp b/cppcryptfs/ui/uiutil.cpp index 8ca2015..8221329 100644 --- a/cppcryptfs/ui/uiutil.cpp +++ b/cppcryptfs/ui/uiutil.cpp @@ -28,7 +28,7 @@ THE SOFTWARE. #include "stdafx.h" #include "uiutil.h" -#include + #include #include "ui/MountMangerDialog.h" @@ -36,6 +36,7 @@ THE SOFTWARE. #include "ui/certutil.h" #include "ui/CryptSettings.h" #include "dokan/cryptdokan.h" +#include "resource.h" #include "locutils.h" using namespace std; @@ -57,7 +58,7 @@ bool DeleteAllRegisteryValues(LPCWSTR regPath, wstring& mes) LSTATUS status = ::RegOpenKeyEx(HKEY_CURRENT_USER, regPath, 0, KEY_ALL_ACCESS, &hkey); if (status != ERROR_SUCCESS) { if (status != ERROR_FILE_NOT_FOUND) { - mes = L"unable to open history"; + mes = LocUtils::GetStringFromResources(IDS_UNABLE_OPEN_HISTORY); } return false; } @@ -74,7 +75,7 @@ bool DeleteAllRegisteryValues(LPCWSTR regPath, wstring& mes) if (status != ERROR_NO_MORE_ITEMS) { ::RegCloseKey(hkey); - mes = L"error while deleting history"; + mes = LocUtils::GetStringFromResources(IDS_ERR_DELETING_HISTORY); return false; } @@ -82,7 +83,7 @@ bool DeleteAllRegisteryValues(LPCWSTR regPath, wstring& mes) status = RegDeleteValue(hkey, it.c_str()); if (status != ERROR_SUCCESS) { ::RegCloseKey(hkey); - mes = L"error while deleting registry value"; + mes = LocUtils::GetStringFromResources(IDS_ERR_DELETING_REG_VALUE); return false; } } @@ -124,8 +125,10 @@ wstring CheckOpenHandles(HWND hWnd, const wchar_t* mp, bool interactive, bool fo auto res = ::MessageBox(hWnd, mp ? strMsg : LocUtils::GetStringFromResources(IDS_FS_IS_STILL_IN_USE), L"cppcryptfs", MB_YESNO | MB_ICONHAND); if (res == IDYES) return L""; - else - return L"operation cancelled by user"; + else { + CString strMsgCanceledByUser = LocUtils::GetStringFromResources(IDS_CANCELED_BY_USER); + return strMsgCanceledByUser.GetString(); + } } else { return mp ? wstring(mp) + L" is still in use. Use --force to force dismounting." : From 31a6dc503965f9c73042c8bd3ee978fdc40d9ef3 Mon Sep 17 00:00:00 2001 From: nbb1967 Date: Fri, 6 Feb 2026 17:23:59 +0300 Subject: [PATCH 12/35] minor edits --- cppcryptfs/cppcryptfs.rc | Bin 61752 -> 61768 bytes cppcryptfs/dokan/cryptdokan.cpp | 3 +-- cppcryptfs/ui/FolderDialog.cpp | 2 +- cppcryptfs/ui/FolderDialog.h | 1 + cppcryptfs/ui/locutilsalt.h | 1 - 5 files changed, 3 insertions(+), 4 deletions(-) diff --git a/cppcryptfs/cppcryptfs.rc b/cppcryptfs/cppcryptfs.rc index 3b31b26d592569abb05d6009bb2e814fc2f024a2..1d6167be8ad86a2ba19397a1a606f1d137e77f67 100644 GIT binary patch delta 74 zcmdn-i21}L<_#s>tojW43`!FVg(r7#uVDsqChzBxoP3U*V{-`4fkz;LiG`w*>zMc^ Uo4qeUa5*N2@Ca?b@;-$T0I_fx6#xJL delta 63 zcmX@{hlMir-Ozz=c1EeJ;pJV6P9K&(enc); if (!pconv) { - CString strMsg = LocUtilsAlt::GetStringFromResources(IDS_FAILED_ENCRYPT_PATH); - mes = strMsg; + mes = LocUtilsAlt::GetStringFromResources(IDS_FAILED_ENCRYPT_PATH); return L""; } return pconv + std::size(L"\\\\?\\") - 1; diff --git a/cppcryptfs/ui/FolderDialog.cpp b/cppcryptfs/ui/FolderDialog.cpp index 1579f82..f8521de 100755 --- a/cppcryptfs/ui/FolderDialog.cpp +++ b/cppcryptfs/ui/FolderDialog.cpp @@ -5,9 +5,9 @@ // from http://www.codeguru.com/cpp/w-d/dislog/dialogforselectingfolders/article.php/c1941/MFC-Wrapper-for-SHBrowseForFolder.htm #include "stdafx.h" -#include "cppcryptfs.h" #include "FolderDialog.h" #include "locutils.h" +#include "resource.h" #ifdef _DEBUG #undef THIS_FILE diff --git a/cppcryptfs/ui/FolderDialog.h b/cppcryptfs/ui/FolderDialog.h index c895dc0..2daff61 100755 --- a/cppcryptfs/ui/FolderDialog.h +++ b/cppcryptfs/ui/FolderDialog.h @@ -9,6 +9,7 @@ #define _CFolderDialog_ #include +#include class CFolderDialog { diff --git a/cppcryptfs/ui/locutilsalt.h b/cppcryptfs/ui/locutilsalt.h index 5a9f5ff..8e4f07f 100644 --- a/cppcryptfs/ui/locutilsalt.h +++ b/cppcryptfs/ui/locutilsalt.h @@ -4,6 +4,5 @@ class LocUtilsAlt { public: - // static ATL::CString GetStringFromResources(UINT nID); }; From 58f73871371dd8937e82f9ac47bc268c203df36a Mon Sep 17 00:00:00 2001 From: nbb1967 Date: Fri, 6 Feb 2026 21:23:14 +0300 Subject: [PATCH 13/35] debugging --- cppcryptfs/cppcryptfs.rc | Bin 61768 -> 61752 bytes cppcryptfs/ui/locutils.cpp | 3 ++- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/cppcryptfs/cppcryptfs.rc b/cppcryptfs/cppcryptfs.rc index 1d6167be8ad86a2ba19397a1a606f1d137e77f67..3b31b26d592569abb05d6009bb2e814fc2f024a2 100644 GIT binary patch delta 63 zcmX@{hlMir-Ozz=c1EeJ;pJV6P9K&tojW43`!FVg(r7#uVDsqChzBxoP3U*V{-`4fkz;LiG`w*>zMc^ Uo4qeUa5*N2@Ca?b@;-$T0I_fx6#xJL diff --git a/cppcryptfs/ui/locutils.cpp b/cppcryptfs/ui/locutils.cpp index 16bdb05..5f5a9dd 100644 --- a/cppcryptfs/ui/locutils.cpp +++ b/cppcryptfs/ui/locutils.cpp @@ -3,7 +3,8 @@ CString LocUtils::GetStringFromResources(UINT nID) { CString str; - if (!str.LoadString(AfxGetResourceHandle(), nID)) { + static HINSTANCE hExe = GetModuleHandle(NULL); + if (hExe == NULL || !str.LoadString(hExe, nID)) { return _T("Error: String not found"); } return str; From 49664bd708f8854ab8423518c1779baefe2d7bec Mon Sep 17 00:00:00 2001 From: nbb1967 Date: Sun, 8 Feb 2026 10:10:43 +0300 Subject: [PATCH 14/35] renaming --- cppcryptfs/cppcryptfs.cpp | 5 +++-- cppcryptfs/cppcryptfs.rc | Bin 61752 -> 61816 bytes cppcryptfs/cppcryptfs.vcxproj | 16 ++++++++-------- .../res/lic/{en_aessiv.txt => en/aessiv.txt} | Bin .../{en_cppcryptfs.txt => en/cppcryptfs.txt} | Bin .../{en_dokany_lib.txt => en/dokany_lib.txt} | Bin .../{en_dokany_mir.txt => en/dokany_mir.txt} | Bin .../res/lic/{en_getopt.txt => en/getopt.txt} | Bin .../lic/{en_openssl.txt => en/openssl.txt} | Bin .../{en_rapidjson.txt => en/rapidjson.txt} | Bin .../secure_edit.txt} | Bin cppcryptfs/resource.h | Bin 24186 -> 24196 bytes cppcryptfs/ui/uiutil.cpp | 2 +- 13 files changed, 12 insertions(+), 11 deletions(-) rename cppcryptfs/res/lic/{en_aessiv.txt => en/aessiv.txt} (100%) rename cppcryptfs/res/lic/{en_cppcryptfs.txt => en/cppcryptfs.txt} (100%) rename cppcryptfs/res/lic/{en_dokany_lib.txt => en/dokany_lib.txt} (100%) rename cppcryptfs/res/lic/{en_dokany_mir.txt => en/dokany_mir.txt} (100%) rename cppcryptfs/res/lic/{en_getopt.txt => en/getopt.txt} (100%) rename cppcryptfs/res/lic/{en_openssl.txt => en/openssl.txt} (100%) rename cppcryptfs/res/lic/{en_rapidjson.txt => en/rapidjson.txt} (100%) rename cppcryptfs/res/lic/{en_secure_edit.txt => en/secure_edit.txt} (100%) diff --git a/cppcryptfs/cppcryptfs.cpp b/cppcryptfs/cppcryptfs.cpp index b5cd4f2..3abed4e 100755 --- a/cppcryptfs/cppcryptfs.cpp +++ b/cppcryptfs/cppcryptfs.cpp @@ -53,6 +53,7 @@ THE SOFTWARE. #include "ui/uiutil.h" #include "../libipc/server.h" #include "../libipc/client.h" +#include "ui/locutils.h" #ifdef _DEBUG @@ -186,7 +187,7 @@ BOOL CcppcryptfsApp::InitInstance() ShowWindow(hWnd, SW_SHOWNORMAL); } } else { - ::MessageBox(NULL, L"cppcryptfs is already running, but window not found!", L"cppcryptfs", MB_OK | MB_ICONERROR); + ::MessageBox(NULL, LocUtils::GetStringFromResources(IDS_RUN_WINDOW_NOT_FOUND), L"cppcryptfs", MB_OK | MB_ICONERROR); } return FALSE; @@ -194,7 +195,7 @@ BOOL CcppcryptfsApp::InitInstance() wstring mes; bool dokVerCheck = check_dokany_version(mes); if (!dokVerCheck && mes.length() < 1) { - mes = L"problem with Dokany version"; + mes = LocUtils::GetStringFromResources(IDS_PROBLEM_DOKANY_VERSION); } if (mes.length()) { ::MessageBox(NULL, mes.c_str(), L"cppcryptfs", MB_OK | (dokVerCheck ? MB_ICONEXCLAMATION : MB_ICONERROR)); diff --git a/cppcryptfs/cppcryptfs.rc b/cppcryptfs/cppcryptfs.rc index 3b31b26d592569abb05d6009bb2e814fc2f024a2..fd782a448da59301b9a3e16913de9b5b42f832fc 100644 GIT binary patch delta 230 zcmdn-i227O<_&RAg@YJE8T=UH8NwMnfwT*QKSTKBiMK>2pSvzGc|i!*%(g6%bK$S@hISi=`xlr9D3>iR{%jEipijzG!_$CK*vP`af7Bjhl vUuyEFXF1F<3^9}ApVxxvyU!aT{1?q&`Z1JFf7uG=zkOK^qBm#0I?o0G{TECi delta 199 zcmezIh3kQJ!>1WU|#$uE{TM z>PdqIfzp0J=@1|t#^A`{!{Eu_!Vo|C;&buI2PO+l-Vw>8oyL&Kki(G5pa7(cfn**- zK0^tRE@Mapif1yU0NGv)!5~W}J93Cl4(Mc=yzW^HWBlZYT;h{ep638rlb_cDN#Pfb eKyvzvW*{m15=1V3*$O1JUsW^4Z(jN8JR1N8(Lsm+ diff --git a/cppcryptfs/cppcryptfs.vcxproj b/cppcryptfs/cppcryptfs.vcxproj index 4cce077..27be5fa 100755 --- a/cppcryptfs/cppcryptfs.vcxproj +++ b/cppcryptfs/cppcryptfs.vcxproj @@ -325,14 +325,14 @@ - - - - - - - - + + + + + + + + diff --git a/cppcryptfs/res/lic/en_aessiv.txt b/cppcryptfs/res/lic/en/aessiv.txt similarity index 100% rename from cppcryptfs/res/lic/en_aessiv.txt rename to cppcryptfs/res/lic/en/aessiv.txt diff --git a/cppcryptfs/res/lic/en_cppcryptfs.txt b/cppcryptfs/res/lic/en/cppcryptfs.txt similarity index 100% rename from cppcryptfs/res/lic/en_cppcryptfs.txt rename to cppcryptfs/res/lic/en/cppcryptfs.txt diff --git a/cppcryptfs/res/lic/en_dokany_lib.txt b/cppcryptfs/res/lic/en/dokany_lib.txt similarity index 100% rename from cppcryptfs/res/lic/en_dokany_lib.txt rename to cppcryptfs/res/lic/en/dokany_lib.txt diff --git a/cppcryptfs/res/lic/en_dokany_mir.txt b/cppcryptfs/res/lic/en/dokany_mir.txt similarity index 100% rename from cppcryptfs/res/lic/en_dokany_mir.txt rename to cppcryptfs/res/lic/en/dokany_mir.txt diff --git a/cppcryptfs/res/lic/en_getopt.txt b/cppcryptfs/res/lic/en/getopt.txt similarity index 100% rename from cppcryptfs/res/lic/en_getopt.txt rename to cppcryptfs/res/lic/en/getopt.txt diff --git a/cppcryptfs/res/lic/en_openssl.txt b/cppcryptfs/res/lic/en/openssl.txt similarity index 100% rename from cppcryptfs/res/lic/en_openssl.txt rename to cppcryptfs/res/lic/en/openssl.txt diff --git a/cppcryptfs/res/lic/en_rapidjson.txt b/cppcryptfs/res/lic/en/rapidjson.txt similarity index 100% rename from cppcryptfs/res/lic/en_rapidjson.txt rename to cppcryptfs/res/lic/en/rapidjson.txt diff --git a/cppcryptfs/res/lic/en_secure_edit.txt b/cppcryptfs/res/lic/en/secure_edit.txt similarity index 100% rename from cppcryptfs/res/lic/en_secure_edit.txt rename to cppcryptfs/res/lic/en/secure_edit.txt diff --git a/cppcryptfs/resource.h b/cppcryptfs/resource.h index e911b57c12505fe8aabbe94bd5fc6f446498e398..5358e7705a3cd2feed624381716e02c48b18e3be 100755 GIT binary patch delta 100 zcmeyhhp}ZZfoz7+e|r7~&b68T^5?8v`d8noV{zlbsyE$)*hvjR(s4 nGlT%ug)ulX_%L`fxB%H+48dSsFg^Y9vXc)Oifpbj #include "ui/MountMangerDialog.h" From 305b75d5976e010710c33e2e0696b10a0a8749c0 Mon Sep 17 00:00:00 2001 From: nbb1967 Date: Tue, 10 Feb 2026 11:24:51 +0300 Subject: [PATCH 15/35] lic --- cppcryptfs/res/lic/en/cppcryptfs.txt | Bin 3390 -> 3388 bytes cppcryptfs/res/lic/en/dokany_mir.txt | Bin 2904 -> 2898 bytes cppcryptfs/res/lic/en/openssl.txt | Bin 11384 -> 11360 bytes cppcryptfs/res/lic/en/rapidjson.txt | Bin 10124 -> 10104 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/cppcryptfs/res/lic/en/cppcryptfs.txt b/cppcryptfs/res/lic/en/cppcryptfs.txt index fd6c77c6c1cb8e906ab28765324112bdc7abd15f..eb73b9191c34f83b9aa06e19b275a969fdfe5e30 100644 GIT binary patch delta 14 WcmdldwMS~hJPt;M%?ml^vH$=ofCVD} delta 16 YcmdlZwNGlpJPu}F2CmKXIp(qe05En18UO$Q diff --git a/cppcryptfs/res/lic/en/dokany_mir.txt b/cppcryptfs/res/lic/en/dokany_mir.txt index e9de6fcc446dfb9681f0a7955af6cf1ed2a679bd..926ceb2a4d884bcd96ec0508633fa1fc89228431 100644 GIT binary patch delta 14 Wcmca1c1di*7B)tO&AZv=vH$=rtOa)f delta 20 acmca4c0+8#7B+TX1}+95-n^AIlpMv$6_K0kixI FWFR!278L*h diff --git a/cppcryptfs/res/lic/en/rapidjson.txt b/cppcryptfs/res/lic/en/rapidjson.txt index 4da1cc289c9a4d6be4906894c0038749cb446b1b..0e3b8e5d8360275270fe1579d1a7f167305b21d8 100644 GIT binary patch delta 40 tcmeD2|KYd6jC-;TkILpa?mK*p3Y#6J7#TOaNiSjtv)LIpuaTa{3;+|a3{U_7 delta 64 zcmez2*WYHw!-}F9R0?2!~9b$Zb4XK=~45#$-cL@ySc1gf^#0m$9QN*esx& G!2$pfoexC- From 94ad2fa34fddfd81b42cb912b892e00ec4174b4c Mon Sep 17 00:00:00 2001 From: nbb1967 Date: Wed, 11 Feb 2026 20:40:37 +0300 Subject: [PATCH 16/35] refactoring2 --- cppcryptfs/cppcryptfs.cpp | 2 +- cppcryptfs/cppcryptfs.rc | Bin 61816 -> 69782 bytes cppcryptfs/cppcryptfs.vcxproj | 5 +- cppcryptfs/dokan/cryptdokan.cpp | 94 ++++++++-------- cppcryptfs/resource.h | Bin 24196 -> 25874 bytes cppcryptfs/ui/CreatePropertyPage.cpp | 26 ++--- cppcryptfs/ui/CryptAboutPropertyPage.cpp | 26 ++--- cppcryptfs/ui/CryptPropertySheet.cpp | 2 +- cppcryptfs/ui/FolderDialog.cpp | 5 +- cppcryptfs/ui/FolderDialog.h | 2 + cppcryptfs/ui/FsInfoDialog.cpp | 18 ++-- cppcryptfs/ui/MountPropertyPage.cpp | 86 +++++++-------- cppcryptfs/ui/SettingsPropertyPage.cpp | 44 ++++---- cppcryptfs/ui/locutils.cpp | 14 +-- cppcryptfs/ui/locutils.h | 4 +- cppcryptfs/ui/locutilsalt.cpp | 10 -- cppcryptfs/ui/locutilsalt.h | 8 -- cppcryptfs/ui/uiutil.cpp | 8 +- libcppcryptfs/config/cryptconfig.cpp | 114 +++++++++++--------- libcppcryptfs/libcppcryptfs.vcxproj | 5 + libcppcryptfs/libcppcryptfs.vcxproj.filters | 2 + 21 files changed, 237 insertions(+), 238 deletions(-) delete mode 100644 cppcryptfs/ui/locutilsalt.cpp delete mode 100644 cppcryptfs/ui/locutilsalt.h diff --git a/cppcryptfs/cppcryptfs.cpp b/cppcryptfs/cppcryptfs.cpp index 3abed4e..7085367 100755 --- a/cppcryptfs/cppcryptfs.cpp +++ b/cppcryptfs/cppcryptfs.cpp @@ -187,7 +187,7 @@ BOOL CcppcryptfsApp::InitInstance() ShowWindow(hWnd, SW_SHOWNORMAL); } } else { - ::MessageBox(NULL, LocUtils::GetStringFromResources(IDS_RUN_WINDOW_NOT_FOUND), L"cppcryptfs", MB_OK | MB_ICONERROR); + ::MessageBox(NULL, LocUtils::GetStringFromResources(IDS_RUN_WINDOW_NOT_FOUND).c_str(), L"cppcryptfs", MB_OK | MB_ICONERROR); } return FALSE; diff --git a/cppcryptfs/cppcryptfs.rc b/cppcryptfs/cppcryptfs.rc index fd782a448da59301b9a3e16913de9b5b42f832fc..e465518b1f598b24114f2a7235b108910e087adb 100644 GIT binary patch delta 4417 zcmb_gTWp(W8U9M#&UhiQYdgkxk?jP_wOB~qF$xtEO_xJMPHs+Jq>7|zoUU8yoRd|8 zHMxVkq;C>U+BBsgrcAVus30LO#<+lsB2~0(&@N@|5FHZ&(Ow`SBqW~a`~201xD^-Z zm;L8Ie9wD&-sgLrfBmU!?V@9I=E>dls$SJBPkQA$PhKj+h5W)5lxt5ouk@B5{Xo_~ za#wb$F4e0B)$=%as%BZf=9ho3d`^b;?UBE3l*gu2TAfrQDxyxQag|Y{>Wn&#t6|(f zg(tIWTBXIa?cE*0lW94)S}Uo`PH|t~Kjxpyn+)y`s7FWm0J`G{(jV}DG*?FxB! zz)?*%$FNE}l|>=WFx?l=N^rLc_wOrlnV9iON*wa@0oP{=*6Cp2W9SINXi=^3v{Qe# zHu!c9tIq;u8i&m&&WzR4Eqnx?^#JwD>PtXq#9t&e z&w~oq2`U17+$ezd^ZB$Nak^Uj(~N>UKam+4{*BSYf7{22%;b|o93~; z1J@ii@ahzDeNIgvBVFL&OWGc@Qz9nZEoe3Q=dG}fvG#E>_UOv=%Hri9V?6k{81p@f zz(3ZA{@9!z{?P3&8MiE62+6{Sd&7kY;{{RWp*&&g+%D&TnBY2(sb)JeK)%^Gvyvg1 z)hh2GvfYGO@>OASJN#AC3Dg8zp~7w;i*48M=mQz3u$ zxy!6ySQT%^3U(*^wNLxjs5#pJ)oI854$ZqZnYnfE0fRLMi&L5>v#?O;%l~5AsySDm zF&!rte-o0g-Kp?W6R7~5u-RdtHcA4Ht1uS_Ge2 z*qXq7){2%EKkb#siW7S+Gix*4BmY@Tiu)ah*W5LEB?33{>ucVo2#{zm4NTroX@-$q z#C-+dHiy|&+Ims0to3*cRFjI?uafZgD~QkTDLp`@rnZ9Zt&;pzsIur?d2r3^*--_H z9HU;?{IT*K$dl3i?@n&h2Oe@$GO+&irVPRZr>&!y%!7Dpf2-3u?l9}`P;)CSHIoYT5ghb%WmlP$1K_D`W3Ihle6J2~vTGP?j$b7*##p1pYL>H+wJOK<`8m?c(zdUf zi1WHbIG30ill?qOtCm-oJWM6YrEbk!?g6dHLZ@ushTuWt~n{PpC9r>8dig{@Wx(Gr}n~5 zjp!rcth})PSx-h|*%^^uu;YhbuaZMIT)TBI$=3CT=OSSEDP1X}=VTCjImaPewK;e( zhF+l3lJn38*?Nb5RAuoluEk;dDgRDH=)yz$y|>*Z`5aw~VFJy-8#@=VD|fKk;uOtx z)Uchi-Tt+zXyMFbEZAPxePR)dCaFS1J4w;Y$01s7XZ1CfQ*)yk2h_8eFge@yg8^AB zlI7Pz{u*=uRmHqfXWpU8MRWQy4?fL+7ZGqT{ZQ}II)ccGtCH5pFESk(M~#r5+E((sCt_c>d8S^u6RTG&mcGxqQ6gjuo@KL}x*<4TCg_pT9QDw8_0JTLIncpKMgrvSZBL#~PNL@rZWeYQ%e7 zi0m_ej^Qx<^XE8Gb|_lGZf4Jfow;iQB7dV7gKct tRBmwkCG}m$l^=clma`212U(u<%d4NNkhyou delta 67 zcmbQXkmbiC<_#s>lMir-Ozz=c1EeJ;pJV6P9K+*rYqAFi-}VEnjH@^%w^fQvu4Cex SK7o(10LtOmuE5V&#s~nDBp6)) diff --git a/cppcryptfs/cppcryptfs.vcxproj b/cppcryptfs/cppcryptfs.vcxproj index 27be5fa..96bcf5a 100755 --- a/cppcryptfs/cppcryptfs.vcxproj +++ b/cppcryptfs/cppcryptfs.vcxproj @@ -228,7 +228,6 @@ - @@ -262,9 +261,7 @@ - - - false + NotUsing NotUsing diff --git a/cppcryptfs/dokan/cryptdokan.cpp b/cppcryptfs/dokan/cryptdokan.cpp index 28a31f4..7c0653e 100755 --- a/cppcryptfs/dokan/cryptdokan.cpp +++ b/cppcryptfs/dokan/cryptdokan.cpp @@ -99,7 +99,8 @@ THE SOFTWARE. #include "../libcommonutil/commonutil.h" #include "resource.h" -#include "ui/locutilsalt.h" +#include "ui/locutils.h" +#include static DWORD g_SessionId; static BOOL g_GotSessionId = FALSE; @@ -2024,7 +2025,7 @@ int mount_crypt_fs(const WCHAR* mountpoint, const WCHAR *path, config_path = NULL; if (mountpoint == NULL) { - mes = LocUtilsAlt::GetStringFromResources(IDS_INVALID_MPOINT); + mes = LocUtils::GetStringFromResources(IDS_INVALID_MPOINT); return -1; } @@ -2032,9 +2033,9 @@ int mount_crypt_fs(const WCHAR* mountpoint, const WCHAR *path, if (mount_point_is_a_dir && !is_suitable_mountpoint(mountpoint)) { if (!PathFileExists(mountpoint)) { - mes = LocUtilsAlt::GetStringFromResources(IDS_MPOINT_DIR_NOT_EXIST); + mes = LocUtils::GetStringFromResources(IDS_MPOINT_DIR_NOT_EXIST); } else { - mes = LocUtilsAlt::GetStringFromResources(IDS_MPOINT_DIR_EMPTY_NTFS); + mes = LocUtils::GetStringFromResources(IDS_MPOINT_DIR_EMPTY_NTFS); } return -1; } @@ -2043,7 +2044,7 @@ int mount_crypt_fs(const WCHAR* mountpoint, const WCHAR *path, bool already_mounted = MountPointManager::getInstance().find(mountpoint, dummy); if (already_mounted) { - mes = LocUtilsAlt::GetStringFromResources(IDS_LETTER_MPOINT_ALREADY_USE); + mes = LocUtils::GetStringFromResources(IDS_LETTER_MPOINT_ALREADY_USE); return -1; } @@ -2061,7 +2062,7 @@ int mount_crypt_fs(const WCHAR* mountpoint, const WCHAR *path, } if (!tdata) { - mes = LocUtilsAlt::GetStringFromResources(IDS_FAILED_ALLOCATE_TDATA); + mes = LocUtils::GetStringFromResources(IDS_FAILED_ALLOCATE_TDATA); throw(-1); } @@ -2158,7 +2159,7 @@ int mount_crypt_fs(const WCHAR* mountpoint, const WCHAR *path, if (!config->read(mes, config_path, reverse)) { if (mes.length() < 1) { - mes = LocUtilsAlt::GetStringFromResources(IDS_UNABLE_LOAD_CONF); + mes = LocUtils::GetStringFromResources(IDS_UNABLE_LOAD_CONF); } throw(-1); } @@ -2186,7 +2187,7 @@ int mount_crypt_fs(const WCHAR* mountpoint, const WCHAR *path, #endif if (!config->decrypt_key(password)) { - mes = LocUtilsAlt::GetStringFromResources(IDS_PASS_INCORRECT); + mes = LocUtils::GetStringFromResources(IDS_PASS_INCORRECT); throw(-1); } @@ -2196,7 +2197,7 @@ int mount_crypt_fs(const WCHAR* mountpoint, const WCHAR *path, throw(-1); } } catch (...) { - mes = LocUtilsAlt::GetStringFromResources(IDS_UNABLE_INIT_EME); + mes = LocUtils::GetStringFromResources(IDS_UNABLE_INIT_EME); throw(-1); } } @@ -2205,7 +2206,7 @@ int mount_crypt_fs(const WCHAR* mountpoint, const WCHAR *path, try { con->m_siv.SetKey(config->GetMasterKey(), 32, config->m_HKDF, config); } catch (...) { - mes = LocUtilsAlt::GetStringFromResources(IDS_UNABLE_INIT_AESSIV); + mes = LocUtils::GetStringFromResources(IDS_UNABLE_INIT_AESSIV); throw(-1); } } @@ -2272,7 +2273,7 @@ int mount_crypt_fs(const WCHAR* mountpoint, const WCHAR *path, if (opts.mountmanagerwarn && !have_security_name_privilege()) { if (!mountmanager_continue_mounting()) { - mes = LocUtilsAlt::GetStringFromResources(IDS_CANCELED_BY_USER); + mes = LocUtils::GetStringFromResources(IDS_CANCELED_BY_USER); throw(-1); } } @@ -2287,7 +2288,7 @@ int mount_crypt_fs(const WCHAR* mountpoint, const WCHAR *path, && !con->GetConfig()->m_reverse; if (!con->FinalInitBeforeMounting(opts.cachekeysinmemory)) { - mes = LocUtilsAlt::GetStringFromResources(IDS_FINAL_INIT_FAILED); + mes = LocUtils::GetStringFromResources(IDS_FINAL_INIT_FAILED); throw(-1); } @@ -2297,7 +2298,7 @@ int mount_crypt_fs(const WCHAR* mountpoint, const WCHAR *path, hThread = CreateThread(NULL, 0, CryptThreadProc, tdata, 0, NULL); if (!hThread) { - mes = LocUtilsAlt::GetStringFromResources(IDS_UNABLE_CREATE_TREAD); + mes = LocUtils::GetStringFromResources(IDS_UNABLE_CREATE_TREAD); throw(-1); } @@ -2306,7 +2307,7 @@ int mount_crypt_fs(const WCHAR* mountpoint, const WCHAR *path, // MountPointManager owns tdata from this point on, even if it fails to add (will delete it) if (!MountPointManager::getInstance().add(mountpoint, tdata)) { - mes = LocUtilsAlt::GetStringFromResources(IDS_UNABLE_ADD_MPOINT); + mes = LocUtils::GetStringFromResources(IDS_UNABLE_ADD_MPOINT); throw(-1); } @@ -2348,12 +2349,12 @@ int mount_crypt_fs(const WCHAR* mountpoint, const WCHAR *path, if (wait_result != WAIT_OBJECT_0) { if (wait_result == (WAIT_OBJECT_0 + 1)) { // thread exited without mounting - mes = LocUtilsAlt::GetStringFromResources(IDS_MOUNT_FAILED); + mes = LocUtils::GetStringFromResources(IDS_MOUNT_FAILED); } else if (wait_result == WAIT_TIMEOUT) { - mes = LocUtilsAlt::GetStringFromResources(IDS_MOUNT_TIMED_OUT); + mes = LocUtils::GetStringFromResources(IDS_MOUNT_TIMED_OUT); tdata = NULL; // deleting it would probably cause crash } else { - mes = LocUtilsAlt::GetStringFromResources(IDS_MOUNT_ERROR_WAITING); + mes = LocUtils::GetStringFromResources(IDS_MOUNT_ERROR_WAITING); tdata = NULL; // deleting it would probably cause crash } throw(-1); @@ -2375,7 +2376,7 @@ BOOL unmount_crypt_fs(const WCHAR* mountpoint, bool wait, wstring& mes) { wstring mpstr; if (!MountPointManager::getInstance().find(mountpoint, mpstr)) { - mes += LocUtilsAlt::GetStringFromResources(IDS_UNABLE_FIND_MPOINT); + mes += LocUtils::GetStringFromResources(IDS_UNABLE_FIND_MPOINT); return FALSE; } if (!DokanRemoveMountPoint(mpstr.c_str())) { @@ -2387,7 +2388,10 @@ BOOL unmount_crypt_fs(const WCHAR* mountpoint, bool wait, wstring& mes) { bool res = MountPointManager::getInstance().wait_and_destroy(mpstr.c_str()); if (!res) { CString strMsg; - strMsg.Format(LocUtilsAlt::GetStringFromResources(IDS_WAIT_UNMOUNT_ERROR), GetWindowsErrorString(GetLastError())); + strMsg.Format( + LocUtils::GetStringFromResources(IDS_WAIT_UNMOUNT_ERROR) + .c_str(), + GetWindowsErrorString(GetLastError())); mes += strMsg; } return res; @@ -2426,7 +2430,7 @@ BOOL write_volume_name_if_changed(WCHAR dl, wstring& mes) { CryptThreadData *tdata = MountPointManager::getInstance().get(fs_root.c_str()); if (!tdata) { - mes += LocUtilsAlt::GetStringFromResources(IDS_MPOINT_NOT_FOUND); + mes += LocUtils::GetStringFromResources(IDS_MPOINT_NOT_FOUND); return FALSE; } @@ -2435,7 +2439,7 @@ BOOL write_volume_name_if_changed(WCHAR dl, wstring& mes) { CryptContext *con = &tdata->con; if (!con) { - mes += LocUtilsAlt::GetStringFromResources(IDS_MPOINT_NULL); + mes += LocUtils::GetStringFromResources(IDS_MPOINT_NULL); return FALSE; } @@ -2449,7 +2453,7 @@ BOOL write_volume_name_if_changed(WCHAR dl, wstring& mes) { DWORD error = GetLastError(); DbgPrint(L"update volume name error = %u\n", error); CString strMsg; - strMsg.Format(LocUtilsAlt::GetStringFromResources(IDS_UNABLE_GET_VOLUME_INFO), GetWindowsErrorString(error)); + strMsg.Format(LocUtils::GetStringFromResources(IDS_UNABLE_GET_VOLUME_INFO).c_str(), GetWindowsErrorString(error)); mes += strMsg; return FALSE; } @@ -2458,7 +2462,7 @@ BOOL write_volume_name_if_changed(WCHAR dl, wstring& mes) { con->GetConfig()->m_VolumeName = volbuf; bool res = con->GetConfig()->write_updated_config_file(nullptr, nullptr, 0); if (!res) { - mes += LocUtilsAlt::GetStringFromResources(IDS_UNABLE_WRITE_NEW_VOL_NAME); + mes += LocUtils::GetStringFromResources(IDS_UNABLE_WRITE_NEW_VOL_NAME); return FALSE; } } @@ -2511,7 +2515,7 @@ wstring transform_path(const wchar_t* path, wstring& mes) _locale_t locale = _create_locale(LC_ALL, ""); if (locale == NULL) { - mes = LocUtilsAlt::GetStringFromResources(IDS_CANNOT_CREATE_LOCALE); + mes = LocUtils::GetStringFromResources(IDS_CANNOT_CREATE_LOCALE); return nullptr; } @@ -2534,7 +2538,7 @@ wstring transform_path(const wchar_t* path, wstring& mes) _free_locale(locale); if (!tdata) { - mes = LocUtilsAlt::GetStringFromResources(IDS_NOT_FOUND_MPOINT_BASE_DIR); + mes = LocUtils::GetStringFromResources(IDS_NOT_FOUND_MPOINT_BASE_DIR); return L""; } @@ -2544,12 +2548,12 @@ wstring transform_path(const wchar_t* path, wstring& mes) if (tdata->con.GetConfig()->m_reverse) { if (!encrypt_path(&tdata->con, p, storage)) { - mes = LocUtilsAlt::GetStringFromResources(IDS_FAILED_CONVERT_PATH); + mes = LocUtils::GetStringFromResources(IDS_FAILED_CONVERT_PATH); return L""; } } else { if (!unencrypt_path(&tdata->con, p, storage)) { - mes = LocUtilsAlt::GetStringFromResources(IDS_FAILED_UNENCRYPT_PATH); + mes = LocUtils::GetStringFromResources(IDS_FAILED_UNENCRYPT_PATH); return L""; } } @@ -2563,7 +2567,7 @@ wstring transform_path(const wchar_t* path, wstring& mes) FileNameEnc enc(&dfi, p, nullptr, false); auto pconv = static_cast(enc); if (!pconv) { - mes = LocUtilsAlt::GetStringFromResources(IDS_FAILED_ENCRYPT_PATH); + mes = LocUtils::GetStringFromResources(IDS_FAILED_ENCRYPT_PATH); return L""; } return pconv + std::size(L"\\\\?\\") - 1; @@ -2576,19 +2580,19 @@ BOOL list_files(const WCHAR *path, list &findDatas, err_mes = L""; if (!path) { - err_mes = LocUtilsAlt::GetStringFromResources(IDS_PATH_NULL); + err_mes = LocUtils::GetStringFromResources(IDS_PATH_NULL); return FALSE; } if (wcslen(path) > MAX_PATH - 1) { - err_mes = LocUtilsAlt::GetStringFromResources(IDS_PATH_TOO_LONG); + err_mes = LocUtils::GetStringFromResources(IDS_PATH_TOO_LONG); return FALSE; } WCHAR newpath[MAX_PATH + 1]; if (!PathCanonicalize(newpath, path)) { - err_mes = LocUtilsAlt::GetStringFromResources(IDS_FAILED_CANONICALIZE_PATH); + err_mes = LocUtils::GetStringFromResources(IDS_FAILED_CANONICALIZE_PATH); return FALSE; } @@ -2597,17 +2601,17 @@ BOOL list_files(const WCHAR *path, list &findDatas, int dl = *path; if (dl < 'A' || dl > 'Z') { - err_mes = LocUtilsAlt::GetStringFromResources(IDS_INVALID_DRIVE_LETTER); + err_mes = LocUtils::GetStringFromResources(IDS_INVALID_DRIVE_LETTER); return FALSE; } if (wcslen(path) < 3) { - err_mes = LocUtilsAlt::GetStringFromResources(IDS_PATH_TOO_SHORT); + err_mes = LocUtils::GetStringFromResources(IDS_PATH_TOO_SHORT); return FALSE; } if (path[1] != ':' || path[2] != '\\') { - err_mes = LocUtilsAlt::GetStringFromResources(IDS_INVALID_PATH); + err_mes = LocUtils::GetStringFromResources(IDS_INVALID_PATH); return FALSE; } @@ -2621,7 +2625,7 @@ BOOL list_files(const WCHAR *path, list &findDatas, _locale_t locale = _create_locale(LC_ALL, ""); if (locale == NULL) { - err_mes = LocUtilsAlt::GetStringFromResources(IDS_CANNOT_CREATE_LOCALE); + err_mes = LocUtils::GetStringFromResources(IDS_CANNOT_CREATE_LOCALE); return FALSE; } @@ -2647,7 +2651,7 @@ BOOL list_files(const WCHAR *path, list &findDatas, _free_locale(locale); if (!tdata) { - err_mes = LocUtilsAlt::GetStringFromResources(IDS_DRIVE_NOT_MOUNTED); + err_mes = LocUtils::GetStringFromResources(IDS_DRIVE_NOT_MOUNTED); return FALSE; } @@ -2677,7 +2681,7 @@ BOOL list_files(const WCHAR *path, list &findDatas, if (find_files(con, filePath.CorrectCasePath(), filePath, crypt_fill_find_data_list, NULL, &findDatas) != 0) { - err_mes = LocUtilsAlt::GetStringFromResources(IDS_ERROR_LISTING_FILES); + err_mes = LocUtils::GetStringFromResources(IDS_ERROR_LISTING_FILES); return FALSE; } } else if (PathFileExists(filePath)) { @@ -2704,7 +2708,7 @@ BOOL list_files(const WCHAR *path, list &findDatas, } else { - err_mes = LocUtilsAlt::GetStringFromResources(IDS_PATH_NOT_EXIST); + err_mes = LocUtils::GetStringFromResources(IDS_PATH_NOT_EXIST); return FALSE; } @@ -2766,7 +2770,7 @@ bool check_dokany_version(wstring& mes) vector v; if (!get_dokany_version(ver, v)) { - mes = LocUtilsAlt::GetStringFromResources(IDS_UNABLE_GET_DOKANY_VERSION); + mes = LocUtils::GetStringFromResources(IDS_UNABLE_GET_DOKANY_VERSION); return false; } @@ -2783,21 +2787,21 @@ bool check_dokany_version(wstring& mes) if (major != required_major) { CString strMsg; - strMsg.Format(LocUtilsAlt::GetStringFromResources(IDS_DOKANY_VER_NOT_COMPATIBLE), ver, required_ver); + strMsg.Format(LocUtils::GetStringFromResources(IDS_DOKANY_VER_NOT_COMPATIBLE).c_str(), ver, required_ver); mes = strMsg; return false; // error } if (major == required_major && middle < required_middle) { CString strMsg; - strMsg.Format(LocUtilsAlt::GetStringFromResources(IDS_DOKANY_VER_NOT_COMPATIBLE), ver, required_ver); + strMsg.Format(LocUtils::GetStringFromResources(IDS_DOKANY_VER_NOT_COMPATIBLE).c_str(), ver, required_ver); mes = strMsg; return false; // error } if (major == required_major && middle > required_middle) { CString strMsg; - strMsg.Format(LocUtilsAlt::GetStringFromResources(IDS_DOKANY_VER_NOT_TESTED), ver, required_ver); + strMsg.Format(LocUtils::GetStringFromResources(IDS_DOKANY_VER_NOT_TESTED).c_str(), ver, required_ver); mes = strMsg; return true; // warning } @@ -2840,7 +2844,7 @@ static void InitLogging() if (!PathFileExists(logdir)) { CString strMsg; - strMsg.Format(LocUtilsAlt::GetStringFromResources(IDS_UNABLE_INIT_LOGGING), logdir); + strMsg.Format(LocUtils::GetStringFromResources(IDS_UNABLE_INIT_LOGGING).c_str(), logdir); ::MessageBox(NULL, strMsg, L"cppcryptfs", MB_OK | MB_ICONEXCLAMATION); return; } @@ -2878,11 +2882,11 @@ static void InitLogging() if (result == 0) { CString strMsg; - strMsg.Format(LocUtilsAlt::GetStringFromResources(IDS_LOGGING_TO_LOGNAME), logname); + strMsg.Format(LocUtils::GetStringFromResources(IDS_LOGGING_TO_LOGNAME).c_str(), logname); ::MessageBox(NULL, strMsg, L"cppcryptfs", MB_OK | MB_ICONINFORMATION); } else { CString strMsg; - strMsg.Format(LocUtilsAlt::GetStringFromResources(IDS_UNABLE_OPEN_LOGNAME), logname); + strMsg.Format(LocUtils::GetStringFromResources(IDS_UNABLE_OPEN_LOGNAME).c_str(), logname); ::MessageBox(NULL, strMsg, L"cppcryptfs", MB_OK | MB_ICONERROR); } diff --git a/cppcryptfs/resource.h b/cppcryptfs/resource.h index 5358e7705a3cd2feed624381716e02c48b18e3be..61dbda4741c44f41c8962adb4af3f8ffda69d256 100755 GIT binary patch literal 25874 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 delta 3698 zcmaJ@T}&I<752|yj2VnE4iIB(57>qnF#kVETgMm!gE50K#sP=FWO=BfDx2_7<)syg zqSdNeMZhPm_Mz$~t17Bi)i&AYp;{$Xf}$wOMiE5Ss;X95vWiw!AF8kqRUWFS=Z#O;^|3x&KA zuda(Y({2xbr?+Xf6wao*9)H&d@bEnw`7jxo^pLS0UL%JVgI%Gk{!RKWOt&`3+@Bkq ziaiTbtuB0SuoX!&Esiu^4&*fcWw2-?Ag%?Rv8{+^g2Cv1>^GMl5@_553;IFoB{Af!PcK}^h50b~N zxKvexjjA+$s1ng>m#|K2$Ih$|pvvh%xVjr_)e^R8*&P|84?;L0;F_Zae{qN~9FdSZ z62{gM(bz*c-9Om`Lya4aH3?j(nIl>^^c@0{b#Cyrc6e(uGVNuB2U49EU)9#&dF>pb zXm_FkuWNlcUsp$8(`ACpe^OV6S9NKk+~^mua5R9cN5gn{RD{(@XLXL^x-)@)I|tEH z&!jf11YEE8V!J*JgDZ?Ett+kw9?~*3L?F`o4XvlNtnM%*TG!kW?9j4%B1qHv*po8$ z>UzLp+~KWodVPp^li2d6W%_=z2Nt0lVIhePK|*IEhgU+J{!_TxC=$XM!futB@%zRA zY4pjKF7(oFg1%vHcPnPOy_S-klb;~zJQe$A3kV_;z>&i?qeBaA613Tn)@eRxO2>g zN5?X72PNDOa##x{=s&l2w4Ok+HHME{)1*Tc=u8H2tIlLI&3~HOEO-iGJz<74Y}d$e@=Rwj?8G>13>VK}UQaj2X%B3}9Cn7)NM!4I z%Pb1Ux5d<)Fg}m98W&kDn4Ec?Dkn|eSbiGnz4%k?q!Jg8{t+)+BkJVIpM|8lM!Gc7 zGmZ%tMns}HaDSw`h{tV>cD`e^dXrJ#n1)4p_(8Kz8B^`C1inIw^6F%@0p|ZS1 zFe!e*h4l%R0Xs>AG`4ePem5(S{L(D&>e5C7;ag?KO5S&BFf-{ic z-J~DqlG?V()$DoFhtHE<=3kaNXpL`(8lEo5@bqytSNWQ+O#29JmXfqCtxKrqWL)K8 zH{@-=%7htwsvshzJ$rC**aIYdQdYjR-4%~>~Pr?{U!on;+*xSu|qojlZI`?FK|%FAcNK54(rsHe8#4fVQv!GyaR zbw*h6!znk(s6)?$y;DAjr%o`;p7PVKm!6PpKcuNAU5#^e>8E*Q=hS-8V`(l+S{LX1 zIG?pZn&)AimvdJ@WuELd%hJ VUm?0T=FZAD6lnkFKb$>h_#fIo{sjO4 diff --git a/cppcryptfs/ui/CreatePropertyPage.cpp b/cppcryptfs/ui/CreatePropertyPage.cpp index 6a1ef6d..8a8c2d2 100755 --- a/cppcryptfs/ui/CreatePropertyPage.cpp +++ b/cppcryptfs/ui/CreatePropertyPage.cpp @@ -43,7 +43,7 @@ THE SOFTWARE. #include "util/util.h" #include "locutils.h" -static const CString strMsgPlainText = LocUtils::GetStringFromResources(IDS_PLAIN_TEXT); +static CString strMsgPlainText = LocUtils::GetStringFromResources(IDS_PLAIN_TEXT).c_str(); static const WCHAR *filename_encryption_types[] = { L"AES256-EME", @@ -113,7 +113,7 @@ void CCreatePropertyPage::CreateCryptfs() LockZeroBuffer password2(MAX_PASSWORD_LEN + 1, false); if (!password.IsLocked() || !password2.IsLocked()) { - MessageBox(LocUtils::GetStringFromResources(IDS_COULD_NOT_LOCK_BUFFER), L"cppcryptefs", MB_OK | MB_ICONERROR); + MessageBox(LocUtils::GetStringFromResources(IDS_COULD_NOT_LOCK_BUFFER).c_str(), L"cppcryptefs", MB_OK | MB_ICONERROR); return; } @@ -123,7 +123,7 @@ void CCreatePropertyPage::CreateCryptfs() return; if (wcslen(password.m_buf) < 1) { - MessageBox(LocUtils::GetStringFromResources(IDS_PASSWORD_EMPTY), L"cppcryptfs", MB_OK | MB_ICONEXCLAMATION); + MessageBox(LocUtils::GetStringFromResources(IDS_PASSWORD_EMPTY).c_str(), L"cppcryptfs", MB_OK | MB_ICONEXCLAMATION); return; } @@ -133,12 +133,12 @@ void CCreatePropertyPage::CreateCryptfs() return; if (wcslen(password2.m_buf) < 1) { - MessageBox(LocUtils::GetStringFromResources(IDS_PASSWORD_REPEAT_EMPTY), L"cppcryptfs", MB_OK | MB_ICONEXCLAMATION); + MessageBox(LocUtils::GetStringFromResources(IDS_PASSWORD_REPEAT_EMPTY).c_str(), L"cppcryptfs", MB_OK | MB_ICONEXCLAMATION); return; } if (wcscmp(password.m_buf, password2.m_buf)) { - MessageBox(LocUtils::GetStringFromResources(IDS_PASSWORD_DO_NOT_MATCH), L"cppcryptfs", MB_OK | MB_ICONEXCLAMATION); + MessageBox(LocUtils::GetStringFromResources(IDS_PASSWORD_DO_NOT_MATCH).c_str(), L"cppcryptfs", MB_OK | MB_ICONEXCLAMATION); return; } @@ -150,17 +150,17 @@ void CCreatePropertyPage::CreateCryptfs() pWnd->GetWindowTextW(cpath); if (cpath.GetLength() < 1) { - MessageBox(LocUtils::GetStringFromResources(IDS_PATH_EMPTY), L"cppcryptfs", MB_OK | MB_ICONEXCLAMATION); + MessageBox(LocUtils::GetStringFromResources(IDS_PATH_EMPTY).c_str(), L"cppcryptfs", MB_OK | MB_ICONEXCLAMATION); return; } if (!PathFileExists(cpath)) { CString mes; - mes.Format(LocUtils::GetStringFromResources(IDS_PATH_DOES_NOT_EXIST), cpath); + mes.Format(LocUtils::GetStringFromResources(IDS_PATH_DOES_NOT_EXIST).c_str(), cpath); if (MessageBox(mes, L"cppcryptfs", MB_YESNO | MB_ICONINFORMATION) == IDYES) { if (!CreateDirectory(cpath, NULL)) { - mes.Format(LocUtils::GetStringFromResources(IDS_PATH_COULD_NOT_CREATE), cpath); + mes.Format(LocUtils::GetStringFromResources(IDS_PATH_COULD_NOT_CREATE).c_str(), cpath); MessageBox(mes, L"cppcryptfs", MB_OK | MB_ICONEXCLAMATION); return; } @@ -259,7 +259,7 @@ void CCreatePropertyPage::CreateCryptfs() CString mes; - reverse ? mes.Format(LocUtils::GetStringFromResources(IDS_CREATED_REVERSE_FS), cpath) : mes.Format(LocUtils::GetStringFromResources(IDS_CREATED_FORWARD_FS), cpath); + reverse ? mes.Format(LocUtils::GetStringFromResources(IDS_CREATED_REVERSE_FS).c_str(), cpath) : mes.Format(LocUtils::GetStringFromResources(IDS_CREATED_FORWARD_FS).c_str(), cpath); MessageBox(mes, L"cppcryptfs", MB_OK | MB_ICONINFORMATION); @@ -345,7 +345,7 @@ void CCreatePropertyPage::OnClickedSelect() return; if (!IsDlgButtonChecked(IDC_REVERSE) && !can_delete_directory(cpath, TRUE)) { - MessageBox(LocUtils::GetStringFromResources(IDS_DIRECTORY_NOT_EMPTY), L"cppcryptfs", MB_OK | MB_ICONEXCLAMATION); + MessageBox(LocUtils::GetStringFromResources(IDS_DIRECTORY_NOT_EMPTY).c_str(), L"cppcryptfs", MB_OK | MB_ICONEXCLAMATION); return; } @@ -452,7 +452,7 @@ BOOL CCreatePropertyPage::OnInitDialog() pLbox->EnableWindow(IsDlgButtonChecked(IDC_LONG_FILE_NAMES)); if (!m_password.ArePasswordBuffersLocked() || !m_password2.ArePasswordBuffersLocked()) { - MessageBox(LocUtils::GetStringFromResources(IDS_UNABLE_LOCK_BUFFERS), L"cppcryptfs", MB_OK | MB_ICONERROR); + MessageBox(LocUtils::GetStringFromResources(IDS_UNABLE_LOCK_BUFFERS).c_str(), L"cppcryptfs", MB_OK | MB_ICONERROR); } const auto scryptN = theApp.GetProfileIntW(L"CreateOptions", L"ScryptN", DEFAULT_SCRYPTN); @@ -582,11 +582,11 @@ void CCreatePropertyPage::OnSelchangeScryptn() int mem = (1<= 1024) { mem /= 1024; - suffix.Format(LocUtils::GetStringFromResources(IDS_GB_REQUIRED), mem); + suffix.Format(LocUtils::GetStringFromResources(IDS_GB_REQUIRED).c_str(), mem); } auto pScryptMemReq = (CStatic*)GetDlgItem(IDC_SCRYPTMEMREQ); diff --git a/cppcryptfs/ui/CryptAboutPropertyPage.cpp b/cppcryptfs/ui/CryptAboutPropertyPage.cpp index 28a149a..e642a3a 100755 --- a/cppcryptfs/ui/CryptAboutPropertyPage.cpp +++ b/cppcryptfs/ui/CryptAboutPropertyPage.cpp @@ -104,14 +104,14 @@ BEGIN_MESSAGE_MAP(CCryptAboutPropertyPage, CCryptPropertyPage) ON_NOTIFY(LVN_ITEMCHANGED, IDC_COMPONENTS_LIST, &CCryptAboutPropertyPage::OnItemchangedComponentsList) END_MESSAGE_MAP() -static const CString strMsgCppcryptfs = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_CPPCRYPTFS); -static const CString strMsgOpenSSL = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_OPENSSL); -static const CString strMsgRapidJSON = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_RAPIDJSON); -static const CString strMsgDokanyMir = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_DOKANY_MIR); -static const CString strMsgDokanyLib = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_DOKANY_LIB); -static const CString strMsgSecuryEdit = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_SECURE_EDIT); -static const CString strMsgGetOpt = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_GETOPT_PORT); -static const CString strMsgAESSIV = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_AES_SIV); +static CString strMsgCppcryptfs = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_CPPCRYPTFS).c_str(); +static CString strMsgOpenSSL = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_OPENSSL).c_str(); +static CString strMsgRapidJSON = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_RAPIDJSON).c_str(); +static CString strMsgDokanyMir = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_DOKANY_MIR).c_str(); +static CString strMsgDokanyLib = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_DOKANY_LIB).c_str(); +static CString strMsgSecuryEdit = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_SECURE_EDIT).c_str(); +static CString strMsgGetOpt = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_GETOPT_PORT).c_str(); +static CString strMsgAESSIV = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_AES_SIV).c_str(); static const WCHAR* components[] = { strMsgCppcryptfs, @@ -194,21 +194,21 @@ BOOL CCryptAboutPropertyPage::OnInitDialog() CString aes_ni; if (AES::use_aes_ni()) { - aes_ni = LocUtils::GetStringFromResources(IDS_AESNI_DETECTED); + aes_ni = LocUtils::GetStringFromResources(IDS_AESNI_DETECTED).c_str(); } else { - aes_ni = LocUtils::GetStringFromResources(IDS_AESNI_NOT_DETECTED); + aes_ni = LocUtils::GetStringFromResources(IDS_AESNI_NOT_DETECTED).c_str(); } CString strMsgLibraryVersions; - strMsgLibraryVersions.Format(LocUtils::GetStringFromResources(IDS_LIBRARY_VERSIONS), openssl_ver, dokany_version); + strMsgLibraryVersions.Format(LocUtils::GetStringFromResources(IDS_LIBRARY_VERSIONS).c_str(), openssl_ver, dokany_version); SetDlgItemText(IDC_LINKAGES, strMsgLibraryVersions); bool is_admin = theApp.IsRunningAsAdministrator(); int prod_bit_depth = sizeof(void*) == 8 ? 64 : 32; - CString prod_admin = (is_admin ? L" " + LocUtils::GetStringFromResources(IDS_ADMIN) : L""); + CString prod_admin = (is_admin ? CString(L" ") + LocUtils::GetStringFromResources(IDS_ADMIN).c_str() : CString(L"")); CString strMsgCopyright; - strMsgCopyright.Format(LocUtils::GetStringFromResources(IDS_ABOUT_COPYRIGHT), ver.c_str(), prod_bit_depth, prod_admin, aes_ni); + strMsgCopyright.Format(LocUtils::GetStringFromResources(IDS_ABOUT_COPYRIGHT).c_str(), ver.c_str(), prod_bit_depth, prod_admin, aes_ni); SetDlgItemText(IDC_PROD_VERSION, strMsgCopyright); SetDlgItemText(IDC_COPYRIGHT, copyright.c_str()); diff --git a/cppcryptfs/ui/CryptPropertySheet.cpp b/cppcryptfs/ui/CryptPropertySheet.cpp index c16f26a..43748f6 100755 --- a/cppcryptfs/ui/CryptPropertySheet.cpp +++ b/cppcryptfs/ui/CryptPropertySheet.cpp @@ -82,7 +82,7 @@ BOOL CCryptPropertySheet::CanClose() { if (!MountPointManager::getInstance().empty()) { - if (MessageBox(LocUtils::GetStringFromResources(IDS_DISMOUNT_ALL_ON_EXIT), L"cppcryptfs", + if (MessageBox(LocUtils::GetStringFromResources(IDS_DISMOUNT_ALL_ON_EXIT).c_str(), L"cppcryptfs", MB_YESNO | MB_ICONEXCLAMATION) == IDYES) { CString open_handles_mes = CheckOpenHandles(m_hWnd, nullptr, true, false).c_str(); diff --git a/cppcryptfs/ui/FolderDialog.cpp b/cppcryptfs/ui/FolderDialog.cpp index f8521de..0e061a3 100755 --- a/cppcryptfs/ui/FolderDialog.cpp +++ b/cppcryptfs/ui/FolderDialog.cpp @@ -46,13 +46,12 @@ CFolderDialog::CFolderDialog(LPCTSTR lpszFolderName, DWORD dwFlags, CWnd* pParen else m_bi.hwndOwner = pParentWnd->GetSafeHwnd(); - static CString strMessageSelDir; - strMessageSelDir = LocUtils::GetStringFromResources(IDS_SELECT_DIRECTORY); + m_strTitleHolder = LocUtils::GetStringFromResources(IDS_SELECT_DIRECTORY).c_str(); // Fill in the rest of the structure m_bi.pidlRoot = NULL; m_bi.pszDisplayName = m_szDisplayName; - m_bi.lpszTitle = (LPCTSTR)strMessageSelDir; + m_bi.lpszTitle = m_strTitleHolder; m_bi.ulFlags = dwFlags | BIF_NEWDIALOGSTYLE; m_bi.lpfn = BrowseDirectoryCallback; m_bi.lParam = (LPARAM)this; diff --git a/cppcryptfs/ui/FolderDialog.h b/cppcryptfs/ui/FolderDialog.h index 2daff61..d270b64 100755 --- a/cppcryptfs/ui/FolderDialog.h +++ b/cppcryptfs/ui/FolderDialog.h @@ -51,6 +51,8 @@ friend static int CALLBACK BrowseDirectoryCallback( HWND m_hDialogBox; + CString m_strTitleHolder; + }; diff --git a/cppcryptfs/ui/FsInfoDialog.cpp b/cppcryptfs/ui/FsInfoDialog.cpp index ecfdcea..06298e9 100644 --- a/cppcryptfs/ui/FsInfoDialog.cpp +++ b/cppcryptfs/ui/FsInfoDialog.cpp @@ -89,13 +89,13 @@ BOOL CFsInfoDialog::OnInitDialog() CDialog::OnInitDialog(); CString strMsgYes, strMsgNo, strMsgNA, strMsgReverse, strMsgForward, strMsgKB, strMsgSec, strMsgInfinite, strMsgNone; - strMsgYes = LocUtils::GetStringFromResources(IDS_FSINFO_YES); - strMsgNo = LocUtils::GetStringFromResources(IDS_FSINFO_NO); - strMsgNA = LocUtils::GetStringFromResources(IDS_FSINFO_NA); - strMsgReverse = LocUtils::GetStringFromResources(IDS_FSINFO_REVERSE); - strMsgForward = LocUtils::GetStringFromResources(IDS_FSINFO_FORWARD); - strMsgInfinite = LocUtils::GetStringFromResources(IDS_FSINFO_INFINITE); - strMsgNone = LocUtils::GetStringFromResources(IDS_FSINFO_NAME_ENCRYPTION_NO); + strMsgYes = LocUtils::GetStringFromResources(IDS_FSINFO_YES).c_str(); + strMsgNo = LocUtils::GetStringFromResources(IDS_FSINFO_NO).c_str(); + strMsgNA = LocUtils::GetStringFromResources(IDS_FSINFO_NA).c_str(); + strMsgReverse = LocUtils::GetStringFromResources(IDS_FSINFO_REVERSE).c_str(); + strMsgForward = LocUtils::GetStringFromResources(IDS_FSINFO_FORWARD).c_str(); + strMsgInfinite = LocUtils::GetStringFromResources(IDS_FSINFO_INFINITE).c_str(); + strMsgNone = LocUtils::GetStringFromResources(IDS_FSINFO_NAME_ENCRYPTION_NO).c_str(); LPCWSTR yes = strMsgYes; LPCWSTR no = strMsgNo; @@ -131,13 +131,13 @@ BOOL CFsInfoDialog::OnInitDialog() wstring txt; txt = to_wstring(m_info.ioBufferSize); - strMsgKB.Format(LocUtils::GetStringFromResources(IDS_FSINFO_KB), txt); + strMsgKB.Format(LocUtils::GetStringFromResources(IDS_FSINFO_KB).c_str(), txt); SetDlgItemText(IDC_IO_BUF_SIZE, strMsgKB); txt = m_info.multhreaded ? yes : no; SetDlgItemText(IDC_THREADS, txt.c_str()); if (m_info.cacheTTL > 0) { txt = to_wstring(m_info.cacheTTL); - strMsgSec.Format(LocUtils::GetStringFromResources(IDS_FSINFO_SEC), txt); + strMsgSec.Format(LocUtils::GetStringFromResources(IDS_FSINFO_SEC).c_str(), txt); SetDlgItemText(IDC_CACHE_TTL, strMsgSec); } else { SetDlgItemText(IDC_CACHE_TTL, strMsgInfinite); diff --git a/cppcryptfs/ui/MountPropertyPage.cpp b/cppcryptfs/ui/MountPropertyPage.cpp index 48ef1f8..47f2853 100644 --- a/cppcryptfs/ui/MountPropertyPage.cpp +++ b/cppcryptfs/ui/MountPropertyPage.cpp @@ -154,7 +154,7 @@ void CMountPropertyPage::DefaultAction() { CString mes = Mount(); - if (mes.GetLength() > 0 && mes != LocUtils::GetStringFromResources(IDS_PASS_CANNOT_BE_EMPTY)) + if (mes.GetLength() > 0 && mes != LocUtils::GetStringFromResources(IDS_PASS_CANNOT_BE_EMPTY).c_str()) MessageBox(mes, L"cppcryptfs", MB_OK | MB_ICONEXCLAMATION); } @@ -169,26 +169,26 @@ CString CMountPropertyPage::Mount(LPCWSTR argPath, LPCWSTR argMountPoint, LPCWST LockZeroBuffer password(MAX_PASSWORD_LEN + 1, false); if (!password.IsLocked()) { - return LocUtils::GetStringFromResources(IDS_UNABLE_LOCK_BUFFER); + return LocUtils::GetStringFromResources(IDS_UNABLE_LOCK_BUFFER).c_str(); } if (wcscpy_s(password.m_buf, MAX_PASSWORD_LEN + 1, argPassword ? argPassword : pPass->m_strRealText)) { - return LocUtils::GetStringFromResources(IDS_UNABLE_GET_PASS); + return LocUtils::GetStringFromResources(IDS_UNABLE_GET_PASS).c_str(); } if (wcslen(password.m_buf) < 1) { - return LocUtils::GetStringFromResources(IDS_PASS_CANNOT_BE_EMPTY); + return LocUtils::GetStringFromResources(IDS_PASS_CANNOT_BE_EMPTY).c_str(); } CListCtrl *pList = (CListCtrl*)GetDlgItem(IDC_DRIVE_LETTERS); if (!pList) - return LocUtils::GetStringFromResources(IDS_UNABLE_GET_LIST); + return LocUtils::GetStringFromResources(IDS_UNABLE_GET_LIST).c_str(); pos = pList->GetFirstSelectedItemPosition(); if (!pos) - return LocUtils::GetStringFromResources(IDS_UNABLE_GET_SELECTED); + return LocUtils::GetStringFromResources(IDS_UNABLE_GET_SELECTED).c_str(); int nItem = -1; @@ -202,7 +202,7 @@ CString CMountPropertyPage::Mount(LPCWSTR argPath, LPCWSTR argMountPoint, LPCWST if (nItem < 0) { if (is_mountpoint_a_drive(str)) { CString strMsg; - strMsg.Format(LocUtils::GetStringFromResources(IDS_MPOINT_ALREADY_USED), str); + strMsg.Format(LocUtils::GetStringFromResources(IDS_MPOINT_ALREADY_USED).c_str(), str); return strMsg; } else { int i = pList->GetItemCount(); @@ -222,14 +222,14 @@ CString CMountPropertyPage::Mount(LPCWSTR argPath, LPCWSTR argMountPoint, LPCWST } if (nItem < 0) - return LocUtils::GetStringFromResources(IDS_UNABLE_FIND_ITEM); + return LocUtils::GetStringFromResources(IDS_UNABLE_FIND_ITEM).c_str(); CString cmp = argMountPoint && wcslen(argMountPoint) > 0 ? (wcslen(argMountPoint) == 1 ? CString(*argMountPoint) + L":" : argMountPoint) : pList->GetItemText(nItem, DL_INDEX); if (cmp.GetLength() < 1) - return LocUtils::GetStringFromResources(IDS_UNABLE_GET_LETTER); + return LocUtils::GetStringFromResources(IDS_UNABLE_GET_LETTER).c_str(); BOOL dlInUse = is_mountpoint_a_drive(cmp) && !IsDriveLetterAvailable(*(LPCWSTR)cmp); @@ -240,14 +240,14 @@ CString CMountPropertyPage::Mount(LPCWSTR argPath, LPCWSTR argMountPoint, LPCWST if (dlInUse) { CString mes; - mes.Format(LocUtils::GetStringFromResources(IDS_MPOINT_ALREADY_USED), cmp); + mes.Format(LocUtils::GetStringFromResources(IDS_MPOINT_ALREADY_USED).c_str(), cmp); return mes; } CWnd *pWnd = GetDlgItem(IDC_PATH); if (!pWnd) - return LocUtils::GetStringFromResources(IDS_UNABLE_GET_WINDOW); + return LocUtils::GetStringFromResources(IDS_UNABLE_GET_WINDOW).c_str(); CString cpath; @@ -257,7 +257,7 @@ CString CMountPropertyPage::Mount(LPCWSTR argPath, LPCWSTR argMountPoint, LPCWST pWnd->GetWindowTextW(cpath); if (cpath.GetLength() < 1) { - return LocUtils::GetStringFromResources(IDS_PATH_ZERO); + return LocUtils::GetStringFromResources(IDS_PATH_ZERO).c_str(); } CString config_path; @@ -267,7 +267,7 @@ CString CMountPropertyPage::Mount(LPCWSTR argPath, LPCWSTR argMountPoint, LPCWST } else { pWnd = GetDlgItem(IDC_CONFIG_PATH); if (!pWnd) - return LocUtils::GetStringFromResources(IDS_UNABLE_GET_CONF_WINDOW); + return LocUtils::GetStringFromResources(IDS_UNABLE_GET_CONF_WINDOW).c_str(); pWnd->GetWindowTextW(config_path); } @@ -297,7 +297,7 @@ CString CMountPropertyPage::Mount(LPCWSTR argPath, LPCWSTR argMountPoint, LPCWST if (pathInUse) { CString mes; - mes.Format(LocUtils::GetStringFromResources(IDS_ALREADY_MOUNTED), cpath, mdl); + mes.Format(LocUtils::GetStringFromResources(IDS_ALREADY_MOUNTED).c_str(), cpath, mdl); return mes; } @@ -326,13 +326,13 @@ CString CMountPropertyPage::Mount(LPCWSTR argPath, LPCWSTR argMountPoint, LPCWST if (opts.denyothersessions || opts.denyservices) { if (!CanGetSessionIdOk()) { - return LocUtils::GetStringFromResources(IDS_UNABLE_GET_SESSION_ID); + return LocUtils::GetStringFromResources(IDS_UNABLE_GET_SESSION_ID).c_str(); } if (!have_sessionid()) { - return LocUtils::GetStringFromResources(IDS_UNABLE_GET_PROCESS_SESSION_ID); + return LocUtils::GetStringFromResources(IDS_UNABLE_GET_PROCESS_SESSION_ID).c_str(); } if (get_sessionid() == 0) { - return LocUtils::GetStringFromResources(IDS_SESSION_ID_ZERO); + return LocUtils::GetStringFromResources(IDS_SESSION_ID_ZERO).c_str(); } } @@ -360,7 +360,7 @@ CString CMountPropertyPage::Mount(LPCWSTR argPath, LPCWSTR argMountPoint, LPCWST if (IsDlgButtonChecked(IDC_SAVE_PASSWORD)) { if (!SavedPasswords::SavePassword(cpath, password.m_buf)) { - MessageBox(LocUtils::GetStringFromResources(IDS_UNABLE_SAVE_PASS), L"cppcryptfs", MB_ICONEXCLAMATION | MB_OK); + MessageBox(LocUtils::GetStringFromResources(IDS_UNABLE_SAVE_PASS).c_str(), L"cppcryptfs", MB_ICONEXCLAMATION | MB_OK); } } @@ -494,7 +494,7 @@ BOOL CMountPropertyPage::OnInitDialog() // or using the string table resource CWnd *pWnd = GetDlgItem(IDC_SAVE_PASSWORD); if (pWnd) { - m_ToolTip.AddTool(pWnd, LocUtils::GetStringFromResources(IDS_TOOLTIP_ENABLE_SAVE_PASS)); + m_ToolTip.AddTool(pWnd, LocUtils::GetStringFromResources(IDS_TOOLTIP_ENABLE_SAVE_PASS).c_str()); } } @@ -533,9 +533,9 @@ BOOL CMountPropertyPage::OnInitDialog() mountPointColumnWidth = 79; } - pList->InsertColumn(DL_INDEX, LocUtils::GetStringFromResources(IDS_COLUMN_HEADER_MOUNT_POINT), LVCFMT_LEFT, mountPointColumnWidth); + pList->InsertColumn(DL_INDEX, LocUtils::GetStringFromResources(IDS_COLUMN_HEADER_MOUNT_POINT).c_str(), LVCFMT_LEFT, mountPointColumnWidth); - pList->InsertColumn(PATH_INDEX, LocUtils::GetStringFromResources(IDS_COLUMN_HEADER_PATH), LVCFMT_LEFT, 454-mountPointColumnWidth); + pList->InsertColumn(PATH_INDEX, LocUtils::GetStringFromResources(IDS_COLUMN_HEADER_PATH).c_str(), LVCFMT_LEFT, 454-mountPointColumnWidth); CString lastMountPoint = theApp.GetProfileString(L"MountPoints", L"LastMountPoint", L""); @@ -622,7 +622,7 @@ BOOL CMountPropertyPage::OnInitDialog() pCombo->LimitText(MAX_PATH); if (!m_password.ArePasswordBuffersLocked()) { - MessageBox(LocUtils::GetStringFromResources(IDS_UNABLE_LOCK_BUFFER), L"cppcryptfs", MB_OK | MB_ICONERROR); + MessageBox(LocUtils::GetStringFromResources(IDS_UNABLE_LOCK_BUFFER).c_str(), L"cppcryptfs", MB_OK | MB_ICONERROR); } ProcessCommandLine(GetCommandLine(), TRUE); @@ -750,7 +750,7 @@ void CMountPropertyPage::OnClickedMount() void CMountPropertyPage::OnClickedDismount() { CString mes = Dismount(nullptr, true, false); - if (mes.GetLength() > 0 && mes != LocUtils::GetStringFromResources(IDS_CANCELED_BY_USER)) + if (mes.GetLength() > 0 && mes != LocUtils::GetStringFromResources(IDS_CANCELED_BY_USER).c_str()) MessageBox(mes, L"cppcryptfs", MB_OK | MB_ICONEXCLAMATION); } @@ -760,12 +760,12 @@ CString CMountPropertyPage::Dismount(LPCWSTR argMountPoint, bool interactive, bo CListCtrl *pList = (CListCtrl*)GetDlgItem(IDC_DRIVE_LETTERS); if (!pList) - return LocUtils::GetStringFromResources(IDS_UNABLE_GET_LIST); + return LocUtils::GetStringFromResources(IDS_UNABLE_GET_LIST).c_str(); POSITION pos = pList->GetFirstSelectedItemPosition(); if (!pos) - return LocUtils::GetStringFromResources(IDS_UNABLE_GET_SELECTED); + return LocUtils::GetStringFromResources(IDS_UNABLE_GET_SELECTED).c_str(); int nItem; @@ -778,7 +778,7 @@ CString CMountPropertyPage::Dismount(LPCWSTR argMountPoint, bool interactive, bo nItem = pList->FindItem(&fi); if (nItem < 0) { CString msg; - msg.Format(LocUtils::GetStringFromResources(IDS_DRIVE_WITHOUT_MOUNTED_FS), str); + msg.Format(LocUtils::GetStringFromResources(IDS_DRIVE_WITHOUT_MOUNTED_FS).c_str(), str); return msg; } } else { @@ -786,18 +786,18 @@ CString CMountPropertyPage::Dismount(LPCWSTR argMountPoint, bool interactive, bo } if (nItem < 0) - return LocUtils::GetStringFromResources(IDS_UNABLE_FIND_ITEM); + return LocUtils::GetStringFromResources(IDS_UNABLE_FIND_ITEM).c_str(); CString cmp = pList->GetItemText(nItem, DL_INDEX); if (cmp.GetLength() < 1) - return LocUtils::GetStringFromResources(IDS_UNABLE_GET_LETTER); + return LocUtils::GetStringFromResources(IDS_UNABLE_GET_LETTER).c_str(); CString cpath = pList->GetItemText(nItem, PATH_INDEX); if (cpath.GetLength() < 1) { CString msg; - msg.Format(LocUtils::GetStringFromResources(IDS_DRIVE_WITHOUT_MOUNTED_FS), cmp); + msg.Format(LocUtils::GetStringFromResources(IDS_DRIVE_WITHOUT_MOUNTED_FS).c_str(), cmp); return msg; } @@ -824,7 +824,7 @@ CString CMountPropertyPage::Dismount(LPCWSTR argMountPoint, bool interactive, bo mes += L". "; } CString strMessage; - strMessage.Format(LocUtils::GetStringFromResources(IDS_CANNOT_UNMOUNT), cmp); + strMessage.Format(LocUtils::GetStringFromResources(IDS_CANNOT_UNMOUNT).c_str(), cmp); mes += strMessage; if (wmes.length() > 0) { mes += L" "; @@ -856,7 +856,7 @@ CString CMountPropertyPage::DismountAll(bool interactive, bool forceDismount) CListCtrl *pList = (CListCtrl*)GetDlgItem(IDC_DRIVE_LETTERS); if (!pList) - return LocUtils::GetStringFromResources(IDS_UNABLE_GET_LIST); + return LocUtils::GetStringFromResources(IDS_UNABLE_GET_LIST).c_str(); int count = pList->GetItemCount(); @@ -913,16 +913,16 @@ CString CMountPropertyPage::DismountAll(bool interactive, bool forceDismount) if (hadFailure) { if (hadSuccess) { - mes = LocUtils::GetStringFromResources(IDS_SOME_DRV_NOT_DISMOUNTED); + mes = LocUtils::GetStringFromResources(IDS_SOME_DRV_NOT_DISMOUNTED).c_str(); } else { - mes = LocUtils::GetStringFromResources(IDS_UNABLE_DISMOUNT); + mes = LocUtils::GetStringFromResources(IDS_UNABLE_DISMOUNT).c_str(); } } if (volnameFailure) { if (mes.GetLength() > 0) mes += L". "; - mes += LocUtils::GetStringFromResources(IDS_UNABLE_UPDATE_LABELS); + mes += LocUtils::GetStringFromResources(IDS_UNABLE_UPDATE_LABELS).c_str(); } return mes; @@ -973,7 +973,7 @@ BOOL CMountPropertyPage::OnSetActive() CString mountPoint = theApp.GetProfileString(L"MountPoints", path_hash, NULL); if (mountPoint.GetLength() == 0) { CString strMessage; - strMessage.Format(LocUtils::GetStringFromResources(IDS_FAIL_RETRIVE_MPOINT), m_lastDirs[i]); + strMessage.Format(LocUtils::GetStringFromResources(IDS_FAIL_RETRIVE_MPOINT).c_str(), m_lastDirs[i]); MessageBox(strMessage, L"cppcryptfs", MB_OK | MB_ICONEXCLAMATION); continue; } @@ -982,7 +982,7 @@ BOOL CMountPropertyPage::OnSetActive() if (!SavedPasswords::RetrievePassword(m_lastDirs[i], password.m_buf, password.m_len)) { CString strMessage; - strMessage.Format(LocUtils::GetStringFromResources(IDS_FAIL_RETRIVE_PASS), m_lastDirs[i]); + strMessage.Format(LocUtils::GetStringFromResources(IDS_FAIL_RETRIVE_PASS).c_str(), m_lastDirs[i]); MessageBox(strMessage, L"cppcryptfs", MB_OK | MB_ICONEXCLAMATION); continue; } @@ -1738,7 +1738,7 @@ void CMountPropertyPage::OnContextMenu(CWnd* pWnd, CPoint point) if (!menu.CreatePopupMenu()) return; - menu.AppendMenu(MF_ENABLED, AddMountPointV, LocUtils::GetStringFromResources(IDS_MENU_ADD_MOUNT_POINT)); + menu.AppendMenu(MF_ENABLED, AddMountPointV, LocUtils::GetStringFromResources(IDS_MENU_ADD_MOUNT_POINT).c_str()); int item = -1; @@ -1755,12 +1755,12 @@ void CMountPropertyPage::OnContextMenu(CWnd* pWnd, CPoint point) wstring mpstr; bool mounted = MountPointManager::getInstance().find(cmp, mpstr); if (mounted) { - menu.AppendMenu(MF_ENABLED, OpenV, LocUtils::GetStringFromResources(IDS_MENU_OPEN)); - menu.AppendMenu(MF_ENABLED, PropertiesV, LocUtils::GetStringFromResources(IDS_MENU_PROPERTIES)); - menu.AppendMenu(MF_ENABLED, DismountV, LocUtils::GetStringFromResources(IDS_MENU_DISMOUNT)); + menu.AppendMenu(MF_ENABLED, OpenV, LocUtils::GetStringFromResources(IDS_MENU_OPEN).c_str()); + menu.AppendMenu(MF_ENABLED, PropertiesV, LocUtils::GetStringFromResources(IDS_MENU_PROPERTIES).c_str()); + menu.AppendMenu(MF_ENABLED, DismountV, LocUtils::GetStringFromResources(IDS_MENU_DISMOUNT).c_str()); } if (is_mountpoint_a_dir(cmp)) { - menu.AppendMenu(mounted ? MF_DISABLED : MF_ENABLED, DeleteMountPointV, LocUtils::GetStringFromResources(IDS_DELETE_MOUNT_POINT)); + menu.AppendMenu(mounted ? MF_DISABLED : MF_ENABLED, DeleteMountPointV, LocUtils::GetStringFromResources(IDS_DELETE_MOUNT_POINT).c_str()); } } @@ -1821,7 +1821,7 @@ void CMountPropertyPage::AddMountPoint(const CString & path) return; if (!is_suitable_mountpoint(path)) { - MessageBox(LocUtils::GetStringFromResources(IDS_PATH_NOT_SUITABLE_MPOINT), L"cppcyrptfs", MB_OK | MB_ICONEXCLAMATION); + MessageBox(LocUtils::GetStringFromResources(IDS_PATH_NOT_SUITABLE_MPOINT).c_str(), L"cppcyrptfs", MB_OK | MB_ICONEXCLAMATION); return; } @@ -1830,7 +1830,7 @@ void CMountPropertyPage::AddMountPoint(const CString & path) int i = 0; for (CString mp = mountPointsStr.Tokenize(L"|", i); i >= 0; mp = mountPointsStr.Tokenize(L"|", i)) { if (!lstrcmpi(path, mp)) { - MessageBox(LocUtils::GetStringFromResources(IDS_MPOINT_ALREADY_ADDED), L"cppcryptfs", MB_OK | MB_ICONEXCLAMATION); + MessageBox(LocUtils::GetStringFromResources(IDS_MPOINT_ALREADY_ADDED).c_str(), L"cppcryptfs", MB_OK | MB_ICONEXCLAMATION); return; } } diff --git a/cppcryptfs/ui/SettingsPropertyPage.cpp b/cppcryptfs/ui/SettingsPropertyPage.cpp index 3733b7d..69fc145 100644 --- a/cppcryptfs/ui/SettingsPropertyPage.cpp +++ b/cppcryptfs/ui/SettingsPropertyPage.cpp @@ -96,22 +96,22 @@ static buffer_size_t buffer_sizes[] = { 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2 static int ttls[] = { 0, 1, 2, 5, 10, 15, 30, 45, 60, 90, 120, 300, 600, 900, 1800, 3600}; -static const CString ttl_0 = LocUtils::GetStringFromResources(IDS_TTL_INFINITE); -static const CString ttl_1 = LocUtils::GetStringFromResources(IDS_TTL_SEC_1); -static const CString ttl_2 = LocUtils::GetStringFromResources(IDS_TTL_SEC_2); -static const CString ttl_5 = LocUtils::GetStringFromResources(IDS_TTL_SEC_5); -static const CString ttl_10 = LocUtils::GetStringFromResources(IDS_TTL_SEC_10); -static const CString ttl_15 = LocUtils::GetStringFromResources(IDS_TTL_SEC_15); -static const CString ttl_30 = LocUtils::GetStringFromResources(IDS_TTL_SEC_30); -static const CString ttl_45 = LocUtils::GetStringFromResources(IDS_TTL_SEC_45); -static const CString ttl_60 = LocUtils::GetStringFromResources(IDS_TTL_SEC_60); -static const CString ttl_90 = LocUtils::GetStringFromResources(IDS_TTL_SEC_90); -static const CString ttl_120 = LocUtils::GetStringFromResources(IDS_TTL_MIN_2); -static const CString ttl_300 = LocUtils::GetStringFromResources(IDS_TTL_MIN_5); -static const CString ttl_600 = LocUtils::GetStringFromResources(IDS_TTL_MIN_10); -static const CString ttl_900 = LocUtils::GetStringFromResources(IDS_TTL_MIN_15); -static const CString ttl_1800 = LocUtils::GetStringFromResources(IDS_TTL_MIN_30); -static const CString ttl_3600 = LocUtils::GetStringFromResources(IDS_TTL_HOUR_1); +static CString ttl_0 = LocUtils::GetStringFromResources(IDS_TTL_INFINITE).c_str(); +static CString ttl_1 = LocUtils::GetStringFromResources(IDS_TTL_SEC_1).c_str(); +static CString ttl_2 = LocUtils::GetStringFromResources(IDS_TTL_SEC_2).c_str(); +static CString ttl_5 = LocUtils::GetStringFromResources(IDS_TTL_SEC_5).c_str(); +static CString ttl_10 = LocUtils::GetStringFromResources(IDS_TTL_SEC_10).c_str(); +static CString ttl_15 = LocUtils::GetStringFromResources(IDS_TTL_SEC_15).c_str(); +static CString ttl_30 = LocUtils::GetStringFromResources(IDS_TTL_SEC_30).c_str(); +static CString ttl_45 = LocUtils::GetStringFromResources(IDS_TTL_SEC_45).c_str(); +static CString ttl_60 = LocUtils::GetStringFromResources(IDS_TTL_SEC_60).c_str(); +static CString ttl_90 = LocUtils::GetStringFromResources(IDS_TTL_SEC_90).c_str(); +static CString ttl_120 = LocUtils::GetStringFromResources(IDS_TTL_MIN_2).c_str(); +static CString ttl_300 = LocUtils::GetStringFromResources(IDS_TTL_MIN_5).c_str(); +static CString ttl_600 = LocUtils::GetStringFromResources(IDS_TTL_MIN_10).c_str(); +static CString ttl_900 = LocUtils::GetStringFromResources(IDS_TTL_MIN_15).c_str(); +static CString ttl_1800 = LocUtils::GetStringFromResources(IDS_TTL_MIN_30).c_str(); +static CString ttl_3600 = LocUtils::GetStringFromResources(IDS_TTL_HOUR_1).c_str(); static const WCHAR* ttl_strings[] = { ttl_0, ttl_1, ttl_2, ttl_5, ttl_10, ttl_15, ttl_30, ttl_45, @@ -313,18 +313,18 @@ void CSettingsPropertyPage::OnClickedEnableSavingPasswords() bool neversavehistory = false; CryptSettings::getInstance().GetSettingCurrent(NEVER_SAVE_HISTORY, neversavehistory); if (neversavehistory) { - MessageBox(LocUtils::GetStringFromResources(IDS_PASS_WILL_NOT_BE_SAVED), + MessageBox(LocUtils::GetStringFromResources(IDS_PASS_WILL_NOT_BE_SAVED).c_str(), L"cppcryptfs", MB_OK | MB_ICONINFORMATION); } } else { int numSavedPasswords = SavedPasswords::ClearSavedPasswords(FALSE); if (numSavedPasswords < 0) { - MessageBox(LocUtils::GetStringFromResources(IDS_UNABLE_COUNT_SAVED_PASS), L"cppcryptfs", MB_ICONEXCLAMATION | MB_OK); + MessageBox(LocUtils::GetStringFromResources(IDS_UNABLE_COUNT_SAVED_PASS).c_str(), L"cppcryptfs", MB_ICONEXCLAMATION | MB_OK); } else if (numSavedPasswords > 0) { - int result = MessageBox(LocUtils::GetStringFromResources(IDS_DELETE_ALL_SAVED_PASS), L"cppcryptfs", MB_ICONWARNING | MB_YESNO); + int result = MessageBox(LocUtils::GetStringFromResources(IDS_DELETE_ALL_SAVED_PASS).c_str(), L"cppcryptfs", MB_ICONWARNING | MB_YESNO); if (result == IDYES) { if (SavedPasswords::ClearSavedPasswords(TRUE) != numSavedPasswords) { - MessageBox(LocUtils::GetStringFromResources(IDS_UNABLE_DELETE_SAVED_PASS), L"cppcryptfs", MB_ICONEXCLAMATION | MB_OK); + MessageBox(LocUtils::GetStringFromResources(IDS_UNABLE_DELETE_SAVED_PASS).c_str(), L"cppcryptfs", MB_ICONEXCLAMATION | MB_OK); } } } @@ -347,7 +347,7 @@ void CSettingsPropertyPage::OnClickedNeverSaveHistory() CryptSettings::getInstance().GetSettingCurrent(ENABLE_SAVING_PASSWORDS, enablesavingpasswords); if (enablesavingpasswords) { - MessageBox(LocUtils::GetStringFromResources(IDS_NEVER_SAVE_HISTORY_HINT), + MessageBox(LocUtils::GetStringFromResources(IDS_NEVER_SAVE_HISTORY_HINT).c_str(), L"cppcryptfs", MB_OK | MB_ICONINFORMATION); } @@ -371,7 +371,7 @@ void CSettingsPropertyPage::OnClickedNeverSaveHistory() DeleteAllRegisteryValues(CPPCRYPTFS_REG_PATH L"CreateOptions", mes); error += mes; if (!error.empty()) { - MessageBox(LocUtils::GetStringFromResources(IDS_UNABLE_DELETE_HISTORY), L"cppcryptfs", + MessageBox(LocUtils::GetStringFromResources(IDS_UNABLE_DELETE_HISTORY).c_str(), L"cppcryptfs", MB_OK | MB_ICONEXCLAMATION); } } diff --git a/cppcryptfs/ui/locutils.cpp b/cppcryptfs/ui/locutils.cpp index 5f5a9dd..b272447 100644 --- a/cppcryptfs/ui/locutils.cpp +++ b/cppcryptfs/ui/locutils.cpp @@ -1,11 +1,11 @@ -#include "stdafx.h" #include "locutils.h" +#define VC_EXTRALEAN +#include -CString LocUtils::GetStringFromResources(UINT nID) { - CString str; - static HINSTANCE hExe = GetModuleHandle(NULL); - if (hExe == NULL || !str.LoadString(hExe, nID)) { - return _T("Error: String not found"); +std::wstring LocUtils::GetStringFromResources(unsigned int nID) { + ATL::CStringW str; + if (str.LoadString(nID)) { + return std::wstring((LPCWSTR)str); } - return str; + return L""; } diff --git a/cppcryptfs/ui/locutils.h b/cppcryptfs/ui/locutils.h index 4a26311..9b6dda7 100644 --- a/cppcryptfs/ui/locutils.h +++ b/cppcryptfs/ui/locutils.h @@ -1,7 +1,7 @@ #pragma once -#include +#include class LocUtils { public: - static CString GetStringFromResources(UINT nID); + static std::wstring GetStringFromResources(unsigned int nID); }; diff --git a/cppcryptfs/ui/locutilsalt.cpp b/cppcryptfs/ui/locutilsalt.cpp deleted file mode 100644 index 72a30ad..0000000 --- a/cppcryptfs/ui/locutilsalt.cpp +++ /dev/null @@ -1,10 +0,0 @@ -#include "locutilsalt.h" - -CString LocUtilsAlt::GetStringFromResources(UINT nID) { - CString str; - static HINSTANCE hExe = GetModuleHandle(NULL); - if (hExe == NULL || !str.LoadString(hExe, nID)) { - return _T("Error: String not found"); - } - return str; -} diff --git a/cppcryptfs/ui/locutilsalt.h b/cppcryptfs/ui/locutilsalt.h deleted file mode 100644 index 8e4f07f..0000000 --- a/cppcryptfs/ui/locutilsalt.h +++ /dev/null @@ -1,8 +0,0 @@ -#pragma once -#include -#include - -class LocUtilsAlt { -public: - static ATL::CString GetStringFromResources(UINT nID); -}; diff --git a/cppcryptfs/ui/uiutil.cpp b/cppcryptfs/ui/uiutil.cpp index 8c5ea35..1ada228 100644 --- a/cppcryptfs/ui/uiutil.cpp +++ b/cppcryptfs/ui/uiutil.cpp @@ -121,13 +121,13 @@ wstring CheckOpenHandles(HWND hWnd, const wchar_t* mp, bool interactive, bool fo else if (open_handle_count > 0) { if (interactive) { CString strMsg; - strMsg.Format(LocUtils::GetStringFromResources(IDS_IS_STILL_IN_USE), mp); - auto res = ::MessageBox(hWnd, mp ? strMsg : LocUtils::GetStringFromResources(IDS_FS_IS_STILL_IN_USE), L"cppcryptfs", MB_YESNO | MB_ICONHAND); + strMsg.Format(LocUtils::GetStringFromResources(IDS_IS_STILL_IN_USE).c_str(), mp); + auto res = ::MessageBox(hWnd, mp ? strMsg : LocUtils::GetStringFromResources(IDS_FS_IS_STILL_IN_USE).c_str(), L"cppcryptfs", MB_YESNO | MB_ICONHAND); if (res == IDYES) return L""; else { - CString strMsgCanceledByUser = LocUtils::GetStringFromResources(IDS_CANCELED_BY_USER); - return strMsgCanceledByUser.GetString(); + std::wstring strMsgCanceledByUser = LocUtils::GetStringFromResources(IDS_CANCELED_BY_USER); + return strMsgCanceledByUser; } } else { diff --git a/libcppcryptfs/config/cryptconfig.cpp b/libcppcryptfs/config/cryptconfig.cpp index 05526df..2cbb274 100644 --- a/libcppcryptfs/config/cryptconfig.cpp +++ b/libcppcryptfs/config/cryptconfig.cpp @@ -64,6 +64,9 @@ THE SOFTWARE. #include "util/LockZeroBuffer.h" #include "filename/cryptfilename.h" #include "../libcommonutil/commonutil.h" +#include "../cppcryptfs/resource.h" +#include "../cppcryptfs/ui/locutils.h" +#include CryptConfig::CryptConfig() { @@ -114,7 +117,7 @@ CryptConfig::read(wstring& mes, const WCHAR *config_file_path, bool reverse) if (config_file_path) { if (_wfopen_s(&fl, config_file_path, L"rb")) { - mes = L"failed to open config file"; + mes = LocUtils::GetStringFromResources(IDS_FAILED_OPEN_CONF); return false; } m_configPath = config_file_path; @@ -124,7 +127,7 @@ CryptConfig::read(wstring& mes, const WCHAR *config_file_path, bool reverse) wstring config_path; if (m_basedir.size() < 1) { - mes = L"cannot read config because base dir is empty"; + mes = LocUtils::GetStringFromResources(IDS_NOT_CONF_DIR_EMPTY); return false; } @@ -138,7 +141,7 @@ CryptConfig::read(wstring& mes, const WCHAR *config_file_path, bool reverse) if (_wfopen_s(&fl, &config_file[0], L"rb")) { config_file = config_path + CONFIG_NAME; if (_wfopen_s(&fl, &config_file[0], L"rb")) { - mes = L"failed to open config file"; + mes = LocUtils::GetStringFromResources(IDS_FAILED_OPEN_CONF); return false; } m_reverse = false; @@ -152,24 +155,24 @@ CryptConfig::read(wstring& mes, const WCHAR *config_file_path, bool reverse) File.reset(fl); if (fseek(fl, 0, SEEK_END)) { - mes = L"unable to seek to end of config file"; + mes = LocUtils::GetStringFromResources(IDS_NOT_FOUND_END_CONF); return false; } long filesize = ftell(fl); if (filesize > MAX_CONFIG_FILE_SIZE) { - mes = L"config file is too big"; + mes = LocUtils::GetStringFromResources(IDS_CONF_TOO_BIG); return false; } if (filesize < 1) { - mes = L"config file is empty"; + mes = LocUtils::GetStringFromResources(IDS_CONF_EMPTY); return false; } if (fseek(fl, 0, SEEK_SET)) { - mes = L"unable to seek to beginning of config file"; + mes = LocUtils::GetStringFromResources(IDS_NOT_FOUND_BEGINNING_CONF); return false; } @@ -178,14 +181,14 @@ CryptConfig::read(wstring& mes, const WCHAR *config_file_path, bool reverse) char* buf = buf_rsc.get(); if (!buf) { - mes = L"cannot allocate buffer for reading config file"; + mes = LocUtils::GetStringFromResources(IDS_CANNOT_ALLOCATE_BUFFER_CONF); return false; } size_t len = fread(buf, 1, filesize, fl); if (len < 0) { - mes = L"read error when reading config file"; + mes = LocUtils::GetStringFromResources(IDS_RAED_ERR_CONF); return false; } @@ -196,7 +199,7 @@ CryptConfig::read(wstring& mes, const WCHAR *config_file_path, bool reverse) d.Parse(buf); if (!d.IsObject()) { - mes = L"config file is not valid JSON"; + mes = LocUtils::GetStringFromResources(IDS_CONF_NOT_VALID_JSON); return false; } @@ -205,19 +208,19 @@ CryptConfig::read(wstring& mes, const WCHAR *config_file_path, bool reverse) try { if (!d.HasMember("EncryptedKey") || !d["EncryptedKey"].IsString()) { - mes = L"key missing in config file"; + mes = LocUtils::GetStringFromResources(IDS_KEY_MISSING_IN_CONF); throw (-1); } rapidjson::Value& v = d["EncryptedKey"]; if (!base64_decode(v.GetString(), m_encrypted_key, false, true)) { - mes = L"failed to base64 decode key in config file"; + mes = LocUtils::GetStringFromResources(IDS_FAILED_BASE64_DECODE_KEY); throw (-1); } if (!d.HasMember("ScryptObject") || !d["ScryptObject"].IsObject()) { - mes = L"ScryptObject missing in config file"; + mes = LocUtils::GetStringFromResources(IDS_SCRYPTOBJECT_MISSING_IN_CONF); throw (-1); } @@ -225,7 +228,7 @@ CryptConfig::read(wstring& mes, const WCHAR *config_file_path, bool reverse) if (!base64_decode(scryptobject["Salt"].GetString(), m_encrypted_key_salt, false, true)) { - mes = L"failed to base64 decode Scrypt Salt in config file"; + mes = LocUtils::GetStringFromResources(IDS_FAILED_BASE64_DECODE_SALT); throw (-1); } @@ -235,7 +238,7 @@ CryptConfig::read(wstring& mes, const WCHAR *config_file_path, bool reverse) for (i = 0; i < sizeof(sstuff) / sizeof(sstuff[0]); i++) { if (scryptobject[sstuff[i]].IsNull() || !scryptobject[sstuff[i]].IsInt()) { - mes = L"invalid Scrypt object in config file"; + mes = LocUtils::GetStringFromResources(IDS_INVALID_SCRYPTOBJECT); throw (-1); } } @@ -246,21 +249,21 @@ CryptConfig::read(wstring& mes, const WCHAR *config_file_path, bool reverse) int keyLen = scryptobject["KeyLen"].GetInt(); if (keyLen != 32) { - mes = L"invalid KeyLen in config file"; + mes = LocUtils::GetStringFromResources(IDS_INVALID_KEYLEN); throw(-1); } m_pKeyBuf = new LockZeroBuffer(keyLen, false); if (!m_pKeyBuf->IsLocked()) { - mes = L"failed to lock key buffer while reading config file"; + mes = LocUtils::GetStringFromResources(IDS_FAILED_LOCK_BUFFER_READ_CONF); throw(-1); } m_keybuf_manager.RegisterBuf(m_pKeyBuf); if (d["Version"].IsNull() || !d["Version"].IsInt()) { - mes = L"invalid Version in config file"; + mes = LocUtils::GetStringFromResources(IDS_INVALID_VERSION_IN_CONF); throw (-1); } @@ -284,7 +287,7 @@ CryptConfig::read(wstring& mes, const WCHAR *config_file_path, bool reverse) try { m_fs_feature_disable_mask = stoul(fs_str, nullptr, 16); } catch (std::invalid_argument&) { - mes = L"invalid FsFeatureDisableMask in config file"; + mes = LocUtils::GetStringFromResources(IDS_INVALID_FSFEATUREDISABLEMASK); throw(-1); } } @@ -318,10 +321,11 @@ CryptConfig::read(wstring& mes, const WCHAR *config_file_path, bool reverse) } else { wstring wflag; if (utf8_to_unicode(itr->GetString(), wflag)) { - mes = L"unkown feature flag in config file: "; - mes += wflag; + CString strMsg; + strMsg.Format(LocUtils::GetStringFromResources(IDS_UNKNOWN_FEATURE_FLAG).c_str(), wflag); + mes = strMsg; } else { - mes = L"unable to convert unkown flag in config file to unicode"; + mes = LocUtils::GetStringFromResources(IDS_UNABLE_CONVERT_UNKNOWN_FLAG); } throw(-1); } @@ -338,11 +342,11 @@ CryptConfig::read(wstring& mes, const WCHAR *config_file_path, bool reverse) } m_LongNameMax = lnm; } catch (std::invalid_argument&) { - mes = L"invalid LongNameMax in config file"; + mes = LocUtils::GetStringFromResources(IDS_INVALID_LONGNAMEMAX); throw(-1); } } else { - mes = L"LongNameMax feature flag specified but no LongNameMax value provided"; + mes = LocUtils::GetStringFromResources(IDS_NO_VALUE_LONGNAMEMAX); throw(-1); } } @@ -601,16 +605,16 @@ bool CryptConfig::check_config(wstring& mes) mes = L""; if (m_Version != 2) - mes += L"Only version 2 is supported\n"; + mes += LocUtils::GetStringFromResources(IDS_ONLY_VERSION_2_SUPPORT); if (!m_EMENames && !m_PlaintextNames) - mes += L"EMENames is required unless PlaintextNames is specified\n"; + mes += LocUtils::GetStringFromResources(IDS_EMENAMES_REQUIRED); if (!m_GCMIV128) - mes += L"GCMIV128 must be specified\n"; + mes += LocUtils::GetStringFromResources(IDS_GCMIV128_NOT_SPECIFIED); if (m_reverse && !m_AESSIV) - mes += L"reverse mode is being used but AESSIV not specfied\n"; + mes += LocUtils::GetStringFromResources(IDS_REVERSE_MODE_WITHOUT_AESSIV); return mes.size() == 0; } @@ -726,7 +730,7 @@ bool CryptConfig::encrypt_key(const wchar_t* password, const BYTE* masterkey, st LockZeroBuffer pwkeyHKDF(MASTER_KEY_LEN, false); if (!pwkey.IsLocked() || !pwkeyHKDF.IsLocked()) { - error_mes = L"pw key not locked"; + error_mes = LocUtils::GetStringFromResources(IDS_PWKEY_NOT_LOCKED); return false; } @@ -734,14 +738,14 @@ bool CryptConfig::encrypt_key(const wchar_t* password, const BYTE* masterkey, st if (masterkey) { if (m_pKeyBuf) { - error_mes = L"master key is already set"; + error_mes = LocUtils::GetStringFromResources(IDS_MASTER_KEY_ALREADY_SET); return false; } m_pKeyBuf = new LockZeroBuffer(DEFAULT_KEY_LEN, false); if (!m_pKeyBuf->IsLocked()) { - error_mes = L"cannot lock key buffer\n"; + error_mes = LocUtils::GetStringFromResources(IDS_CANNOT_LOCK_KEY_BUFFER); throw(-1); } @@ -753,18 +757,18 @@ bool CryptConfig::encrypt_key(const wchar_t* password, const BYTE* masterkey, st m_encrypted_key_salt.resize(SALT_LEN); if (!get_sys_random_bytes(&m_encrypted_key_salt[0], SALT_LEN)) { - error_mes = L"get random bytes for salt failed\n"; + error_mes = LocUtils::GetStringFromResources(IDS_FAILED_GET_RANDOM); throw(-1); } LockZeroBuffer utf8pass(256, false); if (!utf8pass.IsLocked()) { - error_mes = L"utf8 pass is not locked"; + error_mes = LocUtils::GetStringFromResources(IDS_UTF8PASS_NOT_LOCKED); return false; } if (!unicode_to_utf8(password, utf8pass.m_buf, utf8pass.m_len - 1)) { - error_mes = L"cannot convert password to utf-8\n"; + error_mes = LocUtils::GetStringFromResources(IDS_CANNOT_CONVERT_PASS_UTF8); throw(-1); } @@ -774,13 +778,13 @@ bool CryptConfig::encrypt_key(const wchar_t* password, const BYTE* masterkey, st GetMasterKeyLength()); if (result != 1) { - error_mes = L"key derivation failed\n"; + error_mes = LocUtils::GetStringFromResources(IDS_KEY_DERIVATION_FAILED); throw(-1); } if (m_HKDF) { if (!hkdfDerive(pwkey.m_buf, pwkey.m_len, pwkeyHKDF.m_buf, pwkeyHKDF.m_len, hkdfInfoGCMContent)) { - error_mes = L"unable to perform hkdf on pw key"; + error_mes = LocUtils::GetStringFromResources(IDS_UNABLE_HKDF_ON_PWKEY); throw(-1); } } @@ -790,7 +794,7 @@ bool CryptConfig::encrypt_key(const wchar_t* password, const BYTE* masterkey, st int iv_len = m_HKDF ? HKDF_MASTER_IV_LEN : ORIG_MASTER_IV_LEN; if (!get_sys_random_bytes(iv, iv_len)) { - error_mes = L"unable to generate iv\n"; + error_mes = LocUtils::GetStringFromResources(IDS_UNABLE_GENERATE_IV); throw(-1); } @@ -801,14 +805,14 @@ bool CryptConfig::encrypt_key(const wchar_t* password, const BYTE* masterkey, st memset(adata, 0, adata_len); if (!InitGCMContentKey(GetMasterKey())) { - error_mes = L"unable to init gcm content key for volume name"; + error_mes = LocUtils::GetStringFromResources(IDS_UNABLE_INIT_GCM); throw(-1); } context = get_crypt_context(iv_len, AES_MODE_GCM); if (!context) { - error_mes = L"unable to get gcm context\n"; + error_mes = LocUtils::GetStringFromResources(IDS_UNABLE_GET_GCM); throw(-1); } @@ -820,19 +824,19 @@ bool CryptConfig::encrypt_key(const wchar_t* password, const BYTE* masterkey, st iv, (encrypted_key + iv_len), encrypted_key + iv_len + GetMasterKeyLength(), context.get()); if (ctlen < 1) { - error_mes = L"unable to encrypt master key\n"; + error_mes = LocUtils::GetStringFromResources(IDS_UNABLE_ENCRYPT_MASTER_KEY); throw(-1); } const char* base64_key = base64_encode(encrypted_key, GetMasterKeyLength() + iv_len + BLOCK_TAG_LEN, base64encryptedmasterkey, false, true); if (!base64_key) { - error_mes = L"unable to base64 encode key\n"; + error_mes = LocUtils::GetStringFromResources(IDS_UNABLE_BASE64_ENCODE_KEY); throw(-1); } if (!base64_encode(&m_encrypted_key_salt[0], (DWORD)m_encrypted_key_salt.size(), scryptSalt, false, true)) { - error_mes = L"unable to base64 encode salt\n"; + error_mes = LocUtils::GetStringFromResources(IDS_UNABLE_BASE64_ENCODE_SALT); throw(-1); } } @@ -899,22 +903,26 @@ bool CryptConfig::create(const WCHAR *path, const WCHAR *specified_config_file_p } if (m_reverse && !m_AESSIV) { - error_mes = L"AES256-SIV must be used with Reverse\n"; + error_mes = LocUtils::GetStringFromResources(IDS_ONLY_AES256SIV_WITH_REVERSE); throw(-1); } if (m_reverse) { if (PathFileExists(&config_path[0])) { if (specified_config_file_path) { - error_mes = config_path + L" already exists. Please remove it and try again."; + CString strMsg; + strMsg.Format(LocUtils::GetStringFromResources(IDS_CONF_PATH_ALREADY_EXIST).c_str(), config_path); + error_mes = strMsg; } else { - error_mes = config_path + L" (normally a hidden file) already exists. Please remove it and try again."; + CString strMsg; + strMsg.Format(LocUtils::GetStringFromResources(IDS_CONF_PATH_HIDDEN_EXIST).c_str(), config_path); + error_mes = strMsg; } throw(-1); } } else { if (!can_delete_directory(&m_basedir[0], TRUE)) { - error_mes = L"the directory is not empty\n"; + error_mes = LocUtils::GetStringFromResources(IDS_DIR_NOT_EMPTY); throw(-1); } } @@ -926,12 +934,12 @@ bool CryptConfig::create(const WCHAR *path, const WCHAR *specified_config_file_p m_pKeyBuf = new LockZeroBuffer(DEFAULT_KEY_LEN, false); if (!m_pKeyBuf->IsLocked()) { - error_mes = L"cannot lock key buffer\n"; + error_mes = LocUtils::GetStringFromResources(IDS_CANNOT_LOCK_KEY_BUFFER); throw(-1); } if (!get_sys_random_bytes(m_pKeyBuf->m_buf, GetMasterKeyLength())) { - error_mes = L"unable to generate master key\n"; + error_mes = LocUtils::GetStringFromResources(IDS_UNABLE_GENERATE_MASTER_KEY); throw(-1); } @@ -960,7 +968,7 @@ bool CryptConfig::create(const WCHAR *path, const WCHAR *specified_config_file_p if (vol.size() > MAX_VOLUME_NAME_LENGTH) vol.erase(MAX_VOLUME_NAME_LENGTH, wstring::npos); if (!encrypt_string_gcm(vol, GetGcmContentKey(), volume_name_utf8)) { - error_mes = L"cannot encrypt volume name\n"; + error_mes = LocUtils::GetStringFromResources(IDS_CANNOT_ENCRYPT_VOLUME_NAME); throw(-1); } } @@ -969,12 +977,12 @@ bool CryptConfig::create(const WCHAR *path, const WCHAR *specified_config_file_p auto fl = File.get(); if (!fl) { - error_mes = L"cannot create config file\n"; + error_mes = LocUtils::GetStringFromResources(IDS_CANNOT_CREATE_CONF); throw(-1); } if (!fl) { - error_mes = L"unable to open config file for writing\n"; + error_mes = LocUtils::GetStringFromResources(IDS_UNABLE_OPEN_WRITE_CONF); throw(-1); } @@ -1037,7 +1045,7 @@ bool CryptConfig::create(const WCHAR *path, const WCHAR *specified_config_file_p if (m_DirIV && !m_reverse) { if (!create_dir_iv(NULL, &m_basedir[0])) { - error_mes = L"cannot create diriv file\n"; + error_mes = LocUtils::GetStringFromResources(IDS_CANNOT_CREATE_DIRIV); throw(-1); } } @@ -1045,7 +1053,7 @@ bool CryptConfig::create(const WCHAR *path, const WCHAR *specified_config_file_p } catch (...) { if (error_mes.size() < 1) - error_mes = L"memory allocation failure\n"; + error_mes = LocUtils::GetStringFromResources(IDS_MEMORY_ALLOCATION_FAILURE); bret = false; } diff --git a/libcppcryptfs/libcppcryptfs.vcxproj b/libcppcryptfs/libcppcryptfs.vcxproj index 5e1647f..d7ca69f 100644 --- a/libcppcryptfs/libcppcryptfs.vcxproj +++ b/libcppcryptfs/libcppcryptfs.vcxproj @@ -169,6 +169,7 @@ + @@ -202,6 +203,10 @@ + + NotUsing + NotUsing + diff --git a/libcppcryptfs/libcppcryptfs.vcxproj.filters b/libcppcryptfs/libcppcryptfs.vcxproj.filters index a334313..b916f8d 100644 --- a/libcppcryptfs/libcppcryptfs.vcxproj.filters +++ b/libcppcryptfs/libcppcryptfs.vcxproj.filters @@ -28,6 +28,7 @@ + @@ -61,5 +62,6 @@ + \ No newline at end of file From 2a47678b65641ebf4dbccc9a0cf5b242c036f1ea Mon Sep 17 00:00:00 2001 From: nbb1967 Date: Wed, 11 Feb 2026 21:29:19 +0300 Subject: [PATCH 17/35] format --- cppcryptfs/dokan/cryptdokan.cpp | 5 +---- libcppcryptfs/libcppcryptfs.vcxproj.filters | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/cppcryptfs/dokan/cryptdokan.cpp b/cppcryptfs/dokan/cryptdokan.cpp index 7c0653e..fec317c 100755 --- a/cppcryptfs/dokan/cryptdokan.cpp +++ b/cppcryptfs/dokan/cryptdokan.cpp @@ -2388,10 +2388,7 @@ BOOL unmount_crypt_fs(const WCHAR* mountpoint, bool wait, wstring& mes) { bool res = MountPointManager::getInstance().wait_and_destroy(mpstr.c_str()); if (!res) { CString strMsg; - strMsg.Format( - LocUtils::GetStringFromResources(IDS_WAIT_UNMOUNT_ERROR) - .c_str(), - GetWindowsErrorString(GetLastError())); + strMsg.Format(LocUtils::GetStringFromResources(IDS_WAIT_UNMOUNT_ERROR).c_str(), GetWindowsErrorString(GetLastError())); mes += strMsg; } return res; diff --git a/libcppcryptfs/libcppcryptfs.vcxproj.filters b/libcppcryptfs/libcppcryptfs.vcxproj.filters index b916f8d..f703660 100644 --- a/libcppcryptfs/libcppcryptfs.vcxproj.filters +++ b/libcppcryptfs/libcppcryptfs.vcxproj.filters @@ -64,4 +64,4 @@ - \ No newline at end of file + From f8446dd67daf0ce3d81e2a3448809196a98a5a28 Mon Sep 17 00:00:00 2001 From: nbb1967 Date: Sat, 14 Feb 2026 21:52:25 +0300 Subject: [PATCH 18/35] localization-independent text in registry --- cppcryptfs/cppcryptfs.rc | Bin 69782 -> 69766 bytes cppcryptfs/ui/CreatePropertyPage.cpp | 19 +++++++++++++++++-- cppcryptfs/ui/FsInfoDialog.cpp | 1 + 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/cppcryptfs/cppcryptfs.rc b/cppcryptfs/cppcryptfs.rc index e465518b1f598b24114f2a7235b108910e087adb..3ed2fd7c0eace92db850c9bf96019cd27f739a05 100644 GIT binary patch delta 61 zcmbQXkfm)Q%Z3u}$p^SZCiif!0n!qa&#`kf$M9^A;bG)sn%q_?GP#b4Z~6p2#sVmZ LW4i)BV;Lg=vqThW delta 67 zcmZo$$TDpq%Z3teR(%G22BnFG!jn6=*DwP)llOB;PCm!Z(Hz3FJ%opmj|n6=J&})b OGK?X+U4Wmlj1d5coe?1b diff --git a/cppcryptfs/ui/CreatePropertyPage.cpp b/cppcryptfs/ui/CreatePropertyPage.cpp index 8a8c2d2..2b1c381 100755 --- a/cppcryptfs/ui/CreatePropertyPage.cpp +++ b/cppcryptfs/ui/CreatePropertyPage.cpp @@ -294,7 +294,15 @@ void CCreatePropertyPage::CreateCryptfs() if (nenc < 0 || nenc >= NUM_FN_ENC_TYPES) return; - theApp.WriteProfileStringW(L"CreateOptions", L"FilenameEncryption", filename_encryption_types[nenc]); + //To save localization-independent text in the registry + CString filename_encryption_type_for_registry; + if (filename_encryption_types[nenc] == strMsgPlainText) { + filename_encryption_type_for_registry = L"Plain text"; + } else { + filename_encryption_type_for_registry = filename_encryption_types[nenc]; + } + + theApp.WriteProfileStringW(L"CreateOptions", L"FilenameEncryption", filename_encryption_type_for_registry); pLbox = (CComboBox*)GetDlgItem(IDC_DATA_ENCRYPTION); if (!pLbox) @@ -380,7 +388,14 @@ BOOL CCreatePropertyPage::OnInitDialog() CString creverse = theApp.GetProfileStringW(L"CreateOptions", L"Reverse", L"0"); - CString cfnenc = theApp.GetProfileStringW(L"CreateOptions", L"FilenameEncryption", L"AES256-EME"); + //To extract localization-independent text from the registry + CString cfnenc; + CString cfnenc_tmp = theApp.GetProfileStringW(L"CreateOptions", L"FilenameEncryption", L"AES256-EME"); + if (cfnenc_tmp == L"Plain text") { + cfnenc = strMsgPlainText; + } else { + cfnenc = cfnenc_tmp; + } CString cdataenc = theApp.GetProfileStringW(L"CreateOptions", L"DataEncryption", L"AES256-GCM"); diff --git a/cppcryptfs/ui/FsInfoDialog.cpp b/cppcryptfs/ui/FsInfoDialog.cpp index 06298e9..845d611 100644 --- a/cppcryptfs/ui/FsInfoDialog.cpp +++ b/cppcryptfs/ui/FsInfoDialog.cpp @@ -108,6 +108,7 @@ BOOL CFsInfoDialog::OnInitDialog() SetDlgItemText(IDC_MOUNT_POINT, m_mountPoint); SetDlgItemText(IDC_CONFIG_PATH, m_info.configPath.c_str()); + //To display localized text in the GUI LPCWSTR none = strMsgNone; if (m_info.fileNameEncryption == L"none") { SetDlgItemText(IDC_FILE_NAME_ENCRYPTION, none); From 698544484dc6acae88ada028f45531cc27b6e274 Mon Sep 17 00:00:00 2001 From: nbb1967 Date: Wed, 18 Feb 2026 12:00:33 +0300 Subject: [PATCH 19/35] spelling --- cppcryptfs/cppcryptfs.rc | Bin 69766 -> 69766 bytes cppcryptfs/dokan/cryptdokan.cpp | 2 +- cppcryptfs/resource.h | Bin 25874 -> 25874 bytes 3 files changed, 1 insertion(+), 1 deletion(-) diff --git a/cppcryptfs/cppcryptfs.rc b/cppcryptfs/cppcryptfs.rc index 3ed2fd7c0eace92db850c9bf96019cd27f739a05..ec7200144e769119c1fb432f249bc7252aa9e6a3 100644 GIT binary patch delta 24 gcmZo$$kMiuWkbPbMvuw)mlY=)OcUF@;_^Kk0EIIPKmY&$ delta 18 acmZo$$kMiuWkbQ`$wikHHcz Date: Wed, 18 Feb 2026 12:37:24 +0300 Subject: [PATCH 20/35] formatting --- cppcryptfs/ui/CreatePropertyPage.cpp | 10 ++++---- cppcryptfs/ui/CryptAboutPropertyPage.cpp | 32 ++++++++++++------------ 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/cppcryptfs/ui/CreatePropertyPage.cpp b/cppcryptfs/ui/CreatePropertyPage.cpp index 2b1c381..46f6f97 100755 --- a/cppcryptfs/ui/CreatePropertyPage.cpp +++ b/cppcryptfs/ui/CreatePropertyPage.cpp @@ -43,11 +43,11 @@ THE SOFTWARE. #include "util/util.h" #include "locutils.h" -static CString strMsgPlainText = LocUtils::GetStringFromResources(IDS_PLAIN_TEXT).c_str(); +static CString listBoxStringPlainText = LocUtils::GetStringFromResources(IDS_PLAIN_TEXT).c_str(); static const WCHAR *filename_encryption_types[] = { L"AES256-EME", - strMsgPlainText + listBoxStringPlainText }; #define NUM_FN_ENC_TYPES (sizeof(filename_encryption_types)/sizeof(filename_encryption_types[0])) @@ -205,7 +205,7 @@ void CCreatePropertyPage::CreateCryptfs() if (cfenc == L"AES256-EME") eme = true; - else if (cfenc == strMsgPlainText) + else if (cfenc == listBoxStringPlainText) plaintext = true; if (!plaintext) { @@ -296,7 +296,7 @@ void CCreatePropertyPage::CreateCryptfs() //To save localization-independent text in the registry CString filename_encryption_type_for_registry; - if (filename_encryption_types[nenc] == strMsgPlainText) { + if (filename_encryption_types[nenc] == listBoxStringPlainText) { filename_encryption_type_for_registry = L"Plain text"; } else { filename_encryption_type_for_registry = filename_encryption_types[nenc]; @@ -392,7 +392,7 @@ BOOL CCreatePropertyPage::OnInitDialog() CString cfnenc; CString cfnenc_tmp = theApp.GetProfileStringW(L"CreateOptions", L"FilenameEncryption", L"AES256-EME"); if (cfnenc_tmp == L"Plain text") { - cfnenc = strMsgPlainText; + cfnenc = listBoxStringPlainText; } else { cfnenc = cfnenc_tmp; } diff --git a/cppcryptfs/ui/CryptAboutPropertyPage.cpp b/cppcryptfs/ui/CryptAboutPropertyPage.cpp index e642a3a..749d63f 100755 --- a/cppcryptfs/ui/CryptAboutPropertyPage.cpp +++ b/cppcryptfs/ui/CryptAboutPropertyPage.cpp @@ -104,24 +104,24 @@ BEGIN_MESSAGE_MAP(CCryptAboutPropertyPage, CCryptPropertyPage) ON_NOTIFY(LVN_ITEMCHANGED, IDC_COMPONENTS_LIST, &CCryptAboutPropertyPage::OnItemchangedComponentsList) END_MESSAGE_MAP() -static CString strMsgCppcryptfs = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_CPPCRYPTFS).c_str(); -static CString strMsgOpenSSL = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_OPENSSL).c_str(); -static CString strMsgRapidJSON = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_RAPIDJSON).c_str(); -static CString strMsgDokanyMir = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_DOKANY_MIR).c_str(); -static CString strMsgDokanyLib = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_DOKANY_LIB).c_str(); -static CString strMsgSecuryEdit = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_SECURE_EDIT).c_str(); -static CString strMsgGetOpt = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_GETOPT_PORT).c_str(); -static CString strMsgAESSIV = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_AES_SIV).c_str(); +static CString listBoxStringCppcryptfs = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_CPPCRYPTFS).c_str(); +static CString listBoxStringOpenSSL = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_OPENSSL).c_str(); +static CString listBoxStringRapidJSON = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_RAPIDJSON).c_str(); +static CString listBoxStringDokanyMir = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_DOKANY_MIR).c_str(); +static CString listBoxStringDokanyLib = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_DOKANY_LIB).c_str(); +static CString listBoxStringSecuryEdit = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_SECURE_EDIT).c_str(); +static CString listBoxStringGetOpt = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_GETOPT_PORT).c_str(); +static CString listBoxStringAESSIV = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_AES_SIV).c_str(); static const WCHAR* components[] = { - strMsgCppcryptfs, - strMsgOpenSSL, - strMsgRapidJSON, - strMsgDokanyMir, - strMsgDokanyLib, - strMsgSecuryEdit, - strMsgGetOpt, - strMsgAESSIV, + listBoxStringCppcryptfs, + listBoxStringOpenSSL, + listBoxStringRapidJSON, + listBoxStringDokanyMir, + listBoxStringDokanyLib, + listBoxStringSecuryEdit, + listBoxStringGetOpt, + listBoxStringAESSIV, NULL }; From 87e820603aa8187c9510abd727f92024f4bb575c Mon Sep 17 00:00:00 2001 From: nbb1967 Date: Wed, 18 Feb 2026 13:11:14 +0300 Subject: [PATCH 21/35] frm --- cppcryptfs/ui/CryptAboutPropertyPage.cpp | 32 ++++++++++++------------ 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/cppcryptfs/ui/CryptAboutPropertyPage.cpp b/cppcryptfs/ui/CryptAboutPropertyPage.cpp index 749d63f..c6f61fe 100755 --- a/cppcryptfs/ui/CryptAboutPropertyPage.cpp +++ b/cppcryptfs/ui/CryptAboutPropertyPage.cpp @@ -104,24 +104,24 @@ BEGIN_MESSAGE_MAP(CCryptAboutPropertyPage, CCryptPropertyPage) ON_NOTIFY(LVN_ITEMCHANGED, IDC_COMPONENTS_LIST, &CCryptAboutPropertyPage::OnItemchangedComponentsList) END_MESSAGE_MAP() -static CString listBoxStringCppcryptfs = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_CPPCRYPTFS).c_str(); -static CString listBoxStringOpenSSL = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_OPENSSL).c_str(); -static CString listBoxStringRapidJSON = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_RAPIDJSON).c_str(); -static CString listBoxStringDokanyMir = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_DOKANY_MIR).c_str(); -static CString listBoxStringDokanyLib = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_DOKANY_LIB).c_str(); -static CString listBoxStringSecuryEdit = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_SECURE_EDIT).c_str(); -static CString listBoxStringGetOpt = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_GETOPT_PORT).c_str(); -static CString listBoxStringAESSIV = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_AES_SIV).c_str(); +static CString listViewStringCppcryptfs = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_CPPCRYPTFS).c_str(); +static CString listViewStringOpenSSL = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_OPENSSL).c_str(); +static CString listViewStringRapidJSON = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_RAPIDJSON).c_str(); +static CString listViewStringDokanyMir = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_DOKANY_MIR).c_str(); +static CString listViewStringDokanyLib = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_DOKANY_LIB).c_str(); +static CString listViewStringSecuryEdit = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_SECURE_EDIT).c_str(); +static CString listViewStringGetOpt = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_GETOPT_PORT).c_str(); +static CString listViewStringAESSIV = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_AES_SIV).c_str(); static const WCHAR* components[] = { - listBoxStringCppcryptfs, - listBoxStringOpenSSL, - listBoxStringRapidJSON, - listBoxStringDokanyMir, - listBoxStringDokanyLib, - listBoxStringSecuryEdit, - listBoxStringGetOpt, - listBoxStringAESSIV, + listViewStringCppcryptfs, + listViewStringOpenSSL, + listViewStringRapidJSON, + listViewStringDokanyMir, + listViewStringDokanyLib, + listViewStringSecuryEdit, + listViewStringGetOpt, + listViewStringAESSIV, NULL }; From 07b2de8e532ab230ac27b768ca5168a4f392e90b Mon Sep 17 00:00:00 2001 From: nbb1967 Date: Wed, 18 Feb 2026 13:45:41 +0300 Subject: [PATCH 22/35] frm2 --- cppcryptfs/cppcryptfs.rc | Bin 69766 -> 69766 bytes cppcryptfs/resource.h | Bin 25874 -> 25874 bytes cppcryptfs/ui/MountPropertyPage.cpp | 2 +- cppcryptfs/ui/SettingsPropertyPage.cpp | 42 ++++++++++++------------- 4 files changed, 22 insertions(+), 22 deletions(-) diff --git a/cppcryptfs/cppcryptfs.rc b/cppcryptfs/cppcryptfs.rc index ec7200144e769119c1fb432f249bc7252aa9e6a3..e5ecd89f16b435fab24ca65e15c34222f943b77a 100644 GIT binary patch delta 38 wcmV+>0NMYBp#+AZ1hCSqlW43A2Sor(07U>)lb^03lYl`ElfcFZvmC8zVZ;lh&;s*eFu?Tno delta 30 kcmbPqigD5@#tklF+%62R3_d^{!r(gDHbilAf!HEH0FW#Q@c;k- diff --git a/cppcryptfs/ui/MountPropertyPage.cpp b/cppcryptfs/ui/MountPropertyPage.cpp index 47f2853..13c6aa5 100644 --- a/cppcryptfs/ui/MountPropertyPage.cpp +++ b/cppcryptfs/ui/MountPropertyPage.cpp @@ -1760,7 +1760,7 @@ void CMountPropertyPage::OnContextMenu(CWnd* pWnd, CPoint point) menu.AppendMenu(MF_ENABLED, DismountV, LocUtils::GetStringFromResources(IDS_MENU_DISMOUNT).c_str()); } if (is_mountpoint_a_dir(cmp)) { - menu.AppendMenu(mounted ? MF_DISABLED : MF_ENABLED, DeleteMountPointV, LocUtils::GetStringFromResources(IDS_DELETE_MOUNT_POINT).c_str()); + menu.AppendMenu(mounted ? MF_DISABLED : MF_ENABLED, DeleteMountPointV, LocUtils::GetStringFromResources(IDS_MENU_DELETE_MPOINT).c_str()); } } diff --git a/cppcryptfs/ui/SettingsPropertyPage.cpp b/cppcryptfs/ui/SettingsPropertyPage.cpp index 69fc145..37c0e51 100644 --- a/cppcryptfs/ui/SettingsPropertyPage.cpp +++ b/cppcryptfs/ui/SettingsPropertyPage.cpp @@ -96,27 +96,27 @@ static buffer_size_t buffer_sizes[] = { 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2 static int ttls[] = { 0, 1, 2, 5, 10, 15, 30, 45, 60, 90, 120, 300, 600, 900, 1800, 3600}; -static CString ttl_0 = LocUtils::GetStringFromResources(IDS_TTL_INFINITE).c_str(); -static CString ttl_1 = LocUtils::GetStringFromResources(IDS_TTL_SEC_1).c_str(); -static CString ttl_2 = LocUtils::GetStringFromResources(IDS_TTL_SEC_2).c_str(); -static CString ttl_5 = LocUtils::GetStringFromResources(IDS_TTL_SEC_5).c_str(); -static CString ttl_10 = LocUtils::GetStringFromResources(IDS_TTL_SEC_10).c_str(); -static CString ttl_15 = LocUtils::GetStringFromResources(IDS_TTL_SEC_15).c_str(); -static CString ttl_30 = LocUtils::GetStringFromResources(IDS_TTL_SEC_30).c_str(); -static CString ttl_45 = LocUtils::GetStringFromResources(IDS_TTL_SEC_45).c_str(); -static CString ttl_60 = LocUtils::GetStringFromResources(IDS_TTL_SEC_60).c_str(); -static CString ttl_90 = LocUtils::GetStringFromResources(IDS_TTL_SEC_90).c_str(); -static CString ttl_120 = LocUtils::GetStringFromResources(IDS_TTL_MIN_2).c_str(); -static CString ttl_300 = LocUtils::GetStringFromResources(IDS_TTL_MIN_5).c_str(); -static CString ttl_600 = LocUtils::GetStringFromResources(IDS_TTL_MIN_10).c_str(); -static CString ttl_900 = LocUtils::GetStringFromResources(IDS_TTL_MIN_15).c_str(); -static CString ttl_1800 = LocUtils::GetStringFromResources(IDS_TTL_MIN_30).c_str(); -static CString ttl_3600 = LocUtils::GetStringFromResources(IDS_TTL_HOUR_1).c_str(); - -static const WCHAR* ttl_strings[] = { ttl_0, ttl_1, ttl_2, ttl_5, - ttl_10, ttl_15, ttl_30, ttl_45, - ttl_60, ttl_90, ttl_120, ttl_300, - ttl_600, ttl_900, ttl_1800, ttl_3600 }; +static CString listBoxStringInfinite = LocUtils::GetStringFromResources(IDS_TTL_INFINITE).c_str(); +static CString listBoxStringSec1 = LocUtils::GetStringFromResources(IDS_TTL_SEC_1).c_str(); +static CString listBoxStringSec2 = LocUtils::GetStringFromResources(IDS_TTL_SEC_2).c_str(); +static CString listBoxStringSec5 = LocUtils::GetStringFromResources(IDS_TTL_SEC_5).c_str(); +static CString listBoxStringSec10 = LocUtils::GetStringFromResources(IDS_TTL_SEC_10).c_str(); +static CString listBoxStringSec15 = LocUtils::GetStringFromResources(IDS_TTL_SEC_15).c_str(); +static CString listBoxStringSec30 = LocUtils::GetStringFromResources(IDS_TTL_SEC_30).c_str(); +static CString listBoxStringSec45 = LocUtils::GetStringFromResources(IDS_TTL_SEC_45).c_str(); +static CString listBoxStringSec60 = LocUtils::GetStringFromResources(IDS_TTL_SEC_60).c_str(); +static CString listBoxStringSec90 = LocUtils::GetStringFromResources(IDS_TTL_SEC_90).c_str(); +static CString listBoxStringMin2 = LocUtils::GetStringFromResources(IDS_TTL_MIN_2).c_str(); +static CString listBoxStringMin5 = LocUtils::GetStringFromResources(IDS_TTL_MIN_5).c_str(); +static CString listBoxStringMin10 = LocUtils::GetStringFromResources(IDS_TTL_MIN_10).c_str(); +static CString listBoxStringMin15 = LocUtils::GetStringFromResources(IDS_TTL_MIN_15).c_str(); +static CString listBoxStringMin30 = LocUtils::GetStringFromResources(IDS_TTL_MIN_30).c_str(); +static CString listBoxStringHour1 = LocUtils::GetStringFromResources(IDS_TTL_HOUR_1).c_str(); + +static const WCHAR* ttl_strings[] = { listBoxStringInfinite, listBoxStringSec1, listBoxStringSec2, listBoxStringSec5, + listBoxStringSec10, listBoxStringSec15, listBoxStringSec30, listBoxStringSec45, + listBoxStringSec60, listBoxStringSec90, listBoxStringMin2, listBoxStringMin5, + listBoxStringMin10, listBoxStringMin15, listBoxStringMin30, listBoxStringHour1 }; BOOL CSettingsPropertyPage::OnInitDialog() { From f72712e30a3951fe5f29a02e995869d23c43a0a7 Mon Sep 17 00:00:00 2001 From: nbb1967 Date: Tue, 24 Feb 2026 00:13:03 +0300 Subject: [PATCH 23/35] Splitting RC. MUI --- cppcryptfs/cppcryptfs.rc | Bin 69766 -> 6232 bytes cppcryptfs/cppcryptfs.vcxproj | 44 +++++++++++++----- cppcryptfs/res/en/Resources_EN.aps | Bin 0 -> 117044 bytes cppcryptfs/res/en/Resources_EN.rc | Bin 0 -> 64982 bytes .../en/aessiv.txt => en/lic/aessiv_en.txt} | Bin .../lic/cppcryptfs_en.txt} | Bin .../lic/dokany_lib_en.txt} | Bin .../lic/dokany_mir_en.txt} | Bin .../en/getopt.txt => en/lic/getopt_en.txt} | Bin .../en/openssl.txt => en/lic/openssl_en.txt} | Bin 11360 -> 11356 bytes .../rapidjson.txt => en/lic/rapidjson_en.txt} | Bin .../lic/secure_edit_en.txt} | Bin cppcryptfs/res/ru/Resources_RU.aps | Bin 0 -> 130120 bytes cppcryptfs/res/ru/Resources_RU.rc | Bin 0 -> 70072 bytes cppcryptfs/res/ru/lic/aessiv_ru.txt | Bin 0 -> 2834 bytes cppcryptfs/res/ru/lic/cppcryptfs_ru.txt | Bin 0 -> 4094 bytes cppcryptfs/res/ru/lic/dokany_lib_ru.txt | Bin 0 -> 17216 bytes cppcryptfs/res/ru/lic/dokany_mir_ru.txt | Bin 0 -> 3502 bytes cppcryptfs/res/ru/lic/getopt_ru.txt | Bin 0 -> 3896 bytes cppcryptfs/res/ru/lic/openssl_ru.txt | Bin 0 -> 13274 bytes cppcryptfs/res/ru/lic/rapidjson_ru.txt | Bin 0 -> 12014 bytes cppcryptfs/res/ru/lic/secure_edit_ru.txt | Bin 0 -> 996 bytes 22 files changed, 32 insertions(+), 12 deletions(-) create mode 100644 cppcryptfs/res/en/Resources_EN.aps create mode 100644 cppcryptfs/res/en/Resources_EN.rc rename cppcryptfs/res/{lic/en/aessiv.txt => en/lic/aessiv_en.txt} (100%) rename cppcryptfs/res/{lic/en/cppcryptfs.txt => en/lic/cppcryptfs_en.txt} (100%) rename cppcryptfs/res/{lic/en/dokany_lib.txt => en/lic/dokany_lib_en.txt} (100%) rename cppcryptfs/res/{lic/en/dokany_mir.txt => en/lic/dokany_mir_en.txt} (100%) rename cppcryptfs/res/{lic/en/getopt.txt => en/lic/getopt_en.txt} (100%) rename cppcryptfs/res/{lic/en/openssl.txt => en/lic/openssl_en.txt} (99%) rename cppcryptfs/res/{lic/en/rapidjson.txt => en/lic/rapidjson_en.txt} (100%) rename cppcryptfs/res/{lic/en/secure_edit.txt => en/lic/secure_edit_en.txt} (100%) create mode 100644 cppcryptfs/res/ru/Resources_RU.aps create mode 100644 cppcryptfs/res/ru/Resources_RU.rc create mode 100644 cppcryptfs/res/ru/lic/aessiv_ru.txt create mode 100644 cppcryptfs/res/ru/lic/cppcryptfs_ru.txt create mode 100644 cppcryptfs/res/ru/lic/dokany_lib_ru.txt create mode 100644 cppcryptfs/res/ru/lic/dokany_mir_ru.txt create mode 100644 cppcryptfs/res/ru/lic/getopt_ru.txt create mode 100644 cppcryptfs/res/ru/lic/openssl_ru.txt create mode 100644 cppcryptfs/res/ru/lic/rapidjson_ru.txt create mode 100644 cppcryptfs/res/ru/lic/secure_edit_ru.txt diff --git a/cppcryptfs/cppcryptfs.rc b/cppcryptfs/cppcryptfs.rc index e5ecd89f16b435fab24ca65e15c34222f943b77a..76ce69c904c0899340950c4a54b05b8ec3bb2f95 100644 GIT binary patch delta 395 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 0x0409 _DEBUG;%(PreprocessorDefinitions) - $(IntDir);%(AdditionalIncludeDirectories) + $(IntDir);$(ProjectDir);$(ProjectDir)res\en;$(ProjectDir)res\ru;%(AdditionalIncludeDirectories) @@ -148,7 +148,7 @@ 0x0409 _DEBUG;%(PreprocessorDefinitions) - $(IntDir);%(AdditionalIncludeDirectories) + $(IntDir);$(ProjectDir);$(ProjectDir)res\en;$(ProjectDir)res\ru;%(AdditionalIncludeDirectories) @@ -181,7 +181,7 @@ 0x0409 NDEBUG;%(PreprocessorDefinitions) - $(IntDir);%(AdditionalIncludeDirectories) + $(IntDir);$(ProjectDir);$(ProjectDir)res\en;$(ProjectDir)res\ru;%(AdditionalIncludeDirectories) for /f %%i in ('git rev-parse --short HEAD') do (echo VALUE "FileDescription", "cppcryptfs build %%i" > "$(ProjectDir)gitversion.rc2") @@ -218,7 +218,7 @@ 0x0409 NDEBUG;%(PreprocessorDefinitions) - $(IntDir);%(AdditionalIncludeDirectories) + $(IntDir);$(ProjectDir);$(ProjectDir)res\en;$(ProjectDir)res\ru;%(AdditionalIncludeDirectories) for /f %%i in ('git rev-parse --short HEAD') do (echo VALUE "FileDescription", "cppcryptfs build %%i" > "$(ProjectDir)gitversion.rc2") @@ -313,6 +313,18 @@ + + true + true + true + true + + + true + true + true + true + @@ -322,14 +334,22 @@ - - - - - - - - + + + + + + + + + + + + + + + + diff --git a/cppcryptfs/res/en/Resources_EN.aps b/cppcryptfs/res/en/Resources_EN.aps new file mode 100644 index 0000000000000000000000000000000000000000..7daa609964fdd4ef5661b2e958572e3f6ef3e584 GIT binary patch literal 117044 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 D1Xiq^ literal 0 HcmV?d00001 diff --git a/cppcryptfs/res/en/Resources_EN.rc b/cppcryptfs/res/en/Resources_EN.rc new file mode 100644 index 0000000000000000000000000000000000000000..34472e7b6e02889ad47cfb8cad4e30333002a085 GIT binary patch literal 64982 zcmeI5`)?dalIQ!^IpF>WZVy #*zl4tL+lt@Y(Qxcb?W&1EVLe^`vmMO0&&De+g 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 Tdw!$HL+#42^^fTE?$7@ZKPXkb literal 0 HcmV?d00001 diff --git a/cppcryptfs/res/lic/en/aessiv.txt b/cppcryptfs/res/en/lic/aessiv_en.txt similarity index 100% rename from cppcryptfs/res/lic/en/aessiv.txt rename to cppcryptfs/res/en/lic/aessiv_en.txt diff --git a/cppcryptfs/res/lic/en/cppcryptfs.txt b/cppcryptfs/res/en/lic/cppcryptfs_en.txt similarity index 100% rename from cppcryptfs/res/lic/en/cppcryptfs.txt rename to cppcryptfs/res/en/lic/cppcryptfs_en.txt diff --git a/cppcryptfs/res/lic/en/dokany_lib.txt b/cppcryptfs/res/en/lic/dokany_lib_en.txt similarity index 100% rename from cppcryptfs/res/lic/en/dokany_lib.txt rename to cppcryptfs/res/en/lic/dokany_lib_en.txt diff --git a/cppcryptfs/res/lic/en/dokany_mir.txt b/cppcryptfs/res/en/lic/dokany_mir_en.txt similarity index 100% rename from cppcryptfs/res/lic/en/dokany_mir.txt rename to cppcryptfs/res/en/lic/dokany_mir_en.txt diff --git a/cppcryptfs/res/lic/en/getopt.txt b/cppcryptfs/res/en/lic/getopt_en.txt similarity index 100% rename from cppcryptfs/res/lic/en/getopt.txt rename to cppcryptfs/res/en/lic/getopt_en.txt diff --git a/cppcryptfs/res/lic/en/openssl.txt b/cppcryptfs/res/en/lic/openssl_en.txt similarity index 99% rename from cppcryptfs/res/lic/en/openssl.txt rename to cppcryptfs/res/en/lic/openssl_en.txt index 60672bfd104fc44993d028500dd5ddaa4a8d9dc8..189d7f8283818edec34e7498d093ea30dee00bf1 100644 GIT binary patch delta 7 OcmaD5aVKI!j1B-0*8`;h delta 12 TcmcZ;@gQPDj1CJg0~Z4TBV+@> diff --git a/cppcryptfs/res/lic/en/rapidjson.txt b/cppcryptfs/res/en/lic/rapidjson_en.txt similarity index 100% rename from cppcryptfs/res/lic/en/rapidjson.txt rename to cppcryptfs/res/en/lic/rapidjson_en.txt diff --git a/cppcryptfs/res/lic/en/secure_edit.txt b/cppcryptfs/res/en/lic/secure_edit_en.txt similarity index 100% rename from cppcryptfs/res/lic/en/secure_edit.txt rename to cppcryptfs/res/en/lic/secure_edit_en.txt diff --git a/cppcryptfs/res/ru/Resources_RU.aps b/cppcryptfs/res/ru/Resources_RU.aps new file mode 100644 index 0000000000000000000000000000000000000000..6530ad3c554af0b8ed62267aa2faed047e91c78b GIT binary patch literal 130120 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 ViSdi?4<3if=&)Xg_XnQl{{Z6PioyT@ literal 0 HcmV?d00001 diff --git a/cppcryptfs/res/ru/Resources_RU.rc b/cppcryptfs/res/ru/Resources_RU.rc new file mode 100644 index 0000000000000000000000000000000000000000..d16e5bf81f2694a995e8ee86386adfd091b88eb4 GIT binary patch literal 70072 zcmeI5`)?dalIQCO{xSy~a5L-09*h~g-QLs6fMt^uDN;|14^h&Hk~oqq+lRpsT3PmJ zN0tps-thqYx9@Iz^4r0DR908@gB}StAe!A>-CY?O85!@0{ICD~w0Tqi{%7+)0&EA( z_sx&ZsCi`npENIVgGlV`^{Z@erC`;wL36B;QT0oblIdFFd_8Xuh+naSo1oU}n9*FTZ|aubvsS{_F3;Jf7OjM>Z2-8|ZeLd(BOQdB^_W zXpWoP&3*#YZM$O}i@EOGHy_zU7?WbjcDRyyUH5>U@$$ItgvG* z$9qagK2zrPmp~0b?!S9!_xp>z2V<<4)*IUVFktqnjrCK&z^ECA(NhZh#IP_96jJ;4 z6Pw4+li$Q|a_I`{XDnXys)`_n|;bRpuK&Y?@rh+>?8Kg zmxhb|fY(EN2bFSVwE@Taf8H>%8Q!lOezwAWAKI_Kn(V%PTZ?0R+z31KzES)m`|W>( z`|`Ly`Hhz9!qkn1FxX)Mi&~Lv8cRjM-9@$DCWmos?E=M-XZTs|I z_KEJm2>0w)%)0#UxOs17)O@ybedXH9dHcV*a>f2OS46P~;f}z+9cDZ>Xo2Wq;At-m zvta9mVRxKh$g%aaVTv(#ZTy=C-M#Q`WWV8WZ*uPk_IxxHB z88Vwk0Uw8US8)HaefObpnpbuw_`&Puu|2bE&)XUS+o4?n`w#5b+~vW^s`w}DCb$zk zl+^{~lF z%Nqt$y4FzRgUWUI;jTgP$UZ-^nZfx#4*T?Do9lL<&CO;b!!^`&+kWxLM)@*8lwx{h zp9#xgfHmi?&^R1`)%5$W**o5YAt?ECn+0^oj9C}KuTOXEQ(y$|do~kh>^RjoSPN#( znjRV^)7j_0f{GksMy$_5-xwP&LvBAc{`OaUer+7~mBBn}){U;Ouk5UBuiQ79Uo$?w zVUJaNtOx0N!QPuBwa<4~F5CC7t*otFwHmA zO*V{9FR$ENxf!Skik(l!ZWs-_gat#ZravxE&h7^~hKC&+jiJN9ZQ*BcgN&7yG+c6C zv{`Khs@|G#=~8m`bG|dp`?k||ZO3)-8g z`>16)bwmHuCG;&@-BLpPcOKd=qpl?U=CV1J z+PQ9$$}+UphsGUugI0iE05tJ$+?+Aqd&eX$I%pf4=v+4pO1SH~VNrM#J}-nhuNg+t z5r?eYKigOrZC6TWUR~KYE`Q!u6BrKc_4a@@y%1u-i!dh#ujqRr~FOL?#a1oiiLh&h`w;9i5deI zNiJWaE*1HqLtN*F{iD8Tqnt78L0U?COmwz~X7#xiht({TM(3ooQ|u_BXPTu{W`wMc>kcr_H%v_MC07&9E?~ zhEdZ#)1YfhmoP1PVlQ3^SGI!|F3T~cFz4d((#cj?HlK7m zO7nzrrOSv@)-5NrGkhiJ;{U(dPSEO>?MLk3U(Rak-@!xley#EPgqD|~^HKl#bxAX1%@)!4&j(#YGVe6>eYhR#x*0SL=L~P}>Mlp$XVry~c~^a? zPU(_Idh9YaN=dV*m5AdnOP}ngdoXbA#ADho@l*e>uyQf@F!4RXcXD6myqY%i7iOf* zps)SXm^st@)-}v{^e3zde}xq{~C&o$EHUs286Heo=JD&bXbMr z?eZRDb(A=9Ev4JS=%yt(Bt5j0yB|DAKJ<lHp+>soYn3K`%?-oZzb8-y_9lOLzzn4z_EBORU zzi8?y;of)zv6nXk4bN*q%&#p)EonYo>3v&aWo5y2uN$u*`zq$Pr0ZPc6ljm=?2=;h z@d-r-r3c*$E2evr|Hew{-E_HiI@(V^?c1-jydTEYFz5-whZUv{}ng7Il zZ->a|yc%*n>qG0i9k}Uw*xOKb?&;{q7QXe;E_f$k=rhCBZisKPv#|%rIJ^{a(au67 z6PjI3CheB}{;F|;e1FGyKVAzw803XMusyg;ACR!3T;N5p(#|8;vAN}YQTe?d?cOv` zW4asV1B|v3(Qiqxb_9HW>uDNoKn>Cf-QPYdb^Ok#W82o8nhyB5X`*3orMS3nR6^We zyNdPSw(Qgt6J+!&_lbHI&jPq**gz_i7x>kwPyyPkc>KKcKht~|=6%^Xv1aLhPV6V@ zoL*T*G&x*9SSB>panDW8QU$YZpYKh6t1K$65FOaH2OjD3_Q<``Xl~fS*uY>4ed~e! zQ2~H97k#LwMK9-rH)#HSLp~gS2JFkobrlVXc)`CAbCMi8DaDX$%KkYH-s3cjLObX* zcm^7Qa=_-NmOLIIiizCSB?+}r&{OVRVZPCxIySxhhV2VhojHR8EUeSqEz*MKU;THD zTcDLhPws3OhMMi z1g#7{vJpHLR}AYpR`F8GUQi7q@Q|Sy{WXihfhQ4v@ikj*@j0rg_N<0R*}z^|m1_t< zCEJz?zz4R=wbI}R->-8c*~_ZdD030}HN5u&3}k_(@VG|ovI>u{b1LV^*o>PtBcgsD z)8-2GOOp4{b6O)*dWd{p@UVjuPKGQ)!VwvywxG-gUA{g@?mOOwE;{eW;+f{3jIyT^}|Sv%6sX0(nR7I{MMqp+@f2iT{bH9J^7NfG!>cJsE$|Y0ch!`SZ*9 z-`a{wgJTECHsT7rzRa)o+E&(B(GurA%cpZ?la=cVcBfU*<@VSR@0z@>`0(ETx^?l# zoI8pGB14czvsSM|SHh70pI%uf>DVppY98B*!Lp&c8ozDsMfEzB?mG_m*D?Y&%V);l zRl^H^r@mVq56C}KRVF?pvKpidsFs-bdBtxYXHyJ}y(`Wv%Uw0AzM}nd>emK45*gp1 zTkG&BEYB^2Dq3ZC1K(l>*X(a?G9xmhb0}3;kJhHX1^8`tf~K-uD{MRL8M4^fHRw4= z?9!vvPif1cn^mI)`Lp2+yJ3}c4e8EGt{>sy)_P;zvISGCw#CbJ_a>klTnp7> zWE>$yHjRGD3h^4fYz005)rekH!Rz$WkFDPsU0evXDo7O%QuP;9QJ<6QJnD1OUSh|s z*(}hA+AG4RlA5!46z@#-r}GZ>bqaeLePV5>VDmX3rDY?y?smHsV{1?w4&9obvgT@HeVtR5r7^%c78 zy#3KY`Z+)uU>I)R&qdx`EhgsGq>-f3#_iuhUO9g$vn%qwiZv~}2N{F?lgAVLM;RO5 zZw5))#Vh*8C({Ke<{ux~4xh;DbNj~inEQO=j*L&LqPcGzc~Rz_U+z8iZ0v2T3k zSI#@WQxTjv?y5a|4aRF#{eAEV-}Ay#$A@#=2qD@-A0%4~QQog7lAM?-Q9-y)9!p*A zg+P(Yd2#Wst$;@s`^Q3STx6$Bx9|IKO~utBqtBC5(GSyNyypYMK32r2ffH=mZcsc6 zfB%s6SZpVpvj{zTCFn)lM(xqp!rl}N=mF2I2NSXOerznpsfNKb>kh%jUW9IjLFM%e zWu8Mn&KBdY4=qkgS5kVGrm?=*rv$lwK9SP$YGBvk5se*9h?0_xa}>0|he1yqZt--% z5%Uum>3*o?mpgvC7jy4) zT>mKJmpgXqr&lD-xspru<&H|sdQl{-6!=-s1!2}!+e-YBm44y;#(tI0z0=qs^3RJ)TW#U1;x1ev6Qhej=?GE%+>5?eW`ZAx-j=EKzN*|mN2Lr%hJULS`%`~u zv{s@3i`N1EZ7RRsF`pYz$;-jtMub+KD6aiNnJG7I?~{dk6gr=9f<^vE2h_#5UFr$S z<2Bn8Uy$k&)w9;)cMe5=KExTz(f`@F89ndPv4(Ivx;5&T%guDSILYzAv*mqoX06OP zGl7i#JnOtPCvk#h=Ada_vXpj%Qyj)ucI$v(F6; z4~t2-Ih{FbQ`# zGwr*~Bp$L~IRis=Gh|aM$Jjk;*qFulXtiHDMa-e+nTJjY@^0VCtNi|I@_n+y z88!dKeS=T;R$eV#&IMz{mik1{(^jWgl%MNVv;12=a=nWJb(@^81ZKtt0cQg0^t%Il z=FAsPnd8hlW!JbyQomdLG`%Y`QCI#A)2}!^MKkwr>v{Se{kxBC9kJiQ!PwyDygyE0 z=2gEhSmorxAMKeF*GkxHS-GFs z_kRxatKqLc&Y^w(+b{yS`oXZo`hIKYk-a{_)4XQ`Z5o!la6HS|K*MKqe*!%e3f6pe zc$cpHvaok#<8jX4PZrC4J!p+)p{@Mx^HW%qF-`;REBQWuZ20=|1bg%B@O&SZ=aEWY zXqUjLoCB~g@i|d9kgj@!H@@O?9&eMpylcDdrBRE+?Q`HX8mgX-!XEtG_TekTglhCY z58tkHzqB9E*f??fE;+r`@8VS9M*)%K27((h9~0~c~%(0Ts+ zp3U~iIJ9>J#nu5I<*#c{QAMFs1>7&aC{%tTK_66+{^BcN%{P-09Xfy3slOiI_p3bf z@KqwOgxWLp?;u{+UM*HCKUKC|yY~CBab+@J{%C)-H9I!G^OH%-*Txl)Kz(p|g*=%t zhY9U00vB?SefrA&UKr)h1`%hF9tAx9-e8L7GA#lTC(Hg|c>B8fH-m|ja%P2!>J`qQ zQ+**FLFulx*!oe!=;z=an|vkfY%#c?y4@wi1-?oTq$j548N(GebtV7@buLJn?T4$aGdUbU!;hI>8ew?r{RmVwiej*kSiQw=)^L zD9Sm*o5^*73JB9@I!#9ViBsC27-eEZrQhT=9$@lA=<}viu86ttNiM;EW#5rUzJ2O) zq>Lf2bcUDLZKWp{$Lg5${MS#6M^hgMOt~bS9rh#R+^VD_20864+WJh!Clyxo+(>&^ z(I-qWMog7wO|iQ<2^p)ne*gTcbfOEU57CQR^(U*L297>&^gD>vZr&4#T4*pe4GMDn z==Oq#z8|J;DDWiuS+4Uzf~>&DDqky}kw?Z0Z*^b?NPM2;LdVWX>mhT17%!g88V1NQ z>z`|me}C7Ff%ZE1d6Mll5CqJaC|jJh^g(FZ$7?^2tW;>-s7L@{u_r=vi#&BBK_DD<&LG6ks3hvkVDJ5l2(NB zYbvIPz{$RHpCH{furs=$1V)fU+_ttrSrn*ShvDigp;B3u!ruu19MGb73Vm-xuo&_Vd{8` zVkNC@JvP}4f3D5G>)O~diRiwY&pp2@oU`lq_3Psx-`diwyzkB&_x;o$o(^x$%jyv3 zSI5?sA#yKHW}QAl&eijK)!&UnpFi~k?YldtxYqB|brsrvWxt_M?sUjyv31?2cHQqy zZ=y>*cUN?Z|MHI2?w4PaR?3-()J$$##URyM)8`PghS)vPH|DXkHofNbxagj9-B|hA z_f9kmtd1diTB-}8S4bD6TkHkHz^+}1b@bC@&=4-4V>^GhJTBk1A9C1ajmJ)=IUKcj zU9c&?$-DKcvxG~+w*63tBKBskjhtQ^4h1@d=K-rCc*pd5GC41W%udhOM4p$_U5ApL ziakrTcDke+4kcYj#OIV{L5BNX(>CZILgoduhsGFTNADgEI}u~LN8!hI?|6#O_UkU# z(IGDyJlINo5Dvqq@-cx*KD{<9ex(bhHtnI2U9uJ3OR&_Irr6D1A*j=Xkx)B^C%k6r zZ#PYo88`jC1l+3H3p@mWKWnJ&KI9g|SIClaZ$z|~>eTneWF_yL?c#W;KM%)Ndyfc0 zbyLCmq{nHliFm!|aj0`5gP{&Z*Hw6}>{@hY>GS0nbqshd<*{KvRNaM(VIjpv> z4gw|QMDbHvij{EFIfi4)WxG=i>yh``6)&qbHW?ma!Q z_dE9Y_qBt*Yin0qm09@UxcT2xc29d<()~oo4m!~R8+lTH-(U4L%DG_dSMN50bK0)w ze2?MxiN3}g!JkIuoqB3TpO0(0i&`>7$T$y{nu()eyQF@j_G}_2A2!kK9?D6fffRc`9o{lAGSRXwdGl-#6Wru5Riz0#{XE?X;^lURxgl zYNltQLxX-K|C#u)Jf`qex|3ZB-<01z!d=^`MxPCKGs4Uv%=y>-Jmj9U+d zGv(9p!fuG7b>q<~a*wf{qxU|=Vahi?G)yStEZXu|IFc3OALv_(v|{^3SaR!7d<4$O zcd-AtGrhYMm4jb8?%7p!+`ESGS%53mTH#r3kCysXYM0W(*C9Q$QGr8ICDELse>vxC zcROHZqj8!f6S+j15P%;ho{-o%Utx!T-yA%nSm-*-o?aRB#Ag*%ha4qY+Mg-MVzWrsz&*v%P4-!%S#wqDENO{H#~Tb?s5=1r*oh?L(qPu~w^ zMzF6NrwAy&*S|4rj!&D93>P{@%u}tw;9ROOwC+e;vMqHgwm1^}=$7M@E^?Z4FKjH??f%6g&G#<}&9sDtDP$o*%>P zXT=oQ8W~N{Z-E{+oKbz#?)JS^Qjy zyDKBywKf0Qu2Sh_`q~_0ty+~@Iu`S|Wp@NKf3|0+;FXO+*7slRQS#3|n$6cm+1}IE zMY-E#zmt3V(FC?xu=n?sQGRgW%HWYzzPlp*NZCi0uNt`~mGG-(eU7Z!lMHrf?4kYl zjCRwCCmHQ%-qa|N>-@dZKa_c3cjx*GTT3##MP>afDXz;Zu3A;DY5jIbb}J`L{@LC? zFbJq8`IFswR%%Q$>7~JO(t0}QJTLwS8~aC_)$FiS)8-O`E(#;7#bBSpC7|wC_L>^i zQFA5iv+r#0ew%%A-QM#ZIOrz=o9^X-F4k^{WqKp4Tsm7#l3l4DNIGAWMH9 zoWR$}9=$W67vu#M2vEnT_IMaD^C$ZczP`6lUKkgE7c56(g62IBLFca#aU?52*_TfH zUC&slWF26c$U>BVA)aiy95~zBTo*+3>*E>a&4mfAaz5DdDtMy?7i$%2nreLx>D95( zOYKY|`IpIsJZDxuE5a4zt*H5&`GIfSyP5}0vIw0@6+fOa?B~y=Rhlrk2?$-H{14wIk;X7wE)!=pcECPJs&KdfU;;=_A$wPnGjW4Nad+h^!l z%0I&%#|t}sq70%eseYbc^sHyb~t=uj+KFJB!3b!G_LMA(X zZQ}Lw6C&}CDUz?43z{v_#Oua~x9zXA0G7i8)S1@1XUvj^sF@ARM)Xmn4IBqOwvCzY zD>e$dE!aYPMh~?N+;WWd8R=ncvNRv#PK&C`G2mmf{EY+WOXpEiS2+UO(QG5=7qg8q z+dNo}AY+sD=$i+pj?Fd?{bH7RYy_x=k7AkJGtYzGdc#M+KcrvGGLMThkD*@-8AF`% zIMDiR^I&&y#vTzcDm=PY+((#=roa@xh$Hmff8L!j%Lud0!S}`R5$4?${Ua!vj+}yX z4*wIU<&^22$qFy(-}XqM;{2Q}5u?`1|Msj2MUqlGNtp!5MMb@c&!lmdG*f{S-xUeN z4k8k#U&S*qk*h?0&?aJb0+dIbl1w>HnnbpErdj*`$`i%Aj&9B=++(wrN?OgM;po|1 z!CM;VIxV-mD{iV7+Kze6(Lz1rErpUfdL%1GRohvjxgVOWNY-T-bWqc{<&R#U*o#A; z@px9$-E)lP&<%mA3uB(i;9m0~(3Pus&-7O5?GZyn&p21xZ92VYjoW)|-27ugjl=*W zO}c%ze5zy@44JLddb+P1YfzKU;Z&ZA@*xxzO{ps%DelDfz40uhc~CymEbF70;S+`r z>Riob<~8;0=bSooI%u!HcFXTfS0dJ}7>?(x`Fo!|7G2~m@EXqdq|c)=3*cL#&PBO$ zzTe!2DXF?Xn`tvr$YPzltBk0awqbXszeI()IR9az=ZH|mxVQ)RD( zA+Y&AfaYtNTFT#*&iYGaYNeH0c@AMaZ%frvK7T!rn_nBAsmp>YJRg+Tp6TdV>86^P z$yM$z?>GEMi$s)b=NX2|-;o|lUr>635HWgWkr`fh)jfCVedJD&X%+J&&{wXQCslIE za}1Hk(wJ{dXpxzc%}4z9wfTHGQ}2nz2y4*iQk1R%RlfzMK2-Zm8ND}qbjM>Ih4b)vp^SRFIR1>+LwQ*|$0Q~Un9 zaDm5Rd*#3$%63MO{eTSdKcCCJXv(gSrM(_ z7pIay6&*+bX>#=%_k4ZQJ~HqP&OB3oV~y+A^>OT_v|kRgN&Fzv4t5fpQn{S)I&q7V zQ+CU?+K$cV5;FmZWP`I>U9^Uznl&>JjcH^#h2rB>29nu)-L6Rrkdahh&-+!*kY<(+ zr@Bakbk3p14=#j86Eikv!*L1+`ZPQNZmqhLI9}H);<9M#ND&}G57xd@9{5n$q=BlM z44t+{4=Jp&PT=AA(5M{n6I;3!iDDR`cUGr{P%Hp6X}a5O>os7L!-D zyB@OFNrB>ii)!GGXDqF>$_IIdEM+yO&*i<0KCu4FtZ-3Hx(@IV_YGV-i4uzPYtiKt zvr!|b*9uT~XXZQPL-M)Zhoe^^jSxHCIe z*5ve+631Xi z(n{vk57Wkvt_aq;Z_aHCxNY>pl-O#olX~BiW!g1rdOcQDwbzOHV_oCd-8QYO9J`#o z!;;>A+Uxr4-NR7lC@F@WPe=WDS_PsY8Bc5(R$N}iw$HJgXVmi81&Z`BcVYp4%Fnb) zq^^j7Tf{_g*&{JR;gS^}cL|MSIqG=*Ue|OL(iQLXt1im7a!tjxsXRkJ&w@-L?dG~z zS4gAWt0xNvpFi?Ft-mO7Sc4$q6CW8mEWSp1#j}%B4eG-Fw?&$eoInH@TXgk6=9Xt49 zi9xZ~B369e$OT|di(m&0*txWO_o62VES)wkmP_~W3i;WPp*QVM+{1C!eimnJ_lD@# zbDDLyp%b?d5I6>YfV75pR9Adv-8 z8#(70F&aH|>@N8)IToYQaqOY1{j1PFLaUeO0Y3;fcHZkO@{?#s)b>k_mSg-xcA4T{ zSA#{U>;dIN4--rvB@+Y^8 zB8~eT<36gt%IB2&iO|&|jk_K(+(LJ3N16rC>Pk5Tx-Q6E*KyySG;Xx*1H)1DB|um8 zRcL2wI6UG`@TXnltV1mnD8q9Jy2os5#dx3T0dUKn+d6TCDaM@ZYgoTJ45lu+s;yq! zS4bggtqx@ggI2FCcWSE##~}tpox;59mv&HU$9p*g^T7Vlzul8@kmwv;wAPOIVoU8C z-y&||zQLP8`g!J!@03~Sk4hdz4P+ri7)!j?-e73Z1l@H;go;#TlKF^X*-ZA{r#e+O@^~DtZLdQd}jTRDd zhOX1aTjY_ic}ToRWC>f&!`&lz!RiQ9Nd?x)WjnUILS|87w~KmZ+0^}P4hz0PvH_$2 z7>#>mC;d?8`OM-E!COe?1?{-7?JOg)s>GH*a10J zVR>*maegw1`nBabKEEoo&8V57#}7G~B*KsONL|7F5@1oyyIj@WN>ChZ8W+~8%0j67 zN9Nu2C1hlkq9@?7;XFO0G7`i4!1>ABzCPv7=%Ta(@HRHLpsBv{b$SG4(g{TIoIDIV871b3$`FO+;z&HFLt(Hq^t({FVGThKPg}x{BUE*w9r>0lc+1)g$h-UuS z>I&DJZJV9jpAYR`=#00Gf6*_jo_$iAU3pLJHPsoE`PF$0fKO|=Q{daF0bQI}k+gEo zB}h9BrZHih!sbqp(Nj!DsZZ(gB!6a*jt|zja(zU70wA}H^6u4@&Q~6+Lb)2huAh+64qs&s%9n0?VI*6L2VkW;jOf~)bBP5< zwnW#i`v-%BeeGCu9VmK1^H_!=WhHORb4wgI5u((akYdJPyS7sHW3FRHQU27g;83qt z=`hzQJrafo0pA+&CWoW`Ea=)*V|XR=GauOVi}Zk$X80iL>m|5pNk^*f%J>H*e%-<*NAmE_m_niRRJYvOYBwEp_HdkJIwyv1^bTaOUNnoh7#Lg6^opV3w#T}oYpxg zkDgs~Hb~qdH7Mw@iaScGI(*&FU68loDdCUQ0$+(56rJsLZi&O-{#UQNU{0P_*uN5Z zq5MwW^YBmRpHC^Z;hd7&UPt0k_ zf456!jeNFif@PCvumc^>(Hi}Sm*3|*eG(APv#iH-ofc5f_Jp1%xzgBh9iC07v${WtYH`KLtt4(vW~-Us$eAj1oJA-jiv zJDwU)exE*Q+tuHYgLu@s|5o+8%!dAncvi|0*3DbFn*A!LFo)4`6!XiO&vLO-hkiPC zHZs^9+T~$qtHA$s?4)w!@A!$k#i=J+dHMMzUj^?P-i0>-Yiri|Jl*TdrYg=9$VZq? zRq_{mZS%u70!OQsRdbp+S~p%f3yvaRg2SOjLQN0e5M1RmSw1~&&BVjW5O4|nx8HA^ z-cgr}%j4p+(-QHTH*eo@BFt&;yG}w&v7~wl_>?cs7%6(676y{aqVap%U>D{0I8@Lz3TL1t6 literal 0 HcmV?d00001 diff --git a/cppcryptfs/res/ru/lic/aessiv_ru.txt b/cppcryptfs/res/ru/lic/aessiv_ru.txt new file mode 100644 index 0000000000000000000000000000000000000000..8a4d9c96823a93b63756f4d7f0ee22e82ee8da5d GIT binary patch literal 2834 zcmbuA?@k+65XI-ie5zE*7#ubbo5iRJ$bgN5g==H;Pf3bGiMnKNgWzyAE%Uf7l8cH*Z#^?{H4+$y>c-}L*@zSTYQjdbo%{-JK<_N8!4{juKL*m67Y=ZYLBj}>#0UiP{5Rl(T5 z@@IvuFWaJwxozt#S$nDCamw~@_^5lf#vL(2olVtrq>NL)Nc{B^7OK5g>{DUr2@Pj@ z{#3tM&+Li4RJ~K>)h^Wu_mgxtDn8ZuBSq}_fjsA`W~eMZ-_^bO3MaA>m0IR8ayFRi z$p?apD=ZU5?(6+r>$^w?vJ+uA*U1Ypd#S3pbFJ>ZmIhwxxhnXmDI$G4)vb{*!zaq> zB?Ux>;NxlP&QZb0Jnm6qb}z+&p;=|-Hh&x5LR-PWnfCD2SNwBfU^UbO&$sVJ6_-MP zVN{Cxrs5ke=tVGdE&rwTNw<0btHN!mZHF#d&kk&$)tM&jxvb2~jTl4o9}=^0G!@KPnXf7CLL=8=eyAP>BZGt%58RHWfv7li7wQ@K7pa!$14_Bw&yqb( zzyV4=QI?9=(u0O8{X|4~rMJvFH$cNa<}uD3raf%V&hq1Q?pP5k58Mw@tU)ooF)t{a ziAKv$v_?DB%bKo&c&sew4qXn@#G(CxFr)K<9;yQ+m@kxtc@J&id6sVDVak}5PyqVv zD=$3aMOUcgSocv$)Clt2=)S=jHr#C#;YFU44{ynbynlgRd!1=J#c(7ZE_at-H&zlcB0@nLG=t3(unZx=9yx;UfDZWu&6I>IkM< zsv8`uz9ps_1?~qziGLm?XsDIi^292*VLKCAB7q%-ILW)IJ+;>r4K`V22|-I;$Yov8 zyRJ97N4$s0lBv77{`(LmGUP=Uvcw;?60fCb?Q~jRF*R`tF4l`m@KNuI_}=#&S@Caa zC5)MrZu(*3Bd>Tg|~gjzbO+9jP>QHIb~%)w&R;943O&MNJ8@B2?<;$$U%E8Qc&+Fq p+-Blx&q6^Z4|D=ebmfb=;M`(%8`4sx7%EvxOotBt@7G}8{sv?M5GDWs literal 0 HcmV?d00001 diff --git a/cppcryptfs/res/ru/lic/cppcryptfs_ru.txt b/cppcryptfs/res/ru/lic/cppcryptfs_ru.txt new file mode 100644 index 0000000000000000000000000000000000000000..06f341cdd77dd5b17c80de07cf1afffc0dd47ded GIT binary patch literal 4094 zcmbuC{Z1QK5XI+@`&Xq(=Bqe>VGT+G3SeVQFklSEA%v1ZRkaV$pf>$(MN?IMraVI5 zt?l{U@nyYciPTic_U_y}GiT16xx4)H_qF}1ziYd(KlS_8zOmmdvkiSJp%qR-FC2${ z*bkks6EZu}T~qd^u2*efYueYcrfu0%`Eb>;9obIoEBnrVw67JFyBqt({;;2IQ+Jb! zHy&$O5zm$5Tq}p+B5c~n_K|&QpW91$khQ0kec@?_eOcZp`djui)`?#btH7zLb}`FB(J zPUTNzcpK;**58P$@oul)!{?3E@Vz+wK|Zg==3U>l*r#%2E#*B3m*S_X%qPkX52wP~ zjy>L!g=*UovvcUIpte(4NBa(+aG6<8vFOBwelH?d#kjENabeQAOPb3up)-^QCq;iO z?td{{%eysDJydcagwN%B7b&Pngi9|mU1rRd5D&K>W?#zp7-O#afYp^M}E$9;^|b(Ocz~~xkpVE zp^TpPbJ`M}3Eh&VtDLEag8*9Z|3LHG5yvlt%lA;lk!;k~9%`wlI(oYIiS@IwtNolz zzCsnu_>sOjF%K1i)3HpK%s$#-4;V+!RC4yD(t%cpg3h07A8}SA9vEci-r16PBR}jV zG^~_i*$IE?Y36lvQj*1|s1-Xzcl#0X=oEMz#7xy4DA!4>dt7b)L^#nYpZ!N<9(^|= z_iA7!vA7qzm7i>AEA@{F=&F*`8GPtRs*`6qt3@s6NZFVA4VOImsQ`ONCyDpq>edFc zpGNkWz}$YMe)%aww9zQAi7JQ=-`tOS_HRA&^L7*oI2!u+sq1l2Wy+D`ML$iVl16q=oeJuib6RsUxw&@jS{`BSgtaZM4rqXSzmS2?Va2H z`gGA1<{VFy4$DGQOqSzTp%(^ymVOxZ_Kp^vJ#d!oHwTSGca$nwfO(u8=Nj-8DaN*S5a1C%o_ zJBo&rOj9x=9gg;EPL-oic$kYjQIdDBI<(}-ikR@3mA|8y)YYtF;Z>0?*K`H?s;nCZ zdROgz*pl)=Ust!Nm>$&iq2o!>KF>Kbcjwvhz&29^1E56PKJSjo=PXr3CbUa0D&dhb Lr@8o${G0YK)XK7+ literal 0 HcmV?d00001 diff --git a/cppcryptfs/res/ru/lic/dokany_lib_ru.txt b/cppcryptfs/res/ru/lic/dokany_lib_ru.txt new file mode 100644 index 0000000000000000000000000000000000000000..e28cafecc61e7364babf228a1f65c404308649e0 GIT binary patch literal 17216 zcmd6u?QdMg6~^y}{Zy$^Yd}IR;EmM}Mk=tow&RW8;zQN8Hy@ad z`|iEk?az{NyLr%DG@t9!V}1IIe!ef+*I9GBIoG}8X4Xv7|FN_ee@*r2f!28;jsHU$ z{j>i5MEZRqtzUQUX|t!NWA15lM}IA3rypd?r4mo^0@)Z26&V@KV2j zkY!IL#kczWTz7=kPxJ)Z_)O#f)|GEH*H}C9Oxzu#r@H#1o@6ii>Fe%d((G&gybCn+ zFv$z{p6joLR{0{~@L&4Pex7T0&$RAo4?;iGwWr$QNz&&#Lc-w^LvJJu>?L%7RuBlb z?vBov*n044tcw|=f!&QY&#s<55UPx)on*&ZvcO!}Jx=ptfA4N*Wb3}3ZtlxgPm>k? zraeE?-p~VM*;qII+iu_g3qm2NOFw3u3R^P0^4g# zx(uXR*IUi+WzlxjACk~`t@V7ev|MBbCz@|xxChU+^j^Z#TxcK4Vc;NV7$-}g$3i>8 z0A6{j-MKgl9x{bXRBrlNX82^0@P!d9k}dc=(0=rVs1z`#f<1{$n14 zE7;+iO!8b7 z`<}^`6G?canXu=bBqglIybJyB;>UbyYr}d-ag;ES?ffY5GuXjHoRbDSqF+Y`JjhXs zmAQ)Cb$xm_q209*eC=BE`Wa{VZk;WDoUGrjY|tp0 zs&~LBRRJj5)o*+RJ6u)cPPGH{0fw;AMar83N2NTlU%h6Z*0K#|$p(?D;0rLC^`Glw z*aO*Xk7Oh>Em0V2yrmsE|J=}1Xo0BVIvm7e**vrBYcvH5&@-TN8j76c?&p#a`w}zR zDVgAzMxCSF)2CzM$sHauTjayp(<8%gvo-t6^~AYki5^GS&zv)Er~ZRA(?&6vBvYW{)}ePQK<*2fZTuLGk4Il$a*~yPVA-l z6(}MP!s2|I>!0;*-lG#upJBGlb{yaMNhjPZU~!%@hCpgu!JhaqHhir4VWCMvLWw~% zIo161?!4aP5nhnIqiFIS?X=5}`ET&VQPOYMwqqW#275;-WcVN+x^E(5t-DLYnmKgqjdMxQ?f zKQKbv$kEQ7rtEuHF$83tK~UK=yNwS*f8R)_ZR)mb{6U$Co%4x_I76}cmF=t%}e@r zYfCsXk>BAhW{;AQbC%$W%2>i%vOQdT*cy=;L|*CW|48?PD04MqW?rz^X2e5b9lL@j z<}@#XVmJj~hE3o)cAvc)t>PoDqjK&GQ=rp>G#~8uK{`*v54*_mokS;F8fIlpP~*ry z6vwD990_xDb*6yS_8#-8{g2P*VsCR_FoXAiY_Q`)t^qllsC3}!eKhOFy_ zWOAnJ3=<8)9^?_6V5lZ7BI7MRg_OU1yoXZR%2sB7j7%j9o&YNA*d0tYllJjI zvoZPZ)!L1&i?amohZE?tyE8}rj+I@jlcPmO2KJ1uI=8~tySbIwIC?$opo@L?Z)yfE z`K4_KR_eDxoNYMowUo%z&L^Yxfr&g**^_{s=)1cDL$f)1bW}6Tc6W=t@NeJce3JRu zH<@x>fqJxLI?r2r?VXDG-jyWGlKY2n4h*&~AGURQRTuG>@Z(gn)r`i;5xD~xiuemt zb}?ZzfxteNwPnFB_mL^Uv@n6A4Lr-aNz|aFMuQ#KV;{3%zus+GqT_8@I3iKE-)C;L zd|<{A#h9XI$LDW`E1#qq;Vo&w9?-V-D$faSDJvN6Cy((v66|p(B03^~{`&1CvJrOf z>cAbJ?CGI3un<|0Pl)>CE?6(Mhb{4k_PWHQye_*iV!AjxPaNC!Sx%3rCH;<;pS?LN zeU+@VC7t9Ghd#eX^RD0EU*pS}E?xnW(8qfGF-dE_Ctbm3(E}KYeBN>GHCU4ItNezO z`}NK~BBH_((QA*f+#Pdf)V9#u#WT)d+jWui)y>4d_R(N*SQ^CT3XKtaGki!bVUCJ8 zfbEZxEw}=H;qIv0!DM}=1upwm#$N3x8EdURuOMFMxI`?eJK}XLVoo!An*pxkduOc7 zPfg+6Hu^h6ad+JCF0y)R(wwEz&xkxa^7(Ok530@pL)&EdpGtE+<#r{)4D=!TIX!b` zY5&-3i5cgx(}a5N&3zEd8_37nWuG1`mpVY_-8VO5#eU0Qb>h1zoz<(d>%Oz)Qj*Xb z$je!xnQnX8Gc<v8fOdxmQyyfw2X zoWV4PNdu_T!Xs?&@9NNjiV& zBE~1zUBsB9hV6)Ea}Nr>GIvq~`{equ^ov!AM(bxZ&h_hz#$!1;!3toZjA6Xd+3ha+ zbhgh9Xfo&d_IdI}_f3cOI9;A&b$f8^zn>wxTE9qM)z$hsep<$~$S|^Rx;NbCljzhw zm%nx4C>~Z`l{4UprB$3WW}DzO<`DcXGM?^<7Hi;*#4CFo?|Ikx&HL(B5xw}oH`uxA zi!MB2Th<-+;k}nJ&^*|+BazkF6|uLwF44w4NSnXWQdgsRw|AF) za-FjbtbqM^9vuEU{UWb$b>E_YZ`c{@#~TOO&Q(S3clC8-*&8v-c_Mj9j!)KASC5X~ z8Ef(OC^FPO;pknTuNu{>{DGR*{aRahUG!t0vR_QZB38H`<=xcz(z?}i*?WIi*sSv) z=a zM}*rcB5bDpGe1o4cxQ$H+m6Kahj<$YIp5K~@K}8ECcc3{r1_KP<6ID~p~FWl@7_n* zCCHue?62IL>$03r&QcC>lzf3*5mDKT&jZ;OdyNFsue)n8i6DFh&>lz*Tf|ZQ8hkDAsMG?E5Um|n< zR){Uw_dN2kmzY1^>iC1C;ndcsZfhVSA=uV=pW%`XUUBnky(ULe8)cYYi+_Vq#ZGouZ9L2n{-v%%m zU~lqO&O?x)E!9@42SDY9_Cx0izqTL33A}O0`38E8@jCLBp6d<|?*JM7)-AZ_F5XxK z*Cqe2^W8h7DlNp^X7{kQGx1s%MpeHqY|mO35qr9<%=n_*2eN=B;le@9)P z`r6yN$o1JpAiK$C zIUlo3KFx}E9r7FVfl&~B(->{n5Shu4j;xVAhQ*2K)&M!CE8QF~{obVWCTqyiA)yxrFL9fKPF1zquy#E2- C7`gla literal 0 HcmV?d00001 diff --git a/cppcryptfs/res/ru/lic/dokany_mir_ru.txt b/cppcryptfs/res/ru/lic/dokany_mir_ru.txt new file mode 100644 index 0000000000000000000000000000000000000000..2437f252ab39fb0d6a5bbf110b9e8c3a7b424f88 GIT binary patch literal 3502 zcmbW3`%YU&5XR?^{i{+Xb1Nr+VGT+`6u{WQ<>CuAPD2O@NLBj)l#&*ulnT-d&y+{# zyS4p&yIvo=7(^@UaCT>QX1ncEpx?qGqSJ*toEtwCA|2F zzOS%9fCZ-y%x}x1bZ2DP3cV7VBHix<)*QP77$H{H-I1#VhIadm={j{IPF&aR zbF%7Q!=r}N8BNwMvLn_Tc#I5xf%NuViThF0B1$dHaSe}}i^xb-xP$*=<}~^`bYBIT z*cvguM6=D*Y4R1b1>?KD3DfQJigWU_9Prfft||Lu3(SM!YbrG5LL<#6EH(EhT#b3R zIi)D7mFB4qx*F?Fm?3%F#AhwkB;7+PyE@vv5J~L0eMjtZhxz}AOt(%g++!&lMNL)Q z4&AC!6ZLYR_{aVJH9`gR&d5gnNO>wdY41X+bE)5|rEXqjAh~W<-Kb6CC7CMw2H6I2 z2j#o;s{+0)P!4-hHB}{fSG~0#wCwaP^P6lCiExy8HH%H}N-;l^MF-dW}MPwcFZm_TQ z`x~cAT@g2ADdt3}=46BF9)-I=GuNd9amu!sH+@CB^h<0{Q!ZpxzJR(7q^$-Y`o76q zngzvE-G;wVil9En-e@Nr`3-Wv$Kkr?d1y}Sbfy`;;rcqq3Crg}XZ3xLOs|roA|+M} zLt>A(c7RqqRA#!_4#R0pm83d7s$=(YD1NVX|4zDsEApFnQ^AjCHQ_wcIetk#@5a!V z+yZ}}@)TXxKR@Lru_?JlY{uQJE2CLtU&h}jn?X9mO4f^Rg&R$Lk+*52QJcBPZq;V- zIff^16W9nr5sS<{3d||vTWGwEyXQgsMZi&H_ZVqLjM^2oXj_7!x)xXSoc#6=?Nln?kG1q>d|L_i|n$~+5^ zO6=y@jT1{X(kcs;ny0oN=_JoAPwa`jJqZ#;(j)5yE>hd=haLj{ZF+^JF;VOi>%7ZfWs`@~cqiJhSL&j5CDVc(YgZ-KzbMaGkm8c5RWbIwp67z+=M7NZ&dQjp~#}lLDJm;0UJAIGU~$^ZZW literal 0 HcmV?d00001 diff --git a/cppcryptfs/res/ru/lic/getopt_ru.txt b/cppcryptfs/res/ru/lic/getopt_ru.txt new file mode 100644 index 0000000000000000000000000000000000000000..8abbbd51fa985f3a4d42327c1911dc7e3d60fe6b GIT binary patch literal 3896 zcmeH}UvC>#5XJAqeL_NV{xxnAJ8K)-l%{d)*x0chCr(I1l9ec984sXNz z@Fx5kz71R9Rk#cnp&ova^+Ibu>-lx~PCG8cJKew5{ZiKV;luDjD8^CTm%n~Iiyi%K z%I99}%6}$L@AP}6y}#MX@53*Fc%Ny{u1<`#XWBEdv(UX|ePh;+>@S3Q7^TpZZPetSK#6k;aZ<~BGN2g5+`}iuG^k* zfJ$HxB)+4oywEl1j^*F`=umxycE`%4Eo?o@jWt-Lf=5CJZa5`_)O~o)0&1OBFFCCarevSbRL(o_Tbv&zqLzlm#;7+p}%i zamptb954@=E_4g1_=Y4q-A-3FC$n&F7V!tR z(^r@faJ;X(_c`(5C(YDUCBEwLPBr+_6D@g%gERR}{qOea8Jsf9zbA{a5KH=%sqPmy*}}WwXENq)(YBN z(CU)yTa%Ye|F>kJqILFF_19x#{XMM6x}qmySL0^)`bL|bR;gm;;&RHZFd>8be!A$ju#yI`nTE}%`;9M8jRR+RWi_zS|jIkmC@8d*P@ z*sf~;Z?IAmjwd=z7BxduRkdMbLwx+Vx_kE&mBpNKkIKDI;FbK*T}e56Z1kDeo4V&% zYhr>rEX2N;K}~qebdq|NrQ$W+AIRIZBIwVu@v*GG=!p2P-PGqd`vP@Q5&DE!dB?Dl z`kFZKQd4|1RX04&d_ur~$|!)XV{oS+i4_^eH~V-&8|+bpQYW literal 0 HcmV?d00001 diff --git a/cppcryptfs/res/ru/lic/openssl_ru.txt b/cppcryptfs/res/ru/lic/openssl_ru.txt new file mode 100644 index 0000000000000000000000000000000000000000..b38ad48137897d9b8d60b14de08cf9b0df72d066 GIT binary patch literal 13274 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 WoR_^W-oy0C|K&VW*W%CWTl@!b8izmt literal 0 HcmV?d00001 diff --git a/cppcryptfs/res/ru/lic/rapidjson_ru.txt b/cppcryptfs/res/ru/lic/rapidjson_ru.txt new file mode 100644 index 0000000000000000000000000000000000000000..502bba8e8fa0945b3fa6f82a21d5c21a50e930bf GIT binary patch literal 12014 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 literal 0 HcmV?d00001 diff --git a/cppcryptfs/res/ru/lic/secure_edit_ru.txt b/cppcryptfs/res/ru/lic/secure_edit_ru.txt new file mode 100644 index 0000000000000000000000000000000000000000..89919618e1018dbce612dd47e5aa23237316431f GIT binary patch literal 996 zcma)*TTk0S5QXPqo+=^rrBdJOz7dH;!6C$T9LJY(6DdgaCqOC?EvAuotLGY?t%$Y6^0L_EUey z?gu-x*81qte$A8Egw+XoPC`bZj2MYUpOrm@Tj_hm$&0SS4VT`t)NSKc57wy-c}A?> z+gJO7k9Uk)zAte0hNx@%91vf@QGSTUDRUN7J$66~=Z1l@;A+EaqiqK~@!$0p_ARS& zRqq9BdA{e0kyG6qZRoKA=hZV2zrX?I$>=3vjyOB^zNz~nzA)88b#QA;oII@fKjrK` z(TdG{K*qOZkpDVcx@x%5DW2+U)ke%zQSFqRshI1P4_(Fw>^GoAt~FmJ$f{~QT?8f4 zdc;n=1Kpdn@liU}DSx{-gU=ka<8_XR7`r4fIa#5w#$|P7!QJTAbr5dMV_hq5O`rdF P)L4~YayPD+OWuC~Jf49D literal 0 HcmV?d00001 From b7552295a90aaa39b8adb0ce579321e9e87ed268 Mon Sep 17 00:00:00 2001 From: nbb1967 Date: Tue, 24 Feb 2026 06:01:33 +0300 Subject: [PATCH 24/35] Reminder --- cppcryptfs/cppcryptfs.rc | Bin 6232 -> 6954 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/cppcryptfs/cppcryptfs.rc b/cppcryptfs/cppcryptfs.rc index 76ce69c904c0899340950c4a54b05b8ec3bb2f95..17f326bb3fb43d7eaacd42f5a45aa152f1b7555f 100644 GIT binary patch delta 513 zcmYk3%}T>i5QPtdP!u|=5v9_I3zvdWlrBUOm%2!sNFp(bN$bzbXOQd#x9)r! zU&f#B-lVOIo0++D=A3gUUwa=1bH6`T-hPWcdAd-jJH<*BkQG|e0=J%yl~Eb_oRrQZ zam0;JRVpEln98Vj={%E-8)OKR#b$hca;n$+^?6Ty^{UfW`qnF#g3Ng+4Tj+KLq;hC8+)mdw$GgB~dM$TN~Yz>$tfKs*?rO^M%vQol*p+eRT6UZE9QRxXW}4^AKbYwn973aj7f&a`5#^?7~au$Zo*q zCeR`66AHU&yW@n~-W_2nfNZksy3+^O*avSKxmw!(wb;?t3!MB Date: Tue, 3 Mar 2026 23:04:27 +0300 Subject: [PATCH 25/35] Cleaning. Fix for Includes --- .gitignore | 2 ++ cppcryptfs/cppcryptfs.rc | Bin 6954 -> 7212 bytes cppcryptfs/res/en/Resources_EN.aps | Bin 117044 -> 0 bytes cppcryptfs/res/ru/Resources_RU.aps | Bin 130120 -> 0 bytes 4 files changed, 2 insertions(+) delete mode 100644 cppcryptfs/res/en/Resources_EN.aps delete mode 100644 cppcryptfs/res/ru/Resources_RU.aps diff --git a/.gitignore b/.gitignore index 2a340cb..889d664 100755 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,8 @@ Release/ cppcryptfs/Debug/ cppcryptfs/Release/ cppcryptfs/cppcryptfs.aps +cppcryptfs/res/ru/Resources_RU.aps +cppcryptfs/res/en/Resources_EN.aps Report*.vspx Report*.diagsession enc_temp_folder/ diff --git a/cppcryptfs/cppcryptfs.rc b/cppcryptfs/cppcryptfs.rc index 17f326bb3fb43d7eaacd42f5a45aa152f1b7555f..88077352fb4fa74645c5dfed083d3df93ad5f3d9 100644 GIT binary patch delta 261 zcmZ2ww#H(E0=u{?LmopqLk>eGLoq`Jg93vFLnuQqgXUyLG2zJ#l5CqJ*jF%54&Y_k zyny=&%VYsAvB@IbdXtxM8BAu80?|^F=W$C+ekLrn`JccOCJ=+5krpC(tdnh6MJDf) zteLDOIB)U;DX+;I97gO4K>LAk@im-pu^EyXuR`%*e>d$cV_u{6Yv}8b1#|tRH;L{w?C$OYpN2j)i6XefZ(2 z0{+~qiVxw{KQNo6fGrT#R4fll$_;wAS zOs$0>`Z5f6gj3-R{!fQCe&24`{_9CAZ{K)om<`uY&4+-NhT*|*KCFg2@%utJiod7A z{eaiKK=HSI&DU-`B|Ly~C&S-fNj|(i!+0oMv9S`K5IzQ4rcm$055FUv2>0UuiEs{W z+>6>zqm5UBs-tM*96sL(`tQN_S~wIM_?f{^Ja1?DxNf&bnSTKIl9C}3-+@N)rm^zipIo}2^ZHarn6u@-&0 z0=#-T{_j-R`BEYB;hEt_QRa$*4{ZNl@ZcO;xgDd!_78%p8}YY}Uf0myo9q+6O+(IZ z1Lhgf`k;L~hw}G>-b47-EJilgbskU80rxz9&V{$)_eo%;|1>r)3cm=Nt}JLegBI=y zcNz9HYA2`fKuvv6N*)dIe-+=~YNNvus(~tw#eFt%_n;?~ud}G*HsF&|V%3YE8hXP2 z{P!J@mudWc_+iTVwR{wIlJln<#=_L~Q~a=oHts_UlJhT}+M}Fb^Y)Ergsa2Tr@kWm zKHA@_oCnD9b>Z8?Q<5=15H?Ik?l8LIujQ#5Hf{v&N5TukAK0Au{0Ov9QyZTIydIt$ z{+GcY3I{+5XQ!mMgl=trH0)2>rtDBs??g#*oS#@a{YN@p9X=Yq33PmNA{`$!I{v(% zBT{j|IGfgYWtiINhM$4l?+brd;1AH|0h2Dy+`N6_zYF*^;7h*PPnNh1vUrpA;0z=r z|3^Om0(unZ7P)*L{|`VOIWx;M`)k76(a&E%Kc5)>*ywtDUM1-GB;e%t9~E>T$mAzQ zpF&*^8}6q@xNUIvJTyX-xU>XR?8f~?nLjPcluJy5`rB-d<|SG7yNj}aR+Q}k_W_%E zW!x(^o*8~J($U#TIVN3ULg2;g6s@_Jyl#jz0uRyA3T+BTS>Lcw5C;mi;D_ zokQ6d6lD)U({OD$i?U^YT=n>LK7XFkvD18hp<(!ZZke{C&ZQJx6ZSfzuh=*cuHW;# z{7m3}Xoq?EDZnpgUcMA7(j%FdeU$sa4)gL;fRm2B%uDK~1K~&}7kimAeU$mY#5uz{ z-yEKk%tOsxt^*vU{2%9FANZ{APfU*Ao+B8I4?^?Dd3_X8bOw@mA0&ygcn0;p8K2IS zNcFvh^1-ykh^Vh|EK7bXI+B((K(-T`D-#-XTEA}OpcB(k{IENp|I3?OX zXte$PMB2VFyaBX5Jff|QUUJUS;^Epai|5Ep2dw)KiMM7M@Icz|XW~X%TT`%i~Ht{0{u$ocoIr zZ*rZK_DAybYSbFXX>T(3+u%VgGfeE@Y178%j6NTeGM!gU-2gg&3)1((Fl{#?4*r#Q2CkosfW+Wy8zs82JR~o+(Ci6h`-aYZ&b2|zvX{dZ2S_+enz-9++cLP z1M7S}u-qC(VHtnP>wkjTeW!goX%&0{eox~^HlKWubdC5J{271)Tp;{=-PFhJFIQ8p zZD%ouxHe4oXkZ3zu*lDa?=}5NU+E!OuScvN{u2D^DZ#HWcnh`PgOP~3=fjUn>3p}9 zPU$TBVAmPO!qk(e_<>f`1^nlHy4_^$V%D=Z#y0g+df{gDfLiIz;O1%k=Zv5{-x=P9 z&-5COfaCefAHtR4hK=`NJ=;co*G!O=HbyONi<~%Np5nC8FU_p={s2bcPMeR`+0iex zQ?qvHr9S*{E|b)WZPvpY{K9p0)G1~AsXSlR_Xn-M z#~1Y-0LNXgaTISWY_U5)5p@)8+_F`ydcMHwd16ry^__eM>TmhK=izs;hI`>}Nt;LC zpqjS#TAfcC(dM4sw5?gGl_zN)4ZD31U0-8$JSE{*^zJz_^d}ilm^PYN=PCS5?&r5# zeNP?HluG5r*7Xsq>uCvXsmz=P_sR3!`boX`KZ%+>UMs#uQWDWO0VlJSb^1rE# ze^!)v!l(@WpA+c&-NuD`uu5^I%KuGm{6tai$wfJq;v6BR2M}|*4Kl*D+Vx9XUSsl8 z*6*i}+VwIVgVUptpw~{>x!>kIqb?@_Pko*7QCIz+2yet(e8#AL@x!+-Pkpyxme--Z`6yhIj)ku()+4r^uSixkaK5v^;o3)>@l{EfT;s2Y zW&W4pxxiB_>o_FpKJ@I4kv8FIxTI54MQ@Ft%i58gO0^?nY}AfEVUa1r=qk;tP2jSKi68b=u^E@!A-_pat-t#e=y%OhaN=UX-RYB2pY}H;s6CthgFd zlTe=2PSu#tfIrU|jk!x|j8LqFK%XMNr1mUmP zp+J2YWOYTmyoWwe>*rQ^xfiPAbXEuXoUSFZw96&gk9)In>H1As;JoK}arG{jR=aP@ z%DbPm4C#no(h%}NFR5Gu+kar!gNGS1ai3>)-EO!I!kKDgOLvhC5-am{zWVxFB2w_00@$L`kFhqJbFJvt3bDfeX8@SUqVJ@)bp=e#@} zK5T72b5H&JSk`trcQ3x(k6F8lm+#i+pU&Eio?IU@-#xh@dYXE2<=(QdKW%M3e@}h= z#Dq54PU`hlwetyUM|+UF_3f9lcDh*iX~l6*yNOjok?(1E)Z97ex2pDj+1gV~eYf_$ zEo+awWGtFBPma*I9FI${Wa!(hefc`Owg0gj?W#y%D3AX8|kB8^e2yn7hpdl z-RC@o-IXq6WOIba55j$g;a+cidI+%w;gz#vi2LQJ_XgDa!V&H|YV3js`9I;l0=E6W zApW!7b?}UljA?utFC|)Dh2HKf_5vP)CBoPavk4fP)V|3y+EaD_y*<{+8i$w%^u{?V zl+KemL7=@Ce($2=U0++2*-O0Z=STANRE*`6wLcSLp3~1?(ZI8#pmZC*JFumO=wBZ_ z*v8*=^r~-Ve&nh@{(HpdkhV01%#N!@e_vblNKc9{#h*pAJ%#$XBP74pc|^OH{#ppv z8O{v6h?%g2p9cIsX0E&{JPBoKtuuRwUfhGAMwU0LpOmLV823M?M&prZJQ40WPt1E- z!1vc+XL}00rH4bk$e7NVq&4?b(_E@UzAR=O|P>o1BL< z2g#Y#ze9jEK^-&9_L7IxwZ8QWT#f?!=HtL`^ko7p&+({H+Q)h1mrWIZ>q$s8;|b|_ zRFx-h8a5X4cfDMBM9SmQM!6|SBj=V=8YPA~ftcu+tBf|#bK;)1M;+MawO4)DRh((l z_<8u@tMH?}l2nfZgdOA_qMHLqIz8Nb!xnxNJ-zZFX7VY%Ro%0P!c`A-iVTwKm|F<1 zev;FGz2JwZvExbEjC1edzptu$8j)4{6r^Zxd25$SUY-OUM{D?Ocnf5LBg~AmbKvi* z@acA2yYIl0H)Gx~hIKdg%-#&%d%j#9v+3qaNn*{_ePtY+(H-TsarWJ0wjMoF^3~@Y zcO^OA_hMYMZ_b!Cwd#F%%Gq$X*u|zaFeC1CLDzYFV?>EIwIZ7Bt$ z$oE1#wz`HnxQXZNA*ob6gxqIbGTr4+w2aYfS;)$*QWT9Nm9|u_uS_rH!98yFn{g_Y ziFui%=*`AW>RIvAsi(X?8hXS%a&Tzlz|pB{k2^->3oU7n`@1YiN~1KKL?5KjSt9nz zX?BhuhTh&neXEGTZ{T;NWzr1gt{W|ET0N?bBT4Dw9&q*erIh;|XDP1wq z1GACH?K=!kT&G$)Xd2h^Bh094Sf9q@X0+n_sj{#{gU|jrt{lTM?_xbJKT$()CDk{M zHg%liaGppLJ6Fo}x=eE)NBhz2rDnf)MtPC`BMs_fT)~CowWssXM~%JYO2Tnc9Gx?B zdNe1wi>B2zj!GOm--(p|c3!6PANi2ZRPA4SDfUS^%XfZK`BHEBg!NaCjYf`=AnneX zql_laHP%}vzZ zv-(Is>FnbBCfap6={J(nCVn>XdjMz;HEf|2zwzl7{%!zoh*Ii3`A2Gb)`Y(2!2TWv zoD`5-hk!wt@W>x}t%PulNZ%^{$6hs!2jo3HTjyU3-#0)x>pzTAEKQtMa8EukxkswV zGxm1XzQtZ?q{#6mFxHF*ZG2wC59y6+w0FT3o`m zjE->%d6uOE+Q=PBE_o*&c*%0jhr+F|Ons{xDts%>`KSeV^JCnOq=q^J`#k?nd!yPq z;(DchcxudxwJRSq+ox}9Lp=B6D_^Q(-D2P>7uPP?Pvlz*99%E>%Ml(z?kR<3`>Na) zR|i^TcbWG09w?8D`@ggt&Y@?taJbHBrKQfyDWP=TiP?DyKU^)i-b6d2YK4&wCVjp( zm1$ee`kJpSq<}h|9vRmKSvNX4MO(-1`N%7lXN*I(e!eQ^T#)u>jGV0~TVAmM&oOX{ zna3GD(3~UeJ!3?)p5uD5b02-QTIk!j_kY52g=&bCEg@#8Q)~Rj87S+yT)W~fJ`1Qj zsROirM(H|_r?T@n*7U1*ip^;m*!QwMB|9OGiF+AZqiN+tztd$``A)R6IXdDcv&1Po zZaHdH<9D|tqXkI$j}|e@x@Q#a4CV#PW{}^?SOF!O)-}hD<)d`&)h3E9F=obW2=a*0 zEABzF_G&JXzp@>3zHnBMsx<3`UyeC}h$94}E$oh*&*J*tvF>e{fO zjpcL^Lf$YsL0v*^p$LN0wX=S8o#s)JvQ(5yZ=#*J_Hqs##Jr{Mx)(jV8UOFM|Az{C z=r__j;dgq!H)B26Z#sxO8F3Zxs6ORqKkPg9C0ZAGtNVfDvws|S1MNgBinwv?*Oy{*cW|I{KO#j+8oyF5Og%6|1K{r^X;^+v^X7^akZX@Mf-!yrMQI1~0OTsBB zdx^}DUQ+Jy5z<-ptOYzq9~e(z1cD>kajQA;5LvFASWifwp}p22V~+NbylSd8K@<1bSIp~RDcYahwR;Qr zvlpsJS>O6LIm(qs$$VX{jv(pYBSnzr5JB=-5+&r3bC7Mif5}>O&k`*^d5E;P%Tc9N zLgd-`sWI93w8^N6brTZ#D0|y|(ij06x9~5eOwhL9t#zHPE6V`Ko4ytKplG9FFSHWr ze?+^OnuAfF^N>^8)$&i(_c*U2#~5ey%mmu4;#l0%Rtxe;bOM$cAifvo-X5*|dmsa( zY8=bGdC^ag*mt_sAH^H1EME1Jo_)IC<}te4Ao=ndJQ{b_?1<>SUQC_kcrK$RXTTBC zpvW3)Qye?>QpB-IaT97xojzk9VpNAaU=3RbX@_Vp0y7#ar0^8|Xvx||x` z;N`y9TR@fKa_-f*tUETXtH>3H?i5+dV;uCw-Sbi(cJ8&y5!+XUs44=&-44z{^{O1B zR`iN7T}A*NK+jJ>o}Gtz)Rp_*X9|Dc+rBg!vxS<=lu;AWpCyk-U6sCj86X@lpCOWc z?x%YOj{L-``ZccFn_>N_M;s*}Mvz?&q#69Iqs}>`x>C8ulo5>{b72_=%e7^UzNlU0 zCoyv3D=+(1)o1Sba3pxTo)RNUxZ02k>R^tV@;{VG5hMSpCgAyeQmM#6i~&+olqF65 zR`%q}n#}uAUX!U8NsG@)e)f4IZAX2oR@ryTA$MLpH;@v`c#CsQk|^6m*+I&MW8_^q zh4)&0F}AVOygP`NdDfAo57aLD9`hk1p!z5wE?p=25E0PK5m8 zV&rMQqH{S$EiXsH8H1%nU5_XX*n@s)aNuqD$JnPI^~7YeC+442Hd>eU;~;iW=H(v^pm9vCR3;LjBR& zaXZVcH9r}(f!1`MR?g4#?5n(&>{U9# z9@i!vtX=W7y|<&-W-eW%KArVmTlEP+jqRtGH{-JDdkl|;OI4#VsijBHCyrbmnOFQY zN(K2$?~8Ab@W?G?$K{&ZNOPU56UU5EE=e0TIpvS{LZ&A`efOvOY#Q~q-zDZ+B$owJ zM_tbqQL{$-ydIw=RB>F7_PMNAahF;{`bgd)Yth{C7_Dc_vxlAqM}IWlv>o|DN~s^U zwvR`2tL0UCf%V^SJUfF=zE`N2L>iyUxxrGoFRZ)R$t7wRpD7nNlH)6f_k|GMvX-wE z9EnY9kvfQX1WMD3enq=Q8F|Q&Ie`*!rOA8ck-Xiu*&AB92&W+c~ZHzt0kBg(}@OsqfNWO|V;Y4Ys#g#O1+bRywRp^i;++&}z5_kjsyd>Svn77xia-s=y0in&l7zTrBL6w= z7RU;aHWx1Yr}iWhpZ*gVg9MiGmdyFM)|9>P4;?@|I%fQU;MaT&JDku8-5(JdO0_|GvdNyD>wX7`wG#g zn&d5b4E2z$f!tZ&n`cl5rq}LeQ_FvV^(^K(({`m#GoI`0b!=lTPyNh)SSqxVl0NM# zAHJMIsAjK%Xu=(#YSMqBCfeOqa? zy39MpV-#7J#Y_L6(oM^mkvx8*uc(Y);at9NOL5A_;(c2l)hUm(a+EorIHStmj>oSL zW2BkyOu5khATz|6ZOaq$)PB-{m+$kse4p3l`@Gf>&3G)`=jHQrXDg*T3LfLamu-~G zcY^As&zL3SXS2rRdzbG7rQOcGAx0*(Z_D^HJtRdP$ur+ky?iIA>nP7hE#FEwIU1Qq z6KSFN?TLQtVt%(oj9_^F?d3Z`FW(8OtZe>H@8MLWD@L;8%?9zlf=PD}P!h{`5d7o4 z6Lj!|G%xSPmmn{XIaNGs$#c^5>EDXnfcQ+eckU%CkJ?mO0pq70=&zo`f9}s5g5IUK z!!x$ZukwtPcuFzW&>m68%mdy=z+IuZ52U@qcyprm+v9mj!K>*%2&$O%5l@=Lev?XO z@%gEeoR0DSu=nM2bJckTJmujwUY;FtW07sxs;KKA<^#`ua6g|vdV_|()$mQ8;q6%A zwBq;BGoH<+KHsgr8r~im>(gzUO^hYuGu&ZggpheKuSV@0N8Q1H$YMC$<-QB|Jn)`6 z<>r!e%np1FN;n7B@aX}R8G|dnC8;hw%DWr#AOX z9z!dJ<{glF zTM2g!baFa>;{q-5qp*w9vv#v)1?b$+>+Kv1t$Sr0FO00`-MkOk?_JcacM+6VNZnej zOmk(}bGMUTz56({=<_?J`JTGd@FVDN@(yX)^4uw7514&V8{c>K(>+x`<)NKap9#^E zsfw`rDMY?mkC8-Xsj8%Bm`59+>U4|jsuSR#-#5YDDG!o0@vIRemYma!TWarDHTf=} zb`E*MgC1~dRrsw+<0mE4o#!Ya+?!X92fa%Af8?2V`X`+lB);+h*zfUo^tnwKPq;*m zvIKXy(1*}3lLdl+eOih0T`rA>T@5<_0aoNsE< zs*^%-JZ8-IrFT7EYa6ui41>-Adad-8Is53vrjZZNM<5&y zi?`Y$Dk*(Y*_ToSJsv8cWUMET96rG@f$qZN+6T0Dj) zjK#1HN(y6fk|w9f&#j3AO>2))`>M9c2T@MC6npdfMJ@AB7{TFrq9~a@Kh+yjr#XKb zn99mfc6NG0Smf3Cc#u=B3DeVdqRq8mBq>U!O=QJO2&aZUlNyn1M@^AGv5K4dS z8)bp_&*DV*o>f@fD zwTM#AdEv6?6iZUiSP$YEX7!_5;;POo^j+b>6$06 zFKscEEyteBp%{tg4B%M$xN?19e1sCBHCeOI>)dbpCfeplQ8wCC`-_#^`?w#GVsex= zg;pNY#7H{l9M70*<&>1ra`L1Vkn z>y&DlW^3#n>yNsM?Krn6k&~oBvvsqOcg@&IV_)6A)(Q6V(aHng2GjGZ1 z+ewn*-jric?v1ZpRZ{PzhoD?GBmIU{Lydb6)H9Q5lf2MY)cd+R*j?e8%iC!+XFPXz zh^I00cG^ybPO_`x`;&DZJ)X(ZJfhu0-g8{|q}oDCPYQE=j;(W)X05#DNduoFEmhW2 z)Z3m>%zQ~7L%x|$t+^GJx3|~cl8<`p7dd{9^^13xNY}3687+8PSdy(=ll%Md^4l8X zK4r?Ws(UL^IneunCG$Q<{1!N_d9hZmg;8_)O~2I9w7$}rQsobD1o;MD&cG-!TFK+w zlkcDm)#ybz7i7zk*2z{ZC7)EfH1*XZmB50?>5`xP3H>R zu9^d+Yuu6+cgWe4QuamjlYR>2RuVz2$v0TiPmpG0NsTYL#nGjlIM=m$l0(iDmSsP5 zAHmL}&b=df3ceCX>EUb;mv@)II3iVYO-)KUKZ6=|;|^mN^g((j?<|ZfM?8&r{0dilaC1^)oAhdQ%o$51e6{ zG%_UaFi%@tXSRWC+_=K#T9Ettv{YraF)qlF=E&xj(j;5ON835Lv%GRdDVL2Lm+q<=V{7%gP~s;#wLv(WZU&q+yV zP|LCw-gQFjVP{Q4C|AKaf2;XLoiolcX*SmflscVkk%p8ex(B`DjM8Z#Nr-$u-O{fy z(Cm(@l+G8CAO03c-s8g&mCe9;%JC;%TpQU_dh?V~)unasyiqNELi(92bhf}?Pf4?8 zWqIXHTOf_fc9P5x#+(YRNotAFIYw{Ef3KBzte;PadppY9QLIX?;k73p-$xv0IHip; zpXa@%E6rilPHpFF3AxYSNS|w5Bn7D^qFhVPTo3q+a@n0Ee}qeeIA$*8J}1igUDUjB zymqg}N7gmA>SGOB&q%klyd*6~psLndX%}hjrpZcr`&pFyNxhCb+->A43nAD2d2dA( zrGj$GRfc26kxzFGqBhnY$SuIDJ#p8V$ANJlYI0pizPP1J3U=}~$~TwoO`AmhN6o?e zOK6?QqG0Y9Gq0#Q&zatlW#ZlfM@(6P?p95u5w^Q7nGV`#lnB$uA#?f6eDMg*g-pVU`rG3jR471W;8 zagrTcZ$6VB3tD3*-t9i;HAnt&YL1GQxFeHw_R+g}!jSYoF^D=L+>4 z*KM63_ZXP87;*UK7Q!XdjFND!E2=|HBY=;&Z812Kuwy>tMU= zH)-A5yq~d>l+w65IOUHtLS0@zsP)N@@;btHs#aynhOhHZ3n_f05mL9bII7W8pq`}_ z5pNt8ENy*~RZXg7?L==(KD5(YmIg`_B_Xcb93e^zAzc3%D~?iA9eGS`HTEW5A*x~z zWhvl1nG};|+mxR)ddhLDZinL$`$AjWcPV{l$G*@8xd;C_{#@V4Gk+69YNc_GrtztH zVCPa?o-e+RlCv(qJ}-BYm?7|eKSH)u&E~-tsPjIL%ZE;#bG+DJj#=DY=2(z=$_00I z=v}z9xz!(c%cACYdC4`He8Q%2t1P8e?PwPH%#YG}5Y$jJNE)f>B(>-8M3$Ln?sJsM z#VY$Xr;T--F{z~wOh1|uLpzOnk~SLYh@=}5)b4d{^>lU%2^m+?JH_av#O_GR6QB{1eAEkj+LMxY_zj`B5`| zINxIL@|}UGWiOs%l#p2dvA#y%ILbPmvpl=;*^_E-S=%vcQjUf&4o?4=bN7ttZSEy# z=I8rIZnsl1wRU=>i7QOZpqZRMkkUn2^z4MVhv~XrBf@%#L+?d#NK}+9=KFE7KqC1@CW_9TwkSd+~BdUXx4Xw4`lITVAXTvF>#Iv|{CBaC8j@2QN_YLMpP?A8qD+*MSR^GJ4$ayw;l ziEq?Z>IW(0D0%7XF?B1<`{BG8m!PO4=S{B;FrR7L(M}@;NAWjiv2pI_HnV$VtH66? zdBl-|P2&W2|EN{S5Bh2O4eVV!kz}P-fk(OXdsF0Fr@hfC?m11g`}nSh+$;EW^pT#R zzh#4d0)03iZU0W|V2HkH|79|5oUihSJX1q^Yh2N&<0u*OvKgzA1n2g0*xp{KRGKEp(G!zF{asp=DAgHv6xrL0)m4{D;%KXAT-;hqWsr6zrLHVfsnj_iT=E~iCQs$UHHR!N z?yHkq&hs)|aV&}T=qd5+C64x|V+@(=BTvq`_vz9b(wq;N7pr&KQQuJuxz`~3L3FUc z%vOk*5jm$hi!ME{6&KZ-Ch_bQYhk20};T8U)crFcH_QQxx8m?LrQS`< zzeAHNWd?R^RlR@}QdDW~vYl!y=B~(+OX0l3R9ZYnm(yKCr=1o#M^^a{?5A>_`G%X9 z;v20ew+JcwqOn{%dr2#c_Q)DEa|?gtX&%l)&Syve`I_?2+V!Twqq2<_>jt?w9(U@Tm3OrVZkI zJGk#poYa$$6(}016?|T@A5rSL8f{w3j7^^pH(39)kLdl2D?I5Wb&Lvg?eV!It-@A# z3y)^6Tb$h6;&`~l>roW1-J>bwqFZe0U*sa!l~cIGifamOU)4q_c{QXf9jimeRUfO@ zfx?>rkGWijfPV^ShB+Vq`ibd$JWw$orL*GM2uj@<+~gz+l;ch7fHQ~m1g~M_T>;}1g4&aOJJFDWuH;rF1`NHtWW8R{k^zZ zzn2+WL+1WXb`rgY+o32KM~v&V8W_VQW<2vLs!6P$i1d>``KBBU* zIVZ#$<_><7 zYSO=I-{L#F)~zRPK=~#u-Wtm_t%s6T&su;`BG!S&TW^RvgygU!>(`S`xCKwv@O%}| z255nJx?@VW&<+8A1K#VYnpBdxbxot1H|tR1xU;>Enpc5IYSz&=*0hZ8l+bm%n@WAt zouD1y(c11Co}|77Z1!!fXwBdJG{kehMRXH2Z(5Dy(_xhDqZYO=ib?ALF?!zXL%Kc# zkX67m*1B6)H)fGG_JO>KJr)&`5tUZG?8VS}<#NLwZdz*tz&4CBzHyzN6KCTwz>XT6 zndMC@uO9o{)ce`}MrhsV#nvdTm*02A@f8;)YfO%txXiiJgNMs`-nQ|lBv8I$9jtK! z-zf_{NK>jEgheT9Vf1q8rf>AgYf|6nWtYG=qJ4N5Rt@^+-1|BKAL%x%Qs-gKbJck3 zo_(We9agPwS|g*+=JyI;dcTJ{Ah&O-JiBr)^BiKXs1J@JC!2-Ut-I`Rf;Xbm1Uh3# zD}y^a3i7*zUtHVO2%Jo(4I)k#NC~p zTPEG4B+WwXo7HfS$>wSiH!4%XaW2Pd+@~tXi)3j`@_rSS$;+@eRXfz2FFnYl;w8$( z6TfJ!v`~tXy);(Ew)xYlpf`;z=`LojIY&_5_q`Y&Ag^!6&k(IDmP)UdRvxqWICH#> z4UCB15fyDM+Ml!;WkXU&IOq5|%6)p)-0kdf@AVYQNYY5vxUJ}MPLBmKj+>sCjS}M4 zqAYB;ExCutHZ&%(yeGeTZQRa}(!@`!>0-Pe_cPKyR@twVZSr3u%~Fh;@=OgaV9k1E zWIDIY8ApC!)$rg69!n^7g)0xDaS$E+`W!*3saa$AaH#dUhsEG}A^ z+;bcNhxYXDww_yxxur+V!1g*OQ5+TLF{$I|?(H27^eYbA=_{0?flFc8E z1bt9{mq#B@52HWwJ2(gAXW=pa&4g>O(x(t$PGQgIarilDPd|w7-O;ma?b+{V&pywd z%}k|ux7)L~X3ySj&we<2_Fj8-1?Y}#yw9GkWY6Aj&)!u$>!AI|O^=;jHu zeCVQR`S}97%-xHl<-i15uH3Ol5S#Ei{4^nDw_uNh`jNW059!&)-zGde&0@;_wMJ<= zC-~sv>iE1%P{+wjP{+G3K^^bC1a-Xc64dej$~so?bQ(VoKm2(7Xg<$8HR>}fWWTNp z2QbpQnTa-jl@D|X7Cybo@qgb80hq>Pwew^{NZZ*5+k#n2?q}(w$FuDztuaMMwY#r8 zCT6`bN0RojvSd$&=aul~*RVV(c000M>RBk2*F%e#QCYVR6~(=PKHm|ZQEH=#CbslS z>}PvD^txhQ?3*Iiw0PRqj_;C|_f@%rFZyLmUkI-S1@u6CpV_m5a!j_(+vZ|v`az^M z<^*`;Sht#-hX=waIx{oe@?|YAAFG9RdR7FfdL*?z8~u(aY~>xNyC8~|>&6Y<3-_YR zKGT0bfoQ|HBq+0ycOp?*&ZGPm`c4l*nfCIe_Fmp4`WAec#*gIqDfT#(<0oU($>}v% zyz;BllT{8qTnV+xCj5FEo=@XP?P@_z+r1Jxm{N8HER(b0O7xZSh^t`(rDJt9G&p%p zDPw%$afOT?0X>f|K69p>fE~k`sQhI5b*I8r_)cH;)EI^B$ECDA&EP3*&l#Iv)E@LJ zU3SZ({lZ5zTFY(I52YkvNY{a_44 zeHYg$uj={jJ5s>$O5-fdxRY*XpO^`g?o;O2=P}dT)_39&#{2=r6UcEs;pmWS>^j-Ja2^S~Kttgdmt z?G7n_l(R&0Wj}o1v<9b$oGsHt3&Sl1&Q0o~A$~_`r>rrTgSk@+kS*V_c5Or(i!vE) zqcjIiG0k*7SJ|A@7~>Yqq3|@wOS;Ceo~R#0!OKCfGV03NvQfX1I_jdby_L?)STFU? z(<{eTb2wtYyb|j^a9KB?k(*j?`Ij1zWhwp4_Ga#*?o^}ZC5O4Qo>tOE{<>ng3I=DN* zxhtJQe}$e${C5E#r|~0u^ce<7ZN4XDe2J2FmDz$?$+b76yFERZPIe(zDz1^@fX-n^ zGR|2`)xUlmkEih?nyxdXl%{8x2TPvQKKEI`y;GkD@?Wn*G=qBp_h4N3|5}tFwtNTP z1fdD?AZZeQ`V{}G2$zJy%2%BX*^dS zpJ^Cr9}k1Ns?6`3P>Nn-d7mwPCuuFr7a5mzdzm+TCLunZ0QuLv;y%xmUHQ?0d(!#916q0AA*k-mQBCH_u^?$mu$uDM}E<(<^I(Qz;UMc51dSuxI;|oX|kEZdX_2b!wkggw3hc1k< z3t3>aT&Y1B&7ekk&`M4I_0FlZjpvND@v1%Oj!VB1-7sNgq{T{afY~<8&c0v~25LCv z+uUTkfbth!WGjEX-HDbGZ5csXhE|Gu`n0j4R%ScbpcTq+j0`;yD*B}@r=?+&)l)jBV&ddrRr%F?rbG)qq5%lO5CN2r=nH7)Qx0LYyQk>9e+w% z%TGmX{`B$2C!RcHwBib6)J=oCnr|-{<8yN?Hkw=UE*-MwQ*T@+$M!=yJ;F;4ySJ|l zDW9+VL4)EV?(fU8<~Saj5F6+C$xn>+R!0GzKeA~lztkDB4V{|mQm+N(7TS+Kpu7#v z5Jfau*Uoi(7j`0S*)ihf#N zTcm<33oS_6glQY{VQJ?@+^X0N`^53%o)u>!cS$Zbx^oC#%I;&7%NqS;TAp{KJ+2zO z!$GGrCaoJkK9$aq>&NCubv)lS9?w&%1+7gl$n+#nO3H^xx#$`?FZtq&C|T|qH7@0z z=Oq`j7&ZG&3aFLYuIKM@d~+|n>~~9pDss$v*@N7hR6kyedb&j~(_OrS;5)5a?)7Lc zeflY}!K?W7sw{r_qOmc4I%YC&g(43X$BjO7+{HLJiupun8Wj?Ua$AMZ%2CF+1N)ho z{~cSZu4!^?Nwbogj;)s?Nil|$M(z$`++svjI*%HZr%EUFkNjZ^ej{fpQTxJkN0B?} zcWG4VW5)lvheAoX0G{ykZCIPDXBT}@wvq3{>??MBXl3}GyQG@3s@OcO#C<4Nr8h_| zEhe4s;<liN8E&$g!bK$F-mS#-U1%-j6qM#*cX1o=6B z+8?5iBf%X^kAq)_xkWyC-}4!w+zQUKQ{iPc3(Gqwkyn$(mgB{F<##T+R(@8co)eYw zd^o3l_u)B}*c>HA=jhQgrVvY1*FOn6UG6?-Dz#MY}0}cb`07MYnd6ZX>oxSs%v^yVR@EUO{dhg zJ7bQwBj>7xu~Eidy2d(o>{oT(K$$}FOVaAnz_oNTwTDXMAl;Vw43s3#r;HY_j~Atj zbXW7@#kMmjex&U(k9oL#%u?UORE%-2)YUJVy0l%LLp)=a&ra07 zWNgLHYsuf4wo^^lkJY3xSq0BH20N9Vt?a9;OvbjH@41|&@t?iPY6u_Bbk@N!o%O=8 zUK|DeG1|U!KVC6bx(jLSq6XUUj2WMT9YqQC$S8ff^QL`v;?K)$9l8sAq>d*ynfn~; z4{yEVnzdNDu4#Tp8=F>i-sWD~a1WNHX|-zZ>>uL{S6$B0bPPQ^zGA#*=>^Ct@b_}$w&b+!oM;VaE)-XI zS=VfPA9(LKMX2Aj(S%LuNHfY6S!cOSUNl)lerA8yeb;F1K|Stm3#fat2Gg<}sG%U}iC=>?Y$fy(f*G=&b754J9hev(W2^F*(^OjLw|4cJ@Jw zozC>yjbnQ4S)&z_c}G_SM?uwPugYWZfm)2Mkx1TPj(Bf zxSn>c#+Kvi&KbcGCPh&y_aQ!1RW`RQRFlsq^<+}3JC$@v+y~9B8OIDS?y-B+v^>}2 zOpV@MKGQk(xlYh)%)O8pU1tPp8vk>jmO6}Df?9)mjT**1PiCspli@lgJ$4AXSM3}G zU#TU@PsYuJr~MygQfk#x3_&{|pI*wIKk~fCb0l12`+SZT{Jv0qzGYnUt0m|8C2dfa zx9V6PEYzeA!GKF zmzlo0n{JiF92n5-<)veUocd`rN|m4HmYW5|9ay&pI9neg1J z5OTJEHx$3mojQN^zH=u|9l9e-h0trax7Yex>zl|8#Nnu3du_Y9+~3+1^oysA!f6R5K_#PWpNS>LMR!7KtD_F&`ey<7L5wrB-0ZC%9^%;?0(|z& zxU|+>M~?=0z5qwqo_B}nQXfy20+L+C&p{{FFjvFI6`l{bH&)U6?aj_Do1s3lhy`6w zo5SI;{-C|xS=-n=4#-kKB9h@dWYF0FBOC!k^4t5aHEgbo ziq&B{#i#9lXJ~~wxAcY}s5T2dAHl8u)@s|}t$__fz1F}YVhDQD-tP7X$C@C#J4Eq0 zsEQ0a=p5|~h8;oYk-A~fc5l#WZT1Jp)wa4^Ti`5Xmt(W5{nnA~<*jZP+^*LaVa^!B z)_QY!wX>Z-+4vInbqu_=yglf=VGE74L%rSz2&=N%!`b6G&J{k^&}|>@ppFJ_bxxnI z_wlfXw1Vs*vS=H1Xqxn4(NjQXkqMPT3Jw9%!2Wg$IkJq0b2ze^J{)#hcsd_mkv)ZY z_11fs2XzSDD>KkKX3}jva!yVYE$Xe1#cW<>xkB3r2pS~cOBTY@QG1`Ru_7-|m0{0!{$6pRkFx6!3Fz-m~XQy3du z#r)&A&({&QFyPuozqh`*-CTt5$^oahJ4}H?4+#ZLUC{OUZXM zSr=w`Lc->oq+@GcYe0RW5nd5ecjDsb83rp}c4QRtjnI3NSHm&j6~ifsOS9eP04~;eiwNm+njuiD+Za74LFmB6I#y7FxB9DFYwO!95Vj6hEiRDT zCV@a&gzH&>M6v)~LXy6q&Gi;$Kzn=H#1+!KGy}KAU~5>$wn0=@^XyCm24sX|1ziub zGjs42|7lOAPhEQV3>slc%vSgxfFQ|&{FuUqPgDkpotZb>myVLn2kw) zYf-E-T<^gS+LY>?#gzZ-6hgUAp!M)M1+=}^1Gh1=xAmYi7;ICO7Ng~j0i_Y%B$Um~ z)$P&Z(tuTWTYL_NZr4I%riS>3b&|+@2#q{bhtrrnoWsLec+c5G*eMN&^r_NQ;?BVy z&TwamI}cAPdx{0J0a?Bye~Q(l0U5qCe~QV~fawH7nDd*|f+3_9WZacMM6EE9&g2hC zZLJQEEh`VRrUA?7p8P4Pg*kLKK81=MkYB*RS5Iy6J=TMIDVAUA=yqt#))5u6HVPdH zlLyMhpi=Vu3uv!WB1u515Oj+5QX6H7r2K>`8 zxS2-V>zhz~4J-oxObD_zRujGv zEDgZs!rKKiA?dBR`U9#JK<2|cvQjksV7P%FiwoiN#zD|jR8$QtO79dDrd5+%L^+WL z;8OVftf&n5?adV$Q=x&W^932)R;GfVOSSNY0%{fXN|);4pQq0^duw0=EDh8*8~#NK z!sz!0+sB$c`cwcn!WU)DnKkI+w=@_2rJyVTLqg439Vj~=zPPAb1|cU`7c+?6SO{N| z!?spe@pv)3D{GEg@hI2#4z*t&7)#;*$}o-%V4H5QV{HW9HjV5s2le=+LMklkf{7gV zRl;lG-GYxua>-e4!VQ8L0;wL}BcwuXAP|_Gw6I}3%t42~Hv@027skCKG{To<2qo}b zc%Q(sk=Xw^_}O2cJcQ*4?+N2DS6>S6&niR5`s+P(r}su$oTLbv?gPT<74uA1WnrMt z!889?rOJmZTwUj&=e{B@S=2ZizEaOs6S?KK<=ku|e3gKb8G08~DP7F5A?ln9U!AnZ zqVitnpvwNWAjNd!AQuKkvCM`!IAQ;$Xj-NR^&%^2_18dL4~`{}=EB!hB5ihtbY|w@ zpM7oCl+Cr({^7%v?m4VZUng+!XnT_kKP)MNxAXN`VbiD)Tn`@G_BRSc9fM~>1t{Nd9?Rx830laXHE&vJ9*gHU$CB0{+>1hI&0~4| z7D3Hhq7*In4u^Rxq#sJ27wupn{nm0_%N;OioujGtu&jPtQBqFGNQKJlceFdNq(dVUdJ;`zbty_Ogzpl#-~=b>d;_aktKaTy zqYV1C7`|ILLoN$>+clrJmuu%SPk*HB1)>@^JNAIMRxRMTT4bfGPTkL1l!^Kd4tHE%&Ji{al2yxx~ZV45ky zm%9`cYwcuxgEi?=Ew(xX!~K`Y8(Trq7i;fFmMhr3rfz&R6r0Ajm(7~ z7e=vg*zggph;Ge8dHsYi3R$G`8Z;5cSVQrJ@b3iN+Uzcx!H~7T82)`$yN`rnvIweJ z3O^|vwhD)~cNE$VUay)9^N4-@RMCdw2`fk1UAo2AU%+eO;~D&LXT39^wFBE@9`UgM zkU>o$g69CuhM&$r?3o~q@E7c#E@P7-9O2U@F(O7DsnMaiO|0$!aAm|IbxWIr-`*Xq=S)LYn zn}g?b_F4!Dbkg|2BJ8DK$e|>Haf3ye zO8+AV#dyIYOr&4Tfk~WT5f;)fRYDmbScJFvKXa(X1&%8&un4#Fmvb=05%B;NoDaW} zLyEb-2>0_>327k~##ogMA8ZWFfY4tP#0(oem<_+K2jp?@uuLdCZ-n2_bF*_;bUys1 z7gg||4;R93 zEHLWfuM3QE23iC4@Haw8ms3<-4}ZHu)mC&i{GFqa`!+mWj8S?v{JlVoFAWeqq4C|a z0kWl4I1g9hByemha<6BH_u61YXxkdU^bseTY@vNXPzK{Q)3)h3{TWkhG(D@Ml&AxPZA`C z@oA(wiZ!+rp1dOtn}8Yg6d{erdIWxILBVKWa|YJY)AUeb05*naPuH_n&N*wO7M>yC z+7|X6R0<}L6}wIlSv1SEaIC(1cxDP1!m%WNJ>aTsN{LNJ#OnBPHauGou?gHn3sylR zJjW~8-0ZI#9dqHidWM)ue+_mYWBaIJE;&B zwgE~kg=sza6&==?t0AnhtaK^d;FZFxFXS24*?v78(_Sb>mH^|$lQD$w5+Sg|n)L-0 zSkj453oo5q!>lk46ji{`P1%F8FY~f60`dt5P~xNo;SsUZ<1;HhFny4_i7xmPPMa|*ul>sZn2B{aIIcSTm zAlMldWVH(yJON-QQ~M+)4w9yPZR zB(egev>rNoJZ>R$Zs|5@MF6Ke2?rR^u)vuOhbQ4!s2eDafa_H#F5^wn%XGB4&=Z!|2*A!db}yjLv)#!B zY>cgsz_e*g;Ckp!h3)1BR(T}cVA2h-MbqjOI}bH5XDfwsC4t9XfU)t1owTDl!usX_ z(O~UdfV{#LH%meTe zW>&-NG7y{{K|P1N(EMG-RtYF4=mZ%ipNC5E7q*=&3p zkpSJ* zv*67IzT_?~VNcYJM5J%z=C_es2xD4AkFqjo_eO1vLqgivUcnA5Vnv*zodrZm-a>~e z0kxpB1gmM|I)SZkaUP;rUE9|Q2pW}41#DKE*a@tEl)?f~Lp#|C2*!v&bK1^MK*-K$ z3O27zZMd?~=cFHrVCO<;c5ksoc>om+OL{Q0KDE%NuPgy!&S7pKjI?qLIu_wJY(Ik_ zqGG=%tH+i?n@>Y*>vC45_%&_-?TF7@r=)>8_l2?ow)}3#W)Q4FJb`AgQ8ddvqO3rh znTSc14Q>!+7^)Jh1Ged*xTylrw>j<;Wq3z>!`^alwYPa(d=uV0H;gj8W{a6a#%Ttd zdtF4ZBF`4Mg_PmbG8$}e4w|ha(idobkvmBhSlm@ryGz_ls=%<`2&Ku*q#OnN1KZ8@ z9#Tz5EL-NL(l{0*5*$%QE$%I4C>(%d(G^OY8%#M0c!15h)jn*=jsC_K7ccaz!yTsz z#1d6qZb4O`731GRL;wR}RU&MLt*8ulbJ=VTME&|3NGFtVAc*$uB|OXIqIJRuoTW6{ z4TK|q7MRvD@hVB9GU3*vCty_$rZ z3=Ve6zNZ3_WJazdYKQHsvD%02#3lws7lS>hO@y0NRf+-bLq zDbM)x&qgdT8jQha6|)ztnFcpEyb|nXia;n>H(NmH9QQ69hYcaE)e6sRSE2~lc8>8W z3_Hd6^^}nlJuc$=dTjGo&x_E$o--Pz$3;v(KHhHHki(%=JYNu=CBPE2sc8cXT+#dj zIAD5k0xcr?2~>?0@%-d@k<=&fqJsJ8N^cdQsUW`q7U^SJ;HW3d ziue~`?yKV{gek|`OiO`(!I*WT6B5SZw!;5{tqr#Dp;%{Y9_&wHs~ucmiID-!!u>f6 z7bg=|3l{m$VY7l2TL3w%Ay^Ur&tY?dHM9?q!*J;(+bcE%a@c}k^V$r^VMsJ*xdm+o zw6z z+M5z{gw!plFSw4hsNkaF`XfN$MWHV^lN8%4QgFG`WwbXH=2tOffc5owSrLA(%^$ad zMfpcbHN}KR=-guV{=7NB#=8`=9Xqn-bv6KDt6>ZI;MNQxEEc=>a>!lm$m=3)2xeQ< zK7*QbWzdGg^$vw?ESs!`7`8>~ZT+weVrvZXT?>QTW81%DHHf=fARJlht5DPkgY(E1 zp4Sx!*K-c4`HBF{Dh@8d787Drpb;$i&HX-}PBOS4bBcT?PjHgQcv3{^69^9R7{uZ& zT$HT}#PcjRy-hU=S@OrVU=e8^B7!Z6KXM6b$e*%k@^&8#Wh@ycAao+@LbO0}V1t=# zQu=JIsAE&vg1-@l-Z;zaaF{Iqn?P4M&URW%br*5qh>@h)TjLEye+>Z@FJr)X2!#VVi;f{0TY{3+ zs(h9K*)b@yf34~Uqp~IN8~c5xk{f)E!PyEp(>x7fUcuUJJ4nD#3k*F%5S>xDRSmN*1R3q~37+&*1{ zw+^x1_L5IJ0(ujV)r-?~1@R zL~2%gtF|6?u@2uILG8})2tD-Skh^v)+HQuk5l%ap+iUW_oAE(^yn&bm^Dq&{Y97U;VFI8bLDPM%Bk62uk*J3TI=8es8%4;V%dCoj8Zk$) z`4SQm@gq`^h*UyB8h%9KR$RFuq~S*d&%A_sDB~d|KjLlBndq-ujv-l&_4l0-iX?_Y zIRjD)pC2Kc$NCXc4_^==RwH4G;Gy7b_`(!y!$br~7b9}OXoP>BVt}M#&DGQf#$5Op z)flQ^K73ILoJbh<>i%U3ipb+=gpdmN#U=1&eSBFmvY^Xc25Nd_{y6M;s$`DSTywTFK@RnMPi? z8NR9nF8ssHz*^y7N0>DZGj0@k0_E-SZz94PmNoXOFtbE|Cwy(hX!l^q zm<=XiH+)?LF84Oqnj0w`XGOj~!p;2BzFJZTj*NUT;#iO(tD+vhA%e}jU_G5St_zSN z!3mLXiWo&safHr=Z;sHxW;d&RK730Anl+nJwh%rPp{@>E$Ogf#vGga7i+tNS3Xiec z{xgLG=S9AKG79!QX_El08NS2OXrC)Poug6M4P6FMzB{56*}vEdwj>n9ommgE;==b- zA(?EAkm})kBNBtOsD>D-Vm5qVgvNG?tkF>=jqv>m8s)~0i_n}>J#*p134)G3v7yZ- z53x{f3U5CAKo#C5yiJ@GmNG1k%&=r zF3nq2JyMXV$RVSn+hx4wC(1w+WQKS#EU;_-T^WPLQ-Z&rQU$Bw!8~ zY@7c)hJ_8VBimh`$1)V;c#omTq=aFQBYB2|6z@q$mM$tRqyg#mbQHJsB;j z4vF6p51Rx%WCdAW)*7NE|6>fy%{^W`lABbFp8R5hYY7e8G8L>YSO~uy;RV;BOW@KW z=SO-3mcp+@9OgN}!du=NnyRkhq~@ zo9LShzfpxE9VQgyaYvLw>5hWJ-5RWj--__qN{WK~?kW_hCpfC|25LCK`8!oewn33& zHpA~$Va8Yps9Fxc7jbwZgQ-3vQ(Zl4h2M`j2&-4&w8I}noTB#-h8FIGQ6-)5$%qiU zU!;mt$QQfe564hoa`a5WS}m|R{v@LKv@{$jVxiQ+ry@$xkYOPASG3@`>YpYkT-tEh zQS-lv^zahQ4!BslMz_|ig+DKW$uJ$sV<(#R@V`q46vmN8XwHVeD8ad`!bU|Nnl?>P zNhADa38~NsNH*kYC2MIe{8b6b8RE8itvMh5x`d-GuWjj4&8+4^_?r?IkE@JSRC6)> zZ3)gk4Lco1dqM6}_`4E(g?9n<%o?vXo8j+E;343OIHL4&c(?>+&hQ9~9HT3WC<$gK z2a5_c64wq>C3vUb6VYpkIWt|=jasUEpS3v=Pxad-D0AUO zIf^BWZ9q;3{bShu#jRC#^N}IXhv^&{;ge!27GXSfd?DO0hF4MDV%VRfMgFAX%A06j zoFkIoXnV82Da*3H*bFbpQTpv=oZZN6+d3AEm*!~9W~*Ej>Wi&#Ajci9BcW-9$)x2~ zrVd~AWjQi6Kh`R9*>HW17}E&{bF4yea;$E+F~>qz?G({SQS$BixkZ+G$Wbb~?@<_`!#A zZ0pb_4u|uu30o8DxG>@79EqLkc6b$>k%w)@96q{mVw?RD(n6@^NCj7ln?+qKwIo2}LW!9R5Bc))X$XE_@J7MccO~Im8n0H*< z{bZM=6p(gUa>xe61%~rFQp&mWgyG{&2%hKEtz-FkZI0VUwg&M~C#aI7?q$JVi&tT^6qdu4Mo z=A?A%?OIqX0jV2`*kZk159=i`*MACr$2L$Bpz z&xJRX5OT3-&xb(?p>PC7eo4K(5QZfjR?=I8N=E3-r%HP&T(FWdd4)gzKLsAgvYYyr^k5yfGrtT(_VNH8wmMW``WXtw9{qP9uEIZkWtb0OnlS z-VJkBnDgOHyJ0qjxe#vK4U?%1Xnirfc{fbvH2`xdoS2MRD6dX4oOC1|8sx>JjElV` zK2`)6PmvHCpDuH4goA{`dVH^z%(|9>P>AfbEXc-f;j?9+#iAeK zfv8S4D~=qLRc#jHohW4 z&4_G6{r8QlxRvIs9f&iFN|IpG1xhaA!j-R$z_sS#b)@SWU@?4M1layBcC#U~23!hX zAAu{D0iuCeLR{p75p*;I)xtMK(0ZTAsjb0~`t-T1JrhV-8#9<$66!Q`FWJ2dWW%BEqx96(%YX=EF}q0#b{MooUN;H!#A(4(?$` z0U45QHGzKDF+qPOhbl>uphoyv2jP4arYC1U7m=CpUvdDIIuBz)GCq+*hMTx-$3XS) zUrQjQEEr@q{I>`hB6xnJ!$cTV*9iYTLXe8q89Kl<6u%X37rqWUWT@gWBUuBh433?(BT2}1VD@7H_ITLTwB?6 z_)_?-GQ15hK)r+j|8^DBdkPW$oho?ITS)QmmciCIR~QnGG?3pbBe3<@YiyJJeicU1 zbL0a3K?y8*3S@!d5Wct{tsUH>owS;8z3Y&z7!pCo`@i?=o5mUImFr{eQs zfyCq4@Tc*yaz^pA5&q1dA~K2EnQMTx3}T0CPI>L~Usb>@s6+5#`0EPrMnMcQmcrjS z20~5VK(TiV!=>9nN2abU>@?o=O^IhN4G(G=9M?gV;jpZ5H~JB5Fen(%fk0kaM#7mQ z+F6I?h;<;9S5=_6Ytw;fKCTSs{=Bl#K<8q3d=)%auoSK?BUlzgk;sNBn&Fx<2JU5K zrbEP84%e1(gb^ERg?(iduO=e3!xPF#MN4)LQ@rhjCzg@CCY@~)S~onYj0Wy{K6)1^ z|KZ7H1RW&-_bkML-0bj_GRpGide=t~Gw`VuaD<0>Z8rr0Q}AgO7^5Cz0zSP0z5*R$ zQ(2YZ;{Gxcg2+r(YR8)9!*yk(QZ)x36fLXtAD z0qBP7Ct>-VCmuFLUl{QU2+Z|j->L(5_{&57)dJ)Q8c=0$&ksXRY%!ijmu(Z;~1{0$JTMRF)fFTillql6fj{1R!Lq>0p ziZ{c{#zA@M|h ziNRpB)qxvz=f*JTzLsnH^oVJ2$@51I0cR>NIB98DhZ3joLY+I% zO1b6@K>03iz8~=JFpWD<{GIW);=U2SO_Xrfa~c#(uW9`G@Dc(r{>JYofZ@w)D`+WGh z6>VGq?%inl1itZ&XD9HT?Xkw&@caR^z+PT#-=^^nqz6FlJl=S8D=rve-Fln%dGzWC zzF#mJVOId&E49q0hwP`08u(4$Zv}0417B|k&nepn&QD)??Nw(`H+xexlH2IZJ*fEt zXuDuz#ZosUrOsmXiNiNs{=datTZ~>+8QpECS6Z0fFBE!3lr*NTEkWd=GYq|O=`=Hx zOEPf^ZNUoGfes3YT5SOZFMuK%jrxEu#3*V*;)_AzLnS^aqN0fjAP*>&wonAII^%VgL^Ni57=eBr>2yM_n04-IX<^^T$88}_6> zL7p_QbN4`>o3Y!29ozTbx*gWoc$JB_-m&RkkW7XSO0{!(d>ntG$t;iMjuFb^FPMFe zj3jrV?4>m9GFC3RL4jqH{xGg%Ioz*>IViLDhJGfr6X~Ujbd_25Z;EFnQaVZYipjBg zjl+@0az{Ki5y@H)C2qN4Q2=iUz|yM-kN@p&e#mKDo*a>iG8~puqbPe-zcECy*Q1qJ zT||COBHdJdT|X2d!ll{Nm_@OBxksHmNjM|_ zB`4LAgd!m}c#I;&m1+gb^Y6`EXXUf7j06h8&0%p~3LD%xP27@LRvYleH z4Z3WK>;wVPnox};b*ezl^~lhv;CNtjn#2vP zi@Y6qhCt(cOvon*bqZQvArqZ0SwR3hMX#LsMVi;sT!Qo`X(+<)52s7U*JcjUFvGPL zw2zV1G0ZFxo+%+sbC@MrmE(3|EM~YhSG4#st=lOA`x{DF*8Skvkq zE49syAsgn5Ti1#-tE|`zA{DijNsC4-NLCsn9rHwmY^1PuN5@L0RVKCubFB1|vL6eA z*l{Hb>s$#HULl(&S%rCZzC@L57)9^VP|L&YTvJxxLqngIaOlSRD3;YTbA56eE2tdV z$fXkfoWYcI>ek0q9G-DS_sOVeIZUyp4E-judYU!ZL-)bH62^(iNJ=o=3l@Xh^)BOBdeJ<#cvG-37 zSU2_Dj;e8Ea7wFzM|Rv^mvg9kacTXsW3RqsB`ia5YSL)oqMdk5A5-XM87lR%SEX%? zc9hO6m9DNREv;&_qjq+w*3v&(`AF<>w4--!sdr5!x~`X&JlfGaztqbyTA8+~4Ul#e zpIItCzoOW!hqR;ftWqaO6lG-H?npa27fB~})WHI*885F!Uc!SYAdbbuqQ_H`cCZab zd9UT^m3KOY{pQ$ay{BOI_T5&hPsMt{_gX1G6(jt|S}H$9GeX6>> zpDFLr({tq%Tt&}{T zerqLSKv#5^r}v+ik`0OEg~aR0e!A-O3)MCc8N3#a(Gh8O0Zi5(t-N=I*V6a6!ti=3 z^rQn>A7kyBF6#zAU-FK2ADn!N0F5HAb&!lNk=B+{ki_KUYkK^ftlUxqXVe&ZZ)O&E zV?9P06EM~&44@~859+)G;I&(N2WMVQs!MAeuoOz@*2wR$vDA?wBzF_{2YB*o9^69b z1j*eLZnS8RJ-i;UV)Nqb#vIrNY)* zqm@68G;7;*!JeURc@`FNm`?q@Sa9pz_LdIhXKW9o}b_vwUrvD8*^&8?RhP&a(Pv>sM1=;GDlfKx?$nCd*1Hz;ewGLmic z^_BL)gmmy=Rr&54qC9r8x|GHQ01scG)F*+S^lMHYLyz04B5s!(u@-o@#1o$yzgwqp z>JH)EyJXMIRQnwe%}L^?zJp*~yo?GDC`^crwx1MoVG0Sj;zd_jRGiZ(Y#clL%S43SiiP9#SFRrr+4|9%M`G*%%d*ZLRg=kuSSJtlMxq z%KD)Pq?jV)4K9K`Sb2x7=*s(AuwwBO3im5PgjEs1{BuQsLtkI32r#yNq#^*@=GQ9% zT#@}oA;8BE!i;m}eJ$v%VxYuvBJ^8T0gN*zuu4b*5L- z1iW{rY~p*u=MdS7?3m0`0ym)=f^wE+i593p z5X2;0593ZX0K7madn~%xY~w>Uky64N$LFQnI~bBgFn?^Y`$8Sk5XhF5UKD1-kZ1`# z4ip&WzgU!wdIebrJL)@aTX{jgUMoV$$KLO)0o3(pSV95Ka;jfO zn<-MWbN^O~#WiR70{cn!c=;_m2pcN#vpdIHfx%c7V?q!cAjzjo7NeAzyq_UBR)KVD z9;_D?ZFXgQR>i#{Ia?z0%B1lTW|$+n6#$O%S?9TD&>!ZOn#;;HZ*2Cd6!_sSLXHg(#Uy|CgNwqmHbgZ{=H@E&M-75V%unQ zz-HsLcOWA2HESrS$M32sjBdi3WV@*79#9U^(9ko%&=nD@ljuN z!dZ1bjAGR9wWWyNP$h`<{Wz@6D_59Ba5kyykhjQ5VeH-B^EXTZ3=ahLUB78!i_Z7+t z79n4kx=Wy!9JW_(e=3X}R+&QK?iA0B*x%C{R(-fvxH2DE(`35-b8^AT zrQWs35*wy{zJ^u|*54wd|KjwLr!{{_?7+Cu#oQwKg~P~HDhs#;B>jW`5; zIp$|M>ZuMp5KZLF1JaRFe2S%|;0*;;!KfcL=ll!LPOP6*G%e{_Mb1`Wi5 zEIGl~H8_{s1Gio9(F^~B_`eIL7<-}VO1K*t@iLg?5&iEUwf}u^oriyL)c#o_a{p70 zj5hvW#%uB4GHU-`2WtMmI%@x3M{53`8?}G0Ly7;5NRQ+2KQb}_e`pMtK1mw_&W^C- zXv9(3Yxp&IUvVtrXJq)DkUU!8of+PPHe}r!(f{-eA3|+@^zDex$narE*5FQt#UG6g zo;3bX;r(EN&&u$#(FT4W=P%9w>@D8p|?{yjM};)^rG&Wt!3)EfQ-@Xo~%M`K>YZvg)C z@`$4`ui@;&hTaqL^D_LU4~MYuyfH~Xd(hk@bwqc49!}l-GIPWG2M0jpU-s8eXKwxr D1Xiq^ diff --git a/cppcryptfs/res/ru/Resources_RU.aps b/cppcryptfs/res/ru/Resources_RU.aps deleted file mode 100644 index 6530ad3c554af0b8ed62267aa2faed047e91c78b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 130120 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 ViSdi?4<3if=&)Xg_XnQl{{Z6PioyT@ From 00abb6911b5156c5957fa7cc8872c914dcd12248 Mon Sep 17 00:00:00 2001 From: nbb1967 Date: Sun, 1 Mar 2026 17:32:06 +0300 Subject: [PATCH 26/35] Language controls. UI Polishing --- cppcryptfs/res/en/Resources_EN.rc | Bin 64982 -> 66548 bytes cppcryptfs/res/ru/Resources_RU.rc | Bin 70072 -> 71686 bytes cppcryptfs/resource.h | Bin 25874 -> 26068 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/cppcryptfs/res/en/Resources_EN.rc b/cppcryptfs/res/en/Resources_EN.rc index 34472e7b6e02889ad47cfb8cad4e30333002a085..508755b2dac5b729da551bf92237e074015d72f0 100644 GIT binary patch delta 8180 zcmai3Sxj8l89oGxSq2+JV8CFQVHk$Z471N*z)ZkPYzzit8&W6O*kBSl7&(rmR*7O# zsfiV}1RtqY7AvvZzEu_owMz03i71KOHnrnCM56}7-vMTU{2G-7ed?mjn$H)Df{qUXL{1g7drtzSUMOYI5%M$Q} zzfqQkXYnSkjj)if)VFY7K~V^$#s4B8*J+WDz#Huy-&^oJcwXAu#^>Mi@P`HC;Blld z;PUX+ra~2iyE*APDmqL7vS#}p9PI#PmN(TF{y!?8Hq`ZW-=$S zdesxlF$LoLk|3C%K&)s%5Nat+ISNq3(2#Bl0y_U}+h#F5fJ*_0fOJgLqu>zSEj2N) z9oL7WDqBY;`2LYkAmidvTFEV_m;zVwr?l+PD$U$ zp}`!v`QcqqY)8CWh7gd0X>ny6fn#Z5$Kqn`@-c) zeI|q%P1Gn!MGaOS=GG=(j||x}6{S6*t@X1>XlKLh2peK!GLcalnNAh)Eca;gYkV+Q5~6tRyqhD#2^0&%3KTq4J-tPGIGmDi_*@3JIl)px98iP~SJ=XY=`dy$8Yw#c1$BiG!>On^cNDh7pt0MjqyTSPG)lDZ+?D zq-b2G7%_@d>bJfs@R5`7U{`vVpVBcnZl9Z^{d{jaK+_#W3m+y zu5iPMhKc->9A%@5bTz-zcoc9!pXBjC1B`uf0v8y1iD_l6<{V{76pkt~L|NA8b6_ti zQPSdsP;RMd;a3_3dxVr^-I1>Mw(zN76Zm;0h^@yBDYXI0FEi4+eh(jSl9>ctDNfU} zeONg~v>!M5OuUk;J6ddAzX&P4PMBC)k`?K)8v8V+&y5Le;$FA+M#@28mooz zw8d1q(}Isy@*;t84?#N_TJWvKBmBEqH|U4s0r=M21B9NqAr#26UH`}?xenvI7QH;0 zKrFfyC?K+eB}Q$_Zs+!Ni2p6o1iHn^u&V`{Se%d`BR7*t(9KPyTrJQf?`$E+KTlyA z|1;I*Y9S6I!qj%Muoe&T-={ltM(%x5&X=F4EF5N|uwMo(7iOqUIN8LhW;xRic)rSD z?mKg9q!o$-_9Imq<^Oo zuJ=O4{;XD>8jSRsrbBDTi}eDU zcAL<$bs@fdIgel8pD$e1W0(aOV*JDdO-aZ?=SLpyd83H?4p_Bt?nQ06F#`?+`>6H8 z0lAITeW<;OeHGC8Q69g4pvZ!X&{*xS!->eDK`dOz2;F{CqM zj;=u~C98eJf7f5c2M#t`e9#dVtz4ClkTyNuIEYQih$<~nSvAl{*N~Lfrfm_2&JE4_}_zm(DGpqc<@J@l;AWQsMW!Hxf+hi$LR@sGNWTw?7PuXCVM_w96 za0&tz4Ol3;R{3kAv6MQTIRu9!V{D(yY2uPN!bJ(~LV<05Zv^*!U;(`KjQRsOagYx2 zo8ZG{*6eykR^%`+b6Y!VTI6 z{ub|@x&Sl7`%@Fb7t}>suJGv63r|MG1{JGN)DdnC=1<`& zU81VE(hg#yZK2w_QnlK(-k*Xs?~S~WxK5sdE8$?>zL>9#1-sA#A%kg~q)wqQ zlSQoYEKtN4j(8G-5ZNKN7cP;q@GaH=bO?p3cac@JVUrs;t`2;FiT)(W03hpAa)qxf%L9Pbwb_NAURiABm;T|&mG|}hi<=Gn^;b6+@7Auz W&*DWq&wlFV7tjB8_5Opum;4X+eDo;* delta 7320 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 Q>Hga9zO%Xf?{_@^2ZukoL;wH) diff --git a/cppcryptfs/res/ru/Resources_RU.rc b/cppcryptfs/res/ru/Resources_RU.rc index d16e5bf81f2694a995e8ee86386adfd091b88eb4..5529ec35da0588900bf4e16b69a4e10d67b181fa 100644 GIT binary patch delta 8417 zcmai4TWplq5k4FL7~gR41#GafcfBm@yS?{a;|q&p1I5@F9D)hKEMV@~DRHD$s#-gZ zc%V@QJxH#iC~;d=t*VrO{LrX2cW>;M~Keen4- zn`dvr`x$tjV^OvM&vR@Re$K$t0-L}2Y}5Df;XJ#*-eBGE;RaU5fVo9_5g5GTCWMo- zz-j?rubQmR!xJ(uuq)=%JUa`&f7=9rCoaQZ=GZylR)AMLdjWoj6D?~TL8e#P?CNw; z`3wAE#RJ}2{Cc32KW+`LYhj%%$p2W}76|gm$`HJMv-11=#`>d?Ad9gy{*|TR3E$%^ z3(w+{q^V&kpKNZ6?PKF?luej_iOCZ&INj@@ioqx5XZ+QYH$ndW(lCGLqgq~BdKBc& zmWD$?mV_Ua5VK^aC5kM5&I=U{CgmhhRF&14CCjTGR$TmQ%2Yr{2OLd5?R8cR(CyI7Zn23uTQ|MBJH`N4zYM^EdyoPFP z;PqyHrzRUMDnc_O-!Ytp^^yMbnx<{aHiy72d8j56kQ!r91kmLcSHOhzqe`g zfI@!&aK8-5oqkpP+%`l`kA7JmGZ9wY21)O6CKS7w5uccZ{U@qS&4%i--A z6hrlxxt5o0en?2FjEq|4V<^IW@mVqds=gPfJGM0IJj_z1N(gbmLMO9&IaC$c#y{E8 zi`B%e?GLxkfn#k2!K_DAjYWcCK%iMk4OtE#$kLXX=ww>fFng*&G0;NBs~8A~ajCM~ z*v}hfDFA$w&Z#vEfvWKoQpyx|bhbhOuE0Vd@DQaNk1gFan^Bm>txhD;9+D00m6g_^ zQy7d?a`jY0?v+6d6p_qHscBAfrQgvr#6K4mNlP*)2>oQB*IPrf&jB{YlaeRt@H_Nx zz7nbj3t>o7|D-;L#X{4C&uYYvOC=B zKt}TcS)05*AD#zfn2crHJNa9YYCe7f?O>&28)}%fq!1sBAAwm*$?ek~NGUI98p0AT z{Der~i8yVTmTkftDW?6A9fv^9FLuN&lJN2mEm*AArV4mYEv@JHB;XtFX3a{TU==GBYcgE*BIMmiFrn@+I( zCIN<=FfvXcLP58=X%^`1tw>Qf&ci%0Y)*{iECIoj&+?})2DoVI)xA)8P3y9pQgVodo)!bQoSK zr*wMSZM^AcfT|~x(`g~ANH*r3sE(f0P{Y2;3<7N~+vCfDdWjbYtk+*>&j4*9m+|G0 zkU8MTp}P+;TV`@) zvra@%QP8RVp9?`|w-ZnldwPPU4!T{#^0D$j#p=q~qF>9?-(6vebcF^Gka5ApTKO@&(k*JdA=%Wq>QwYHTn%NSt?__5Po=K zGhaN2S1GzYnnB(2mc~2yzYfY7-?9R6cArNppo|-nShaK+8LN^IHCgV{$penF)E&L~ zUprJQ&YN?B$go~t?vD@cah+bX2p<^N(J^O%W)7|I;HO8;!D% z4-H?bYOzr$3;9swXv~~}OZy49cpH)RlxAUNHN`>nCcrqXsOjQvM!&k#^i}rs;KS=% z+s!$iq$*o_oCeFBo=(`#tH}30fB$$5|9V<%nj}MIfH%$4Bb)f*v5jVbCmNjVs9Sqb z<&{0A*j`39Iqa}0?#^p)0sUTiRm>Giu9xpEKLACce^bvCT-lAeWO>DaPC0x$>dNw3wKQIkZp|UNRoe^aGW>t|(OAG79}2^4eDUUeS0-`RwGVLkivmP<(kyxmn2B zG|?%%WK^Hp?UJEl*iQz|i(4IX6qQ>}geOnC<*3N_mh<#<${|BhxMhU-@iVw_*uA3a zhqnyavTQPN`6dfHWjx*<<%_d%hYY-BAPRbNMsVlZT8MYmBXk-|iaB`=Rt2_dYyJcN zopaxUw(;e;b3!a6g1YRYdxwNvZE)Nc1ptTgd*>^G=IQA!{>6Fx9?V)X%w(dgO}d~| z-wNqGetbdl*f0v;-b|6IKD;Qfy?MQU5m5l1a{L};6uvF9EiEQ0x*}Al=(1Iz!j%-Y zdixTNVs@>Fo{%K1yBS3v;q8~FB#&QR4r)9iuB%3}l3F8Z{a06w@*AU~Alt#0uG9fP zv2dy@5lUM3!ih`j7guoPpoNpZT2KwiP4(ruNVvzy82gPr1GWugz}O9A?Jnabc+DAk zqt~#;XbA4KwMD3Hgs|aCC?W=~gi>SR<8ihJzUj)ts~8yQP74{rMK(dvzoK?Lyh| zN^!v8E5C02QDw<`?LQ>&fB(0Z&#g9=2aRD+IuFLk@~Uff%S~m0lI7c_@bcM)z=ywi KR22C8hW`OC;pr{_ delta 7242 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 delta 27 jcmca|nsL%8#tkVBlNFd*CO>c#*u2kSmEz_nNgtR1sZk6! From 4078e434e124f1a56d04e1aa9a1733d6d0b11904 Mon Sep 17 00:00:00 2001 From: nbb1967 Date: Tue, 3 Mar 2026 19:12:28 +0300 Subject: [PATCH 27/35] Implementation. Moving arrays. --- cppcryptfs/cppcryptfs.cpp | 74 ++++++++++++++++++++- cppcryptfs/cppcryptfs.h | 20 ++++++ cppcryptfs/res/en/Resources_EN.rc | Bin 66548 -> 66838 bytes cppcryptfs/res/ru/Resources_RU.rc | Bin 71686 -> 71958 bytes cppcryptfs/resource.h | Bin 26068 -> 26152 bytes cppcryptfs/ui/CreatePropertyPage.cpp | 25 +++---- cppcryptfs/ui/CryptAboutPropertyPage.cpp | 42 ++++++------ cppcryptfs/ui/MoreSettingsPropertyPage.cpp | 48 ++++++++++++- cppcryptfs/ui/MoreSettingsPropertyPage.h | 10 ++- cppcryptfs/ui/SettingsPropertyPage.cpp | 45 +++++++------ 10 files changed, 207 insertions(+), 57 deletions(-) diff --git a/cppcryptfs/cppcryptfs.cpp b/cppcryptfs/cppcryptfs.cpp index 7085367..f93600a 100755 --- a/cppcryptfs/cppcryptfs.cpp +++ b/cppcryptfs/cppcryptfs.cpp @@ -86,6 +86,67 @@ CcppcryptfsApp::CcppcryptfsApp() auto context = get_crypt_context(BLOCK_IV_LEN, AES_MODE_GCM); } +// Callback function for searching language sections in the EXE string block +BOOL CALLBACK EnumLangsCallback(HMODULE hModule, LPCTSTR lpType, LPCTSTR lpName, WORD wLang, LONG_PTR lParam) { + auto* pList = reinterpret_cast*>(lParam); + + // Exclude duplicates when scanning String Table blocks + for (const auto& item : *pList) { + if (item.langID == wLang) return TRUE; + } + + LanguageOption opt; + opt.langID = wLang; + // Extract language names + opt.name = theApp.GetStringForLang(hModule, IDS_LANGUAGE_NAME, wLang); + + if (!opt.name.IsEmpty()) { + pList->push_back(opt); + } + return TRUE; +} + +// Scan EXE resources for translated sections +void CcppcryptfsApp::ScanResourcesForLanguages() { + m_vAvailableLangs.clear(); + // (IDS_LANGUAGE_NAME >> 4) + 1 — formula for calculating the block number in String Table + EnumResourceLanguages(NULL, RT_STRING, MAKEINTRESOURCE((IDS_LANGUAGE_NAME >> 4) + 1), + EnumLangsCallback, (LONG_PTR)&m_vAvailableLangs); +} + +// Direct reading of a string from a specific language section (bypassing the current thread locale) +CString CcppcryptfsApp::GetStringForLang(HMODULE hInst, UINT nID, WORD wLang) { + HRSRC hRes = FindResourceEx(hInst, RT_STRING, MAKEINTRESOURCE((nID >> 4) + 1), wLang); + if (!hRes) return _T(""); + HGLOBAL hGlobal = LoadResource(hInst, hRes); + LPWSTR pData = (LPWSTR)LockResource(hGlobal); + if (!pData) return _T(""); + + int nIndex = nID & 0x000F; // Remainder from division by 16 (index inside the block) + for (int i = 0; i < nIndex; i++) { + pData += *pData + 1; // Skip previous strings of the block + } + return CString(pData + 1, (int)*pData); +} + +// Check: does this language exist in the resources (protection against outdated registry entries) +bool CcppcryptfsApp::IsLanguageAvailable(WORD wLangID) { + for (const auto& opt : m_vAvailableLangs) { + if (opt.langID == wLangID) return true; + } + return false; +} + +// Saving user selection to the registry +void CcppcryptfsApp::SaveLanguageToRegistry(WORD wLangID) { + WriteProfileInt(_T("Settings"), _T("LanguageID"), (int)wLangID); +} + +// Reading the selection from the registry (0 — if the entry does not exist) +WORD CcppcryptfsApp::LoadLanguageFromRegistry() { + return (WORD)GetProfileInt(_T("Settings"), _T("LanguageID"), 0); +} + // The one and only CcppcryptfsApp object @@ -120,7 +181,7 @@ static bool StartNamedPipeServer() BOOL CcppcryptfsApp::InitInstance() -{ +{ const WCHAR *szUniqueNamedMutex = L"cppcryptfs-A7DDB0CF-A856-4E8A-A4E9-722473FB5E49"; @@ -237,6 +298,17 @@ BOOL CcppcryptfsApp::InitInstance() // such as the name of your company or organization SetRegistryKey(_T("cppcryptfs")); + ScanResourcesForLanguages(); + WORD wSavedID = LoadLanguageFromRegistry(); + + // Apply the language only if it is found in the EXE (protection against “junk” in the registry) + if (wSavedID != 0 && IsLanguageAvailable(wSavedID)) { + SetThreadUILanguage(wSavedID); + SetThreadLocale(MAKELCID(wSavedID, SORT_DEFAULT)); + } + // for FindResource to work correctly in MFC + AfxSetResourceHandle(GetModuleHandle(NULL)); + CCryptPropertySheet dlg(L"cppcryptfs"); CMountPropertyPage mount; diff --git a/cppcryptfs/cppcryptfs.h b/cppcryptfs/cppcryptfs.h index 1625d85..6fd9c87 100755 --- a/cppcryptfs/cppcryptfs.h +++ b/cppcryptfs/cppcryptfs.h @@ -43,6 +43,7 @@ THE SOFTWARE. #include #include #include "crypt/cryptdefs.h" +#include using namespace std; @@ -68,8 +69,27 @@ typedef struct struct_CopyDataCmdLine { class CMenuTrayIcon; +// Structure for linking the system language ID and its text name +struct LanguageOption { + WORD langID; + CString name; +}; + class CcppcryptfsApp : public CWinApp { +public: + // List of all languages ​​found in EXE resources + std::vector m_vAvailableLangs; + + // Localization management methods + void ScanResourcesForLanguages(); + bool IsLanguageAvailable(WORD wLangID); + CString GetStringForLang(HMODULE hInst, UINT nID, WORD wLang); + + // Working with the registry + void SaveLanguageToRegistry(WORD wLangID); + WORD LoadLanguageFromRegistry(); + private: bool m_bIsRunningAsAdministrator = false; bool m_bIsReallyAdministrator = false; diff --git a/cppcryptfs/res/en/Resources_EN.rc b/cppcryptfs/res/en/Resources_EN.rc index 508755b2dac5b729da551bf92237e074015d72f0..85a9941a281b39f5b18e190d7309e38c81b83ed1 100644 GIT binary patch delta 208 zcmey;&N8iwWkXFavmt}Q{uLGtbsfb z+myuth|O6HSnPp%9D%wGSo9baCM&i{+oH=ku~-02gy?esnqmypYXCIc2B=ek!3fB6 eW^o7F+!;cFv^#?8x*kfRC!W^fNM delta 14 WcmZ2+hVja2#tj(`oA)^6r~&{sy#}rT diff --git a/cppcryptfs/ui/CreatePropertyPage.cpp b/cppcryptfs/ui/CreatePropertyPage.cpp index 46f6f97..b5b8d4a 100755 --- a/cppcryptfs/ui/CreatePropertyPage.cpp +++ b/cppcryptfs/ui/CreatePropertyPage.cpp @@ -43,15 +43,6 @@ THE SOFTWARE. #include "util/util.h" #include "locutils.h" -static CString listBoxStringPlainText = LocUtils::GetStringFromResources(IDS_PLAIN_TEXT).c_str(); - -static const WCHAR *filename_encryption_types[] = { - L"AES256-EME", - listBoxStringPlainText -}; - -#define NUM_FN_ENC_TYPES (sizeof(filename_encryption_types)/sizeof(filename_encryption_types[0])) - static const WCHAR *data_encryption_types[] = { L"AES256-GCM", L"AES256-SIV" @@ -105,6 +96,11 @@ void CCreatePropertyPage::DefaultAction() void CCreatePropertyPage::CreateCryptfs() { + //Moved to both methods, otherwise the array will be loaded before we determine the GUI language at program startup. + static CString sPlainText = LocUtils::GetStringFromResources(IDS_PLAIN_TEXT).c_str(); + static const WCHAR* filename_encryption_types[] = { L"AES256-EME", sPlainText }; + const int NUM_FN_ENC_TYPES = sizeof(filename_encryption_types) / sizeof(filename_encryption_types[0]); + CWnd *pWnd = GetDlgItem(IDC_PATH); if (!pWnd) return; @@ -205,7 +201,7 @@ void CCreatePropertyPage::CreateCryptfs() if (cfenc == L"AES256-EME") eme = true; - else if (cfenc == listBoxStringPlainText) + else if (cfenc == sPlainText) plaintext = true; if (!plaintext) { @@ -296,7 +292,7 @@ void CCreatePropertyPage::CreateCryptfs() //To save localization-independent text in the registry CString filename_encryption_type_for_registry; - if (filename_encryption_types[nenc] == listBoxStringPlainText) { + if (filename_encryption_types[nenc] == sPlainText) { filename_encryption_type_for_registry = L"Plain text"; } else { filename_encryption_type_for_registry = filename_encryption_types[nenc]; @@ -376,6 +372,11 @@ BOOL CCreatePropertyPage::OnInitDialog() { CPropertyPage::OnInitDialog(); + //Moved to both methods, otherwise the array will be loaded before we determine the GUI language at program startup. + static CString sPlainText = LocUtils::GetStringFromResources(IDS_PLAIN_TEXT).c_str(); + static const WCHAR* filename_encryption_types[] = { L"AES256-EME", sPlainText }; + const int NUM_FN_ENC_TYPES = sizeof(filename_encryption_types) / sizeof(filename_encryption_types[0]); + // TODO: Add extra initialization here CString clfns = theApp.GetProfileStringW(L"CreateOptions", L"LongFileNames", L"1"); @@ -392,7 +393,7 @@ BOOL CCreatePropertyPage::OnInitDialog() CString cfnenc; CString cfnenc_tmp = theApp.GetProfileStringW(L"CreateOptions", L"FilenameEncryption", L"AES256-EME"); if (cfnenc_tmp == L"Plain text") { - cfnenc = listBoxStringPlainText; + cfnenc = sPlainText; } else { cfnenc = cfnenc_tmp; } diff --git a/cppcryptfs/ui/CryptAboutPropertyPage.cpp b/cppcryptfs/ui/CryptAboutPropertyPage.cpp index c6f61fe..3a0503c 100755 --- a/cppcryptfs/ui/CryptAboutPropertyPage.cpp +++ b/cppcryptfs/ui/CryptAboutPropertyPage.cpp @@ -104,27 +104,6 @@ BEGIN_MESSAGE_MAP(CCryptAboutPropertyPage, CCryptPropertyPage) ON_NOTIFY(LVN_ITEMCHANGED, IDC_COMPONENTS_LIST, &CCryptAboutPropertyPage::OnItemchangedComponentsList) END_MESSAGE_MAP() -static CString listViewStringCppcryptfs = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_CPPCRYPTFS).c_str(); -static CString listViewStringOpenSSL = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_OPENSSL).c_str(); -static CString listViewStringRapidJSON = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_RAPIDJSON).c_str(); -static CString listViewStringDokanyMir = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_DOKANY_MIR).c_str(); -static CString listViewStringDokanyLib = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_DOKANY_LIB).c_str(); -static CString listViewStringSecuryEdit = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_SECURE_EDIT).c_str(); -static CString listViewStringGetOpt = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_GETOPT_PORT).c_str(); -static CString listViewStringAESSIV = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_AES_SIV).c_str(); - -static const WCHAR* components[] = { - listViewStringCppcryptfs, - listViewStringOpenSSL, - listViewStringRapidJSON, - listViewStringDokanyMir, - listViewStringDokanyLib, - listViewStringSecuryEdit, - listViewStringGetOpt, - listViewStringAESSIV, - NULL -}; - static CString lf_to_crlf(const wchar_t* txt) { CString fixed; @@ -155,6 +134,27 @@ BOOL CCryptAboutPropertyPage::OnInitDialog() CCryptPropertyPage::OnInitDialog(); // TODO: Add extra initialization here + //Moved, otherwise the array will be loaded before we determine the GUI language at program startup. + static CString listViewStringCppcryptfs = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_CPPCRYPTFS).c_str(); + static CString listViewStringOpenSSL = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_OPENSSL).c_str(); + static CString listViewStringRapidJSON = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_RAPIDJSON).c_str(); + static CString listViewStringDokanyMir = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_DOKANY_MIR).c_str(); + static CString listViewStringDokanyLib = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_DOKANY_LIB).c_str(); + static CString listViewStringSecuryEdit = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_SECURE_EDIT).c_str(); + static CString listViewStringGetOpt = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_GETOPT_PORT).c_str(); + static CString listViewStringAESSIV = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_AES_SIV).c_str(); + + static const WCHAR* components[] = { + listViewStringCppcryptfs, + listViewStringOpenSSL, + listViewStringRapidJSON, + listViewStringDokanyMir, + listViewStringDokanyLib, + listViewStringSecuryEdit, + listViewStringGetOpt, + listViewStringAESSIV, + NULL + }; wstring prod = L"cppryptfs"; wstring ver = L"1.0"; diff --git a/cppcryptfs/ui/MoreSettingsPropertyPage.cpp b/cppcryptfs/ui/MoreSettingsPropertyPage.cpp index efcdc3d..a95b5d1 100644 --- a/cppcryptfs/ui/MoreSettingsPropertyPage.cpp +++ b/cppcryptfs/ui/MoreSettingsPropertyPage.cpp @@ -35,6 +35,7 @@ THE SOFTWARE. #include "ui/cryptdefaults.h" #include "MoreSettingsPropertyPage.h" #include "afxdialogex.h" +#include "locutils.h" // CMoreSettingsPropertyPage dialog @@ -54,6 +55,8 @@ CMoreSettingsPropertyPage::~CMoreSettingsPropertyPage() void CMoreSettingsPropertyPage::DoDataExchange(CDataExchange* pDX) { CCryptPropertyPage::DoDataExchange(pDX); + // This line links the ID from the resources to a variable in C++ + DDX_Control(pDX, IDC_LANGUAGE, m_ctrlComboBox); } @@ -65,6 +68,10 @@ BEGIN_MESSAGE_MAP(CMoreSettingsPropertyPage, CCryptPropertyPage) ON_BN_CLICKED(IDC_FLUSH_AFTER_WRITE_NTFS, &CMoreSettingsPropertyPage::OnClickedNtfs) ON_BN_CLICKED(IDC_FLUSH_AFTER_WRITE_NOT_NTFS, &CMoreSettingsPropertyPage::OnClickedNotntfs) ON_BN_CLICKED(IDC_FLUSH_AFTER_WRITE_NO_SPARSE_FILES, &CMoreSettingsPropertyPage::OnClickedNosparsefiles) + // List selection event (activates the button) + ON_CBN_SELCHANGE(IDC_LANGUAGE, &CMoreSettingsPropertyPage::OnCbnSelchangeLanguage) + // Clicking on the button itself + ON_BN_CLICKED(IDC_APPLY, &CMoreSettingsPropertyPage::OnBnClickedApply) END_MESSAGE_MAP() @@ -77,6 +84,23 @@ BOOL CMoreSettingsPropertyPage::OnInitDialog() { CCryptPropertyPage::OnInitDialog(); + if (::IsWindow(m_ctrlComboBox.GetSafeHwnd())) { + m_ctrlComboBox.ResetContent(); + + // Fill in from a pre-prepared vector in theApp + for (const auto& lang : theApp.m_vAvailableLangs) { + int nIdx = m_ctrlComboBox.AddString(lang.name); + m_ctrlComboBox.SetItemData(nIdx, (DWORD_PTR)lang.langID); + + // Select the language in which the interface is currently running + if (lang.langID == GetThreadUILanguage()) { + m_ctrlComboBox.SetCurSel(nIdx); + } + } + // Make the "Apply" button grayed out on startup + GetDlgItem(IDC_APPLY)->EnableWindow(FALSE); + } + #define DO_CHECKBOX(tok) \ m_controls.emplace(IDC_##tok, make_unique(*this, IDC_##tok, tok)); @@ -90,7 +114,7 @@ BOOL CMoreSettingsPropertyPage::OnInitDialog() DO_CHECKBOX(FLUSH_AFTER_WRITE_NO_SPARSE_FILES); - SetControls(CryptSetting::SetType::Current); + SetControls(CryptSetting::SetType::Current); // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE @@ -158,3 +182,25 @@ void CMoreSettingsPropertyPage::OnClickedNosparsefiles() { SetControlChanged(IDC_FLUSH_AFTER_WRITE_NO_SPARSE_FILES); } + +void CMoreSettingsPropertyPage::OnCbnSelchangeLanguage() { + // The user has selected something — the button becomes active + GetDlgItem(IDC_APPLY)->EnableWindow(TRUE); +} + + +void CMoreSettingsPropertyPage::OnBnClickedApply() { + int nIdx = m_ctrlComboBox.GetCurSel(); + if (nIdx != CB_ERR) { + WORD selectedLangID = (WORD)m_ctrlComboBox.GetItemData(nIdx); + if (selectedLangID != (WORD)GetThreadUILanguage()) { + theApp.SaveLanguageToRegistry(selectedLangID); + AfxMessageBox(LocUtils::GetStringFromResources(IDS_APLLY_LANGUAGE_RESTART).c_str(), MB_OK | MB_ICONINFORMATION); + + // Settings applied, button turns gray until next change + GetDlgItem(IDC_APPLY)->EnableWindow(FALSE); + } + } +} + + diff --git a/cppcryptfs/ui/MoreSettingsPropertyPage.h b/cppcryptfs/ui/MoreSettingsPropertyPage.h index dd91d31..17c72e0 100644 --- a/cppcryptfs/ui/MoreSettingsPropertyPage.h +++ b/cppcryptfs/ui/MoreSettingsPropertyPage.h @@ -53,11 +53,17 @@ class CMoreSettingsPropertyPage : public CCryptPropertyPage protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + // Variable for our ComboBox + CComboBox m_ctrlComboBox; + // Handler for changing the selection in the list (so that the Apply button becomes active) + afx_msg void OnCbnSelchangeLanguage(); + // Apply button handler + afx_msg void OnBnClickedApply(); + std::unordered_map> m_controls; void SetControlChanged(int id); void SetControls(CryptSetting::SetType set_type); - DECLARE_MESSAGE_MAP() public: afx_msg void OnClickedExfat(); virtual BOOL OnInitDialog(); @@ -71,4 +77,6 @@ class CMoreSettingsPropertyPage : public CCryptPropertyPage afx_msg void OnClickedNtfs(); afx_msg void OnClickedNotntfs(); afx_msg void OnClickedNosparsefiles(); + + DECLARE_MESSAGE_MAP() }; diff --git a/cppcryptfs/ui/SettingsPropertyPage.cpp b/cppcryptfs/ui/SettingsPropertyPage.cpp index 37c0e51..b52f751 100644 --- a/cppcryptfs/ui/SettingsPropertyPage.cpp +++ b/cppcryptfs/ui/SettingsPropertyPage.cpp @@ -96,32 +96,35 @@ static buffer_size_t buffer_sizes[] = { 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2 static int ttls[] = { 0, 1, 2, 5, 10, 15, 30, 45, 60, 90, 120, 300, 600, 900, 1800, 3600}; -static CString listBoxStringInfinite = LocUtils::GetStringFromResources(IDS_TTL_INFINITE).c_str(); -static CString listBoxStringSec1 = LocUtils::GetStringFromResources(IDS_TTL_SEC_1).c_str(); -static CString listBoxStringSec2 = LocUtils::GetStringFromResources(IDS_TTL_SEC_2).c_str(); -static CString listBoxStringSec5 = LocUtils::GetStringFromResources(IDS_TTL_SEC_5).c_str(); -static CString listBoxStringSec10 = LocUtils::GetStringFromResources(IDS_TTL_SEC_10).c_str(); -static CString listBoxStringSec15 = LocUtils::GetStringFromResources(IDS_TTL_SEC_15).c_str(); -static CString listBoxStringSec30 = LocUtils::GetStringFromResources(IDS_TTL_SEC_30).c_str(); -static CString listBoxStringSec45 = LocUtils::GetStringFromResources(IDS_TTL_SEC_45).c_str(); -static CString listBoxStringSec60 = LocUtils::GetStringFromResources(IDS_TTL_SEC_60).c_str(); -static CString listBoxStringSec90 = LocUtils::GetStringFromResources(IDS_TTL_SEC_90).c_str(); -static CString listBoxStringMin2 = LocUtils::GetStringFromResources(IDS_TTL_MIN_2).c_str(); -static CString listBoxStringMin5 = LocUtils::GetStringFromResources(IDS_TTL_MIN_5).c_str(); -static CString listBoxStringMin10 = LocUtils::GetStringFromResources(IDS_TTL_MIN_10).c_str(); -static CString listBoxStringMin15 = LocUtils::GetStringFromResources(IDS_TTL_MIN_15).c_str(); -static CString listBoxStringMin30 = LocUtils::GetStringFromResources(IDS_TTL_MIN_30).c_str(); -static CString listBoxStringHour1 = LocUtils::GetStringFromResources(IDS_TTL_HOUR_1).c_str(); - -static const WCHAR* ttl_strings[] = { listBoxStringInfinite, listBoxStringSec1, listBoxStringSec2, listBoxStringSec5, - listBoxStringSec10, listBoxStringSec15, listBoxStringSec30, listBoxStringSec45, - listBoxStringSec60, listBoxStringSec90, listBoxStringMin2, listBoxStringMin5, - listBoxStringMin10, listBoxStringMin15, listBoxStringMin30, listBoxStringHour1 }; + BOOL CSettingsPropertyPage::OnInitDialog() { CCryptPropertyPage::OnInitDialog(); + //Moved, otherwise the array will be loaded before we determine the GUI language at program startup. + static CString listBoxStringInfinite = LocUtils::GetStringFromResources(IDS_TTL_INFINITE).c_str(); + static CString listBoxStringSec1 = LocUtils::GetStringFromResources(IDS_TTL_SEC_1).c_str(); + static CString listBoxStringSec2 = LocUtils::GetStringFromResources(IDS_TTL_SEC_2).c_str(); + static CString listBoxStringSec5 = LocUtils::GetStringFromResources(IDS_TTL_SEC_5).c_str(); + static CString listBoxStringSec10 = LocUtils::GetStringFromResources(IDS_TTL_SEC_10).c_str(); + static CString listBoxStringSec15 = LocUtils::GetStringFromResources(IDS_TTL_SEC_15).c_str(); + static CString listBoxStringSec30 = LocUtils::GetStringFromResources(IDS_TTL_SEC_30).c_str(); + static CString listBoxStringSec45 = LocUtils::GetStringFromResources(IDS_TTL_SEC_45).c_str(); + static CString listBoxStringSec60 = LocUtils::GetStringFromResources(IDS_TTL_SEC_60).c_str(); + static CString listBoxStringSec90 = LocUtils::GetStringFromResources(IDS_TTL_SEC_90).c_str(); + static CString listBoxStringMin2 = LocUtils::GetStringFromResources(IDS_TTL_MIN_2).c_str(); + static CString listBoxStringMin5 = LocUtils::GetStringFromResources(IDS_TTL_MIN_5).c_str(); + static CString listBoxStringMin10 = LocUtils::GetStringFromResources(IDS_TTL_MIN_10).c_str(); + static CString listBoxStringMin15 = LocUtils::GetStringFromResources(IDS_TTL_MIN_15).c_str(); + static CString listBoxStringMin30 = LocUtils::GetStringFromResources(IDS_TTL_MIN_30).c_str(); + static CString listBoxStringHour1 = LocUtils::GetStringFromResources(IDS_TTL_HOUR_1).c_str(); + + static const WCHAR* ttl_strings[] = { listBoxStringInfinite, listBoxStringSec1, listBoxStringSec2, listBoxStringSec5, + listBoxStringSec10, listBoxStringSec15, listBoxStringSec30, listBoxStringSec45, + listBoxStringSec60, listBoxStringSec90, listBoxStringMin2, listBoxStringMin5, + listBoxStringMin10, listBoxStringMin15, listBoxStringMin30, listBoxStringHour1 }; + auto bufferblocks_set_from_registry = [](CComboBox* pBox, int val) { int bufferblocks = val; From 26885db1c3f01d4af3a6ac7cbce26b5aad29a080 Mon Sep 17 00:00:00 2001 From: nbb1967 Date: Wed, 4 Mar 2026 12:15:46 +0300 Subject: [PATCH 28/35] Include cleanup from remove-unused-rc --- cppcryptfs/cppcryptfs.rc | Bin 69766 -> 69782 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/cppcryptfs/cppcryptfs.rc b/cppcryptfs/cppcryptfs.rc index e5ecd89f16b435fab24ca65e15c34222f943b77a..c5fa3134bcf4164602c54f5f368fb4e34fb24fa7 100644 GIT binary patch delta 67 zcmZo$$TDpq%Z3teR(%G22BnFG!jn6=*DwP)llOB;PCm!Z(Hz3FJ%opmj|n6=J&})b OGK?X+U4Wmlj1d5coe?1b delta 61 zcmbQXkfm)Q%Z3u}$p^SZCiif!0n!qa&#`kf$M9^A;bG)sn%q_?GP#b4Z~6p2#sVmZ LW4i)BV;Lg=vqThW From c22b8d7df21ec7f0e91971bab3aad9ced492e5d6 Mon Sep 17 00:00:00 2001 From: nbb1967 Date: Wed, 4 Mar 2026 17:10:01 +0300 Subject: [PATCH 29/35] text msgBox --- cppcryptfs/res/en/Resources_EN.rc | Bin 66838 -> 66858 bytes cppcryptfs/res/ru/Resources_RU.rc | Bin 71958 -> 71980 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/cppcryptfs/res/en/Resources_EN.rc b/cppcryptfs/res/en/Resources_EN.rc index 85a9941a281b39f5b18e190d7309e38c81b83ed1..87c13d0d38460f754b106858cd87d29a90e63bd6 100644 GIT binary patch delta 30 mcmbQ%#j>i4WrN9A{!E5Eh7yKUh9ZVEhD3(s&H7)T^8)~(>Iz-} delta 18 acmZ40#WJmnWrNAr$tf&Co1?y7;0FLqPzWRd diff --git a/cppcryptfs/res/ru/Resources_RU.rc b/cppcryptfs/res/ru/Resources_RU.rc index bf10b444aa9b0ee7622bf476144d4ac6fa00cf56..08d1d3d1f741dae3483bac4fe621d7110c4a8dcc 100644 GIT binary patch delta 21 dcmbQXiDk_umWC~i8l01pibS@naWa132LM{r2X+7e delta 17 ZcmZ3piDlX*mWC~i8l2nhI2qsZ0{}hg1`z-N From 4e1103b71009180768f70116732cc2cd1ee3cde6 Mon Sep 17 00:00:00 2001 From: nbb1967 Date: Wed, 4 Mar 2026 21:06:07 +0300 Subject: [PATCH 30/35] Apply button --- cppcryptfs/ui/MoreSettingsPropertyPage.cpp | 42 +++++++++++++++------- 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/cppcryptfs/ui/MoreSettingsPropertyPage.cpp b/cppcryptfs/ui/MoreSettingsPropertyPage.cpp index a95b5d1..48463aa 100644 --- a/cppcryptfs/ui/MoreSettingsPropertyPage.cpp +++ b/cppcryptfs/ui/MoreSettingsPropertyPage.cpp @@ -183,24 +183,42 @@ void CMoreSettingsPropertyPage::OnClickedNosparsefiles() SetControlChanged(IDC_FLUSH_AFTER_WRITE_NO_SPARSE_FILES); } -void CMoreSettingsPropertyPage::OnCbnSelchangeLanguage() { - // The user has selected something — the button becomes active - GetDlgItem(IDC_APPLY)->EnableWindow(TRUE); -} +void CMoreSettingsPropertyPage::OnCbnSelchangeLanguage() +{ + int nIdx = m_ctrlComboBox.GetCurSel(); + if (nIdx != CB_ERR) + { + WORD selectedLangID = (WORD)m_ctrlComboBox.GetItemData(nIdx); + WORD lastSavedID = theApp.LoadLanguageFromRegistry(); + if (lastSavedID == 0) lastSavedID = (WORD)GetThreadUILanguage(); + // The button is activated only if the selection in the list is different from that in the registry. + GetDlgItem(IDC_APPLY)->EnableWindow(selectedLangID != lastSavedID); + } +} -void CMoreSettingsPropertyPage::OnBnClickedApply() { +void CMoreSettingsPropertyPage::OnBnClickedApply() +{ int nIdx = m_ctrlComboBox.GetCurSel(); - if (nIdx != CB_ERR) { + if (nIdx != CB_ERR) + { WORD selectedLangID = (WORD)m_ctrlComboBox.GetItemData(nIdx); - if (selectedLangID != (WORD)GetThreadUILanguage()) { + + // Read what is currently stored in the registry (last save) + // If it is 0 (first launch), compare it with the current thread language + WORD lastSavedID = theApp.LoadLanguageFromRegistry(); + if (lastSavedID == 0) lastSavedID = (WORD)GetThreadUILanguage(); + + // Compare the new selection with the last saved selection in the registry + if (selectedLangID != lastSavedID) + { theApp.SaveLanguageToRegistry(selectedLangID); - AfxMessageBox(LocUtils::GetStringFromResources(IDS_APLLY_LANGUAGE_RESTART).c_str(), MB_OK | MB_ICONINFORMATION); - // Settings applied, button turns gray until next change - GetDlgItem(IDC_APPLY)->EnableWindow(FALSE); + // The message will always appear when the value in the registry changes + AfxMessageBox(LocUtils::GetStringFromResources(IDS_APLLY_LANGUAGE_RESTART).c_str(), MB_OK | MB_ICONINFORMATION); } + + // In any case, we turn off the button (since the selection in the list is synchronous with the registry) + if (GetDlgItem(IDC_APPLY)) GetDlgItem(IDC_APPLY)->EnableWindow(FALSE); } } - - From 1739458e7ccb97c2dc38a1a7f9f8e175af9a3dfc Mon Sep 17 00:00:00 2001 From: bailey27 Date: Tue, 17 Mar 2026 19:11:07 -0400 Subject: [PATCH 31/35] removed localized license files. changed resource loading (skip over BOM). harden GetStringForLang. --- cppcryptfs/res/lic/aessiv_en.txt | Bin 0 -> 2284 bytes cppcryptfs/res/lic/cppcryptfs_en.txt | Bin 0 -> 3388 bytes cppcryptfs/res/lic/dokany_lib_en.txt | Bin 0 -> 15434 bytes cppcryptfs/res/lic/dokany_mir_en.txt | Bin 0 -> 2898 bytes cppcryptfs/res/lic/getopt_en.txt | Bin 0 -> 3322 bytes cppcryptfs/res/lic/openssl_en.txt | Bin 0 -> 11356 bytes cppcryptfs/res/lic/rapidjson_en.txt | Bin 0 -> 10104 bytes cppcryptfs/res/lic/secure_edit_en.txt | Bin 0 -> 878 bytes 8 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 cppcryptfs/res/lic/aessiv_en.txt create mode 100644 cppcryptfs/res/lic/cppcryptfs_en.txt create mode 100644 cppcryptfs/res/lic/dokany_lib_en.txt create mode 100644 cppcryptfs/res/lic/dokany_mir_en.txt create mode 100644 cppcryptfs/res/lic/getopt_en.txt create mode 100644 cppcryptfs/res/lic/openssl_en.txt create mode 100644 cppcryptfs/res/lic/rapidjson_en.txt create mode 100644 cppcryptfs/res/lic/secure_edit_en.txt diff --git a/cppcryptfs/res/lic/aessiv_en.txt b/cppcryptfs/res/lic/aessiv_en.txt new file mode 100644 index 0000000000000000000000000000000000000000..f97934ec262b5f52af54af52299594f5bec7c99b GIT binary patch literal 2284 zcmai!-)|CY5QgX4#Q$OAl_qM{#2fEcN|lJ9fHvonR;;T~2vnQ?^Xl__!-kf_$q89@ zcYeI{&O7t%pWmxk$1=XhEY9O9s`$zKJYMm15e=4aSkB@p-eoM}D5m&-U^nZMi1T8b z#U`F`HSsI%$33hoe&^`q+GR0VwtcIM1 z+%H(B@bKPn7jsQT|EHj3gq|yG);z@PVad(v@;MY`=eN78sM$~@b+g`0JVGbCpU{Ok zb823r%bd4gT=RI0HG5o>{{%Mbc|~p&b#!CQy`jfd$ytyib319kx-4G1oTH`M+4nU* zF;(I&!&Wm{iZ~_n-#HbyGf@7ovNdFqbF@+wLvZCd=GWhLzt6&%tmtqJ&kHa_XlFLZ zCZ|i#+=^Dc!#j}HyE!WGlYG@!^DIlXAHt}I!c%JJE;#|Cdw4qB`v+=UzjJ`^Ls&i{ z=S4h==kb!KI!5sht5dN9w_HVzxW-i76tya1mU!m$@1(`|`cT*|V6frW&Ng?{Q!*=? z(kkcH?Dqbq_)@_m(Cyk?+)zi2&(OooZ#PX=8{)oVbtBvc&s=7Ty)=0limPKXaL{x?&}h!#cet)-&5H)%xY_WUHYptUIQIF1(EC zms4V&s??#1duaWATh5^a)&PWVd_HasrvrR^9iWmR=@c4T-l$=PZjc z$bFc!+Mi$@f^1)YuiTnc_!H0FZ3i_Ob@7Ok`?O2Yzfk$6rUolEj-`$|61{G^?k z`+U}VZ9hqVDf>GidA6x!XOjBEKIl99J+~jVb1Wt-AKNcv6D$)w&o!F&vbz1 zw(?&}?nww%+AoB9rJbGhCLZ0^;{ff%Iauf%J}Rv$$vw*Mf8ih+IGM}-R_qlXF-X8u z$>P#?x5^ZZY#Rt8cc*XgR7&HMtp6^ZsaSfg`|e-Rt>t+mUATJDH+g`yjU(lZe3W8` z--$Vf+&CiGFSWa^`R5y4r7%-5WP++i;yB)YdxvG<@1?Hx$Tl4ta@0bg%+)Yg3>%?^p=MNvjJK_CW7+9i+Xnj0 zSl;T;o#$ljH6PaCg6b>mt^75SryfUZp?Kk&=~QX1zyZ%lkrG|9*YzlJJ)G7j(IsdM zB;Txu=-2RtE!diRUSo1>yesDRjicZ+>W5CA$vb&oYLD}s@I{17)5tWHOvLmr)kDqm zEL}3Xi;0Z{HtEqogXTi(7x#hJ)VWL>PG^#guBB(@zVob15`U`H@Sdj{_W?ezcj9%_ z^l_q_B1gjXiv9+1?mnuosgTy4Y zgnIuz3eKaxu+OxDPrlrWS%w1M?OBt zBa?=i7&m5MNZp_F3g?I1Wjm>U@`QlNW);y15iflblQ^+*XgA%F3t=zCJ&}=hDkW@C zFEMGs5HaQ(JYPUp~7YuSo>F-OG9px-bL-NFD>rauIq8% z2GWuC$#O)vj|$7-4`e;9hO&QKV{XZI$L)b1|2JBX;J>bo`f_oSyW-{=ay9YndQV}23 z04tZy9Gs*&0X^NQ{ESz;R7r3H(@SHRcEuYyx2RJs= literal 0 HcmV?d00001 diff --git a/cppcryptfs/res/lic/dokany_lib_en.txt b/cppcryptfs/res/lic/dokany_lib_en.txt new file mode 100644 index 0000000000000000000000000000000000000000..0a98ec4d6492d52649a2b342b7b92d09143ef09f GIT binary patch literal 15434 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 QoeNxY7aSDN)yUiFKcUvvf&c&j literal 0 HcmV?d00001 diff --git a/cppcryptfs/res/lic/getopt_en.txt b/cppcryptfs/res/lic/getopt_en.txt new file mode 100644 index 0000000000000000000000000000000000000000..2afb3d4b2aea160c060f31e89591da0dd8538ac1 GIT binary patch literal 3322 zcmd6pTTfF_5QXR2#Q$)@6B@vYZ>HPLhR5=2CwCIJcQi?W=vUp)IVi3!P8xwcd_xEXj!^16$MW)XwageUtP|cQd^o z%W5I{xt^c(oJzW|hxS0)=lUD!eC4-CHh151>$_F>&(`=abT_e)N4|b@BFT|F5x;Om zWA}C&`K8dz^eLn_m7lS!#yaCMc^)eQnaq}G`|=kW+>lFAiG9tps?HY+IJlD6v9ddn zpB(X2vY}#3g!zkjg`IkZ{;ISd$?l~+w-x|A=wM?~p=do*&oXS(iN@d^;d^7v5=SVi-lGa;uY>?@@JO6=usY`XIO>_%N*oF`6VnXP>@Eiz;S(Q~xU5Z!52TaTr;ndNQ z|7_VK_sKuHqPqUK^N)&+#7T5dLeW40nv!Z}eKFsAPO(}tnDKzQ3O_jPpD zbqrW=PgczOz~jV@U>nDtg&){LH*gRqvS!}lBb}ok7Ved)fv4D1)xQmFpd)#>6oS|e ziMzB>=Dsh6^24vha2bhN2gRjFh&{qA=G`(EhS&&sM|N%7cC3_MX>HrIt{qrSTcIII z$oF(=+rCa4l5R-8ZijkeiB?^=dy;gdu_akovTezluHSLrHPsSJbX(Fucinn=YwMlp zD~ifDF<11REchl`!#*hrxJuW<4((k@oB9r9fxY9_U6+==S9av3F1?;m@V@2JKtP|h z9W{P-_319XfsU<|GQCfBP{OgLj|Ze*qZv|HyR6mqv5X9 zJNT$H5#R;(<=wY@YR#N;aQRc+`vrO2a4#Cunsw$TY83R9$+059sTvh9>|zA{x4%1 z4|GTEnVPy{L{w%nbt2kv%F|6WPJuM_LGELa9>{+~@p#5e;wMjf?RRIu7n4t?E?#m1`qXSw&6c)ndQK8pnJH51A2*5On;h+v|ZR6ktelG`KGxKuC7b* oba!LIMw&1pum@`D2X-eoU^|#ho@0tZb#pu9E@Ok-?Cv%D1u2CW3IG5A literal 0 HcmV?d00001 diff --git a/cppcryptfs/res/lic/openssl_en.txt b/cppcryptfs/res/lic/openssl_en.txt new file mode 100644 index 0000000000000000000000000000000000000000..189d7f8283818edec34e7498d093ea30dee00bf1 GIT binary patch literal 11356 zcmeI2TW=f38HVS&K>q{b8!JE~H)&F|=}l>xwpGZIN>Xuyq8F4z*|ezxNU5s+eA4%s zm!D^Mxm0v;0Rt5XlFQwh?|dHq^7DB*OCQoC9j1%aNtbD!X6XlAy-QQwd9OPMX;V+n z(n)%z&vUIkO$)tdE5Co6exsG=dL0VRwZ1RXu~q_ik;Z~K$*>o?Kh}Gybz{MqX>CWJ zQ$hZyHAl-|2ZA!rkbu0q#63*Iw5=7;bgrFq?RzImp?@q0vHNgIDLC1`owiah_0x{_ z_qBFQ-@~-8>tTM*nvvj4^sI^NLb%RE;m0hMj<|t?>m_gCoQMwacXWN0r8diu;Hpsa zJ3XIDo)f(fv?_Em&}1 zxfcrAj|Qz1_%8I-rLdW)8VU|n9q4nW)mOSc);H1!3dZ8>LNYP-x>-DGfb^12_KL6^h)$X3CEncvx-JR4GH^{137rK~> z)`i~l^lyD0RVW_h-_vXv>^Ts>p~a#T`~Yd83#YbYYy^L+kMFLL~F5~D?PK# zSiYY z)^4$Z=|r$DmfrV`WYtMGNhxf-DHm`+72F{|Xo3?w&~hwxhEJiH_ULe`r;a+4EKT;I zG5dfa<8ABta&!rNZ4yEH3&~}csY3$urImbpD+!pRb{l9)z*;+!RPf)Tsd0`iU!EMo z?n8b=%0p3)luolg!(PK1$T&n2M@q-olWdnYsUZTi`{Fc~tuGsQSudDppT+$QO3BTv!{+aT@ zlblt)%Q_w{^C;O6$-w24m5fuz`b2A@wpd+T=a02TcaAyEkHIk#b7sZv@q)Riz=Lfg z)(Wwl_#DyMeomgG#<2aP2cR8i37_cdCW{K6h-?8KtQNbx%Gb^a>1)ru4s%t7LQ_Huh zb9BslBp3VJ*0`2}e^yrQe46i6ZSbMm!FtGDxAQ_v@{hO5NrsF4BPXH`^#eBJ8i5$$ zm|%I_oTdLCqt<<57EviG-BEg-`xR>UUHRZBy;X%e_|(UA(w=_prXRKHh3>wPcAlr7 z^vTY?zME0i>;I-_J*@#(SFqg`VclKzNkHKnIQ{gGjDv28{)uP1!pV*|dO~;QyQXZA zcaHMiVXn5e1gWQW``XL(t9;um-|sS@Ik%o(qfR3E$iKSK-WB zgdGR}0KW1tTd{4UFL*->mbR^ep8vV;Wy)L@wYqE*{j zU|IOT00kjwI$c;)P`uQs6F-R^uqr z2+srq@uMqyAfiHtrOe%cZ10DvdQ>S^M&zkmcbRYy*{MWtTZfm4+L>xv=3?i0_n|PX z*67V@&h>d;`)NsdzdMdZjUPeR5k!r ztE-}$H~nbx=c| zjb7}7sPbGcpj+Q%bzLg)^rp!Y{FNC897pF>?Vi_h9d-n@o)EQ7KsfEdqD*IVMom{w z2ZhF&eKWn|ti<^1Q`h&xGh6oif&24B%$^`ODZ~2cXOR)qwZ*%qdV;=U9%5TxNK=Q> zukT;$yA8he>Jt&*7h4Ni*&bsC7IxssU~4mtmVQj&w?1{gkx$#ArMaYc2Ce*4LjjBU$j#%*n(> zXbG?6Ixv@b8r?k4eDV?}GoFUUNu7BL3AyGVPy6f(N-rh7m|0nqH~HO$xH^^mSc$eR zgE|dVyw*tdETZn8>_t}0Ih_ql^dAWFde04uji_y!$v}^%Fx4z%3#rQ`qH}e&i6^d} z!mzR#SE_!Gk71SeRP5pLT0@aMPH~Fc(+;#{x;{@JNAgyp?p2Q2mm5uFr{FQ(R}->_4Sy1ed4b zZ!;bE(^byg3&lSEO%rGErBbD*b;C{KbO1HDD(6&4v&kP^uAU}7%%;gI^>fb8KNa{Kb8}`;OuLws>}ulX z$V|GXsTRPaOSOrk0PB@HjPj zoP;w?#y%b=;a}<`JgN(Fy#I&je=|k5w!WXM&QW5T7kT+yb-_Wd8{#CN>^RQ(cB=dQ zM~b?nvz+3@e;lGOE&s5n=4W?CrF$t|kt?2XSD}f2L+lu z(S`PaNq05P5M6~(y}&K?m1lTV7JgR!-_&|JHYNX0!7tT7)LC$iyk036?(2K6B4JL( Ls@mI3|4RP_x7BHh literal 0 HcmV?d00001 diff --git a/cppcryptfs/res/lic/rapidjson_en.txt b/cppcryptfs/res/lic/rapidjson_en.txt new file mode 100644 index 0000000000000000000000000000000000000000..0e3b8e5d8360275270fe1579d1a7f167305b21d8 GIT binary patch literal 10104 zcmeI2TT@$A7>3uiGyaDRH&#cX*3lXDD&h<*{}n|E{P)>qO7?Md?iY;RlUD zzV}ns4zpBat%Wb^*m)tUE!|ya9Y&(gS}bv>UpPXQ6(g;gWGuQi*q>g^udiJe; zJEDfCF0xLa>&b3jh2%wl`*f^#XOh&bY`x7a4R&~~tFh#1>C={MC;Bb+#;X(Yz;+X9 zfdz}~8}eaGl(7@uMNe#apeI-236AV8`osqgCgA$*LPI=YY^zXx(d>dmwvY3z-HMce1!wasm8BHQ~~smTlTIK97} z@Z4egJ>!)eg7idV@fLO->d8U+LOuowj=R7$*$Bj62%pXf=el;3@97u(UFpqLrn9eq zK_Pf{{O?urqO-z*_#Np3+D&;j(;yvhPsP(w^IBZU6V7U#h%T0bzXq}mG(IUkS)tT;)(2t zboIz!74?A#Bp*k9V=vhyBIRM8yj?j$7v41GSUfSv9LYf=$>L1!oNh}x^I}6hv#%Yc z($uxGCnK}nfW9(xVy{%Q(v|-BedlO09mI?Y*S^U=lx5 zzlo2?VBysU1=8h zLSk27uAqe_jkBi8e?G1K)Kb3P>F$=gh-&@j?nr#DGy9c{nPY~@|vm83K^57OTE8dUmTVOr7Tp|q#Qv+-fmkzJqroSZATAbq>jKIinhRZ7IsCt_Xa>I?a>L;*G>PmZSDQp8#5x}t|MKCwrM9x|0FTY`C7IaUJ2 zP4+MX=+KeQm?DpYsQXyJ8Z{#T?^Z2fpB?C#Yg5Sef3-uPKIEjM-Iw%OiL73&?v8~e zt#GCA9=}9HJZEF-h%=2jkpYn6O8-W7p|>a*=Umb{Pn1f<9JZl~Ky~S+ zHT4{?lzn??RZskUTX)^`Qg!eiE$5kcp!XZvv7@(L zU9)0AYxsr!LS+X#p}d-YPH-xVF~J0yehviM?8Bx-uLtT*5Z`H+mYeQC;0==%vsSe^PE-CyT* z#)I*NU4D|4OvyW2qTJT5cE%+LdXnY%=csTD;2Cto-nOg#-`8`xD!ez)HJECNcUPYk zJr4vUYcEIAvab5+d%fvo-+B#L+R^jXtR*^N8!TguErn6!-F^CUA@vf&;iDl#lu{Q+Q6#Mt0E#D6>uXyt##m_ARS3x<@oV>M=gjfxuAW6 z4D3a204a{gdfXJfojF+5rVBif1Ro+Kk?RmH^C$9048j5LwuJ{WDRN+KTQVp+&XKB~KMKmoF?Dp8Oiq{cp=X6M zQ_Y(e;tX{$S0B34`%MPVv@)p2-fHLHQ>F3=>A65s84Xk4orlcTJzrL7W8!2 zx^p)`k3nxR64mJCW2%^UsyVMaiOGo*7UvCPdC2+zUY&-Q#3G>@eGPF{gNLtM)kt1;}bB;5N8jbwLH!yu9*(b8OwXAm5;KhHbKnCkr{?=o=2KA;HuxWbaZ#RP} zx*js0g)Kcv82`l%)kyUTy{B8GCIW4B&kt36SzDe!zu7mF8{NSx9tEvN{a6;_+_+5q zcl**6BJ`j2bd$8k?SW*7^Xql-VRPeSdj zclo9Jh|c6kt*66e?|tS5*0H1B3o_G~-(B-T>7DCRF_H8|*LC{tX#oBoVh-?(g|u5) zpS9f4FzuB7baATdeJ29?K-=DPTIsX5)eq4zt;;ib1^;wpb^0nazt3cV#XYTHgV_$< zyh^t=uOn>kFF^y{6}_Z8-S9?J=UMv6S+3C|BH?V0h=sfA{dpJYw8u>aR7IytM_QF7 zP+bsoJ4Q?;VyJYPbkSA2V0Gpr_pVsqoMY!K<$8xWze{O81uy5q+o~i!xvXYBXT`@J z<*`SJ&dO)+k3EXJ*~cD*|IZS$Npx Pz+68cdx-hn$zu8o(R^w8 literal 0 HcmV?d00001 diff --git a/cppcryptfs/res/lic/secure_edit_en.txt b/cppcryptfs/res/lic/secure_edit_en.txt new file mode 100644 index 0000000000000000000000000000000000000000..914b704e3777029100ba0d20d1c432a06a906fbd GIT binary patch literal 878 zcmZvb-Acni5QXPj@Ez6*p#@v~xf2ngDtO_I`T{Xcn_!Y^5|zHZ`kmRvXepulH)qc| zvornvO6`>|wZ_)Woh_`jVDF5HEiJQic9pGcZUwP|lQ}1e)jk)@Dba?z8WR{ILXnQM zKzx_N2&|MI!Kdgo%r~ym*>rPf(Aka3Z47qb_WrSiUmj_%P+!AdkWG%GfwSZ+MYYC9 z%u`G!cFcDOZsDG?Esxvm%CbSF1b1(@He*iNDZAFa&31Sgff<85b+t2A*PtpK)%;%A zKj2CJa=7H{4nKiRR=icLkDPVH3xCH!Gk^{D>B!Qn^bA+5qFy=PQUwFI6R*yiwdy-4 zR3MdG0gsRs+JRNVN*t~G&Cto&M_#$_85&lRJHE3zBXUiNJh^gBrmY=#e#*bU8-0Da zj(ke_jl46^J&Srr9j8o%QDtMlsRK)|M|7$;lKQ}&Z2YRr<#|ag<~O|J5oeiAI8VT+ hx?Abk2Cm`~&uVn;8HA literal 0 HcmV?d00001 From 49d4aaa79c20674f29168114c7604fc2f68b3def Mon Sep 17 00:00:00 2001 From: bailey27 Date: Tue, 17 Mar 2026 19:14:08 -0400 Subject: [PATCH 32/35] removed localized license files. changed resource loading (skip over BOM). harden GetStringForLang. --- cppcryptfs/cppcryptfs.cpp | 31 ++++++++++++++++++----- cppcryptfs/cppcryptfs.h | 4 +-- cppcryptfs/res/cppcryptfs.rc2 | Bin 804 -> 4620 bytes cppcryptfs/res/en/Resources_EN.rc | Bin 66858 -> 63144 bytes cppcryptfs/res/en/lic/aessiv_en.txt | Bin 2284 -> 0 bytes cppcryptfs/res/en/lic/cppcryptfs_en.txt | Bin 3388 -> 0 bytes cppcryptfs/res/en/lic/dokany_lib_en.txt | Bin 15434 -> 0 bytes cppcryptfs/res/en/lic/dokany_mir_en.txt | Bin 2898 -> 0 bytes cppcryptfs/res/en/lic/getopt_en.txt | Bin 3322 -> 0 bytes cppcryptfs/res/en/lic/openssl_en.txt | Bin 11356 -> 0 bytes cppcryptfs/res/en/lic/rapidjson_en.txt | Bin 10104 -> 0 bytes cppcryptfs/res/en/lic/secure_edit_en.txt | Bin 878 -> 0 bytes cppcryptfs/res/ru/Resources_RU.rc | Bin 71980 -> 67990 bytes cppcryptfs/res/ru/lic/aessiv_ru.txt | Bin 2834 -> 0 bytes cppcryptfs/res/ru/lic/cppcryptfs_ru.txt | Bin 4094 -> 0 bytes cppcryptfs/res/ru/lic/dokany_lib_ru.txt | Bin 17216 -> 0 bytes cppcryptfs/res/ru/lic/dokany_mir_ru.txt | Bin 3502 -> 0 bytes cppcryptfs/res/ru/lic/getopt_ru.txt | Bin 3896 -> 0 bytes cppcryptfs/res/ru/lic/openssl_ru.txt | Bin 13274 -> 0 bytes cppcryptfs/res/ru/lic/rapidjson_ru.txt | Bin 12014 -> 0 bytes cppcryptfs/res/ru/lic/secure_edit_ru.txt | Bin 996 -> 0 bytes cppcryptfs/ui/CryptAboutPropertyPage.cpp | 16 ++++++++---- 22 files changed, 37 insertions(+), 14 deletions(-) delete mode 100644 cppcryptfs/res/en/lic/aessiv_en.txt delete mode 100644 cppcryptfs/res/en/lic/cppcryptfs_en.txt delete mode 100644 cppcryptfs/res/en/lic/dokany_lib_en.txt delete mode 100644 cppcryptfs/res/en/lic/dokany_mir_en.txt delete mode 100644 cppcryptfs/res/en/lic/getopt_en.txt delete mode 100644 cppcryptfs/res/en/lic/openssl_en.txt delete mode 100644 cppcryptfs/res/en/lic/rapidjson_en.txt delete mode 100644 cppcryptfs/res/en/lic/secure_edit_en.txt delete mode 100644 cppcryptfs/res/ru/lic/aessiv_ru.txt delete mode 100644 cppcryptfs/res/ru/lic/cppcryptfs_ru.txt delete mode 100644 cppcryptfs/res/ru/lic/dokany_lib_ru.txt delete mode 100644 cppcryptfs/res/ru/lic/dokany_mir_ru.txt delete mode 100644 cppcryptfs/res/ru/lic/getopt_ru.txt delete mode 100644 cppcryptfs/res/ru/lic/openssl_ru.txt delete mode 100644 cppcryptfs/res/ru/lic/rapidjson_ru.txt delete mode 100644 cppcryptfs/res/ru/lic/secure_edit_ru.txt diff --git a/cppcryptfs/cppcryptfs.cpp b/cppcryptfs/cppcryptfs.cpp index f93600a..bfbad0a 100755 --- a/cppcryptfs/cppcryptfs.cpp +++ b/cppcryptfs/cppcryptfs.cpp @@ -109,7 +109,7 @@ BOOL CALLBACK EnumLangsCallback(HMODULE hModule, LPCTSTR lpType, LPCTSTR lpName, // Scan EXE resources for translated sections void CcppcryptfsApp::ScanResourcesForLanguages() { m_vAvailableLangs.clear(); - // (IDS_LANGUAGE_NAME >> 4) + 1 — formula for calculating the block number in String Table + // (IDS_LANGUAGE_NAME >> 4) + 1 - formula for calculating the block number in String Table EnumResourceLanguages(NULL, RT_STRING, MAKEINTRESOURCE((IDS_LANGUAGE_NAME >> 4) + 1), EnumLangsCallback, (LONG_PTR)&m_vAvailableLangs); } @@ -118,15 +118,32 @@ void CcppcryptfsApp::ScanResourcesForLanguages() { CString CcppcryptfsApp::GetStringForLang(HMODULE hInst, UINT nID, WORD wLang) { HRSRC hRes = FindResourceEx(hInst, RT_STRING, MAKEINTRESOURCE((nID >> 4) + 1), wLang); if (!hRes) return _T(""); + HGLOBAL hGlobal = LoadResource(hInst, hRes); + DWORD resourceSize = SizeofResource(hInst, hRes); + LPWSTR pData = (LPWSTR)LockResource(hGlobal); - if (!pData) return _T(""); + LPWSTR pResourceEnd = (LPWSTR)((LPBYTE)pData + resourceSize); - int nIndex = nID & 0x000F; // Remainder from division by 16 (index inside the block) + if (!pData || resourceSize < sizeof(WCHAR)) return _T(""); + + int nIndex = nID & 0x000F; for (int i = 0; i < nIndex; i++) { - pData += *pData + 1; // Skip previous strings of the block + if (pData >= pResourceEnd) return _T(""); // Out of bounds + + DWORD stringLen = *pData; + if (stringLen > 0xFFFF) return _T(""); // Unreasonable length + if ((LPBYTE)pData + (stringLen + 1) * sizeof(WCHAR) > (LPBYTE)pResourceEnd) + return _T(""); // Exceeds boundary + + pData += stringLen + 1; } - return CString(pData + 1, (int)*pData); + + if (pData >= pResourceEnd) return _T(""); + DWORD finalLen = *pData; + if (finalLen == 0) return _T(""); + + return CString(pData + 1, (int)min(finalLen, MAXINT)); } // Check: does this language exist in the resources (protection against outdated registry entries) @@ -142,7 +159,7 @@ void CcppcryptfsApp::SaveLanguageToRegistry(WORD wLangID) { WriteProfileInt(_T("Settings"), _T("LanguageID"), (int)wLangID); } -// Reading the selection from the registry (0 — if the entry does not exist) +// Reading the selection from the registry (0 - if the entry does not exist) WORD CcppcryptfsApp::LoadLanguageFromRegistry() { return (WORD)GetProfileInt(_T("Settings"), _T("LanguageID"), 0); } @@ -301,7 +318,7 @@ BOOL CcppcryptfsApp::InitInstance() ScanResourcesForLanguages(); WORD wSavedID = LoadLanguageFromRegistry(); - // Apply the language only if it is found in the EXE (protection against “junk” in the registry) + // Apply the language only if it is found in the EXE (protection against "junk" in the registry) if (wSavedID != 0 && IsLanguageAvailable(wSavedID)) { SetThreadUILanguage(wSavedID); SetThreadLocale(MAKELCID(wSavedID, SORT_DEFAULT)); diff --git a/cppcryptfs/cppcryptfs.h b/cppcryptfs/cppcryptfs.h index 6fd9c87..87dcd3c 100755 --- a/cppcryptfs/cppcryptfs.h +++ b/cppcryptfs/cppcryptfs.h @@ -78,7 +78,7 @@ struct LanguageOption { class CcppcryptfsApp : public CWinApp { public: - // List of all languages ​​found in EXE resources + // List of all languages found in EXE resources std::vector m_vAvailableLangs; // Localization management methods @@ -117,4 +117,4 @@ class CcppcryptfsApp : public CWinApp DECLARE_MESSAGE_MAP() }; -extern CcppcryptfsApp theApp; \ No newline at end of file +extern CcppcryptfsApp theApp; diff --git a/cppcryptfs/res/cppcryptfs.rc2 b/cppcryptfs/res/cppcryptfs.rc2 index 8e4a4fe7dff2039d7ae6751b584019c00e79de63..c32aeccdc00ea2a041ec14cb4ff3abcfd2dbc376 100755 GIT binary patch literal 4620 zcmeH~Yi|-k6o${&n)n|!7!!?_mKtx-7?-8eN^e=Prb!b*DHJSFLebhkuRiY#TcFSe zR7^jZ$?jbD%(=YhvOj;U*oxh^d%RaHu&Q-wRqNR$ec$SKZfT1xvNd*>d3si3?aaP1 zs=9Gt+tzg7oVlGk-vzeM+Bv5x)?yaf6Ix)$e5vmP>oC%}8f#5AQZMRNW-abdxKgj@ z0sD1M*LVjO+MX4yWS=Z&o3?9Z-aFj7YXw_p&3{pYVvn18e9^at<0;_#CO6br6OWU; zRP1Q5e*_=1%a`2QaWaWZX>}G(6B%{>ZZ>f!&ZPNcT3~H#+Zk9`_8Qt!Hl2=?23nVm z)2<~_%Z{F*(b^FXX!sdH+;3(v60}5K(qeZM8 z(3k83UoF9tZz(V~iF1$d2()yOrUy1oK#VZ@2uhFX*KE}?_5wf9Xw9CpmPHF5P0~Qt zq3r^_q?v`FNa&BRXbEjG@}E0BeB*u0$&{0IcIhPVI%qG_wxD>urO-$h+MTNt^4#f? zRh?uRdrf;akW8}xt;t%!1g$+M;}`bisiSfZbtXA|q>#OTSI*e^j%@xBNp_KV)P^yd z@1oh`tKC^GD7%$FigXuZM@hQ{r8ZCB+2koJ6?aNnRGjNLBve61n_GqaOY^7X?LJ1d z*bP8jlM{>7OAcKW;CzR>%0%ByFg2=~9DJM(cocdiR}u$>}y4ib?bgoDu%t*TdR!lpp+i?D!)i&#*I~)B~d&%h` zeet{DwF8@v$yKJ#hph;SK+yIKK5Vh^J~3GoQufuF@2dw zxxO@}_Y62)wTIZZj;3o4GezE2SD^?&>!8e681i2Eu_}TVJKN-ih`!3K0y-46Znlz- zltS;SJ>#UjOrF)@Ic2W6t~#gzwRzE%hszRPtz1>+y$iK*IZvS8=SEd!W!|c3l$&PZ zH-pdloRz^# zT_zRL-L2Q|K8Mm>!lgVYLboBv53g3Wt4CEp3?3ADBe0?BM=@bqr6;V6(z=eFY4a3l zPTL_Z>3#iji2dc&+L=~0mO-Jay*@dsKfuUs{N7Z%ErMS~3vs8&)2s#fnAi3B3*n}E{{R30 delta 11 ScmeBCS;DrVjcM{D?s)(k4+OCQ diff --git a/cppcryptfs/res/en/Resources_EN.rc b/cppcryptfs/res/en/Resources_EN.rc index 87c13d0d38460f754b106858cd87d29a90e63bd6..1ab367e645e7270738c12374304bef219d1fb05c 100644 GIT binary patch delta 64 zcmZ40#j@fp^M*1;`3#0s1_g#724^6d#*oR71LPM2*`+`dC^PvfqwZ!Are~#-8%j59 OR;cSy+MKrXNHhRIs}wr` delta 2405 zcmdT`OHUI~82u)gm_i69&=A6AC^6C~rG*$IKCrg6R465F6^SI1+EyrirWAw~D;F3w zF*k06=++n)kg{=U;?{*r6E`L%xN+ql@O=07F|C!Pab+em(|hlC?>XP=OyB(Mc>DO& z!KSuYq!{IBoiccrC`me=tCe?>wlLDMmZCW3*e;1%m+u00@NV9fp>51Qz&KA?KI8eP zer-g&&_*?T`Ga=6A^Lv2>k5;HyyT`Rxy9>W*4{7~G)Do<`e>dacpBo{rnN`M31(aO z?m3I%uuRKB+qOmw$;JU}W@w{s>Xdf?=eIbOLbOo9hyan#S635Cx`qNj3KfqzHtpht z;pGB6^U^K&6@qsy@$z*%j${FGPS6^nn@6nM#qnml9O(#>5}4+l3sOGTWHL(PxHusk&pI1XCk-UI zxwR~{u-dR%ZKHbQDMrKbi?EB*jAZEspDB#z5Ew3e7O@0fz)Vb9vDhieV*!jKFY`;Gmk47kC)2)^v44vBKeeL?uQh1o3Tbu?7MOt=nuPn)XA-|WAViIeeB(*~-nE^h`tZXwu5$;`h| z!U{OO2!=I9h}H33sKu%xOv>7u1#%X)e(YiXSv^`q+GR0VwtcIM1 z+%H(B@bKPn7jsQT|EHj3gq|yG);z@PVad(v@;MY`=eN78sM$~@b+g`0JVGbCpU{Ok zb823r%bd4gT=RI0HG5o>{{%Mbc|~p&b#!CQy`jfd$ytyib319kx-4G1oTH`M+4nU* zF;(I&!&Wm{iZ~_n-#HbyGf@7ovNdFqbF@+wLvZCd=GWhLzt6&%tmtqJ&kHa_XlFLZ zCZ|i#+=^Dc!#j}HyE!WGlYG@!^DIlXAHt}I!c%JJE;#|Cdw4qB`v+=UzjJ`^Ls&i{ z=S4h==kb!KI!5sht5dN9w_HVzxW-i76tya1mU!m$@1(`|`cT*|V6frW&Ng?{Q!*=? z(kkcH?Dqbq_)@_m(Cyk?+)zi2&(OooZ#PX=8{)oVbtBvc&s=7Ty)=0limPKXaL{x?&}h!#cet)-&5H)%xY_WUHYptUIQIF1(EC zms4V&s??#1duaWATh5^a)&PWVd_HasrvrR^9iWmR=@c4T-l$=PZjc z$bFc!+Mi$@f^1)YuiTnc_!H0FZ3i_Ob@7Ok`?O2Yzfk$6rUolEj-`$|61{G^?k z`+U}VZ9hqVDf>GidA6x!XOjBEKIl99J+~jVb1Wt-AKNcv6D$)w&o!F&vbz1 zw(?&}?nww%+AoB9rJbGhCLZ0^;{ff%Iauf%J}Rv$$vw*Mf8ih+IGM}-R_qlXF-X8u z$>P#?x5^ZZY#Rt8cc*XgR7&HMtp6^ZsaSfg`|e-Rt>t+mUATJDH+g`yjU(lZe3W8` z--$Vf+&CiGFSWa^`R5y4r7%-5WP++i;yB)YdxvG<@1?Hx$Tl4ta@0bg%+)Yg3>%?^p=MNvjJK_CW7+9i+Xnj0 zSl;T;o#$ljH6PaCg6b>mt^75SryfUZp?Kk&=~QX1zyZ%lkrG|9*YzlJJ)G7j(IsdM zB;Txu=-2RtE!diRUSo1>yesDRjicZ+>W5CA$vb&oYLD}s@I{17)5tWHOvLmr)kDqm zEL}3Xi;0Z{HtEqogXTi(7x#hJ)VWL>PG^#guBB(@zVob15`U`H@Sdj{_W?ezcj9%_ z^l_q_B1gjXiv9+1?mnuosgTy4Y zgnIuz3eKaxu+OxDPrlrWS%w1M?OBt zBa?=i7&m5MNZp_F3g?I1Wjm>U@`QlNW);y15iflblQ^+*XgA%F3t=zCJ&}=hDkW@C zFEMGs5HaQ(JYPUp~7YuSo>F-OG9px-bL-NFD>rauIq8% z2GWuC$#O)vj|$7-4`e;9hO&QKV{XZI$L)b1|2JBX;J>bo`f_oSyW-{=ay9YndQV}23 z04tZy9Gs*&0X^NQ{ESz;R7r3H(@SHRcEuYyx2RJs= diff --git a/cppcryptfs/res/en/lic/dokany_lib_en.txt b/cppcryptfs/res/en/lic/dokany_lib_en.txt deleted file mode 100644 index 0a98ec4d6492d52649a2b342b7b92d09143ef09f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15434 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 QoeNxY7aSDN)yUiFKcUvvf&c&j diff --git a/cppcryptfs/res/en/lic/getopt_en.txt b/cppcryptfs/res/en/lic/getopt_en.txt deleted file mode 100644 index 2afb3d4b2aea160c060f31e89591da0dd8538ac1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3322 zcmd6pTTfF_5QXR2#Q$)@6B@vYZ>HPLhR5=2CwCIJcQi?W=vUp)IVi3!P8xwcd_xEXj!^16$MW)XwageUtP|cQd^o z%W5I{xt^c(oJzW|hxS0)=lUD!eC4-CHh151>$_F>&(`=abT_e)N4|b@BFT|F5x;Om zWA}C&`K8dz^eLn_m7lS!#yaCMc^)eQnaq}G`|=kW+>lFAiG9tps?HY+IJlD6v9ddn zpB(X2vY}#3g!zkjg`IkZ{;ISd$?l~+w-x|A=wM?~p=do*&oXS(iN@d^;d^7v5=SVi-lGa;uY>?@@JO6=usY`XIO>_%N*oF`6VnXP>@Eiz;S(Q~xU5Z!52TaTr;ndNQ z|7_VK_sKuHqPqUK^N)&+#7T5dLeW40nv!Z}eKFsAPO(}tnDKzQ3O_jPpD zbqrW=PgczOz~jV@U>nDtg&){LH*gRqvS!}lBb}ok7Ved)fv4D1)xQmFpd)#>6oS|e ziMzB>=Dsh6^24vha2bhN2gRjFh&{qA=G`(EhS&&sM|N%7cC3_MX>HrIt{qrSTcIII z$oF(=+rCa4l5R-8ZijkeiB?^=dy;gdu_akovTezluHSLrHPsSJbX(Fucinn=YwMlp zD~ifDF<11REchl`!#*hrxJuW<4((k@oB9r9fxY9_U6+==S9av3F1?;m@V@2JKtP|h z9W{P-_319XfsU<|GQCfBP{OgLj|Ze*qZv|HyR6mqv5X9 zJNT$H5#R;(<=wY@YR#N;aQRc+`vrO2a4#Cunsw$TY83R9$+059sTvh9>|zA{x4%1 z4|GTEnVPy{L{w%nbt2kv%F|6WPJuM_LGELa9>{+~@p#5e;wMjf?RRIu7n4t?E?#m1`qXSw&6c)ndQK8pnJH51A2*5On;h+v|ZR6ktelG`KGxKuC7b* oba!LIMw&1pum@`D2X-eoU^|#ho@0tZb#pu9E@Ok-?Cv%D1u2CW3IG5A diff --git a/cppcryptfs/res/en/lic/openssl_en.txt b/cppcryptfs/res/en/lic/openssl_en.txt deleted file mode 100644 index 189d7f8283818edec34e7498d093ea30dee00bf1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11356 zcmeI2TW=f38HVS&K>q{b8!JE~H)&F|=}l>xwpGZIN>Xuyq8F4z*|ezxNU5s+eA4%s zm!D^Mxm0v;0Rt5XlFQwh?|dHq^7DB*OCQoC9j1%aNtbD!X6XlAy-QQwd9OPMX;V+n z(n)%z&vUIkO$)tdE5Co6exsG=dL0VRwZ1RXu~q_ik;Z~K$*>o?Kh}Gybz{MqX>CWJ zQ$hZyHAl-|2ZA!rkbu0q#63*Iw5=7;bgrFq?RzImp?@q0vHNgIDLC1`owiah_0x{_ z_qBFQ-@~-8>tTM*nvvj4^sI^NLb%RE;m0hMj<|t?>m_gCoQMwacXWN0r8diu;Hpsa zJ3XIDo)f(fv?_Em&}1 zxfcrAj|Qz1_%8I-rLdW)8VU|n9q4nW)mOSc);H1!3dZ8>LNYP-x>-DGfb^12_KL6^h)$X3CEncvx-JR4GH^{137rK~> z)`i~l^lyD0RVW_h-_vXv>^Ts>p~a#T`~Yd83#YbYYy^L+kMFLL~F5~D?PK# zSiYY z)^4$Z=|r$DmfrV`WYtMGNhxf-DHm`+72F{|Xo3?w&~hwxhEJiH_ULe`r;a+4EKT;I zG5dfa<8ABta&!rNZ4yEH3&~}csY3$urImbpD+!pRb{l9)z*;+!RPf)Tsd0`iU!EMo z?n8b=%0p3)luolg!(PK1$T&n2M@q-olWdnYsUZTi`{Fc~tuGsQSudDppT+$QO3BTv!{+aT@ zlblt)%Q_w{^C;O6$-w24m5fuz`b2A@wpd+T=a02TcaAyEkHIk#b7sZv@q)Riz=Lfg z)(Wwl_#DyMeomgG#<2aP2cR8i37_cdCW{K6h-?8KtQNbx%Gb^a>1)ru4s%t7LQ_Huh zb9BslBp3VJ*0`2}e^yrQe46i6ZSbMm!FtGDxAQ_v@{hO5NrsF4BPXH`^#eBJ8i5$$ zm|%I_oTdLCqt<<57EviG-BEg-`xR>UUHRZBy;X%e_|(UA(w=_prXRKHh3>wPcAlr7 z^vTY?zME0i>;I-_J*@#(SFqg`VclKzNkHKnIQ{gGjDv28{)uP1!pV*|dO~;QyQXZA zcaHMiVXn5e1gWQW``XL(t9;um-|sS@Ik%o(qfR3E$iKSK-WB zgdGR}0KW1tTd{4UFL*->mbR^ep8vV;Wy)L@wYqE*{j zU|IOT00kjwI$c;)P`uQs6F-R^uqr z2+srq@uMqyAfiHtrOe%cZ10DvdQ>S^M&zkmcbRYy*{MWtTZfm4+L>xv=3?i0_n|PX z*67V@&h>d;`)NsdzdMdZjUPeR5k!r ztE-}$H~nbx=c| zjb7}7sPbGcpj+Q%bzLg)^rp!Y{FNC897pF>?Vi_h9d-n@o)EQ7KsfEdqD*IVMom{w z2ZhF&eKWn|ti<^1Q`h&xGh6oif&24B%$^`ODZ~2cXOR)qwZ*%qdV;=U9%5TxNK=Q> zukT;$yA8he>Jt&*7h4Ni*&bsC7IxssU~4mtmVQj&w?1{gkx$#ArMaYc2Ce*4LjjBU$j#%*n(> zXbG?6Ixv@b8r?k4eDV?}GoFUUNu7BL3AyGVPy6f(N-rh7m|0nqH~HO$xH^^mSc$eR zgE|dVyw*tdETZn8>_t}0Ih_ql^dAWFde04uji_y!$v}^%Fx4z%3#rQ`qH}e&i6^d} z!mzR#SE_!Gk71SeRP5pLT0@aMPH~Fc(+;#{x;{@JNAgyp?p2Q2mm5uFr{FQ(R}->_4Sy1ed4b zZ!;bE(^byg3&lSEO%rGErBbD*b;C{KbO1HDD(6&4v&kP^uAU}7%%;gI^>fb8KNa{Kb8}`;OuLws>}ulX z$V|GXsTRPaOSOrk0PB@HjPj zoP;w?#y%b=;a}<`JgN(Fy#I&je=|k5w!WXM&QW5T7kT+yb-_Wd8{#CN>^RQ(cB=dQ zM~b?nvz+3@e;lGOE&s5n=4W?CrF$t|kt?2XSD}f2L+lu z(S`PaNq05P5M6~(y}&K?m1lTV7JgR!-_&|JHYNX0!7tT7)LC$iyk036?(2K6B4JL( Ls@mI3|4RP_x7BHh diff --git a/cppcryptfs/res/en/lic/rapidjson_en.txt b/cppcryptfs/res/en/lic/rapidjson_en.txt deleted file mode 100644 index 0e3b8e5d8360275270fe1579d1a7f167305b21d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10104 zcmeI2TT@$A7>3uiGyaDRH&#cX*3lXDD&h<*{}n|E{P)>qO7?Md?iY;RlUD zzV}ns4zpBat%Wb^*m)tUE!|ya9Y&(gS}bv>UpPXQ6(g;gWGuQi*q>g^udiJe; zJEDfCF0xLa>&b3jh2%wl`*f^#XOh&bY`x7a4R&~~tFh#1>C={MC;Bb+#;X(Yz;+X9 zfdz}~8}eaGl(7@uMNe#apeI-236AV8`osqgCgA$*LPI=YY^zXx(d>dmwvY3z-HMce1!wasm8BHQ~~smTlTIK97} z@Z4egJ>!)eg7idV@fLO->d8U+LOuowj=R7$*$Bj62%pXf=el;3@97u(UFpqLrn9eq zK_Pf{{O?urqO-z*_#Np3+D&;j(;yvhPsP(w^IBZU6V7U#h%T0bzXq}mG(IUkS)tT;)(2t zboIz!74?A#Bp*k9V=vhyBIRM8yj?j$7v41GSUfSv9LYf=$>L1!oNh}x^I}6hv#%Yc z($uxGCnK}nfW9(xVy{%Q(v|-BedlO09mI?Y*S^U=lx5 zzlo2?VBysU1=8h zLSk27uAqe_jkBi8e?G1K)Kb3P>F$=gh-&@j?nr#DGy9c{nPY~@|vm83K^57OTE8dUmTVOr7Tp|q#Qv+-fmkzJqroSZATAbq>jKIinhRZ7IsCt_Xa>I?a>L;*G>PmZSDQp8#5x}t|MKCwrM9x|0FTY`C7IaUJ2 zP4+MX=+KeQm?DpYsQXyJ8Z{#T?^Z2fpB?C#Yg5Sef3-uPKIEjM-Iw%OiL73&?v8~e zt#GCA9=}9HJZEF-h%=2jkpYn6O8-W7p|>a*=Umb{Pn1f<9JZl~Ky~S+ zHT4{?lzn??RZskUTX)^`Qg!eiE$5kcp!XZvv7@(L zU9)0AYxsr!LS+X#p}d-YPH-xVF~J0yehviM?8Bx-uLtT*5Z`H+mYeQC;0==%vsSe^PE-CyT* z#)I*NU4D|4OvyW2qTJT5cE%+LdXnY%=csTD;2Cto-nOg#-`8`xD!ez)HJECNcUPYk zJr4vUYcEIAvab5+d%fvo-+B#L+R^jXtR*^N8!TguErn6!-F^CUA@vf&;iDl#lu{Q+Q6#Mt0E#D6>uXyt##m_ARS3x<@oV>M=gjfxuAW6 z4D3a204a{gdfXJfojF+5rVBif1Ro+Kk?RmH^C$9048j5LwuJ{WDRN+KTQVp+&XKB~KMKmoF?Dp8Oiq{cp=X6M zQ_Y(e;tX{$S0B34`%MPVv@)p2-fHLHQ>F3=>A65s84Xk4orlcTJzrL7W8!2 zx^p)`k3nxR64mJCW2%^UsyVMaiOGo*7UvCPdC2+zUY&-Q#3G>@eGPF{gNLtM)kt1;}bB;5N8jbwLH!yu9*(b8OwXAm5;KhHbKnCkr{?=o=2KA;HuxWbaZ#RP} zx*js0g)Kcv82`l%)kyUTy{B8GCIW4B&kt36SzDe!zu7mF8{NSx9tEvN{a6;_+_+5q zcl**6BJ`j2bd$8k?SW*7^Xql-VRPeSdj zclo9Jh|c6kt*66e?|tS5*0H1B3o_G~-(B-T>7DCRF_H8|*LC{tX#oBoVh-?(g|u5) zpS9f4FzuB7baATdeJ29?K-=DPTIsX5)eq4zt;;ib1^;wpb^0nazt3cV#XYTHgV_$< zyh^t=uOn>kFF^y{6}_Z8-S9?J=UMv6S+3C|BH?V0h=sfA{dpJYw8u>aR7IytM_QF7 zP+bsoJ4Q?;VyJYPbkSA2V0Gpr_pVsqoMY!K<$8xWze{O81uy5q+o~i!xvXYBXT`@J z<*`SJ&dO)+k3EXJ*~cD*|IZS$Npx Pz+68cdx-hn$zu8o(R^w8 diff --git a/cppcryptfs/res/en/lic/secure_edit_en.txt b/cppcryptfs/res/en/lic/secure_edit_en.txt deleted file mode 100644 index 914b704e3777029100ba0d20d1c432a06a906fbd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 878 zcmZvb-Acni5QXPj@Ez6*p#@v~xf2ngDtO_I`T{Xcn_!Y^5|zHZ`kmRvXepulH)qc| zvornvO6`>|wZ_)Woh_`jVDF5HEiJQic9pGcZUwP|lQ}1e)jk)@Dba?z8WR{ILXnQM zKzx_N2&|MI!Kdgo%r~ym*>rPf(Aka3Z47qb_WrSiUmj_%P+!AdkWG%GfwSZ+MYYC9 z%u`G!cFcDOZsDG?Esxvm%CbSF1b1(@He*iNDZAFa&31Sgff<85b+t2A*PtpK)%;%A zKj2CJa=7H{4nKiRR=icLkDPVH3xCH!Gk^{D>B!Qn^bA+5qFy=PQUwFI6R*yiwdy-4 zR3MdG0gsRs+JRNVN*t~G&Cto&M_#$_85&lRJHE3zBXUiNJh^gBrmY=#e#*bU8-0Da zj(ke_jl46^J&Srr9j8o%QDtMlsRK)|M|7$;lKQ}&Z2YRr<#|ag<~O|J5oeiAI8VT+ hx?Abk2Cm`~&uVn;8HA diff --git a/cppcryptfs/res/ru/Resources_RU.rc b/cppcryptfs/res/ru/Resources_RU.rc index 08d1d3d1f741dae3483bac4fe621d7110c4a8dcc..3b6d57b9fa5fb3e43b6b71ad396c968022ab18a4 100644 GIT binary patch delta 64 zcmZ3piDlYkmJMZ$@)-=N3Sx3t27I! OPku0qWpmc%L#Y5U1ry%@ delta 2687 zcmdT`OK)366h0QWk60=cMNt^f$C=c2+uIoB(oVaz|R!FU`9Oou6@k@@| zG=(T)(H~Ha;15*Ufk0#jV!?(T68#CRS@09!`(}K7uhWNWv8t}F$1`)z`Mz`JoHO@Z z?R@u>^W%faowk&vA=^^J*bz?@emA?LCl4`G*sDqfYn1cwDl@jAL2YW)WEZRJm^Y

RuQLh!}xX`{uJQV zb66Vz7PGR2aIVQ0Kx6m@#k&fOMPM$==g?gOa?v1$e5(d{Yrxntsksa3I*{A{6OpHP z<+TyXWOZOf=0zG+Q8YegkT*GGeP4!b1wOL!E2gA8AbE%_({<3evi?dYbBGi?p}3|4 zOxqloIRhf;?|&VAD`Ybk*etV@@Koi&%h>C8zxv^@vA6osP+o2$C>gnegNw3M9d78kFXwuzf%AB!_;CZ;BS6NsQfvv1AnF1n$!`mz!f9+n zn;z^)StoxUJ`u{O>{0)1*}uwvCh{um^XlDw^CPhDn(N87AzsaX8w$rDiL*_}hlnOW zFg!d8T0uKf(6a4F;e6TdJLUvxkXw>#XmVWV#mvIDXMWn5Kvm7@$I;PGYy~od5^@3i z%sFO#1Me2*MPTs*Xj5uOPw=v9J}LZ`=HiknK)xhl{{3yN1?z1v>~(;0fS*Jz`W;}( zyXVthy3}C!`!@R@~e(q-00hx$DA^(zHt+cy3D<}`rdJoof$-uXONTI`sV1! zux*bqAhALAIA+2eSvM(ox!8?1KMmQU8QVDC6~lBBzX~!F?fu DzTDow diff --git a/cppcryptfs/res/ru/lic/aessiv_ru.txt b/cppcryptfs/res/ru/lic/aessiv_ru.txt deleted file mode 100644 index 8a4d9c96823a93b63756f4d7f0ee22e82ee8da5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2834 zcmbuA?@k+65XI-ie5zE*7#ubbo5iRJ$bgN5g==H;Pf3bGiMnKNgWzyAE%Uf7l8cH*Z#^?{H4+$y>c-}L*@zSTYQjdbo%{-JK<_N8!4{juKL*m67Y=ZYLBj}>#0UiP{5Rl(T5 z@@IvuFWaJwxozt#S$nDCamw~@_^5lf#vL(2olVtrq>NL)Nc{B^7OK5g>{DUr2@Pj@ z{#3tM&+Li4RJ~K>)h^Wu_mgxtDn8ZuBSq}_fjsA`W~eMZ-_^bO3MaA>m0IR8ayFRi z$p?apD=ZU5?(6+r>$^w?vJ+uA*U1Ypd#S3pbFJ>ZmIhwxxhnXmDI$G4)vb{*!zaq> zB?Ux>;NxlP&QZb0Jnm6qb}z+&p;=|-Hh&x5LR-PWnfCD2SNwBfU^UbO&$sVJ6_-MP zVN{Cxrs5ke=tVGdE&rwTNw<0btHN!mZHF#d&kk&$)tM&jxvb2~jTl4o9}=^0G!@KPnXf7CLL=8=eyAP>BZGt%58RHWfv7li7wQ@K7pa!$14_Bw&yqb( zzyV4=QI?9=(u0O8{X|4~rMJvFH$cNa<}uD3raf%V&hq1Q?pP5k58Mw@tU)ooF)t{a ziAKv$v_?DB%bKo&c&sew4qXn@#G(CxFr)K<9;yQ+m@kxtc@J&id6sVDVak}5PyqVv zD=$3aMOUcgSocv$)Clt2=)S=jHr#C#;YFU44{ynbynlgRd!1=J#c(7ZE_at-H&zlcB0@nLG=t3(unZx=9yx;UfDZWu&6I>IkM< zsv8`uz9ps_1?~qziGLm?XsDIi^292*VLKCAB7q%-ILW)IJ+;>r4K`V22|-I;$Yov8 zyRJ97N4$s0lBv77{`(LmGUP=Uvcw;?60fCb?Q~jRF*R`tF4l`m@KNuI_}=#&S@Caa zC5)MrZu(*3Bd>Tg|~gjzbO+9jP>QHIb~%)w&R;943O&MNJ8@B2?<;$$U%E8Qc&+Fq p+-Blx&q6^Z4|D=ebmfb=;M`(%8`4sx7%EvxOotBt@7G}8{sv?M5GDWs diff --git a/cppcryptfs/res/ru/lic/cppcryptfs_ru.txt b/cppcryptfs/res/ru/lic/cppcryptfs_ru.txt deleted file mode 100644 index 06f341cdd77dd5b17c80de07cf1afffc0dd47ded..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4094 zcmbuC{Z1QK5XI+@`&Xq(=Bqe>VGT+G3SeVQFklSEA%v1ZRkaV$pf>$(MN?IMraVI5 zt?l{U@nyYciPTic_U_y}GiT16xx4)H_qF}1ziYd(KlS_8zOmmdvkiSJp%qR-FC2${ z*bkks6EZu}T~qd^u2*efYueYcrfu0%`Eb>;9obIoEBnrVw67JFyBqt({;;2IQ+Jb! zHy&$O5zm$5Tq}p+B5c~n_K|&QpW91$khQ0kec@?_eOcZp`djui)`?#btH7zLb}`FB(J zPUTNzcpK;**58P$@oul)!{?3E@Vz+wK|Zg==3U>l*r#%2E#*B3m*S_X%qPkX52wP~ zjy>L!g=*UovvcUIpte(4NBa(+aG6<8vFOBwelH?d#kjENabeQAOPb3up)-^QCq;iO z?td{{%eysDJydcagwN%B7b&Pngi9|mU1rRd5D&K>W?#zp7-O#afYp^M}E$9;^|b(Ocz~~xkpVE zp^TpPbJ`M}3Eh&VtDLEag8*9Z|3LHG5yvlt%lA;lk!;k~9%`wlI(oYIiS@IwtNolz zzCsnu_>sOjF%K1i)3HpK%s$#-4;V+!RC4yD(t%cpg3h07A8}SA9vEci-r16PBR}jV zG^~_i*$IE?Y36lvQj*1|s1-Xzcl#0X=oEMz#7xy4DA!4>dt7b)L^#nYpZ!N<9(^|= z_iA7!vA7qzm7i>AEA@{F=&F*`8GPtRs*`6qt3@s6NZFVA4VOImsQ`ONCyDpq>edFc zpGNkWz}$YMe)%aww9zQAi7JQ=-`tOS_HRA&^L7*oI2!u+sq1l2Wy+D`ML$iVl16q=oeJuib6RsUxw&@jS{`BSgtaZM4rqXSzmS2?Va2H z`gGA1<{VFy4$DGQOqSzTp%(^ymVOxZ_Kp^vJ#d!oHwTSGca$nwfO(u8=Nj-8DaN*S5a1C%o_ zJBo&rOj9x=9gg;EPL-oic$kYjQIdDBI<(}-ikR@3mA|8y)YYtF;Z>0?*K`H?s;nCZ zdROgz*pl)=Ust!Nm>$&iq2o!>KF>Kbcjwvhz&29^1E56PKJSjo=PXr3CbUa0D&dhb Lr@8o${G0YK)XK7+ diff --git a/cppcryptfs/res/ru/lic/dokany_lib_ru.txt b/cppcryptfs/res/ru/lic/dokany_lib_ru.txt deleted file mode 100644 index e28cafecc61e7364babf228a1f65c404308649e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17216 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 C7`gla diff --git a/cppcryptfs/res/ru/lic/dokany_mir_ru.txt b/cppcryptfs/res/ru/lic/dokany_mir_ru.txt deleted file mode 100644 index 2437f252ab39fb0d6a5bbf110b9e8c3a7b424f88..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3502 zcmbW3`%YU&5XR?^{i{+Xb1Nr+VGT+`6u{WQ<>CuAPD2O@NLBj)l#&*ulnT-d&y+{# zyS4p&yIvo=7(^@UaCT>QX1ncEpx?qGqSJ*toEtwCA|2F zzOS%9fCZ-y%x}x1bZ2DP3cV7VBHix<)*QP77$H{H-I1#VhIadm={j{IPF&aR zbF%7Q!=r}N8BNwMvLn_Tc#I5xf%NuViThF0B1$dHaSe}}i^xb-xP$*=<}~^`bYBIT z*cvguM6=D*Y4R1b1>?KD3DfQJigWU_9Prfft||Lu3(SM!YbrG5LL<#6EH(EhT#b3R zIi)D7mFB4qx*F?Fm?3%F#AhwkB;7+PyE@vv5J~L0eMjtZhxz}AOt(%g++!&lMNL)Q z4&AC!6ZLYR_{aVJH9`gR&d5gnNO>wdY41X+bE)5|rEXqjAh~W<-Kb6CC7CMw2H6I2 z2j#o;s{+0)P!4-hHB}{fSG~0#wCwaP^P6lCiExy8HH%H}N-;l^MF-dW}MPwcFZm_TQ z`x~cAT@g2ADdt3}=46BF9)-I=GuNd9amu!sH+@CB^h<0{Q!ZpxzJR(7q^$-Y`o76q zngzvE-G;wVil9En-e@Nr`3-Wv$Kkr?d1y}Sbfy`;;rcqq3Crg}XZ3xLOs|roA|+M} zLt>A(c7RqqRA#!_4#R0pm83d7s$=(YD1NVX|4zDsEApFnQ^AjCHQ_wcIetk#@5a!V z+yZ}}@)TXxKR@Lru_?JlY{uQJE2CLtU&h}jn?X9mO4f^Rg&R$Lk+*52QJcBPZq;V- zIff^16W9nr5sS<{3d||vTWGwEyXQgsMZi&H_ZVqLjM^2oXj_7!x)xXSoc#6=?Nln?kG1q>d|L_i|n$~+5^ zO6=y@jT1{X(kcs;ny0oN=_JoAPwa`jJqZ#;(j)5yE>hd=haLj{ZF+^JF;VOi>%7ZfWs`@~cqiJhSL&j5CDVc(YgZ-KzbMaGkm8c5RWbIwp67z+=M7NZ&dQjp~#}lLDJm;0UJAIGU~$^ZZW diff --git a/cppcryptfs/res/ru/lic/getopt_ru.txt b/cppcryptfs/res/ru/lic/getopt_ru.txt deleted file mode 100644 index 8abbbd51fa985f3a4d42327c1911dc7e3d60fe6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3896 zcmeH}UvC>#5XJAqeL_NV{xxnAJ8K)-l%{d)*x0chCr(I1l9ec984sXNz z@Fx5kz71R9Rk#cnp&ova^+Ibu>-lx~PCG8cJKew5{ZiKV;luDjD8^CTm%n~Iiyi%K z%I99}%6}$L@AP}6y}#MX@53*Fc%Ny{u1<`#XWBEdv(UX|ePh;+>@S3Q7^TpZZPetSK#6k;aZ<~BGN2g5+`}iuG^k* zfJ$HxB)+4oywEl1j^*F`=umxycE`%4Eo?o@jWt-Lf=5CJZa5`_)O~o)0&1OBFFCCarevSbRL(o_Tbv&zqLzlm#;7+p}%i zamptb954@=E_4g1_=Y4q-A-3FC$n&F7V!tR z(^r@faJ;X(_c`(5C(YDUCBEwLPBr+_6D@g%gERR}{qOea8Jsf9zbA{a5KH=%sqPmy*}}WwXENq)(YBN z(CU)yTa%Ye|F>kJqILFF_19x#{XMM6x}qmySL0^)`bL|bR;gm;;&RHZFd>8be!A$ju#yI`nTE}%`;9M8jRR+RWi_zS|jIkmC@8d*P@ z*sf~;Z?IAmjwd=z7BxduRkdMbLwx+Vx_kE&mBpNKkIKDI;FbK*T}e56Z1kDeo4V&% zYhr>rEX2N;K}~qebdq|NrQ$W+AIRIZBIwVu@v*GG=!p2P-PGqd`vP@Q5&DE!dB?Dl z`kFZKQd4|1RX04&d_ur~$|!)XV{oS+i4_^eH~V-&8|+bpQYW diff --git a/cppcryptfs/res/ru/lic/openssl_ru.txt b/cppcryptfs/res/ru/lic/openssl_ru.txt deleted file mode 100644 index b38ad48137897d9b8d60b14de08cf9b0df72d066..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13274 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 WoR_^W-oy0C|K&VW*W%CWTl@!b8izmt diff --git a/cppcryptfs/res/ru/lic/rapidjson_ru.txt b/cppcryptfs/res/ru/lic/rapidjson_ru.txt deleted file mode 100644 index 502bba8e8fa0945b3fa6f82a21d5c21a50e930bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12014 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 diff --git a/cppcryptfs/res/ru/lic/secure_edit_ru.txt b/cppcryptfs/res/ru/lic/secure_edit_ru.txt deleted file mode 100644 index 89919618e1018dbce612dd47e5aa23237316431f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 996 zcma)*TTk0S5QXPqo+=^rrBdJOz7dH;!6C$T9LJY(6DdgaCqOC?EvAuotLGY?t%$Y6^0L_EUey z?gu-x*81qte$A8Egw+XoPC`bZj2MYUpOrm@Tj_hm$&0SS4VT`t)NSKc57wy-c}A?> z+gJO7k9Uk)zAte0hNx@%91vf@QGSTUDRUN7J$66~=Z1l@;A+EaqiqK~@!$0p_ARS& zRqq9BdA{e0kyG6qZRoKA=hZV2zrX?I$>=3vjyOB^zNz~nzA)88b#QA;oII@fKjrK` z(TdG{K*qOZkpDVcx@x%5DW2+U)ke%zQSFqRshI1P4_(Fw>^GoAt~FmJ$f{~QT?8f4 zdc;n=1Kpdn@liU}DSx{-gU=ka<8_XR7`r4fIa#5w#$|P7!QJTAbr5dMV_hq5O`rdF P)L4~YayPD+OWuC~Jf49D diff --git a/cppcryptfs/ui/CryptAboutPropertyPage.cpp b/cppcryptfs/ui/CryptAboutPropertyPage.cpp index 3a0503c..a507a51 100755 --- a/cppcryptfs/ui/CryptAboutPropertyPage.cpp +++ b/cppcryptfs/ui/CryptAboutPropertyPage.cpp @@ -63,13 +63,19 @@ void LoadLicensesFromResource() { DWORD size = SizeofResource(AfxGetResourceHandle(), hRes); const void* pData = LockResource(hData); - if (pData && size > 0) { - int charCount = size / sizeof(WCHAR); + if (pData && size >= sizeof(WCHAR) && (size % sizeof(WCHAR)) == 0) { + const WCHAR* pSrc = static_cast(pData); + int charCount = static_cast(size / sizeof(WCHAR)); - LPWSTR pBuf = storage[i].GetBufferSetLength(charCount); - memcpy(pBuf, pData, size); - storage[i].ReleaseBuffer(charCount); + if (charCount > 0 && pSrc[0] == 0xFEFF) { + ++pSrc; + --charCount; + } + + if (charCount > 0 && pSrc[charCount - 1] == L'\0') + --charCount; + storage[i].SetString(pSrc, charCount); licenses[i] = (const WCHAR*)storage[i]; } } From a2028900370cf0b0cbca8e53fe98befb446a11d7 Mon Sep 17 00:00:00 2001 From: bailey27 Date: Tue, 17 Mar 2026 19:49:03 -0400 Subject: [PATCH 33/35] use different version of GetStringForLang --- cppcryptfs/cppcryptfs.cpp | 70 ++++++++++++++++++++++++++++----------- 1 file changed, 50 insertions(+), 20 deletions(-) diff --git a/cppcryptfs/cppcryptfs.cpp b/cppcryptfs/cppcryptfs.cpp index bfbad0a..16bf452 100755 --- a/cppcryptfs/cppcryptfs.cpp +++ b/cppcryptfs/cppcryptfs.cpp @@ -115,35 +115,65 @@ void CcppcryptfsApp::ScanResourcesForLanguages() { } // Direct reading of a string from a specific language section (bypassing the current thread locale) -CString CcppcryptfsApp::GetStringForLang(HMODULE hInst, UINT nID, WORD wLang) { - HRSRC hRes = FindResourceEx(hInst, RT_STRING, MAKEINTRESOURCE((nID >> 4) + 1), wLang); - if (!hRes) return _T(""); +CString CcppcryptfsApp::GetStringForLang(HMODULE hInst, UINT nID, WORD wLang) +{ + HRSRC hRes = ::FindResourceExW( + hInst, + RT_STRING, + MAKEINTRESOURCEW((nID >> 4) + 1), + wLang); + + if (!hRes) + return CString(); + + HGLOBAL hGlobal = ::LoadResource(hInst, hRes); + if (!hGlobal) + return CString(); + + DWORD resourceSizeBytes = ::SizeofResource(hInst, hRes); + if (resourceSizeBytes < sizeof(WORD) || (resourceSizeBytes % sizeof(WORD)) != 0) + return CString(); + + const WORD* pWords = static_cast(::LockResource(hGlobal)); + if (!pWords) + return CString(); - HGLOBAL hGlobal = LoadResource(hInst, hRes); - DWORD resourceSize = SizeofResource(hInst, hRes); + const size_t wordCount = resourceSizeBytes / sizeof(WORD); + size_t pos = 0; - LPWSTR pData = (LPWSTR)LockResource(hGlobal); - LPWSTR pResourceEnd = (LPWSTR)((LPBYTE)pData + resourceSize); + const int index = nID & 0x000F; - if (!pData || resourceSize < sizeof(WCHAR)) return _T(""); + for (int i = 0; i < index; ++i) + { + if (pos >= wordCount) + return CString(); - int nIndex = nID & 0x000F; - for (int i = 0; i < nIndex; i++) { - if (pData >= pResourceEnd) return _T(""); // Out of bounds + const size_t len = pWords[pos]; + ++pos; // skip length word - DWORD stringLen = *pData; - if (stringLen > 0xFFFF) return _T(""); // Unreasonable length - if ((LPBYTE)pData + (stringLen + 1) * sizeof(WCHAR) > (LPBYTE)pResourceEnd) - return _T(""); // Exceeds boundary + if (len > wordCount - pos) + return CString(); - pData += stringLen + 1; + pos += len; // skip string data } - if (pData >= pResourceEnd) return _T(""); - DWORD finalLen = *pData; - if (finalLen == 0) return _T(""); + if (pos >= wordCount) + return CString(); + + const size_t finalLen = pWords[pos]; + ++pos; // move to first character + + if (finalLen == 0) + return CString(); + + if (finalLen > wordCount - pos) + return CString(); + + if (finalLen > static_cast(INT_MAX)) + return CString(); - return CString(pData + 1, (int)min(finalLen, MAXINT)); + return CString(reinterpret_cast(pWords + pos), + static_cast(finalLen)); } // Check: does this language exist in the resources (protection against outdated registry entries) From a507565dd149dcd8987fa25b9ce92467396d0d9d Mon Sep 17 00:00:00 2001 From: bailey27 Date: Thu, 19 Mar 2026 19:49:31 -0400 Subject: [PATCH 34/35] make main prog copyright English only. Make some static CStrings const. --- cppcryptfs/res/ru/Resources_RU.rc | Bin 67990 -> 67960 bytes cppcryptfs/ui/CreatePropertyPage.cpp | 4 +-- cppcryptfs/ui/CryptAboutPropertyPage.cpp | 16 ++++++------ cppcryptfs/ui/SettingsPropertyPage.cpp | 32 +++++++++++------------ 4 files changed, 26 insertions(+), 26 deletions(-) diff --git a/cppcryptfs/res/ru/Resources_RU.rc b/cppcryptfs/res/ru/Resources_RU.rc index 3b6d57b9fa5fb3e43b6b71ad396c968022ab18a4..151aba654ff32016cee42da0aadd4214a2a90c85 100644 GIT binary patch delta 234 zcmbO>ndQeMmJM}WLe32N3wo(YPmKCEp<$tG;16>)~em3!zCVVEplmreGcBDq;>sb2~J DsI4e< diff --git a/cppcryptfs/ui/CreatePropertyPage.cpp b/cppcryptfs/ui/CreatePropertyPage.cpp index b5b8d4a..f29a5a8 100755 --- a/cppcryptfs/ui/CreatePropertyPage.cpp +++ b/cppcryptfs/ui/CreatePropertyPage.cpp @@ -97,7 +97,7 @@ void CCreatePropertyPage::DefaultAction() void CCreatePropertyPage::CreateCryptfs() { //Moved to both methods, otherwise the array will be loaded before we determine the GUI language at program startup. - static CString sPlainText = LocUtils::GetStringFromResources(IDS_PLAIN_TEXT).c_str(); + static const CString sPlainText = LocUtils::GetStringFromResources(IDS_PLAIN_TEXT).c_str(); static const WCHAR* filename_encryption_types[] = { L"AES256-EME", sPlainText }; const int NUM_FN_ENC_TYPES = sizeof(filename_encryption_types) / sizeof(filename_encryption_types[0]); @@ -373,7 +373,7 @@ BOOL CCreatePropertyPage::OnInitDialog() CPropertyPage::OnInitDialog(); //Moved to both methods, otherwise the array will be loaded before we determine the GUI language at program startup. - static CString sPlainText = LocUtils::GetStringFromResources(IDS_PLAIN_TEXT).c_str(); + static const CString sPlainText = LocUtils::GetStringFromResources(IDS_PLAIN_TEXT).c_str(); static const WCHAR* filename_encryption_types[] = { L"AES256-EME", sPlainText }; const int NUM_FN_ENC_TYPES = sizeof(filename_encryption_types) / sizeof(filename_encryption_types[0]); diff --git a/cppcryptfs/ui/CryptAboutPropertyPage.cpp b/cppcryptfs/ui/CryptAboutPropertyPage.cpp index a507a51..d36c0d0 100755 --- a/cppcryptfs/ui/CryptAboutPropertyPage.cpp +++ b/cppcryptfs/ui/CryptAboutPropertyPage.cpp @@ -141,14 +141,14 @@ BOOL CCryptAboutPropertyPage::OnInitDialog() // TODO: Add extra initialization here //Moved, otherwise the array will be loaded before we determine the GUI language at program startup. - static CString listViewStringCppcryptfs = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_CPPCRYPTFS).c_str(); - static CString listViewStringOpenSSL = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_OPENSSL).c_str(); - static CString listViewStringRapidJSON = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_RAPIDJSON).c_str(); - static CString listViewStringDokanyMir = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_DOKANY_MIR).c_str(); - static CString listViewStringDokanyLib = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_DOKANY_LIB).c_str(); - static CString listViewStringSecuryEdit = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_SECURE_EDIT).c_str(); - static CString listViewStringGetOpt = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_GETOPT_PORT).c_str(); - static CString listViewStringAESSIV = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_AES_SIV).c_str(); + static const CString listViewStringCppcryptfs = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_CPPCRYPTFS).c_str(); + static const CString listViewStringOpenSSL = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_OPENSSL).c_str(); + static const CString listViewStringRapidJSON = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_RAPIDJSON).c_str(); + static const CString listViewStringDokanyMir = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_DOKANY_MIR).c_str(); + static const CString listViewStringDokanyLib = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_DOKANY_LIB).c_str(); + static const CString listViewStringSecuryEdit = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_SECURE_EDIT).c_str(); + static const CString listViewStringGetOpt = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_GETOPT_PORT).c_str(); + static const CString listViewStringAESSIV = LocUtils::GetStringFromResources(IDS_LVIEW_COPYRIGHT_AES_SIV).c_str(); static const WCHAR* components[] = { listViewStringCppcryptfs, diff --git a/cppcryptfs/ui/SettingsPropertyPage.cpp b/cppcryptfs/ui/SettingsPropertyPage.cpp index b52f751..e279d49 100644 --- a/cppcryptfs/ui/SettingsPropertyPage.cpp +++ b/cppcryptfs/ui/SettingsPropertyPage.cpp @@ -103,22 +103,22 @@ BOOL CSettingsPropertyPage::OnInitDialog() CCryptPropertyPage::OnInitDialog(); //Moved, otherwise the array will be loaded before we determine the GUI language at program startup. - static CString listBoxStringInfinite = LocUtils::GetStringFromResources(IDS_TTL_INFINITE).c_str(); - static CString listBoxStringSec1 = LocUtils::GetStringFromResources(IDS_TTL_SEC_1).c_str(); - static CString listBoxStringSec2 = LocUtils::GetStringFromResources(IDS_TTL_SEC_2).c_str(); - static CString listBoxStringSec5 = LocUtils::GetStringFromResources(IDS_TTL_SEC_5).c_str(); - static CString listBoxStringSec10 = LocUtils::GetStringFromResources(IDS_TTL_SEC_10).c_str(); - static CString listBoxStringSec15 = LocUtils::GetStringFromResources(IDS_TTL_SEC_15).c_str(); - static CString listBoxStringSec30 = LocUtils::GetStringFromResources(IDS_TTL_SEC_30).c_str(); - static CString listBoxStringSec45 = LocUtils::GetStringFromResources(IDS_TTL_SEC_45).c_str(); - static CString listBoxStringSec60 = LocUtils::GetStringFromResources(IDS_TTL_SEC_60).c_str(); - static CString listBoxStringSec90 = LocUtils::GetStringFromResources(IDS_TTL_SEC_90).c_str(); - static CString listBoxStringMin2 = LocUtils::GetStringFromResources(IDS_TTL_MIN_2).c_str(); - static CString listBoxStringMin5 = LocUtils::GetStringFromResources(IDS_TTL_MIN_5).c_str(); - static CString listBoxStringMin10 = LocUtils::GetStringFromResources(IDS_TTL_MIN_10).c_str(); - static CString listBoxStringMin15 = LocUtils::GetStringFromResources(IDS_TTL_MIN_15).c_str(); - static CString listBoxStringMin30 = LocUtils::GetStringFromResources(IDS_TTL_MIN_30).c_str(); - static CString listBoxStringHour1 = LocUtils::GetStringFromResources(IDS_TTL_HOUR_1).c_str(); + static const CString listBoxStringInfinite = LocUtils::GetStringFromResources(IDS_TTL_INFINITE).c_str(); + static const CString listBoxStringSec1 = LocUtils::GetStringFromResources(IDS_TTL_SEC_1).c_str(); + static const CString listBoxStringSec2 = LocUtils::GetStringFromResources(IDS_TTL_SEC_2).c_str(); + static const CString listBoxStringSec5 = LocUtils::GetStringFromResources(IDS_TTL_SEC_5).c_str(); + static const CString listBoxStringSec10 = LocUtils::GetStringFromResources(IDS_TTL_SEC_10).c_str(); + static const CString listBoxStringSec15 = LocUtils::GetStringFromResources(IDS_TTL_SEC_15).c_str(); + static const CString listBoxStringSec30 = LocUtils::GetStringFromResources(IDS_TTL_SEC_30).c_str(); + static const CString listBoxStringSec45 = LocUtils::GetStringFromResources(IDS_TTL_SEC_45).c_str(); + static const CString listBoxStringSec60 = LocUtils::GetStringFromResources(IDS_TTL_SEC_60).c_str(); + static const CString listBoxStringSec90 = LocUtils::GetStringFromResources(IDS_TTL_SEC_90).c_str(); + static const CString listBoxStringMin2 = LocUtils::GetStringFromResources(IDS_TTL_MIN_2).c_str(); + static const CString listBoxStringMin5 = LocUtils::GetStringFromResources(IDS_TTL_MIN_5).c_str(); + static const CString listBoxStringMin10 = LocUtils::GetStringFromResources(IDS_TTL_MIN_10).c_str(); + static const CString listBoxStringMin15 = LocUtils::GetStringFromResources(IDS_TTL_MIN_15).c_str(); + static const CString listBoxStringMin30 = LocUtils::GetStringFromResources(IDS_TTL_MIN_30).c_str(); + static const CString listBoxStringHour1 = LocUtils::GetStringFromResources(IDS_TTL_HOUR_1).c_str(); static const WCHAR* ttl_strings[] = { listBoxStringInfinite, listBoxStringSec1, listBoxStringSec2, listBoxStringSec5, listBoxStringSec10, listBoxStringSec15, listBoxStringSec30, listBoxStringSec45, From f4167c23a188a1639f8ad138717f7aff8e392b94 Mon Sep 17 00:00:00 2001 From: bailey27 Date: Thu, 19 Mar 2026 19:56:30 -0400 Subject: [PATCH 35/35] remove deleted files --- cppcryptfs/cppcryptfs.vcxproj | 26 +++++++++----------------- 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/cppcryptfs/cppcryptfs.vcxproj b/cppcryptfs/cppcryptfs.vcxproj index 272441b..0e63c6a 100755 --- a/cppcryptfs/cppcryptfs.vcxproj +++ b/cppcryptfs/cppcryptfs.vcxproj @@ -334,22 +334,14 @@ - - - - - - - - - - - - - - - - + + + + + + + + @@ -359,4 +351,4 @@ - \ No newline at end of file +