• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
Init(const void * target_module,const void * interceptor_module,const char * target_name,const char * interceptor_name,const void * interceptor_entry_point,void * thunk_storage,size_t storage_bytes)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 
ResolveInterceptor(const void * interceptor_module,const char * interceptor_name,const void ** address)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