Commit 5695e8e2 authored by James Forshaw's avatar James Forshaw Committed by Commit Bot

Updated StartupInformation for Windows 7 API support and memory handling.

This CL changes the dynamic resolving of the attribute functions to static
linking as the APIs are available on all supported platforms. At the same
time the opportunity to cleanup the code to more modern standards has been
taken.

Bug: 986625
Change-Id: Iafeed84a46fda8c0a21ad32e19af29c7a2c9a52a
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1714216
Commit-Queue: James Forshaw <forshaw@chromium.org>
Reviewed-by: default avatarBruce Dawson <brucedawson@chromium.org>
Cr-Commit-Position: refs/heads/master@{#680179}
parent 7bed7431
......@@ -6,83 +6,42 @@
#include "base/logging.h"
namespace {
typedef BOOL (WINAPI *InitializeProcThreadAttributeListFunction)(
LPPROC_THREAD_ATTRIBUTE_LIST attribute_list,
DWORD attribute_count,
DWORD flags,
PSIZE_T size);
static InitializeProcThreadAttributeListFunction
initialize_proc_thread_attribute_list;
typedef BOOL (WINAPI *UpdateProcThreadAttributeFunction)(
LPPROC_THREAD_ATTRIBUTE_LIST attribute_list,
DWORD flags,
DWORD_PTR attribute,
PVOID value,
SIZE_T size,
PVOID previous_value,
PSIZE_T return_size);
static UpdateProcThreadAttributeFunction update_proc_thread_attribute_list;
typedef VOID (WINAPI *DeleteProcThreadAttributeListFunction)(
LPPROC_THREAD_ATTRIBUTE_LIST lpAttributeList);
static DeleteProcThreadAttributeListFunction delete_proc_thread_attribute_list;
} // namespace
namespace base {
namespace win {
StartupInformation::StartupInformation() {
memset(&startup_info_, 0, sizeof(startup_info_));
StartupInformation::StartupInformation() : startup_info_() {
startup_info_.StartupInfo.cb = sizeof(startup_info_);
// Load the attribute API functions.
if (!initialize_proc_thread_attribute_list ||
!update_proc_thread_attribute_list ||
!delete_proc_thread_attribute_list) {
HMODULE module = ::GetModuleHandleW(L"kernel32.dll");
initialize_proc_thread_attribute_list =
reinterpret_cast<InitializeProcThreadAttributeListFunction>(
::GetProcAddress(module, "InitializeProcThreadAttributeList"));
update_proc_thread_attribute_list =
reinterpret_cast<UpdateProcThreadAttributeFunction>(
::GetProcAddress(module, "UpdateProcThreadAttribute"));
delete_proc_thread_attribute_list =
reinterpret_cast<DeleteProcThreadAttributeListFunction>(
::GetProcAddress(module, "DeleteProcThreadAttributeList"));
}
}
StartupInformation::~StartupInformation() {
if (startup_info_.lpAttributeList) {
delete_proc_thread_attribute_list(startup_info_.lpAttributeList);
delete [] reinterpret_cast<BYTE*>(startup_info_.lpAttributeList);
::DeleteProcThreadAttributeList(startup_info_.lpAttributeList);
}
}
bool StartupInformation::InitializeProcThreadAttributeList(
DWORD attribute_count) {
if (startup_info_.StartupInfo.cb != sizeof(startup_info_) ||
startup_info_.lpAttributeList)
startup_info_.lpAttributeList) {
return false;
}
SIZE_T size = 0;
initialize_proc_thread_attribute_list(NULL, attribute_count, 0, &size);
::InitializeProcThreadAttributeList(nullptr, attribute_count, 0, &size);
if (size == 0)
return false;
startup_info_.lpAttributeList =
reinterpret_cast<LPPROC_THREAD_ATTRIBUTE_LIST>(new BYTE[size]);
if (!initialize_proc_thread_attribute_list(startup_info_.lpAttributeList,
attribute_count, 0, &size)) {
delete [] reinterpret_cast<BYTE*>(startup_info_.lpAttributeList);
startup_info_.lpAttributeList = NULL;
auto attribute_list = std::make_unique<char[]>(size);
auto* attribute_list_ptr =
reinterpret_cast<LPPROC_THREAD_ATTRIBUTE_LIST>(attribute_list.get());
if (!::InitializeProcThreadAttributeList(attribute_list_ptr, attribute_count,
0, &size)) {
return false;
}
attribute_list_ = std::move(attribute_list);
startup_info_.lpAttributeList = attribute_list_ptr;
return true;
}
......@@ -92,8 +51,9 @@ bool StartupInformation::UpdateProcThreadAttribute(
size_t size) {
if (!startup_info_.lpAttributeList)
return false;
return !!update_proc_thread_attribute_list(startup_info_.lpAttributeList, 0,
attribute, value, size, NULL, NULL);
return !!::UpdateProcThreadAttribute(startup_info_.lpAttributeList, 0,
attribute, value, size, nullptr,
nullptr);
}
} // namespace win
......
......@@ -5,6 +5,8 @@
#ifndef BASE_WIN_STARTUP_INFORMATION_H_
#define BASE_WIN_STARTUP_INFORMATION_H_
#include <memory>
#include <windows.h>
#include <stddef.h>
......@@ -41,6 +43,7 @@ class BASE_EXPORT StartupInformation {
}
private:
std::unique_ptr<char[]> attribute_list_;
STARTUPINFOEXW startup_info_;
DISALLOW_COPY_AND_ASSIGN(StartupInformation);
};
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment