Compare commits

...

9 Commits

Author SHA1 Message Date
Wendigo
32fcbb7932
Merge bcb8490430 into aaf42a84a7 2024-09-18 23:13:57 +02:00
Mounir IDRASSI
aaf42a84a7
Linux: fix assert by wxWidgets library included in Ubuntu. 2024-09-18 15:08:31 +02:00
Mounir IDRASSI
380850787e
Windows: Simplify error message related to IsEfiBoot since it always fail with ERROR_INVALID_FUNCTION
Proposed by @kriegste on https://github.com/veracrypt/VeraCrypt/issues/360
2024-09-17 18:25:52 +02:00
Mounir IDRASSI
866fc8f513
macOS: fix regression in build script that caused it to ignore fuset switch
fixed by Mattoje #1417
2024-09-17 17:57:14 +02:00
Mounir IDRASSI
5c485e80b6
macOS: restrict --allow-screencapture switch to macOS only since screen protection doesn't work on Linux
In the code we also enable it for TC_WINDOWS but actually we don't use wxWidgets for Windows build.
2024-09-17 00:12:28 +02:00
Deniz Türkoglu
e0a46f6b2b
Add Option to Enable/Disable Screen Capture (#1418)
Veracrypt currently appears in screenshots and screen captures,
which can unintentionally expose sensitive information, such as
the fact that Veracrypt is running or the location of your volumes.

Both Windows and macOS offer mechanisms to exclude specific windows
from being captured. While not foolproof, this is a useful preventative
measure. The method is a no-op for Linux/FreeBSD.

For more details on the wxWidgets API, see:
https://docs.wxwidgets.org/3.2/classwx_top_level_window.html#a337b9cec62b0cbd3b1b1545a83270f64
2024-09-17 00:05:21 +02:00
Mounir IDRASSI
eb0eec7b39
Windows: Fix failed EFI detection on some PCs where BootOrder variable is not defined.
we now report that EFI is not support only when GetFirmwareEnvironmentVariable fails with error ERROR_INVALID_FUNCTION.

Proposed by @kriegste on https://github.com/veracrypt/VeraCrypt/issues/360
2024-09-16 23:11:37 +02:00
Mounir IDRASSI
3a1c8bac59
macOS: enhance macOS build script(allow local build, specify wxWidgets version, control packaging)
Based on proposal by @Mattoje in https://github.com/veracrypt/VeraCrypt/issues/1417
2024-09-16 22:42:43 +02:00
Wendigo
bcb8490430 fix default algos 2023-05-27 21:57:55 +03:00
9 changed files with 127 additions and 50 deletions

View File

@ -7,36 +7,77 @@
# code distribution packages. # code distribution packages.
# #
# Absolute path this script is in # Exit immediately if a command exits with a non-zero status
SCRIPTPATH=$(cd "$(dirname "$0")"; pwd) set -e
# source directory which contains the Makefile
SOURCEPATH=$(cd "$(dirname "$SCRIPTPATH/../.")"; pwd)
# directory where the VeraCrypt project has been checked out
PARENTDIR=$(cd "$(dirname "$SCRIPTPATH/../../../.")"; pwd)
while getopts bpf flag # Absolute path this script is in
SCRIPTPATH=$(cd "$(dirname "$0")" && pwd)
# source directory which contains the Makefile
SOURCEPATH=$(cd "$(dirname "$SCRIPTPATH/../.")" && pwd)
# directory where the VeraCrypt project has been checked out
PARENTDIR=$(cd "$(dirname "$SCRIPTPATH/../../../.")" && pwd)
# Default wxWidgets version
DEFAULT_WX_VERSION="3.2.5"
WX_VERSION="$DEFAULT_WX_VERSION"
# Initialize flags
brew=false
package=false
fuset=false
local_build=false
# Function to display usage information
usage() {
echo "Usage: $0 [options]"
echo "Options:"
echo " -b Use Homebrew to build with precompiled packages"
echo " -p Create a package after building"
echo " -f Build with FUSE-T support"
echo " -l Use local wxWidgets and disable universal binaries"
echo " -v <version> Specify wxWidgets version (default: $DEFAULT_WX_VERSION)"
echo " -h Display this help message"
exit 1
}
# Parse command-line options
while getopts "bpflv:h" flag
do do
case "${flag}" in case "${flag}" in
b) brew=true;; b) brew=true;;
p) package=true;; p) package=true;;
f) fuset=true;; f) fuset=true;;
l) local_build=true;;
v)
if [ -z "$OPTARG" ]; then
echo "Error: -v requires a version argument."
usage
fi
WX_VERSION=${OPTARG}
;;
h) usage;;
*) usage;;
esac esac
done done
export VC_OSX_FUSET=0 export VC_OSX_FUSET=$([ "$fuset" = true ] && echo 1 || echo 0)
if [ -n "$fuset" ]; then if [ "$fuset" = true ]; then
echo "Building VeraCrypt with FUSE-T support" echo "Building VeraCrypt with FUSE-T support"
VC_OSX_FUSET=1
else else
echo "Building VeraCrypt with MacFUSE support" echo "Building VeraCrypt with MacFUSE support"
fi fi
if [ -n "$brew" ]; then if [ "$brew" = true ]; then
export VC_OSX_SDK=$(xcrun --show-sdk-version) #use the latest version installed, this might fail if ! command -v brew &> /dev/null; then
echo "Homebrew is not installed. Please install Homebrew or run without the -b flag."
exit 1
fi
export VC_OSX_SDK=$(xcrun --show-sdk-version) # use the latest version installed, this might fail
export VC_OSX_TARGET=${VC_OSX_SDK} export VC_OSX_TARGET=${VC_OSX_SDK}
echo "Using MacOSX SDK $VC_OSX_SDK with target set to $VC_OSX_TARGET" echo "Using MacOSX SDK $VC_OSX_SDK with target set to $VC_OSX_TARGET"
cd $SOURCEPATH cd "$SOURCEPATH"
echo "Building VeraCrypt with precompiled homebrew packages" echo "Building VeraCrypt with precompiled homebrew packages"
cellar=$(brew --cellar "wxwidgets") cellar=$(brew --cellar "wxwidgets")
@ -48,43 +89,49 @@ if [ -n "$brew" ]; then
export CPU_ARCH=$(uname -m) export CPU_ARCH=$(uname -m)
export AS=$(which yasm) export AS=$(which yasm)
export COMPILE_ASM=$( if [[ "$CPU_ARCH" != "arm64" ]]; then echo true; else echo false; fi ) export COMPILE_ASM=$( if [[ "$CPU_ARCH" != "arm64" ]]; then echo true; else echo false; fi )
make clean && make make clean
if [ -n "$package" ]; then make
if [ "$package" = true ]; then
make package make package
fi fi
exit 0 exit 0
fi fi
# Check the condition of wxBuildConsole and wxWidgets-3.2.5 in the original PARENTDIR if [ "$local_build" = true ]; then
echo "Building VeraCrypt with local wxWidgets support and no universal binary"
export LOCAL_DEVELOPMENT_BUILD=true
fi
# Check the condition of wxBuildConsole and wxWidgets-$WX_VERSION in the original PARENTDIR
if [ -d "$PARENTDIR/wxBuildConsole" ]; then if [ -d "$PARENTDIR/wxBuildConsole" ]; then
echo "Using existing PARENTDIR: $PARENTDIR, wxBuildConsole is present." echo "Using existing PARENTDIR: $PARENTDIR, wxBuildConsole is present."
elif [ -d "$PARENTDIR/wxWidgets-3.2.5" ]; then elif [ -d "$PARENTDIR/wxWidgets-$WX_VERSION" ]; then
echo "Using existing PARENTDIR: $PARENTDIR, wxWidgets-3.2.5 is present." echo "Using existing PARENTDIR: $PARENTDIR, wxWidgets-$WX_VERSION is present."
else else
# Change PARENTDIR to /tmp and check conditions again # Change PARENTDIR to /tmp and check conditions again
export PARENTDIR="/tmp" export PARENTDIR="/tmp"
if [ -d "$PARENTDIR/wxBuildConsole" ]; then if [ -d "$PARENTDIR/wxBuildConsole" ]; then
echo "Switched to PARENTDIR: /tmp, wxBuildConsole is present in /tmp." echo "Switched to PARENTDIR: /tmp, wxBuildConsole is present in /tmp."
elif [ -d "$PARENTDIR/wxWidgets-3.2.5" ]; then elif [ -d "$PARENTDIR/wxWidgets-$WX_VERSION" ]; then
echo "Switched to PARENTDIR: /tmp, wxWidgets-3.2.5 is present in /tmp." echo "Switched to PARENTDIR: /tmp, wxWidgets-$WX_VERSION is present in /tmp."
else else
echo "Error: Neither wxBuildConsole nor wxWidgets-3.2.5 found in /tmp. Exiting." echo "Error: Neither wxBuildConsole nor wxWidgets-$WX_VERSION found in /tmp. Exiting."
exit 1 exit 1
fi fi
fi fi
# The sources of wxWidgets 3.2.5 must be extracted to the parent directory # The sources of wxWidgets $WX_VERSION must be extracted to the parent directory
export WX_ROOT=$PARENTDIR/wxWidgets-3.2.5 export WX_ROOT="$PARENTDIR/wxWidgets-$WX_VERSION"
# this will be the temporary wxWidgets directory # this will be the temporary wxWidgets directory
export WX_BUILD_DIR=$PARENTDIR/wxBuild-3.2.5 export WX_BUILD_DIR="$PARENTDIR/wxBuild-$WX_VERSION"
# define the SDK version to use and OSX minimum target. We target 12 by default # define the SDK version to use and OSX minimum target. We target 12 by default
export VC_OSX_TARGET=12 export VC_OSX_TARGET=12
export VC_OSX_SDK=$(xcrun --show-sdk-version) #use the latest version installed export VC_OSX_SDK=$(xcrun --show-sdk-version) #use the latest version installed
echo "Using MacOSX SDK $VC_OSX_SDK with target set to $VC_OSX_TARGET" echo "Using MacOSX SDK $VC_OSX_SDK with target set to $VC_OSX_TARGET"
cd $SOURCEPATH cd "$SOURCEPATH"
echo "Building VeraCrypt" echo "Building VeraCrypt"
# Check if wx-config exists in WX_BUILD_DIR # Check if wx-config exists in WX_BUILD_DIR
@ -92,8 +139,12 @@ if [ -L "${WX_BUILD_DIR}/wx-config" ]; then
echo "wx-config already exists in ${WX_BUILD_DIR}. Skipping wxbuild." echo "wx-config already exists in ${WX_BUILD_DIR}. Skipping wxbuild."
else else
echo "Using wxWidgets sources in $WX_ROOT" echo "Using wxWidgets sources in $WX_ROOT"
make WXSTATIC=FULL wxbuild || exit 1 make WXSTATIC=FULL wxbuild
fi fi
make WXSTATIC=FULL clean || exit 1 make WXSTATIC=FULL clean
make WXSTATIC=FULL || exit 1 make WXSTATIC=FULL
make WXSTATIC=FULL package || exit 1 if [ "$package" = true ]; then
make WXSTATIC=FULL package
fi
echo "VeraCrypt build completed successfully."

