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