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

Side by Side Diff: content/browser/handle_enumerator_win.cc

Issue 7054080: Add a flag to print the handles held by a child process when it shuts down. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 9 years, 6 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
« no previous file with comments | « content/browser/handle_enumerator_win.h ('k') | content/common/content_switches.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Property Changes:
Added: svn:eol-style
+ LF
OLDNEW
(Empty)
1 // Copyright (c) 2011 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 "content/browser/handle_enumerator_win.h"
6
7 #include <windows.h>
8
9 #include "base/logging.h"
10 #include "base/process.h"
11 #include "base/process_util.h"
12 #include "base/utf_string_conversions.h"
13 #include "base/win/windows_version.h"
14 #include "content/browser/browser_child_process_host.h"
15 #include "content/browser/browser_thread.h"
16 #include "content/browser/renderer_host/render_process_host.h"
17 #include "content/common/result_codes.h"
18 #include "sandbox/tools/finder/ntundoc.h"
19
20 namespace content {
21
22 const wchar_t kNtdllDllName[] = L"ntdll.dll";
23 const size_t kMaxHandleNameLength = 1024;
24
25 void HandleEnumerator::EnumerateHandles() {
26 ULONG pid = 0;
27 pid = ::GetProcessId(handle_);
28 if (!pid)
29 return;
30 ULONG handle_info_size = 0x10000;
31 HMODULE ntdll = ::GetModuleHandle(kNtdllDllName);
32 if (!ntdll)
33 return;
34
35 NTQUERYSYSTEMINFORMATION NtQuerySystemInformation =
36 reinterpret_cast<NTQUERYSYSTEMINFORMATION>(
37 GetProcAddress(ntdll, "NtQuerySystemInformation"));
38 NTQUERYOBJECT NtQueryObject =
39 reinterpret_cast<NTQUERYOBJECT>(GetProcAddress(ntdll, "NtQueryObject"));
40
41 if (!NtQuerySystemInformation || !NtQueryObject)
42 return;
43
44 SYSTEM_HANDLE_INFORMATION_EX* handle_info =
45 reinterpret_cast<SYSTEM_HANDLE_INFORMATION_EX*>(
46 new BYTE[handle_info_size]);
47 while (NtQuerySystemInformation(SystemHandleInformation,
48 handle_info,
49 handle_info_size,
50 &handle_info_size)
51 == STATUS_INFO_LENGTH_MISMATCH) {
52 delete handle_info;
53 handle_info = reinterpret_cast<SYSTEM_HANDLE_INFORMATION_EX*>
54 (new BYTE[handle_info_size]);
55 }
56
57 string16 output = ProcessTypeString(type_);
58 output.append(ASCIIToUTF16(" Process - Handles at shutdown:\n"));
59 for (UINT i = 0; i < handle_info->NumberOfHandles; i++) {
60 SYSTEM_HANDLE_INFORMATION sys_handle = handle_info->Information[i];
61 HANDLE handle = reinterpret_cast<HANDLE>(sys_handle.Handle);
62 if (sys_handle.ProcessId != pid)
63 continue;
64
65 OBJECT_TYPE_INFORMATION* type_info =
66 reinterpret_cast<OBJECT_TYPE_INFORMATION*>(
67 new BYTE[sizeof(OBJECT_TYPE_INFORMATION) + kMaxHandleNameLength]);
68 if (NtQueryObject(handle, ObjectTypeInformation, type_info,
69 sizeof(OBJECT_TYPE_INFORMATION) + kMaxHandleNameLength, NULL) < 0)
70 return;
71
72 UNICODE_STRING* name = reinterpret_cast<UNICODE_STRING*>(
73 new BYTE[kMaxHandleNameLength]);
74 if (NtQueryObject(handle, ObjectNameInformation, name,
75 kMaxHandleNameLength, NULL) < 0)
76 return;
77
78 string16 handle_type;
79 string16 handle_name;
80 WideToUTF16(type_info->Name.Buffer,
81 type_info->Name.Length/2, &handle_type);
82 WideToUTF16(name->Buffer, name->Length/2, &handle_name);
83
84 HandleType current_type = StringToHandleType(handle_type);
85 if (!all_handles_ && (current_type != ProcessHandle &&
86 current_type != FileHandle &&
87 current_type != DirectoryHandle &&
88 current_type != KeyHandle &&
89 current_type != WindowStationHandle &&
90 current_type != DesktopHandle &&
91 current_type != ServiceHandle))
92 continue;
93
94 output += ASCIIToUTF16("[");
95 output += handle_type;
96 output += ASCIIToUTF16("] (");
97 output += handle_name;
98 output += ASCIIToUTF16(")\n");
99 output += GetAccessString(current_type, sys_handle.GrantedAccess);
100 }
101 delete handle_info;
102 LOG(INFO) << output;
103 }
104
105 void HandleEnumerator::RunHandleEnumeration() {
106 DCHECK(status_ == Starting);
107 if (BrowserThread::CurrentlyOn(BrowserThread::IO))
108 FindProcessOnIOThread();
109 else if (BrowserThread::CurrentlyOn(BrowserThread::UI))
110 FindProcessOnUIThread();
111 else
112 BrowserThread::PostTask(
113 BrowserThread::IO, FROM_HERE,
114 NewRunnableMethod(this,
115 &HandleEnumerator::FindProcessOnIOThread));
116 }
117
118 void HandleEnumerator::FindProcessOnIOThread() {
119 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
120
121 for (BrowserChildProcessHost::Iterator iter; !iter.Done(); ++iter) {
122 if (iter->handle() == handle_) {
123 type_ = iter->type();
124 status_ = Finished;
125 break;
126 }
127 }
128
129 if (status_ == Starting) {
130 status_ = InProgress;
131 BrowserThread::PostTask(
132 BrowserThread::UI, FROM_HERE,
133 NewRunnableMethod(this,
134 &HandleEnumerator::FindProcessOnUIThread));
135 } else {
136 status_ = Finished;
137 BrowserThread::PostTask(
138 BrowserThread::PROCESS_LAUNCHER, FROM_HERE,
139 NewRunnableMethod(this,
140 &HandleEnumerator::EnumerateHandlesAndTerminateProcess));
141 }
142 }
143
144 void HandleEnumerator::FindProcessOnUIThread() {
145 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
146
147 for (RenderProcessHost::iterator renderer_iter(
148 RenderProcessHost::AllHostsIterator()); !renderer_iter.IsAtEnd();
149 renderer_iter.Advance()) {
150 RenderProcessHost* render_process_host = renderer_iter.GetCurrentValue();
151 if (render_process_host->GetHandle() == handle_) {
152 type_ = ChildProcessInfo::RENDER_PROCESS;
153 status_ = Finished;
154 break;
155 }
156 }
157
158 if (status_ == Starting) {
159 status_ = InProgress;
160 BrowserThread::PostTask(
161 BrowserThread::IO, FROM_HERE,
162 NewRunnableMethod(this,
163 &HandleEnumerator::FindProcessOnIOThread));
164 } else {
165 status_ = Finished;
166 BrowserThread::PostTask(
167 BrowserThread::PROCESS_LAUNCHER, FROM_HERE,
168 NewRunnableMethod(this,
169 &HandleEnumerator::EnumerateHandlesAndTerminateProcess));
170 }
171 }
172
173 void HandleEnumerator::EnumerateHandlesAndTerminateProcess() {
174 HandleEnumerator::EnumerateHandles();
175 base::Process process(handle_);
176 process.Terminate(ResultCodes::NORMAL_EXIT);
177 process.Close();
178 }
179
180 string16 ProcessTypeString(ChildProcessInfo::ProcessType process_type) {
181 switch (process_type) {
182 case ChildProcessInfo::UNKNOWN_PROCESS:
183 return ASCIIToUTF16("Unknown");
184 case ChildProcessInfo::BROWSER_PROCESS:
185 return ASCIIToUTF16("Browser");
186 case ChildProcessInfo::RENDER_PROCESS:
187 return ASCIIToUTF16("Renderer");
188 case ChildProcessInfo::PLUGIN_PROCESS:
189 return ASCIIToUTF16("Plugin");
190 case ChildProcessInfo::WORKER_PROCESS:
191 return ASCIIToUTF16("Worker");
192 case ChildProcessInfo::NACL_LOADER_PROCESS:
193 return ASCIIToUTF16("NaCL Loader");
194 case ChildProcessInfo::UTILITY_PROCESS:
195 return ASCIIToUTF16("Utility");
196 case ChildProcessInfo::PROFILE_IMPORT_PROCESS:
197 return ASCIIToUTF16("Profile Import");
198 case ChildProcessInfo::ZYGOTE_PROCESS:
199 return ASCIIToUTF16("Zygote");
200 case ChildProcessInfo::SANDBOX_HELPER_PROCESS:
201 return ASCIIToUTF16("Sandbox Helper");
202 case ChildProcessInfo::NACL_BROKER_PROCESS:
203 return ASCIIToUTF16("NaCL Broker");
204 case ChildProcessInfo::GPU_PROCESS:
205 return ASCIIToUTF16("GPU");
206 case ChildProcessInfo::PPAPI_PLUGIN_PROCESS:
207 return ASCIIToUTF16("Pepper Plugin");
208 case ChildProcessInfo::PPAPI_BROKER_PROCESS:
209 return ASCIIToUTF16("Pepper Broker");
210 default:
211 return string16();
212 }
213 }
214
215 HandleType StringToHandleType(const string16& type) {
216 if (!type.compare(ASCIIToUTF16("Process")))
217 return ProcessHandle;
218 else if (!type.compare(ASCIIToUTF16("Thread")))
219 return ThreadHandle;
220 else if (!type.compare(ASCIIToUTF16("File")))
221 return FileHandle;
222 else if (!type.compare(ASCIIToUTF16("Directory")))
223 return DirectoryHandle;
224 else if (!type.compare(ASCIIToUTF16("Key")))
225 return KeyHandle;
226 else if (!type.compare(ASCIIToUTF16("WindowStation")))
227 return WindowStationHandle;
228 else if (!type.compare(ASCIIToUTF16("Desktop")))
229 return DesktopHandle;
230 else if (!type.compare(ASCIIToUTF16("Service")))
231 return ServiceHandle;
232 else if (!type.compare(ASCIIToUTF16("Mutex")))
233 return MutexHandle;
234 else if (!type.compare(ASCIIToUTF16("Semaphore")))
235 return SemaphoreHandle;
236 else if (!type.compare(ASCIIToUTF16("Event")))
237 return EventHandle;
238 else if (!type.compare(ASCIIToUTF16("Timer")))
239 return TimerHandle;
240 else if (!type.compare(ASCIIToUTF16("NamedPipe")))
241 return NamedPipeHandle;
242 else if (!type.compare(ASCIIToUTF16("JobObject")))
243 return JobHandle;
244 else if (!type.compare(ASCIIToUTF16("FileMap")))
245 return FileMapHandle;
246 return OtherHandle;
247 }
248
249 string16 GetAccessString(HandleType handle_type,
250 ACCESS_MASK access) {
251 string16 output;
252 if (access & GENERIC_READ)
253 output.append(ASCIIToUTF16("\tGENERIC_READ\n"));
254 if (access & GENERIC_WRITE)
255 output.append(ASCIIToUTF16("\tGENERIC_WRITE\n"));
256 if (access & GENERIC_EXECUTE)
257 output.append(ASCIIToUTF16("\tGENERIC_EXECUTE\n"));
258 if (access & GENERIC_ALL)
259 output.append(ASCIIToUTF16("\tGENERIC_ALL\n"));
260 if (access & DELETE)
261 output.append(ASCIIToUTF16("\tDELETE\n"));
262 if (access & READ_CONTROL)
263 output.append(ASCIIToUTF16("\tREAD_CONTROL\n"));
264 if (access & WRITE_DAC)
265 output.append(ASCIIToUTF16("\tWRITE_DAC\n"));
266 if (access & WRITE_OWNER)
267 output.append(ASCIIToUTF16("\tWRITE_OWNER\n"));
268 if (access & SYNCHRONIZE)
269 output.append(ASCIIToUTF16("\tSYNCHRONIZE\n"));
270
271 switch (handle_type) {
272 case ProcessHandle:
273 if (access & PROCESS_CREATE_PROCESS)
274 output.append(ASCIIToUTF16("\tPROCESS_CREATE_PROCESS\n"));
275 if (access & PROCESS_CREATE_THREAD)
276 output.append(ASCIIToUTF16("\tPROCESS_CREATE_THREAD\n"));
277 if (access & PROCESS_DUP_HANDLE)
278 output.append(ASCIIToUTF16("\tPROCESS_DUP_HANDLE\n"));
279 if (access & PROCESS_QUERY_INFORMATION)
280 output.append(ASCIIToUTF16("\tPROCESS_QUERY_INFORMATION\n"));
281 if (access & PROCESS_QUERY_LIMITED_INFORMATION)
282 output.append(ASCIIToUTF16("\tPROCESS_QUERY_LIMITED_INFORMATION\n"));
283 if (access & PROCESS_SET_INFORMATION)
284 output.append(ASCIIToUTF16("\tPROCESS_SET_INFORMATION\n"));
285 if (access & PROCESS_SET_QUOTA)
286 output.append(ASCIIToUTF16("\tPROCESS_SET_QUOTA\n"));
287 if (access & PROCESS_SUSPEND_RESUME)
288 output.append(ASCIIToUTF16("\tPROCESS_SUSPEND_RESUME\n"));
289 if (access & PROCESS_TERMINATE)
290 output.append(ASCIIToUTF16("\tPROCESS_TERMINATE\n"));
291 if (access & PROCESS_VM_OPERATION)
292 output.append(ASCIIToUTF16("\tPROCESS_VM_OPERATION\n"));
293 if (access & PROCESS_VM_READ)
294 output.append(ASCIIToUTF16("\tPROCESS_VM_READ\n"));
295 if (access & PROCESS_VM_WRITE)
296 output.append(ASCIIToUTF16("\tPROCESS_VM_WRITE\n"));
297 break;
298 case ThreadHandle:
299 if (access & THREAD_DIRECT_IMPERSONATION)
300 output.append(ASCIIToUTF16("\tTHREAD_DIRECT_IMPERSONATION\n"));
301 if (access & THREAD_GET_CONTEXT)
302 output.append(ASCIIToUTF16("\tTHREAD_GET_CONTEXT\n"));
303 if (access & THREAD_IMPERSONATE)
304 output.append(ASCIIToUTF16("\tTHREAD_IMPERSONATE\n"));
305 if (access & THREAD_QUERY_INFORMATION )
306 output.append(ASCIIToUTF16("\tTHREAD_QUERY_INFORMATION\n"));
307 if (access & THREAD_QUERY_LIMITED_INFORMATION)
308 output.append(ASCIIToUTF16("\tTHREAD_QUERY_LIMITED_INFORMATION\n"));
309 if (access & THREAD_SET_CONTEXT)
310 output.append(ASCIIToUTF16("\tTHREAD_SET_CONTEXT\n"));
311 if (access & THREAD_SET_INFORMATION)
312 output.append(ASCIIToUTF16("\tTHREAD_SET_INFORMATION\n"));
313 if (access & THREAD_SET_LIMITED_INFORMATION)
314 output.append(ASCIIToUTF16("\tTHREAD_SET_LIMITED_INFORMATION\n"));
315 if (access & THREAD_SET_THREAD_TOKEN)
316 output.append(ASCIIToUTF16("\tTHREAD_SET_THREAD_TOKEN\n"));
317 if (access & THREAD_SUSPEND_RESUME)
318 output.append(ASCIIToUTF16("\tTHREAD_SUSPEND_RESUME\n"));
319 if (access & THREAD_TERMINATE)
320 output.append(ASCIIToUTF16("\tTHREAD_TERMINATE\n"));
321 break;
322 case FileHandle:
323 if (access & FILE_APPEND_DATA)
324 output.append(ASCIIToUTF16("\tFILE_APPEND_DATA\n"));
325 if (access & FILE_EXECUTE)
326 output.append(ASCIIToUTF16("\tFILE_EXECUTE\n"));
327 if (access & FILE_READ_ATTRIBUTES)
328 output.append(ASCIIToUTF16("\tFILE_READ_ATTRIBUTES\n"));
329 if (access & FILE_READ_DATA)
330 output.append(ASCIIToUTF16("\tFILE_READ_DATA\n"));
331 if (access & FILE_READ_EA)
332 output.append(ASCIIToUTF16("\tFILE_READ_EA\n"));
333 if (access & FILE_WRITE_ATTRIBUTES)
334 output.append(ASCIIToUTF16("\tFILE_WRITE_ATTRIBUTES\n"));
335 if (access & FILE_WRITE_DATA)
336 output.append(ASCIIToUTF16("\tFILE_WRITE_DATA\n"));
337 if (access & FILE_WRITE_EA)
338 output.append(ASCIIToUTF16("\tFILE_WRITE_EA\n"));
339 if (access & FILE_WRITE_EA)
340 output.append(ASCIIToUTF16("\tFILE_WRITE_EA\n"));
341 break;
342 case DirectoryHandle:
343 if (access & FILE_ADD_FILE)
344 output.append(ASCIIToUTF16("\tFILE_ADD_FILE\n"));
345 if (access & FILE_ADD_SUBDIRECTORY)
346 output.append(ASCIIToUTF16("\tFILE_ADD_SUBDIRECTORY\n"));
347 if (access & FILE_APPEND_DATA)
348 output.append(ASCIIToUTF16("\tFILE_APPEND_DATA\n"));
349 if (access & FILE_DELETE_CHILD)
350 output.append(ASCIIToUTF16("\tFILE_DELETE_CHILD\n"));
351 if (access & FILE_LIST_DIRECTORY)
352 output.append(ASCIIToUTF16("\tFILE_LIST_DIRECTORY\n"));
353 if (access & FILE_READ_DATA)
354 output.append(ASCIIToUTF16("\tFILE_READ_DATA\n"));
355 if (access & FILE_TRAVERSE)
356 output.append(ASCIIToUTF16("\tFILE_TRAVERSE\n"));
357 if (access & FILE_WRITE_DATA)
358 output.append(ASCIIToUTF16("\tFILE_WRITE_DATA\n"));
359 break;
360 case KeyHandle:
361 if (access & KEY_CREATE_LINK)
362 output.append(ASCIIToUTF16("\tKEY_CREATE_LINK\n"));
363 if (access & KEY_CREATE_SUB_KEY)
364 output.append(ASCIIToUTF16("\tKEY_CREATE_SUB_KEY\n"));
365 if (access & KEY_ENUMERATE_SUB_KEYS)
366 output.append(ASCIIToUTF16("\tKEY_ENUMERATE_SUB_KEYS\n"));
367 if (access & KEY_EXECUTE)
368 output.append(ASCIIToUTF16("\tKEY_EXECUTE\n"));
369 if (access & KEY_NOTIFY)
370 output.append(ASCIIToUTF16("\tKEY_NOTIFY\n"));
371 if (access & KEY_QUERY_VALUE)
372 output.append(ASCIIToUTF16("\tKEY_QUERY_VALUE\n"));
373 if (access & KEY_READ)
374 output.append(ASCIIToUTF16("\tKEY_READ\n"));
375 if (access & KEY_SET_VALUE)
376 output.append(ASCIIToUTF16("\tKEY_SET_VALUE\n"));
377 if (access & KEY_WOW64_32KEY)
378 output.append(ASCIIToUTF16("\tKEY_WOW64_32KEY\n"));
379 if (access & KEY_WOW64_64KEY)
380 output.append(ASCIIToUTF16("\tKEY_WOW64_64KEY\n"));
381 break;
382 case WindowStationHandle:
383 if (access & WINSTA_ACCESSCLIPBOARD)
384 output.append(ASCIIToUTF16("\tWINSTA_ACCESSCLIPBOARD\n"));
385 if (access & WINSTA_ACCESSGLOBALATOMS)
386 output.append(ASCIIToUTF16("\tWINSTA_ACCESSGLOBALATOMS\n"));
387 if (access & WINSTA_CREATEDESKTOP)
388 output.append(ASCIIToUTF16("\tWINSTA_CREATEDESKTOP\n"));
389 if (access & WINSTA_ENUMDESKTOPS)
390 output.append(ASCIIToUTF16("\tWINSTA_ENUMDESKTOPS\n"));
391 if (access & WINSTA_ENUMERATE)
392 output.append(ASCIIToUTF16("\tWINSTA_ENUMERATE\n"));
393 if (access & WINSTA_EXITWINDOWS)
394 output.append(ASCIIToUTF16("\tWINSTA_EXITWINDOWS\n"));
395 if (access & WINSTA_READATTRIBUTES)
396 output.append(ASCIIToUTF16("\tWINSTA_READATTRIBUTES\n"));
397 if (access & WINSTA_READSCREEN)
398 output.append(ASCIIToUTF16("\tWINSTA_READSCREEN\n"));
399 if (access & WINSTA_WRITEATTRIBUTES)
400 output.append(ASCIIToUTF16("\tWINSTA_WRITEATTRIBUTES\n"));
401 break;
402 case DesktopHandle:
403 if (access & DESKTOP_CREATEMENU)
404 output.append(ASCIIToUTF16("\tDESKTOP_CREATEMENU\n"));
405 if (access & DESKTOP_CREATEWINDOW)
406 output.append(ASCIIToUTF16("\tDESKTOP_CREATEWINDOW\n"));
407 if (access & DESKTOP_ENUMERATE)
408 output.append(ASCIIToUTF16("\tDESKTOP_ENUMERATE\n"));
409 if (access & DESKTOP_HOOKCONTROL)
410 output.append(ASCIIToUTF16("\tDESKTOP_HOOKCONTROL\n"));
411 if (access & DESKTOP_JOURNALPLAYBACK)
412 output.append(ASCIIToUTF16("\tDESKTOP_JOURNALPLAYBACK\n"));
413 if (access & DESKTOP_JOURNALRECORD)
414 output.append(ASCIIToUTF16("\tDESKTOP_JOURNALRECORD\n"));
415 if (access & DESKTOP_READOBJECTS)
416 output.append(ASCIIToUTF16("\tDESKTOP_READOBJECTS\n"));
417 if (access & DESKTOP_SWITCHDESKTOP)
418 output.append(ASCIIToUTF16("\tDESKTOP_SWITCHDESKTOP\n"));
419 if (access & DESKTOP_WRITEOBJECTS)
420 output.append(ASCIIToUTF16("\tDESKTOP_WRITEOBJECTS\n"));
421 break;
422 case ServiceHandle:
423 if (access & SC_MANAGER_CREATE_SERVICE)
424 output.append(ASCIIToUTF16("\tSC_MANAGER_CREATE_SERVICE\n"));
425 if (access & SC_MANAGER_CONNECT)
426 output.append(ASCIIToUTF16("\tSC_MANAGER_CONNECT\n"));
427 if (access & SC_MANAGER_ENUMERATE_SERVICE )
428 output.append(ASCIIToUTF16("\tSC_MANAGER_ENUMERATE_SERVICE\n"));
429 if (access & SC_MANAGER_LOCK)
430 output.append(ASCIIToUTF16("\tSC_MANAGER_LOCK\n"));
431 if (access & SC_MANAGER_MODIFY_BOOT_CONFIG )
432 output.append(ASCIIToUTF16("\tSC_MANAGER_MODIFY_BOOT_CONFIG\n"));
433 if (access & SC_MANAGER_QUERY_LOCK_STATUS )
434 output.append(ASCIIToUTF16("\tSC_MANAGER_QUERY_LOCK_STATUS\n"));
435 break;
436 case EventHandle:
437 if (access & EVENT_MODIFY_STATE)
438 output.append(ASCIIToUTF16("\tEVENT_MODIFY_STATE\n"));
439 break;
440 case MutexHandle:
441 if (access & MUTEX_MODIFY_STATE)
442 output.append(ASCIIToUTF16("\tMUTEX_MODIFY_STATE\n"));
443 break;
444 case SemaphoreHandle:
445 if (access & SEMAPHORE_MODIFY_STATE)
446 output.append(ASCIIToUTF16("\tSEMAPHORE_MODIFY_STATE\n"));
447 break;
448 case TimerHandle:
449 if (access & TIMER_MODIFY_STATE)
450 output.append(ASCIIToUTF16("\tTIMER_MODIFY_STATE\n"));
451 if (access & TIMER_QUERY_STATE)
452 output.append(ASCIIToUTF16("\tTIMER_QUERY_STATE\n"));
453 break;
454 case NamedPipeHandle:
455 if (access & PIPE_ACCESS_INBOUND)
456 output.append(ASCIIToUTF16("\tPIPE_ACCESS_INBOUND\n"));
457 if (access & PIPE_ACCESS_OUTBOUND)
458 output.append(ASCIIToUTF16("\tPIPE_ACCESS_OUTBOUND\n"));
459 break;
460 case JobHandle:
461 if (access & JOB_OBJECT_ASSIGN_PROCESS)
462 output.append(ASCIIToUTF16("\tJOB_OBJECT_ASSIGN_PROCESS\n"));
463 if (access & JOB_OBJECT_QUERY)
464 output.append(ASCIIToUTF16("\tJOB_OBJECT_QUERY\n"));
465 if (access & JOB_OBJECT_SET_ATTRIBUTES)
466 output.append(ASCIIToUTF16("\tJOB_OBJECT_SET_ATTRIBUTES\n"));
467 if (access & JOB_OBJECT_SET_SECURITY_ATTRIBUTES)
468 output.append(ASCIIToUTF16("\tJOB_OBJECT_SET_SECURITY_ATTRIBUTES\n"));
469 if (access & JOB_OBJECT_TERMINATE)
470 output.append(ASCIIToUTF16("\tJOB_OBJECT_TERMINATE\n"));
471 break;
472 case FileMapHandle:
473 if (access & FILE_MAP_EXECUTE)
474 output.append(ASCIIToUTF16("\tFILE_MAP_EXECUTE\n"));
475 if (access & FILE_MAP_READ)
476 output.append(ASCIIToUTF16("\tFILE_MAP_READ\n"));
477 if (access & FILE_MAP_WRITE)
478 output.append(ASCIIToUTF16("\tFILE_MAP_WRITE\n"));
479 break;
480 }
481 return output;
482 }
483
484 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/handle_enumerator_win.h ('k') | content/common/content_switches.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698