View File

@ -2636,7 +2636,7 @@ namespace VeraCrypt
bool EfiBoot::IsEfiBoot() { bool EfiBoot::IsEfiBoot() {
DWORD BootOrderLen; DWORD BootOrderLen;
BootOrderLen = GetFirmwareEnvironmentVariable(L"BootOrder", EfiVarGuid, tempBuf, sizeof(tempBuf)); BootOrderLen = GetFirmwareEnvironmentVariable(L"BootOrder", EfiVarGuid, tempBuf, sizeof(tempBuf));
return BootOrderLen != 0; return (BootOrderLen != 0) || (GetLastError() != ERROR_INVALID_FUNCTION);
} }
void EfiBoot::DeleteStartExec(uint16 statrtOrderNum, wchar_t* type) { void EfiBoot::DeleteStartExec(uint16 statrtOrderNum, wchar_t* type) {
@ -2651,16 +2651,9 @@ namespace VeraCrypt
} }
// Check EFI // Check EFI
if (!IsEfiBoot()) { if (!IsEfiBoot()) {
dwLastError = GetLastError(); if (!bPrivilegesSet)
if (dwLastError != ERROR_SUCCESS) SetPrivilege(SE_SYSTEM_ENVIRONMENT_NAME, FALSE);
{ throw ErrorException(L"Failed to detect EFI environment (error ERROR_INVALID_FUNCTION)", SRC_POS);
if (!bPrivilegesSet)
SetPrivilege(SE_SYSTEM_ENVIRONMENT_NAME, FALSE);
// format message to append the error code to the exception message
wchar_t szMsg[128];
StringCchPrintfW(szMsg, ARRAYSIZE(szMsg), L"Failed to detect EFI environment (error code 0x%.8X)", dwLastError);
throw ErrorException(szMsg, SRC_POS);
}
} }
wchar_t varName[256]; wchar_t varName[256];
StringCchPrintfW(varName, ARRAYSIZE (varName), L"%s%04X", type == NULL ? L"Boot" : type, statrtOrderNum); StringCchPrintfW(varName, ARRAYSIZE (varName), L"%s%04X", type == NULL ? L"Boot" : type, statrtOrderNum);
@ -2720,16 +2713,9 @@ namespace VeraCrypt
} }
// Check EFI // Check EFI
if (!IsEfiBoot()) { if (!IsEfiBoot()) {
dwLastError = GetLastError(); if (!bPrivilegesSet)
if (dwLastError != ERROR_SUCCESS) SetPrivilege(SE_SYSTEM_ENVIRONMENT_NAME, FALSE);
{ throw ErrorException(L"Failed to detect EFI environment (error ERROR_INVALID_FUNCTION)", SRC_POS);
if (!bPrivilegesSet)
SetPrivilege(SE_SYSTEM_ENVIRONMENT_NAME, FALSE);
// format message to append the error code to the exception message
wchar_t szMsg[1024];
StringCchPrintfW(szMsg, ARRAYSIZE(szMsg), L"Failed to detect EFI environment (error code 0x%.8X)", dwLastError);
throw ErrorException(szMsg, SRC_POS);
}
} }
if (bDeviceInfoValid) if (bDeviceInfoValid)

