Pin Chrome's shortcut to the Win10 Start menu on install and OS upgrade.
[chromium-blink-merge.git] / base / win / startup_information.cc
blobaff52eb794bf3dd33fa5bce0cfd96dc2d40fff23
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "base/win/startup_information.h"
7 #include "base/logging.h"
8 #include "base/win/windows_version.h"
10 namespace {
12 typedef BOOL (WINAPI *InitializeProcThreadAttributeListFunction)(
13 LPPROC_THREAD_ATTRIBUTE_LIST attribute_list,
14 DWORD attribute_count,
15 DWORD flags,
16 PSIZE_T size);
17 static InitializeProcThreadAttributeListFunction
18 initialize_proc_thread_attribute_list;
20 typedef BOOL (WINAPI *UpdateProcThreadAttributeFunction)(
21 LPPROC_THREAD_ATTRIBUTE_LIST attribute_list,
22 DWORD flags,
23 DWORD_PTR attribute,
24 PVOID value,
25 SIZE_T size,
26 PVOID previous_value,
27 PSIZE_T return_size);
28 static UpdateProcThreadAttributeFunction update_proc_thread_attribute_list;
30 typedef VOID (WINAPI *DeleteProcThreadAttributeListFunction)(
31 LPPROC_THREAD_ATTRIBUTE_LIST lpAttributeList);
32 static DeleteProcThreadAttributeListFunction delete_proc_thread_attribute_list;
34 } // namespace
36 namespace base {
37 namespace win {
39 StartupInformation::StartupInformation() {
40 memset(&startup_info_, 0, sizeof(startup_info_));
42 // Pre Windows Vista doesn't support STARTUPINFOEX.
43 if (base::win::GetVersion() < base::win::VERSION_VISTA) {
44 startup_info_.StartupInfo.cb = sizeof(STARTUPINFO);
45 return;
48 startup_info_.StartupInfo.cb = sizeof(startup_info_);
50 // Load the attribute API functions.
51 if (!initialize_proc_thread_attribute_list ||
52 !update_proc_thread_attribute_list ||
53 !delete_proc_thread_attribute_list) {
54 HMODULE module = ::GetModuleHandleW(L"kernel32.dll");
55 initialize_proc_thread_attribute_list =
56 reinterpret_cast<InitializeProcThreadAttributeListFunction>(
57 ::GetProcAddress(module, "InitializeProcThreadAttributeList"));
58 update_proc_thread_attribute_list =
59 reinterpret_cast<UpdateProcThreadAttributeFunction>(
60 ::GetProcAddress(module, "UpdateProcThreadAttribute"));
61 delete_proc_thread_attribute_list =
62 reinterpret_cast<DeleteProcThreadAttributeListFunction>(
63 ::GetProcAddress(module, "DeleteProcThreadAttributeList"));
67 StartupInformation::~StartupInformation() {
68 if (startup_info_.lpAttributeList) {
69 delete_proc_thread_attribute_list(startup_info_.lpAttributeList);
70 delete [] reinterpret_cast<BYTE*>(startup_info_.lpAttributeList);
74 bool StartupInformation::InitializeProcThreadAttributeList(
75 DWORD attribute_count) {
76 if (startup_info_.StartupInfo.cb != sizeof(startup_info_) ||
77 startup_info_.lpAttributeList)
78 return false;
80 SIZE_T size = 0;
81 initialize_proc_thread_attribute_list(NULL, attribute_count, 0, &size);
82 if (size == 0)
83 return false;
85 startup_info_.lpAttributeList =
86 reinterpret_cast<LPPROC_THREAD_ATTRIBUTE_LIST>(new BYTE[size]);
87 if (!initialize_proc_thread_attribute_list(startup_info_.lpAttributeList,
88 attribute_count, 0, &size)) {
89 delete [] reinterpret_cast<BYTE*>(startup_info_.lpAttributeList);
90 startup_info_.lpAttributeList = NULL;
91 return false;
94 return true;
97 bool StartupInformation::UpdateProcThreadAttribute(
98 DWORD_PTR attribute,
99 void* value,
100 size_t size) {
101 if (!startup_info_.lpAttributeList)
102 return false;
103 return !!update_proc_thread_attribute_list(startup_info_.lpAttributeList, 0,
104 attribute, value, size, NULL, NULL);
107 } // namespace win
108 } // namespace base