 Issue 11756012:
  Enhanced Protected Mode support  (Closed)
    
  
    Issue 11756012:
  Enhanced Protected Mode support  (Closed) 
  | Index: src/plugin/AdblockPlusClient.cpp | 
| =================================================================== | 
| --- a/src/plugin/AdblockPlusClient.cpp | 
| +++ b/src/plugin/AdblockPlusClient.cpp | 
| @@ -1,5 +1,4 @@ | 
| #include "PluginStdAfx.h" | 
| - | 
| #include "PluginSettings.h" | 
| #include "PluginSystem.h" | 
| #include "PluginFilter.h" | 
| @@ -23,14 +22,50 @@ | 
| 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; | 
| 
Wladimir Palant
2013/09/17 07:53:48
Nit: that variable name also uses the Hungarian no
 | 
| + DWORD length = 0; | 
| + | 
| + // Get AppContainer SID | 
| + if (!GetTokenInformation(token, TokenAppContainerSid, acSid, 0, &length) && GetLastError() == ERROR_INSUFFICIENT_BUFFER) | 
| + { | 
| + acSid = (TOKEN_APPCONTAINER_INFORMATION*) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, length); | 
| + if (acSid != NULL) | 
| + { | 
| + GetTokenInformation(token, TokenAppContainerSid, acSid, length, &length); | 
| + } | 
| + else | 
| + { | 
| + throw std::runtime_error("Out of memory"); | 
| + } | 
| + } | 
| + | 
| + BOOL createProcRes = 0; | 
| + // Running inside AppContainer? | 
| + if (acSid != NULL && acSid->TokenAppContainer != NULL) | 
| + { | 
| + // 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 = CreateProcessW(engineExecutablePath.c_str(), params.GetBuffer(params.GetLength() + 1), | 
| + 0, 0, false, 0, 0, 0, (STARTUPINFOW*)&startupInfo, &processInformation); | 
| + } | 
| + else | 
| { | 
| - DWORD error = GetLastError(); | 
| + // 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), | 
| 
Wladimir Palant
2013/09/17 07:53:48
Nit: This should be changed into CreateProcessAsUs
 | 
| + 0, 0, false, 0, 0, 0, (STARTUPINFOW*)&startupInfo, &processInformation); | 
| + } | 
| + | 
| + if (!createProcRes) | 
| + { | 
| throw std::runtime_error("Failed to start Adblock Plus Engine"); | 
| } |