15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2010 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)#ifndef SANDBOX_SRC_SHARED_HANDLES_H__ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SANDBOX_SRC_SHARED_HANDLES_H__ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef HANDLE 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We can provide our own windows compatilble handle definition, but 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in general we want to rely on the client of this api to include 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the proper windows headers. Note that we don't want to bring the 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// whole <windows.h> into scope if we don't have to. 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef void* HANDLE; 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace sandbox { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SharedHandles is a simple class to stash and find windows object handles 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// given a raw block of memory which is shared between two processes. 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// It addresses the need to communicate a handle value between two windows 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// processes given that they are already sharing some memory. 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class is not exposed directly to users of the sanbox API, instead 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// we expose the wrapper methods TargetProcess::TransferHandle( ) and 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TargetServices::GetTransferHandle() 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use it for a small number of items, since internaly uses linear seach 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The use is very simple. Given a shared memory between proces A and B: 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// process A: 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// HANDLE handle = SomeFunction(..); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SharedHandles shared_handes; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// shared_handles.Init(memory) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// shared_handles.SetHandle(3, handle); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// process B: 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SharedHandles shared_handes; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// shared_handles.Init(memory) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// HANDLE handle = shared_handles.GetHandle(3); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note that '3' in this example is a unique id, that must be agreed before 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// transfer 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note2: While this class can be used in a single process, there are 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// better alternatives such as STL 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note3: Under windows a kernel object handle in one process does not 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// make sense for another process unless there is a DuplicateHandle( ) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// call involved which this class DOES NOT do that for you. 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note4: Under windows, shared memory when created is initialized to 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// zeros always. If you are not using shared memory it is your responsability 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to zero it for the setter process and to copy it to the getter process. 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SharedHandles { 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SharedHandles(); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initializes the shared memory for use. 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pass the shared memory base and size. It will internally compute 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // how many handles can it store. If initialization fails the return value 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is false. 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool Init(void* raw_mem, size_t size_bytes); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets a handle in the shared memory for transfer. 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Parameters: 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // tag : an integer, different from zero that uniquely identfies the 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // handle to transfer. 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // handle: the handle value associated with 'tag' to tranfer 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns false if there is not enough space in the shared memory for 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this handle. 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool SetHandle(uint32 tag, HANDLE handle); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Gets a handle previously stored by SetHandle. 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Parameters: 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // tag: an integer different from zero that uniquely identfies the handle 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to retrieve. 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // *handle: output handle value if the call was succesful. 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If a handle with the provided tag is not found the return value is false. 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the tag is found the return value is true. 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool GetHandle(uint32 tag, HANDLE* handle); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A single item is the tuple handle/tag 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct SharedItem { 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 tag; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* item; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SharedMem is used to layout the memory as an array of SharedItems 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct SharedMem { 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t max_items; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SharedItem* items; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Finds an Item tuple provided the handle tag. 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Uses linear search because we expect the number of handles to be 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // small (say less than ~100). 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SharedItem* FindByTag(uint32 tag); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SharedMem shared_; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(SharedHandles); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace sandbox 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // SANDBOX_SRC_SHARED_HANDLES_H__ 109