Left: | ||
Right: |
LEFT | RIGHT |
---|---|
1 #include "PluginStdAfx.h" | 1 #include "PluginStdAfx.h" |
2 | |
3 #include <Windows.h> | |
4 #include <Sddl.h> | |
Felix Dahlke
2013/09/16 16:30:12
Shouldn't these two includes go into PluginStdAfx?
| |
5 | |
6 | |
7 #include "PluginSettings.h" | 2 #include "PluginSettings.h" |
8 #include "PluginSystem.h" | 3 #include "PluginSystem.h" |
9 #include "PluginFilter.h" | 4 #include "PluginFilter.h" |
10 #include "PluginClientFactory.h" | 5 #include "PluginClientFactory.h" |
11 #include "PluginMutex.h" | 6 #include "PluginMutex.h" |
12 #include "PluginClass.h" | 7 #include "PluginClass.h" |
13 | 8 |
14 #include "AdblockPlusClient.h" | 9 #include "AdblockPlusClient.h" |
15 | 10 |
16 #include "../shared/Utils.h" | 11 #include "../shared/Utils.h" |
17 | 12 |
18 namespace | 13 namespace |
19 { | 14 { |
20 void SpawnAdblockPlusEngine() | 15 void SpawnAdblockPlusEngine() |
21 { | 16 { |
22 std::wstring engineExecutablePath = GetDllDir() + L"AdblockPlusEngine.exe"; | 17 std::wstring engineExecutablePath = GetDllDir() + L"AdblockPlusEngine.exe"; |
23 CString params = L"AdblockPlusEngine.exe " + CPluginSystem::GetInstance()->G etBrowserLanguage(); | 18 CString params = L"AdblockPlusEngine.exe " + CPluginSystem::GetInstance()->G etBrowserLanguage(); |
24 | 19 |
25 STARTUPINFO startupInfo = {}; | 20 STARTUPINFO startupInfo = {}; |
26 PROCESS_INFORMATION processInformation = {}; | 21 PROCESS_INFORMATION processInformation = {}; |
27 | 22 |
28 HANDLE token; | 23 HANDLE token; |
29 OpenProcessToken(GetCurrentProcess(), TOKEN_DUPLICATE | TOKEN_ADJUST_DEFAULT | TOKEN_QUERY | TOKEN_ASSIGN_PRIMARY, &token); | 24 OpenProcessToken(GetCurrentProcess(), TOKEN_DUPLICATE | TOKEN_ADJUST_DEFAULT | TOKEN_QUERY | TOKEN_ASSIGN_PRIMARY, &token); |
30 | 25 |
31 TOKEN_APPCONTAINER_INFORMATION *acSid = NULL; | 26 TOKEN_APPCONTAINER_INFORMATION *acSid = NULL; |
Wladimir Palant
2013/09/17 07:53:48
Nit: that variable name also uses the Hungarian no
| |
32 DWORD dwLength = 0; | 27 DWORD length = 0; |
Wladimir Palant
2013/09/16 13:45:07
Nit: Since when are we using Hungarian notation? I
| |
33 | 28 |
34 // Get AppContainer SID | 29 // Get AppContainer SID |
35 if (!GetTokenInformation(token, TokenAppContainerSid, (LPVOID) acSid, 0, &dw Length) && GetLastError() == ERROR_INSUFFICIENT_BUFFER) | 30 if (!GetTokenInformation(token, TokenAppContainerSid, acSid, 0, &length) && GetLastError() == ERROR_INSUFFICIENT_BUFFER) |
Wladimir Palant
2013/09/16 13:45:07
Nit: I think that the explicit cast to LPVOID here
| |
36 { | 31 { |
37 acSid = (TOKEN_APPCONTAINER_INFORMATION*)HeapAlloc(GetProcessHeap(), HEA P_ZERO_MEMORY, dwLength); | 32 acSid = (TOKEN_APPCONTAINER_INFORMATION*) HeapAlloc(GetProcessHeap(), HE AP_ZERO_MEMORY, length); |
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
| |
38 if (acSid != NULL) | 33 if (acSid != NULL) |
Felix Dahlke
2013/09/16 16:30:12
What if the allocation failed? Isn't that worth an
| |
39 { | 34 { |
40 GetTokenInformation(token, TokenAppContainerSid, (LPVOID) acSid, dwLen gth, &dwLength); | 35 GetTokenInformation(token, TokenAppContainerSid, acSid, length, &lengt h); |
36 } | |
37 else | |
38 { | |
39 throw std::runtime_error("Out of memory"); | |
41 } | 40 } |
42 } | 41 } |
43 | 42 |
44 BOOL createProcRes = 0; | 43 BOOL createProcRes = 0; |
45 // Running inside AppContainer? | 44 // Running inside AppContainer? |
46 if ((acSid != NULL) && (acSid->TokenAppContainer != NULL)) | 45 if (acSid != NULL && acSid->TokenAppContainer != NULL) |
Wladimir Palant
2013/09/16 13:45:07
Nit: the extra parentheses are unnecessary.
| |
47 { | 46 { |
48 // Launch with default security. Registry entry will eat the user prompt | 47 // Launch with default security. Registry entry will eat the user prompt |
49 // See http://msdn.microsoft.com/en-us/library/bb250462(v=vs.85).aspx#wpm_ elebp | 48 // See http://msdn.microsoft.com/en-us/library/bb250462(v=vs.85).aspx#wpm_ elebp |
50 LPWSTR stringSid; | 49 LPWSTR stringSid; |
51 ConvertSidToStringSidW(acSid->TokenAppContainer, &stringSid); | 50 ConvertSidToStringSidW(acSid->TokenAppContainer, &stringSid); |
52 params.Append(L" "); | 51 params.Append(L" "); |
53 params.Append(stringSid); | 52 params.Append(stringSid); |
54 LocalFree(stringSid); | 53 LocalFree(stringSid); |
55 createProcRes = CreateProcess(engineExecutablePath.c_str(), params.GetBuff er(params.GetLength() + 1), | 54 createProcRes = CreateProcessW(engineExecutablePath.c_str(), params.GetBuf fer(params.GetLength() + 1), |
56 0, 0, false, 0, 0, 0, (STARTUPINFOW*)&startupInfo, &processInformation); | 55 0, 0, false, 0, 0, 0, (STARTUPINFOW*)&startupInfo, &processInformation); |
57 } | 56 } |
58 else | 57 else |
59 { | 58 { |
60 // Launch with the same security token (Low Integrity) explicitly | 59 // Launch with the same security token (Low Integrity) explicitly |
61 HANDLE newToken; | 60 HANDLE newToken; |
62 DuplicateTokenEx(token, 0, 0, SecurityImpersonation, TokenPrimary, &newTok en); | 61 DuplicateTokenEx(token, 0, 0, SecurityImpersonation, TokenPrimary, &newTok en); |
63 | 62 |
64 createProcRes = CreateProcessAsUser(newToken, engineExecutablePath.c_str() , params.GetBuffer(params.GetLength() + 1), | 63 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
| |
65 0, 0, false, 0, 0, 0, (STARTUPINFOW*)&startupInfo, &processInformation); | 64 0, 0, false, 0, 0, 0, (STARTUPINFOW*)&startupInfo, &processInformation); |
66 } | 65 } |
67 | 66 |
68 if (!createProcRes) | 67 if (!createProcRes) |
69 { | 68 { |
70 throw std::runtime_error("Failed to start Adblock Plus Engine"); | 69 throw std::runtime_error("Failed to start Adblock Plus Engine"); |
71 } | 70 } |
72 | 71 |
73 CloseHandle(processInformation.hProcess); | 72 CloseHandle(processInformation.hProcess); |
74 CloseHandle(processInformation.hThread); | 73 CloseHandle(processInformation.hThread); |
(...skipping 16 matching lines...) Expand all Loading... | |
91 try | 90 try |
92 { | 91 { |
93 return new Communication::Pipe(Communication::pipeName, Communication: :Pipe::MODE_CONNECT); | 92 return new Communication::Pipe(Communication::pipeName, Communication: :Pipe::MODE_CONNECT); |
94 } | 93 } |
95 catch (Communication::PipeConnectionError e) | 94 catch (Communication::PipeConnectionError e) |
96 { | 95 { |
97 } | 96 } |
98 } | 97 } |
99 throw std::runtime_error("Unable to open Adblock Plus Engine pipe"); | 98 throw std::runtime_error("Unable to open Adblock Plus Engine pipe"); |
100 } | 99 } |
101 catch(...) | |
Wladimir Palant
2013/09/16 13:45:07
I don't really like seeing "catch all", what kind
| |
102 { | |
103 SpawnAdblockPlusEngine(); | |
104 } | |
105 } | 100 } |
106 | 101 |
107 std::vector<std::wstring> ReadStrings(Communication::InputBuffer& message) | 102 std::vector<std::wstring> ReadStrings(Communication::InputBuffer& message) |
108 { | 103 { |
109 int32_t count; | 104 int32_t count; |
110 message >> count; | 105 message >> count; |
111 | 106 |
112 std::vector<std::wstring> result; | 107 std::vector<std::wstring> result; |
113 for (int32_t i = 0; i < count; i++) | 108 for (int32_t i = 0; i < count; i++) |
114 { | 109 { |
(...skipping 359 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
474 DEBUG_GENERAL((L"GetPref: " + name + L" end").c_str()); | 469 DEBUG_GENERAL((L"GetPref: " + name + L" end").c_str()); |
475 return value; | 470 return value; |
476 } | 471 } |
477 else | 472 else |
478 { | 473 { |
479 DEBUG_GENERAL((L"GetPref: " + name + L" end").c_str()); | 474 DEBUG_GENERAL((L"GetPref: " + name + L" end").c_str()); |
480 return defaultValue; | 475 return defaultValue; |
481 } | 476 } |
482 } | 477 } |
483 | 478 |
484 void CAdblockPlusClient::CheckForUpdates(HWND callbackWindow) | 479 void CAdblockPlusClient::CheckForUpdates() |
485 { | 480 { |
486 Communication::OutputBuffer request; | 481 CallEngine(Communication::PROC_CHECK_FOR_UPDATES); |
487 request << Communication::PROC_CHECK_FOR_UPDATES << (int32_t&)callbackWindow; | |
488 CallEngine(request); | |
489 } | 482 } |
490 | 483 |
491 std::wstring CAdblockPlusClient::GetDocumentationLink() | 484 std::wstring CAdblockPlusClient::GetDocumentationLink() |
492 { | 485 { |
493 DEBUG_GENERAL("GetDocumentationLink"); | 486 DEBUG_GENERAL("GetDocumentationLink"); |
494 Communication::InputBuffer response; | 487 Communication::InputBuffer response; |
495 if (!CallEngine(Communication::PROC_GET_DOCUMENTATION_LINK, response)) | 488 if (!CallEngine(Communication::PROC_GET_DOCUMENTATION_LINK, response)) |
496 return L""; | 489 return L""; |
497 std::wstring docLink; | 490 std::wstring docLink; |
498 response >> docLink; | 491 response >> docLink; |
499 return docLink; | 492 return docLink; |
500 } | 493 } |
501 | 494 |
502 bool CAdblockPlusClient::TogglePluginEnabled() | 495 bool CAdblockPlusClient::TogglePluginEnabled() |
503 { | 496 { |
504 DEBUG_GENERAL("TogglePluginEnabled"); | 497 DEBUG_GENERAL("TogglePluginEnabled"); |
505 Communication::InputBuffer response; | 498 Communication::InputBuffer response; |
506 if (!CallEngine(Communication::PROC_TOGGLE_PLUGIN_ENABLED, response)) | 499 if (!CallEngine(Communication::PROC_TOGGLE_PLUGIN_ENABLED, response)) |
507 return false; | 500 return false; |
508 bool currentEnabledState; | 501 bool currentEnabledState; |
509 response >> currentEnabledState; | 502 response >> currentEnabledState; |
510 return currentEnabledState; | 503 return currentEnabledState; |
511 } | 504 } |
LEFT | RIGHT |