1a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Copyright 2013 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/service_resolver.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/pe_image.h" 8a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "sandbox/win/src/internal_types.h" 9a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "sandbox/win/src/sandbox_nt_util.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace sandbox { 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NTSTATUS ServiceResolverThunk::ResolveInterceptor( 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const void* interceptor_module, 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* interceptor_name, 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const void** address) { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // After all, we are using a locally mapped version of the exe, so the 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // action is the same as for a target function. 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ResolveTarget(interceptor_module, interceptor_name, 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_cast<void**>(address)); 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// In this case all the work is done from the parent, so resolve is 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// just a simple GetProcAddress. 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NTSTATUS ServiceResolverThunk::ResolveTarget(const void* module, 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* function_name, 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void** address) { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (NULL == module) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return STATUS_UNSUCCESSFUL; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::win::PEImage module_image(module); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *address = module_image.GetProcAddress(function_name); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (NULL == *address) { 35a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) NOTREACHED_NT(); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return STATUS_UNSUCCESSFUL; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return STATUS_SUCCESS; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void ServiceResolverThunk::AllowLocalPatches() { 43a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ntdll_base_ = ::GetModuleHandle(kNtdllName); 44a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 45a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace sandbox 47