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