15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sandbox/win/src/sync_policy.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/strings/stringprintf.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sandbox/win/src/ipc_tags.h" 121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "sandbox/win/src/nt_internals.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sandbox/win/src/policy_engine_opcodes.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sandbox/win/src/policy_params.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sandbox/win/src/sandbox_types.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sandbox/win/src/sandbox_utils.h" 171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "sandbox/win/src/sync_interception.h" 181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "sandbox/win/src/win_utils.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace sandbox { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Provides functionality to resolve a symbolic link within the object 231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// directory passed in. 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)NTSTATUS ResolveSymbolicLink(const base::string16& directory_name, 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::string16& name, 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16* target) { 271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) NtOpenDirectoryObjectFunction NtOpenDirectoryObject = NULL; 281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ResolveNTFunctionPtr("NtOpenDirectoryObject", &NtOpenDirectoryObject); 291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) NtQuerySymbolicLinkObjectFunction NtQuerySymbolicLinkObject = NULL; 311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ResolveNTFunctionPtr("NtQuerySymbolicLinkObject", 321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) &NtQuerySymbolicLinkObject); 331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) NtOpenSymbolicLinkObjectFunction NtOpenSymbolicLinkObject = NULL; 351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ResolveNTFunctionPtr("NtOpenSymbolicLinkObject", &NtOpenSymbolicLinkObject); 361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) NtCloseFunction NtClose = NULL; 381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ResolveNTFunctionPtr("NtClose", &NtClose); 391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) OBJECT_ATTRIBUTES symbolic_link_directory_attributes = {}; 411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) UNICODE_STRING symbolic_link_directory_string = {}; 421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) InitObjectAttribs(directory_name, OBJ_CASE_INSENSITIVE, NULL, 431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) &symbolic_link_directory_attributes, 441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) &symbolic_link_directory_string); 451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) HANDLE symbolic_link_directory = NULL; 471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) NTSTATUS status = NtOpenDirectoryObject(&symbolic_link_directory, 481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DIRECTORY_QUERY, 491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) &symbolic_link_directory_attributes); 501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (status != STATUS_SUCCESS) { 511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DLOG(ERROR) << "Failed to open symbolic link directory. Error: " 521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) << status; 531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return status; 541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) OBJECT_ATTRIBUTES symbolic_link_attributes = {}; 571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) UNICODE_STRING name_string = {}; 581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) InitObjectAttribs(name, OBJ_CASE_INSENSITIVE, symbolic_link_directory, 591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) &symbolic_link_attributes, &name_string); 601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) HANDLE symbolic_link = NULL; 621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) status = NtOpenSymbolicLinkObject(&symbolic_link, GENERIC_READ, 631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) &symbolic_link_attributes); 641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) NtClose(symbolic_link_directory); 651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (status != STATUS_SUCCESS) { 661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DLOG(ERROR) << "Failed to open symbolic link Error: " << status; 671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return status; 681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) UNICODE_STRING target_path = {}; 711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) unsigned long target_length = 0; 721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) status = NtQuerySymbolicLinkObject(symbolic_link, &target_path, 731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) &target_length); 741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (status != STATUS_BUFFER_TOO_SMALL) { 751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) NtClose(symbolic_link); 761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DLOG(ERROR) << "Failed to get length for symbolic link target. Error: " 771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) << status; 781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return status; 791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) target_path.Buffer = new wchar_t[target_length + 1]; 821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) target_path.Length = 0; 831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) target_path.MaximumLength = target_length; 841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) status = NtQuerySymbolicLinkObject(symbolic_link, &target_path, 851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) &target_length); 861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (status == STATUS_SUCCESS) { 871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) target->assign(target_path.Buffer, target_length); 881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } else { 891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DLOG(ERROR) << "Failed to resolve symbolic link. Error: " << status; 901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) NtClose(symbolic_link); 931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) delete[] target_path.Buffer; 941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return status; 951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)NTSTATUS GetBaseNamedObjectsDirectory(HANDLE* directory) { 981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) static HANDLE base_named_objects_handle = NULL; 991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (base_named_objects_handle) { 1001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) *directory = base_named_objects_handle; 1011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return STATUS_SUCCESS; 1021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 1031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) NtOpenDirectoryObjectFunction NtOpenDirectoryObject = NULL; 1051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ResolveNTFunctionPtr("NtOpenDirectoryObject", &NtOpenDirectoryObject); 1061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DWORD session_id = 0; 1081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ProcessIdToSessionId(::GetCurrentProcessId(), &session_id); 1091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 base_named_objects_path; 1111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) NTSTATUS status = ResolveSymbolicLink(L"\\Sessions\\BNOLINKS", 1131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) base::StringPrintf(L"%d", session_id), 1141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) &base_named_objects_path); 1151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (status != STATUS_SUCCESS) { 1161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DLOG(ERROR) << "Failed to resolve BaseNamedObjects path. Error: " 1171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) << status; 1181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return status; 1191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 1201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) UNICODE_STRING directory_name = {}; 1221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) OBJECT_ATTRIBUTES object_attributes = {}; 1231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) InitObjectAttribs(base_named_objects_path, OBJ_CASE_INSENSITIVE, NULL, 1241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) &object_attributes, &directory_name); 1251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) status = NtOpenDirectoryObject(&base_named_objects_handle, 1261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DIRECTORY_ALL_ACCESS, 1271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) &object_attributes); 1281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (status == STATUS_SUCCESS) 1291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) *directory = base_named_objects_handle; 1301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return status; 1311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 1321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SyncPolicy::GenerateRules(const wchar_t* name, 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TargetPolicy::Semantics semantics, 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LowLevelPolicy* policy) { 1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 mod_name(name); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mod_name.empty()) { 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (TargetPolicy::EVENTS_ALLOW_ANY != semantics && 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TargetPolicy::EVENTS_ALLOW_READONLY != semantics) { 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Other flags are not valid for sync policy yet. 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add the open rule. 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EvalResult result = ASK_BROKER; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolicyRule open(result); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!open.AddStringMatch(IF, OpenEventParams::NAME, name, CASE_INSENSITIVE)) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (TargetPolicy::EVENTS_ALLOW_READONLY == semantics) { 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We consider all flags that are not known to be readonly as potentially 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // used for write. 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DWORD allowed_flags = SYNCHRONIZE | GENERIC_READ | READ_CONTROL; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DWORD restricted_flags = ~allowed_flags; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) open.AddNumberMatch(IF_NOT, OpenEventParams::ACCESS, restricted_flags, AND); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!policy->AddRule(IPC_OPENEVENT_TAG, &open)) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If it's not a read only, add the create rule. 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (TargetPolicy::EVENTS_ALLOW_READONLY != semantics) { 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolicyRule create(result); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!create.AddStringMatch(IF, NameBased::NAME, name, CASE_INSENSITIVE)) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!policy->AddRule(IPC_CREATEEVENT_TAG, &create)) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 179116680a4aac90f2aa7413d9095a592090648e557Ben MurdochNTSTATUS SyncPolicy::CreateEventAction(EvalResult eval_result, 180116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const ClientInfo& client_info, 181116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const base::string16 &event_name, 182116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch uint32 event_type, 183116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch uint32 initial_state, 184116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch HANDLE *handle) { 1851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) NtCreateEventFunction NtCreateEvent = NULL; 1861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ResolveNTFunctionPtr("NtCreateEvent", &NtCreateEvent); 1871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The only action supported is ASK_BROKER which means create the requested 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // file as specified. 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ASK_BROKER != eval_result) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) HANDLE object_directory = NULL; 1941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) NTSTATUS status = GetBaseNamedObjectsDirectory(&object_directory); 1951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (status != STATUS_SUCCESS) 1961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return status; 1971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) UNICODE_STRING unicode_event_name = {}; 1991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) OBJECT_ATTRIBUTES object_attributes = {}; 2001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) InitObjectAttribs(event_name, OBJ_CASE_INSENSITIVE, object_directory, 2011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) &object_attributes, &unicode_event_name); 2021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) HANDLE local_handle = NULL; 2041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) status = NtCreateEvent(&local_handle, EVENT_ALL_ACCESS, &object_attributes, 2051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) static_cast<EVENT_TYPE>(event_type), initial_state); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (NULL == local_handle) 2071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return status; 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!::DuplicateHandle(::GetCurrentProcess(), local_handle, 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_info.process, handle, 0, FALSE, 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS)) { 2121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return STATUS_ACCESS_DENIED; 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return status; 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 217116680a4aac90f2aa7413d9095a592090648e557Ben MurdochNTSTATUS SyncPolicy::OpenEventAction(EvalResult eval_result, 218116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const ClientInfo& client_info, 219116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const base::string16 &event_name, 220116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch uint32 desired_access, 221116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch HANDLE *handle) { 2221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) NtOpenEventFunction NtOpenEvent = NULL; 2231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ResolveNTFunctionPtr("NtOpenEvent", &NtOpenEvent); 2241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The only action supported is ASK_BROKER which means create the requested 2261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // event as specified. 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ASK_BROKER != eval_result) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) HANDLE object_directory = NULL; 2311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) NTSTATUS status = GetBaseNamedObjectsDirectory(&object_directory); 2321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (status != STATUS_SUCCESS) 2331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return status; 2341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) UNICODE_STRING unicode_event_name = {}; 2361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) OBJECT_ATTRIBUTES object_attributes = {}; 2371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) InitObjectAttribs(event_name, OBJ_CASE_INSENSITIVE, object_directory, 2381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) &object_attributes, &unicode_event_name); 2391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) HANDLE local_handle = NULL; 2411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) status = NtOpenEvent(&local_handle, desired_access, &object_attributes); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (NULL == local_handle) 2431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return status; 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!::DuplicateHandle(::GetCurrentProcess(), local_handle, 2461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) client_info.process, handle, 0, FALSE, 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS)) { 2481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return STATUS_ACCESS_DENIED; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return status; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace sandbox 254