LEFT | RIGHT |
1 #include <Windows.h> | 1 #include <Windows.h> |
2 #include <Lmcons.h> | 2 #include <Lmcons.h> |
3 #include <Sddl.h> | 3 #include <Sddl.h> |
4 | 4 |
5 #include "Communication.h" | 5 #include "Communication.h" |
6 | 6 |
7 namespace | 7 namespace |
8 { | 8 { |
| 9 const int bufferSize = 1024; |
| 10 |
9 std::string AppendErrorCode(const std::string& message) | 11 std::string AppendErrorCode(const std::string& message) |
10 { | 12 { |
11 std::stringstream stream; | 13 std::stringstream stream; |
12 stream << message << " (Error code: " << GetLastError() << ")"; | 14 stream << message << " (Error code: " << GetLastError() << ")"; |
13 return stream.str(); | 15 return stream.str(); |
14 } | 16 } |
15 | 17 |
16 std::wstring GetUserName() | 18 std::wstring GetUserName() |
17 { | 19 { |
18 const DWORD maxLength = UNLEN + 1; | 20 const DWORD maxLength = UNLEN + 1; |
19 std::auto_ptr<wchar_t> buffer(new wchar_t[maxLength]); | 21 std::auto_ptr<wchar_t> buffer(new wchar_t[maxLength]); |
20 DWORD length = maxLength; | 22 DWORD length = maxLength; |
21 if (!::GetUserNameW(buffer.get(), &length)) | 23 if (!::GetUserNameW(buffer.get(), &length)) |
22 throw std::runtime_error(AppendErrorCode("Failed to get the current user's
name")); | 24 throw std::runtime_error(AppendErrorCode("Failed to get the current user's
name")); |
23 return std::wstring(buffer.get(), length); | 25 return std::wstring(buffer.get(), length); |
24 } | 26 } |
25 } | 27 } |
26 | 28 |
27 const std::wstring Communication::pipeName = L"\\\\.\\pipe\\adblockplusengine_"
+ GetUserName(); | 29 const std::wstring Communication::pipeName = L"\\\\.\\pipe\\adblockplusengine_"
+ GetUserName(); |
| 30 |
| 31 void Communication::InputBuffer::CheckType(Communication::ValueType expectedType
) |
| 32 { |
| 33 if (!hasType) |
| 34 ReadBinary(currentType); |
| 35 |
| 36 if (currentType != expectedType) |
| 37 { |
| 38 // Make sure we don't attempt to read the type again |
| 39 hasType = true; |
| 40 throw new std::runtime_error("Unexpected type found in input buffer"); |
| 41 } |
| 42 else |
| 43 hasType = false; |
| 44 } |
28 | 45 |
29 Communication::PipeConnectionError::PipeConnectionError() | 46 Communication::PipeConnectionError::PipeConnectionError() |
30 : std::runtime_error(AppendErrorCode("Unable to connect to a named pipe")) | 47 : std::runtime_error(AppendErrorCode("Unable to connect to a named pipe")) |
31 { | 48 { |
32 } | 49 } |
33 | 50 |
34 Communication::Pipe::Pipe(const std::wstring& pipeName, Communication::Pipe::Mod
e mode) | 51 Communication::Pipe::Pipe(const std::wstring& pipeName, Communication::Pipe::Mod
e mode) |
35 { | 52 { |
36 pipe = INVALID_HANDLE_VALUE; | 53 pipe = INVALID_HANDLE_VALUE; |
37 if (mode == MODE_CREATE) | 54 if (mode == MODE_CREATE) |
38 { | 55 { |
39 SECURITY_ATTRIBUTES sa; | 56 SECURITY_ATTRIBUTES sa; |
40 memset(&sa, 0, sizeof(SECURITY_ATTRIBUTES)); | 57 memset(&sa, 0, sizeof(SECURITY_ATTRIBUTES)); |
41 sa.nLength = sizeof(SECURITY_ATTRIBUTES); | 58 sa.nLength = sizeof(SECURITY_ATTRIBUTES); |
42 | 59 |
43 // Low mandatory label. See http://msdn.microsoft.com/en-us/library/bb625958
.aspx | 60 // Low mandatory label. See http://msdn.microsoft.com/en-us/library/bb625958
.aspx |
44 LPCWSTR accessControlEntry = L"S:(ML;;NW;;;LW)"; | 61 LPCWSTR accessControlEntry = L"S:(ML;;NW;;;LW)"; |
45 PSECURITY_DESCRIPTOR securitydescriptor; | 62 PSECURITY_DESCRIPTOR securitydescriptor; |
46 ConvertStringSecurityDescriptorToSecurityDescriptorW(accessControlEntry, SDD
L_REVISION_1, &securitydescriptor, 0); | 63 ConvertStringSecurityDescriptorToSecurityDescriptorW(accessControlEntry, SDD
L_REVISION_1, &securitydescriptor, 0); |
47 | 64 |
48 sa.lpSecurityDescriptor = securitydescriptor; | 65 sa.lpSecurityDescriptor = securitydescriptor; |
49 sa.bInheritHandle = TRUE; | 66 sa.bInheritHandle = TRUE; |
50 | 67 |
51 pipe = CreateNamedPipeW (pipeName.c_str(), PIPE_ACCESS_DUPLEX, PIPE_TYPE_MES
SAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT, | 68 pipe = CreateNamedPipeW (pipeName.c_str(), PIPE_ACCESS_DUPLEX, PIPE_TYPE_MES
SAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT, |
52 PIPE_UNLIMITED_INSTANCES, Communication::buffe
rSize, Communication::bufferSize, 0, &sa); | 69 PIPE_UNLIMITED_INSTANCES, bufferSize, bufferSi
ze, 0, &sa); |
53 LocalFree(securitydescriptor); | 70 LocalFree(securitydescriptor); |
54 } | 71 } |
55 else | 72 else |
56 { | 73 { |
57 if (WaitNamedPipeW(pipeName.c_str(), 5000)) | 74 if (WaitNamedPipeW(pipeName.c_str(), 5000)) |
58 pipe = CreateFileW(pipeName.c_str(), GENERIC_READ | GENERIC_WRITE, 0, 0, O
PEN_EXISTING, 0, 0); | 75 pipe = CreateFileW(pipeName.c_str(), GENERIC_READ | GENERIC_WRITE, 0, 0, O
PEN_EXISTING, 0, 0); |
59 } | 76 } |
60 | 77 |
61 if (pipe == INVALID_HANDLE_VALUE) | 78 if (pipe == INVALID_HANDLE_VALUE) |
62 throw PipeConnectionError(); | 79 throw PipeConnectionError(); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
95 return Communication::InputBuffer(stream.str()); | 112 return Communication::InputBuffer(stream.str()); |
96 } | 113 } |
97 | 114 |
98 void Communication::Pipe::WriteMessage(Communication::OutputBuffer& message) | 115 void Communication::Pipe::WriteMessage(Communication::OutputBuffer& message) |
99 { | 116 { |
100 DWORD bytesWritten; | 117 DWORD bytesWritten; |
101 std::string data = message.Get(); | 118 std::string data = message.Get(); |
102 if (!WriteFile(pipe, data.c_str(), data.length(), &bytesWritten, 0)) | 119 if (!WriteFile(pipe, data.c_str(), data.length(), &bytesWritten, 0)) |
103 throw std::runtime_error("Failed to write to pipe"); | 120 throw std::runtime_error("Failed to write to pipe"); |
104 } | 121 } |
LEFT | RIGHT |