|
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 |