startup_information.cc (1799B)
1 // Copyright 2012 The Chromium Authors 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "base/win/startup_information.h" 6 7 #include <utility> 8 9 namespace base { 10 namespace win { 11 12 StartupInformation::StartupInformation() : startup_info_() { 13 startup_info_.StartupInfo.cb = sizeof(startup_info_); 14 } 15 16 StartupInformation::~StartupInformation() { 17 if (startup_info_.lpAttributeList) { 18 ::DeleteProcThreadAttributeList(startup_info_.lpAttributeList); 19 } 20 } 21 22 bool StartupInformation::InitializeProcThreadAttributeList( 23 DWORD attribute_count) { 24 if (startup_info_.StartupInfo.cb != sizeof(startup_info_) || 25 startup_info_.lpAttributeList) { 26 return false; 27 } 28 29 SIZE_T size = 0; 30 ::InitializeProcThreadAttributeList(nullptr, attribute_count, 0, &size); 31 if (size == 0) 32 return false; 33 34 auto attribute_list = std::make_unique<char[]>(size); 35 auto* attribute_list_ptr = 36 reinterpret_cast<LPPROC_THREAD_ATTRIBUTE_LIST>(attribute_list.get()); 37 if (!::InitializeProcThreadAttributeList(attribute_list_ptr, attribute_count, 38 0, &size)) { 39 return false; 40 } 41 42 attribute_list_ = std::move(attribute_list); 43 startup_info_.lpAttributeList = attribute_list_ptr; 44 45 return true; 46 } 47 48 bool StartupInformation::UpdateProcThreadAttribute(DWORD_PTR attribute, 49 void* value, 50 size_t size) { 51 if (!startup_info_.lpAttributeList) 52 return false; 53 return !!::UpdateProcThreadAttribute(startup_info_.lpAttributeList, 0, 54 attribute, value, size, nullptr, 55 nullptr); 56 } 57 58 } // namespace win 59 } // namespace base