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 #include <aclapi.h> | 4 #include <aclapi.h> |
5 #include <strsafe.h> | 5 #include <strsafe.h> |
6 | 6 |
7 #include "AutoHandle.h" | 7 #include "AutoHandle.h" |
8 #include "Communication.h" | 8 #include "Communication.h" |
9 #include "Utils.h" | 9 #include "Utils.h" |
10 | 10 |
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
187 OpenProcessToken(GetCurrentProcess(), TOKEN_READ, token); | 187 OpenProcessToken(GetCurrentProcess(), TOKEN_READ, token); |
188 | 188 |
189 if (IsWindowsVistaOrLater()) | 189 if (IsWindowsVistaOrLater()) |
190 { | 190 { |
191 std::auto_ptr<SID> logonSid = GetLogonSid(token); | 191 std::auto_ptr<SID> logonSid = GetLogonSid(token); |
192 // Create a SECURITY_DESCRIPTOR that has both Low Integrity and allows acc
ess to all AppContainers | 192 // Create a SECURITY_DESCRIPTOR that has both Low Integrity and allows acc
ess to all AppContainers |
193 // This is needed since IE likes to jump out of Enhanced Protected Mode fo
r specific pages (bing.com) | 193 // This is needed since IE likes to jump out of Enhanced Protected Mode fo
r specific pages (bing.com) |
194 std::auto_ptr<SECURITY_DESCRIPTOR> securityDescriptor = CreateSecurityDesc
riptor(logonSid.get()); | 194 std::auto_ptr<SECURITY_DESCRIPTOR> securityDescriptor = CreateSecurityDesc
riptor(logonSid.get()); |
195 securityAttributes.lpSecurityDescriptor = securityDescriptor.release(); | 195 securityAttributes.lpSecurityDescriptor = securityDescriptor.release(); |
196 sharedSecurityDescriptor.reset(static_cast<SECURITY_DESCRIPTOR*>(securityA
ttributes.lpSecurityDescriptor)); | 196 sharedSecurityDescriptor.reset(static_cast<SECURITY_DESCRIPTOR*>(securityA
ttributes.lpSecurityDescriptor)); |
197 | 197 } |
198 pipe = CreateNamedPipeW(pipeName.c_str(), PIPE_ACCESS_DUPLEX, PIPE_TYPE_M
ESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT, | 198 pipe = CreateNamedPipeW(pipeName.c_str(), PIPE_ACCESS_DUPLEX, PIPE_TYPE_MES
SAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT, |
199 PIPE_UNLIMITED_INSTANCES, bufferSize, bufferSize, 0, &securityAttributes
); | 199 PIPE_UNLIMITED_INSTANCES, bufferSize, bufferSize, 0, &securityAttributes); |
200 } | |
201 else | |
202 { | |
203 pipe = CreateNamedPipeW(pipeName.c_str(), PIPE_ACCESS_DUPLEX, PIPE_TYPE_M
ESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT, | |
204 PIPE_UNLIMITED_INSTANCES, bufferSize, bufferSize, 0, &securityAttributes
); | |
205 } | |
206 } | 200 } |
207 else | 201 else |
208 { | 202 { |
209 pipe = CreateFileW(pipeName.c_str(), GENERIC_READ | GENERIC_WRITE, 0, 0, OPE
N_EXISTING, 0, 0); | 203 pipe = CreateFileW(pipeName.c_str(), GENERIC_READ | GENERIC_WRITE, 0, 0, OPE
N_EXISTING, 0, 0); |
210 if (pipe == INVALID_HANDLE_VALUE && GetLastError() == ERROR_PIPE_BUSY) | 204 if (pipe == INVALID_HANDLE_VALUE && GetLastError() == ERROR_PIPE_BUSY) |
211 { | 205 { |
212 if (!WaitNamedPipeW(pipeName.c_str(), 10000)) | 206 if (!WaitNamedPipeW(pipeName.c_str(), 10000)) |
213 throw PipeBusyError(); | 207 throw PipeBusyError(); |
214 | 208 |
215 pipe = CreateFileW(pipeName.c_str(), GENERIC_READ | GENERIC_WRITE, 0, 0, O
PEN_EXISTING, 0, 0); | 209 pipe = CreateFileW(pipeName.c_str(), GENERIC_READ | GENERIC_WRITE, 0, 0, O
PEN_EXISTING, 0, 0); |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
265 return Communication::InputBuffer(stream.str()); | 259 return Communication::InputBuffer(stream.str()); |
266 } | 260 } |
267 | 261 |
268 void Communication::Pipe::WriteMessage(Communication::OutputBuffer& message) | 262 void Communication::Pipe::WriteMessage(Communication::OutputBuffer& message) |
269 { | 263 { |
270 DWORD bytesWritten; | 264 DWORD bytesWritten; |
271 std::string data = message.Get(); | 265 std::string data = message.Get(); |
272 if (!WriteFile(pipe, data.c_str(), static_cast<DWORD>(data.length()), &bytesWr
itten, 0)) | 266 if (!WriteFile(pipe, data.c_str(), static_cast<DWORD>(data.length()), &bytesWr
itten, 0)) |
273 throw std::runtime_error("Failed to write to pipe"); | 267 throw std::runtime_error("Failed to write to pipe"); |
274 } | 268 } |
LEFT | RIGHT |