mirror of
https://github.com/klzgrad/naiveproxy.git
synced 2024-11-24 06:16:30 +03:00
82 lines
2.1 KiB
C++
82 lines
2.1 KiB
C++
// 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
|