OLD | NEW |
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "sandbox/win/src/filesystem_interception.h" | 5 #include "sandbox/win/src/filesystem_interception.h" |
6 | 6 |
7 #include <stdint.h> | |
8 | |
9 #include "sandbox/win/src/crosscall_client.h" | 7 #include "sandbox/win/src/crosscall_client.h" |
10 #include "sandbox/win/src/ipc_tags.h" | 8 #include "sandbox/win/src/ipc_tags.h" |
11 #include "sandbox/win/src/policy_params.h" | 9 #include "sandbox/win/src/policy_params.h" |
12 #include "sandbox/win/src/policy_target.h" | 10 #include "sandbox/win/src/policy_target.h" |
13 #include "sandbox/win/src/sandbox_factory.h" | 11 #include "sandbox/win/src/sandbox_factory.h" |
14 #include "sandbox/win/src/sandbox_nt_util.h" | 12 #include "sandbox/win/src/sandbox_nt_util.h" |
15 #include "sandbox/win/src/sharedmem_ipc_client.h" | 13 #include "sandbox/win/src/sharedmem_ipc_client.h" |
16 #include "sandbox/win/src/target_services.h" | 14 #include "sandbox/win/src/target_services.h" |
17 | 15 |
18 namespace sandbox { | 16 namespace sandbox { |
(...skipping 22 matching lines...) Expand all Loading... |
41 do { | 39 do { |
42 if (!ValidParameter(file, sizeof(HANDLE), WRITE)) | 40 if (!ValidParameter(file, sizeof(HANDLE), WRITE)) |
43 break; | 41 break; |
44 if (!ValidParameter(io_status, sizeof(IO_STATUS_BLOCK), WRITE)) | 42 if (!ValidParameter(io_status, sizeof(IO_STATUS_BLOCK), WRITE)) |
45 break; | 43 break; |
46 | 44 |
47 void* memory = GetGlobalIPCMemory(); | 45 void* memory = GetGlobalIPCMemory(); |
48 if (NULL == memory) | 46 if (NULL == memory) |
49 break; | 47 break; |
50 | 48 |
51 uint32_t attributes = 0; | 49 uint32 attributes = 0; |
52 NTSTATUS ret = AllocAndCopyName(object_attributes, &name, &attributes, | 50 NTSTATUS ret = AllocAndCopyName(object_attributes, &name, &attributes, |
53 NULL); | 51 NULL); |
54 if (!NT_SUCCESS(ret) || NULL == name) | 52 if (!NT_SUCCESS(ret) || NULL == name) |
55 break; | 53 break; |
56 | 54 |
57 uint32_t desired_access_uint32 = desired_access; | 55 uint32 desired_access_uint32 = desired_access; |
58 uint32_t options_uint32 = options; | 56 uint32 options_uint32 = options; |
59 uint32_t disposition_uint32 = disposition; | 57 uint32 disposition_uint32 = disposition; |
60 uint32_t broker = FALSE; | 58 uint32 broker = FALSE; |
61 CountedParameterSet<OpenFile> params; | 59 CountedParameterSet<OpenFile> params; |
62 params[OpenFile::NAME] = ParamPickerMake(name); | 60 params[OpenFile::NAME] = ParamPickerMake(name); |
63 params[OpenFile::ACCESS] = ParamPickerMake(desired_access_uint32); | 61 params[OpenFile::ACCESS] = ParamPickerMake(desired_access_uint32); |
64 params[OpenFile::DISPOSITION] = ParamPickerMake(disposition_uint32); | 62 params[OpenFile::DISPOSITION] = ParamPickerMake(disposition_uint32); |
65 params[OpenFile::OPTIONS] = ParamPickerMake(options_uint32); | 63 params[OpenFile::OPTIONS] = ParamPickerMake(options_uint32); |
66 params[OpenFile::BROKER] = ParamPickerMake(broker); | 64 params[OpenFile::BROKER] = ParamPickerMake(broker); |
67 | 65 |
68 if (!QueryBroker(IPC_NTCREATEFILE_TAG, params.GetBase())) | 66 if (!QueryBroker(IPC_NTCREATEFILE_TAG, params.GetBase())) |
69 break; | 67 break; |
70 | 68 |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
117 do { | 115 do { |
118 if (!ValidParameter(file, sizeof(HANDLE), WRITE)) | 116 if (!ValidParameter(file, sizeof(HANDLE), WRITE)) |
119 break; | 117 break; |
120 if (!ValidParameter(io_status, sizeof(IO_STATUS_BLOCK), WRITE)) | 118 if (!ValidParameter(io_status, sizeof(IO_STATUS_BLOCK), WRITE)) |
121 break; | 119 break; |
122 | 120 |
123 void* memory = GetGlobalIPCMemory(); | 121 void* memory = GetGlobalIPCMemory(); |
124 if (NULL == memory) | 122 if (NULL == memory) |
125 break; | 123 break; |
126 | 124 |
127 uint32_t attributes; | 125 uint32 attributes; |
128 NTSTATUS ret = AllocAndCopyName(object_attributes, &name, &attributes, | 126 NTSTATUS ret = AllocAndCopyName(object_attributes, &name, &attributes, |
129 NULL); | 127 NULL); |
130 if (!NT_SUCCESS(ret) || NULL == name) | 128 if (!NT_SUCCESS(ret) || NULL == name) |
131 break; | 129 break; |
132 | 130 |
133 uint32_t desired_access_uint32 = desired_access; | 131 uint32 desired_access_uint32 = desired_access; |
134 uint32_t options_uint32 = options; | 132 uint32 options_uint32 = options; |
135 uint32_t disposition_uint32 = FILE_OPEN; | 133 uint32 disposition_uint32 = FILE_OPEN; |
136 uint32_t broker = FALSE; | 134 uint32 broker = FALSE; |
137 CountedParameterSet<OpenFile> params; | 135 CountedParameterSet<OpenFile> params; |
138 params[OpenFile::NAME] = ParamPickerMake(name); | 136 params[OpenFile::NAME] = ParamPickerMake(name); |
139 params[OpenFile::ACCESS] = ParamPickerMake(desired_access_uint32); | 137 params[OpenFile::ACCESS] = ParamPickerMake(desired_access_uint32); |
140 params[OpenFile::DISPOSITION] = ParamPickerMake(disposition_uint32); | 138 params[OpenFile::DISPOSITION] = ParamPickerMake(disposition_uint32); |
141 params[OpenFile::OPTIONS] = ParamPickerMake(options_uint32); | 139 params[OpenFile::OPTIONS] = ParamPickerMake(options_uint32); |
142 params[OpenFile::BROKER] = ParamPickerMake(broker); | 140 params[OpenFile::BROKER] = ParamPickerMake(broker); |
143 | 141 |
144 if (!QueryBroker(IPC_NTOPENFILE_TAG, params.GetBase())) | 142 if (!QueryBroker(IPC_NTOPENFILE_TAG, params.GetBase())) |
145 break; | 143 break; |
146 | 144 |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
187 | 185 |
188 wchar_t* name = NULL; | 186 wchar_t* name = NULL; |
189 do { | 187 do { |
190 if (!ValidParameter(file_attributes, sizeof(FILE_BASIC_INFORMATION), WRITE)) | 188 if (!ValidParameter(file_attributes, sizeof(FILE_BASIC_INFORMATION), WRITE)) |
191 break; | 189 break; |
192 | 190 |
193 void* memory = GetGlobalIPCMemory(); | 191 void* memory = GetGlobalIPCMemory(); |
194 if (NULL == memory) | 192 if (NULL == memory) |
195 break; | 193 break; |
196 | 194 |
197 uint32_t attributes = 0; | 195 uint32 attributes = 0; |
198 NTSTATUS ret = AllocAndCopyName(object_attributes, &name, &attributes, | 196 NTSTATUS ret = AllocAndCopyName(object_attributes, &name, &attributes, |
199 NULL); | 197 NULL); |
200 if (!NT_SUCCESS(ret) || NULL == name) | 198 if (!NT_SUCCESS(ret) || NULL == name) |
201 break; | 199 break; |
202 | 200 |
203 InOutCountedBuffer file_info(file_attributes, | 201 InOutCountedBuffer file_info(file_attributes, |
204 sizeof(FILE_BASIC_INFORMATION)); | 202 sizeof(FILE_BASIC_INFORMATION)); |
205 | 203 |
206 uint32_t broker = FALSE; | 204 uint32 broker = FALSE; |
207 CountedParameterSet<FileName> params; | 205 CountedParameterSet<FileName> params; |
208 params[FileName::NAME] = ParamPickerMake(name); | 206 params[FileName::NAME] = ParamPickerMake(name); |
209 params[FileName::BROKER] = ParamPickerMake(broker); | 207 params[FileName::BROKER] = ParamPickerMake(broker); |
210 | 208 |
211 if (!QueryBroker(IPC_NTQUERYATTRIBUTESFILE_TAG, params.GetBase())) | 209 if (!QueryBroker(IPC_NTQUERYATTRIBUTESFILE_TAG, params.GetBase())) |
212 break; | 210 break; |
213 | 211 |
214 SharedMemIPCClient ipc(memory); | 212 SharedMemIPCClient ipc(memory); |
215 CrossCallReturn answer = {0}; | 213 CrossCallReturn answer = {0}; |
216 ResultCode code = CrossCall(ipc, IPC_NTQUERYATTRIBUTESFILE_TAG, name, | 214 ResultCode code = CrossCall(ipc, IPC_NTQUERYATTRIBUTESFILE_TAG, name, |
(...skipping 29 matching lines...) Expand all Loading... |
246 wchar_t* name = NULL; | 244 wchar_t* name = NULL; |
247 do { | 245 do { |
248 if (!ValidParameter(file_attributes, sizeof(FILE_NETWORK_OPEN_INFORMATION), | 246 if (!ValidParameter(file_attributes, sizeof(FILE_NETWORK_OPEN_INFORMATION), |
249 WRITE)) | 247 WRITE)) |
250 break; | 248 break; |
251 | 249 |
252 void* memory = GetGlobalIPCMemory(); | 250 void* memory = GetGlobalIPCMemory(); |
253 if (NULL == memory) | 251 if (NULL == memory) |
254 break; | 252 break; |
255 | 253 |
256 uint32_t attributes = 0; | 254 uint32 attributes = 0; |
257 NTSTATUS ret = AllocAndCopyName(object_attributes, &name, &attributes, | 255 NTSTATUS ret = AllocAndCopyName(object_attributes, &name, &attributes, |
258 NULL); | 256 NULL); |
259 if (!NT_SUCCESS(ret) || NULL == name) | 257 if (!NT_SUCCESS(ret) || NULL == name) |
260 break; | 258 break; |
261 | 259 |
262 InOutCountedBuffer file_info(file_attributes, | 260 InOutCountedBuffer file_info(file_attributes, |
263 sizeof(FILE_NETWORK_OPEN_INFORMATION)); | 261 sizeof(FILE_NETWORK_OPEN_INFORMATION)); |
264 | 262 |
265 uint32_t broker = FALSE; | 263 uint32 broker = FALSE; |
266 CountedParameterSet<FileName> params; | 264 CountedParameterSet<FileName> params; |
267 params[FileName::NAME] = ParamPickerMake(name); | 265 params[FileName::NAME] = ParamPickerMake(name); |
268 params[FileName::BROKER] = ParamPickerMake(broker); | 266 params[FileName::BROKER] = ParamPickerMake(broker); |
269 | 267 |
270 if (!QueryBroker(IPC_NTQUERYFULLATTRIBUTESFILE_TAG, params.GetBase())) | 268 if (!QueryBroker(IPC_NTQUERYFULLATTRIBUTESFILE_TAG, params.GetBase())) |
271 break; | 269 break; |
272 | 270 |
273 SharedMemIPCClient ipc(memory); | 271 SharedMemIPCClient ipc(memory); |
274 CrossCallReturn answer = {0}; | 272 CrossCallReturn answer = {0}; |
275 ResultCode code = CrossCall(ipc, IPC_NTQUERYFULLATTRIBUTESFILE_TAG, name, | 273 ResultCode code = CrossCall(ipc, IPC_NTQUERYFULLATTRIBUTESFILE_TAG, name, |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
328 object_name.Length = object_name.MaximumLength = | 326 object_name.Length = object_name.MaximumLength = |
329 static_cast<USHORT>(file_rename_info->FileNameLength); | 327 static_cast<USHORT>(file_rename_info->FileNameLength); |
330 } __except(EXCEPTION_EXECUTE_HANDLER) { | 328 } __except(EXCEPTION_EXECUTE_HANDLER) { |
331 break; | 329 break; |
332 } | 330 } |
333 | 331 |
334 NTSTATUS ret = AllocAndCopyName(&object_attributes, &name, NULL, NULL); | 332 NTSTATUS ret = AllocAndCopyName(&object_attributes, &name, NULL, NULL); |
335 if (!NT_SUCCESS(ret) || !name) | 333 if (!NT_SUCCESS(ret) || !name) |
336 break; | 334 break; |
337 | 335 |
338 uint32_t broker = FALSE; | 336 uint32 broker = FALSE; |
339 CountedParameterSet<FileName> params; | 337 CountedParameterSet<FileName> params; |
340 params[FileName::NAME] = ParamPickerMake(name); | 338 params[FileName::NAME] = ParamPickerMake(name); |
341 params[FileName::BROKER] = ParamPickerMake(broker); | 339 params[FileName::BROKER] = ParamPickerMake(broker); |
342 | 340 |
343 if (!QueryBroker(IPC_NTSETINFO_RENAME_TAG, params.GetBase())) | 341 if (!QueryBroker(IPC_NTSETINFO_RENAME_TAG, params.GetBase())) |
344 break; | 342 break; |
345 | 343 |
346 InOutCountedBuffer io_status_buffer(io_status, sizeof(IO_STATUS_BLOCK)); | 344 InOutCountedBuffer io_status_buffer(io_status, sizeof(IO_STATUS_BLOCK)); |
347 // This is actually not an InOut buffer, only In, but using InOut facility | 345 // This is actually not an InOut buffer, only In, but using InOut facility |
348 // really helps to simplify the code. | 346 // really helps to simplify the code. |
(...skipping 11 matching lines...) Expand all Loading... |
360 status = answer.nt_status; | 358 status = answer.nt_status; |
361 } while (false); | 359 } while (false); |
362 | 360 |
363 if (name) | 361 if (name) |
364 operator delete(name, NT_ALLOC); | 362 operator delete(name, NT_ALLOC); |
365 | 363 |
366 return status; | 364 return status; |
367 } | 365 } |
368 | 366 |
369 } // namespace sandbox | 367 } // namespace sandbox |
OLD | NEW |