Home | History | Annotate | Download | only in src
      1 // Copyright (c) 2012 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/handle_interception.h"
      6 
      7 #include "sandbox/win/src/crosscall_client.h"
      8 #include "sandbox/win/src/ipc_tags.h"
      9 #include "sandbox/win/src/sandbox_factory.h"
     10 #include "sandbox/win/src/sandbox_nt_util.h"
     11 #include "sandbox/win/src/sharedmem_ipc_client.h"
     12 #include "sandbox/win/src/target_services.h"
     13 
     14 namespace sandbox {
     15 
     16 ResultCode DuplicateHandleProxy(HANDLE source_handle,
     17                                 DWORD target_process_id,
     18                                 HANDLE* target_handle,
     19                                 DWORD desired_access,
     20                                 DWORD options) {
     21   *target_handle = NULL;
     22 
     23   void* memory = GetGlobalIPCMemory();
     24   if (NULL == memory)
     25     return SBOX_ERROR_NO_SPACE;
     26 
     27   SharedMemIPCClient ipc(memory);
     28   CrossCallReturn answer = {0};
     29   ResultCode code = CrossCall(ipc, IPC_DUPLICATEHANDLEPROXY_TAG,
     30                               source_handle, target_process_id,
     31                               desired_access, options, &answer);
     32   if (SBOX_ALL_OK != code)
     33     return code;
     34 
     35   if (answer.win32_result) {
     36     ::SetLastError(answer.nt_status);
     37     return SBOX_ERROR_GENERIC;
     38   }
     39 
     40   *target_handle = answer.handle;
     41   return SBOX_ALL_OK;
     42 }
     43 
     44 }  // namespace sandbox
     45 
     46