fix #208: refactor code

This commit is contained in:
Callow 2022-07-13 12:06:40 +03:00
parent 7f93c90255
commit 2a2d55f2c8

View File

@ -72,56 +72,67 @@ bool OpenGenshinProcess(HANDLE* phProcess, HANDLE* phThread)
HANDLE hToken; HANDLE hToken;
BOOL TokenRet = OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &hToken); BOOL TokenRet = OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &hToken);
if (!TokenRet) { if (!TokenRet)
{
LOG_LAST_ERROR("Privilege escalation failed!"); LOG_LAST_ERROR("Privilege escalation failed!");
return false; return false;
} }
bool OpenRet = false;
auto filePath = util::GetOrSelectPath(ini, "Inject", "GenshinPath", "genshin path", "Executable\0GenshinImpact.exe;YuanShen.exe\0"); auto filePath = util::GetOrSelectPath(ini, "Inject", "GenshinPath", "genshin path", "Executable\0GenshinImpact.exe;YuanShen.exe\0");
auto commandline = ini.GetValue("Inject", "GenshinCommandLine"); auto commandline = ini.GetValue("Inject", "GenshinCommandLine");
LPSTR lpstr = commandline == nullptr ? nullptr : const_cast<LPSTR>(commandline); LPSTR lpstr = commandline == nullptr ? nullptr : const_cast<LPSTR>(commandline);
if (!filePath) if (!filePath)
return false; return false;
DWORD pid = FindProcessId("explorer.exe");
DWORD pid = FindProcessId("explorer.exe");
if (pid == 0) if (pid == 0)
{ {
LOG_ERROR("Can't find 'explorer' pid!"); LOG_ERROR("Can't find 'explorer' pid!");
return false; return false;
} }
std::string CurrentDirectory = filePath.value(); std::string CurrentDirectory = filePath.value();
int pos = CurrentDirectory.rfind("\\", CurrentDirectory.length()); int pos = CurrentDirectory.rfind("\\", CurrentDirectory.length());
CurrentDirectory = CurrentDirectory.substr(0, pos); CurrentDirectory = CurrentDirectory.substr(0, pos);
LOG_INFO("%s", CurrentDirectory.data());
HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid); HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
STARTUPINFOEXA si;
ZeroMemory(&si, sizeof(si));
si.StartupInfo.cb = sizeof(si);
SIZE_T lpsize = 0; SIZE_T lpsize = 0;
InitializeProcThreadAttributeList(NULL, 1, 0, &lpsize); InitializeProcThreadAttributeList(NULL, 1, 0, &lpsize);
char* temp = new char[lpsize]; char* temp = new char[lpsize];
LPPROC_THREAD_ATTRIBUTE_LIST AttributeList = (LPPROC_THREAD_ATTRIBUTE_LIST)temp; LPPROC_THREAD_ATTRIBUTE_LIST AttributeList = (LPPROC_THREAD_ATTRIBUTE_LIST)temp;
InitializeProcThreadAttributeList(AttributeList, 1, 0, &lpsize); InitializeProcThreadAttributeList(AttributeList, 1, 0, &lpsize);
if (!UpdateProcThreadAttribute(AttributeList, 0, PROC_THREAD_ATTRIBUTE_PARENT_PROCESS, &handle, sizeof(HANDLE), NULL, NULL)) if (!UpdateProcThreadAttribute(AttributeList, 0, PROC_THREAD_ATTRIBUTE_PARENT_PROCESS,
&handle, sizeof(HANDLE), NULL, NULL))
{ {
LOG_WARNING("UpdateProcThreadAttribute failed ! (%d).\n", GetLastError()); LOG_WARNING("UpdateProcThreadAttribute failed ! (%d).\n", GetLastError());
} }
STARTUPINFOEXA si{};
si.StartupInfo.cb = sizeof(si);
si.lpAttributeList = AttributeList; si.lpAttributeList = AttributeList;
PROCESS_INFORMATION pi;
ZeroMemory(&pi, sizeof(pi)); PROCESS_INFORMATION pi{};
BOOL result = CreateProcessAsUserA(hToken, const_cast<LPSTR>(filePath->data()), lpstr, BOOL result = CreateProcessAsUserA(hToken, const_cast<LPSTR>(filePath->data()), lpstr,
0, 0, 0, EXTENDED_STARTUPINFO_PRESENT | CREATE_SUSPENDED, 0, (LPSTR)CurrentDirectory.data(), (LPSTARTUPINFOA)&si, &pi); 0, 0, 0, EXTENDED_STARTUPINFO_PRESENT | CREATE_SUSPENDED, 0,
if (result == FALSE) (LPSTR)CurrentDirectory.data(), (LPSTARTUPINFOA)&si, &pi);
bool isOpened = result;
if (isOpened)
{
ini.SaveFile("cfg.ini");
*phThread = pi.hThread;
*phProcess = pi.hProcess;
}
else
{ {
LOG_LAST_ERROR("Failed to create game process."); LOG_LAST_ERROR("Failed to create game process.");
LOG_ERROR("If you have problem with GenshinImpact.exe path. You can change it manually in cfg.ini."); LOG_ERROR("If you have problem with GenshinImpact.exe path. You can change it manually in cfg.ini.");
goto End;
} }
ini.SaveFile("cfg.ini");
*phThread = pi.hThread;
*phProcess = pi.hProcess;
OpenRet = true;
End:
DeleteProcThreadAttributeList(AttributeList); DeleteProcThreadAttributeList(AttributeList);
delete temp; delete[] temp;
return OpenRet; return isOpened;
} }