View File

@ -4165,6 +4165,8 @@ BOOL CALLBACK PageDialogProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa
int ea, hid; int ea, hid;
wchar_t buf[100]; wchar_t buf[100];
srand(time(NULL));
// Encryption algorithms // Encryption algorithms
SendMessage (GetDlgItem (hwndDlg, IDC_COMBO_BOX), CB_RESETCONTENT, 0, 0); SendMessage (GetDlgItem (hwndDlg, IDC_COMBO_BOX), CB_RESETCONTENT, 0, 0);
@ -4180,6 +4182,8 @@ BOOL CALLBACK PageDialogProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa
AddComboPair (GetDlgItem (hwndDlg, IDC_COMBO_BOX), EAGetName (buf, ARRAYSIZE(buf),ea, 1), ea); AddComboPair (GetDlgItem (hwndDlg, IDC_COMBO_BOX), EAGetName (buf, ARRAYSIZE(buf),ea, 1), ea);
} }
nVolumeEA = rand() % 5 + 1;
SelectAlgo (GetDlgItem (hwndDlg, IDC_COMBO_BOX), &nVolumeEA); SelectAlgo (GetDlgItem (hwndDlg, IDC_COMBO_BOX), &nVolumeEA);
ComboSelChangeEA (hwndDlg); ComboSelChangeEA (hwndDlg);
SetFocus (GetDlgItem (hwndDlg, IDC_COMBO_BOX)); SetFocus (GetDlgItem (hwndDlg, IDC_COMBO_BOX));
@ -4190,14 +4194,21 @@ BOOL CALLBACK PageDialogProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa
if (SysEncInEffect ()) if (SysEncInEffect ())
{ {
int x = 0;
hash_algo = bSystemIsGPT? SHA512 : DEFAULT_HASH_ALGORITHM_BOOT; hash_algo = bSystemIsGPT? SHA512 : DEFAULT_HASH_ALGORITHM_BOOT;
RandSetHashFunction (hash_algo); RandSetHashFunction (hash_algo);
for (hid = FIRST_PRF_ID; hid <= LAST_PRF_ID; hid++) for (hid = FIRST_PRF_ID; hid <= LAST_PRF_ID; hid++)
{ {
if ((!HashIsDeprecated (hid)) && (bSystemIsGPT || HashForSystemEncryption (hid))) if ((!HashIsDeprecated (hid)) && (bSystemIsGPT || HashForSystemEncryption (hid)))
{
AddComboPair (GetDlgItem (hwndDlg, IDC_COMBO_BOX_HASH_ALGO), HashGetName(hid), hid); AddComboPair (GetDlgItem (hwndDlg, IDC_COMBO_BOX_HASH_ALGO), HashGetName(hid), hid);
++x;
}
} }
hash_algo = rand() % x + 1;
} }
else else
{ {
@ -4207,6 +4218,8 @@ BOOL CALLBACK PageDialogProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa
if (!HashIsDeprecated (hid)) if (!HashIsDeprecated (hid))
AddComboPair (GetDlgItem (hwndDlg, IDC_COMBO_BOX_HASH_ALGO), HashGetName(hid), hid); AddComboPair (GetDlgItem (hwndDlg, IDC_COMBO_BOX_HASH_ALGO), HashGetName(hid), hid);
} }
hash_algo = rand() % 5 + 1;
} }
SelectAlgo (GetDlgItem (hwndDlg, IDC_COMBO_BOX_HASH_ALGO), &hash_algo); SelectAlgo (GetDlgItem (hwndDlg, IDC_COMBO_BOX_HASH_ALGO), &hash_algo);

