Home | History | Annotate | Download | only in src
      1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef SANDBOX_SRC_SHARED_HANDLES_H__
      6 #define SANDBOX_SRC_SHARED_HANDLES_H__
      7 
      8 #include "base/basictypes.h"
      9 
     10 #ifndef HANDLE
     11 // We can provide our own windows compatilble handle definition, but
     12 // in general we want to rely on the client of this api to include
     13 // the proper windows headers. Note that we don't want to bring the
     14 // whole <windows.h> into scope if we don't have to.
     15 typedef void* HANDLE;
     16 #endif
     17 
     18 namespace sandbox {
     19 
     20 // SharedHandles is a simple class to stash and find windows object handles
     21 // given a raw block of memory which is shared between two processes.
     22 // It addresses the need to communicate a handle value between two windows
     23 // processes given that they are already sharing some memory.
     24 //
     25 // This class is not exposed directly to users of the sanbox API, instead
     26 // we expose the wrapper methods TargetProcess::TransferHandle( ) and
     27 // TargetServices::GetTransferHandle()
     28 //
     29 // Use it for a small number of items, since internaly uses linear seach
     30 //
     31 // The use is very simple. Given a shared memory between proces A and B:
     32 // process A:
     33 //  HANDLE handle = SomeFunction(..);
     34 //  SharedHandles shared_handes;
     35 //  shared_handles.Init(memory)
     36 //  shared_handles.SetHandle(3, handle);
     37 //
     38 // process B:
     39 //  SharedHandles shared_handes;
     40 //  shared_handles.Init(memory)
     41 //  HANDLE handle = shared_handles.GetHandle(3);
     42 //
     43 // Note that '3' in this example is a unique id, that must be agreed before
     44 // transfer
     45 //
     46 // Note2: While this class can be used in a single process, there are
     47 // better alternatives such as STL
     48 //
     49 // Note3: Under windows a kernel object handle in one process does not
     50 // make sense for another process unless there is a DuplicateHandle( )
     51 // call involved which this class DOES NOT do that for you.
     52 //
     53 // Note4: Under windows, shared memory when created is initialized to
     54 // zeros always. If you are not using shared memory it is your responsability
     55 // to zero it for the setter process and to copy it to the getter process.
     56 class SharedHandles {
     57  public:
     58   SharedHandles();
     59 
     60   // Initializes the shared memory for use.
     61   // Pass the shared memory base and size. It will internally compute
     62   // how many handles can it store. If initialization fails the return value
     63   // is false.
     64   bool Init(void* raw_mem, size_t size_bytes);
     65 
     66   // Sets a handle in the shared memory for transfer.
     67   // Parameters:
     68   // 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