Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(308)

Side by Side Diff: base/win/scoped_startup_info_ex.cc

Issue 10765008: Add scoped StartupInfoEx to base. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 8 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
Property Changes:
Added: svn:eol-style
+ LF
OLDNEW
(Empty)
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.
4
5 #include "base/win/scoped_startup_info_ex.h"
6
7 #include "base/logging.h"
8 #include "base/win/windows_version.h"
9
10 namespace {
11
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 s_InitializeProcThreadAttributeList;
19
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 s_UpdateProcThreadAttribute;
29
30 typedef VOID (WINAPI *DeleteProcThreadAttributeListFunction)(
31 LPPROC_THREAD_ATTRIBUTE_LIST lpAttributeList);
32 static DeleteProcThreadAttributeListFunction s_DeleteProcThreadAttributeList;
brettw 2012/07/10 05:41:24 I've never seen "s_..." notation. I'd probably nam
jschuh 2012/07/10 16:14:50 Done.
33
34 } // namespace
35
36 namespace base {
37 namespace win {
38
39 ScopedStartupInfoEx::ScopedStartupInfoEx() {
40 memset(&startup_info_, 0, sizeof(startup_info_));
41
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;
46 }
47
48 startup_info_.StartupInfo.cb = sizeof(startup_info_);
49
50 // Load the attribute API functions.
51 if (!s_InitializeProcThreadAttributeList ||
52 !s_UpdateProcThreadAttribute ||
53 !s_DeleteProcThreadAttributeList) {
54 HMODULE module = ::GetModuleHandleW(L"kernel32.dll");
55 s_InitializeProcThreadAttributeList =
56 reinterpret_cast<InitializeProcThreadAttributeListFunction>(
57 ::GetProcAddress(module, "InitializeProcThreadAttributeList"));
58 s_UpdateProcThreadAttribute =
59 reinterpret_cast<UpdateProcThreadAttributeFunction>(
60 ::GetProcAddress(module, "UpdateProcThreadAttribute"));
61 s_DeleteProcThreadAttributeList =
62 reinterpret_cast<DeleteProcThreadAttributeListFunction>(
63 ::GetProcAddress(module, "DeleteProcThreadAttributeList"));
64 }
65 }
66
67 ScopedStartupInfoEx::~ScopedStartupInfoEx() {
68 if (startup_info_.lpAttributeList) {
69 s_DeleteProcThreadAttributeList(startup_info_.lpAttributeList);
70 delete [] reinterpret_cast<BYTE*>(startup_info_.lpAttributeList);
71 }
72 }
73
74 bool ScopedStartupInfoEx::InitializeProcThreadAttributeList(
75 DWORD attribute_count) {
76 if (startup_info_.StartupInfo.cb != sizeof(startup_info_) ||
77 startup_info_.lpAttributeList)
78 return false;
79
80 SIZE_T size = 0;
81 s_InitializeProcThreadAttributeList(NULL, attribute_count, 0, &size);
82 if (size == 0)
83 return false;
84
85 startup_info_.lpAttributeList =
86 reinterpret_cast<LPPROC_THREAD_ATTRIBUTE_LIST>(new BYTE[size]);
87 if (!s_InitializeProcThreadAttributeList(startup_info_.lpAttributeList,
88 attribute_count, 0, &size)) {
89 delete [] reinterpret_cast<BYTE*>(startup_info_.lpAttributeList);
brettw 2012/07/10 05:41:24 I think you need to set the list to null after thi
jschuh 2012/07/10 16:14:50 Done.
90 return false;
91 }
92
93 return true;
94 }
95
96 bool ScopedStartupInfoEx::UpdateProcThreadAttribute(
97 DWORD_PTR attribute,
98 void* value,
99 size_t size) {
100 if (!startup_info_.lpAttributeList)
101 return false;
102 return !!s_UpdateProcThreadAttribute(startup_info_.lpAttributeList, 0,
103 attribute, value, size, NULL, NULL);
104 }
105
106 } // namespace win
107 } // namespace base
108
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698