15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2006-2010 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sandbox/win/src/resolver.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/pe_image.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sandbox/win/src/sandbox_nt_util.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace sandbox { 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NTSTATUS ResolverThunk::Init(const void* target_module, 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const void* interceptor_module, 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* target_name, 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* interceptor_name, 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const void* interceptor_entry_point, 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* thunk_storage, 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t storage_bytes) { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (NULL == thunk_storage || 0 == storage_bytes || 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL == target_module || NULL == target_name) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return STATUS_INVALID_PARAMETER; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (storage_bytes < GetThunkSize()) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return STATUS_BUFFER_TOO_SMALL; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NTSTATUS ret = STATUS_SUCCESS; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (NULL == interceptor_entry_point) { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = ResolveInterceptor(interceptor_module, interceptor_name, 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &interceptor_entry_point); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!NT_SUCCESS(ret)) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ret; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = ResolveTarget(target_module, target_name, &target_); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!NT_SUCCESS(ret)) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ret; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor_ = interceptor_entry_point; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ret; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NTSTATUS ResolverThunk::ResolveInterceptor(const void* interceptor_module, 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* interceptor_name, 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const void** address) { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_NT(address); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!interceptor_module) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return STATUS_INVALID_PARAMETER; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::win::PEImage pe(interceptor_module); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!pe.VerifyMagic()) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return STATUS_INVALID_IMAGE_FORMAT; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *address = pe.GetProcAddress(interceptor_name); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(*address)) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return STATUS_PROCEDURE_NOT_FOUND; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return STATUS_SUCCESS; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace sandbox 63