| // Copyright 2012 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "base/win/startup_information.h" |
| |
| #include <utility> |
| |
| namespace base { |
| namespace win { |
| |
| StartupInformation::StartupInformation() : startup_info_() { |
| startup_info_.StartupInfo.cb = sizeof(startup_info_); |
| } |
| |
| StartupInformation::~StartupInformation() { |
| if (startup_info_.lpAttributeList) { |
| ::DeleteProcThreadAttributeList(startup_info_.lpAttributeList); |
| } |
| } |
| |
| bool StartupInformation::InitializeProcThreadAttributeList( |
| DWORD attribute_count) { |
| if (startup_info_.StartupInfo.cb != sizeof(startup_info_) || |
| startup_info_.lpAttributeList) { |
| return false; |
| } |
| |
| SIZE_T size = 0; |
| ::InitializeProcThreadAttributeList(nullptr, attribute_count, 0, &size); |
| if (size == 0) |
| return false; |
| |
| auto attribute_list = std::make_unique<char[]>(size); |
| auto* attribute_list_ptr = |
| reinterpret_cast<LPPROC_THREAD_ATTRIBUTE_LIST>(attribute_list.get()); |
| if (!::InitializeProcThreadAttributeList(attribute_list_ptr, attribute_count, |
| 0, &size)) { |
| return false; |
| } |
| |
| attribute_list_ = std::move(attribute_list); |
| startup_info_.lpAttributeList = attribute_list_ptr; |
| |
| return true; |
| } |
| |
| bool StartupInformation::UpdateProcThreadAttribute(DWORD_PTR attribute, |
| void* value, |
| size_t size) { |
| if (!startup_info_.lpAttributeList) |
| return false; |
| return !!::UpdateProcThreadAttribute(startup_info_.lpAttributeList, 0, |
| attribute, value, size, nullptr, |
| nullptr); |
| } |
| |
| } // namespace win |
| } // namespace base |