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