Delete lots of unused base/win
Change-Id: Ia0b915bd0a39915569022c7a9ae29d2eb29fb228
Reviewed-on: https://gn-review.googlesource.com/1681
Reviewed-by: Brett Wilson <brettw@chromium.org>
Commit-Queue: Scott Graham <scottmg@chromium.org>
diff --git a/base/files/file_util_win.cc b/base/files/file_util_win.cc
index 545dbc0..9133d7e 100644
--- a/base/files/file_util_win.cc
+++ b/base/files/file_util_win.cc
@@ -30,7 +30,6 @@
#include "base/strings/utf_string_conversions.h"
#include "base/time/time.h"
#include "base/win/scoped_handle.h"
-#include "base/win/windows_version.h"
// #define needed to link in RtlGenRandom(), a.k.a. SystemFunction036. See the
// "Community Additions" comment on MSDN here:
diff --git a/base/win/async_operation.h b/base/win/async_operation.h
deleted file mode 100644
index 2c41ddf..0000000
--- a/base/win/async_operation.h
+++ /dev/null
@@ -1,244 +0,0 @@
-// Copyright 2018 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.
-
-#ifndef BASE_WIN_ASYNC_OPERATION_H_
-#define BASE_WIN_ASYNC_OPERATION_H_
-
-#include <unknwn.h>
-#include <windows.foundation.h>
-#include <wrl/async.h>
-#include <wrl/client.h>
-
-#include <type_traits>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/macros.h"
-#include "base/memory/weak_ptr.h"
-#include "base/optional.h"
-#include "base/threading/thread_checker.h"
-
-namespace base {
-namespace win {
-
-// This file provides an implementation of Windows::Foundation::IAsyncOperation.
-// Specializations exist for "regular" types and interface types that inherit
-// from IUnknown. Both specializations expose a callback() method, which can be
-// used to provide the result that will be forwarded to the registered
-// completion handler. For regular types it expects an instance of that type,
-// and for interface types it expects a corresponding ComPtr. This class is
-// thread-affine and all member methods should be called on the same thread that
-// constructed the object. In order to offload heavy result computation,
-// base's PostTaskAndReplyWithResult() should be used with the ResultCallback
-// passed as a reply.
-//
-// Example usages:
-//
-// // Regular types
-// auto regular_op = WRL::Make<base::win::AsyncOperation<int>>();
-// auto cb = regular_op->callback();
-// regular_op->put_Completed(...event handler...);
-// ...
-// // This will invoke the event handler.
-// std::move(cb).Run(123);
-// ...
-// // Results can be queried:
-// int results = 0;
-// regular_op->GetResults(&results);
-// EXPECT_EQ(123, results);
-//
-// // Interface types
-// auto interface_op = WRL::Make<base::win::AsyncOperation<FooBar*>>();
-// auto cb = interface_op->callback();
-// interface_op->put_Completed(...event handler...);
-// ...
-// // This will invoke the event handler.
-// std::move(cb).Run(WRL::Make<IFooBarImpl>());
-// ...
-// // Results can be queried:
-// WRL::ComPtr<IFooBar> results;
-// interface_op->GetResults(&results);
-// // |results| points to the provided IFooBarImpl instance.
-//
-// // Offloading a heavy computation:
-// auto my_op = WRL::Make<base::win::AsyncOperation<FooBar*>>();
-// base::PostTaskAndReplyWithResult(
-// base::BindOnce(MakeFooBar), my_op->callback());
-
-namespace internal {
-
-// Template tricks needed to dispatch to the correct implementation below.
-//
-// For all types which are neither InterfaceGroups nor RuntimeClasses, the
-// following three typedefs are synonyms for a single C++ type. But for
-// InterfaceGroups and RuntimeClasses, they are different types:
-// LogicalT: The C++ Type for the InterfaceGroup or RuntimeClass, when
-// used as a template parameter. Eg "RCFoo*"
-// AbiT: The C++ type for the default interface used to represent the
-// InterfaceGroup or RuntimeClass when passed as a method parameter.
-// Eg "IFoo*"
-// ComplexT: An instantiation of the Internal "AggregateType" template that
-// combines LogicalT with AbiT. Eg "AggregateType<RCFoo*,IFoo*>"
-//
-// windows.foundation.collections.h defines the following template and
-// semantics in Windows::Foundation::Internal:
-//
-// template <class LogicalType, class AbiType>
-// struct AggregateType;
-//
-// LogicalType - the Windows Runtime type (eg, runtime class, inteface group,
-// etc) being provided as an argument to an _impl template, when
-// that type cannot be represented at the ABI.
-// AbiType - the type used for marshalling, ie "at the ABI", for the
-// logical type.
-template <typename T>
-using ComplexT =
- typename ABI::Windows::Foundation::IAsyncOperation<T>::TResult_complex;
-
-template <typename T>
-using AbiT =
- typename ABI::Windows::Foundation::Internal::GetAbiType<ComplexT<T>>::type;
-
-template <typename T>
-using LogicalT = typename ABI::Windows::Foundation::Internal::GetLogicalType<
- ComplexT<T>>::type;
-
-template <typename T>
-using InterfaceT = std::remove_pointer_t<AbiT<T>>;
-
-// Implementation of shared functionality.
-template <class T>
-class AsyncOperationBase
- : public Microsoft::WRL::RuntimeClass<
- Microsoft::WRL::RuntimeClassFlags<
- Microsoft::WRL::WinRt | Microsoft::WRL::InhibitRoOriginateError>,
- ABI::Windows::Foundation::IAsyncOperation<T>> {
- public:
- using Handler = ABI::Windows::Foundation::IAsyncOperationCompletedHandler<T>;
-
- AsyncOperationBase() = default;
- ~AsyncOperationBase() { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); }
-
- // ABI::Windows::Foundation::IAsyncOperation:
- IFACEMETHODIMP put_Completed(Handler* handler) override {
- DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
- handler_ = handler;
- return S_OK;
- }
-
- IFACEMETHODIMP get_Completed(Handler** handler) override {
- DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
- return handler_.CopyTo(handler);
- }
-
- protected:
- void InvokeCompletedHandler() {
- handler_->Invoke(this, ABI::Windows::Foundation::AsyncStatus::Completed);
- }
-
- THREAD_CHECKER(thread_checker_);
-
- private:
- Microsoft::WRL::ComPtr<Handler> handler_;
-
- DISALLOW_COPY_AND_ASSIGN(AsyncOperationBase);
-};
-
-} // namespace internal
-
-template <typename T, typename Enable = void>
-class AsyncOperation;
-
-template <typename T>
-class AsyncOperation<
- T,
- std::enable_if_t<std::is_base_of<IUnknown, internal::InterfaceT<T>>::value>>
- : public internal::AsyncOperationBase<T> {
- public:
- using InterfacePointer = Microsoft::WRL::ComPtr<internal::InterfaceT<T>>;
- using ResultCallback = base::OnceCallback<void(InterfacePointer)>;
-
- AsyncOperation() : weak_factory_(this) {
- // Note: This can't be done in the constructor initializer list. This is
- // because it relies on weak_factory_ to be initialized, which needs to be
- // the last class member. Also applies below.
- callback_ =
- base::BindOnce(&AsyncOperation::OnResult, weak_factory_.GetWeakPtr());
- }
-
- ResultCallback callback() {
- // Note: `this->` here and below is necessary due to the
- // -Wmicrosoft-template compiler warning.
- DCHECK_CALLED_ON_VALID_THREAD(this->thread_checker_);
- DCHECK(!callback_.is_null());
- return std::move(callback_);
- }
-
- // ABI::Windows::Foundation::IAsyncOperation:
- IFACEMETHODIMP GetResults(internal::AbiT<T>* results) override {
- DCHECK_CALLED_ON_VALID_THREAD(this->thread_checker_);
- return ptr_ ? ptr_.CopyTo(results) : E_PENDING;
- }
-
- private:
- void OnResult(InterfacePointer ptr) {
- DCHECK_CALLED_ON_VALID_THREAD(this->thread_checker_);
- DCHECK(!ptr_);
- ptr_ = std::move(ptr);
- this->InvokeCompletedHandler();
- }
-
- ResultCallback callback_;
- InterfacePointer ptr_;
- base::WeakPtrFactory<AsyncOperation> weak_factory_;
-};
-
-template <typename T>
-class AsyncOperation<
- T,
- std::enable_if_t<
- !std::is_base_of<IUnknown, internal::InterfaceT<T>>::value>>
- : public internal::AsyncOperationBase<T> {
- public:
- using ResultCallback = base::OnceCallback<void(T)>;
-
- AsyncOperation() : weak_factory_(this) {
- callback_ =
- base::BindOnce(&AsyncOperation::OnResult, weak_factory_.GetWeakPtr());
- }
-
- ResultCallback callback() {
- DCHECK_CALLED_ON_VALID_THREAD(this->thread_checker_);
- DCHECK(!callback_.is_null());
- return std::move(callback_);
- }
-
- // ABI::Windows::Foundation::IAsyncOperation:
- IFACEMETHODIMP GetResults(internal::AbiT<T>* results) override {
- DCHECK_CALLED_ON_VALID_THREAD(this->thread_checker_);
- if (!value_)
- return E_PENDING;
-
- *results = *value_;
- return S_OK;
- }
-
- private:
- void OnResult(T result) {
- DCHECK_CALLED_ON_VALID_THREAD(this->thread_checker_);
- DCHECK(!value_);
- value_.emplace(std::move(result));
- this->InvokeCompletedHandler();
- }
-
- ResultCallback callback_;
- base::Optional<T> value_;
- base::WeakPtrFactory<AsyncOperation> weak_factory_;
-};
-
-} // namespace win
-} // namespace base
-
-#endif // BASE_WIN_ASYNC_OPERATION_H_
diff --git a/base/win/com_init_check_hook.cc b/base/win/com_init_check_hook.cc
deleted file mode 100644
index 7055bb0..0000000
--- a/base/win/com_init_check_hook.cc
+++ /dev/null
@@ -1,299 +0,0 @@
-// Copyright 2017 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 "base/win/com_init_check_hook.h"
-
-#include <objbase.h>
-#include <stdint.h>
-#include <string.h>
-#include <windows.h>
-
-#include "base/strings/stringprintf.h"
-#include "base/synchronization/lock.h"
-#include "base/win/com_init_util.h"
-#include "base/win/patch_util.h"
-
-namespace base {
-namespace win {
-
-#if defined(COM_INIT_CHECK_HOOK_ENABLED)
-
-namespace {
-
-// Hotpatchable Microsoft x86 32-bit functions take one of two forms:
-// Newer format:
-// RelAddr Binary Instruction Remarks
-// -5 cc int 3
-// -4 cc int 3
-// -3 cc int 3
-// -2 cc int 3
-// -1 cc int 3
-// 0 8bff mov edi,edi Actual entry point and no-op.
-// 2 ... Actual body.
-//
-// Older format:
-// RelAddr Binary Instruction Remarks
-// -5 90 nop
-// -4 90 nop
-// -3 90 nop
-// -2 90 nop
-// -1 90 nop
-// 0 8bff mov edi,edi Actual entry point and no-op.
-// 2 ... Actual body.
-//
-// The "int 3" or nop sled as well as entry point no-op are critical, as they
-// are just enough to patch in a short backwards jump to -5 (2 bytes) then that
-// can do a relative 32-bit jump about 2GB before or after the current address.
-//
-// To perform a hotpatch, we need to figure out where we want to go and where
-// we are now as the final jump is relative. Let's say we want to jump to
-// 0x12345678. Relative jumps are calculated from eip, which for our jump is the
-// next instruction address. For the example above, that means we start at a 0
-// base address.
-//
-// Our patch will then look as follows:
-// RelAddr Binary Instruction Remarks
-// -5 e978563412 jmp 0x12345678-(-0x5+0x5) Note little-endian format.
-// 0 ebf9 jmp -0x5-(0x0+0x2) Goes to RelAddr -0x5.
-// 2 ... Actual body.
-// Note: The jmp instructions above are structured as
-// Address(Destination)-(Address(jmp Instruction)+sizeof(jmp Instruction))
-
-// The struct below is provided for convenience and must be packed together byte
-// by byte with no word alignment padding. This comes at a very small
-// performance cost because now there are shifts handling the fields, but
-// it improves readability.
-#pragma pack(push, 1)
-struct StructuredHotpatch {
- unsigned char jmp_32_relative = 0xe9; // jmp relative 32-bit.
- int32_t relative_address = 0; // 32-bit signed operand.
- unsigned char jmp_8_relative = 0xeb; // jmp relative 8-bit.
- unsigned char back_address = 0xf9; // Operand of -7.
-};
-#pragma pack(pop)
-
-static_assert(sizeof(StructuredHotpatch) == 7,
- "Needs to be exactly 7 bytes for the hotpatch to work.");
-
-// nop Function Padding with "mov edi,edi"
-const unsigned char g_hotpatch_placeholder_nop[] = {0x90, 0x90, 0x90, 0x90,
- 0x90, 0x8b, 0xff};
-
-// int 3 Function Padding with "mov edi,edi"
-const unsigned char g_hotpatch_placeholder_int3[] = {0xcc, 0xcc, 0xcc, 0xcc,
- 0xcc, 0x8b, 0xff};
-
-class HookManager {
- public:
- static HookManager* GetInstance() {
- static auto* hook_manager = new HookManager();
- return hook_manager;
- }
-
- void RegisterHook() {
- AutoLock auto_lock(lock_);
- if (init_count_ == 0)
- WriteHook();
-
- ++init_count_;
- }
-
- void UnregisterHook() {
- AutoLock auto_lock(lock_);
- DCHECK_NE(0U, init_count_);
- if (init_count_ == 1)
- RevertHook();
-
- --init_count_;
- }
-
- private:
- enum class HotpatchPlaceholderFormat {
- // The hotpatch placeholder is currently unknown
- UNKNOWN,
- // The hotpatch placeholder used int 3's in the sled.
- INT3,
- // The hotpatch placeholder used nop's in the sled.
- NOP,
- // This function has already been patched by a different component.
- EXTERNALLY_PATCHED,
- };
-
- HookManager() = default;
- ~HookManager() = default;
-
- void WriteHook() {
- lock_.AssertAcquired();
- DCHECK(!ole32_library_);
- ole32_library_ = ::LoadLibrary(L"ole32.dll");
-
- if (!ole32_library_)
- return;
-
- // See banner comment above why this subtracts 5 bytes.
- co_create_instance_padded_address_ =
- reinterpret_cast<uint32_t>(
- GetProcAddress(ole32_library_, "CoCreateInstance")) -
- 5;
-
- // See banner comment above why this adds 7 bytes.
- original_co_create_instance_body_function_ =
- reinterpret_cast<decltype(original_co_create_instance_body_function_)>(
- co_create_instance_padded_address_ + 7);
-
- HotpatchPlaceholderFormat format = GetHotpatchPlaceholderFormat(
- reinterpret_cast<const void*>(co_create_instance_padded_address_));
- if (format == HotpatchPlaceholderFormat::UNKNOWN) {
- NOTREACHED() << "Unrecognized hotpatch function format: "
- << FirstSevenBytesToString(
- co_create_instance_padded_address_);
- return;
- } else if (format == HotpatchPlaceholderFormat::EXTERNALLY_PATCHED) {
- hotpatch_placeholder_format_ = format;
- NOTREACHED() << "CoCreateInstance appears to be previously patched. ("
- << FirstSevenBytesToString(
- co_create_instance_padded_address_)
- << ")";
- return;
- }
-
- uint32_t dchecked_co_create_instance_address =
- reinterpret_cast<uint32_t>(&HookManager::DCheckedCoCreateInstance);
- uint32_t jmp_offset_base_address = co_create_instance_padded_address_ + 5;
- StructuredHotpatch structured_hotpatch;
- structured_hotpatch.relative_address =
- dchecked_co_create_instance_address - jmp_offset_base_address;
-
- DCHECK_EQ(hotpatch_placeholder_format_, HotpatchPlaceholderFormat::UNKNOWN);
- DWORD patch_result = internal::ModifyCode(
- reinterpret_cast<void*>(co_create_instance_padded_address_),
- reinterpret_cast<void*>(&structured_hotpatch),
- sizeof(structured_hotpatch));
- if (patch_result == NO_ERROR)
- hotpatch_placeholder_format_ = format;
- }
-
- void RevertHook() {
- lock_.AssertAcquired();
- switch (hotpatch_placeholder_format_) {
- case HotpatchPlaceholderFormat::INT3:
- internal::ModifyCode(
- reinterpret_cast<void*>(co_create_instance_padded_address_),
- reinterpret_cast<const void*>(&g_hotpatch_placeholder_int3),
- sizeof(g_hotpatch_placeholder_int3));
- break;
- case HotpatchPlaceholderFormat::NOP:
- internal::ModifyCode(
- reinterpret_cast<void*>(co_create_instance_padded_address_),
- reinterpret_cast<const void*>(&g_hotpatch_placeholder_nop),
- sizeof(g_hotpatch_placeholder_nop));
- break;
- case HotpatchPlaceholderFormat::EXTERNALLY_PATCHED:
- case HotpatchPlaceholderFormat::UNKNOWN:
- break;
- }
-
- hotpatch_placeholder_format_ = HotpatchPlaceholderFormat::UNKNOWN;
-
- if (ole32_library_) {
- ::FreeLibrary(ole32_library_);
- ole32_library_ = nullptr;
- }
-
- co_create_instance_padded_address_ = 0;
- original_co_create_instance_body_function_ = nullptr;
- }
-
- HotpatchPlaceholderFormat GetHotpatchPlaceholderFormat(const void* address) {
- if (::memcmp(reinterpret_cast<void*>(co_create_instance_padded_address_),
- reinterpret_cast<const void*>(&g_hotpatch_placeholder_int3),
- sizeof(g_hotpatch_placeholder_int3)) == 0) {
- return HotpatchPlaceholderFormat::INT3;
- }
-
- if (::memcmp(reinterpret_cast<void*>(co_create_instance_padded_address_),
- reinterpret_cast<const void*>(&g_hotpatch_placeholder_nop),
- sizeof(g_hotpatch_placeholder_nop)) == 0) {
- return HotpatchPlaceholderFormat::NOP;
- }
-
- const unsigned char* instruction_bytes =
- reinterpret_cast<const unsigned char*>(
- co_create_instance_padded_address_);
- const unsigned char entry_point_byte = instruction_bytes[5];
- // Check for all of the common jmp opcodes.
- if (entry_point_byte == 0xeb || entry_point_byte == 0xe9 ||
- entry_point_byte == 0xff || entry_point_byte == 0xea) {
- return HotpatchPlaceholderFormat::EXTERNALLY_PATCHED;
- }
-
- return HotpatchPlaceholderFormat::UNKNOWN;
- }
-
- static HRESULT __stdcall DCheckedCoCreateInstance(const CLSID& rclsid,
- IUnknown* pUnkOuter,
- DWORD dwClsContext,
- REFIID riid,
- void** ppv) {
- // Chromium COM callers need to make sure that their thread is configured to
- // process COM objects to avoid creating an implicit MTA or silently failing
- // STA object creation call due to the SUCCEEDED() pattern for COM calls.
- //
- // If you hit this assert as part of migrating to the Task Scheduler,
- // evaluate your threading guarantees and dispatch your work with
- // base::CreateCOMSTATaskRunnerWithTraits().
- //
- // If you need MTA support, ping //base/task_scheduler/OWNERS.
- AssertComInitialized(
- "CoCreateInstance calls in Chromium require explicit COM "
- "initialization via base::CreateCOMSTATaskRunnerWithTraits() or "
- "ScopedCOMInitializer. See the comment in DCheckedCoCreateInstance for "
- "more details.");
- return original_co_create_instance_body_function_(rclsid, pUnkOuter,
- dwClsContext, riid, ppv);
- }
-
- // Returns the first 7 bytes in hex as a string at |address|.
- static std::string FirstSevenBytesToString(uint32_t address) {
- const unsigned char* bytes =
- reinterpret_cast<const unsigned char*>(address);
- return base::StringPrintf("%02x %02x %02x %02x %02x %02x %02x", bytes[0],
- bytes[1], bytes[2], bytes[3], bytes[4], bytes[5],
- bytes[6]);
- }
-
- // Synchronizes everything in this class.
- base::Lock lock_;
- size_t init_count_ = 0;
- HMODULE ole32_library_ = nullptr;
- uint32_t co_create_instance_padded_address_ = 0;
- HotpatchPlaceholderFormat hotpatch_placeholder_format_ =
- HotpatchPlaceholderFormat::UNKNOWN;
- static decltype(
- ::CoCreateInstance)* original_co_create_instance_body_function_;
-
- DISALLOW_COPY_AND_ASSIGN(HookManager);
-};
-
-decltype(::CoCreateInstance)*
- HookManager::original_co_create_instance_body_function_ = nullptr;
-
-} // namespace
-
-#endif // defined(COM_INIT_CHECK_HOOK_ENABLED)
-
-ComInitCheckHook::ComInitCheckHook() {
-#if defined(COM_INIT_CHECK_HOOK_ENABLED)
- HookManager::GetInstance()->RegisterHook();
-#endif // defined(COM_INIT_CHECK_HOOK_ENABLED)
-}
-
-ComInitCheckHook::~ComInitCheckHook() {
-#if defined(COM_INIT_CHECK_HOOK_ENABLED)
- HookManager::GetInstance()->UnregisterHook();
-#endif // defined(COM_INIT_CHECK_HOOK_ENABLED)
-}
-
-} // namespace win
-} // namespace base
diff --git a/base/win/com_init_check_hook.h b/base/win/com_init_check_hook.h
deleted file mode 100644
index 6681da1..0000000
--- a/base/win/com_init_check_hook.h
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2017 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.
-
-#ifndef BASE_WIN_COM_INIT_CHECK_HOOK_H_
-#define BASE_WIN_COM_INIT_CHECK_HOOK_H_
-
-#include "base/logging.h"
-#include "base/macros.h"
-#include "build_config.h"
-
-namespace base {
-namespace win {
-
-// Hotpatching is only supported in Intel 32-bit x86 processors because Windows
-// binaries contain a convenient 2 byte hotpatch noop. This doesn't exist in
-// 64-bit binaries.
-
-#if DCHECK_IS_ON() && defined(ARCH_CPU_X86_FAMILY) && \
- defined(ARCH_CPU_32_BITS) && !defined(GOOGLE_CHROME_BUILD) && \
- !defined(OFFICIAL_BUILD) && \
- !defined(COM_INIT_CHECK_HOOK_DISABLED) // See crbug/737090 for details.
-#define COM_INIT_CHECK_HOOK_ENABLED
-#endif
-
-// Manages the installation of consistency DCHECK hooks of COM APIs that require
-// COM to be initialized and only works if COM_INIT_CHECK_HOOK_ENABLED is
-// defined. Care should be taken if this is instantiated with multiple threads
-// running as the hotpatch does not apply atomically.
-class ComInitCheckHook {
- public:
- ComInitCheckHook();
- ~ComInitCheckHook();
-
- private:
- DISALLOW_COPY_AND_ASSIGN(ComInitCheckHook);
-};
-
-} // namespace win
-} // namespace base
-
-#endif // BASE_WIN_COM_INIT_CHECK_HOOK_H_
diff --git a/base/win/com_init_util.cc b/base/win/com_init_util.cc
deleted file mode 100644
index d81f420..0000000
--- a/base/win/com_init_util.cc
+++ /dev/null
@@ -1,81 +0,0 @@
-// Copyright 2017 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 "base/win/com_init_util.h"
-
-#include <windows.h>
-#include <winternl.h>
-
-namespace base {
-namespace win {
-
-#if DCHECK_IS_ON()
-
-namespace {
-
-const char kComNotInitialized[] = "COM is not initialized on this thread.";
-
-// Derived from combase.dll.
-struct OleTlsData {
- enum ApartmentFlags {
- LOGICAL_THREAD_REGISTERED = 0x2,
- STA = 0x80,
- MTA = 0x140,
- };
-
- void* thread_base;
- void* sm_allocator;
- DWORD apartment_id;
- DWORD apartment_flags;
- // There are many more fields than this, but for our purposes, we only care
- // about |apartment_flags|. Correctly declaring the previous types allows this
- // to work between x86 and x64 builds.
-};
-
-OleTlsData* GetOleTlsData() {
- TEB* teb = NtCurrentTeb();
- return reinterpret_cast<OleTlsData*>(teb->ReservedForOle);
-}
-
-ComApartmentType GetComApartmentTypeForThread() {
- OleTlsData* ole_tls_data = GetOleTlsData();
- if (!ole_tls_data)
- return ComApartmentType::NONE;
-
- if (ole_tls_data->apartment_flags & OleTlsData::ApartmentFlags::STA)
- return ComApartmentType::STA;
-
- if ((ole_tls_data->apartment_flags & OleTlsData::ApartmentFlags::MTA) ==
- OleTlsData::ApartmentFlags::MTA) {
- return ComApartmentType::MTA;
- }
-
- return ComApartmentType::NONE;
-}
-
-} // namespace
-
-void AssertComInitialized(const char* message) {
- if (GetComApartmentTypeForThread() != ComApartmentType::NONE)
- return;
-
- // COM worker threads don't always set up the apartment, but they do perform
- // some thread registration, so we allow those.
- OleTlsData* ole_tls_data = GetOleTlsData();
- if (ole_tls_data && (ole_tls_data->apartment_flags &
- OleTlsData::ApartmentFlags::LOGICAL_THREAD_REGISTERED)) {
- return;
- }
-
- NOTREACHED() << (message ? message : kComNotInitialized);
-}
-
-void AssertComApartmentType(ComApartmentType apartment_type) {
- DCHECK_EQ(apartment_type, GetComApartmentTypeForThread());
-}
-
-#endif // DCHECK_IS_ON()
-
-} // namespace win
-} // namespace base
diff --git a/base/win/com_init_util.h b/base/win/com_init_util.h
deleted file mode 100644
index 9d47099..0000000
--- a/base/win/com_init_util.h
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2017 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.
-
-#ifndef BASE_WIN_COM_INIT_UTIL_H_
-#define BASE_WIN_COM_INIT_UTIL_H_
-
-#include "base/logging.h"
-
-namespace base {
-namespace win {
-
-enum class ComApartmentType {
- // Uninitialized or has an unrecognized apartment type.
- NONE,
- // Single-threaded Apartment.
- STA,
- // Multi-threaded Apartment.
- MTA,
-};
-
-#if DCHECK_IS_ON()
-
-// DCHECKs if COM is not initialized on this thread as an STA or MTA.
-// |message| is optional and is used for the DCHECK if specified.
-void AssertComInitialized(const char* message = nullptr);
-
-// DCHECKs if |apartment_type| is not the same as the current thread's apartment
-// type.
-void AssertComApartmentType(ComApartmentType apartment_type);
-
-#else // DCHECK_IS_ON()
-inline void AssertComInitialized() {}
-inline void AssertComApartmentType(ComApartmentType apartment_type) {}
-#endif // DCHECK_IS_ON()
-
-} // namespace win
-} // namespace base
-
-#endif // BASE_WIN_COM_INIT_UTIL_H_
diff --git a/base/win/core_winrt_util.cc b/base/win/core_winrt_util.cc
deleted file mode 100644
index 7a30490..0000000
--- a/base/win/core_winrt_util.cc
+++ /dev/null
@@ -1,83 +0,0 @@
-// Copyright 2017 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 "base/win/core_winrt_util.h"
-
-namespace {
-
-FARPROC LoadComBaseFunction(const char* function_name) {
- static HMODULE const handle = ::LoadLibrary(L"combase.dll");
- return handle ? ::GetProcAddress(handle, function_name) : nullptr;
-}
-
-decltype(&::RoInitialize) GetRoInitializeFunction() {
- static decltype(&::RoInitialize) const function =
- reinterpret_cast<decltype(&::RoInitialize)>(
- LoadComBaseFunction("RoInitialize"));
- return function;
-}
-
-decltype(&::RoUninitialize) GetRoUninitializeFunction() {
- static decltype(&::RoUninitialize) const function =
- reinterpret_cast<decltype(&::RoUninitialize)>(
- LoadComBaseFunction("RoUninitialize"));
- return function;
-}
-
-decltype(&::RoActivateInstance) GetRoActivateInstanceFunction() {
- static decltype(&::RoActivateInstance) const function =
- reinterpret_cast<decltype(&::RoActivateInstance)>(
- LoadComBaseFunction("RoActivateInstance"));
- return function;
-}
-
-decltype(&::RoGetActivationFactory) GetRoGetActivationFactoryFunction() {
- static decltype(&::RoGetActivationFactory) const function =
- reinterpret_cast<decltype(&::RoGetActivationFactory)>(
- LoadComBaseFunction("RoGetActivationFactory"));
- return function;
-}
-
-} // namespace
-
-namespace base {
-namespace win {
-
-bool ResolveCoreWinRTDelayload() {
- // TODO(finnur): Add AssertIOAllowed once crbug.com/770193 is fixed.
- return GetRoInitializeFunction() && GetRoUninitializeFunction() &&
- GetRoActivateInstanceFunction() && GetRoGetActivationFactoryFunction();
-}
-
-HRESULT RoInitialize(RO_INIT_TYPE init_type) {
- auto ro_initialize_func = GetRoInitializeFunction();
- if (!ro_initialize_func)
- return E_FAIL;
- return ro_initialize_func(init_type);
-}
-
-void RoUninitialize() {
- auto ro_uninitialize_func = GetRoUninitializeFunction();
- if (ro_uninitialize_func)
- ro_uninitialize_func();
-}
-
-HRESULT RoGetActivationFactory(HSTRING class_id,
- const IID& iid,
- void** out_factory) {
- auto get_factory_func = GetRoGetActivationFactoryFunction();
- if (!get_factory_func)
- return E_FAIL;
- return get_factory_func(class_id, iid, out_factory);
-}
-
-HRESULT RoActivateInstance(HSTRING class_id, IInspectable** instance) {
- auto activate_instance_func = GetRoActivateInstanceFunction();
- if (!activate_instance_func)
- return E_FAIL;
- return activate_instance_func(class_id, instance);
-}
-
-} // namespace win
-} // namespace base
diff --git a/base/win/core_winrt_util.h b/base/win/core_winrt_util.h
deleted file mode 100644
index d760c79..0000000
--- a/base/win/core_winrt_util.h
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2017 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.
-
-#ifndef BASE_WIN_CORE_WINRT_UTIL_H_
-#define BASE_WIN_CORE_WINRT_UTIL_H_
-
-#include <hstring.h>
-#include <inspectable.h>
-#include <roapi.h>
-#include <windef.h>
-
-#include "base/strings/string16.h"
-#include "base/win/scoped_hstring.h"
-
-namespace base {
-namespace win {
-
-// Provides access to Core WinRT functions which may not be available on
-// Windows 7. Loads functions dynamically at runtime to prevent library
-// dependencies.
-
-bool ResolveCoreWinRTDelayload();
-
-// The following stubs are provided for when component build is enabled, in
-// order to avoid the propagation of delay-loading CoreWinRT to other modules.
-
-HRESULT RoInitialize(RO_INIT_TYPE init_type);
-
-void RoUninitialize();
-
-HRESULT RoGetActivationFactory(HSTRING class_id,
- const IID& iid,
- void** out_factory);
-
-HRESULT RoActivateInstance(HSTRING class_id, IInspectable** instance);
-
-// Retrieves an activation factory for the type specified.
-template <typename InterfaceType, char16 const* runtime_class_id>
-HRESULT GetActivationFactory(InterfaceType** factory) {
- ScopedHString class_id_hstring = ScopedHString::Create(runtime_class_id);
- if (!class_id_hstring.is_valid())
- return E_FAIL;
-
- return base::win::RoGetActivationFactory(class_id_hstring.get(),
- IID_PPV_ARGS(factory));
-}
-
-} // namespace win
-} // namespace base
-
-#endif // BASE_WIN_CORE_WINRT_UTIL_H_
diff --git a/base/win/dllmain.cc b/base/win/dllmain.cc
deleted file mode 100644
index 907c7f4..0000000
--- a/base/win/dllmain.cc
+++ /dev/null
@@ -1,123 +0,0 @@
-// Copyright (c) 2012 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.
-
-// Windows doesn't support pthread_key_create's destr_function, and in fact
-// it's a bit tricky to get code to run when a thread exits. This is
-// cargo-cult magic from http://www.codeproject.com/threads/tls.asp.
-// We are trying to be compatible with both a LoadLibrary style invocation, as
-// well as static linking. This code only needs to be included if we use
-// LoadLibrary, but it hooks into the "standard" set of TLS callbacks that are
-// provided for static linking.
-
-// This code is deliberately written to match the style of calls seen in
-// base/threading/thread_local_storage_win.cc. Please keep the two in sync if
-// coding conventions are changed.
-
-// WARNING: Do *NOT* try to include this in the construction of the base
-// library, even though it potentially drives code in
-// base/threading/thread_local_storage_win.cc. If you do, some users will end
-// up getting duplicate definition of DllMain() in some of their later links.
-
-// Force a reference to _tls_used to make the linker create the TLS directory
-// if it's not already there (that is, even if __declspec(thread) is not used).
-// Force a reference to p_thread_callback_dllmain_typical_entry to prevent whole
-// program optimization from discarding the variables.
-
-#include <windows.h>
-
-#include "base/compiler_specific.h"
-#include "base/win/win_util.h"
-
-// Indicate if another service is scanning the callbacks. When this becomes
-// set to true, then DllMain() will stop supporting the callback service. This
-// value is set to true the first time any of our callbacks are called, as that
-// shows that some other service is handling callbacks.
-static bool linker_notifications_are_active = false;
-
-// This will be our mostly no-op callback that we'll list. We won't
-// deliberately call it, and if it is called, that means we don't need to do any
-// of the callbacks anymore. We expect such a call to arrive via a
-// THREAD_ATTACH message, long before we'd have to perform our THREAD_DETACH
-// callbacks.
-static void NTAPI on_callback(PVOID h, DWORD reason, PVOID reserved);
-
-#ifdef _WIN64
-
-#pragma comment(linker, "/INCLUDE:_tls_used")
-#pragma comment(linker, "/INCLUDE:p_thread_callback_dllmain_typical_entry")
-
-#else // _WIN64
-
-#pragma comment(linker, "/INCLUDE:__tls_used")
-#pragma comment(linker, "/INCLUDE:_p_thread_callback_dllmain_typical_entry")
-
-#endif // _WIN64
-
-// Explicitly depend on VC\crt\src\tlssup.c variables
-// to bracket the list of TLS callbacks.
-extern "C" PIMAGE_TLS_CALLBACK __xl_a, __xl_z;
-
-// extern "C" suppresses C++ name mangling so we know the symbol names for the
-// linker /INCLUDE:symbol pragmas above.
-extern "C" {
-#ifdef _WIN64
-
-// .CRT section is merged with .rdata on x64 so it must be constant data.
-#pragma data_seg(push, old_seg)
-// Use a typical possible name in the .CRT$XL? list of segments.
-#pragma const_seg(".CRT$XLB")
-// When defining a const variable, it must have external linkage to be sure the
-// linker doesn't discard it.
-extern const PIMAGE_TLS_CALLBACK p_thread_callback_dllmain_typical_entry;
-const PIMAGE_TLS_CALLBACK p_thread_callback_dllmain_typical_entry = on_callback;
-#pragma data_seg(pop, old_seg)
-
-#else // _WIN64
-
-#pragma data_seg(push, old_seg)
-// Use a typical possible name in the .CRT$XL? list of segments.
-#pragma data_seg(".CRT$XLB")
-PIMAGE_TLS_CALLBACK p_thread_callback_dllmain_typical_entry = on_callback;
-#pragma data_seg(pop, old_seg)
-
-#endif // _WIN64
-} // extern "C"
-
-// Custom crash code to get a unique entry in crash reports.
-NOINLINE static void CrashOnProcessDetach() {
- *static_cast<volatile int*>(0) = 0x356;
-}
-
-// Make DllMain call the listed callbacks. This way any third parties that are
-// linked in will also be called.
-BOOL WINAPI DllMain(PVOID h, DWORD reason, PVOID reserved) {
- if (DLL_PROCESS_DETACH == reason && base::win::ShouldCrashOnProcessDetach())
- CrashOnProcessDetach();
-
- if (DLL_THREAD_DETACH != reason && DLL_PROCESS_DETACH != reason)
- return true; // We won't service THREAD_ATTACH calls.
-
- if (linker_notifications_are_active)
- return true; // Some other service is doing this work.
-
- for (PIMAGE_TLS_CALLBACK* it = &__xl_a; it < &__xl_z; ++it) {
- if (*it == NULL || *it == on_callback)
- continue; // Don't bother to call our own callback.
- (*it)(h, reason, reserved);
- }
- return true;
-}
-
-static void NTAPI on_callback(PVOID h, DWORD reason, PVOID reserved) {
- // Do nothing. We were just a place holder in the list used to test that we
- // call all items.
- // If we are called, it means that some other system is scanning the callbacks
- // and we don't need to do so in DllMain().
- linker_notifications_are_active = true;
- // Note: If some other routine some how plays this same game... we could both
- // decide not to do the scanning <sigh>, but this trick should suppress
- // duplicate calls on Vista, where the runtime takes care of the callbacks,
- // and allow us to do the callbacks on XP, where we are currently devoid of
- // callbacks (due to an explicit LoadLibrary call).
-}
diff --git a/base/win/enum_variant.cc b/base/win/enum_variant.cc
deleted file mode 100644
index fd81775..0000000
--- a/base/win/enum_variant.cc
+++ /dev/null
@@ -1,79 +0,0 @@
-// 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 "base/win/enum_variant.h"
-
-#include <algorithm>
-
-#include "base/logging.h"
-
-namespace base {
-namespace win {
-
-EnumVariant::EnumVariant(unsigned long count)
- : items_(new VARIANT[count]), count_(count), current_index_(0) {}
-
-EnumVariant::~EnumVariant() {}
-
-VARIANT* EnumVariant::ItemAt(unsigned long index) {
- DCHECK(index < count_);
- return &items_[index];
-}
-
-ULONG STDMETHODCALLTYPE EnumVariant::AddRef() {
- return IUnknownImpl::AddRef();
-}
-
-ULONG STDMETHODCALLTYPE EnumVariant::Release() {
- return IUnknownImpl::Release();
-}
-
-STDMETHODIMP EnumVariant::QueryInterface(REFIID riid, void** ppv) {
- if (riid == IID_IEnumVARIANT) {
- *ppv = static_cast<IEnumVARIANT*>(this);
- AddRef();
- return S_OK;
- }
-
- return IUnknownImpl::QueryInterface(riid, ppv);
-}
-
-STDMETHODIMP EnumVariant::Next(ULONG requested_count,
- VARIANT* out_elements,
- ULONG* out_elements_received) {
- unsigned long count = std::min(requested_count, count_ - current_index_);
- for (unsigned long i = 0; i < count; ++i)
- out_elements[i] = items_[current_index_ + i];
- current_index_ += count;
- *out_elements_received = count;
-
- return (count == requested_count ? S_OK : S_FALSE);
-}
-
-STDMETHODIMP EnumVariant::Skip(ULONG skip_count) {
- unsigned long count = skip_count;
- if (current_index_ + count > count_)
- count = count_ - current_index_;
-
- current_index_ += count;
- return (count == skip_count ? S_OK : S_FALSE);
-}
-
-STDMETHODIMP EnumVariant::Reset() {
- current_index_ = 0;
- return S_OK;
-}
-
-STDMETHODIMP EnumVariant::Clone(IEnumVARIANT** out_cloned_object) {
- EnumVariant* other = new EnumVariant(count_);
- if (count_ > 0)
- memcpy(other->ItemAt(0), &items_[0], count_ * sizeof(VARIANT));
- other->Skip(current_index_);
- other->AddRef();
- *out_cloned_object = other;
- return S_OK;
-}
-
-} // namespace win
-} // namespace base
diff --git a/base/win/enum_variant.h b/base/win/enum_variant.h
deleted file mode 100644
index d12f350..0000000
--- a/base/win/enum_variant.h
+++ /dev/null
@@ -1,51 +0,0 @@
-// 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.
-
-#ifndef BASE_WIN_ENUM_VARIANT_H_
-#define BASE_WIN_ENUM_VARIANT_H_
-
-#include <unknwn.h>
-
-#include <memory>
-
-#include "base/win/iunknown_impl.h"
-
-namespace base {
-namespace win {
-
-// A simple implementation of IEnumVARIANT.
-class EnumVariant : public IEnumVARIANT, public IUnknownImpl {
- public:
- // The constructor allocates an array of size |count|. Then use
- // ItemAt to set the value of each item in the array to initialize it.
- explicit EnumVariant(unsigned long count);
-
- // Returns a mutable pointer to the item at position |index|.
- VARIANT* ItemAt(unsigned long index);
-
- // IUnknown.
- ULONG STDMETHODCALLTYPE AddRef() override;
- ULONG STDMETHODCALLTYPE Release() override;
- STDMETHODIMP QueryInterface(REFIID riid, void** ppv) override;
-
- // IEnumVARIANT.
- STDMETHODIMP Next(ULONG requested_count,
- VARIANT* out_elements,
- ULONG* out_elements_received) override;
- STDMETHODIMP Skip(ULONG skip_count) override;
- STDMETHODIMP Reset() override;
- STDMETHODIMP Clone(IEnumVARIANT** out_cloned_object) override;
-
- private:
- ~EnumVariant() override;
-
- std::unique_ptr<VARIANT[]> items_;
- unsigned long count_;
- unsigned long current_index_;
-};
-
-} // namespace win
-} // namespace base
-
-#endif // BASE_WIN_ENUM_VARIANT_H_
diff --git a/base/win/iat_patch_function.cc b/base/win/iat_patch_function.cc
deleted file mode 100644
index 5f151f9..0000000
--- a/base/win/iat_patch_function.cc
+++ /dev/null
@@ -1,255 +0,0 @@
-// 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 "base/win/iat_patch_function.h"
-
-#include "base/logging.h"
-#include "base/win/patch_util.h"
-#include "base/win/pe_image.h"
-
-namespace base {
-namespace win {
-
-namespace {
-
-struct InterceptFunctionInformation {
- bool finished_operation;
- const char* imported_from_module;
- const char* function_name;
- void* new_function;
- void** old_function;
- IMAGE_THUNK_DATA** iat_thunk;
- DWORD return_code;
-};
-
-void* GetIATFunction(IMAGE_THUNK_DATA* iat_thunk) {
- if (NULL == iat_thunk) {
- NOTREACHED();
- return NULL;
- }
-
- // Works around the 64 bit portability warning:
- // The Function member inside IMAGE_THUNK_DATA is really a pointer
- // to the IAT function. IMAGE_THUNK_DATA correctly maps to IMAGE_THUNK_DATA32
- // or IMAGE_THUNK_DATA64 for correct pointer size.
- union FunctionThunk {
- IMAGE_THUNK_DATA thunk;
- void* pointer;
- } iat_function;
-
- iat_function.thunk = *iat_thunk;
- return iat_function.pointer;
-}
-
-bool InterceptEnumCallback(const base::win::PEImage& image,
- const char* module,
- DWORD ordinal,
- const char* name,
- DWORD hint,
- IMAGE_THUNK_DATA* iat,
- void* cookie) {
- InterceptFunctionInformation* intercept_information =
- reinterpret_cast<InterceptFunctionInformation*>(cookie);
-
- if (NULL == intercept_information) {
- NOTREACHED();
- return false;
- }
-
- DCHECK(module);
-
- if ((0 == lstrcmpiA(module, intercept_information->imported_from_module)) &&
- (NULL != name) &&
- (0 == lstrcmpiA(name, intercept_information->function_name))) {
- // Save the old pointer.
- if (NULL != intercept_information->old_function) {
- *(intercept_information->old_function) = GetIATFunction(iat);
- }
-
- if (NULL != intercept_information->iat_thunk) {
- *(intercept_information->iat_thunk) = iat;
- }
-
- // portability check
- static_assert(
- sizeof(iat->u1.Function) == sizeof(intercept_information->new_function),
- "unknown IAT thunk format");
-
- // Patch the function.
- intercept_information->return_code = internal::ModifyCode(
- &(iat->u1.Function), &(intercept_information->new_function),
- sizeof(intercept_information->new_function));
-
- // Terminate further enumeration.
- intercept_information->finished_operation = true;
- return false;
- }
-
- return true;
-}
-
-// Helper to intercept a function in an import table of a specific
-// module.
-//
-// Arguments:
-// module_handle Module to be intercepted
-// imported_from_module Module that exports the symbol
-// function_name Name of the API to be intercepted
-// new_function Interceptor function
-// old_function Receives the original function pointer
-// iat_thunk Receives pointer to IAT_THUNK_DATA
-// for the API from the import table.
-//
-// Returns: Returns NO_ERROR on success or Windows error code
-// as defined in winerror.h
-DWORD InterceptImportedFunction(HMODULE module_handle,
- const char* imported_from_module,
- const char* function_name,
- void* new_function,
- void** old_function,
- IMAGE_THUNK_DATA** iat_thunk) {
- if ((NULL == module_handle) || (NULL == imported_from_module) ||
- (NULL == function_name) || (NULL == new_function)) {
- NOTREACHED();
- return ERROR_INVALID_PARAMETER;
- }
-
- base::win::PEImage target_image(module_handle);
- if (!target_image.VerifyMagic()) {
- NOTREACHED();
- return ERROR_INVALID_PARAMETER;
- }
-
- InterceptFunctionInformation intercept_information = {false,
- imported_from_module,
- function_name,
- new_function,
- old_function,
- iat_thunk,
- ERROR_GEN_FAILURE};
-
- // First go through the IAT. If we don't find the import we are looking
- // for in IAT, search delay import table.
- target_image.EnumAllImports(InterceptEnumCallback, &intercept_information);
- if (!intercept_information.finished_operation) {
- target_image.EnumAllDelayImports(InterceptEnumCallback,
- &intercept_information);
- }
-
- return intercept_information.return_code;
-}
-
-// Restore intercepted IAT entry with the original function.
-//
-// Arguments:
-// intercept_function Interceptor function
-// original_function Receives the original function pointer
-//
-// Returns: Returns NO_ERROR on success or Windows error code
-// as defined in winerror.h
-DWORD RestoreImportedFunction(void* intercept_function,
- void* original_function,
- IMAGE_THUNK_DATA* iat_thunk) {
- if ((NULL == intercept_function) || (NULL == original_function) ||
- (NULL == iat_thunk)) {
- NOTREACHED();
- return ERROR_INVALID_PARAMETER;
- }
-
- if (GetIATFunction(iat_thunk) != intercept_function) {
- // Check if someone else has intercepted on top of us.
- // We cannot unpatch in this case, just raise a red flag.
- NOTREACHED();
- return ERROR_INVALID_FUNCTION;
- }
-
- return internal::ModifyCode(&(iat_thunk->u1.Function), &original_function,
- sizeof(original_function));
-}
-
-} // namespace
-
-IATPatchFunction::IATPatchFunction()
- : module_handle_(NULL),
- intercept_function_(NULL),
- original_function_(NULL),
- iat_thunk_(NULL) {}
-
-IATPatchFunction::~IATPatchFunction() {
- if (NULL != intercept_function_) {
- DWORD error = Unpatch();
- DCHECK_EQ(static_cast<DWORD>(NO_ERROR), error);
- }
-}
-
-DWORD IATPatchFunction::Patch(const wchar_t* module,
- const char* imported_from_module,
- const char* function_name,
- void* new_function) {
- HMODULE module_handle = LoadLibraryW(module);
- if (module_handle == NULL) {
- NOTREACHED();
- return GetLastError();
- }
-
- DWORD error = PatchFromModule(module_handle, imported_from_module,
- function_name, new_function);
- if (NO_ERROR == error) {
- module_handle_ = module_handle;
- } else {
- FreeLibrary(module_handle);
- }
-
- return error;
-}
-
-DWORD IATPatchFunction::PatchFromModule(HMODULE module,
- const char* imported_from_module,
- const char* function_name,
- void* new_function) {
- DCHECK_EQ(static_cast<void*>(NULL), original_function_);
- DCHECK_EQ(static_cast<IMAGE_THUNK_DATA*>(NULL), iat_thunk_);
- DCHECK_EQ(static_cast<void*>(NULL), intercept_function_);
- DCHECK(module);
-
- DWORD error =
- InterceptImportedFunction(module, imported_from_module, function_name,
- new_function, &original_function_, &iat_thunk_);
-
- if (NO_ERROR == error) {
- DCHECK_NE(original_function_, intercept_function_);
- intercept_function_ = new_function;
- }
-
- return error;
-}
-
-DWORD IATPatchFunction::Unpatch() {
- DWORD error = RestoreImportedFunction(intercept_function_, original_function_,
- iat_thunk_);
- DCHECK_EQ(static_cast<DWORD>(NO_ERROR), error);
-
- // Hands off the intercept if we fail to unpatch.
- // If IATPatchFunction::Unpatch fails during RestoreImportedFunction
- // it means that we cannot safely unpatch the import address table
- // patch. In this case its better to be hands off the intercept as
- // trying to unpatch again in the destructor of IATPatchFunction is
- // not going to be any safer
- if (module_handle_)
- FreeLibrary(module_handle_);
- module_handle_ = NULL;
- intercept_function_ = NULL;
- original_function_ = NULL;
- iat_thunk_ = NULL;
-
- return error;
-}
-
-void* IATPatchFunction::original_function() const {
- DCHECK(is_patched());
- return original_function_;
-}
-
-} // namespace win
-} // namespace base
diff --git a/base/win/iat_patch_function.h b/base/win/iat_patch_function.h
deleted file mode 100644
index c9f2d6c..0000000
--- a/base/win/iat_patch_function.h
+++ /dev/null
@@ -1,77 +0,0 @@
-// 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.
-
-#ifndef BASE_WIN_IAT_PATCH_FUNCTION_H_
-#define BASE_WIN_IAT_PATCH_FUNCTION_H_
-
-#include <windows.h>
-
-#include "base/macros.h"
-
-namespace base {
-namespace win {
-
-// A class that encapsulates Import Address Table patching helpers and restores
-// the original function in the destructor.
-//
-// It will intercept functions for a specific DLL imported from another DLL.
-// This is the case when, for example, we want to intercept
-// CertDuplicateCertificateContext function (exported from crypt32.dll) called
-// by wininet.dll.
-class IATPatchFunction {
- public:
- IATPatchFunction();
- ~IATPatchFunction();
-
- // Intercept a function in an import table of a specific
- // module. Save the original function and the import
- // table address. These values will be used later
- // during Unpatch
- //
- // Arguments:
- // module Module to be intercepted
- // imported_from_module Module that exports the 'function_name'
- // function_name Name of the API to be intercepted
- //
- // Returns: Windows error code (winerror.h). NO_ERROR if successful
- //
- // Note: Patching a function will make the IAT patch take some "ownership" on
- // |module|. It will LoadLibrary(module) to keep the DLL alive until a call
- // to Unpatch(), which will call FreeLibrary() and allow the module to be
- // unloaded. The idea is to help prevent the DLL from going away while a
- // patch is still active.
- DWORD Patch(const wchar_t* module,
- const char* imported_from_module,
- const char* function_name,
- void* new_function);
-
- // Same as Patch(), but uses a handle to a |module| instead of the DLL name.
- DWORD PatchFromModule(HMODULE module,
- const char* imported_from_module,
- const char* function_name,
- void* new_function);
-
- // Unpatch the IAT entry using internally saved original
- // function.
- //
- // Returns: Windows error code (winerror.h). NO_ERROR if successful
- DWORD Unpatch();
-
- bool is_patched() const { return (NULL != intercept_function_); }
-
- void* original_function() const;
-
- private:
- HMODULE module_handle_;
- void* intercept_function_;
- void* original_function_;
- IMAGE_THUNK_DATA* iat_thunk_;
-
- DISALLOW_COPY_AND_ASSIGN(IATPatchFunction);
-};
-
-} // namespace win
-} // namespace base
-
-#endif // BASE_WIN_IAT_PATCH_FUNCTION_H_
diff --git a/base/win/iunknown_impl.cc b/base/win/iunknown_impl.cc
deleted file mode 100644
index 2d83523..0000000
--- a/base/win/iunknown_impl.cc
+++ /dev/null
@@ -1,39 +0,0 @@
-// 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 "base/win/iunknown_impl.h"
-
-namespace base {
-namespace win {
-
-IUnknownImpl::IUnknownImpl() : ref_count_(0) {}
-
-IUnknownImpl::~IUnknownImpl() {}
-
-ULONG STDMETHODCALLTYPE IUnknownImpl::AddRef() {
- ref_count_.Increment();
- return 1;
-}
-
-ULONG STDMETHODCALLTYPE IUnknownImpl::Release() {
- if (!ref_count_.Decrement()) {
- delete this;
- return 0;
- }
- return 1;
-}
-
-STDMETHODIMP IUnknownImpl::QueryInterface(REFIID riid, void** ppv) {
- if (riid == IID_IUnknown) {
- *ppv = static_cast<IUnknown*>(this);
- AddRef();
- return S_OK;
- }
-
- *ppv = NULL;
- return E_NOINTERFACE;
-}
-
-} // namespace win
-} // namespace base
diff --git a/base/win/iunknown_impl.h b/base/win/iunknown_impl.h
deleted file mode 100644
index 60f2403..0000000
--- a/base/win/iunknown_impl.h
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright (c) 2012 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.
-
-#ifndef BASE_WIN_IUNKNOWN_IMPL_H_
-#define BASE_WIN_IUNKNOWN_IMPL_H_
-
-#include <unknwn.h>
-
-#include "base/atomic_ref_count.h"
-#include "base/compiler_specific.h"
-
-namespace base {
-namespace win {
-
-// IUnknown implementation for other classes to derive from.
-class IUnknownImpl : public IUnknown {
- public:
- IUnknownImpl();
-
- ULONG STDMETHODCALLTYPE AddRef() override;
- ULONG STDMETHODCALLTYPE Release() override;
-
- // Subclasses should extend this to return any interfaces they provide.
- STDMETHODIMP QueryInterface(REFIID riid, void** ppv) override;
-
- protected:
- virtual ~IUnknownImpl();
-
- private:
- AtomicRefCount ref_count_;
-};
-
-} // namespace win
-} // namespace base
-
-#endif // BASE_WIN_IUNKNOWN_IMPL_H_
diff --git a/base/win/pe_image.cc b/base/win/pe_image.cc
deleted file mode 100644
index ea58504..0000000
--- a/base/win/pe_image.cc
+++ /dev/null
@@ -1,582 +0,0 @@
-// Copyright (c) 2010 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.
-
-// This file implements PEImage, a generic class to manipulate PE files.
-// This file was adapted from GreenBorder's Code.
-
-#include <stddef.h>
-
-#include "base/win/pe_image.h"
-
-namespace base {
-namespace win {
-
-// Structure to perform imports enumerations.
-struct EnumAllImportsStorage {
- PEImage::EnumImportsFunction callback;
- PVOID cookie;
-};
-
-namespace {
-
-// PdbInfo Signature
-const DWORD kPdbInfoSignature = 'SDSR';
-
-// Compare two strings byte by byte on an unsigned basis.
-// if s1 == s2, return 0
-// if s1 < s2, return negative
-// if s1 > s2, return positive
-// Exception if inputs are invalid.
-int StrCmpByByte(LPCSTR s1, LPCSTR s2) {
- while (*s1 != '\0' && *s1 == *s2) {
- ++s1;
- ++s2;
- }
-
- return (*reinterpret_cast<const unsigned char*>(s1) -
- *reinterpret_cast<const unsigned char*>(s2));
-}
-
-struct PdbInfo {
- DWORD Signature;
- GUID Guid;
- DWORD Age;
- char PdbFileName[1];
-};
-
-} // namespace
-
-// Callback used to enumerate imports. See EnumImportChunksFunction.
-bool ProcessImportChunk(const PEImage& image,
- LPCSTR module,
- PIMAGE_THUNK_DATA name_table,
- PIMAGE_THUNK_DATA iat,
- PVOID cookie) {
- EnumAllImportsStorage& storage =
- *reinterpret_cast<EnumAllImportsStorage*>(cookie);
-
- return image.EnumOneImportChunk(storage.callback, module, name_table, iat,
- storage.cookie);
-}
-
-// Callback used to enumerate delay imports. See EnumDelayImportChunksFunction.
-bool ProcessDelayImportChunk(const PEImage& image,
- PImgDelayDescr delay_descriptor,
- LPCSTR module,
- PIMAGE_THUNK_DATA name_table,
- PIMAGE_THUNK_DATA iat,
- PVOID cookie) {
- EnumAllImportsStorage& storage =
- *reinterpret_cast<EnumAllImportsStorage*>(cookie);
-
- return image.EnumOneDelayImportChunk(storage.callback, delay_descriptor,
- module, name_table, iat, storage.cookie);
-}
-
-void PEImage::set_module(HMODULE module) {
- module_ = module;
-}
-
-PIMAGE_DOS_HEADER PEImage::GetDosHeader() const {
- return reinterpret_cast<PIMAGE_DOS_HEADER>(module_);
-}
-
-PIMAGE_NT_HEADERS PEImage::GetNTHeaders() const {
- PIMAGE_DOS_HEADER dos_header = GetDosHeader();
-
- return reinterpret_cast<PIMAGE_NT_HEADERS>(
- reinterpret_cast<char*>(dos_header) + dos_header->e_lfanew);
-}
-
-PIMAGE_SECTION_HEADER PEImage::GetSectionHeader(UINT section) const {
- PIMAGE_NT_HEADERS nt_headers = GetNTHeaders();
- PIMAGE_SECTION_HEADER first_section = IMAGE_FIRST_SECTION(nt_headers);
-
- if (section < nt_headers->FileHeader.NumberOfSections)
- return first_section + section;
- else
- return NULL;
-}
-
-WORD PEImage::GetNumSections() const {
- return GetNTHeaders()->FileHeader.NumberOfSections;
-}
-
-DWORD PEImage::GetImageDirectoryEntrySize(UINT directory) const {
- PIMAGE_NT_HEADERS nt_headers = GetNTHeaders();
-
- return nt_headers->OptionalHeader.DataDirectory[directory].Size;
-}
-
-PVOID PEImage::GetImageDirectoryEntryAddr(UINT directory) const {
- PIMAGE_NT_HEADERS nt_headers = GetNTHeaders();
-
- return RVAToAddr(
- nt_headers->OptionalHeader.DataDirectory[directory].VirtualAddress);
-}
-
-PIMAGE_SECTION_HEADER PEImage::GetImageSectionFromAddr(PVOID address) const {
- PBYTE target = reinterpret_cast<PBYTE>(address);
- PIMAGE_SECTION_HEADER section;
-
- for (UINT i = 0; NULL != (section = GetSectionHeader(i)); i++) {
- // Don't use the virtual RVAToAddr.
- PBYTE start =
- reinterpret_cast<PBYTE>(PEImage::RVAToAddr(section->VirtualAddress));
-
- DWORD size = section->Misc.VirtualSize;
-
- if ((start <= target) && (start + size > target))
- return section;
- }
-
- return NULL;
-}
-
-PIMAGE_SECTION_HEADER PEImage::GetImageSectionHeaderByName(
- LPCSTR section_name) const {
- if (NULL == section_name)
- return NULL;
-
- PIMAGE_SECTION_HEADER ret = NULL;
- int num_sections = GetNumSections();
-
- for (int i = 0; i < num_sections; i++) {
- PIMAGE_SECTION_HEADER section = GetSectionHeader(i);
- if (0 == _strnicmp(reinterpret_cast<LPCSTR>(section->Name), section_name,
- sizeof(section->Name))) {
- ret = section;
- break;
- }
- }
-
- return ret;
-}
-
-bool PEImage::GetDebugId(LPGUID guid, LPDWORD age, LPCSTR* pdb_filename) const {
- DWORD debug_directory_size =
- GetImageDirectoryEntrySize(IMAGE_DIRECTORY_ENTRY_DEBUG);
- PIMAGE_DEBUG_DIRECTORY debug_directory =
- reinterpret_cast<PIMAGE_DEBUG_DIRECTORY>(
- GetImageDirectoryEntryAddr(IMAGE_DIRECTORY_ENTRY_DEBUG));
-
- size_t directory_count = debug_directory_size / sizeof(IMAGE_DEBUG_DIRECTORY);
-
- for (size_t index = 0; index < directory_count; ++index) {
- if (debug_directory[index].Type == IMAGE_DEBUG_TYPE_CODEVIEW) {
- PdbInfo* pdb_info = reinterpret_cast<PdbInfo*>(
- RVAToAddr(debug_directory[index].AddressOfRawData));
- if (pdb_info->Signature != kPdbInfoSignature) {
- // Unsupported PdbInfo signature
- return false;
- }
-
- if (guid)
- *guid = pdb_info->Guid;
- if (age)
- *age = pdb_info->Age;
- if (pdb_filename)
- *pdb_filename = pdb_info->PdbFileName;
- return true;
- }
- }
- return false;
-}
-
-PDWORD PEImage::GetExportEntry(LPCSTR name) const {
- PIMAGE_EXPORT_DIRECTORY exports = GetExportDirectory();
-
- if (NULL == exports)
- return NULL;
-
- WORD ordinal = 0;
- if (!GetProcOrdinal(name, &ordinal))
- return NULL;
-
- PDWORD functions =
- reinterpret_cast<PDWORD>(RVAToAddr(exports->AddressOfFunctions));
-
- return functions + ordinal - exports->Base;
-}
-
-FARPROC PEImage::GetProcAddress(LPCSTR function_name) const {
- PDWORD export_entry = GetExportEntry(function_name);
- if (NULL == export_entry)
- return NULL;
-
- PBYTE function = reinterpret_cast<PBYTE>(RVAToAddr(*export_entry));
-
- PBYTE exports = reinterpret_cast<PBYTE>(
- GetImageDirectoryEntryAddr(IMAGE_DIRECTORY_ENTRY_EXPORT));
- DWORD size = GetImageDirectoryEntrySize(IMAGE_DIRECTORY_ENTRY_EXPORT);
-
- // Check for forwarded exports as a special case.
- if (exports <= function && exports + size > function)
- return reinterpret_cast<FARPROC>(-1);
-
- return reinterpret_cast<FARPROC>(function);
-}
-
-bool PEImage::GetProcOrdinal(LPCSTR function_name, WORD* ordinal) const {
- if (NULL == ordinal)
- return false;
-
- PIMAGE_EXPORT_DIRECTORY exports = GetExportDirectory();
-
- if (NULL == exports)
- return false;
-
- if (IsOrdinal(function_name)) {
- *ordinal = ToOrdinal(function_name);
- } else {
- PDWORD names = reinterpret_cast<PDWORD>(RVAToAddr(exports->AddressOfNames));
- PDWORD lower = names;
- PDWORD upper = names + exports->NumberOfNames;
- int cmp = -1;
-
- // Binary Search for the name.
- while (lower != upper) {
- PDWORD middle = lower + (upper - lower) / 2;
- LPCSTR name = reinterpret_cast<LPCSTR>(RVAToAddr(*middle));
-
- // This may be called by sandbox before MSVCRT dll loads, so can't use
- // CRT function here.
- cmp = StrCmpByByte(function_name, name);
-
- if (cmp == 0) {
- lower = middle;
- break;
- }
-
- if (cmp > 0)
- lower = middle + 1;
- else
- upper = middle;
- }
-
- if (cmp != 0)
- return false;
-
- PWORD ordinals =
- reinterpret_cast<PWORD>(RVAToAddr(exports->AddressOfNameOrdinals));
-
- *ordinal = ordinals[lower - names] + static_cast<WORD>(exports->Base);
- }
-
- return true;
-}
-
-bool PEImage::EnumSections(EnumSectionsFunction callback, PVOID cookie) const {
- PIMAGE_NT_HEADERS nt_headers = GetNTHeaders();
- UINT num_sections = nt_headers->FileHeader.NumberOfSections;
- PIMAGE_SECTION_HEADER section = GetSectionHeader(0);
-
- for (UINT i = 0; i < num_sections; i++, section++) {
- PVOID section_start = RVAToAddr(section->VirtualAddress);
- DWORD size = section->Misc.VirtualSize;
-
- if (!callback(*this, section, section_start, size, cookie))
- return false;
- }
-
- return true;
-}
-
-bool PEImage::EnumExports(EnumExportsFunction callback, PVOID cookie) const {
- PVOID directory = GetImageDirectoryEntryAddr(IMAGE_DIRECTORY_ENTRY_EXPORT);
- DWORD size = GetImageDirectoryEntrySize(IMAGE_DIRECTORY_ENTRY_EXPORT);
-
- // Check if there are any exports at all.
- if (NULL == directory || 0 == size)
- return true;
-
- PIMAGE_EXPORT_DIRECTORY exports =
- reinterpret_cast<PIMAGE_EXPORT_DIRECTORY>(directory);
- UINT ordinal_base = exports->Base;
- UINT num_funcs = exports->NumberOfFunctions;
- UINT num_names = exports->NumberOfNames;
- PDWORD functions =
- reinterpret_cast<PDWORD>(RVAToAddr(exports->AddressOfFunctions));
- PDWORD names = reinterpret_cast<PDWORD>(RVAToAddr(exports->AddressOfNames));
- PWORD ordinals =
- reinterpret_cast<PWORD>(RVAToAddr(exports->AddressOfNameOrdinals));
-
- for (UINT count = 0; count < num_funcs; count++) {
- PVOID func = RVAToAddr(functions[count]);
- if (NULL == func)
- continue;
-
- // Check for a name.
- LPCSTR name = NULL;
- UINT hint;
- for (hint = 0; hint < num_names; hint++) {
- if (ordinals[hint] == count) {
- name = reinterpret_cast<LPCSTR>(RVAToAddr(names[hint]));
- break;
- }
- }
-
- if (name == NULL)
- hint = 0;
-
- // Check for forwarded exports.
- LPCSTR forward = NULL;
- if (reinterpret_cast<char*>(func) >= reinterpret_cast<char*>(directory) &&
- reinterpret_cast<char*>(func) <=
- reinterpret_cast<char*>(directory) + size) {
- forward = reinterpret_cast<LPCSTR>(func);
- func = 0;
- }
-
- if (!callback(*this, ordinal_base + count, hint, name, func, forward,
- cookie))
- return false;
- }
-
- return true;
-}
-
-bool PEImage::EnumRelocs(EnumRelocsFunction callback, PVOID cookie) const {
- PVOID directory = GetImageDirectoryEntryAddr(IMAGE_DIRECTORY_ENTRY_BASERELOC);
- DWORD size = GetImageDirectoryEntrySize(IMAGE_DIRECTORY_ENTRY_BASERELOC);
- PIMAGE_BASE_RELOCATION base =
- reinterpret_cast<PIMAGE_BASE_RELOCATION>(directory);
-
- if (!directory)
- return true;
-
- while (size >= sizeof(IMAGE_BASE_RELOCATION) && base->SizeOfBlock &&
- size >= base->SizeOfBlock) {
- PWORD reloc = reinterpret_cast<PWORD>(base + 1);
- UINT num_relocs =
- (base->SizeOfBlock - sizeof(IMAGE_BASE_RELOCATION)) / sizeof(WORD);
-
- for (UINT i = 0; i < num_relocs; i++, reloc++) {
- WORD type = *reloc >> 12;
- PVOID address = RVAToAddr(base->VirtualAddress + (*reloc & 0x0FFF));
-
- if (!callback(*this, type, address, cookie))
- return false;
- }
-
- size -= base->SizeOfBlock;
- base = reinterpret_cast<PIMAGE_BASE_RELOCATION>(
- reinterpret_cast<char*>(base) + base->SizeOfBlock);
- }
-
- return true;
-}
-
-bool PEImage::EnumImportChunks(EnumImportChunksFunction callback,
- PVOID cookie) const {
- DWORD size = GetImageDirectoryEntrySize(IMAGE_DIRECTORY_ENTRY_IMPORT);
- PIMAGE_IMPORT_DESCRIPTOR import = GetFirstImportChunk();
-
- if (import == NULL || size < sizeof(IMAGE_IMPORT_DESCRIPTOR))
- return true;
-
- for (; import->FirstThunk; import++) {
- LPCSTR module_name = reinterpret_cast<LPCSTR>(RVAToAddr(import->Name));
- PIMAGE_THUNK_DATA name_table = reinterpret_cast<PIMAGE_THUNK_DATA>(
- RVAToAddr(import->OriginalFirstThunk));
- PIMAGE_THUNK_DATA iat =
- reinterpret_cast<PIMAGE_THUNK_DATA>(RVAToAddr(import->FirstThunk));
-
- if (!callback(*this, module_name, name_table, iat, cookie))
- return false;
- }
-
- return true;
-}
-
-bool PEImage::EnumOneImportChunk(EnumImportsFunction callback,
- LPCSTR module_name,
- PIMAGE_THUNK_DATA name_table,
- PIMAGE_THUNK_DATA iat,
- PVOID cookie) const {
- if (NULL == name_table)
- return false;
-
- for (; name_table && name_table->u1.Ordinal; name_table++, iat++) {
- LPCSTR name = NULL;
- WORD ordinal = 0;
- WORD hint = 0;
-
- if (IMAGE_SNAP_BY_ORDINAL(name_table->u1.Ordinal)) {
- ordinal = static_cast<WORD>(IMAGE_ORDINAL32(name_table->u1.Ordinal));
- } else {
- PIMAGE_IMPORT_BY_NAME import = reinterpret_cast<PIMAGE_IMPORT_BY_NAME>(
- RVAToAddr(name_table->u1.ForwarderString));
-
- hint = import->Hint;
- name = reinterpret_cast<LPCSTR>(&import->Name);
- }
-
- if (!callback(*this, module_name, ordinal, name, hint, iat, cookie))
- return false;
- }
-
- return true;
-}
-
-bool PEImage::EnumAllImports(EnumImportsFunction callback, PVOID cookie) const {
- EnumAllImportsStorage temp = {callback, cookie};
- return EnumImportChunks(ProcessImportChunk, &temp);
-}
-
-bool PEImage::EnumDelayImportChunks(EnumDelayImportChunksFunction callback,
- PVOID cookie) const {
- PVOID directory =
- GetImageDirectoryEntryAddr(IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT);
- DWORD size = GetImageDirectoryEntrySize(IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT);
- PImgDelayDescr delay_descriptor = reinterpret_cast<PImgDelayDescr>(directory);
-
- if (directory == NULL || size == 0)
- return true;
-
- for (; delay_descriptor->rvaHmod; delay_descriptor++) {
- PIMAGE_THUNK_DATA name_table;
- PIMAGE_THUNK_DATA iat;
- LPCSTR module_name;
-
- // check if VC7-style imports, using RVAs instead of
- // VC6-style addresses.
- bool rvas = (delay_descriptor->grAttrs & dlattrRva) != 0;
-
- if (rvas) {
- module_name =
- reinterpret_cast<LPCSTR>(RVAToAddr(delay_descriptor->rvaDLLName));
- name_table = reinterpret_cast<PIMAGE_THUNK_DATA>(
- RVAToAddr(delay_descriptor->rvaINT));
- iat = reinterpret_cast<PIMAGE_THUNK_DATA>(
- RVAToAddr(delay_descriptor->rvaIAT));
- } else {
- // Values in IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT are 32-bit, even on 64-bit
- // platforms. See section 4.8 of PECOFF image spec rev 8.3.
- module_name = reinterpret_cast<LPCSTR>(
- static_cast<uintptr_t>(delay_descriptor->rvaDLLName));
- name_table = reinterpret_cast<PIMAGE_THUNK_DATA>(
- static_cast<uintptr_t>(delay_descriptor->rvaINT));
- iat = reinterpret_cast<PIMAGE_THUNK_DATA>(
- static_cast<uintptr_t>(delay_descriptor->rvaIAT));
- }
-
- if (!callback(*this, delay_descriptor, module_name, name_table, iat,
- cookie))
- return false;
- }
-
- return true;
-}
-
-bool PEImage::EnumOneDelayImportChunk(EnumImportsFunction callback,
- PImgDelayDescr delay_descriptor,
- LPCSTR module_name,
- PIMAGE_THUNK_DATA name_table,
- PIMAGE_THUNK_DATA iat,
- PVOID cookie) const {
- for (; name_table->u1.Ordinal; name_table++, iat++) {
- LPCSTR name = NULL;
- WORD ordinal = 0;
- WORD hint = 0;
-
- if (IMAGE_SNAP_BY_ORDINAL(name_table->u1.Ordinal)) {
- ordinal = static_cast<WORD>(IMAGE_ORDINAL32(name_table->u1.Ordinal));
- } else {
- PIMAGE_IMPORT_BY_NAME import;
- bool rvas = (delay_descriptor->grAttrs & dlattrRva) != 0;
-
- if (rvas) {
- import = reinterpret_cast<PIMAGE_IMPORT_BY_NAME>(
- RVAToAddr(name_table->u1.ForwarderString));
- } else {
- import = reinterpret_cast<PIMAGE_IMPORT_BY_NAME>(
- name_table->u1.ForwarderString);
- }
-
- hint = import->Hint;
- name = reinterpret_cast<LPCSTR>(&import->Name);
- }
-
- if (!callback(*this, module_name, ordinal, name, hint, iat, cookie))
- return false;
- }
-
- return true;
-}
-
-bool PEImage::EnumAllDelayImports(EnumImportsFunction callback,
- PVOID cookie) const {
- EnumAllImportsStorage temp = {callback, cookie};
- return EnumDelayImportChunks(ProcessDelayImportChunk, &temp);
-}
-
-bool PEImage::VerifyMagic() const {
- PIMAGE_DOS_HEADER dos_header = GetDosHeader();
-
- if (dos_header->e_magic != IMAGE_DOS_SIGNATURE)
- return false;
-
- PIMAGE_NT_HEADERS nt_headers = GetNTHeaders();
-
- if (nt_headers->Signature != IMAGE_NT_SIGNATURE)
- return false;
-
- if (nt_headers->FileHeader.SizeOfOptionalHeader !=
- sizeof(IMAGE_OPTIONAL_HEADER))
- return false;
-
- if (nt_headers->OptionalHeader.Magic != IMAGE_NT_OPTIONAL_HDR_MAGIC)
- return false;
-
- return true;
-}
-
-bool PEImage::ImageRVAToOnDiskOffset(DWORD rva, DWORD* on_disk_offset) const {
- LPVOID address = RVAToAddr(rva);
- return ImageAddrToOnDiskOffset(address, on_disk_offset);
-}
-
-bool PEImage::ImageAddrToOnDiskOffset(LPVOID address,
- DWORD* on_disk_offset) const {
- if (NULL == address)
- return false;
-
- // Get the section that this address belongs to.
- PIMAGE_SECTION_HEADER section_header = GetImageSectionFromAddr(address);
- if (NULL == section_header)
- return false;
-
- // Don't follow the virtual RVAToAddr, use the one on the base.
- DWORD offset_within_section =
- static_cast<DWORD>(reinterpret_cast<uintptr_t>(address)) -
- static_cast<DWORD>(reinterpret_cast<uintptr_t>(
- PEImage::RVAToAddr(section_header->VirtualAddress)));
-
- *on_disk_offset = section_header->PointerToRawData + offset_within_section;
- return true;
-}
-
-PVOID PEImage::RVAToAddr(DWORD rva) const {
- if (rva == 0)
- return NULL;
-
- return reinterpret_cast<char*>(module_) + rva;
-}
-
-PVOID PEImageAsData::RVAToAddr(DWORD rva) const {
- if (rva == 0)
- return NULL;
-
- PVOID in_memory = PEImage::RVAToAddr(rva);
- DWORD disk_offset;
-
- if (!ImageAddrToOnDiskOffset(in_memory, &disk_offset))
- return NULL;
-
- return PEImage::RVAToAddr(disk_offset);
-}
-
-} // namespace win
-} // namespace base
diff --git a/base/win/pe_image.h b/base/win/pe_image.h
deleted file mode 100644
index 7766b49..0000000
--- a/base/win/pe_image.h
+++ /dev/null
@@ -1,281 +0,0 @@
-// Copyright (c) 2010 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.
-
-// This file was adapted from GreenBorder's Code.
-// To understand what this class is about (for other than well known functions
-// as GetProcAddress), a good starting point is "An In-Depth Look into the
-// Win32 Portable Executable File Format" by Matt Pietrek:
-// http://msdn.microsoft.com/msdnmag/issues/02/02/PE/default.aspx
-
-#ifndef BASE_WIN_PE_IMAGE_H_
-#define BASE_WIN_PE_IMAGE_H_
-
-#include <windows.h>
-
-#if defined(_WIN32_WINNT_WIN8)
-// The Windows 8 SDK defines FACILITY_VISUALCPP in winerror.h.
-#undef FACILITY_VISUALCPP
-#endif
-#include <DelayIMP.h>
-
-namespace base {
-namespace win {
-
-// This class is a wrapper for the Portable Executable File Format (PE).
-// Its main purpose is to provide an easy way to work with imports and exports
-// from a file, mapped in memory as image.
-class PEImage {
- public:
- // Callback to enumerate sections.
- // cookie is the value passed to the enumerate method.
- // Returns true to continue the enumeration.
- typedef bool (*EnumSectionsFunction)(const PEImage& image,
- PIMAGE_SECTION_HEADER header,
- PVOID section_start,
- DWORD section_size,
- PVOID cookie);
-
- // Callback to enumerate exports.
- // function is the actual address of the symbol. If forward is not null, it
- // contains the dll and symbol to forward this export to. cookie is the value
- // passed to the enumerate method.
- // Returns true to continue the enumeration.
- typedef bool (*EnumExportsFunction)(const PEImage& image,
- DWORD ordinal,
- DWORD hint,
- LPCSTR name,
- PVOID function,
- LPCSTR forward,
- PVOID cookie);
-
- // Callback to enumerate import blocks.
- // name_table and iat point to the imports name table and address table for
- // this block. cookie is the value passed to the enumerate method.
- // Returns true to continue the enumeration.
- typedef bool (*EnumImportChunksFunction)(const PEImage& image,
- LPCSTR module,
- PIMAGE_THUNK_DATA name_table,
- PIMAGE_THUNK_DATA iat,
- PVOID cookie);
-
- // Callback to enumerate imports.
- // module is the dll that exports this symbol. cookie is the value passed to
- // the enumerate method.
- // Returns true to continue the enumeration.
- typedef bool (*EnumImportsFunction)(const PEImage& image,
- LPCSTR module,
- DWORD ordinal,
- LPCSTR name,
- DWORD hint,
- PIMAGE_THUNK_DATA iat,
- PVOID cookie);
-
- // Callback to enumerate delayed import blocks.
- // module is the dll that exports this block of symbols. cookie is the value
- // passed to the enumerate method.
- // Returns true to continue the enumeration.
- typedef bool (*EnumDelayImportChunksFunction)(const PEImage& image,
- PImgDelayDescr delay_descriptor,
- LPCSTR module,
- PIMAGE_THUNK_DATA name_table,
- PIMAGE_THUNK_DATA iat,
- PVOID cookie);
-
- // Callback to enumerate relocations.
- // cookie is the value passed to the enumerate method.
- // Returns true to continue the enumeration.
- typedef bool (*EnumRelocsFunction)(const PEImage& image,
- WORD type,
- PVOID address,
- PVOID cookie);
-
- explicit PEImage(HMODULE module) : module_(module) {}
- explicit PEImage(const void* module) {
- module_ = reinterpret_cast<HMODULE>(const_cast<void*>(module));
- }
-
- virtual ~PEImage() {}
-
- // Gets the HMODULE for this object.
- HMODULE module() const;
-
- // Sets this object's HMODULE.
- void set_module(HMODULE module);
-
- // Checks if this symbol is actually an ordinal.
- static bool IsOrdinal(LPCSTR name);
-
- // Converts a named symbol to the corresponding ordinal.
- static WORD ToOrdinal(LPCSTR name);
-
- // Returns the DOS_HEADER for this PE.
- PIMAGE_DOS_HEADER GetDosHeader() const;
-
- // Returns the NT_HEADER for this PE.
- PIMAGE_NT_HEADERS GetNTHeaders() const;
-
- // Returns number of sections of this PE.
- WORD GetNumSections() const;
-
- // Returns the header for a given section.
- // returns NULL if there is no such section.
- PIMAGE_SECTION_HEADER GetSectionHeader(UINT section) const;
-
- // Returns the size of a given directory entry.
- DWORD GetImageDirectoryEntrySize(UINT directory) const;
-
- // Returns the address of a given directory entry.
- PVOID GetImageDirectoryEntryAddr(UINT directory) const;
-
- // Returns the section header for a given address.
- // Use: s = image.GetImageSectionFromAddr(a);
- // Post: 's' is the section header of the section that contains 'a'
- // or NULL if there is no such section.
- PIMAGE_SECTION_HEADER GetImageSectionFromAddr(PVOID address) const;
-
- // Returns the section header for a given section.
- PIMAGE_SECTION_HEADER GetImageSectionHeaderByName(LPCSTR section_name) const;
-
- // Returns the first block of imports.
- PIMAGE_IMPORT_DESCRIPTOR GetFirstImportChunk() const;
-
- // Returns the exports directory.
- PIMAGE_EXPORT_DIRECTORY GetExportDirectory() const;
-
- // Returns the debug id (guid+age) and |pdb_filename|. Parameters are optional
- // and can be null. |pdb_filename| is a direct reference to PEImage and
- // doesn't not need to be freed.
- bool GetDebugId(LPGUID guid, LPDWORD age, LPCSTR* pdb_filename) const;
-
- // Returns a given export entry.
- // Use: e = image.GetExportEntry(f);
- // Pre: 'f' is either a zero terminated string or ordinal
- // Post: 'e' is a pointer to the export directory entry
- // that contains 'f's export RVA, or NULL if 'f'
- // is not exported from this image
- PDWORD GetExportEntry(LPCSTR name) const;
-
- // Returns the address for a given exported symbol.
- // Use: p = image.GetProcAddress(f);
- // Pre: 'f' is either a zero terminated string or ordinal.
- // Post: if 'f' is a non-forwarded export from image, 'p' is
- // the exported function. If 'f' is a forwarded export
- // then p is the special value -1. In this case
- // RVAToAddr(*GetExportEntry) can be used to resolve
- // the string that describes the forward.
- FARPROC GetProcAddress(LPCSTR function_name) const;
-
- // Retrieves the ordinal for a given exported symbol.
- // Returns true if the symbol was found.
- bool GetProcOrdinal(LPCSTR function_name, WORD* ordinal) const;
-
- // Enumerates PE sections.
- // cookie is a generic cookie to pass to the callback.
- // Returns true on success.
- bool EnumSections(EnumSectionsFunction callback, PVOID cookie) const;
-
- // Enumerates PE exports.
- // cookie is a generic cookie to pass to the callback.
- // Returns true on success.
- bool EnumExports(EnumExportsFunction callback, PVOID cookie) const;
-
- // Enumerates PE imports.
- // cookie is a generic cookie to pass to the callback.
- // Returns true on success.
- bool EnumAllImports(EnumImportsFunction callback, PVOID cookie) const;
-
- // Enumerates PE import blocks.
- // cookie is a generic cookie to pass to the callback.
- // Returns true on success.
- bool EnumImportChunks(EnumImportChunksFunction callback, PVOID cookie) const;
-
- // Enumerates the imports from a single PE import block.
- // cookie is a generic cookie to pass to the callback.
- // Returns true on success.
- bool EnumOneImportChunk(EnumImportsFunction callback,
- LPCSTR module_name,
- PIMAGE_THUNK_DATA name_table,
- PIMAGE_THUNK_DATA iat,
- PVOID cookie) const;
-
- // Enumerates PE delay imports.
- // cookie is a generic cookie to pass to the callback.
- // Returns true on success.
- bool EnumAllDelayImports(EnumImportsFunction callback, PVOID cookie) const;
-
- // Enumerates PE delay import blocks.
- // cookie is a generic cookie to pass to the callback.
- // Returns true on success.
- bool EnumDelayImportChunks(EnumDelayImportChunksFunction callback,
- PVOID cookie) const;
-
- // Enumerates imports from a single PE delay import block.
- // cookie is a generic cookie to pass to the callback.
- // Returns true on success.
- bool EnumOneDelayImportChunk(EnumImportsFunction callback,
- PImgDelayDescr delay_descriptor,
- LPCSTR module_name,
- PIMAGE_THUNK_DATA name_table,
- PIMAGE_THUNK_DATA iat,
- PVOID cookie) const;
-
- // Enumerates PE relocation entries.
- // cookie is a generic cookie to pass to the callback.
- // Returns true on success.
- bool EnumRelocs(EnumRelocsFunction callback, PVOID cookie) const;
-
- // Verifies the magic values on the PE file.
- // Returns true if all values are correct.
- bool VerifyMagic() const;
-
- // Converts an rva value to the appropriate address.
- virtual PVOID RVAToAddr(DWORD rva) const;
-
- // Converts an rva value to an offset on disk.
- // Returns true on success.
- bool ImageRVAToOnDiskOffset(DWORD rva, DWORD* on_disk_offset) const;
-
- // Converts an address to an offset on disk.
- // Returns true on success.
- bool ImageAddrToOnDiskOffset(LPVOID address, DWORD* on_disk_offset) const;
-
- private:
- HMODULE module_;
-};
-
-// This class is an extension to the PEImage class that allows working with PE
-// files mapped as data instead of as image file.
-class PEImageAsData : public PEImage {
- public:
- explicit PEImageAsData(HMODULE hModule) : PEImage(hModule) {}
-
- PVOID RVAToAddr(DWORD rva) const override;
-};
-
-inline bool PEImage::IsOrdinal(LPCSTR name) {
- return reinterpret_cast<uintptr_t>(name) <= 0xFFFF;
-}
-
-inline WORD PEImage::ToOrdinal(LPCSTR name) {
- return static_cast<WORD>(reinterpret_cast<intptr_t>(name));
-}
-
-inline HMODULE PEImage::module() const {
- return module_;
-}
-
-inline PIMAGE_IMPORT_DESCRIPTOR PEImage::GetFirstImportChunk() const {
- return reinterpret_cast<PIMAGE_IMPORT_DESCRIPTOR>(
- GetImageDirectoryEntryAddr(IMAGE_DIRECTORY_ENTRY_IMPORT));
-}
-
-inline PIMAGE_EXPORT_DIRECTORY PEImage::GetExportDirectory() const {
- return reinterpret_cast<PIMAGE_EXPORT_DIRECTORY>(
- GetImageDirectoryEntryAddr(IMAGE_DIRECTORY_ENTRY_EXPORT));
-}
-
-} // namespace win
-} // namespace base
-
-#endif // BASE_WIN_PE_IMAGE_H_
diff --git a/base/win/pe_image_test.cc b/base/win/pe_image_test.cc
deleted file mode 100644
index 8591495..0000000
--- a/base/win/pe_image_test.cc
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2015 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 <windows.h>
-
-#include <cfgmgr32.h>
-#include <shellapi.h>
-
-#pragma comment(linker, "/export:FwdExport=KERNEL32.CreateFileA")
-
-extern "C" {
-
-__declspec(dllexport) void ExportFunc1() {
- // Call into user32.dll.
- HWND dummy = GetDesktopWindow();
- SetWindowTextA(dummy, "dummy");
-}
-
-__declspec(dllexport) void ExportFunc2() {
- // Call into cfgmgr32.dll.
- CM_MapCrToWin32Err(CR_SUCCESS, ERROR_SUCCESS);
-
- // Call into shell32.dll.
- SHFILEOPSTRUCT file_operation = {0};
- SHFileOperation(&file_operation);
-
- // Call into kernel32.dll.
- HANDLE h = CreateEvent(NULL, FALSE, FALSE, NULL);
- CloseHandle(h);
-}
-
-} // extern "C"
diff --git a/base/win/process_startup_helper.cc b/base/win/process_startup_helper.cc
deleted file mode 100644
index 347db71..0000000
--- a/base/win/process_startup_helper.cc
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright (c) 2015 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 "base/win/process_startup_helper.h"
-
-#include <crtdbg.h>
-#include <new.h>
-#include <stdlib.h>
-
-namespace {
-
-#pragma optimize("", off)
-// Handlers for invalid parameter and pure call. They generate a breakpoint to
-// tell breakpad that it needs to dump the process.
-void InvalidParameter(const wchar_t* expression,
- const wchar_t* function,
- const wchar_t* file,
- unsigned int line,
- uintptr_t reserved) {
- __debugbreak();
- _exit(1);
-}
-
-void PureCall() {
- __debugbreak();
- _exit(1);
-}
-#pragma optimize("", on)
-
-} // namespace
-
-namespace base {
-namespace win {
-
-// Register the invalid param handler and pure call handler to be able to
-// notify breakpad when it happens.
-void RegisterInvalidParamHandler() {
- _set_invalid_parameter_handler(InvalidParameter);
- _set_purecall_handler(PureCall);
-}
-
-void SetupCRT(const CommandLine& command_line) {
-#if defined(_CRTDBG_MAP_ALLOC)
- _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR);
- _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
-#else
- _CrtSetReportMode(_CRT_ASSERT, 0);
-#endif
-}
-
-} // namespace win
-} // namespace base
diff --git a/base/win/process_startup_helper.h b/base/win/process_startup_helper.h
deleted file mode 100644
index c579433..0000000
--- a/base/win/process_startup_helper.h
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright (c) 2015 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.
-
-#ifndef BASE_WIN_PROCESS_STARTUP_HELPER_H_
-#define BASE_WIN_PROCESS_STARTUP_HELPER_H_
-
-namespace base {
-
-class CommandLine;
-
-namespace win {
-
-// Register the invalid param handler and pure call handler to be able to
-// notify breakpad when it happens.
-void RegisterInvalidParamHandler();
-
-// Sets up the CRT's debugging macros to output to stdout.
-void SetupCRT(const CommandLine& command_line);
-
-} // namespace win
-} // namespace base
-
-#endif // BASE_WIN_PROCESS_STARTUP_HELPER_H_
diff --git a/base/win/registry.cc b/base/win/registry.cc
index 1ca839d..e07820b 100644
--- a/base/win/registry.cc
+++ b/base/win/registry.cc
@@ -11,7 +11,6 @@
#include "base/logging.h"
#include "base/macros.h"
#include "base/strings/string_util.h"
-#include "base/win/windows_version.h"
namespace base {
namespace win {
diff --git a/base/win/resource_util.cc b/base/win/resource_util.cc
deleted file mode 100644
index b964aee..0000000
--- a/base/win/resource_util.cc
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright (c) 2006-2008 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 "base/win/resource_util.h"
-#include "base/logging.h"
-
-namespace base {
-namespace win {
-
-bool GetResourceFromModule(HMODULE module,
- int resource_id,
- LPCTSTR resource_type,
- void** data,
- size_t* length) {
- if (!module)
- return false;
-
- if (!IS_INTRESOURCE(resource_id)) {
- NOTREACHED();
- return false;
- }
-
- HRSRC hres_info =
- FindResource(module, MAKEINTRESOURCE(resource_id), resource_type);
- if (NULL == hres_info)
- return false;
-
- DWORD data_size = SizeofResource(module, hres_info);
- HGLOBAL hres = LoadResource(module, hres_info);
- if (!hres)
- return false;
-
- void* resource = LockResource(hres);
- if (!resource)
- return false;
-
- *data = resource;
- *length = static_cast<size_t>(data_size);
- return true;
-}
-
-bool GetDataResourceFromModule(HMODULE module,
- int resource_id,
- void** data,
- size_t* length) {
- return GetResourceFromModule(module, resource_id, L"BINDATA", data, length);
-}
-
-} // namespace win
-} // namespace base
diff --git a/base/win/resource_util.h b/base/win/resource_util.h
deleted file mode 100644
index b4473fd..0000000
--- a/base/win/resource_util.h
+++ /dev/null
@@ -1,37 +0,0 @@
-// 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.
-
-// This file contains utility functions for accessing resources in external
-// files (DLLs) or embedded in the executable itself.
-
-#ifndef BASE_WIN_RESOURCE_UTIL_H_
-#define BASE_WIN_RESOURCE_UTIL_H_
-
-#include <stddef.h>
-#include <windows.h>
-
-namespace base {
-namespace win {
-
-// Function for getting a data resource of the specified |resource_type| from
-// a dll. Some resources are optional, especially in unit tests, so this
-// returns false but doesn't raise an error if the resource can't be loaded.
-bool GetResourceFromModule(HMODULE module,
- int resource_id,
- LPCTSTR resource_type,
- void** data,
- size_t* length);
-
-// Function for getting a data resource (BINDATA) from a dll. Some
-// resources are optional, especially in unit tests, so this returns false
-// but doesn't raise an error if the resource can't be loaded.
-bool GetDataResourceFromModule(HMODULE module,
- int resource_id,
- void** data,
- size_t* length);
-
-} // namespace win
-} // namespace base
-
-#endif // BASE_WIN_RESOURCE_UTIL_H_
diff --git a/base/win/shortcut.cc b/base/win/shortcut.cc
deleted file mode 100644
index fcd8a70..0000000
--- a/base/win/shortcut.cc
+++ /dev/null
@@ -1,364 +0,0 @@
-// Copyright (c) 2012 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 "base/win/shortcut.h"
-
-#include <objbase.h>
-#include <propkey.h>
-#include <shellapi.h>
-#include <shlobj.h>
-#include <wrl/client.h>
-
-#include "base/files/file_util.h"
-#include "base/win/scoped_propvariant.h"
-#include "base/win/win_util.h"
-#include "base/win/windows_version.h"
-
-namespace base {
-namespace win {
-
-namespace {
-
-using Microsoft::WRL::ComPtr;
-
-// Initializes |i_shell_link| and |i_persist_file| (releasing them first if they
-// are already initialized).
-// If |shortcut| is not NULL, loads |shortcut| into |i_persist_file|.
-// If any of the above steps fail, both |i_shell_link| and |i_persist_file| will
-// be released.
-void InitializeShortcutInterfaces(const wchar_t* shortcut,
- ComPtr<IShellLink>* i_shell_link,
- ComPtr<IPersistFile>* i_persist_file) {
- i_shell_link->Reset();
- i_persist_file->Reset();
- if (FAILED(::CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
- IID_PPV_ARGS(i_shell_link->GetAddressOf()))) ||
- FAILED(i_shell_link->CopyTo(i_persist_file->GetAddressOf())) ||
- (shortcut && FAILED((*i_persist_file)->Load(shortcut, STGM_READWRITE)))) {
- i_shell_link->Reset();
- i_persist_file->Reset();
- }
-}
-
-} // namespace
-
-ShortcutProperties::ShortcutProperties()
- : icon_index(-1), dual_mode(false), options(0U) {}
-
-ShortcutProperties::ShortcutProperties(const ShortcutProperties& other) =
- default;
-
-ShortcutProperties::~ShortcutProperties() {}
-
-bool CreateOrUpdateShortcutLink(const FilePath& shortcut_path,
- const ShortcutProperties& properties,
- ShortcutOperation operation) {
- // A target is required unless |operation| is SHORTCUT_UPDATE_EXISTING.
- if (operation != SHORTCUT_UPDATE_EXISTING &&
- !(properties.options & ShortcutProperties::PROPERTIES_TARGET)) {
- NOTREACHED();
- return false;
- }
-
- bool shortcut_existed = PathExists(shortcut_path);
-
- // Interfaces to the old shortcut when replacing an existing shortcut.
- ComPtr<IShellLink> old_i_shell_link;
- ComPtr<IPersistFile> old_i_persist_file;
-
- // Interfaces to the shortcut being created/updated.
- ComPtr<IShellLink> i_shell_link;
- ComPtr<IPersistFile> i_persist_file;
- switch (operation) {
- case SHORTCUT_CREATE_ALWAYS:
- InitializeShortcutInterfaces(NULL, &i_shell_link, &i_persist_file);
- break;
- case SHORTCUT_UPDATE_EXISTING:
- InitializeShortcutInterfaces(shortcut_path.value().c_str(), &i_shell_link,
- &i_persist_file);
- break;
- case SHORTCUT_REPLACE_EXISTING:
- InitializeShortcutInterfaces(shortcut_path.value().c_str(),
- &old_i_shell_link, &old_i_persist_file);
- // Confirm |shortcut_path| exists and is a shortcut by verifying
- // |old_i_persist_file| was successfully initialized in the call above. If
- // so, initialize the interfaces to begin writing a new shortcut (to
- // overwrite the current one if successful).
- if (old_i_persist_file.Get())
- InitializeShortcutInterfaces(NULL, &i_shell_link, &i_persist_file);
- break;
- default:
- NOTREACHED();
- }
-
- // Return false immediately upon failure to initialize shortcut interfaces.
- if (!i_persist_file.Get())
- return false;
-
- if ((properties.options & ShortcutProperties::PROPERTIES_TARGET) &&
- FAILED(i_shell_link->SetPath(properties.target.value().c_str()))) {
- return false;
- }
-
- if ((properties.options & ShortcutProperties::PROPERTIES_WORKING_DIR) &&
- FAILED(i_shell_link->SetWorkingDirectory(
- properties.working_dir.value().c_str()))) {
- return false;
- }
-
- if (properties.options & ShortcutProperties::PROPERTIES_ARGUMENTS) {
- if (FAILED(i_shell_link->SetArguments(properties.arguments.c_str())))
- return false;
- } else if (old_i_persist_file.Get()) {
- wchar_t current_arguments[MAX_PATH] = {0};
- if (SUCCEEDED(
- old_i_shell_link->GetArguments(current_arguments, MAX_PATH))) {
- i_shell_link->SetArguments(current_arguments);
- }
- }
-
- if ((properties.options & ShortcutProperties::PROPERTIES_DESCRIPTION) &&
- FAILED(i_shell_link->SetDescription(properties.description.c_str()))) {
- return false;
- }
-
- if ((properties.options & ShortcutProperties::PROPERTIES_ICON) &&
- FAILED(i_shell_link->SetIconLocation(properties.icon.value().c_str(),
- properties.icon_index))) {
- return false;
- }
-
- bool has_app_id =
- (properties.options & ShortcutProperties::PROPERTIES_APP_ID) != 0;
- bool has_dual_mode =
- (properties.options & ShortcutProperties::PROPERTIES_DUAL_MODE) != 0;
- bool has_toast_activator_clsid =
- (properties.options &
- ShortcutProperties::PROPERTIES_TOAST_ACTIVATOR_CLSID) != 0;
- if (has_app_id || has_dual_mode || has_toast_activator_clsid) {
- ComPtr<IPropertyStore> property_store;
- if (FAILED(i_shell_link.CopyTo(property_store.GetAddressOf())) ||
- !property_store.Get())
- return false;
-
- if (has_app_id && !SetAppIdForPropertyStore(property_store.Get(),
- properties.app_id.c_str())) {
- return false;
- }
- if (has_dual_mode && !SetBooleanValueForPropertyStore(
- property_store.Get(), PKEY_AppUserModel_IsDualMode,
- properties.dual_mode)) {
- return false;
- }
- if (has_toast_activator_clsid &&
- !SetClsidForPropertyStore(property_store.Get(),
- PKEY_AppUserModel_ToastActivatorCLSID,
- properties.toast_activator_clsid)) {
- return false;
- }
- }
-
- // Release the interfaces to the old shortcut to make sure it doesn't prevent
- // overwriting it if needed.
- old_i_persist_file.Reset();
- old_i_shell_link.Reset();
-
- HRESULT result = i_persist_file->Save(shortcut_path.value().c_str(), TRUE);
-
- // Release the interfaces in case the SHChangeNotify call below depends on
- // the operations above being fully completed.
- i_persist_file.Reset();
- i_shell_link.Reset();
-
- // If we successfully created/updated the icon, notify the shell that we have
- // done so.
- const bool succeeded = SUCCEEDED(result);
- if (succeeded) {
- if (shortcut_existed) {
- // TODO(gab): SHCNE_UPDATEITEM might be sufficient here; further testing
- // required.
- SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL);
- } else {
- SHChangeNotify(SHCNE_CREATE, SHCNF_PATH, shortcut_path.value().c_str(),
- NULL);
- }
- }
-
- return succeeded;
-}
-
-bool ResolveShortcutProperties(const FilePath& shortcut_path,
- uint32_t options,
- ShortcutProperties* properties) {
- DCHECK(options && properties);
-
- if (options & ~ShortcutProperties::PROPERTIES_ALL)
- NOTREACHED() << "Unhandled property is used.";
-
- ComPtr<IShellLink> i_shell_link;
-
- // Get pointer to the IShellLink interface.
- if (FAILED(::CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
- IID_PPV_ARGS(&i_shell_link)))) {
- return false;
- }
-
- ComPtr<IPersistFile> persist;
- // Query IShellLink for the IPersistFile interface.
- if (FAILED(i_shell_link.CopyTo(persist.GetAddressOf())))
- return false;
-
- // Load the shell link.
- if (FAILED(persist->Load(shortcut_path.value().c_str(), STGM_READ)))
- return false;
-
- // Reset |properties|.
- properties->options = 0;
-
- wchar_t temp[MAX_PATH];
- if (options & ShortcutProperties::PROPERTIES_TARGET) {
- if (FAILED(i_shell_link->GetPath(temp, MAX_PATH, NULL, SLGP_UNCPRIORITY)))
- return false;
- properties->set_target(FilePath(temp));
- }
-
- if (options & ShortcutProperties::PROPERTIES_WORKING_DIR) {
- if (FAILED(i_shell_link->GetWorkingDirectory(temp, MAX_PATH)))
- return false;
- properties->set_working_dir(FilePath(temp));
- }
-
- if (options & ShortcutProperties::PROPERTIES_ARGUMENTS) {
- if (FAILED(i_shell_link->GetArguments(temp, MAX_PATH)))
- return false;
- properties->set_arguments(temp);
- }
-
- if (options & ShortcutProperties::PROPERTIES_DESCRIPTION) {
- // Note: description length constrained by MAX_PATH.
- if (FAILED(i_shell_link->GetDescription(temp, MAX_PATH)))
- return false;
- properties->set_description(temp);
- }
-
- if (options & ShortcutProperties::PROPERTIES_ICON) {
- int temp_index;
- if (FAILED(i_shell_link->GetIconLocation(temp, MAX_PATH, &temp_index)))
- return false;
- properties->set_icon(FilePath(temp), temp_index);
- }
-
- if (options & (ShortcutProperties::PROPERTIES_APP_ID |
- ShortcutProperties::PROPERTIES_DUAL_MODE |
- ShortcutProperties::PROPERTIES_TOAST_ACTIVATOR_CLSID)) {
- ComPtr<IPropertyStore> property_store;
- if (FAILED(i_shell_link.CopyTo(property_store.GetAddressOf())))
- return false;
-
- if (options & ShortcutProperties::PROPERTIES_APP_ID) {
- ScopedPropVariant pv_app_id;
- if (property_store->GetValue(PKEY_AppUserModel_ID, pv_app_id.Receive()) !=
- S_OK) {
- return false;
- }
- switch (pv_app_id.get().vt) {
- case VT_EMPTY:
- properties->set_app_id(L"");
- break;
- case VT_LPWSTR:
- properties->set_app_id(pv_app_id.get().pwszVal);
- break;
- default:
- NOTREACHED() << "Unexpected variant type: " << pv_app_id.get().vt;
- return false;
- }
- }
-
- if (options & ShortcutProperties::PROPERTIES_DUAL_MODE) {
- ScopedPropVariant pv_dual_mode;
- if (property_store->GetValue(PKEY_AppUserModel_IsDualMode,
- pv_dual_mode.Receive()) != S_OK) {
- return false;
- }
- switch (pv_dual_mode.get().vt) {
- case VT_EMPTY:
- properties->set_dual_mode(false);
- break;
- case VT_BOOL:
- properties->set_dual_mode(pv_dual_mode.get().boolVal == VARIANT_TRUE);
- break;
- default:
- NOTREACHED() << "Unexpected variant type: " << pv_dual_mode.get().vt;
- return false;
- }
- }
-
- if (options & ShortcutProperties::PROPERTIES_TOAST_ACTIVATOR_CLSID) {
- ScopedPropVariant pv_toast_activator_clsid;
- if (property_store->GetValue(PKEY_AppUserModel_ToastActivatorCLSID,
- pv_toast_activator_clsid.Receive()) !=
- S_OK) {
- return false;
- }
- switch (pv_toast_activator_clsid.get().vt) {
- case VT_EMPTY:
- properties->set_toast_activator_clsid(CLSID_NULL);
- break;
- case VT_CLSID:
- properties->set_toast_activator_clsid(
- *(pv_toast_activator_clsid.get().puuid));
- break;
- default:
- NOTREACHED() << "Unexpected variant type: "
- << pv_toast_activator_clsid.get().vt;
- return false;
- }
- }
- }
-
- return true;
-}
-
-bool ResolveShortcut(const FilePath& shortcut_path,
- FilePath* target_path,
- string16* args) {
- uint32_t options = 0;
- if (target_path)
- options |= ShortcutProperties::PROPERTIES_TARGET;
- if (args)
- options |= ShortcutProperties::PROPERTIES_ARGUMENTS;
- DCHECK(options);
-
- ShortcutProperties properties;
- if (!ResolveShortcutProperties(shortcut_path, options, &properties))
- return false;
-
- if (target_path)
- *target_path = properties.target;
- if (args)
- *args = properties.arguments;
- return true;
-}
-
-bool CanPinShortcutToTaskbar() {
- // "Pin to taskbar" stopped being supported in Windows 10.
- return GetVersion() < VERSION_WIN10;
-}
-
-bool PinShortcutToTaskbar(const FilePath& shortcut) {
- DCHECK(CanPinShortcutToTaskbar());
-
- intptr_t result = reinterpret_cast<intptr_t>(ShellExecute(
- NULL, L"taskbarpin", shortcut.value().c_str(), NULL, NULL, 0));
- return result > 32;
-}
-
-bool UnpinShortcutFromTaskbar(const FilePath& shortcut) {
- intptr_t result = reinterpret_cast<intptr_t>(ShellExecute(
- NULL, L"taskbarunpin", shortcut.value().c_str(), NULL, NULL, 0));
- return result > 32;
-}
-
-} // namespace win
-} // namespace base
diff --git a/base/win/shortcut.h b/base/win/shortcut.h
deleted file mode 100644
index d5bcff7..0000000
--- a/base/win/shortcut.h
+++ /dev/null
@@ -1,179 +0,0 @@
-// Copyright (c) 2012 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.
-
-#ifndef BASE_WIN_SHORTCUT_H_
-#define BASE_WIN_SHORTCUT_H_
-
-#include <stdint.h>
-#include <windows.h>
-
-#include "base/files/file_path.h"
-#include "base/logging.h"
-#include "base/strings/string16.h"
-
-namespace base {
-namespace win {
-
-enum ShortcutOperation {
- // Create a new shortcut (overwriting if necessary).
- SHORTCUT_CREATE_ALWAYS = 0,
- // Overwrite an existing shortcut (fails if the shortcut doesn't exist).
- // If the arguments are not specified on the new shortcut, keep the old
- // shortcut's arguments.
- SHORTCUT_REPLACE_EXISTING,
- // Update specified properties only on an existing shortcut.
- SHORTCUT_UPDATE_EXISTING,
-};
-
-// Properties for shortcuts. Properties set will be applied to the shortcut on
-// creation/update, others will be ignored.
-// Callers are encouraged to use the setters provided which take care of
-// setting |options| as desired.
-struct ShortcutProperties {
- enum IndividualProperties {
- PROPERTIES_TARGET = 1U << 0,
- PROPERTIES_WORKING_DIR = 1U << 1,
- PROPERTIES_ARGUMENTS = 1U << 2,
- PROPERTIES_DESCRIPTION = 1U << 3,
- PROPERTIES_ICON = 1U << 4,
- PROPERTIES_APP_ID = 1U << 5,
- PROPERTIES_DUAL_MODE = 1U << 6,
- PROPERTIES_TOAST_ACTIVATOR_CLSID = 1U << 7,
- // Be sure to update the values below when adding a new property.
- PROPERTIES_ALL = PROPERTIES_TARGET | PROPERTIES_WORKING_DIR |
- PROPERTIES_ARGUMENTS | PROPERTIES_DESCRIPTION |
- PROPERTIES_ICON | PROPERTIES_APP_ID |
- PROPERTIES_DUAL_MODE | PROPERTIES_TOAST_ACTIVATOR_CLSID
- };
-
- ShortcutProperties();
- ShortcutProperties(const ShortcutProperties& other);
- ~ShortcutProperties();
-
- void set_target(const FilePath& target_in) {
- target = target_in;
- options |= PROPERTIES_TARGET;
- }
-
- void set_working_dir(const FilePath& working_dir_in) {
- working_dir = working_dir_in;
- options |= PROPERTIES_WORKING_DIR;
- }
-
- void set_arguments(const string16& arguments_in) {
- // Size restriction as per MSDN at http://goo.gl/TJ7q5.
- DCHECK(arguments_in.size() < MAX_PATH);
- arguments = arguments_in;
- options |= PROPERTIES_ARGUMENTS;
- }
-
- void set_description(const string16& description_in) {
- // Size restriction as per MSDN at http://goo.gl/OdNQq.
- DCHECK(description_in.size() < MAX_PATH);
- description = description_in;
- options |= PROPERTIES_DESCRIPTION;
- }
-
- void set_icon(const FilePath& icon_in, int icon_index_in) {
- icon = icon_in;
- icon_index = icon_index_in;
- options |= PROPERTIES_ICON;
- }
-
- void set_app_id(const string16& app_id_in) {
- app_id = app_id_in;
- options |= PROPERTIES_APP_ID;
- }
-
- void set_dual_mode(bool dual_mode_in) {
- dual_mode = dual_mode_in;
- options |= PROPERTIES_DUAL_MODE;
- }
-
- void set_toast_activator_clsid(const CLSID& toast_activator_clsid_in) {
- toast_activator_clsid = toast_activator_clsid_in;
- options |= PROPERTIES_TOAST_ACTIVATOR_CLSID;
- }
-
- // The target to launch from this shortcut. This is mandatory when creating
- // a shortcut.
- FilePath target;
- // The name of the working directory when launching the shortcut.
- FilePath working_dir;
- // The arguments to be applied to |target| when launching from this shortcut.
- // The length of this string must be less than MAX_PATH.
- string16 arguments;
- // The localized description of the shortcut.
- // The length of this string must be less than MAX_PATH.
- string16 description;
- // The path to the icon (can be a dll or exe, in which case |icon_index| is
- // the resource id).
- FilePath icon;
- int icon_index;
- // The app model id for the shortcut.
- string16 app_id;
- // Whether this is a dual mode shortcut (Win8+).
- bool dual_mode;
- // The CLSID of the COM object registered with the OS via the shortcut. This
- // is for app activation via user interaction with a toast notification in the
- // Action Center. (Win10 version 1607, build 14393, and beyond).
- CLSID toast_activator_clsid;
- // Bitfield made of IndividualProperties. Properties set in |options| will be
- // set on the shortcut, others will be ignored.
- uint32_t options;
-};
-
-// This method creates (or updates) a shortcut link at |shortcut_path| using the
-// information given through |properties|.
-// Ensure you have initialized COM before calling into this function.
-// |operation|: a choice from the ShortcutOperation enum.
-// If |operation| is SHORTCUT_REPLACE_EXISTING or SHORTCUT_UPDATE_EXISTING and
-// |shortcut_path| does not exist, this method is a no-op and returns false.
-bool CreateOrUpdateShortcutLink(const FilePath& shortcut_path,
- const ShortcutProperties& properties,
- ShortcutOperation operation);
-
-// Resolves Windows shortcut (.LNK file).
-// This methods tries to resolve selected properties of a shortcut .LNK file.
-// The path of the shortcut to resolve is in |shortcut_path|. |options| is a bit
-// field composed of ShortcutProperties::IndividualProperties, to specify which
-// properties to read. It should be non-0. The resulting data are read into
-// |properties|, which must not be NULL. Note: PROPERTIES_TARGET will retrieve
-// the target path as stored in the shortcut but won't attempt to resolve that
-// path so it may not be valid. The function returns true if all requested
-// properties are successfully read. Otherwise some reads have failed and
-// intermediate values written to |properties| should be ignored.
-bool ResolveShortcutProperties(const FilePath& shortcut_path,
- uint32_t options,
- ShortcutProperties* properties);
-
-// Resolves Windows shortcut (.LNK file).
-// This is a wrapper to ResolveShortcutProperties() to handle the common use
-// case of resolving target and arguments. |target_path| and |args| are
-// optional output variables that are ignored if NULL (but at least one must be
-// non-NULL). The function returns true if all requested fields are found
-// successfully. Callers can safely use the same variable for both
-// |shortcut_path| and |target_path|.
-bool ResolveShortcut(const FilePath& shortcut_path,
- FilePath* target_path,
- string16* args);
-
-// Pin to taskbar is only supported on Windows 7 and Windows 8. Returns true on
-// those platforms.
-bool CanPinShortcutToTaskbar();
-
-// Pins a shortcut to the taskbar on Windows 7 and 8. The |shortcut| file must
-// already exist and be a shortcut that points to an executable. The app id of
-// the shortcut is used to group windows and must be set correctly.
-bool PinShortcutToTaskbar(const FilePath& shortcut);
-
-// Unpins a shortcut from the Windows 7+ taskbar. The |shortcut| must exist and
-// already be pinned to the taskbar. The app id of the shortcut is used as the
-// identifier for the taskbar item to remove and must be set correctly.
-bool UnpinShortcutFromTaskbar(const FilePath& shortcut);
-
-} // namespace win
-} // namespace base
-
-#endif // BASE_WIN_SHORTCUT_H_
diff --git a/base/win/win_client_metrics.h b/base/win/win_client_metrics.h
deleted file mode 100644
index d63bf20..0000000
--- a/base/win/win_client_metrics.h
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2018 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.
-
-// This file is separate from base/win/win_util.h to avoid pulling windows.h
-// into too many translation units.
-
-#ifndef BASE_WIN_WIN_CLIENT_METRICS_H_
-#define BASE_WIN_WIN_CLIENT_METRICS_H_
-
-#include <windows.h>
-
-// This is the same as NONCLIENTMETRICS except that the
-// unused member |iPaddedBorderWidth| has been removed.
-struct NONCLIENTMETRICS_XP {
- UINT cbSize;
- int iBorderWidth;
- int iScrollWidth;
- int iScrollHeight;
- int iCaptionWidth;
- int iCaptionHeight;
- LOGFONTW lfCaptionFont;
- int iSmCaptionWidth;
- int iSmCaptionHeight;
- LOGFONTW lfSmCaptionFont;
- int iMenuWidth;
- int iMenuHeight;
- LOGFONTW lfMenuFont;
- LOGFONTW lfStatusFont;
- LOGFONTW lfMessageFont;
-};
-
-namespace base {
-namespace win {
-
-void GetNonClientMetrics(NONCLIENTMETRICS_XP* metrics);
-
-} // namespace win
-} // namespace base
-
-#endif // BASE_WIN_WIN_CLIENT_METRICS_H_
diff --git a/base/win/win_util.cc b/base/win/win_util.cc
deleted file mode 100644
index d9efb6e..0000000
--- a/base/win/win_util.cc
+++ /dev/null
@@ -1,392 +0,0 @@
-// Copyright (c) 2012 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 "base/win/win_util.h"
-
-#include <aclapi.h>
-#include <cfgmgr32.h>
-#include <initguid.h>
-#include <powrprof.h>
-#include <shobjidl.h> // Must be before propkey.
-
-#include <inspectable.h>
-#include <mdmregistration.h>
-#include <objbase.h>
-#include <propkey.h>
-#include <propvarutil.h>
-#include <psapi.h>
-#include <roapi.h>
-#include <sddl.h>
-#include <setupapi.h>
-#include <shellscalingapi.h>
-#include <shlwapi.h>
-#include <signal.h>
-#include <stddef.h>
-#include <stdlib.h>
-#include <tchar.h> // Must be before tpcshrd.h or for any use of _T macro
-#include <tpcshrd.h>
-#include <uiviewsettingsinterop.h>
-#include <windows.ui.viewmanagement.h>
-#include <winstring.h>
-#include <wrl/client.h>
-#include <wrl/wrappers/corewrappers.h>
-
-#include <memory>
-
-#include "base/command_line.h"
-#include "base/files/file_path.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/strings/string_util.h"
-#include "base/strings/stringprintf.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/win/core_winrt_util.h"
-#include "base/win/registry.h"
-#include "base/win/scoped_co_mem.h"
-#include "base/win/scoped_handle.h"
-#include "base/win/scoped_hstring.h"
-#include "base/win/scoped_propvariant.h"
-#include "base/win/win_client_metrics.h"
-#include "base/win/windows_version.h"
-
-namespace base {
-namespace win {
-
-namespace {
-
-// Sets the value of |property_key| to |property_value| in |property_store|.
-bool SetPropVariantValueForPropertyStore(
- IPropertyStore* property_store,
- const PROPERTYKEY& property_key,
- const ScopedPropVariant& property_value) {
- DCHECK(property_store);
-
- HRESULT result = property_store->SetValue(property_key, property_value.get());
- if (result == S_OK)
- result = property_store->Commit();
- if (SUCCEEDED(result))
- return true;
-#if DCHECK_IS_ON()
- ScopedCoMem<OLECHAR> guidString;
- ::StringFromCLSID(property_key.fmtid, &guidString);
- if (HRESULT_FACILITY(result) == FACILITY_WIN32)
- ::SetLastError(HRESULT_CODE(result));
- // See third_party/perl/c/i686-w64-mingw32/include/propkey.h for GUID and
- // PID definitions.
- DPLOG(ERROR) << "Failed to set property with GUID " << guidString << " PID "
- << property_key.pid;
-#endif
- return false;
-}
-
-void __cdecl ForceCrashOnSigAbort(int) {
- *((volatile int*)0) = 0x1337;
-}
-
-// Returns the current platform role. We use the PowerDeterminePlatformRoleEx
-// API for that.
-POWER_PLATFORM_ROLE GetPlatformRole() {
- return PowerDeterminePlatformRoleEx(POWER_PLATFORM_ROLE_V2);
-}
-
-// Method used for Windows 8.1 and later.
-// Since we support versions earlier than 8.1, we must dynamically load this
-// function from user32.dll, so it won't fail to load in runtime. For earlier
-// Windows versions GetProcAddress will return null and report failure so that
-// callers can fall back on the deprecated SetProcessDPIAware.
-bool SetProcessDpiAwarenessWrapper(PROCESS_DPI_AWARENESS value) {
- decltype(&::SetProcessDpiAwareness) set_process_dpi_awareness_func =
- reinterpret_cast<decltype(&::SetProcessDpiAwareness)>(GetProcAddress(
- GetModuleHandle(L"user32.dll"), "SetProcessDpiAwarenessInternal"));
- if (set_process_dpi_awareness_func) {
- HRESULT hr = set_process_dpi_awareness_func(value);
- if (SUCCEEDED(hr))
- return true;
- DLOG_IF(ERROR, hr == E_ACCESSDENIED)
- << "Access denied error from SetProcessDpiAwarenessInternal. Function "
- "called twice, or manifest was used.";
- NOTREACHED()
- << "SetProcessDpiAwarenessInternal failed with unexpected error: "
- << hr;
- return false;
- }
-
- DCHECK_LT(GetVersion(), VERSION_WIN8_1) << "SetProcessDpiAwarenessInternal "
- "should be available on all "
- "platforms >= Windows 8.1";
- return false;
-}
-
-} // namespace
-
-static bool g_crash_on_process_detach = false;
-
-void GetNonClientMetrics(NONCLIENTMETRICS_XP* metrics) {
- DCHECK(metrics);
- metrics->cbSize = sizeof(*metrics);
- const bool success =
- !!SystemParametersInfo(SPI_GETNONCLIENTMETRICS, metrics->cbSize,
- reinterpret_cast<NONCLIENTMETRICS*>(metrics), 0);
- DCHECK(success);
-}
-
-bool GetUserSidString(std::wstring* user_sid) {
- // Get the current token.
- HANDLE token = NULL;
- if (!::OpenProcessToken(::GetCurrentProcess(), TOKEN_QUERY, &token))
- return false;
- ScopedHandle token_scoped(token);
-
- DWORD size = sizeof(TOKEN_USER) + SECURITY_MAX_SID_SIZE;
- std::unique_ptr<BYTE[]> user_bytes(new BYTE[size]);
- TOKEN_USER* user = reinterpret_cast<TOKEN_USER*>(user_bytes.get());
-
- if (!::GetTokenInformation(token, TokenUser, user, size, &size))
- return false;
-
- if (!user->User.Sid)
- return false;
-
- // Convert the data to a string.
- wchar_t* sid_string;
- if (!::ConvertSidToStringSid(user->User.Sid, &sid_string))
- return false;
-
- *user_sid = sid_string;
-
- ::LocalFree(sid_string);
-
- return true;
-}
-
-bool UserAccountControlIsEnabled() {
- RegKey key(HKEY_LOCAL_MACHINE,
- L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System",
- KEY_READ);
- DWORD uac_enabled;
- if (key.ReadValueDW(L"EnableLUA", &uac_enabled) != ERROR_SUCCESS)
- return true;
- // Users can set the EnableLUA value to something arbitrary, like 2, which
- // Vista will treat as UAC enabled, so we make sure it is not set to 0.
- return (uac_enabled != 0);
-}
-
-bool SetBooleanValueForPropertyStore(IPropertyStore* property_store,
- const PROPERTYKEY& property_key,
- bool property_bool_value) {
- ScopedPropVariant property_value;
- if (FAILED(InitPropVariantFromBoolean(property_bool_value,
- property_value.Receive()))) {
- return false;
- }
-
- return SetPropVariantValueForPropertyStore(property_store, property_key,
- property_value);
-}
-
-bool SetStringValueForPropertyStore(IPropertyStore* property_store,
- const PROPERTYKEY& property_key,
- const wchar_t* property_string_value) {
- ScopedPropVariant property_value;
- if (FAILED(InitPropVariantFromString(property_string_value,
- property_value.Receive()))) {
- return false;
- }
-
- return SetPropVariantValueForPropertyStore(property_store, property_key,
- property_value);
-}
-
-bool SetClsidForPropertyStore(IPropertyStore* property_store,
- const PROPERTYKEY& property_key,
- const CLSID& property_clsid_value) {
- ScopedPropVariant property_value;
- if (FAILED(InitPropVariantFromCLSID(property_clsid_value,
- property_value.Receive()))) {
- return false;
- }
-
- return SetPropVariantValueForPropertyStore(property_store, property_key,
- property_value);
-}
-
-bool SetAppIdForPropertyStore(IPropertyStore* property_store,
- const wchar_t* app_id) {
- // App id should be less than 64 chars and contain no space. And recommended
- // format is CompanyName.ProductName[.SubProduct.ProductNumber].
- // See http://msdn.microsoft.com/en-us/library/dd378459%28VS.85%29.aspx
- DCHECK(lstrlen(app_id) < 64 && wcschr(app_id, L' ') == NULL);
-
- return SetStringValueForPropertyStore(property_store, PKEY_AppUserModel_ID,
- app_id);
-}
-
-static const char16 kAutoRunKeyPath[] =
- L"Software\\Microsoft\\Windows\\CurrentVersion\\Run";
-
-bool AddCommandToAutoRun(HKEY root_key,
- const string16& name,
- const string16& command) {
- RegKey autorun_key(root_key, kAutoRunKeyPath, KEY_SET_VALUE);
- return (autorun_key.WriteValue(name.c_str(), command.c_str()) ==
- ERROR_SUCCESS);
-}
-
-bool RemoveCommandFromAutoRun(HKEY root_key, const string16& name) {
- RegKey autorun_key(root_key, kAutoRunKeyPath, KEY_SET_VALUE);
- return (autorun_key.DeleteValue(name.c_str()) == ERROR_SUCCESS);
-}
-
-bool ReadCommandFromAutoRun(HKEY root_key,
- const string16& name,
- string16* command) {
- RegKey autorun_key(root_key, kAutoRunKeyPath, KEY_QUERY_VALUE);
- return (autorun_key.ReadValue(name.c_str(), command) == ERROR_SUCCESS);
-}
-
-void SetShouldCrashOnProcessDetach(bool crash) {
- g_crash_on_process_detach = crash;
-}
-
-bool ShouldCrashOnProcessDetach() {
- return g_crash_on_process_detach;
-}
-
-void SetAbortBehaviorForCrashReporting() {
- // Prevent CRT's abort code from prompting a dialog or trying to "report" it.
- // Disabling the _CALL_REPORTFAULT behavior is important since otherwise it
- // has the sideffect of clearing our exception filter, which means we
- // don't get any crash.
- _set_abort_behavior(0, _WRITE_ABORT_MSG | _CALL_REPORTFAULT);
-
- // Set a SIGABRT handler for good measure. We will crash even if the default
- // is left in place, however this allows us to crash earlier. And it also
- // lets us crash in response to code which might directly call raise(SIGABRT)
- signal(SIGABRT, ForceCrashOnSigAbort);
-}
-
-bool IsUser32AndGdi32Available() {
- static auto is_user32_and_gdi32_available = []() {
- // If win32k syscalls aren't disabled, then user32 and gdi32 are available.
-
- // Can't disable win32k prior to windows 8.
- if (GetVersion() < VERSION_WIN8)
- return true;
-
- typedef decltype(
- GetProcessMitigationPolicy)* GetProcessMitigationPolicyType;
- GetProcessMitigationPolicyType get_process_mitigation_policy_func =
- reinterpret_cast<GetProcessMitigationPolicyType>(GetProcAddress(
- GetModuleHandle(L"kernel32.dll"), "GetProcessMitigationPolicy"));
-
- if (!get_process_mitigation_policy_func)
- return true;
-
- PROCESS_MITIGATION_SYSTEM_CALL_DISABLE_POLICY policy = {};
- if (get_process_mitigation_policy_func(GetCurrentProcess(),
- ProcessSystemCallDisablePolicy,
- &policy, sizeof(policy))) {
- return policy.DisallowWin32kSystemCalls == 0;
- }
-
- return true;
- }();
- return is_user32_and_gdi32_available;
-}
-
-bool GetLoadedModulesSnapshot(HANDLE process, std::vector<HMODULE>* snapshot) {
- DCHECK(snapshot);
- DCHECK_EQ(0u, snapshot->size());
- snapshot->resize(128);
-
- // We will retry at least once after first determining |bytes_required|. If
- // the list of modules changes after we receive |bytes_required| we may retry
- // more than once.
- int retries_remaining = 5;
- do {
- DWORD bytes_required = 0;
- // EnumProcessModules returns 'success' even if the buffer size is too
- // small.
- DCHECK_GE(std::numeric_limits<DWORD>::max(),
- snapshot->size() * sizeof(HMODULE));
- if (!::EnumProcessModules(
- process, &(*snapshot)[0],
- static_cast<DWORD>(snapshot->size() * sizeof(HMODULE)),
- &bytes_required)) {
- DPLOG(ERROR) << "::EnumProcessModules failed.";
- return false;
- }
- DCHECK_EQ(0u, bytes_required % sizeof(HMODULE));
- size_t num_modules = bytes_required / sizeof(HMODULE);
- if (num_modules <= snapshot->size()) {
- // Buffer size was too big, presumably because a module was unloaded.
- snapshot->erase(snapshot->begin() + num_modules, snapshot->end());
- return true;
- } else if (num_modules == 0) {
- DLOG(ERROR) << "Can't determine the module list size.";
- return false;
- } else {
- // Buffer size was too small. Try again with a larger buffer. A little
- // more room is given to avoid multiple expensive calls to
- // ::EnumProcessModules() just because one module has been added.
- snapshot->resize(num_modules + 8, NULL);
- }
- } while (--retries_remaining);
-
- DLOG(ERROR) << "Failed to enumerate modules.";
- return false;
-}
-
-void EnableFlicks(HWND hwnd) {
- ::RemoveProp(hwnd, MICROSOFT_TABLETPENSERVICE_PROPERTY);
-}
-
-void DisableFlicks(HWND hwnd) {
- ::SetProp(hwnd, MICROSOFT_TABLETPENSERVICE_PROPERTY,
- reinterpret_cast<HANDLE>(TABLET_DISABLE_FLICKS |
- TABLET_DISABLE_FLICKFALLBACKKEYS));
-}
-
-bool IsProcessPerMonitorDpiAware() {
- enum class PerMonitorDpiAware {
- UNKNOWN = 0,
- PER_MONITOR_DPI_UNAWARE,
- PER_MONITOR_DPI_AWARE,
- };
- static PerMonitorDpiAware per_monitor_dpi_aware = PerMonitorDpiAware::UNKNOWN;
- if (per_monitor_dpi_aware == PerMonitorDpiAware::UNKNOWN) {
- per_monitor_dpi_aware = PerMonitorDpiAware::PER_MONITOR_DPI_UNAWARE;
- HMODULE shcore_dll = ::LoadLibrary(L"shcore.dll");
- if (shcore_dll) {
- auto get_process_dpi_awareness_func =
- reinterpret_cast<decltype(::GetProcessDpiAwareness)*>(
- ::GetProcAddress(shcore_dll, "GetProcessDpiAwareness"));
- if (get_process_dpi_awareness_func) {
- PROCESS_DPI_AWARENESS awareness;
- if (SUCCEEDED(get_process_dpi_awareness_func(nullptr, &awareness)) &&
- awareness == PROCESS_PER_MONITOR_DPI_AWARE)
- per_monitor_dpi_aware = PerMonitorDpiAware::PER_MONITOR_DPI_AWARE;
- }
- }
- }
- return per_monitor_dpi_aware == PerMonitorDpiAware::PER_MONITOR_DPI_AWARE;
-}
-
-void EnableHighDPISupport() {
- // Enable per-monitor DPI for Win10 or above instead of Win8.1 since Win8.1
- // does not have EnableChildWindowDpiMessage, necessary for correct non-client
- // area scaling across monitors.
- PROCESS_DPI_AWARENESS process_dpi_awareness =
- GetVersion() >= VERSION_WIN10 ? PROCESS_PER_MONITOR_DPI_AWARE
- : PROCESS_SYSTEM_DPI_AWARE;
- if (!SetProcessDpiAwarenessWrapper(process_dpi_awareness)) {
- // For windows versions where SetProcessDpiAwareness is not available or
- // failed, try its predecessor.
- BOOL result = ::SetProcessDPIAware();
- DCHECK(result) << "SetProcessDPIAware failed.";
- }
-}
-
-} // namespace win
-} // namespace base
diff --git a/base/win/win_util.h b/base/win/win_util.h
deleted file mode 100644
index 08738cb..0000000
--- a/base/win/win_util.h
+++ /dev/null
@@ -1,151 +0,0 @@
-// Copyright (c) 2012 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.
-
-// =============================================================================
-// PLEASE READ
-//
-// In general, you should not be adding stuff to this file.
-//
-// - If your thing is only used in one place, just put it in a reasonable
-// location in or near that one place. It's nice you want people to be able
-// to re-use your function, but realistically, if it hasn't been necessary
-// before after so many years of development, it's probably not going to be
-// used in other places in the future unless you know of them now.
-//
-// - If your thing is used by multiple callers and is UI-related, it should
-// probably be in app/win/ instead. Try to put it in the most specific file
-// possible (avoiding the *_util files when practical).
-//
-// =============================================================================
-
-#ifndef BASE_WIN_WIN_UTIL_H_
-#define BASE_WIN_WIN_UTIL_H_
-
-#include <stdint.h>
-#include "base/win/windows_types.h"
-
-#include <string>
-#include <vector>
-
-#include "base/strings/string16.h"
-
-struct IPropertyStore;
-struct _tagpropertykey;
-typedef _tagpropertykey PROPERTYKEY;
-
-namespace base {
-namespace win {
-
-inline uint32_t HandleToUint32(HANDLE h) {
- // Cast through uintptr_t and then unsigned int to make the truncation to
- // 32 bits explicit. Handles are size of-pointer but are always 32-bit values.
- // https://msdn.microsoft.com/en-us/library/aa384203(VS.85).aspx says:
- // 64-bit versions of Windows use 32-bit handles for interoperability.
- return static_cast<uint32_t>(reinterpret_cast<uintptr_t>(h));
-}
-
-inline HANDLE Uint32ToHandle(uint32_t h) {
- return reinterpret_cast<HANDLE>(
- static_cast<uintptr_t>(static_cast<int32_t>(h)));
-}
-
-// Returns the string representing the current user sid.
-bool GetUserSidString(std::wstring* user_sid);
-
-// Returns false if user account control (UAC) has been disabled with the
-// EnableLUA registry flag. Returns true if user account control is enabled.
-// NOTE: The EnableLUA registry flag, which is ignored on Windows XP
-// machines, might still exist and be set to 0 (UAC disabled), in which case
-// this function will return false. You should therefore check this flag only
-// if the OS is Vista or later.
-bool UserAccountControlIsEnabled();
-
-// Sets the boolean value for a given key in given IPropertyStore.
-bool SetBooleanValueForPropertyStore(IPropertyStore* property_store,
- const PROPERTYKEY& property_key,
- bool property_bool_value);
-
-// Sets the string value for a given key in given IPropertyStore.
-bool SetStringValueForPropertyStore(IPropertyStore* property_store,
- const PROPERTYKEY& property_key,
- const wchar_t* property_string_value);
-
-// Sets the CLSID value for a given key in a given IPropertyStore.
-bool SetClsidForPropertyStore(IPropertyStore* property_store,
- const PROPERTYKEY& property_key,
- const CLSID& property_clsid_value);
-
-// Sets the application id in given IPropertyStore. The function is intended
-// for tagging application/chromium shortcut, browser window and jump list for
-// Win7.
-bool SetAppIdForPropertyStore(IPropertyStore* property_store,
- const wchar_t* app_id);
-
-// Adds the specified |command| using the specified |name| to the AutoRun key.
-// |root_key| could be HKCU or HKLM or the root of any user hive.
-bool AddCommandToAutoRun(HKEY root_key,
- const string16& name,
- const string16& command);
-// Removes the command specified by |name| from the AutoRun key. |root_key|
-// could be HKCU or HKLM or the root of any user hive.
-bool RemoveCommandFromAutoRun(HKEY root_key, const string16& name);
-
-// Reads the command specified by |name| from the AutoRun key. |root_key|
-// could be HKCU or HKLM or the root of any user hive. Used for unit-tests.
-bool ReadCommandFromAutoRun(HKEY root_key,
- const string16& name,
- string16* command);
-
-// Sets whether to crash the process during exit. This is inspected by DLLMain
-// and used to intercept unexpected terminations of the process (via calls to
-// exit(), abort(), _exit(), ExitProcess()) and convert them into crashes.
-// Note that not all mechanisms for terminating the process are covered by
-// this. In particular, TerminateProcess() is not caught.
-void SetShouldCrashOnProcessDetach(bool crash);
-bool ShouldCrashOnProcessDetach();
-
-// Adjusts the abort behavior so that crash reports can be generated when the
-// process is aborted.
-void SetAbortBehaviorForCrashReporting();
-
-// Get the size of a struct up to and including the specified member.
-// This is necessary to set compatible struct sizes for different versions
-// of certain Windows APIs (e.g. SystemParametersInfo).
-#define SIZEOF_STRUCT_WITH_SPECIFIED_LAST_MEMBER(struct_name, member) \
- offsetof(struct_name, member) + \
- (sizeof static_cast<struct_name*>(NULL)->member)
-
-// Used by tests to mock any wanted state. Call with |state| set to true to
-// simulate being in a domain and false otherwise.
-void SetDomainStateForTesting(bool state);
-
-// Returns true if the current process can make USER32 or GDI32 calls such as
-// CreateWindow and CreateDC. Windows 8 and above allow the kernel component
-// of these calls to be disabled which can cause undefined behaviour such as
-// crashes. This function can be used to guard areas of code using these calls
-// and provide a fallback path if necessary.
-bool IsUser32AndGdi32Available();
-
-// Takes a snapshot of the modules loaded in the |process|. The returned
-// HMODULEs are not add-ref'd, so they should not be closed and may be
-// invalidated at any time (should a module be unloaded). |process| requires
-// the PROCESS_QUERY_INFORMATION and PROCESS_VM_READ permissions.
-bool GetLoadedModulesSnapshot(HANDLE process, std::vector<HMODULE>* snapshot);
-
-// Adds or removes the MICROSOFT_TABLETPENSERVICE_PROPERTY property with the
-// TABLET_DISABLE_FLICKS & TABLET_DISABLE_FLICKFALLBACKKEYS flags in order to
-// disable pen flick gestures for the given HWND.
-void EnableFlicks(HWND hwnd);
-void DisableFlicks(HWND hwnd);
-
-// Returns true if the process is per monitor DPI aware.
-bool IsProcessPerMonitorDpiAware();
-
-// Enable high-DPI support for the current process.
-void EnableHighDPISupport();
-
-} // namespace win
-} // namespace base
-
-#endif // BASE_WIN_WIN_UTIL_H_
diff --git a/base/win/windows_version.cc b/base/win/windows_version.cc
deleted file mode 100644
index dd45286..0000000
--- a/base/win/windows_version.cc
+++ /dev/null
@@ -1,254 +0,0 @@
-// Copyright (c) 2012 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 "base/win/windows_version.h"
-
-#include <windows.h>
-
-#include <memory>
-
-#include "base/files/file_path.h"
-#include "base/logging.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/win/registry.h"
-
-#if !defined(__clang__) && _MSC_FULL_VER < 191125507
-#error VS 2017 Update 3.2 or higher is required
-#endif
-
-#if !defined(NTDDI_WIN10_RS2)
-// Windows 10 April 2018 SDK is required to build Chrome.
-#error April 2018 SDK (10.0.17134.0) or higher required.
-#endif
-
-namespace {
-typedef BOOL(WINAPI* GetProductInfoPtr)(DWORD, DWORD, DWORD, DWORD, PDWORD);
-} // namespace
-
-namespace base {
-namespace win {
-
-namespace {
-
-// Helper to map a major.minor.x.build version (e.g. 6.1) to a Windows release.
-Version MajorMinorBuildToVersion(int major, int minor, int build) {
- if ((major == 5) && (minor > 0)) {
- // Treat XP Pro x64, Home Server, and Server 2003 R2 as Server 2003.
- return (minor == 1) ? VERSION_XP : VERSION_SERVER_2003;
- } else if (major == 6) {
- switch (minor) {
- case 0:
- // Treat Windows Server 2008 the same as Windows Vista.
- return VERSION_VISTA;
- case 1:
- // Treat Windows Server 2008 R2 the same as Windows 7.
- return VERSION_WIN7;
- case 2:
- // Treat Windows Server 2012 the same as Windows 8.
- return VERSION_WIN8;
- default:
- DCHECK_EQ(minor, 3);
- return VERSION_WIN8_1;
- }
- } else if (major == 10) {
- if (build < 10586) {
- return VERSION_WIN10;
- } else if (build < 14393) {
- return VERSION_WIN10_TH2;
- } else if (build < 15063) {
- return VERSION_WIN10_RS1;
- } else if (build < 16299) {
- return VERSION_WIN10_RS2;
- } else if (build < 17134) {
- return VERSION_WIN10_RS3;
- } else {
- return VERSION_WIN10_RS4;
- }
- } else if (major > 6) {
- NOTREACHED();
- return VERSION_WIN_LAST;
- }
-
- return VERSION_PRE_XP;
-}
-
-// Returns the the "UBR" value from the registry. Introduced in Windows 10,
-// this undocumented value appears to be similar to a patch number.
-// Returns 0 if the value does not exist or it could not be read.
-int GetUBR() {
- // The values under the CurrentVersion registry hive are mirrored under
- // the corresponding Wow6432 hive.
- static constexpr wchar_t kRegKeyWindowsNTCurrentVersion[] =
- L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion";
-
- base::win::RegKey key;
- if (key.Open(HKEY_LOCAL_MACHINE, kRegKeyWindowsNTCurrentVersion,
- KEY_QUERY_VALUE) != ERROR_SUCCESS) {
- return 0;
- }
-
- DWORD ubr = 0;
- key.ReadValueDW(L"UBR", &ubr);
-
- return static_cast<int>(ubr);
-}
-
-} // namespace
-
-// static
-OSInfo* OSInfo::GetInstance() {
- // Note: we don't use the Singleton class because it depends on AtExitManager,
- // and it's convenient for other modules to use this classs without it. This
- // pattern is copied from gurl.cc.
- static OSInfo* info;
- if (!info) {
- OSInfo* new_info = new OSInfo();
- if (InterlockedCompareExchangePointer(reinterpret_cast<PVOID*>(&info),
- new_info, NULL)) {
- delete new_info;
- }
- }
- return info;
-}
-
-OSInfo::OSInfo()
- : version_(VERSION_PRE_XP),
- kernel32_version_(VERSION_PRE_XP),
- architecture_(OTHER_ARCHITECTURE),
- wow64_status_(GetWOW64StatusForProcess(GetCurrentProcess())) {
- OSVERSIONINFOEX version_info = {sizeof version_info};
- ::GetVersionEx(reinterpret_cast<OSVERSIONINFO*>(&version_info));
- version_number_.major = version_info.dwMajorVersion;
- version_number_.minor = version_info.dwMinorVersion;
- version_number_.build = version_info.dwBuildNumber;
- version_number_.patch = GetUBR();
- version_ = MajorMinorBuildToVersion(
- version_number_.major, version_number_.minor, version_number_.build);
- service_pack_.major = version_info.wServicePackMajor;
- service_pack_.minor = version_info.wServicePackMinor;
- service_pack_str_ = base::WideToUTF8(version_info.szCSDVersion);
-
- SYSTEM_INFO system_info = {};
- ::GetNativeSystemInfo(&system_info);
- switch (system_info.wProcessorArchitecture) {
- case PROCESSOR_ARCHITECTURE_INTEL:
- architecture_ = X86_ARCHITECTURE;
- break;
- case PROCESSOR_ARCHITECTURE_AMD64:
- architecture_ = X64_ARCHITECTURE;
- break;
- case PROCESSOR_ARCHITECTURE_IA64:
- architecture_ = IA64_ARCHITECTURE;
- break;
- }
- processors_ = system_info.dwNumberOfProcessors;
- allocation_granularity_ = system_info.dwAllocationGranularity;
-
- GetProductInfoPtr get_product_info;
- DWORD os_type;
-
- if (version_info.dwMajorVersion == 6 || version_info.dwMajorVersion == 10) {
- // Only present on Vista+.
- get_product_info = reinterpret_cast<GetProductInfoPtr>(
- ::GetProcAddress(::GetModuleHandle(L"kernel32.dll"), "GetProductInfo"));
-
- get_product_info(version_info.dwMajorVersion, version_info.dwMinorVersion,
- 0, 0, &os_type);
- switch (os_type) {
- case PRODUCT_CLUSTER_SERVER:
- case PRODUCT_DATACENTER_SERVER:
- case PRODUCT_DATACENTER_SERVER_CORE:
- case PRODUCT_ENTERPRISE_SERVER:
- case PRODUCT_ENTERPRISE_SERVER_CORE:
- case PRODUCT_ENTERPRISE_SERVER_IA64:
- case PRODUCT_SMALLBUSINESS_SERVER:
- case PRODUCT_SMALLBUSINESS_SERVER_PREMIUM:
- case PRODUCT_STANDARD_SERVER:
- case PRODUCT_STANDARD_SERVER_CORE:
- case PRODUCT_WEB_SERVER:
- version_type_ = SUITE_SERVER;
- break;
- case PRODUCT_PROFESSIONAL:
- case PRODUCT_ULTIMATE:
- version_type_ = SUITE_PROFESSIONAL;
- break;
- case PRODUCT_ENTERPRISE:
- case PRODUCT_ENTERPRISE_E:
- case PRODUCT_ENTERPRISE_EVALUATION:
- case PRODUCT_ENTERPRISE_N:
- case PRODUCT_ENTERPRISE_N_EVALUATION:
- case PRODUCT_ENTERPRISE_S:
- case PRODUCT_ENTERPRISE_S_EVALUATION:
- case PRODUCT_ENTERPRISE_S_N:
- case PRODUCT_ENTERPRISE_S_N_EVALUATION:
- case PRODUCT_BUSINESS:
- case PRODUCT_BUSINESS_N:
- version_type_ = SUITE_ENTERPRISE;
- break;
- case PRODUCT_EDUCATION:
- case PRODUCT_EDUCATION_N:
- version_type_ = SUITE_EDUCATION;
- break;
- case PRODUCT_HOME_BASIC:
- case PRODUCT_HOME_PREMIUM:
- case PRODUCT_STARTER:
- default:
- version_type_ = SUITE_HOME;
- break;
- }
- } else if (version_info.dwMajorVersion == 5 &&
- version_info.dwMinorVersion == 2) {
- if (version_info.wProductType == VER_NT_WORKSTATION &&
- system_info.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) {
- version_type_ = SUITE_PROFESSIONAL;
- } else if (version_info.wSuiteMask & VER_SUITE_WH_SERVER) {
- version_type_ = SUITE_HOME;
- } else {
- version_type_ = SUITE_SERVER;
- }
- } else if (version_info.dwMajorVersion == 5 &&
- version_info.dwMinorVersion == 1) {
- if (version_info.wSuiteMask & VER_SUITE_PERSONAL)
- version_type_ = SUITE_HOME;
- else
- version_type_ = SUITE_PROFESSIONAL;
- } else {
- // Windows is pre XP so we don't care but pick a safe default.
- version_type_ = SUITE_HOME;
- }
-}
-
-OSInfo::~OSInfo() {}
-
-std::string OSInfo::processor_model_name() {
- if (processor_model_name_.empty()) {
- const wchar_t kProcessorNameString[] =
- L"HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0";
- base::win::RegKey key(HKEY_LOCAL_MACHINE, kProcessorNameString, KEY_READ);
- string16 value;
- key.ReadValue(L"ProcessorNameString", &value);
- processor_model_name_ = UTF16ToUTF8(value);
- }
- return processor_model_name_;
-}
-
-// static
-OSInfo::WOW64Status OSInfo::GetWOW64StatusForProcess(HANDLE process_handle) {
- typedef BOOL(WINAPI * IsWow64ProcessFunc)(HANDLE, PBOOL);
- IsWow64ProcessFunc is_wow64_process = reinterpret_cast<IsWow64ProcessFunc>(
- GetProcAddress(GetModuleHandle(L"kernel32.dll"), "IsWow64Process"));
- if (!is_wow64_process)
- return WOW64_DISABLED;
- BOOL is_wow64 = FALSE;
- if (!(*is_wow64_process)(process_handle, &is_wow64))
- return WOW64_UNKNOWN;
- return is_wow64 ? WOW64_ENABLED : WOW64_DISABLED;
-}
-
-Version GetVersion() {
- return OSInfo::GetInstance()->version();
-}
-
-} // namespace win
-} // namespace base
diff --git a/base/win/windows_version.h b/base/win/windows_version.h
deleted file mode 100644
index cd1df78..0000000
--- a/base/win/windows_version.h
+++ /dev/null
@@ -1,146 +0,0 @@
-// Copyright (c) 2012 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.
-
-#ifndef BASE_WIN_WINDOWS_VERSION_H_
-#define BASE_WIN_WINDOWS_VERSION_H_
-
-#include <stddef.h>
-
-#include <string>
-
-#include "base/macros.h"
-
-typedef void* HANDLE;
-
-namespace base {
-namespace win {
-
-// The running version of Windows. This is declared outside OSInfo for
-// syntactic sugar reasons; see the declaration of GetVersion() below.
-// NOTE: Keep these in order so callers can do things like
-// "if (base::win::GetVersion() >= base::win::VERSION_VISTA) ...".
-//
-// This enum is used in metrics histograms, so they shouldn't be reordered or
-// removed. New values can be added before VERSION_WIN_LAST.
-enum Version {
- VERSION_PRE_XP = 0, // Not supported.
- VERSION_XP = 1,
- VERSION_SERVER_2003 = 2, // Also includes XP Pro x64 and Server 2003 R2.
- VERSION_VISTA = 3, // Also includes Windows Server 2008.
- VERSION_WIN7 = 4, // Also includes Windows Server 2008 R2.
- VERSION_WIN8 = 5, // Also includes Windows Server 2012.
- VERSION_WIN8_1 = 6, // Also includes Windows Server 2012 R2.
- VERSION_WIN10 = 7, // Threshold 1: Version 1507, Build 10240.
- VERSION_WIN10_TH2 = 8, // Threshold 2: Version 1511, Build 10586.
- VERSION_WIN10_RS1 = 9, // Redstone 1: Version 1607, Build 14393.
- VERSION_WIN10_RS2 = 10, // Redstone 2: Version 1703, Build 15063.
- VERSION_WIN10_RS3 = 11, // Redstone 3: Version 1709, Build 16299.
- VERSION_WIN10_RS4 = 12, // Redstone 4: Version 1803, Build 17134.
- // On edit, update tools\metrics\histograms\enums.xml "WindowsVersion" and
- // "GpuBlacklistFeatureTestResultsWindows2".
- VERSION_WIN_LAST, // Indicates error condition.
-};
-
-// A rough bucketing of the available types of versions of Windows. This is used
-// to distinguish enterprise enabled versions from home versions and potentially
-// server versions. Keep these values in the same order, since they are used as
-// is for metrics histogram ids.
-enum VersionType {
- SUITE_HOME = 0,
- SUITE_PROFESSIONAL,
- SUITE_SERVER,
- SUITE_ENTERPRISE,
- SUITE_EDUCATION,
- SUITE_LAST,
-};
-
-// A singleton that can be used to query various pieces of information about the
-// OS and process state. Note that this doesn't use the base Singleton class, so
-// it can be used without an AtExitManager.
-class OSInfo {
- public:
- struct VersionNumber {
- int major;
- int minor;
- int build;
- int patch;
- };
-
- struct ServicePack {
- int major;
- int minor;
- };
-
- // The processor architecture this copy of Windows natively uses. For
- // example, given an x64-capable processor, we have three possibilities:
- // 32-bit Chrome running on 32-bit Windows: X86_ARCHITECTURE
- // 32-bit Chrome running on 64-bit Windows via WOW64: X64_ARCHITECTURE
- // 64-bit Chrome running on 64-bit Windows: X64_ARCHITECTURE
- enum WindowsArchitecture {
- X86_ARCHITECTURE,
- X64_ARCHITECTURE,
- IA64_ARCHITECTURE,
- OTHER_ARCHITECTURE,
- };
-
- // Whether a process is running under WOW64 (the wrapper that allows 32-bit
- // processes to run on 64-bit versions of Windows). This will return
- // WOW64_DISABLED for both "32-bit Chrome on 32-bit Windows" and "64-bit
- // Chrome on 64-bit Windows". WOW64_UNKNOWN means "an error occurred", e.g.
- // the process does not have sufficient access rights to determine this.
- enum WOW64Status {
- WOW64_DISABLED,
- WOW64_ENABLED,
- WOW64_UNKNOWN,
- };
-
- static OSInfo* GetInstance();
-
- Version version() const { return version_; }
- // The next two functions return arrays of values, [major, minor(, build)].
- VersionNumber version_number() const { return version_number_; }
- VersionType version_type() const { return version_type_; }
- ServicePack service_pack() const { return service_pack_; }
- std::string service_pack_str() const { return service_pack_str_; }
- WindowsArchitecture architecture() const { return architecture_; }
- int processors() const { return processors_; }
- size_t allocation_granularity() const { return allocation_granularity_; }
- WOW64Status wow64_status() const { return wow64_status_; }
- std::string processor_model_name();
-
- // Like wow64_status(), but for the supplied handle instead of the current
- // process. This doesn't touch member state, so you can bypass the singleton.
- static WOW64Status GetWOW64StatusForProcess(HANDLE process_handle);
-
- private:
- OSInfo();
- ~OSInfo();
-
- Version version_;
- mutable Version kernel32_version_;
- VersionNumber version_number_;
- VersionType version_type_;
- ServicePack service_pack_;
-
- // A string, such as "Service Pack 3", that indicates the latest Service Pack
- // installed on the system. If no Service Pack has been installed, the string
- // is empty.
- std::string service_pack_str_;
- WindowsArchitecture architecture_;
- int processors_;
- size_t allocation_granularity_;
- WOW64Status wow64_status_;
- std::string processor_model_name_;
-
- DISALLOW_COPY_AND_ASSIGN(OSInfo);
-};
-
-// Because this is by far the most commonly-requested value from the above
-// singleton, we add a global-scope accessor here as syntactic sugar.
-Version GetVersion();
-
-} // namespace win
-} // namespace base
-
-#endif // BASE_WIN_WINDOWS_VERSION_H_
diff --git a/build/gen.py b/build/gen.py
index ff6084e..4bf84d9 100755
--- a/build/gen.py
+++ b/build/gen.py
@@ -525,20 +525,10 @@
'base/synchronization/waitable_event_win.cc',
'base/threading/platform_thread_win.cc',
'base/time/time_win.cc',
- 'base/win/core_winrt_util.cc',
- 'base/win/enum_variant.cc',
- 'base/win/iat_patch_function.cc',
- 'base/win/iunknown_impl.cc',
- 'base/win/pe_image.cc',
- 'base/win/process_startup_helper.cc',
'base/win/registry.cc',
- 'base/win/resource_util.cc',
'base/win/scoped_handle.cc',
'base/win/scoped_process_information.cc',
- 'base/win/shortcut.cc',
'base/win/startup_information.cc',
- 'base/win/win_util.cc',
- 'base/win/windows_version.cc',
])
libs.extend([