Index: src/plugin/AdblockPlusClient.cpp |
diff --git a/src/plugin/AdblockPlusClient.cpp b/src/plugin/AdblockPlusClient.cpp |
index edee79b6f91613cd86688ea9040b6c05bccae5cb..a68e149c3abedc990f40d194984f9012af980834 100644 |
--- a/src/plugin/AdblockPlusClient.cpp |
+++ b/src/plugin/AdblockPlusClient.cpp |
@@ -26,74 +26,42 @@ |
namespace |
{ |
- void SpawnAdblockPlusEngine() |
- { |
- std::wstring engineExecutablePath = GetDllDir() + L"AdblockPlusEngine.exe"; |
- CString params = ToCString(L"AdblockPlusEngine.exe " + GetBrowserLanguage()); |
- |
- STARTUPINFO startupInfo = {}; |
- PROCESS_INFORMATION processInformation = {}; |
- |
- HANDLE token; |
- OpenProcessToken(GetCurrentProcess(), TOKEN_DUPLICATE | TOKEN_ADJUST_DEFAULT | TOKEN_QUERY | TOKEN_ASSIGN_PRIMARY, &token); |
- |
- TOKEN_APPCONTAINER_INFORMATION *acs = NULL; |
- DWORD length = 0; |
- |
- // Get AppContainer SID |
- if (!GetTokenInformation(token, TokenAppContainerSid, acs, 0, &length) && GetLastError() == ERROR_INSUFFICIENT_BUFFER) |
+ class ScopedProcessInformation : public PROCESS_INFORMATION { |
+ public: |
+ ScopedProcessInformation() |
{ |
- acs = (TOKEN_APPCONTAINER_INFORMATION*) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, length); |
- if (acs != NULL) |
- { |
- GetTokenInformation(token, TokenAppContainerSid, acs, length, &length); |
- } |
- else |
- { |
- throw std::runtime_error("Out of memory"); |
- } |
+ hProcess = hThread = 0; |
+ dwProcessId = dwThreadId = 0; |
} |
- |
- BOOL createProcRes = 0; |
- // Running inside AppContainer or in Windows XP |
- if ((acs != NULL && acs->TokenAppContainer != NULL) || !IsWindowsVistaOrLater()) |
+ ~ScopedProcessInformation() |
{ |
- // We need to break out from AppContainer. Launch with default security - registry entry will eat the user prompt |
- // See http://msdn.microsoft.com/en-us/library/bb250462(v=vs.85).aspx#wpm_elebp |
- createProcRes = CreateProcessW(engineExecutablePath.c_str(), params.GetBuffer(params.GetLength() + 1), |
- 0, 0, false, 0, 0, 0, (STARTUPINFOW*)&startupInfo, &processInformation); |
+ if (hThread != nullptr) |
+ { |
+ CloseHandle(hThread); |
+ } |
+ if (hProcess != nullptr) |
+ { |
+ CloseHandle(hProcess); |
+ } |
} |
- else |
- { |
- // Launch with Low Integrity explicitly |
- HANDLE newToken; |
- DuplicateTokenEx(token, 0, 0, SecurityImpersonation, TokenPrimary, &newToken); |
- |
- PSID integritySid = 0; |
- ConvertStringSidToSid(L"S-1-16-4096", &integritySid); |
- std::tr1::shared_ptr<SID> sharedIntegritySid(static_cast<SID*>(integritySid), FreeSid); // Just to simplify cleanup |
- |
- TOKEN_MANDATORY_LABEL tml = {}; |
- tml.Label.Attributes = SE_GROUP_INTEGRITY; |
- tml.Label.Sid = integritySid; |
- |
- // Set the process integrity level |
- SetTokenInformation(newToken, TokenIntegrityLevel, &tml, sizeof(tml)); |
+ }; |
- STARTUPINFO startupInfo = {}; |
- PROCESS_INFORMATION processInformation = {}; |
+ void SpawnAdblockPlusEngine() |
+ { |
+ std::wstring engineExecutablePath = GetDllDir() + L"AdblockPlusEngine.exe"; |
+ std::wstring params = L"AdblockPlusEngine.exe " + GetBrowserLanguage(); |
- createProcRes = CreateProcessAsUserW(newToken, engineExecutablePath.c_str(), params.GetBuffer(params.GetLength() + 1), |
- 0, 0, false, 0, 0, 0, (STARTUPINFOW*)&startupInfo, &processInformation); |
- } |
+ STARTUPINFO startupInfo = {}; |
+ ScopedProcessInformation processInformation; |
+ // We need to break out from AppContainer. Launch with default security - registry entry will eat the user prompt |
+ // See http://msdn.microsoft.com/en-us/library/bb250462(v=vs.85).aspx#wpm_elebp |
+ BOOL createProcRes = CreateProcessW(engineExecutablePath.c_str(), ¶ms[0], |
+ 0, 0, false, 0, 0, 0, &startupInfo, &processInformation); |
if (!createProcRes) |
{ |
throw std::runtime_error("Failed to start Adblock Plus Engine"); |
} |
- |
- CloseHandle(processInformation.hProcess); |
- CloseHandle(processInformation.hThread); |
} |
Communication::Pipe* OpenEnginePipe() |
@@ -148,7 +116,7 @@ namespace |
} |
CAdblockPlusClient* CAdblockPlusClient::s_instance = NULL; |
-CComAutoCriticalSection CAdblockPlusClient::s_criticalSectionLocal; |
+CComAutoCriticalSection CAdblockPlusClient::s_criticalSectionLocal; |
CAdblockPlusClient::CAdblockPlusClient() |
{ |