resolver.cc 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  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. #include "sandbox/win/src/resolver.h"
  5. #include <stddef.h>
  6. #include "base/win/pe_image.h"
  7. #include "sandbox/win/src/sandbox_nt_util.h"
  8. namespace sandbox {
  9. NTSTATUS ResolverThunk::Init(const void* target_module,
  10. const void* interceptor_module,
  11. const char* target_name,
  12. const char* interceptor_name,
  13. const void* interceptor_entry_point,
  14. void* thunk_storage,
  15. size_t storage_bytes) {
  16. if (!thunk_storage || 0 == storage_bytes || !target_module || !target_name)
  17. return STATUS_INVALID_PARAMETER;
  18. if (storage_bytes < GetThunkSize())
  19. return STATUS_BUFFER_TOO_SMALL;
  20. NTSTATUS ret = STATUS_SUCCESS;
  21. if (!interceptor_entry_point) {
  22. ret = ResolveInterceptor(interceptor_module, interceptor_name,
  23. &interceptor_entry_point);
  24. if (!NT_SUCCESS(ret))
  25. return ret;
  26. }
  27. ret = ResolveTarget(target_module, target_name, &target_);
  28. if (!NT_SUCCESS(ret))
  29. return ret;
  30. interceptor_ = interceptor_entry_point;
  31. return ret;
  32. }
  33. NTSTATUS ResolverThunk::ResolveInterceptor(const void* interceptor_module,
  34. const char* interceptor_name,
  35. const void** address) {
  36. DCHECK_NT(address);
  37. if (!interceptor_module)
  38. return STATUS_INVALID_PARAMETER;
  39. base::win::PEImage pe(interceptor_module);
  40. if (!pe.VerifyMagic())
  41. return STATUS_INVALID_IMAGE_FORMAT;
  42. *address = reinterpret_cast<void*>(pe.GetProcAddress(interceptor_name));
  43. if (!(*address))
  44. return STATUS_PROCEDURE_NOT_FOUND;
  45. return STATUS_SUCCESS;
  46. }
  47. } // namespace sandbox