Index: sandbox/win/src/crosscall_server.h |
diff --git a/sandbox/win/src/crosscall_server.h b/sandbox/win/src/crosscall_server.h |
deleted file mode 100644 |
index 0820ac440a624e07002bbc7171619e87fcb776af..0000000000000000000000000000000000000000 |
--- a/sandbox/win/src/crosscall_server.h |
+++ /dev/null |
@@ -1,228 +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_SERVER_H_ |
-#define SANDBOX_SRC_CROSSCALL_SERVER_H_ |
- |
-#include <stdint.h> |
- |
-#include <string> |
-#include <vector> |
- |
-#include "base/callback.h" |
-#include "base/macros.h" |
-#include "base/strings/string16.h" |
-#include "sandbox/win/src/crosscall_params.h" |
- |
-// This is the IPC server interface for CrossCall: The IPC for the Sandbox |
-// On the server, CrossCall needs two things: |
-// 1) threads: Or better said, someone to provide them, that is what the |
-// ThreadProvider interface is defined for. These thread(s) are |
-// the ones that will actually execute the IPC data retrieval. |
-// |
-// 2) a dispatcher: This interface represents the way to route and process |
-// an IPC call given the IPC tag. |
-// |
-// The other class included here CrossCallParamsEx is the server side version |
-// of the CrossCallParams class of /sandbox/crosscall_params.h The difference |
-// is that the sever version is paranoid about the correctness of the IPC |
-// message and will do all sorts of verifications. |
-// |
-// A general diagram of the interaction is as follows: |
-// |
-// ------------ |
-// | | |
-// ThreadProvider <--(1)Register--| IPC | |
-// | | Implemen | |
-// | | -tation | |
-// (2) | | OnMessage |
-// IPC fired --callback ------>| |--(3)---> Dispatcher |
-// | | |
-// ------------ |
-// |
-// The IPC implementation sits as a middleman between the handling of the |
-// specifics of scheduling a thread to service the IPC and the multiple |
-// entities that can potentially serve each particular IPC. |
-namespace sandbox { |
- |
-class InterceptionManager; |
- |
-// This function signature is required as the callback when an IPC call fires. |
-// context: a user-defined pointer that was set using ThreadProvider |
-// reason: 0 if the callback was fired because of a timeout. |
-// 1 if the callback was fired because of an event. |
-typedef void (__stdcall * CrossCallIPCCallback)(void* context, |
- unsigned char reason); |
- |
-// ThreadProvider models a thread factory. The idea is to decouple thread |
-// creation and lifetime from the inner guts of the IPC. The contract is |
-// simple: |
-// - the IPC implementation calls RegisterWait with a waitable object that |
-// becomes signaled when an IPC arrives and needs to be serviced. |
-// - when the waitable object becomes signaled, the thread provider conjures |
-// a thread that calls the callback (CrossCallIPCCallback) function |
-// - the callback function tries its best not to block and return quickly |
-// and should not assume that the next callback will use the same thread |
-// - when the callback returns the ThreadProvider owns again the thread |
-// and can destroy it or keep it around. |
-class ThreadProvider { |
- public: |
- // Registers a waitable object with the thread provider. |
- // client: A number to associate with all the RegisterWait calls, typically |
- // this is the address of the caller object. This parameter cannot |
- // be zero. |
- // waitable_object : a kernel object that can be waited on |
- // callback: a function pointer which is the function that will be called |
- // when the waitable object fires |
- // context: a user-provider pointer that is passed back to the callback |
- // when its called |
- virtual bool RegisterWait(const void* client, HANDLE waitable_object, |
- CrossCallIPCCallback callback, |
- void* context) = 0; |
- |
- // Removes all the registrations done with the same cookie parameter. |
- // This frees internal thread pool resources. |
- virtual bool UnRegisterWaits(void* cookie) = 0; |
- virtual ~ThreadProvider() {} |
-}; |
- |
-// Models the server-side of the original input parameters. |
-// Provides IPC buffer validation and it is capable of reading the parameters |
-// out of the IPC buffer. |
-class CrossCallParamsEx : public CrossCallParams { |
- public: |
- // Factory constructor. Pass an IPCbuffer (and buffer size) that contains a |
- // pending IPCcall. This constructor will: |
- // 1) validate the IPC buffer. returns NULL is the IPCbuffer is malformed. |
- // 2) make a copy of the IPCbuffer (parameter capture) |
- static CrossCallParamsEx* CreateFromBuffer(void* buffer_base, |
- uint32_t buffer_size, |
- uint32_t* output_size); |
- |
- // Provides IPCinput parameter raw access: |
- // index : the parameter to read; 0 is the first parameter |
- // returns NULL if the parameter is non-existent. If it exists it also |
- // returns the size in *size |
- void* GetRawParameter(uint32_t index, uint32_t* size, ArgType* type); |
- |
- // Gets a parameter that is four bytes in size. |
- // Returns false if the parameter does not exist or is not 32 bits wide. |
- bool GetParameter32(uint32_t index, uint32_t* param); |
- |
- // Gets a parameter that is void pointer in size. |
- // Returns false if the parameter does not exist or is not void pointer sized. |
- bool GetParameterVoidPtr(uint32_t index, void** param); |
- |
- // Gets a parameter that is a string. Returns false if the parameter does not |
- // exist. |
- bool GetParameterStr(uint32_t index, base::string16* string); |
- |
- // Gets a parameter that is an in/out buffer. Returns false is the parameter |
- // does not exist or if the size of the actual parameter is not equal to the |
- // expected size. |
- bool GetParameterPtr(uint32_t index, uint32_t expected_size, void** pointer); |
- |
- // Frees the memory associated with the IPC parameters. |
- static void operator delete(void* raw_memory) throw(); |
- |
- private: |
- // Only the factory method CreateFromBuffer can construct these objects. |
- CrossCallParamsEx(); |
- |
- ParamInfo param_info_[1]; |
- DISALLOW_COPY_AND_ASSIGN(CrossCallParamsEx); |
-}; |
- |
-// Simple helper function that sets the members of CrossCallReturn |
-// to the proper state to signal a basic error. |
-void SetCallError(ResultCode error, CrossCallReturn* call_return); |
- |
-// Sets the internal status of call_return to signify the that IPC call |
-// completed successfully. |
-void SetCallSuccess(CrossCallReturn* call_return); |
- |
-// Represents the client process that initiated the IPC which boils down to the |
-// process handle and the job object handle that contains the client process. |
-struct ClientInfo { |
- HANDLE process; |
- DWORD process_id; |
-}; |
- |
-// All IPC-related information to be passed to the IPC handler. |
-struct IPCInfo { |
- int ipc_tag; |
- const ClientInfo* client_info; |
- CrossCallReturn return_info; |
-}; |
- |
-// This structure identifies IPC signatures. |
-struct IPCParams { |
- int ipc_tag; |
- ArgType args[kMaxIpcParams]; |
- |
- bool Matches(IPCParams* other) const { |
- return !memcmp(this, other, sizeof(*other)); |
- } |
-}; |
- |
-// Models an entity that can process an IPC message or it can route to another |
-// one that could handle it. When an IPC arrives the IPC implementation will: |
-// 1) call OnMessageReady() with the tag of the pending IPC. If the dispatcher |
-// returns NULL it means that it cannot handle this IPC but if it returns |
-// non-null, it must be the pointer to a dispatcher that can handle it. |
-// 2) When the IPC finally obtains a valid Dispatcher the IPC |
-// implementation creates a CrossCallParamsEx from the raw IPC buffer. |
-// 3) It calls the returned callback, with the IPC info and arguments. |
-class Dispatcher { |
- public: |
- // Called from the IPC implementation to handle a specific IPC message. |
- typedef bool (Dispatcher::*CallbackGeneric)(); |
- typedef bool (Dispatcher::*Callback0)(IPCInfo* ipc); |
- typedef bool (Dispatcher::*Callback1)(IPCInfo* ipc, void* p1); |
- typedef bool (Dispatcher::*Callback2)(IPCInfo* ipc, void* p1, void* p2); |
- typedef bool (Dispatcher::*Callback3)(IPCInfo* ipc, void* p1, void* p2, |
- void* p3); |
- typedef bool (Dispatcher::*Callback4)(IPCInfo* ipc, void* p1, void* p2, |
- void* p3, void* p4); |
- typedef bool (Dispatcher::*Callback5)(IPCInfo* ipc, void* p1, void* p2, |
- void* p3, void* p4, void* p5); |
- typedef bool (Dispatcher::*Callback6)(IPCInfo* ipc, void* p1, void* p2, |
- void* p3, void* p4, void* p5, void* p6); |
- typedef bool (Dispatcher::*Callback7)(IPCInfo* ipc, void* p1, void* p2, |
- void* p3, void* p4, void* p5, void* p6, |
- void* p7); |
- typedef bool (Dispatcher::*Callback8)(IPCInfo* ipc, void* p1, void* p2, |
- void* p3, void* p4, void* p5, void* p6, |
- void* p7, void* p8); |
- typedef bool (Dispatcher::*Callback9)(IPCInfo* ipc, void* p1, void* p2, |
- void* p3, void* p4, void* p5, void* p6, |
- void* p7, void* p8, void* p9); |
- |
- // Called from the IPC implementation when an IPC message is ready override |
- // on a derived class to handle a set of IPC messages. Return NULL if your |
- // subclass does not handle the message or return the pointer to the subclass |
- // that can handle it. |
- virtual Dispatcher* OnMessageReady(IPCParams* ipc, CallbackGeneric* callback); |
- |
- // Called when a target proces is created, to setup the interceptions related |
- // with the given service (IPC). |
- virtual bool SetupService(InterceptionManager* manager, int service) = 0; |
- |
- Dispatcher(); |
- virtual ~Dispatcher(); |
- |
- protected: |
- // Structure that defines an IPC Call with all the parameters and the handler. |
- struct IPCCall { |
- IPCParams params; |
- CallbackGeneric callback; |
- }; |
- |
- // List of IPC Calls supported by the class. |
- std::vector<IPCCall> ipc_calls_; |
-}; |
- |
-} // namespace sandbox |
- |
-#endif // SANDBOX_SRC_CROSSCALL_SERVER_H_ |