[win] updatesvc, online-installer: refactoring utils

This commit is contained in:
SimplestStudio
2024-10-06 12:51:19 +03:00
parent 85be893132
commit 925aa905d9
2 changed files with 26 additions and 34 deletions

View File

@ -80,9 +80,10 @@ namespace NS_Utils
size_t size = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, errID, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&msgBuff, 0, NULL);
wstring msg = _TR(LABEL_ERR_COMMON) + wstring(L" ") + std::to_wstring(errID);
if (size > 0)
if (size > 0) {
msg.append(L"\n" + wstring(msgBuff, (int)size));
LocalFree(msgBuff);
LocalFree(msgBuff);
}
return msg;
}

View File

@ -67,6 +67,27 @@ static DWORD GetActiveSessionId()
return sesId;
}
static bool GetDuplicateToken(HANDLE &hTokenDup)
{
DWORD sesId = GetActiveSessionId();
if (sesId == 0xFFFFFFFF) {
NS_Logger::WriteLog(ADVANCED_ERROR_MESSAGE);
return false;
}
HANDLE hUserToken = NULL;
if (!WTSQueryUserToken(sesId, &hUserToken)) {
NS_Logger::WriteLog(ADVANCED_ERROR_MESSAGE);
return false;
}
if (!DuplicateTokenEx(hUserToken, MAXIMUM_ALLOWED, NULL, SecurityImpersonation, TokenPrimary, &hTokenDup)) {
CloseHandle(hUserToken);
NS_Logger::WriteLog(ADVANCED_ERROR_MESSAGE);
return false;
}
CloseHandle(hUserToken);
return true;
}
namespace NS_Utils
{
bool run_as_app = false;
@ -314,26 +335,14 @@ namespace NS_File
return false;
}
DWORD dwSessionId = GetActiveSessionId();
if (dwSessionId == 0xFFFFFFFF) {
return false;
}
HANDLE hUserToken = NULL;
if (!WTSQueryUserToken(dwSessionId, &hUserToken)) {
return false;
}
HANDLE hTokenDup = NULL;
if (!DuplicateTokenEx(hUserToken, MAXIMUM_ALLOWED, NULL, SecurityImpersonation, TokenPrimary, &hTokenDup)) {
CloseHandle(hUserToken);
if (!GetDuplicateToken(hTokenDup)) {
return false;
}
LPVOID lpvEnv = NULL;
if (!CreateEnvironmentBlock(&lpvEnv, hTokenDup, TRUE)) {
CloseHandle(hTokenDup);
CloseHandle(hUserToken);
return false;
}
@ -352,12 +361,10 @@ namespace NS_File
CloseHandle(pi.hProcess);
DestroyEnvironmentBlock(lpvEnv);
CloseHandle(hTokenDup);
CloseHandle(hUserToken);
return true;
}
DestroyEnvironmentBlock(lpvEnv);
CloseHandle(hTokenDup);
CloseHandle(hUserToken);
return false;
}
@ -554,33 +561,17 @@ namespace NS_File
return fallbackTempPath();
}
DWORD sesId = GetActiveSessionId();
if (sesId == 0xFFFFFFFF) {
NS_Logger::WriteLog(ADVANCED_ERROR_MESSAGE);
return fallbackTempPath();
}
HANDLE hUserToken = NULL;
if (!WTSQueryUserToken(sesId, &hUserToken)) {
NS_Logger::WriteLog(ADVANCED_ERROR_MESSAGE);
return fallbackTempPath();
}
HANDLE hTokenDup = NULL;
if (!DuplicateTokenEx(hUserToken, MAXIMUM_ALLOWED, NULL, SecurityImpersonation, TokenPrimary, &hTokenDup)) {
CloseHandle(hUserToken);
NS_Logger::WriteLog(ADVANCED_ERROR_MESSAGE);
if (!GetDuplicateToken(hTokenDup)) {
return fallbackTempPath();
}
WCHAR buff[MAX_PATH] = {0};
if (ExpandEnvironmentStringsForUser(hTokenDup, L"%TEMP%", buff, MAX_PATH)) {
CloseHandle(hTokenDup);
CloseHandle(hUserToken);
return fromNativeSeparators(buff);
}
CloseHandle(hTokenDup);
CloseHandle(hUserToken);
NS_Logger::WriteLog(ADVANCED_ERROR_MESSAGE);
return fallbackTempPath();
}