security/sandbox/chromium/base/win/startup_information.cc

changeset 0
6474c204b198
     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 +

mercurial