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

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

Powered by Google App Engine
This is Rietveld 408576698