handle_enumerator_win.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Copyright (c) 2011 The Chromium Authors. All rights reserved.
26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Use of this source code is governed by a BSD-style license that can be
36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// found in the LICENSE file.
46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "content/common/handle_enumerator_win.h"
66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <windows.h>
86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <map>
96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "base/command_line.h"
116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "base/logging.h"
126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "base/process.h"
136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "base/process_util.h"
146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "base/utf_string_conversions.h"
156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "base/win/windows_version.h"
166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "content/public/common/content_switches.h"
176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "content/public/common/result_codes.h"
186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "sandbox/win/src/handle_table.h"
196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgnamespace {
216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef std::map<const string16, content::HandleType> HandleTypeMap;
236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgHandleTypeMap& MakeHandleTypeMap() {
256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  HandleTypeMap& handle_types = *(new HandleTypeMap());
266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  handle_types[sandbox::HandleTable::kTypeProcess] = content::ProcessHandle;
276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  handle_types[sandbox::HandleTable::kTypeThread] = content::ThreadHandle;
286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  handle_types[sandbox::HandleTable::kTypeFile] = content::FileHandle;
296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  handle_types[sandbox::HandleTable::kTypeDirectory] =
306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      content::DirectoryHandle;
316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  handle_types[sandbox::HandleTable::kTypeKey] = content::KeyHandle;
326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  handle_types[sandbox::HandleTable::kTypeWindowStation] =
336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      content::WindowStationHandle;
346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  handle_types[sandbox::HandleTable::kTypeDesktop] = content::DesktopHandle;
356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  handle_types[sandbox::HandleTable::kTypeService] = content::ServiceHandle;
366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  handle_types[sandbox::HandleTable::kTypeMutex] = content::MutexHandle;
376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  handle_types[sandbox::HandleTable::kTypeSemaphore] =
386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      content::SemaphoreHandle;
396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  handle_types[sandbox::HandleTable::kTypeEvent] = content::EventHandle;
406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  handle_types[sandbox::HandleTable::kTypeTimer] = content::TimerHandle;
416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  handle_types[sandbox::HandleTable::kTypeNamedPipe] =
426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      content::NamedPipeHandle;
436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  handle_types[sandbox::HandleTable::kTypeJobObject] = content::JobHandle;
446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  handle_types[sandbox::HandleTable::kTypeFileMap] = content::FileMapHandle;
456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  handle_types[sandbox::HandleTable::kTypeAlpcPort] =
466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      content::AlpcPortHandle;
476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return handle_types;
496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}  // namespace
526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgnamespace content {
546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgconst size_t kMaxHandleNameLength = 1024;
566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid HandleEnumerator::EnumerateHandles() {
586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  sandbox::HandleTable handles;
596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  std::string process_type =
606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          switches::kProcessType);
626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  string16 output = ASCIIToUTF16(process_type);
636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  output.append(ASCIIToUTF16(" process - Handles at shutdown:\n"));
646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  for (sandbox::HandleTable::Iterator sys_handle
656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      = handles.HandlesForProcess(::GetCurrentProcessId());
666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      sys_handle != handles.end(); ++sys_handle) {
676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    HandleType current_type = StringToHandleType(sys_handle->Type());
686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (!all_handles_ && (current_type != ProcessHandle &&
696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                          current_type != FileHandle &&
706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                          current_type != DirectoryHandle &&
716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                          current_type != KeyHandle &&
726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                          current_type != WindowStationHandle &&
736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                          current_type != DesktopHandle &&
746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                          current_type != ServiceHandle))
756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      continue;
766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    output += ASCIIToUTF16("[");
786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    output += sys_handle->Type();
796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    output += ASCIIToUTF16("] (");
806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    output += sys_handle->Name();
816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    output += ASCIIToUTF16(")\n");
826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    output += GetAccessString(current_type,
836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        sys_handle->handle_entry()->GrantedAccess);
846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  DLOG(INFO) << output;
866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgHandleType StringToHandleType(const string16& type) {
896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  static HandleTypeMap handle_types = MakeHandleTypeMap();
906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  HandleTypeMap::iterator result = handle_types.find(type);
916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return result != handle_types.end() ? result->second : OtherHandle;
926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstring16 GetAccessString(HandleType handle_type,
956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                           ACCESS_MASK access) {
966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  string16 output;
976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if (access & GENERIC_READ)
986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    output.append(ASCIIToUTF16("\tGENERIC_READ\n"));
996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if (access & GENERIC_WRITE)
1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    output.append(ASCIIToUTF16("\tGENERIC_WRITE\n"));
1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if (access & GENERIC_EXECUTE)
1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    output.append(ASCIIToUTF16("\tGENERIC_EXECUTE\n"));
1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if (access & GENERIC_ALL)
1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    output.append(ASCIIToUTF16("\tGENERIC_ALL\n"));
1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if (access & DELETE)
1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    output.append(ASCIIToUTF16("\tDELETE\n"));
1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if (access & READ_CONTROL)
1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    output.append(ASCIIToUTF16("\tREAD_CONTROL\n"));
1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if (access & WRITE_DAC)
1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    output.append(ASCIIToUTF16("\tWRITE_DAC\n"));
1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if (access & WRITE_OWNER)
1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    output.append(ASCIIToUTF16("\tWRITE_OWNER\n"));
1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if (access & SYNCHRONIZE)
1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    output.append(ASCIIToUTF16("\tSYNCHRONIZE\n"));
1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  switch (handle_type) {
1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case ProcessHandle:
1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      if (access & PROCESS_CREATE_PROCESS)
1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        output.append(ASCIIToUTF16("\tPROCESS_CREATE_PROCESS\n"));
1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      if (access & PROCESS_CREATE_THREAD)
1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        output.append(ASCIIToUTF16("\tPROCESS_CREATE_THREAD\n"));
1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      if (access & PROCESS_DUP_HANDLE)
1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        output.append(ASCIIToUTF16("\tPROCESS_DUP_HANDLE\n"));
1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      if (access & PROCESS_QUERY_INFORMATION)
1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        output.append(ASCIIToUTF16("\tPROCESS_QUERY_INFORMATION\n"));
1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      if (access & PROCESS_QUERY_LIMITED_INFORMATION)
1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        output.append(ASCIIToUTF16("\tPROCESS_QUERY_LIMITED_INFORMATION\n"));
1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      if (access & PROCESS_SET_INFORMATION)
1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        output.append(ASCIIToUTF16("\tPROCESS_SET_INFORMATION\n"));
1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      if (access & PROCESS_SET_QUOTA)
1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        output.append(ASCIIToUTF16("\tPROCESS_SET_QUOTA\n"));
1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      if (access & PROCESS_SUSPEND_RESUME)
1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        output.append(ASCIIToUTF16("\tPROCESS_SUSPEND_RESUME\n"));
1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      if (access & PROCESS_TERMINATE)
1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        output.append(ASCIIToUTF16("\tPROCESS_TERMINATE\n"));
1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      if (access & PROCESS_VM_OPERATION)
1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        output.append(ASCIIToUTF16("\tPROCESS_VM_OPERATION\n"));
1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      if (access & PROCESS_VM_READ)
1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        output.append(ASCIIToUTF16("\tPROCESS_VM_READ\n"));
1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      if (access & PROCESS_VM_WRITE)
1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        output.append(ASCIIToUTF16("\tPROCESS_VM_WRITE\n"));
1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      break;
1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case ThreadHandle:
1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      if (access & THREAD_DIRECT_IMPERSONATION)
1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        output.append(ASCIIToUTF16("\tTHREAD_DIRECT_IMPERSONATION\n"));
146a4ce5bf56788dbb4835a5ef6143384266bbff5f5jshin@chromium.org      if (access & THREAD_GET_CONTEXT)
1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        output.append(ASCIIToUTF16("\tTHREAD_GET_CONTEXT\n"));
1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      if (access & THREAD_IMPERSONATE)
1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        output.append(ASCIIToUTF16("\tTHREAD_IMPERSONATE\n"));
1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      if (access & THREAD_QUERY_INFORMATION )
1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        output.append(ASCIIToUTF16("\tTHREAD_QUERY_INFORMATION\n"));
1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      if (access & THREAD_QUERY_LIMITED_INFORMATION)
1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        output.append(ASCIIToUTF16("\tTHREAD_QUERY_LIMITED_INFORMATION\n"));
1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      if (access & THREAD_SET_CONTEXT)
1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        output.append(ASCIIToUTF16("\tTHREAD_SET_CONTEXT\n"));
1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      if (access & THREAD_SET_INFORMATION)
1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        output.append(ASCIIToUTF16("\tTHREAD_SET_INFORMATION\n"));
1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      if (access & THREAD_SET_LIMITED_INFORMATION)
1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        output.append(ASCIIToUTF16("\tTHREAD_SET_LIMITED_INFORMATION\n"));
1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      if (access & THREAD_SET_THREAD_TOKEN)
1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        output.append(ASCIIToUTF16("\tTHREAD_SET_THREAD_TOKEN\n"));
1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      if (access & THREAD_SUSPEND_RESUME)
163        output.append(ASCIIToUTF16("\tTHREAD_SUSPEND_RESUME\n"));
164      if (access & THREAD_TERMINATE)
165        output.append(ASCIIToUTF16("\tTHREAD_TERMINATE\n"));
166      break;
167    case FileHandle:
168      if (access & FILE_APPEND_DATA)
169        output.append(ASCIIToUTF16("\tFILE_APPEND_DATA\n"));
170      if (access & FILE_EXECUTE)
171        output.append(ASCIIToUTF16("\tFILE_EXECUTE\n"));
172      if (access & FILE_READ_ATTRIBUTES)
173        output.append(ASCIIToUTF16("\tFILE_READ_ATTRIBUTES\n"));
174      if (access & FILE_READ_DATA)
175        output.append(ASCIIToUTF16("\tFILE_READ_DATA\n"));
176      if (access & FILE_READ_EA)
177        output.append(ASCIIToUTF16("\tFILE_READ_EA\n"));
178      if (access & FILE_WRITE_ATTRIBUTES)
179        output.append(ASCIIToUTF16("\tFILE_WRITE_ATTRIBUTES\n"));
180      if (access & FILE_WRITE_DATA)
181        output.append(ASCIIToUTF16("\tFILE_WRITE_DATA\n"));
182      if (access & FILE_WRITE_EA)
183        output.append(ASCIIToUTF16("\tFILE_WRITE_EA\n"));
184      if (access & FILE_WRITE_EA)
185        output.append(ASCIIToUTF16("\tFILE_WRITE_EA\n"));
186      break;
187    case DirectoryHandle:
188      if (access & FILE_ADD_FILE)
189        output.append(ASCIIToUTF16("\tFILE_ADD_FILE\n"));
190      if (access & FILE_ADD_SUBDIRECTORY)
191        output.append(ASCIIToUTF16("\tFILE_ADD_SUBDIRECTORY\n"));
192      if (access & FILE_APPEND_DATA)
193        output.append(ASCIIToUTF16("\tFILE_APPEND_DATA\n"));
194      if (access & FILE_DELETE_CHILD)
195        output.append(ASCIIToUTF16("\tFILE_DELETE_CHILD\n"));
196      if (access & FILE_LIST_DIRECTORY)
197        output.append(ASCIIToUTF16("\tFILE_LIST_DIRECTORY\n"));
198      if (access & FILE_READ_DATA)
199        output.append(ASCIIToUTF16("\tFILE_READ_DATA\n"));
200      if (access & FILE_TRAVERSE)
201        output.append(ASCIIToUTF16("\tFILE_TRAVERSE\n"));
202      if (access & FILE_WRITE_DATA)
203        output.append(ASCIIToUTF16("\tFILE_WRITE_DATA\n"));
204      break;
205    case KeyHandle:
206      if (access & KEY_CREATE_LINK)
207        output.append(ASCIIToUTF16("\tKEY_CREATE_LINK\n"));
208      if (access & KEY_CREATE_SUB_KEY)
209        output.append(ASCIIToUTF16("\tKEY_CREATE_SUB_KEY\n"));
210      if (access & KEY_ENUMERATE_SUB_KEYS)
211        output.append(ASCIIToUTF16("\tKEY_ENUMERATE_SUB_KEYS\n"));
212      if (access & KEY_EXECUTE)
213        output.append(ASCIIToUTF16("\tKEY_EXECUTE\n"));
214      if (access & KEY_NOTIFY)
215        output.append(ASCIIToUTF16("\tKEY_NOTIFY\n"));
216      if (access & KEY_QUERY_VALUE)
217        output.append(ASCIIToUTF16("\tKEY_QUERY_VALUE\n"));
218      if (access & KEY_READ)
219        output.append(ASCIIToUTF16("\tKEY_READ\n"));
220      if (access & KEY_SET_VALUE)
221        output.append(ASCIIToUTF16("\tKEY_SET_VALUE\n"));
222      if (access & KEY_WOW64_32KEY)
223        output.append(ASCIIToUTF16("\tKEY_WOW64_32KEY\n"));
224      if (access & KEY_WOW64_64KEY)
225        output.append(ASCIIToUTF16("\tKEY_WOW64_64KEY\n"));
226      break;
227    case WindowStationHandle:
228      if (access & WINSTA_ACCESSCLIPBOARD)
229        output.append(ASCIIToUTF16("\tWINSTA_ACCESSCLIPBOARD\n"));
230      if (access & WINSTA_ACCESSGLOBALATOMS)
231        output.append(ASCIIToUTF16("\tWINSTA_ACCESSGLOBALATOMS\n"));
232      if (access & WINSTA_CREATEDESKTOP)
233        output.append(ASCIIToUTF16("\tWINSTA_CREATEDESKTOP\n"));
234      if (access & WINSTA_ENUMDESKTOPS)
235        output.append(ASCIIToUTF16("\tWINSTA_ENUMDESKTOPS\n"));
236      if (access & WINSTA_ENUMERATE)
237        output.append(ASCIIToUTF16("\tWINSTA_ENUMERATE\n"));
238      if (access & WINSTA_EXITWINDOWS)
239        output.append(ASCIIToUTF16("\tWINSTA_EXITWINDOWS\n"));
240      if (access & WINSTA_READATTRIBUTES)
241        output.append(ASCIIToUTF16("\tWINSTA_READATTRIBUTES\n"));
242      if (access & WINSTA_READSCREEN)
243        output.append(ASCIIToUTF16("\tWINSTA_READSCREEN\n"));
244      if (access & WINSTA_WRITEATTRIBUTES)
245        output.append(ASCIIToUTF16("\tWINSTA_WRITEATTRIBUTES\n"));
246      break;
247    case DesktopHandle:
248      if (access & DESKTOP_CREATEMENU)
249        output.append(ASCIIToUTF16("\tDESKTOP_CREATEMENU\n"));
250      if (access & DESKTOP_CREATEWINDOW)
251        output.append(ASCIIToUTF16("\tDESKTOP_CREATEWINDOW\n"));
252      if (access & DESKTOP_ENUMERATE)
253        output.append(ASCIIToUTF16("\tDESKTOP_ENUMERATE\n"));
254      if (access & DESKTOP_HOOKCONTROL)
255        output.append(ASCIIToUTF16("\tDESKTOP_HOOKCONTROL\n"));
256      if (access & DESKTOP_JOURNALPLAYBACK)
257        output.append(ASCIIToUTF16("\tDESKTOP_JOURNALPLAYBACK\n"));
258      if (access & DESKTOP_JOURNALRECORD)
259        output.append(ASCIIToUTF16("\tDESKTOP_JOURNALRECORD\n"));
260      if (access & DESKTOP_READOBJECTS)
261        output.append(ASCIIToUTF16("\tDESKTOP_READOBJECTS\n"));
262      if (access & DESKTOP_SWITCHDESKTOP)
263        output.append(ASCIIToUTF16("\tDESKTOP_SWITCHDESKTOP\n"));
264      if (access & DESKTOP_WRITEOBJECTS)
265        output.append(ASCIIToUTF16("\tDESKTOP_WRITEOBJECTS\n"));
266      break;
267    case ServiceHandle:
268      if (access & SC_MANAGER_CREATE_SERVICE)
269        output.append(ASCIIToUTF16("\tSC_MANAGER_CREATE_SERVICE\n"));
270      if (access & SC_MANAGER_CONNECT)
271        output.append(ASCIIToUTF16("\tSC_MANAGER_CONNECT\n"));
272      if (access & SC_MANAGER_ENUMERATE_SERVICE )
273        output.append(ASCIIToUTF16("\tSC_MANAGER_ENUMERATE_SERVICE\n"));
274      if (access & SC_MANAGER_LOCK)
275        output.append(ASCIIToUTF16("\tSC_MANAGER_LOCK\n"));
276      if (access & SC_MANAGER_MODIFY_BOOT_CONFIG )
277        output.append(ASCIIToUTF16("\tSC_MANAGER_MODIFY_BOOT_CONFIG\n"));
278      if (access & SC_MANAGER_QUERY_LOCK_STATUS )
279        output.append(ASCIIToUTF16("\tSC_MANAGER_QUERY_LOCK_STATUS\n"));
280      break;
281    case EventHandle:
282      if (access & EVENT_MODIFY_STATE)
283        output.append(ASCIIToUTF16("\tEVENT_MODIFY_STATE\n"));
284      break;
285    case MutexHandle:
286      if (access & MUTEX_MODIFY_STATE)
287        output.append(ASCIIToUTF16("\tMUTEX_MODIFY_STATE\n"));
288      break;
289    case SemaphoreHandle:
290      if (access & SEMAPHORE_MODIFY_STATE)
291        output.append(ASCIIToUTF16("\tSEMAPHORE_MODIFY_STATE\n"));
292      break;
293    case TimerHandle:
294      if (access & TIMER_MODIFY_STATE)
295        output.append(ASCIIToUTF16("\tTIMER_MODIFY_STATE\n"));
296      if (access & TIMER_QUERY_STATE)
297        output.append(ASCIIToUTF16("\tTIMER_QUERY_STATE\n"));
298      break;
299    case NamedPipeHandle:
300      if (access & PIPE_ACCESS_INBOUND)
301        output.append(ASCIIToUTF16("\tPIPE_ACCESS_INBOUND\n"));
302      if (access & PIPE_ACCESS_OUTBOUND)
303        output.append(ASCIIToUTF16("\tPIPE_ACCESS_OUTBOUND\n"));
304      break;
305    case JobHandle:
306      if (access & JOB_OBJECT_ASSIGN_PROCESS)
307        output.append(ASCIIToUTF16("\tJOB_OBJECT_ASSIGN_PROCESS\n"));
308      if (access & JOB_OBJECT_QUERY)
309        output.append(ASCIIToUTF16("\tJOB_OBJECT_QUERY\n"));
310      if (access & JOB_OBJECT_SET_ATTRIBUTES)
311        output.append(ASCIIToUTF16("\tJOB_OBJECT_SET_ATTRIBUTES\n"));
312      if (access & JOB_OBJECT_SET_SECURITY_ATTRIBUTES)
313        output.append(ASCIIToUTF16("\tJOB_OBJECT_SET_SECURITY_ATTRIBUTES\n"));
314      if (access & JOB_OBJECT_TERMINATE)
315        output.append(ASCIIToUTF16("\tJOB_OBJECT_TERMINATE\n"));
316      break;
317    case FileMapHandle:
318      if (access & FILE_MAP_EXECUTE)
319        output.append(ASCIIToUTF16("\tFILE_MAP_EXECUTE\n"));
320      if (access & FILE_MAP_READ)
321        output.append(ASCIIToUTF16("\tFILE_MAP_READ\n"));
322      if (access & FILE_MAP_WRITE)
323        output.append(ASCIIToUTF16("\tFILE_MAP_WRITE\n"));
324      break;
325  }
326  return output;
327}
328
329}  // namespace content
330