1b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project// Copyright (c) 2010 The Chromium Authors. All rights reserved. 2b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project// Use of this source code is governed by a BSD-style license that can be 3b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project// found in the LICENSE file. 4b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project 5b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project#ifndef SANDBOX_SRC_SHARED_HANDLES_H__ 6b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project#define SANDBOX_SRC_SHARED_HANDLES_H__ 7b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project 8b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project#include "base/basictypes.h" 9b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project 10b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project#ifndef HANDLE 11b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project// We can provide our own windows compatilble handle definition, but 12b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project// in general we want to rely on the client of this api to include 13b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project// the proper windows headers. Note that we don't want to bring the 14b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project// whole <windows.h> into scope if we don't have to. 15b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Projecttypedef void* HANDLE; 16b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project#endif 17b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project 18b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Projectnamespace sandbox { 19b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project 20b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project// SharedHandles is a simple class to stash and find windows object handles 21b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project// given a raw block of memory which is shared between two processes. 22b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project// It addresses the need to communicate a handle value between two windows 23b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project// processes given that they are already sharing some memory. 24b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project// 25b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project// This class is not exposed directly to users of the sanbox API, instead 26b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project// we expose the wrapper methods TargetProcess::TransferHandle( ) and 27b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project// TargetServices::GetTransferHandle() 28b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project// 29b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project// Use it for a small number of items, since internaly uses linear seach 30b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project// 31b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project// The use is very simple. Given a shared memory between proces A and B: 32b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project// process A: 33b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project// HANDLE handle = SomeFunction(..); 34b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project// SharedHandles shared_handes; 35b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project// shared_handles.Init(memory) 36b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project// shared_handles.SetHandle(3, handle); 37b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project// 38b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project// process B: 39b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project// SharedHandles shared_handes; 40b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project// shared_handles.Init(memory) 41b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project// HANDLE handle = shared_handles.GetHandle(3); 42b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project// 43b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project// Note that '3' in this example is a unique id, that must be agreed before 44b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project// transfer 45b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project// 46b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project// Note2: While this class can be used in a single process, there are 47b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project// better alternatives such as STL 48b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project// 49b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project// Note3: Under windows a kernel object handle in one process does not 50b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project// make sense for another process unless there is a DuplicateHandle( ) 51b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project// call involved which this class DOES NOT do that for you. 52b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project// 53b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project// Note4: Under windows, shared memory when created is initialized to 54b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project// zeros always. If you are not using shared memory it is your responsability 55b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project// to zero it for the setter process and to copy it to the getter process. 56b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Projectclass SharedHandles { 57b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project public: 58b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project SharedHandles(); 59b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project 60b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project // Initializes the shared memory for use. 61b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project // Pass the shared memory base and size. It will internally compute 62b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project // how many handles can it store. If initialization fails the return value 63b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project // is false. 64b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project bool Init(void* raw_mem, size_t size_bytes); 65b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project 66b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project // Sets a handle in the shared memory for transfer. 67b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project // Parameters: 68b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project // tag : an integer, different from zero that uniquely identfies the 69 // handle to transfer. 70 // handle: the handle value associated with 'tag' to tranfer 71 // Returns false if there is not enough space in the shared memory for 72 // this handle. 73 bool SetHandle(uint32 tag, HANDLE handle); 74 75 // Gets a handle previously stored by SetHandle. 76 // Parameters: 77 // tag: an integer different from zero that uniquely identfies the handle 78 // to retrieve. 79 // *handle: output handle value if the call was succesful. 80 // If a handle with the provided tag is not found the return value is false. 81 // If the tag is found the return value is true. 82 bool GetHandle(uint32 tag, HANDLE* handle); 83 84 private: 85 // A single item is the tuple handle/tag 86 struct SharedItem { 87 uint32 tag; 88 void* item; 89 }; 90 91 // SharedMem is used to layout the memory as an array of SharedItems 92 struct SharedMem { 93 size_t max_items; 94 SharedItem* items; 95 }; 96 97 // Finds an Item tuple provided the handle tag. 98 // Uses linear search because we expect the number of handles to be 99 // small (say less than ~100). 100 SharedItem* FindByTag(uint32 tag); 101 102 SharedMem shared_; 103 DISALLOW_COPY_AND_ASSIGN(SharedHandles); 104}; 105 106} // namespace sandbox 107 108#endif // SANDBOX_SRC_SHARED_HANDLES_H__ 109