Home | History | Annotate | Download | only in src
      1 // Copyright (c) 2006-2010 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/resolver.h"
      6 
      7 #include "base/win/pe_image.h"
      8 #include "sandbox/win/src/sandbox_nt_util.h"
      9 
     10 namespace sandbox {
     11 
     12 NTSTATUS ResolverThunk::Init(const void* target_module,
     13                              const void* interceptor_module,
     14                              const char* target_name,
     15                              const char* interceptor_name,
     16                              const void* interceptor_entry_point,
     17                              void* thunk_storage,
     18                              size_t storage_bytes) {
     19   if (NULL == thunk_storage || 0 == storage_bytes ||
     20       NULL == target_module || NULL == target_name)
     21     return STATUS_INVALID_PARAMETER;
     22 
     23   if (storage_bytes < GetThunkSize())
     24     return STATUS_BUFFER_TOO_SMALL;
     25 
     26   NTSTATUS ret = STATUS_SUCCESS;
     27   if (NULL == interceptor_entry_point) {
     28     ret = ResolveInterceptor(interceptor_module, interceptor_name,
     29                              &interceptor_entry_point);
     30     if (!NT_SUCCESS(ret))
     31       return ret;
     32   }
     33 
     34   ret = ResolveTarget(target_module, target_name, &target_);
     35   if (!NT_SUCCESS(ret))
     36     return ret;
     37 
     38   interceptor_ = interceptor_entry_point;
     39 
     40   return ret;
     41 }
     42 
     43 NTSTATUS ResolverThunk::ResolveInterceptor(const void* interceptor_module,
     44                                            const char* interceptor_name,
     45                                            const void** address) {
     46   DCHECK_NT(address);
     47   if (!interceptor_module)
     48     return STATUS_INVALID_PARAMETER;
     49 
     50   base::win::PEImage pe(interceptor_module);
     51   if (!pe.VerifyMagic())
     52     return STATUS_INVALID_IMAGE_FORMAT;
     53 
     54   *address = pe.GetProcAddress(interceptor_name);
     55 
     56   if (!(*address))
     57     return STATUS_PROCEDURE_NOT_FOUND;
     58 
     59   return STATUS_SUCCESS;
     60 }
     61 
     62 }  // namespace sandbox
     63