diff options
Diffstat (limited to 'sandbox/win/src/sandbox_utils.cc')
-rw-r--r-- | sandbox/win/src/sandbox_utils.cc | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/sandbox/win/src/sandbox_utils.cc b/sandbox/win/src/sandbox_utils.cc new file mode 100644 index 0000000..509c7c8 --- /dev/null +++ b/sandbox/win/src/sandbox_utils.cc @@ -0,0 +1,79 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "sandbox/win/src/sandbox_utils.h" + +#include <windows.h> + +#include "base/logging.h" +#include "base/win/windows_version.h" +#include "sandbox/win/src/internal_types.h" +#include "sandbox/win/src/nt_internals.h" + +namespace sandbox { + +bool GetModuleHandleHelper(DWORD flags, const wchar_t* module_name, + HMODULE* module) { + DCHECK(module); + + HMODULE kernel32_base = ::GetModuleHandle(kKerneldllName); + if (!kernel32_base) { + NOTREACHED(); + return false; + } + + GetModuleHandleExFunction get_module_handle_ex = reinterpret_cast< + GetModuleHandleExFunction>(::GetProcAddress(kernel32_base, + "GetModuleHandleExW")); + if (get_module_handle_ex) { + BOOL ret = get_module_handle_ex(flags, module_name, module); + return (ret ? true : false); + } + + if (!flags) { + *module = ::LoadLibrary(module_name); + } else if (flags & GET_MODULE_HANDLE_EX_FLAG_PIN) { + NOTREACHED(); + return false; + } else if (!(flags & GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS)) { + DCHECK((flags & GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT) == + GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT); + + *module = ::GetModuleHandle(module_name); + } else { + DCHECK((flags & (GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT | + GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS)) == + (GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT | + GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS)); + + MEMORY_BASIC_INFORMATION info = {0}; + size_t returned = VirtualQuery(module_name, &info, sizeof(info)); + if (sizeof(info) != returned) + return false; + *module = reinterpret_cast<HMODULE>(info.AllocationBase); + } + return true; +} + +bool IsXPSP2OrLater() { + base::win::Version version = base::win::GetVersion(); + return (version > base::win::VERSION_XP) || + ((version == base::win::VERSION_XP) && + (base::win::OSInfo::GetInstance()->service_pack().major >= 2)); +} + +void InitObjectAttribs(const std::wstring& name, ULONG attributes, HANDLE root, + OBJECT_ATTRIBUTES* obj_attr, UNICODE_STRING* uni_name) { + static RtlInitUnicodeStringFunction RtlInitUnicodeString; + if (!RtlInitUnicodeString) { + HMODULE ntdll = ::GetModuleHandle(kNtdllName); + RtlInitUnicodeString = reinterpret_cast<RtlInitUnicodeStringFunction>( + GetProcAddress(ntdll, "RtlInitUnicodeString")); + DCHECK(RtlInitUnicodeString); + } + RtlInitUnicodeString(uni_name, name.c_str()); + InitializeObjectAttributes(obj_attr, uni_name, attributes, root, NULL); +} + +}; // namespace sandbox |