handle_enumerator_win.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/handle_enumerator_win.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <windows.h>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/process.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/process_util.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/utf_string_conversions.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/windows_version.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_switches.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/result_codes.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sandbox/win/src/handle_table.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace content {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef std::map<const string16, HandleType> HandleTypeMap;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HandleTypeMap& MakeHandleTypeMap() {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HandleTypeMap& handle_types = *(new HandleTypeMap());
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  handle_types[sandbox::HandleTable::kTypeProcess] = ProcessHandle;
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  handle_types[sandbox::HandleTable::kTypeThread] = ThreadHandle;
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  handle_types[sandbox::HandleTable::kTypeFile] = FileHandle;
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  handle_types[sandbox::HandleTable::kTypeDirectory] = DirectoryHandle;
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  handle_types[sandbox::HandleTable::kTypeKey] = KeyHandle;
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  handle_types[sandbox::HandleTable::kTypeWindowStation] = WindowStationHandle;
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  handle_types[sandbox::HandleTable::kTypeDesktop] = DesktopHandle;
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  handle_types[sandbox::HandleTable::kTypeService] = ServiceHandle;
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  handle_types[sandbox::HandleTable::kTypeMutex] = MutexHandle;
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  handle_types[sandbox::HandleTable::kTypeSemaphore] = SemaphoreHandle;
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  handle_types[sandbox::HandleTable::kTypeEvent] = EventHandle;
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  handle_types[sandbox::HandleTable::kTypeTimer] = TimerHandle;
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  handle_types[sandbox::HandleTable::kTypeNamedPipe] = NamedPipeHandle;
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  handle_types[sandbox::HandleTable::kTypeJobObject] = JobHandle;
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  handle_types[sandbox::HandleTable::kTypeFileMap] = FileMapHandle;
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  handle_types[sandbox::HandleTable::kTypeAlpcPort] = AlpcPortHandle;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return handle_types;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const size_t kMaxHandleNameLength = 1024;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HandleEnumerator::EnumerateHandles() {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sandbox::HandleTable handles;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string process_type =
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          switches::kProcessType);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 output = ASCIIToUTF16(process_type);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  output.append(ASCIIToUTF16(" process - Handles at shutdown:\n"));
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (sandbox::HandleTable::Iterator sys_handle
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      = handles.HandlesForProcess(::GetCurrentProcessId());
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sys_handle != handles.end(); ++sys_handle) {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HandleType current_type = StringToHandleType(sys_handle->Type());
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!all_handles_ && (current_type != ProcessHandle &&
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          current_type != FileHandle &&
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          current_type != DirectoryHandle &&
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          current_type != KeyHandle &&
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          current_type != WindowStationHandle &&
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          current_type != DesktopHandle &&
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          current_type != ServiceHandle))
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    output += ASCIIToUTF16("[");
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    output += sys_handle->Type();
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    output += ASCIIToUTF16("] (");
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    output += sys_handle->Name();
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    output += ASCIIToUTF16(")\n");
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    output += GetAccessString(current_type,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sys_handle->handle_entry()->GrantedAccess);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DLOG(INFO) << output;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HandleType StringToHandleType(const string16& type) {
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static HandleTypeMap handle_types = MakeHandleTypeMap();
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HandleTypeMap::iterator result = handle_types.find(type);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result != handle_types.end() ? result->second : OtherHandle;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 GetAccessString(HandleType handle_type,
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           ACCESS_MASK access) {
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 output;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (access & GENERIC_READ)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    output.append(ASCIIToUTF16("\tGENERIC_READ\n"));
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (access & GENERIC_WRITE)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    output.append(ASCIIToUTF16("\tGENERIC_WRITE\n"));
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (access & GENERIC_EXECUTE)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    output.append(ASCIIToUTF16("\tGENERIC_EXECUTE\n"));
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (access & GENERIC_ALL)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    output.append(ASCIIToUTF16("\tGENERIC_ALL\n"));
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (access & DELETE)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    output.append(ASCIIToUTF16("\tDELETE\n"));
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (access & READ_CONTROL)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    output.append(ASCIIToUTF16("\tREAD_CONTROL\n"));
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (access & WRITE_DAC)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    output.append(ASCIIToUTF16("\tWRITE_DAC\n"));
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (access & WRITE_OWNER)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    output.append(ASCIIToUTF16("\tWRITE_OWNER\n"));
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (access & SYNCHRONIZE)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    output.append(ASCIIToUTF16("\tSYNCHRONIZE\n"));
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (handle_type) {
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ProcessHandle:
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & PROCESS_CREATE_PROCESS)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tPROCESS_CREATE_PROCESS\n"));
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & PROCESS_CREATE_THREAD)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tPROCESS_CREATE_THREAD\n"));
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & PROCESS_DUP_HANDLE)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tPROCESS_DUP_HANDLE\n"));
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & PROCESS_QUERY_INFORMATION)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tPROCESS_QUERY_INFORMATION\n"));
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & PROCESS_QUERY_LIMITED_INFORMATION)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tPROCESS_QUERY_LIMITED_INFORMATION\n"));
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & PROCESS_SET_INFORMATION)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tPROCESS_SET_INFORMATION\n"));
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & PROCESS_SET_QUOTA)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tPROCESS_SET_QUOTA\n"));
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & PROCESS_SUSPEND_RESUME)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tPROCESS_SUSPEND_RESUME\n"));
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & PROCESS_TERMINATE)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tPROCESS_TERMINATE\n"));
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & PROCESS_VM_OPERATION)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tPROCESS_VM_OPERATION\n"));
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & PROCESS_VM_READ)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tPROCESS_VM_READ\n"));
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & PROCESS_VM_WRITE)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tPROCESS_VM_WRITE\n"));
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ThreadHandle:
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & THREAD_DIRECT_IMPERSONATION)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tTHREAD_DIRECT_IMPERSONATION\n"));
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & THREAD_GET_CONTEXT)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tTHREAD_GET_CONTEXT\n"));
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & THREAD_IMPERSONATE)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tTHREAD_IMPERSONATE\n"));
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & THREAD_QUERY_INFORMATION )
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tTHREAD_QUERY_INFORMATION\n"));
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & THREAD_QUERY_LIMITED_INFORMATION)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tTHREAD_QUERY_LIMITED_INFORMATION\n"));
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & THREAD_SET_CONTEXT)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tTHREAD_SET_CONTEXT\n"));
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & THREAD_SET_INFORMATION)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tTHREAD_SET_INFORMATION\n"));
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & THREAD_SET_LIMITED_INFORMATION)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tTHREAD_SET_LIMITED_INFORMATION\n"));
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & THREAD_SET_THREAD_TOKEN)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tTHREAD_SET_THREAD_TOKEN\n"));
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & THREAD_SUSPEND_RESUME)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tTHREAD_SUSPEND_RESUME\n"));
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & THREAD_TERMINATE)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tTHREAD_TERMINATE\n"));
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case FileHandle:
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & FILE_APPEND_DATA)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tFILE_APPEND_DATA\n"));
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & FILE_EXECUTE)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tFILE_EXECUTE\n"));
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & FILE_READ_ATTRIBUTES)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tFILE_READ_ATTRIBUTES\n"));
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & FILE_READ_DATA)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tFILE_READ_DATA\n"));
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & FILE_READ_EA)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tFILE_READ_EA\n"));
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & FILE_WRITE_ATTRIBUTES)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tFILE_WRITE_ATTRIBUTES\n"));
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & FILE_WRITE_DATA)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tFILE_WRITE_DATA\n"));
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & FILE_WRITE_EA)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tFILE_WRITE_EA\n"));
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & FILE_WRITE_EA)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tFILE_WRITE_EA\n"));
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case DirectoryHandle:
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & FILE_ADD_FILE)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tFILE_ADD_FILE\n"));
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & FILE_ADD_SUBDIRECTORY)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tFILE_ADD_SUBDIRECTORY\n"));
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & FILE_APPEND_DATA)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tFILE_APPEND_DATA\n"));
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & FILE_DELETE_CHILD)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tFILE_DELETE_CHILD\n"));
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & FILE_LIST_DIRECTORY)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tFILE_LIST_DIRECTORY\n"));
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & FILE_READ_DATA)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tFILE_READ_DATA\n"));
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & FILE_TRAVERSE)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tFILE_TRAVERSE\n"));
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & FILE_WRITE_DATA)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tFILE_WRITE_DATA\n"));
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case KeyHandle:
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & KEY_CREATE_LINK)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tKEY_CREATE_LINK\n"));
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & KEY_CREATE_SUB_KEY)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tKEY_CREATE_SUB_KEY\n"));
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & KEY_ENUMERATE_SUB_KEYS)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tKEY_ENUMERATE_SUB_KEYS\n"));
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & KEY_EXECUTE)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tKEY_EXECUTE\n"));
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & KEY_NOTIFY)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tKEY_NOTIFY\n"));
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & KEY_QUERY_VALUE)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tKEY_QUERY_VALUE\n"));
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & KEY_READ)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tKEY_READ\n"));
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & KEY_SET_VALUE)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tKEY_SET_VALUE\n"));
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & KEY_WOW64_32KEY)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tKEY_WOW64_32KEY\n"));
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & KEY_WOW64_64KEY)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tKEY_WOW64_64KEY\n"));
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case WindowStationHandle:
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & WINSTA_ACCESSCLIPBOARD)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tWINSTA_ACCESSCLIPBOARD\n"));
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & WINSTA_ACCESSGLOBALATOMS)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tWINSTA_ACCESSGLOBALATOMS\n"));
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & WINSTA_CREATEDESKTOP)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tWINSTA_CREATEDESKTOP\n"));
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & WINSTA_ENUMDESKTOPS)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tWINSTA_ENUMDESKTOPS\n"));
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & WINSTA_ENUMERATE)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tWINSTA_ENUMERATE\n"));
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & WINSTA_EXITWINDOWS)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tWINSTA_EXITWINDOWS\n"));
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & WINSTA_READATTRIBUTES)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tWINSTA_READATTRIBUTES\n"));
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & WINSTA_READSCREEN)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tWINSTA_READSCREEN\n"));
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & WINSTA_WRITEATTRIBUTES)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tWINSTA_WRITEATTRIBUTES\n"));
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case DesktopHandle:
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & DESKTOP_CREATEMENU)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tDESKTOP_CREATEMENU\n"));
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & DESKTOP_CREATEWINDOW)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tDESKTOP_CREATEWINDOW\n"));
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & DESKTOP_ENUMERATE)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tDESKTOP_ENUMERATE\n"));
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & DESKTOP_HOOKCONTROL)
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tDESKTOP_HOOKCONTROL\n"));
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & DESKTOP_JOURNALPLAYBACK)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tDESKTOP_JOURNALPLAYBACK\n"));
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & DESKTOP_JOURNALRECORD)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tDESKTOP_JOURNALRECORD\n"));
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & DESKTOP_READOBJECTS)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tDESKTOP_READOBJECTS\n"));
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & DESKTOP_SWITCHDESKTOP)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tDESKTOP_SWITCHDESKTOP\n"));
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & DESKTOP_WRITEOBJECTS)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tDESKTOP_WRITEOBJECTS\n"));
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ServiceHandle:
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & SC_MANAGER_CREATE_SERVICE)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tSC_MANAGER_CREATE_SERVICE\n"));
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & SC_MANAGER_CONNECT)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tSC_MANAGER_CONNECT\n"));
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & SC_MANAGER_ENUMERATE_SERVICE )
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tSC_MANAGER_ENUMERATE_SERVICE\n"));
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & SC_MANAGER_LOCK)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tSC_MANAGER_LOCK\n"));
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & SC_MANAGER_MODIFY_BOOT_CONFIG )
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tSC_MANAGER_MODIFY_BOOT_CONFIG\n"));
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & SC_MANAGER_QUERY_LOCK_STATUS )
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tSC_MANAGER_QUERY_LOCK_STATUS\n"));
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case EventHandle:
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & EVENT_MODIFY_STATE)
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tEVENT_MODIFY_STATE\n"));
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case MutexHandle:
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & MUTEX_MODIFY_STATE)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tMUTEX_MODIFY_STATE\n"));
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case SemaphoreHandle:
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & SEMAPHORE_MODIFY_STATE)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tSEMAPHORE_MODIFY_STATE\n"));
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TimerHandle:
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & TIMER_MODIFY_STATE)
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tTIMER_MODIFY_STATE\n"));
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & TIMER_QUERY_STATE)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tTIMER_QUERY_STATE\n"));
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case NamedPipeHandle:
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & PIPE_ACCESS_INBOUND)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tPIPE_ACCESS_INBOUND\n"));
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & PIPE_ACCESS_OUTBOUND)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tPIPE_ACCESS_OUTBOUND\n"));
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case JobHandle:
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & JOB_OBJECT_ASSIGN_PROCESS)
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tJOB_OBJECT_ASSIGN_PROCESS\n"));
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & JOB_OBJECT_QUERY)
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tJOB_OBJECT_QUERY\n"));
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & JOB_OBJECT_SET_ATTRIBUTES)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tJOB_OBJECT_SET_ATTRIBUTES\n"));
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & JOB_OBJECT_SET_SECURITY_ATTRIBUTES)
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tJOB_OBJECT_SET_SECURITY_ATTRIBUTES\n"));
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & JOB_OBJECT_TERMINATE)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tJOB_OBJECT_TERMINATE\n"));
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case FileMapHandle:
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & FILE_MAP_EXECUTE)
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tFILE_MAP_EXECUTE\n"));
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & FILE_MAP_READ)
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tFILE_MAP_READ\n"));
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (access & FILE_MAP_WRITE)
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.append(ASCIIToUTF16("\tFILE_MAP_WRITE\n"));
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return output;
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
324