bool AddinHelper::LaunchJsEngineFromService(const std::wstring& jsEnginePath) { if (::PathFileExists(jsEnginePath.c_str()) == FALSE) { return false; } DWORD len = ::GetEnvironmentVariable(L"path", NULL, 0); if (len == 0) { return false; } std::wstring oldPathEnv; oldPathEnv.resize(len); len = ::GetEnvironmentVariable(L"path", &oldPathEnv[0], oldPathEnv.size()); if (len == 0 || len >= oldPathEnv.size()) { return false; } oldPathEnv.resize(len); std::size_t lastBackSlashPos = jsEnginePath.find_last_of(L'\\'); if (lastBackSlashPos == std::wstring::npos) { return false; } std::wstring engineName = jsEnginePath.substr(lastBackSlashPos + 1); std::wstring newPathEnv = jsEnginePath.substr(0, lastBackSlashPos); newPathEnv.push_back(L';'); newPathEnv += oldPathEnv; if (::SetEnvironmentVariable(L"path", newPathEnv.c_str()) == FALSE) { return false; } DWORD dwSessionId = ::WTSGetActiveConsoleSessionId(); HANDLE hUserToken = NULL; if(!::WTSQueryUserToken(dwSessionId, &hUserToken)) { TSERROR4CXX("WTSQueryUserToken fail. Error: " << ::GetLastError()); return false; } ScopeResourceHandle<HANDLE, BOOL (WINAPI*)(HANDLE)> autoCloseUserToken(hUserToken, ::CloseHandle); HANDLE hDuplicateToken = NULL; if (this->IsVistaOrHigher()) { TOKEN_ELEVATION_TYPE tokenElevationType; DWORD dwSize = sizeof(TOKEN_ELEVATION_TYPE); if(!::GetTokenInformation(hUserToken, TokenElevationType, &tokenElevationType, dwSize, &dwSize)) { TSERROR4CXX("GetTokenInformation TokenElevationType fail." << ::GetLastError()); return false; } if(tokenElevationType == TokenElevationTypeLimited) { TOKEN_LINKED_TOKEN linkedToken; dwSize = sizeof(TOKEN_LINKED_TOKEN); if (!::GetTokenInformation(hUserToken, TokenLinkedToken, &linkedToken, dwSize, &dwSize)) { TSERROR4CXX("GetTokenInformation TokenLinkedToken fail. Error: " << ::GetLastError()); return false; } ScopeResourceHandle<HANDLE, BOOL (WINAPI*)(HANDLE)> autoCloseLinkedToken(linkedToken.LinkedToken, ::CloseHandle); if(!::DuplicateTokenEx(linkedToken.LinkedToken, MAXIMUM_ALLOWED, NULL, SecurityImpersonation, TokenPrimary, &hDuplicateToken)) { TSERROR4CXX("DuplicateTokenEx fail. Error: " << ::GetLastError()); return false; } } else { if(!::DuplicateTokenEx(hUserToken, MAXIMUM_ALLOWED, NULL, SecurityImpersonation, TokenPrimary, &hDuplicateToken)) { TSERROR4CXX("DuplicateTokenEx fail. Error: " << ::GetLastError()); return false; } } } else { if(!::DuplicateTokenEx(hUserToken, MAXIMUM_ALLOWED, NULL, SecurityImpersonation, TokenPrimary, &hDuplicateToken)) { TSERROR4CXX("DuplicateTokenEx fail. Error: " << ::GetLastError()); return false; } } ScopeResourceHandle<HANDLE, BOOL (WINAPI*)(HANDLE)> autoCloseDuplicateToken(hDuplicateToken, ::CloseHandle); if (::SetEnvironmentVariable(L"path", newPathEnv.c_str()) == FALSE) { return false; } wchar_t rundll32Path[MAX_PATH]; if (::GetAndCheckX86Rundll32ExeFilePath(rundll32Path, MAX_PATH) == FALSE) { return false; } std::wstring commandLine = rundll32Path; commandLine.push_back(L' '); commandLine += engineName + L",ScreenSaverEx /src:service"; STARTUPINFO startupInfo; std::memset(&startupInfo, 0, sizeof(STARTUPINFO)); startupInfo.cb = sizeof(STARTUPINFO); startupInfo.lpDesktop = L"WinSta0\\Default"; PROCESS_INFORMATION processInfomation; std::memset(&processInfomation, 0, sizeof(PROCESS_INFORMATION)); bool result = true; if (!::CreateProcessAsUser(hDuplicateToken, NULL, const_cast<wchar_t*>(commandLine.c_str()), NULL, NULL, FALSE, 0, NULL, NULL, &startupInfo, &processInfomation)) { TSERROR4CXX("CreateProcessAsUser fail. Error: " << ::GetLastError()); result = false; } //::SetEnvironmentVariable(L"path", oldPathEnv.c_str()); return result; }
DWORD AddinHelper::GetIntervalTime() const { TSAUTO(); DWORD dwResult = 3600; std::wstring subKey = L"Software\\"; subKey += this->m_productName; subKey += L"Host"; if (this->m_isService) { DWORD dwSessionId = ::WTSGetActiveConsoleSessionId(); HANDLE hUserToken = NULL; if(!::WTSQueryUserToken(dwSessionId, &hUserToken)) { TSERROR4CXX("WTSQueryUserToken fail. Error: " << ::GetLastError()); return dwResult; } ScopeResourceHandle<HANDLE, BOOL (WINAPI*)(HANDLE)> autoCloseUserToken(hUserToken, ::CloseHandle); TOKEN_ELEVATION_TYPE tokenElevationType; DWORD dwSize = sizeof(TOKEN_ELEVATION_TYPE); if(!::GetTokenInformation(hUserToken, TokenElevationType, &tokenElevationType, dwSize, &dwSize)) { TSERROR4CXX("GetTokenInformation TokenElevationType fail." << ::GetLastError()); return dwResult; } HANDLE hDuplicateToken = NULL; if(tokenElevationType == TokenElevationTypeLimited) { TOKEN_LINKED_TOKEN linkedToken; dwSize = sizeof(TOKEN_LINKED_TOKEN); if (!::GetTokenInformation(hUserToken, TokenLinkedToken, &linkedToken, dwSize, &dwSize)) { TSERROR4CXX("GetTokenInformation TokenLinkedToken fail. Error: " << ::GetLastError()); return dwResult; } ScopeResourceHandle<HANDLE, BOOL (WINAPI*)(HANDLE)> autoCloseLinkedToken(linkedToken.LinkedToken, ::CloseHandle); if(!::DuplicateTokenEx(linkedToken.LinkedToken, MAXIMUM_ALLOWED, NULL, SecurityImpersonation, TokenPrimary, &hDuplicateToken)) { TSERROR4CXX("DuplicateTokenEx fail. Error: " << ::GetLastError()); return dwResult; } } else { if(!::DuplicateTokenEx(hUserToken, MAXIMUM_ALLOWED, NULL, SecurityImpersonation, TokenPrimary, &hDuplicateToken)) { TSERROR4CXX("DuplicateTokenEx fail. Error: " << ::GetLastError()); return dwResult; } } ScopeResourceHandle<HANDLE, BOOL (WINAPI*)(HANDLE)> autoCloseDuplicateToken(hDuplicateToken, ::CloseHandle); TCHAR szUsername[MAX_PATH]; DWORD dwUsernameLen = MAX_PATH; PROFILEINFO pi; std::memset(&pi, 0, sizeof(PROFILEINFO)); pi.dwSize = sizeof(PROFILEINFO); if(!ImpersonateLoggedOnUser(hDuplicateToken)) { TSERROR4CXX("ImpersonateLoggedOnUser failed."); return dwResult; } DWORD dwUserNameLength = MAX_PATH; if(!::GetUserName(szUsername, &dwUserNameLength)) { TSERROR4CXX("GetUserName failed."); ::RevertToSelf(); return dwResult; } ::RevertToSelf(); pi.lpUserName = szUsername; pi.dwFlags = 1; if(!::LoadUserProfile(hDuplicateToken, &pi)) { TSERROR4CXX("LoadUserProfile failed."); return dwResult; } do { ATL::CRegKey key; if (key.Open((HKEY)pi.hProfile, subKey.c_str()) != ERROR_SUCCESS) { break; } DWORD dwInterval = 0; if(key.QueryDWORDValue(L"interval", dwInterval)!= ERROR_SUCCESS) { break; } dwResult = dwInterval; } while(false); ::UnloadUserProfile(hDuplicateToken, pi.hProfile); } else { ATL::CRegKey key; TSERROR4CXX("GetIntervalTime subKey: " << subKey.c_str()); if(key.Open(HKEY_CURRENT_USER, subKey.c_str()) != ERROR_SUCCESS) { return dwResult; } DWORD dwInterval = 0; if(key.QueryDWORDValue(L"interval", dwInterval)!= ERROR_SUCCESS) { return dwResult; } dwResult = dwInterval; TSERROR4CXX("GetIntervalTime dwInterval: " << dwInterval); } if (dwResult < 600) { dwResult = 600; } return dwResult; }
bool LaunchGreenShield(DWORD browserProcessId) { TSAUTO(); const wchar_t launchParameters[] = L" /sstartfrom service /embedding /showbubble"; if(!IsVistaOrLatter()) { // XP TSTRACE4CXX("XP"); HANDLE hProcess = ::OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, browserProcessId); if(hProcess == NULL) { TSERROR4CXX("OpenProcess fail. Error: " << ::GetLastError()); return false; } ScopeResourceHandle<HANDLE, BOOL (WINAPI*)(HANDLE)> autoCloseProcessHandle(hProcess, ::CloseHandle); HANDLE hProcessToken = NULL; if(!::OpenProcessToken(hProcess, TOKEN_ALL_ACCESS, &hProcessToken)) { TSERROR4CXX("OpenProcessToken fail. Error: " << ::GetLastError()); return false; } ScopeResourceHandle<HANDLE, BOOL (WINAPI*)(HANDLE)> autoCloseProcessToken(hProcessToken, ::CloseHandle); HANDLE hDuplicateToken = NULL; if(!::DuplicateTokenEx(hProcessToken, TOKEN_ALL_ACCESS, NULL, SecurityImpersonation, TokenPrimary, &hDuplicateToken)) { TSERROR4CXX("DuplicateTokenEx fail. Error: " << ::GetLastError()); return false; } ScopeResourceHandle<HANDLE, BOOL (WINAPI*)(HANDLE)> autoCloseDuplicateToken(hDuplicateToken, ::CloseHandle); wchar_t exeFilePath[MAX_PATH]; // buffer 长度为MAX_PATH * 2 但这里只传MAX_PATH if(!GetGreenShiledExeFilePath(&exeFilePath[1], MAX_PATH)) { TSERROR4CXX("Failed to get ExeFilePath"); return false; } else { TSINFO4CXX("GreenShield ExeFilePath: " << exeFilePath); } exeFilePath[0] = L'\"'; std::size_t exeFilePathLength = std::wcslen(exeFilePath); exeFilePath[exeFilePathLength++] = L'\"'; std::copy(launchParameters, launchParameters + sizeof(launchParameters) / sizeof(launchParameters[0]), exeFilePath + exeFilePathLength); STARTUPINFO startupInfo; std::memset(&startupInfo, 0, sizeof(STARTUPINFO)); startupInfo.cb = sizeof(STARTUPINFO); startupInfo.lpDesktop = TEXT("WinSta0\\Default"); PROCESS_INFORMATION processInfomation; std::memset(&processInfomation, 0, sizeof(PROCESS_INFORMATION)); if(!::CreateProcessAsUser(hDuplicateToken, NULL, exeFilePath, NULL, NULL, FALSE, 0, NULL, NULL, &startupInfo, &processInfomation)) { TSERROR4CXX("CreateProcessAsUser fail. Error: " << ::GetLastError()); return false; } return true; } else { TSTRACE4CXX("Vista Or Higher"); // Vista Or Higher DWORD sessionId = 0; if(!::ProcessIdToSessionId(browserProcessId, &sessionId)) { TSERROR4CXX("ProcessIdToSessionId fail. Error: " << ::GetLastError()); return false; } WTSProvider wtsProvider; WTSProvider::WTSQueryUserTokenFuncType wtsQueryUserTokenPtr = wtsProvider.GetWTSQueryUserTokenFunctionPtr(); if(!wtsQueryUserTokenPtr) { TSERROR4CXX("wtsQueryUserTokenPtr == NULL."); return false; } HANDLE hUserToken = NULL; if(!wtsQueryUserTokenPtr(sessionId, &hUserToken)) { TSERROR4CXX("WTSQueryUserToken fail. Error: " << ::GetLastError()); return false; } ScopeResourceHandle<HANDLE, BOOL (WINAPI*)(HANDLE)> autoCloseUserToken(hUserToken, ::CloseHandle); TOKEN_ELEVATION_TYPE tokenElevationType; DWORD dwSize = sizeof(TOKEN_ELEVATION_TYPE); if(!::GetTokenInformation(hUserToken, TokenElevationType, &tokenElevationType, dwSize, &dwSize)) { TSERROR4CXX("GetTokenInformation TokenElevationType fail." << ::GetLastError()); return false; } HANDLE hDuplicateToken = NULL; if(tokenElevationType == TokenElevationTypeLimited) { TOKEN_LINKED_TOKEN linkedToken; dwSize = sizeof(TOKEN_LINKED_TOKEN); if (!::GetTokenInformation(hUserToken, TokenLinkedToken, &linkedToken, dwSize, &dwSize)) { TSERROR4CXX("GetTokenInformation TokenLinkedToken fail. Error: " << ::GetLastError()); return false; } ScopeResourceHandle<HANDLE, BOOL (WINAPI*)(HANDLE)> autoCloseLinkedToken(linkedToken.LinkedToken, ::CloseHandle); if(!::DuplicateTokenEx(linkedToken.LinkedToken, MAXIMUM_ALLOWED, NULL, SecurityImpersonation, TokenPrimary, &hDuplicateToken)) { TSERROR4CXX("DuplicateTokenEx fail. Error: " << ::GetLastError()); return false; } } else { if(!::DuplicateTokenEx(hUserToken, MAXIMUM_ALLOWED, NULL, SecurityImpersonation, TokenPrimary, &hDuplicateToken)) { TSERROR4CXX("DuplicateTokenEx fail. Error: " << ::GetLastError()); return false; } } ScopeResourceHandle<HANDLE, BOOL (WINAPI*)(HANDLE)> autoCloseDuplicateToken(hDuplicateToken, ::CloseHandle); wchar_t exeFilePath[MAX_PATH * 2]; // buffer 长度为MAX_PATH * 2 但这里只传MAX_PATH if(!GetGreenShiledExeFilePath(&exeFilePath[1], MAX_PATH)) { TSERROR4CXX("Failed to get ExeFilePath"); return false; } else { TSINFO4CXX("GreenShield ExeFilePath: " << exeFilePath); } exeFilePath[0] = L'\"'; std::size_t exeFilePathLength = std::wcslen(exeFilePath); exeFilePath[exeFilePathLength++] = L'\"'; std::copy(launchParameters, launchParameters + sizeof(launchParameters) / sizeof(launchParameters[0]), exeFilePath + exeFilePathLength); STARTUPINFO startupInfo; std::memset(&startupInfo, 0, sizeof(STARTUPINFO)); startupInfo.cb = sizeof(STARTUPINFO); startupInfo.lpDesktop = TEXT("WinSta0\\Default"); PROCESS_INFORMATION processInfomation; std::memset(&processInfomation, 0, sizeof(PROCESS_INFORMATION)); if(!::CreateProcessAsUser(hDuplicateToken, NULL, exeFilePath, NULL, NULL, FALSE, 0, NULL, NULL, &startupInfo, &processInfomation)) { TSERROR4CXX("CreateProcessAsUser fail. Error: " << ::GetLastError()); return false; } return true; } }