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
StartupInformation()12 StartupInformation::StartupInformation() : startup_info_() {
13 startup_info_.StartupInfo.cb = sizeof(startup_info_);
14 }
15
~StartupInformation()16 StartupInformation::~StartupInformation() {
17 if (startup_info_.lpAttributeList) {
18 ::DeleteProcThreadAttributeList(startup_info_.lpAttributeList);
19 }
20 }
21
InitializeProcThreadAttributeList(DWORD attribute_count)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
UpdateProcThreadAttribute(DWORD_PTR attribute,void * value,size_t size)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
60