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
10namespace sandbox {
11
12NTSTATUS 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
43NTSTATUS 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