summaryrefslogtreecommitdiff
path: root/src/mir_app
diff options
context:
space:
mode:
authorGeorge Hazan <ghazan@miranda.im>2022-08-05 17:47:29 +0300
committerGeorge Hazan <ghazan@miranda.im>2022-08-05 17:47:29 +0300
commit1f3b7b5cfc7ca3bf335ed3fc062a0009e0a9dcb8 (patch)
tree4a82446b0571835ec396b075d345e263fdd2f5a7 /src/mir_app
parentde19bf751523d8c78701accc110eae5538cffca4 (diff)
fixes #3143 (autoexec_*.ini не стираются после импорта, хотя для этого достаточно прав)
Diffstat (limited to 'src/mir_app')
-rw-r--r--src/mir_app/src/db_ini.cpp6
-rw-r--r--src/mir_app/src/mir_app.def2
-rw-r--r--src/mir_app/src/mir_app64.def2
-rw-r--r--src/mir_app/src/pu_utils.cpp27
4 files changed, 22 insertions, 15 deletions
diff --git a/src/mir_app/src/db_ini.cpp b/src/mir_app/src/db_ini.cpp
index 8c8ac9d1f4..8ce8f88385 100644
--- a/src/mir_app/src/db_ini.cpp
+++ b/src/mir_app/src/db_ini.cpp
@@ -30,19 +30,19 @@ static HANDLE hIniChangeNotification;
static void MyMoveFile(const wchar_t *pwszFrom, const wchar_t *pwszTo)
{
- if (PU::PrepareEscalation())
+ if (PU::PrepareEscalation(pwszTo))
PU::SafeMoveFile(pwszFrom, pwszTo);
}
static void MyDeleteFile(const wchar_t *pwszFileName)
{
- if (PU::PrepareEscalation())
+ if (PU::PrepareEscalation(pwszFileName))
PU::SafeDeleteFile(pwszFileName);
}
static void ToRecycleBin(const wchar_t *pwszFileName)
{
- if (PU::PrepareEscalation())
+ if (PU::PrepareEscalation(pwszFileName))
PU::SafeRecycleBin(pwszFileName);
}
diff --git a/src/mir_app/src/mir_app.def b/src/mir_app/src/mir_app.def
index f49cd58964..3bb3706b0b 100644
--- a/src/mir_app/src/mir_app.def
+++ b/src/mir_app/src/mir_app.def
@@ -738,7 +738,7 @@ Chat_CreateMenu @824 NONAME
_Netlib_GetTlsUnique@12 @831 NONAME
?IsDirect@PU@@YG_NXZ @832 NONAME
?IsProcessElevated@PU@@YG_NXZ @833 NONAME
-?PrepareEscalation@PU@@YG_NXZ @834 NONAME
+?PrepareEscalation@PU@@YG_NPB_W@Z @834 NONAME
?SafeCopyFile@PU@@YGHPB_W0@Z @835 NONAME
?SafeCreateDirectory@PU@@YGHPB_W@Z @836 NONAME
?SafeCreateFilePath@PU@@YGHPB_W@Z @837 NONAME
diff --git a/src/mir_app/src/mir_app64.def b/src/mir_app/src/mir_app64.def
index 249613f8b9..3f49b78264 100644
--- a/src/mir_app/src/mir_app64.def
+++ b/src/mir_app/src/mir_app64.def
@@ -738,7 +738,7 @@ Chat_CreateMenu @824 NONAME
Netlib_GetTlsUnique @831 NONAME
?IsDirect@PU@@YA_NXZ @832 NONAME
?IsProcessElevated@PU@@YA_NXZ @833 NONAME
-?PrepareEscalation@PU@@YA_NXZ @834 NONAME
+?PrepareEscalation@PU@@YA_NPEB_W@Z @834 NONAME
?SafeCopyFile@PU@@YAHPEB_W0@Z @835 NONAME
?SafeCreateDirectory@PU@@YAHPEB_W@Z @836 NONAME
?SafeCreateFilePath@PU@@YAHPEB_W@Z @837 NONAME
diff --git a/src/mir_app/src/pu_utils.cpp b/src/mir_app/src/pu_utils.cpp
index 622f483705..9495031fe7 100644
--- a/src/mir_app/src/pu_utils.cpp
+++ b/src/mir_app/src/pu_utils.cpp
@@ -133,21 +133,27 @@ Cleanup:
/////////////////////////////////////////////////////////////////////////////////////////
// Launches pu_stub.exe with elevated priviledges if needed
-MIR_APP_DLL(bool) PU::PrepareEscalation()
+MIR_APP_DLL(bool) PU::PrepareEscalation(const wchar_t *pwszFile)
{
+ CMStringW wszFilePath;
// First try to create a file near Miranda32.exe
- wchar_t szPath[MAX_PATH];
- GetModuleFileName(nullptr, szPath, _countof(szPath));
- wchar_t *ext = wcsrchr(szPath, '.');
- if (ext != nullptr)
- *ext = '\0';
- wcscat(szPath, L".test");
+ if (pwszFile == nullptr) {
+ wchar_t szPath[MAX_PATH];
+ GetModuleFileName(nullptr, szPath, _countof(szPath));
+ wchar_t *ext = wcsrchr(szPath, '.');
+ if (ext != nullptr)
+ *ext = '\0';
+ wszFilePath = szPath;
+ }
+ else wszFilePath = pwszFile;
+
+ wszFilePath.Append(L".test");
- HANDLE hFile = CreateFile(szPath, GENERIC_WRITE, FILE_SHARE_READ, nullptr, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr);
+ HANDLE hFile = CreateFileW(wszFilePath, GENERIC_WRITE, FILE_SHARE_READ, nullptr, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr);
if (hFile != INVALID_HANDLE_VALUE) {
// we are admins or UAC is disable, cool
CloseHandle(hFile);
- DeleteFileW(szPath);
+ DeleteFileW(wszFilePath);
return true;
}
@@ -168,7 +174,8 @@ MIR_APP_DLL(bool) PU::PrepareEscalation()
}
else {
wchar_t cmdLine[100], *p;
- GetModuleFileName(nullptr, szPath, ARRAYSIZE(szPath));
+ wchar_t szPath[MAX_PATH];
+ GetModuleFileName(nullptr, szPath, _countof(szPath));
if ((p = wcsrchr(szPath, '\\')) != nullptr)
wcscpy(p + 1, L"pu_stub.exe");
mir_snwprintf(cmdLine, L"%d", GetCurrentProcessId());