Index: sandbox/win/src/crosscall_params.h |
diff --git a/sandbox/win/src/crosscall_params.h b/sandbox/win/src/crosscall_params.h |
deleted file mode 100644 |
index eb59c44239e2cf081eaf0030e783130e64d38f11..0000000000000000000000000000000000000000 |
--- a/sandbox/win/src/crosscall_params.h |
+++ /dev/null |
@@ -1,287 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#ifndef SANDBOX_SRC_CROSSCALL_PARAMS_H__ |
-#define SANDBOX_SRC_CROSSCALL_PARAMS_H__ |
- |
-#include <windows.h> |
-#include <lmaccess.h> |
-#include <stddef.h> |
-#include <stdint.h> |
- |
-#include <memory> |
- |
-#include "base/macros.h" |
-#include "sandbox/win/src/internal_types.h" |
-#include "sandbox/win/src/sandbox_types.h" |
- |
-// Increases |value| until there is no need for padding given an int64_t |
-// alignment. Returns the increased value. |
-inline uint32_t Align(uint32_t value) { |
- uint32_t alignment = sizeof(int64_t); |
- return ((value + alignment - 1) / alignment) * alignment; |
-} |
- |
-// This header is part of CrossCall: the sandbox inter-process communication. |
-// This header defines the basic types used both in the client IPC and in the |
-// server IPC code. CrossCallParams and ActualCallParams model the input |
-// parameters of an IPC call and CrossCallReturn models the output params and |
-// the return value. |
-// |
-// An IPC call is defined by its 'tag' which is a (uint32_t) unique identifier |
-// that is used to route the IPC call to the proper server. Every tag implies |
-// a complete call signature including the order and type of each parameter. |
-// |
-// Like most IPC systems. CrossCall is designed to take as inputs 'simple' |
-// types such as integers and strings. Classes, generic arrays or pointers to |
-// them are not supported. |
-// |
-// Another limitation of CrossCall is that the return value and output |
-// parameters can only be uint32_t integers. Returning complex structures or |
-// strings is not supported. |
- |
-namespace sandbox { |
- |
-// max number of extended return parameters. See CrossCallReturn |
-const size_t kExtendedReturnCount = 8; |
- |
-// Union of multiple types to be used as extended results |
-// in the CrossCallReturn. |
-union MultiType { |
- uint32_t unsigned_int; |
- void* pointer; |
- HANDLE handle; |
- ULONG_PTR ulong_ptr; |
-}; |
- |
-// Maximum number of IPC parameters currently supported. |
-// To increase this value, we have to: |
-// - Add another Callback typedef to Dispatcher. |
-// - Add another case to the switch on SharedMemIPCServer::InvokeCallback. |
-// - Add another case to the switch in GetActualAndMaxBufferSize |
-const int kMaxIpcParams = 9; |
- |
-// Contains the information about a parameter in the ipc buffer. |
-struct ParamInfo { |
- ArgType type_; |
- uint32_t offset_; |
- uint32_t size_; |
-}; |
- |
-// Models the return value and the return parameters of an IPC call |
-// currently limited to one status code and eight generic return values |
-// which cannot be pointers to other data. For x64 ports this structure |
-// might have to use other integer types. |
-struct CrossCallReturn { |
- // the IPC tag. It should match the original IPC tag. |
- uint32_t tag; |
- // The result of the IPC operation itself. |
- ResultCode call_outcome; |
- // the result of the IPC call as executed in the server. The interpretation |
- // of this value depends on the specific service. |
- union { |
- NTSTATUS nt_status; |
- DWORD win32_result; |
- }; |
- // Number of extended return values. |
- uint32_t extended_count; |
- // for calls that should return a windows handle. It is found here. |
- HANDLE handle; |
- // The array of extended values. |
- MultiType extended[kExtendedReturnCount]; |
-}; |
- |
-// CrossCallParams base class that models the input params all packed in a |
-// single compact memory blob. The representation can vary but in general a |
-// given child of this class is meant to represent all input parameters |
-// necessary to make a IPC call. |
-// |
-// This class cannot have virtual members because its assumed the IPC |
-// parameters start from the 'this' pointer to the end, which is defined by |
-// one of the subclasses |
-// |
-// Objects of this class cannot be constructed directly. Only derived |
-// classes have the proper knowledge to construct it. |
-class CrossCallParams { |
- public: |
- // Returns the tag (ipc unique id) associated with this IPC. |
- uint32_t GetTag() const { return tag_; } |
- |
- // Returns the beggining of the buffer where the IPC params can be stored. |
- // prior to an IPC call |
- const void* GetBuffer() const { |
- return this; |
- } |
- |
- // Returns how many parameter this IPC call should have. |
- uint32_t GetParamsCount() const { return params_count_; } |
- |
- // Returns a pointer to the CrossCallReturn structure. |
- CrossCallReturn* GetCallReturn() { |
- return &call_return; |
- } |
- |
- // Returns TRUE if this call contains InOut parameters. |
- bool IsInOut() const { return (1 == is_in_out_); } |
- |
- // Tells the CrossCall object if it contains InOut parameters. |
- void SetIsInOut(bool value) { |
- if (value) |
- is_in_out_ = 1; |
- else |
- is_in_out_ = 0; |
- } |
- |
- protected: |
- // constructs the IPC call params. Called only from the derived classes |
- CrossCallParams(uint32_t tag, uint32_t params_count) |
- : tag_(tag), is_in_out_(0), params_count_(params_count) {} |
- |
- private: |
- uint32_t tag_; |
- uint32_t is_in_out_; |
- CrossCallReturn call_return; |
- const uint32_t params_count_; |
- DISALLOW_COPY_AND_ASSIGN(CrossCallParams); |
-}; |
- |
-// ActualCallParams models an specific IPC call parameters with respect to the |
-// storage allocation that the packed parameters should need. |
-// NUMBER_PARAMS: the number of parameters, valid from 1 to N |
-// BLOCK_SIZE: the total storage that the NUMBER_PARAMS parameters can take, |
-// typically the block size is defined by the channel size of the underlying |
-// ipc mechanism. |
-// In practice this class is used to levergage C++ capacity to properly |
-// calculate sizes and displacements given the possibility of the packed params |
-// blob to be complex. |
-// |
-// As is, this class assumes that the layout of the blob is as follows. Assume |
-// that NUMBER_PARAMS = 2 and a 32-bit build: |
-// |
-// [ tag 4 bytes] |
-// [ IsOnOut 4 bytes] |
-// [ call return 52 bytes] |
-// [ params count 4 bytes] |
-// [ parameter 0 type 4 bytes] |
-// [ parameter 0 offset 4 bytes] ---delta to ---\ |
-// [ parameter 0 size 4 bytes] | |
-// [ parameter 1 type 4 bytes] | |
-// [ parameter 1 offset 4 bytes] ---------------|--\ |
-// [ parameter 1 size 4 bytes] | | |
-// [ parameter 2 type 4 bytes] | | |
-// [ parameter 2 offset 4 bytes] ----------------------\ |
-// [ parameter 2 size 4 bytes] | | | |
-// |---------------------------| | | | |
-// | value 0 (x bytes) | <--------------/ | | |
-// | value 1 (y bytes) | <-----------------/ | |
-// | | | |
-// | end of buffer | <---------------------/ |
-// |---------------------------| |
-// |
-// Note that the actual number of params is NUMBER_PARAMS + 1 |
-// so that the size of each actual param can be computed from the difference |
-// between one parameter and the next down. The offset of the last param |
-// points to the end of the buffer and the type and size are undefined. |
-// |
-template <size_t NUMBER_PARAMS, size_t BLOCK_SIZE> |
-class ActualCallParams : public CrossCallParams { |
- public: |
- // constructor. Pass the ipc unique tag as input |
- explicit ActualCallParams(uint32_t tag) |
- : CrossCallParams(tag, NUMBER_PARAMS) { |
- param_info_[0].offset_ = |
- static_cast<uint32_t>(parameters_ - reinterpret_cast<char*>(this)); |
- } |
- |
- // Testing-only constructor. Allows setting the |number_params| to a |
- // wrong value. |
- ActualCallParams(uint32_t tag, uint32_t number_params) |
- : CrossCallParams(tag, number_params) { |
- param_info_[0].offset_ = |
- static_cast<uint32_t>(parameters_ - reinterpret_cast<char*>(this)); |
- } |
- |
- // Testing-only method. Allows setting the apparent size to a wrong value. |
- // returns the previous size. |
- uint32_t OverrideSize(uint32_t new_size) { |
- uint32_t previous_size = param_info_[NUMBER_PARAMS].offset_; |
- param_info_[NUMBER_PARAMS].offset_ = new_size; |
- return previous_size; |
- } |
- |
- // Copies each paramter into the internal buffer. For each you must supply: |
- // index: 0 for the first param, 1 for the next an so on |
- bool CopyParamIn(uint32_t index, |
- const void* parameter_address, |
- uint32_t size, |
- bool is_in_out, |
- ArgType type) { |
- if (index >= NUMBER_PARAMS) { |
- return false; |
- } |
- |
- if (UINT32_MAX == size) { |
- // Memory error while getting the size. |
- return false; |
- } |
- |
- if (size && !parameter_address) { |
- return false; |
- } |
- |
- if ((size > sizeof(*this)) || |
- (param_info_[index].offset_ > (sizeof(*this) - size))) { |
- // It does not fit, abort copy. |
- return false; |
- } |
- |
- char* dest = reinterpret_cast<char*>(this) + param_info_[index].offset_; |
- |
- // We might be touching user memory, this has to be done from inside a try |
- // except. |
- __try { |
- memcpy(dest, parameter_address, size); |
- } |
- __except(EXCEPTION_EXECUTE_HANDLER) { |
- return false; |
- } |
- |
- // Set the flag to tell the broker to update the buffer once the call is |
- // made. |
- if (is_in_out) |
- SetIsInOut(true); |
- |
- param_info_[index + 1].offset_ = Align(param_info_[index].offset_ + |
- size); |
- param_info_[index].size_ = size; |
- param_info_[index].type_ = type; |
- return true; |
- } |
- |
- // Returns a pointer to a parameter in the memory section. |
- void* GetParamPtr(size_t index) { |
- return reinterpret_cast<char*>(this) + param_info_[index].offset_; |
- } |
- |
- // Returns the total size of the buffer. Only valid once all the paramters |
- // have been copied in with CopyParamIn. |
- uint32_t GetSize() const { return param_info_[NUMBER_PARAMS].offset_; } |
- |
- protected: |
- ActualCallParams() : CrossCallParams(0, NUMBER_PARAMS) { } |
- |
- private: |
- ParamInfo param_info_[NUMBER_PARAMS + 1]; |
- char parameters_[BLOCK_SIZE - sizeof(CrossCallParams) |
- - sizeof(ParamInfo) * (NUMBER_PARAMS + 1)]; |
- DISALLOW_COPY_AND_ASSIGN(ActualCallParams); |
-}; |
- |
-static_assert(sizeof(ActualCallParams<1, 1024>) == 1024, "bad size buffer"); |
-static_assert(sizeof(ActualCallParams<2, 1024>) == 1024, "bad size buffer"); |
-static_assert(sizeof(ActualCallParams<3, 1024>) == 1024, "bad size buffer"); |
- |
-} // namespace sandbox |
- |
-#endif // SANDBOX_SRC_CROSSCALL_PARAMS_H__ |