- add sources.
[platform/framework/web/crosswalk.git] / src / sandbox / win / src / resolver.cc
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