diff --git a/Versions/build.txt b/Versions/build.txt index 1e8b31496..0cfbf0888 100644 --- a/Versions/build.txt +++ b/Versions/build.txt @@ -1 +1 @@ -6 +2 diff --git a/Versions/day.txt b/Versions/day.txt index a1e0432c9..5478c714f 100644 --- a/Versions/day.txt +++ b/Versions/day.txt @@ -1 +1 @@ -312 +313 diff --git a/minipath/src/Config.cpp b/minipath/src/Config.cpp index f193bf423..1de6a8c89 100644 --- a/minipath/src/Config.cpp +++ b/minipath/src/Config.cpp @@ -75,7 +75,7 @@ constexpr bool SI_Success(const SI_Error rc) noexcept { // of complete file to preserve integrety of any transaction // ---------------------------------------------------------------------------- -HANDLE AcquireFileLock(LPCWSTR lpIniFilePath, OVERLAPPED& rOvrLpd) +HANDLE AcquireWriteFileLock(LPCWSTR lpIniFilePath, OVERLAPPED& rOvrLpd) { HANDLE hFile = CreateFile(lpIniFilePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, @@ -89,6 +89,20 @@ HANDLE AcquireFileLock(LPCWSTR lpIniFilePath, OVERLAPPED& rOvrLpd) // ---------------------------------------------------------------------------- +HANDLE AcquireReadFileLock(LPCWSTR lpIniFilePath, OVERLAPPED& rOvrLpd) +{ + HANDLE hFile = CreateFile(lpIniFilePath, + GENERIC_READ, FILE_SHARE_READ, + nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr); + + DWORD const flags = LOCKFILE_EXCLUSIVE_LOCK; + bool const bLocked = LockFileEx(hFile, flags, 0, MAXDWORD, 0, &rOvrLpd); + + return (bLocked ? hFile : INVALID_HANDLE_VALUE); +} + +// ---------------------------------------------------------------------------- + bool ReleaseFileLock(HANDLE hFile, OVERLAPPED& rOvrLpd) { bool bUnLocked = true; @@ -110,13 +124,15 @@ static HANDLE s_INI_Hndl = INVALID_HANDLE_VALUE; static CSimpleIni s_INI(s_bIsUTF8, s_bUseMultiKey, s_bUseMultiLine); -extern "C" BOOL LoadIniFile(LPCWSTR lpIniFilePath) +extern "C" BOOL LoadIniFile(LPCWSTR lpIniFilePath, BOOL bNeedReadWriteAccess) { s_INI.Reset(); s_INI.SetSpaces(s_bSetSpaces); s_INI.SetMultiLine(s_bUseMultiLine); - s_INI_Hndl = AcquireFileLock(lpIniFilePath, s_OvrLpd); + s_INI_Hndl = bNeedReadWriteAccess ? AcquireWriteFileLock(lpIniFilePath, s_OvrLpd) : + AcquireReadFileLock(lpIniFilePath, s_OvrLpd);; + if (s_INI_Hndl == INVALID_HANDLE_VALUE) { return false; } @@ -316,7 +332,7 @@ extern "C" size_t IniFileGetString(LPCWSTR lpFilePath, LPCWSTR lpSectionName, LP CSimpleIni Ini(s_bIsUTF8, s_bUseMultiKey, s_bUseMultiLine); OVERLAPPED ovrLpd = { 0 }; - HANDLE hFile = AcquireFileLock(lpFilePath, ovrLpd); + HANDLE hFile = AcquireReadFileLock(lpFilePath, ovrLpd); if (hFile == INVALID_HANDLE_VALUE) { StringCchCopyW(lpReturnedString, cchReturnedString, lpDefault); return (size_t)lstrlen(lpReturnedString); @@ -344,7 +360,7 @@ extern "C" BOOL IniFileSetString(LPCWSTR lpFilePath, LPCWSTR lpSectionName, LPCW Ini.SetSpaces(s_bSetSpaces); OVERLAPPED ovrLpd = { 0 }; - HANDLE hFile = AcquireFileLock(lpFilePath, ovrLpd); + HANDLE hFile = AcquireWriteFileLock(lpFilePath, ovrLpd); if (hFile == INVALID_HANDLE_VALUE) { return false; } @@ -370,7 +386,7 @@ extern "C" int IniFileGetInt(LPCWSTR lpFilePath, LPCWSTR lpSectionName, LPCWSTR CSimpleIni Ini(s_bIsUTF8, s_bUseMultiKey, s_bUseMultiLine); OVERLAPPED ovrLpd = { 0 }; - HANDLE hFile = AcquireFileLock(lpFilePath, ovrLpd); + HANDLE hFile = AcquireReadFileLock(lpFilePath, ovrLpd); if (hFile == INVALID_HANDLE_VALUE) { return iDefault; } @@ -396,7 +412,7 @@ extern "C" BOOL IniFileSetInt(LPCWSTR lpFilePath, LPCWSTR lpSectionName, LPCWSTR Ini.SetSpaces(s_bSetSpaces); OVERLAPPED ovrLpd = { 0 }; - HANDLE hFile = AcquireFileLock(lpFilePath, ovrLpd); + HANDLE hFile = AcquireWriteFileLock(lpFilePath, ovrLpd); if (hFile == INVALID_HANDLE_VALUE) { return false; } @@ -419,7 +435,7 @@ extern "C" BOOL IniFileGetBool(LPCWSTR lpFilePath, LPCWSTR lpSectionName, LPCWST CSimpleIni Ini(s_bIsUTF8, s_bUseMultiKey, s_bUseMultiLine); OVERLAPPED ovrLpd = { 0 }; - HANDLE hFile = AcquireFileLock(lpFilePath, ovrLpd); + HANDLE hFile = AcquireReadFileLock(lpFilePath, ovrLpd); if (hFile == INVALID_HANDLE_VALUE) { return bDefault; } @@ -445,7 +461,7 @@ extern "C" BOOL IniFileSetBool(LPCWSTR lpFilePath, LPCWSTR lpSectionName, LPCWST Ini.SetSpaces(s_bSetSpaces); OVERLAPPED ovrLpd = { 0 }; - HANDLE hFile = AcquireFileLock(lpFilePath, ovrLpd); + HANDLE hFile = AcquireWriteFileLock(lpFilePath, ovrLpd); if (hFile == INVALID_HANDLE_VALUE) { return false; } @@ -469,7 +485,7 @@ extern "C" BOOL IniFileDelete(LPCWSTR lpFilePath, LPCWSTR lpSectionName, LPCWSTR Ini.SetSpaces(s_bSetSpaces); OVERLAPPED ovrLpd = { 0 }; - HANDLE hFile = AcquireFileLock(lpFilePath, ovrLpd); + HANDLE hFile = AcquireWriteFileLock(lpFilePath, ovrLpd); if (hFile == INVALID_HANDLE_VALUE) { return false; } @@ -492,7 +508,7 @@ extern "C" BOOL IniFileIterateSection(LPCWSTR lpFilePath, LPCWSTR lpSectionName, CSimpleIni Ini(s_bIsUTF8, s_bUseMultiKey, s_bUseMultiLine); OVERLAPPED ovrLpd = { 0 }; - HANDLE hFile = AcquireFileLock(lpFilePath, ovrLpd); + HANDLE hFile = AcquireReadFileLock(lpFilePath, ovrLpd); if (hFile == INVALID_HANDLE_VALUE) { return false; } @@ -585,14 +601,15 @@ int CreateIniFile() } } else { - OVERLAPPED ovrLpd = { 0 }; - HANDLE hFile = AcquireFileLock(g_wchIniFile, ovrLpd); + HANDLE hFile = CreateFile(g_wchIniFile, + GENERIC_READ, FILE_SHARE_READ, + nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr); if (hFile == INVALID_HANDLE_VALUE) { return result; } DWORD dwFSHigh = 0UL; dwFileSize = GetFileSize(hFile, &dwFSHigh); - ReleaseFileLock(hFile, ovrLpd); + CloseHandle(hFile); } if ((dwFileSize == 0) && (dwFileSize != INVALID_FILE_SIZE)) { @@ -819,7 +836,7 @@ void LoadFlags() { __try { - LoadIniFile(g_wchIniFile); + LoadIniFile(g_wchIniFile, FALSE); const WCHAR* const Settings_Section2 = L"Settings2"; @@ -875,7 +892,7 @@ void LoadSettings() { __try { - LoadIniFile(g_wchIniFile); + LoadIniFile(g_wchIniFile, FALSE); const WCHAR* const Settings_Section = L"Settings"; @@ -1056,7 +1073,7 @@ void SaveSettings(BOOL bSaveSettingsNow) __try { - LoadIniFile(g_wchIniFile); + LoadIniFile(g_wchIniFile, TRUE); const WCHAR* const Settings_Section = L"Settings"; diff --git a/minipath/src/Config.h b/minipath/src/Config.h index a4c4a9aff..988496b43 100644 --- a/minipath/src/Config.h +++ b/minipath/src/Config.h @@ -37,7 +37,7 @@ extern "C" { // ---------------------------------------------------------------------------- - BOOL LoadIniFile(LPCWSTR lpIniFilePath); + BOOL LoadIniFile(LPCWSTR lpIniFilePath, BOOL bNeedReadWriteAccess); BOOL SaveIniFile(); void ReleaseIniFile(); diff --git a/minipath/src/Dialogs.c b/minipath/src/Dialogs.c index 368537a45..24225708e 100644 --- a/minipath/src/Dialogs.c +++ b/minipath/src/Dialogs.c @@ -2700,7 +2700,7 @@ INT_PTR CALLBACK FindTargetDlgProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lPar __try { - LoadIniFile(g_wchIniFile); + LoadIniFile(g_wchIniFile, TRUE); const WCHAR* const TargetApp_Section = L"Target Application"; diff --git a/minipath/src/Helpers.c b/minipath/src/Helpers.c index 5d12bc37d..f1b50d470 100644 --- a/minipath/src/Helpers.c +++ b/minipath/src/Helpers.c @@ -1530,7 +1530,7 @@ BOOL MRU_Load(LPMRULIST pmru) { MRU_Empty(pmru); __try { - LoadIniFile(g_wchIniFile); + LoadIniFile(g_wchIniFile, FALSE); const WCHAR* const RegKey_Section = pmru->szRegKey; @@ -1555,7 +1555,7 @@ BOOL MRU_Load(LPMRULIST pmru) { BOOL MRU_Save(LPMRULIST pmru) { __try { - LoadIniFile(g_wchIniFile); + LoadIniFile(g_wchIniFile, TRUE); WCHAR tchName[32]; WCHAR tchItem[1024] = { L'\0' }; @@ -1572,7 +1572,7 @@ BOOL MRU_Save(LPMRULIST pmru) { } } __finally { - SaveIniFile(g_wchIniFile); + SaveIniFile(); } return TRUE; } diff --git a/minipath/src/minipath.c b/minipath/src/minipath.c index 2f74b53d4..4c5af5419 100644 --- a/minipath/src/minipath.c +++ b/minipath/src/minipath.c @@ -1163,7 +1163,7 @@ void CreateBars(HWND hwnd,HINSTANCE hInstance) // Load toolbar labels __try { - LoadIniFile(g_wchIniFile); + LoadIniFile(g_wchIniFile, FALSE); const WCHAR* const ToolbarLabels_Section = L"Toolbar Labels"; n = 0; @@ -3330,7 +3330,7 @@ void LoadTargetParamsOnce(void) return; __try { - LoadIniFile(g_wchIniFile); + LoadIniFile(g_wchIniFile, FALSE); const WCHAR* const TargetApp_Section = L"Target Application"; if (IniSectionGetInt(TargetApp_Section, L"UseTargetApplication", 0xFB) != 0xFB) { diff --git a/res/Notepad3.exe.manifest.conf b/res/Notepad3.exe.manifest.conf index 40d30beb7..2d98feed8 100644 --- a/res/Notepad3.exe.manifest.conf +++ b/res/Notepad3.exe.manifest.conf @@ -3,7 +3,7 @@ Notepad3 RC3 diff --git a/src/Config/Config.cpp b/src/Config/Config.cpp index 32180e33a..ebb3f0a72 100644 --- a/src/Config/Config.cpp +++ b/src/Config/Config.cpp @@ -89,7 +89,7 @@ constexpr bool SI_Success(const SI_Error rc) noexcept { // of complete file to preserve integrety of any transaction // ---------------------------------------------------------------------------- -HANDLE AcquireFileLock(LPCWSTR lpIniFilePath, OVERLAPPED& rOvrLpd) +HANDLE AcquireWriteFileLock(LPCWSTR lpIniFilePath, OVERLAPPED& rOvrLpd) { HANDLE hFile = CreateFile(lpIniFilePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, @@ -103,6 +103,20 @@ HANDLE AcquireFileLock(LPCWSTR lpIniFilePath, OVERLAPPED& rOvrLpd) // ---------------------------------------------------------------------------- +HANDLE AcquireReadFileLock(LPCWSTR lpIniFilePath, OVERLAPPED& rOvrLpd) +{ + HANDLE hFile = CreateFile(lpIniFilePath, + GENERIC_READ, FILE_SHARE_READ, + nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr); + + DWORD const flags = LOCKFILE_EXCLUSIVE_LOCK; + bool const bLocked = LockFileEx(hFile, flags, 0, MAXDWORD, 0, &rOvrLpd); + + return (bLocked ? hFile : INVALID_HANDLE_VALUE); +} + +// ---------------------------------------------------------------------------- + bool ReleaseFileLock(HANDLE hFile, OVERLAPPED& rOvrLpd) { bool bUnLocked = true; @@ -124,13 +138,15 @@ static HANDLE s_INI_Hndl = INVALID_HANDLE_VALUE; static CSimpleIni s_INI(s_bIsUTF8, s_bUseMultiKey, s_bUseMultiLine); -extern "C" bool LoadIniFile(LPCWSTR lpIniFilePath) +extern "C" bool LoadIniFile(LPCWSTR lpIniFilePath, bool bNeedReadWriteAccess) { s_INI.Reset(); s_INI.SetSpaces(s_bSetSpaces); s_INI.SetMultiLine(s_bUseMultiLine); - s_INI_Hndl = AcquireFileLock(lpIniFilePath, s_OvrLpd); + s_INI_Hndl = bNeedReadWriteAccess ? AcquireWriteFileLock(lpIniFilePath, s_OvrLpd) : + AcquireReadFileLock(lpIniFilePath, s_OvrLpd);; + if (s_INI_Hndl == INVALID_HANDLE_VALUE) { return false; } @@ -330,7 +346,7 @@ extern "C" size_t IniFileGetString(LPCWSTR lpFilePath, LPCWSTR lpSectionName, LP CSimpleIni Ini(s_bIsUTF8, s_bUseMultiKey, s_bUseMultiLine); OVERLAPPED ovrLpd = { 0 }; - HANDLE hFile = AcquireFileLock(lpFilePath, ovrLpd); + HANDLE hFile = AcquireReadFileLock(lpFilePath, ovrLpd); if (hFile == INVALID_HANDLE_VALUE) { StringCchCopyW(lpReturnedString, cchReturnedString, lpDefault); return StringCchLenW(lpReturnedString, cchReturnedString); @@ -358,7 +374,7 @@ extern "C" bool IniFileSetString(LPCWSTR lpFilePath, LPCWSTR lpSectionName, LPCW Ini.SetSpaces(s_bSetSpaces); OVERLAPPED ovrLpd = { 0 }; - HANDLE hFile = AcquireFileLock(lpFilePath, ovrLpd); + HANDLE hFile = AcquireWriteFileLock(lpFilePath, ovrLpd); if (hFile == INVALID_HANDLE_VALUE) { return false; } @@ -384,7 +400,7 @@ extern "C" int IniFileGetInt(LPCWSTR lpFilePath, LPCWSTR lpSectionName, LPCWSTR CSimpleIni Ini(s_bIsUTF8, s_bUseMultiKey, s_bUseMultiLine); OVERLAPPED ovrLpd = { 0 }; - HANDLE hFile = AcquireFileLock(lpFilePath, ovrLpd); + HANDLE hFile = AcquireReadFileLock(lpFilePath, ovrLpd); if (hFile == INVALID_HANDLE_VALUE) { return iDefault; } @@ -410,7 +426,7 @@ extern "C" bool IniFileSetInt(LPCWSTR lpFilePath, LPCWSTR lpSectionName, LPCWSTR Ini.SetSpaces(s_bSetSpaces); OVERLAPPED ovrLpd = { 0 }; - HANDLE hFile = AcquireFileLock(lpFilePath, ovrLpd); + HANDLE hFile = AcquireWriteFileLock(lpFilePath, ovrLpd); if (hFile == INVALID_HANDLE_VALUE) { return false; } @@ -433,7 +449,7 @@ extern "C" bool IniFileGetBool(LPCWSTR lpFilePath, LPCWSTR lpSectionName, LPCWST CSimpleIni Ini(s_bIsUTF8, s_bUseMultiKey, s_bUseMultiLine); OVERLAPPED ovrLpd = { 0 }; - HANDLE hFile = AcquireFileLock(lpFilePath, ovrLpd); + HANDLE hFile = AcquireReadFileLock(lpFilePath, ovrLpd); if (hFile == INVALID_HANDLE_VALUE) { return bDefault; } @@ -459,7 +475,7 @@ extern "C" bool IniFileSetBool(LPCWSTR lpFilePath, LPCWSTR lpSectionName, LPCWST Ini.SetSpaces(s_bSetSpaces); OVERLAPPED ovrLpd = { 0 }; - HANDLE hFile = AcquireFileLock(lpFilePath, ovrLpd); + HANDLE hFile = AcquireWriteFileLock(lpFilePath, ovrLpd); if (hFile == INVALID_HANDLE_VALUE) { return false; } @@ -483,7 +499,7 @@ extern "C" bool IniFileDelete(LPCWSTR lpFilePath, LPCWSTR lpSectionName, LPCWSTR Ini.SetSpaces(s_bSetSpaces); OVERLAPPED ovrLpd = { 0 }; - HANDLE hFile = AcquireFileLock(lpFilePath, ovrLpd); + HANDLE hFile = AcquireWriteFileLock(lpFilePath, ovrLpd); if (hFile == INVALID_HANDLE_VALUE) { return false; } @@ -506,7 +522,7 @@ extern "C" bool IniFileIterateSection(LPCWSTR lpFilePath, LPCWSTR lpSectionName, CSimpleIni Ini(s_bIsUTF8, s_bUseMultiKey, s_bUseMultiLine); OVERLAPPED ovrLpd = { 0 }; - HANDLE hFile = AcquireFileLock(lpFilePath, ovrLpd); + HANDLE hFile = AcquireReadFileLock(lpFilePath, ovrLpd); if (hFile == INVALID_HANDLE_VALUE) { return false; } @@ -790,16 +806,17 @@ extern "C" bool CreateIniFile() } } else { - OVERLAPPED ovrLpd = { 0 }; - HANDLE hFile = AcquireFileLock(Globals.IniFile, ovrLpd); + HANDLE hFile = CreateFile(Globals.IniFile, + GENERIC_READ, FILE_SHARE_READ, + nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr); if (hFile == INVALID_HANDLE_VALUE) { Globals.dwLastError = GetLastError(); - MsgBoxLastError(L"Accessing Settings-File failed!", Globals.dwLastError); + MsgBoxLastError(L"Read Access to Settings-File failed!", Globals.dwLastError); return result; } DWORD dwFSHigh = 0UL; dwFileSize = GetFileSize(hFile, &dwFSHigh); - ReleaseFileLock(hFile, ovrLpd); + CloseHandle(hFile); } if ((dwFileSize == 0) && (dwFileSize != INVALID_FILE_SIZE)) { @@ -827,7 +844,7 @@ bool OpenSettingsFile() if (StrIsNotEmpty(Globals.IniFile)) { CreateIniFile(); if (!IsIniFileLoaded()) { - LoadIniFile(Globals.IniFile); + LoadIniFile(Globals.IniFile, true); } } return IsIniFileLoaded(); diff --git a/src/Config/Config.h b/src/Config/Config.h index ba9c198a9..3f2c749fc 100644 --- a/src/Config/Config.h +++ b/src/Config/Config.h @@ -37,7 +37,7 @@ bool CloseSettingsFile(bool bSaveChanges); // ---------------------------------------------------------------------------- -bool LoadIniFile(LPCWSTR lpIniFilePath); +bool LoadIniFile(LPCWSTR lpIniFilePath, bool bNeedReadWriteAccess); bool IsIniFileLoaded(); void ReleaseIniFile(); bool SaveIniFile(); diff --git a/src/Styles.c b/src/Styles.c index 2cace19bc..b2e112f27 100644 --- a/src/Styles.c +++ b/src/Styles.c @@ -544,7 +544,7 @@ bool Style_ImportFromFile(const WCHAR* szFile) if (bResetToDefault) { ReleaseIniFile(); } - bool result = !bResetToDefault ? LoadIniFile(szFile) : true; + bool result = !bResetToDefault ? LoadIniFile(szFile, false) : true; if (result) { @@ -825,7 +825,7 @@ bool Style_ExportToFile(const WCHAR* szFile, bool bForceAll) } } else { - LoadIniFile(szFilePathNorm); // reset + LoadIniFile(szFilePathNorm, true); // reset Style_ToIniSection(bForceAll); ok = SaveIniFile(); } diff --git a/src/VersionEx.h b/src/VersionEx.h index 728ce485a..4141a7398 100644 --- a/src/VersionEx.h +++ b/src/VersionEx.h @@ -8,8 +8,8 @@ #define SAPPNAME "Notepad3" #define VERSION_MAJOR 5 #define VERSION_MINOR 20 -#define VERSION_REV 312 -#define VERSION_BUILD 6 +#define VERSION_REV 313 +#define VERSION_BUILD 2 #define SCINTILLA_VER 432 #define ONIGURUMA_REGEX_VER 6.9.4 #define UCHARDET_VER 2018.09.27