1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/security/sandbox/chromium/base/win/startup_information.cc Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,109 @@ 1.4 +// Copyright (c) 2012 The Chromium Authors. All rights reserved. 1.5 +// Use of this source code is governed by a BSD-style license that can be 1.6 +// found in the LICENSE file. 1.7 + 1.8 +#include "base/win/startup_information.h" 1.9 + 1.10 +#include "base/logging.h" 1.11 +#include "base/win/windows_version.h" 1.12 + 1.13 +namespace { 1.14 + 1.15 +typedef BOOL (WINAPI *InitializeProcThreadAttributeListFunction)( 1.16 + LPPROC_THREAD_ATTRIBUTE_LIST attribute_list, 1.17 + DWORD attribute_count, 1.18 + DWORD flags, 1.19 + PSIZE_T size); 1.20 +static InitializeProcThreadAttributeListFunction 1.21 + initialize_proc_thread_attribute_list; 1.22 + 1.23 +typedef BOOL (WINAPI *UpdateProcThreadAttributeFunction)( 1.24 + LPPROC_THREAD_ATTRIBUTE_LIST attribute_list, 1.25 + DWORD flags, 1.26 + DWORD_PTR attribute, 1.27 + PVOID value, 1.28 + SIZE_T size, 1.29 + PVOID previous_value, 1.30 + PSIZE_T return_size); 1.31 +static UpdateProcThreadAttributeFunction update_proc_thread_attribute_list; 1.32 + 1.33 +typedef VOID (WINAPI *DeleteProcThreadAttributeListFunction)( 1.34 + LPPROC_THREAD_ATTRIBUTE_LIST lpAttributeList); 1.35 +static DeleteProcThreadAttributeListFunction delete_proc_thread_attribute_list; 1.36 + 1.37 +} // namespace 1.38 + 1.39 +namespace base { 1.40 +namespace win { 1.41 + 1.42 +StartupInformation::StartupInformation() { 1.43 + memset(&startup_info_, 0, sizeof(startup_info_)); 1.44 + 1.45 + // Pre Windows Vista doesn't support STARTUPINFOEX. 1.46 + if (base::win::GetVersion() < base::win::VERSION_VISTA) { 1.47 + startup_info_.StartupInfo.cb = sizeof(STARTUPINFO); 1.48 + return; 1.49 + } 1.50 + 1.51 + startup_info_.StartupInfo.cb = sizeof(startup_info_); 1.52 + 1.53 + // Load the attribute API functions. 1.54 + if (!initialize_proc_thread_attribute_list || 1.55 + !update_proc_thread_attribute_list || 1.56 + !delete_proc_thread_attribute_list) { 1.57 + HMODULE module = ::GetModuleHandleW(L"kernel32.dll"); 1.58 + initialize_proc_thread_attribute_list = 1.59 + reinterpret_cast<InitializeProcThreadAttributeListFunction>( 1.60 + ::GetProcAddress(module, "InitializeProcThreadAttributeList")); 1.61 + update_proc_thread_attribute_list = 1.62 + reinterpret_cast<UpdateProcThreadAttributeFunction>( 1.63 + ::GetProcAddress(module, "UpdateProcThreadAttribute")); 1.64 + delete_proc_thread_attribute_list = 1.65 + reinterpret_cast<DeleteProcThreadAttributeListFunction>( 1.66 + ::GetProcAddress(module, "DeleteProcThreadAttributeList")); 1.67 + } 1.68 +} 1.69 + 1.70 +StartupInformation::~StartupInformation() { 1.71 + if (startup_info_.lpAttributeList) { 1.72 + delete_proc_thread_attribute_list(startup_info_.lpAttributeList); 1.73 + delete [] reinterpret_cast<BYTE*>(startup_info_.lpAttributeList); 1.74 + } 1.75 +} 1.76 + 1.77 +bool StartupInformation::InitializeProcThreadAttributeList( 1.78 + DWORD attribute_count) { 1.79 + if (startup_info_.StartupInfo.cb != sizeof(startup_info_) || 1.80 + startup_info_.lpAttributeList) 1.81 + return false; 1.82 + 1.83 + SIZE_T size = 0; 1.84 + initialize_proc_thread_attribute_list(NULL, attribute_count, 0, &size); 1.85 + if (size == 0) 1.86 + return false; 1.87 + 1.88 + startup_info_.lpAttributeList = 1.89 + reinterpret_cast<LPPROC_THREAD_ATTRIBUTE_LIST>(new BYTE[size]); 1.90 + if (!initialize_proc_thread_attribute_list(startup_info_.lpAttributeList, 1.91 + attribute_count, 0, &size)) { 1.92 + delete [] reinterpret_cast<BYTE*>(startup_info_.lpAttributeList); 1.93 + startup_info_.lpAttributeList = NULL; 1.94 + return false; 1.95 + } 1.96 + 1.97 + return true; 1.98 +} 1.99 + 1.100 +bool StartupInformation::UpdateProcThreadAttribute( 1.101 + DWORD_PTR attribute, 1.102 + void* value, 1.103 + size_t size) { 1.104 + if (!startup_info_.lpAttributeList) 1.105 + return false; 1.106 + return !!update_proc_thread_attribute_list(startup_info_.lpAttributeList, 0, 1.107 + attribute, value, size, NULL, NULL); 1.108 +} 1.109 + 1.110 +} // namespace win 1.111 +} // namespace base 1.112 +