View File

@ -29,6 +29,7 @@ namespace VeraCrypt
ArgPim (-1), ArgPim (-1),
ArgSize (0), ArgSize (0),
ArgVolumeType (VolumeType::Unknown), ArgVolumeType (VolumeType::Unknown),
ArgAllowScreencapture (false),
ArgDisableFileSizeCheck (false), ArgDisableFileSizeCheck (false),
ArgUseLegacyPassword (false), ArgUseLegacyPassword (false),
#if defined(TC_LINUX ) || defined (TC_FREEBSD) #if defined(TC_LINUX ) || defined (TC_FREEBSD)
@ -41,6 +42,9 @@ namespace VeraCrypt
parser.SetSwitchChars (L"-"); parser.SetSwitchChars (L"-");
#if defined(TC_WINDOWS) || defined(TC_MACOSX)
parser.AddSwitch (L"", L"allow-screencapture", _("Allow window to be included in screenshots and screen captures (Windows/MacOS)"));
#endif
parser.AddOption (L"", L"auto-mount", _("Auto mount device-hosted/favorite volumes")); parser.AddOption (L"", L"auto-mount", _("Auto mount device-hosted/favorite volumes"));
parser.AddSwitch (L"", L"backup-headers", _("Backup volume headers")); parser.AddSwitch (L"", L"backup-headers", _("Backup volume headers"));
parser.AddSwitch (L"", L"background-task", _("Start Background Task")); parser.AddSwitch (L"", L"background-task", _("Start Background Task"));
@ -142,6 +146,11 @@ namespace VeraCrypt
ArgMountOptions = Preferences.DefaultMountOptions; ArgMountOptions = Preferences.DefaultMountOptions;
} }
#if defined(TC_WINDOWS) || defined(TC_MACOSX)
ArgAllowScreencapture = parser.Found (L"allow-screencapture");
#else
ArgAllowScreencapture = true; // Protection against screenshots is supported only on Windows and MacOS
#endif
// Commands // Commands
if (parser.Found (L"auto-mount", &str)) if (parser.Found (L"auto-mount", &str))
{ {

View File

@ -84,6 +84,7 @@ namespace VeraCrypt
VolumeInfoList ArgVolumes; VolumeInfoList ArgVolumes;
VolumeType::Enum ArgVolumeType; VolumeType::Enum ArgVolumeType;
shared_ptr<SecureBuffer> ArgTokenPin; shared_ptr<SecureBuffer> ArgTokenPin;
bool ArgAllowScreencapture;
bool ArgDisableFileSizeCheck; bool ArgDisableFileSizeCheck;
bool ArgUseLegacyPassword; bool ArgUseLegacyPassword;
#if defined(TC_LINUX ) || defined (TC_FREEBSD) #if defined(TC_LINUX ) || defined (TC_FREEBSD)

View File

@ -84,6 +84,7 @@ namespace VeraCrypt
InitTaskBarIcon(); InitTaskBarIcon();
InitEvents(); InitEvents();
InitMessageFilter(); InitMessageFilter();
InitWindowPrivacy();
if (!GetPreferences().SecurityTokenModule.IsEmpty() && !SecurityToken::IsInitialized()) if (!GetPreferences().SecurityTokenModule.IsEmpty() && !SecurityToken::IsInitialized())
{ {
@ -470,6 +471,12 @@ namespace VeraCrypt
#endif #endif
} }
void MainFrame::InitWindowPrivacy ()
{
Gui->SetContentProtection(!CmdLine->ArgAllowScreencapture);
}
void MainFrame::InitPreferences () void MainFrame::InitPreferences ()
{ {
try try

View File

@ -84,6 +84,7 @@ namespace VeraCrypt
void InitMessageFilter (); void InitMessageFilter ();
void InitPreferences (); void InitPreferences ();
void InitTaskBarIcon (); void InitTaskBarIcon ();
void InitWindowPrivacy();
bool IsFreeSlotSelected () const { return SlotListCtrl->GetSelectedItemCount() == 1 && Gui->GetListCtrlSubItemText (SlotListCtrl, SelectedItemIndex, ColumnPath).empty(); } bool IsFreeSlotSelected () const { return SlotListCtrl->GetSelectedItemCount() == 1 && Gui->GetListCtrlSubItemText (SlotListCtrl, SelectedItemIndex, ColumnPath).empty(); }
bool IsMountedSlotSelected () const { return SlotListCtrl->GetSelectedItemCount() == 1 && !Gui->GetListCtrlSubItemText (SlotListCtrl, SelectedItemIndex, ColumnPath).empty(); } bool IsMountedSlotSelected () const { return SlotListCtrl->GetSelectedItemCount() == 1 && !Gui->GetListCtrlSubItemText (SlotListCtrl, SelectedItemIndex, ColumnPath).empty(); }
void LoadFavoriteVolumes (); void LoadFavoriteVolumes ();

View File

@ -1874,6 +1874,14 @@ namespace VeraCrypt
listCtrl->SetMinSize (wxSize (width, listCtrl->GetMinSize().GetHeight())); listCtrl->SetMinSize (wxSize (width, listCtrl->GetMinSize().GetHeight()));
} }
void GraphicUserInterface::SetContentProtection (bool enable) const
{
#if defined(TC_WINDOWS) || defined(TC_MACOSX)
GetActiveWindow()->SetContentProtection(enable ? wxCONTENT_PROTECTION_ENABLED : wxCONTENT_PROTECTION_NONE);
#endif
}
void GraphicUserInterface::ShowErrorTopMost (const wxString &message) const void GraphicUserInterface::ShowErrorTopMost (const wxString &message) const
{ {
ShowMessage (message, wxOK | wxICON_ERROR, true); ShowMessage (message, wxOK | wxICON_ERROR, true);

View File

@ -86,6 +86,7 @@ namespace VeraCrypt
virtual void SetListCtrlColumnWidths (wxListCtrl *listCtrl, list <int> columnWidthPermilles, bool hasVerticalScrollbar = true) const; virtual void SetListCtrlColumnWidths (wxListCtrl *listCtrl, list <int> columnWidthPermilles, bool hasVerticalScrollbar = true) const;
virtual void SetListCtrlHeight (wxListCtrl *listCtrl, size_t rowCount) const; virtual void SetListCtrlHeight (wxListCtrl *listCtrl, size_t rowCount) const;
virtual void SetListCtrlWidth (wxListCtrl *listCtrl, size_t charCount, bool hasVerticalScrollbar = true) const; virtual void SetListCtrlWidth (wxListCtrl *listCtrl, size_t charCount, bool hasVerticalScrollbar = true) const;
virtual void SetContentProtection(bool enable) const;
virtual void ShowErrorTopMost (char *langStringId) const { ShowErrorTopMost (LangString[langStringId]); } virtual void ShowErrorTopMost (char *langStringId) const { ShowErrorTopMost (LangString[langStringId]); }
virtual void ShowErrorTopMost (const wxString &message) const; virtual void ShowErrorTopMost (const wxString &message) const;
virtual void ShowInfoTopMost (char *langStringId) const { ShowInfoTopMost (LangString[langStringId]); } virtual void ShowInfoTopMost (char *langStringId) const { ShowInfoTopMost (LangString[langStringId]); }