Upstream version 5.34.92.0
[platform/framework/web/crosswalk.git] / src / sandbox / win / src / named_pipe_dispatcher.cc
1 // Copyright (c) 2013 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 #include "sandbox/win/src/named_pipe_dispatcher.h"
6
7 #include "base/basictypes.h"
8
9 #include "sandbox/win/src/crosscall_client.h"
10 #include "sandbox/win/src/interception.h"
11 #include "sandbox/win/src/interceptors.h"
12 #include "sandbox/win/src/ipc_tags.h"
13 #include "sandbox/win/src/named_pipe_interception.h"
14 #include "sandbox/win/src/named_pipe_policy.h"
15 #include "sandbox/win/src/policy_broker.h"
16 #include "sandbox/win/src/policy_params.h"
17 #include "sandbox/win/src/sandbox.h"
18
19
20 namespace sandbox {
21
22 NamedPipeDispatcher::NamedPipeDispatcher(PolicyBase* policy_base)
23     : policy_base_(policy_base) {
24   static const IPCCall create_params = {
25     {IPC_CREATENAMEDPIPEW_TAG, WCHAR_TYPE, ULONG_TYPE, ULONG_TYPE, ULONG_TYPE,
26      ULONG_TYPE, ULONG_TYPE, ULONG_TYPE},
27     reinterpret_cast<CallbackGeneric>(&NamedPipeDispatcher::CreateNamedPipe)
28   };
29
30   ipc_calls_.push_back(create_params);
31 }
32
33 bool NamedPipeDispatcher::SetupService(InterceptionManager* manager,
34                                        int service) {
35   if (IPC_CREATENAMEDPIPEW_TAG == service)
36     return INTERCEPT_EAT(manager, kKerneldllName, CreateNamedPipeW,
37                          CREATE_NAMED_PIPE_ID, 36);
38
39   return false;
40 }
41
42 bool NamedPipeDispatcher::CreateNamedPipe(
43     IPCInfo* ipc, base::string16* name, DWORD open_mode, DWORD pipe_mode,
44     DWORD max_instances, DWORD out_buffer_size, DWORD in_buffer_size,
45     DWORD default_timeout) {
46   const wchar_t* pipe_name = name->c_str();
47   CountedParameterSet<NameBased> params;
48   params[NameBased::NAME] = ParamPickerMake(pipe_name);
49
50   EvalResult eval = policy_base_->EvalPolicy(IPC_CREATENAMEDPIPEW_TAG,
51                                              params.GetBase());
52
53   HANDLE pipe;
54   DWORD ret = NamedPipePolicy::CreateNamedPipeAction(eval, *ipc->client_info,
55                                                      *name, open_mode,
56                                                      pipe_mode, max_instances,
57                                                      out_buffer_size,
58                                                      in_buffer_size,
59                                                      default_timeout, &pipe);
60
61   ipc->return_info.win32_result = ret;
62   ipc->return_info.handle = pipe;
63   return true;
64 }
65
66 }  // namespace sandbox