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