| Index: src/plugin/AdblockPlusClient.cpp |
| =================================================================== |
| --- a/src/plugin/AdblockPlusClient.cpp |
| +++ b/src/plugin/AdblockPlusClient.cpp |
| @@ -1,5 +1,9 @@ |
| #include "PluginStdAfx.h" |
| +#include <Windows.h> |
| +#include <Sddl.h> |
|
Felix Dahlke
2013/09/16 16:30:12
Shouldn't these two includes go into PluginStdAfx?
|
| + |
| + |
| #include "PluginSettings.h" |
| #include "PluginSystem.h" |
| #include "PluginFilter.h" |
| @@ -23,14 +27,46 @@ |
| HANDLE token; |
| OpenProcessToken(GetCurrentProcess(), TOKEN_DUPLICATE | TOKEN_ADJUST_DEFAULT | TOKEN_QUERY | TOKEN_ASSIGN_PRIMARY, &token); |
| - HANDLE newToken; |
| - DuplicateTokenEx(token, 0, 0, SecurityImpersonation, TokenPrimary, &newToken); |
| - if (!CreateProcessAsUserW(newToken, engineExecutablePath.c_str(), |
| - params.GetBuffer(params.GetLength() + 1), |
| - 0, 0, 0, 0, 0, 0, &startupInfo, &processInformation)) |
| + TOKEN_APPCONTAINER_INFORMATION *acSid = NULL; |
| + DWORD dwLength = 0; |
|
Wladimir Palant
2013/09/16 13:45:07
Nit: Since when are we using Hungarian notation? I
|
| + |
| + // Get AppContainer SID |
| + if (!GetTokenInformation(token, TokenAppContainerSid, (LPVOID) acSid, 0, &dwLength) && GetLastError() == ERROR_INSUFFICIENT_BUFFER) |
|
Wladimir Palant
2013/09/16 13:45:07
Nit: I think that the explicit cast to LPVOID here
|
| { |
| - DWORD error = GetLastError(); |
| + acSid = (TOKEN_APPCONTAINER_INFORMATION*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwLength); |
|
Wladimir Palant
2013/09/16 13:45:07
Why are we using HeapAlloc() rather than "new" her
Felix Dahlke
2013/09/16 16:30:12
Nit: Space before HeapAlloc?
Oleksandr
2013/09/17 03:11:37
"new" isn't good here since in the specific exampl
Wladimir Palant
2013/09/17 07:53:48
What I actually meant:
std::unique_ptr<char[]> si
|
| + if (acSid != NULL) |
|
Felix Dahlke
2013/09/16 16:30:12
What if the allocation failed? Isn't that worth an
|
| + { |
| + GetTokenInformation(token, TokenAppContainerSid, (LPVOID) acSid, dwLength, &dwLength); |
| + } |
| + } |
| + |
| + BOOL createProcRes = 0; |
| + // Running inside AppContainer? |
| + if ((acSid != NULL) && (acSid->TokenAppContainer != NULL)) |
|
Wladimir Palant
2013/09/16 13:45:07
Nit: the extra parentheses are unnecessary.
|
| + { |
| + // 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 |
| + LPWSTR stringSid; |
| + ConvertSidToStringSidW(acSid->TokenAppContainer, &stringSid); |
| + params.Append(L" "); |
| + params.Append(stringSid); |
| + LocalFree(stringSid); |
| + createProcRes = CreateProcess(engineExecutablePath.c_str(), params.GetBuffer(params.GetLength() + 1), |
| + 0, 0, false, 0, 0, 0, (STARTUPINFOW*)&startupInfo, &processInformation); |
| + } |
| + else |
| + { |
| + // Launch with the same security token (Low Integrity) explicitly |
| + HANDLE newToken; |
| + DuplicateTokenEx(token, 0, 0, SecurityImpersonation, TokenPrimary, &newToken); |
| + |
| + createProcRes = CreateProcessAsUser(newToken, engineExecutablePath.c_str(), params.GetBuffer(params.GetLength() + 1), |
| + 0, 0, false, 0, 0, 0, (STARTUPINFOW*)&startupInfo, &processInformation); |
| + } |
| + |
| + if (!createProcRes) |
| + { |
| throw std::runtime_error("Failed to start Adblock Plus Engine"); |
| } |
| @@ -62,6 +98,10 @@ |
| } |
| throw std::runtime_error("Unable to open Adblock Plus Engine pipe"); |
| } |
| + catch(...) |
|
Wladimir Palant
2013/09/16 13:45:07
I don't really like seeing "catch all", what kind
|
| + { |
| + SpawnAdblockPlusEngine(); |
| + } |
| } |
| std::vector<std::wstring> ReadStrings(Communication::InputBuffer& message) |