// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "content/common/handle_enumerator_win.h"

#include <windows.h>
#include <map>

#include "base/command_line.h"
#include "base/logging.h"
#include "base/process.h"
#include "base/process_util.h"
#include "base/utf_string_conversions.h"
#include "base/win/windows_version.h"
#include "content/public/common/content_switches.h"
#include "content/public/common/result_codes.h"
#include "sandbox/win/src/handle_table.h"

namespace {

typedef std::map<const string16, content::HandleType> HandleTypeMap;

HandleTypeMap& MakeHandleTypeMap() {
  HandleTypeMap& handle_types = *(new HandleTypeMap());
  handle_types[sandbox::HandleTable::kTypeProcess] = content::ProcessHandle;
  handle_types[sandbox::HandleTable::kTypeThread] = content::ThreadHandle;
  handle_types[sandbox::HandleTable::kTypeFile] = content::FileHandle;
  handle_types[sandbox::HandleTable::kTypeDirectory] =
      content::DirectoryHandle;
  handle_types[sandbox::HandleTable::kTypeKey] = content::KeyHandle;
  handle_types[sandbox::HandleTable::kTypeWindowStation] =
      content::WindowStationHandle;
  handle_types[sandbox::HandleTable::kTypeDesktop] = content::DesktopHandle;
  handle_types[sandbox::HandleTable::kTypeService] = content::ServiceHandle;
  handle_types[sandbox::HandleTable::kTypeMutex] = content::MutexHandle;
  handle_types[sandbox::HandleTable::kTypeSemaphore] =
      content::SemaphoreHandle;
  handle_types[sandbox::HandleTable::kTypeEvent] = content::EventHandle;
  handle_types[sandbox::HandleTable::kTypeTimer] = content::TimerHandle;
  handle_types[sandbox::HandleTable::kTypeNamedPipe] =
      content::NamedPipeHandle;
  handle_types[sandbox::HandleTable::kTypeJobObject] = content::JobHandle;
  handle_types[sandbox::HandleTable::kTypeFileMap] = content::FileMapHandle;
  handle_types[sandbox::HandleTable::kTypeAlpcPort] =
      content::AlpcPortHandle;

  return handle_types;
}

}  // namespace

namespace content {

const size_t kMaxHandleNameLength = 1024;

void HandleEnumerator::EnumerateHandles() {
  sandbox::HandleTable handles;
  std::string process_type =
      CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
          switches::kProcessType);
  string16 output = ASCIIToUTF16(process_type);
  output.append(ASCIIToUTF16(" process - Handles at shutdown:\n"));
  for (sandbox::HandleTable::Iterator sys_handle
      = handles.HandlesForProcess(::GetCurrentProcessId());
      sys_handle != handles.end(); ++sys_handle) {
    HandleType current_type = StringToHandleType(sys_handle->Type());
    if (!all_handles_ && (current_type != ProcessHandle &&
                          current_type != FileHandle &&
                          current_type != DirectoryHandle &&
                          current_type != KeyHandle &&
                          current_type != WindowStationHandle &&
                          current_type != DesktopHandle &&
                          current_type != ServiceHandle))
      continue;

    output += ASCIIToUTF16("[");
    output += sys_handle->Type();
    output += ASCIIToUTF16("] (");
    output += sys_handle->Name();
    output += ASCIIToUTF16(")\n");
    output += GetAccessString(current_type,
        sys_handle->handle_entry()->GrantedAccess);
  }
  DLOG(INFO) << output;
}

HandleType StringToHandleType(const string16& type) {
  static HandleTypeMap handle_types = MakeHandleTypeMap();
  HandleTypeMap::iterator result = handle_types.find(type);
  return result != handle_types.end() ? result->second : OtherHandle;
}

string16 GetAccessString(HandleType handle_type,
                                           ACCESS_MASK access) {
  string16 output;
  if (access & GENERIC_READ)
    output.append(ASCIIToUTF16("\tGENERIC_READ\n"));
  if (access & GENERIC_WRITE)
    output.append(ASCIIToUTF16("\tGENERIC_WRITE\n"));
  if (access & GENERIC_EXECUTE)
    output.append(ASCIIToUTF16("\tGENERIC_EXECUTE\n"));
  if (access & GENERIC_ALL)
    output.append(ASCIIToUTF16("\tGENERIC_ALL\n"));
  if (access & DELETE)
    output.append(ASCIIToUTF16("\tDELETE\n"));
  if (access & READ_CONTROL)
    output.append(ASCIIToUTF16("\tREAD_CONTROL\n"));
  if (access & WRITE_DAC)
    output.append(ASCIIToUTF16("\tWRITE_DAC\n"));
  if (access & WRITE_OWNER)
    output.append(ASCIIToUTF16("\tWRITE_OWNER\n"));
  if (access & SYNCHRONIZE)
    output.append(ASCIIToUTF16("\tSYNCHRONIZE\n"));

  switch (handle_type) {
    case ProcessHandle:
      if (access & PROCESS_CREATE_PROCESS)
        output.append(ASCIIToUTF16("\tPROCESS_CREATE_PROCESS\n"));
      if (access & PROCESS_CREATE_THREAD)
        output.append(ASCIIToUTF16("\tPROCESS_CREATE_THREAD\n"));
      if (access & PROCESS_DUP_HANDLE)
        output.append(ASCIIToUTF16("\tPROCESS_DUP_HANDLE\n"));
      if (access & PROCESS_QUERY_INFORMATION)
        output.append(ASCIIToUTF16("\tPROCESS_QUERY_INFORMATION\n"));
      if (access & PROCESS_QUERY_LIMITED_INFORMATION)
        output.append(ASCIIToUTF16("\tPROCESS_QUERY_LIMITED_INFORMATION\n"));
      if (access & PROCESS_SET_INFORMATION)
        output.append(ASCIIToUTF16("\tPROCESS_SET_INFORMATION\n"));
      if (access & PROCESS_SET_QUOTA)
        output.append(ASCIIToUTF16("\tPROCESS_SET_QUOTA\n"));
      if (access & PROCESS_SUSPEND_RESUME)
        output.append(ASCIIToUTF16("\tPROCESS_SUSPEND_RESUME\n"));
      if (access & PROCESS_TERMINATE)
        output.append(ASCIIToUTF16("\tPROCESS_TERMINATE\n"));
      if (access & PROCESS_VM_OPERATION)
        output.append(ASCIIToUTF16("\tPROCESS_VM_OPERATION\n"));
      if (access & PROCESS_VM_READ)
        output.append(ASCIIToUTF16("\tPROCESS_VM_READ\n"));
      if (access & PROCESS_VM_WRITE)
        output.append(ASCIIToUTF16("\tPROCESS_VM_WRITE\n"));
      break;
    case ThreadHandle:
      if (access & THREAD_DIRECT_IMPERSONATION)
        output.append(ASCIIToUTF16("\tTHREAD_DIRECT_IMPERSONATION\n"));
      if (access & THREAD_GET_CONTEXT)
        output.append(ASCIIToUTF16("\tTHREAD_GET_CONTEXT\n"));
      if (access & THREAD_IMPERSONATE)
        output.append(ASCIIToUTF16("\tTHREAD_IMPERSONATE\n"));
      if (access & THREAD_QUERY_INFORMATION )
        output.append(ASCIIToUTF16("\tTHREAD_QUERY_INFORMATION\n"));
      if (access & THREAD_QUERY_LIMITED_INFORMATION)
        output.append(ASCIIToUTF16("\tTHREAD_QUERY_LIMITED_INFORMATION\n"));
      if (access & THREAD_SET_CONTEXT)
        output.append(ASCIIToUTF16("\tTHREAD_SET_CONTEXT\n"));
      if (access & THREAD_SET_INFORMATION)
        output.append(ASCIIToUTF16("\tTHREAD_SET_INFORMATION\n"));
      if (access & THREAD_SET_LIMITED_INFORMATION)
        output.append(ASCIIToUTF16("\tTHREAD_SET_LIMITED_INFORMATION\n"));
      if (access & THREAD_SET_THREAD_TOKEN)
        output.append(ASCIIToUTF16("\tTHREAD_SET_THREAD_TOKEN\n"));
      if (access & THREAD_SUSPEND_RESUME)
        output.append(ASCIIToUTF16("\tTHREAD_SUSPEND_RESUME\n"));
      if (access & THREAD_TERMINATE)
        output.append(ASCIIToUTF16("\tTHREAD_TERMINATE\n"));
      break;
    case FileHandle:
      if (access & FILE_APPEND_DATA)
        output.append(ASCIIToUTF16("\tFILE_APPEND_DATA\n"));
      if (access & FILE_EXECUTE)
        output.append(ASCIIToUTF16("\tFILE_EXECUTE\n"));
      if (access & FILE_READ_ATTRIBUTES)
        output.append(ASCIIToUTF16("\tFILE_READ_ATTRIBUTES\n"));
      if (access & FILE_READ_DATA)
        output.append(ASCIIToUTF16("\tFILE_READ_DATA\n"));
      if (access & FILE_READ_EA)
        output.append(ASCIIToUTF16("\tFILE_READ_EA\n"));
      if (access & FILE_WRITE_ATTRIBUTES)
        output.append(ASCIIToUTF16("\tFILE_WRITE_ATTRIBUTES\n"));
      if (access & FILE_WRITE_DATA)
        output.append(ASCIIToUTF16("\tFILE_WRITE_DATA\n"));
      if (access & FILE_WRITE_EA)
        output.append(ASCIIToUTF16("\tFILE_WRITE_EA\n"));
      if (access & FILE_WRITE_EA)
        output.append(ASCIIToUTF16("\tFILE_WRITE_EA\n"));
      break;
    case DirectoryHandle:
      if (access & FILE_ADD_FILE)
        output.append(ASCIIToUTF16("\tFILE_ADD_FILE\n"));
      if (access & FILE_ADD_SUBDIRECTORY)
        output.append(ASCIIToUTF16("\tFILE_ADD_SUBDIRECTORY\n"));
      if (access & FILE_APPEND_DATA)
        output.append(ASCIIToUTF16("\tFILE_APPEND_DATA\n"));
      if (access & FILE_DELETE_CHILD)
        output.append(ASCIIToUTF16("\tFILE_DELETE_CHILD\n"));
      if (access & FILE_LIST_DIRECTORY)
        output.append(ASCIIToUTF16("\tFILE_LIST_DIRECTORY\n"));
      if (access & FILE_READ_DATA)
        output.append(ASCIIToUTF16("\tFILE_READ_DATA\n"));
      if (access & FILE_TRAVERSE)
        output.append(ASCIIToUTF16("\tFILE_TRAVERSE\n"));
      if (access & FILE_WRITE_DATA)
        output.append(ASCIIToUTF16("\tFILE_WRITE_DATA\n"));
      break;
    case KeyHandle:
      if (access & KEY_CREATE_LINK)
        output.append(ASCIIToUTF16("\tKEY_CREATE_LINK\n"));
      if (access & KEY_CREATE_SUB_KEY)
        output.append(ASCIIToUTF16("\tKEY_CREATE_SUB_KEY\n"));
      if (access & KEY_ENUMERATE_SUB_KEYS)
        output.append(ASCIIToUTF16("\tKEY_ENUMERATE_SUB_KEYS\n"));
      if (access & KEY_EXECUTE)
        output.append(ASCIIToUTF16("\tKEY_EXECUTE\n"));
      if (access & KEY_NOTIFY)
        output.append(ASCIIToUTF16("\tKEY_NOTIFY\n"));
      if (access & KEY_QUERY_VALUE)
        output.append(ASCIIToUTF16("\tKEY_QUERY_VALUE\n"));
      if (access & KEY_READ)
        output.append(ASCIIToUTF16("\tKEY_READ\n"));
      if (access & KEY_SET_VALUE)
        output.append(ASCIIToUTF16("\tKEY_SET_VALUE\n"));
      if (access & KEY_WOW64_32KEY)
        output.append(ASCIIToUTF16("\tKEY_WOW64_32KEY\n"));
      if (access & KEY_WOW64_64KEY)
        output.append(ASCIIToUTF16("\tKEY_WOW64_64KEY\n"));
      break;
    case WindowStationHandle:
      if (access & WINSTA_ACCESSCLIPBOARD)
        output.append(ASCIIToUTF16("\tWINSTA_ACCESSCLIPBOARD\n"));
      if (access & WINSTA_ACCESSGLOBALATOMS)
        output.append(ASCIIToUTF16("\tWINSTA_ACCESSGLOBALATOMS\n"));
      if (access & WINSTA_CREATEDESKTOP)
        output.append(ASCIIToUTF16("\tWINSTA_CREATEDESKTOP\n"));
      if (access & WINSTA_ENUMDESKTOPS)
        output.append(ASCIIToUTF16("\tWINSTA_ENUMDESKTOPS\n"));
      if (access & WINSTA_ENUMERATE)
        output.append(ASCIIToUTF16("\tWINSTA_ENUMERATE\n"));
      if (access & WINSTA_EXITWINDOWS)
        output.append(ASCIIToUTF16("\tWINSTA_EXITWINDOWS\n"));
      if (access & WINSTA_READATTRIBUTES)
        output.append(ASCIIToUTF16("\tWINSTA_READATTRIBUTES\n"));
      if (access & WINSTA_READSCREEN)
        output.append(ASCIIToUTF16("\tWINSTA_READSCREEN\n"));
      if (access & WINSTA_WRITEATTRIBUTES)
        output.append(ASCIIToUTF16("\tWINSTA_WRITEATTRIBUTES\n"));
      break;
    case DesktopHandle:
      if (access & DESKTOP_CREATEMENU)
        output.append(ASCIIToUTF16("\tDESKTOP_CREATEMENU\n"));
      if (access & DESKTOP_CREATEWINDOW)
        output.append(ASCIIToUTF16("\tDESKTOP_CREATEWINDOW\n"));
      if (access & DESKTOP_ENUMERATE)
        output.append(ASCIIToUTF16("\tDESKTOP_ENUMERATE\n"));
      if (access & DESKTOP_HOOKCONTROL)
        output.append(ASCIIToUTF16("\tDESKTOP_HOOKCONTROL\n"));
      if (access & DESKTOP_JOURNALPLAYBACK)
        output.append(ASCIIToUTF16("\tDESKTOP_JOURNALPLAYBACK\n"));
      if (access & DESKTOP_JOURNALRECORD)
        output.append(ASCIIToUTF16("\tDESKTOP_JOURNALRECORD\n"));
      if (access & DESKTOP_READOBJECTS)
        output.append(ASCIIToUTF16("\tDESKTOP_READOBJECTS\n"));
      if (access & DESKTOP_SWITCHDESKTOP)
        output.append(ASCIIToUTF16("\tDESKTOP_SWITCHDESKTOP\n"));
      if (access & DESKTOP_WRITEOBJECTS)
        output.append(ASCIIToUTF16("\tDESKTOP_WRITEOBJECTS\n"));
      break;
    case ServiceHandle:
      if (access & SC_MANAGER_CREATE_SERVICE)
        output.append(ASCIIToUTF16("\tSC_MANAGER_CREATE_SERVICE\n"));
      if (access & SC_MANAGER_CONNECT)
        output.append(ASCIIToUTF16("\tSC_MANAGER_CONNECT\n"));
      if (access & SC_MANAGER_ENUMERATE_SERVICE )
        output.append(ASCIIToUTF16("\tSC_MANAGER_ENUMERATE_SERVICE\n"));
      if (access & SC_MANAGER_LOCK)
        output.append(ASCIIToUTF16("\tSC_MANAGER_LOCK\n"));
      if (access & SC_MANAGER_MODIFY_BOOT_CONFIG )
        output.append(ASCIIToUTF16("\tSC_MANAGER_MODIFY_BOOT_CONFIG\n"));
      if (access & SC_MANAGER_QUERY_LOCK_STATUS )
        output.append(ASCIIToUTF16("\tSC_MANAGER_QUERY_LOCK_STATUS\n"));
      break;
    case EventHandle:
      if (access & EVENT_MODIFY_STATE)
        output.append(ASCIIToUTF16("\tEVENT_MODIFY_STATE\n"));
      break;
    case MutexHandle:
      if (access & MUTEX_MODIFY_STATE)
        output.append(ASCIIToUTF16("\tMUTEX_MODIFY_STATE\n"));
      break;
    case SemaphoreHandle:
      if (access & SEMAPHORE_MODIFY_STATE)
        output.append(ASCIIToUTF16("\tSEMAPHORE_MODIFY_STATE\n"));
      break;
    case TimerHandle:
      if (access & TIMER_MODIFY_STATE)
        output.append(ASCIIToUTF16("\tTIMER_MODIFY_STATE\n"));
      if (access & TIMER_QUERY_STATE)
        output.append(ASCIIToUTF16("\tTIMER_QUERY_STATE\n"));
      break;
    case NamedPipeHandle:
      if (access & PIPE_ACCESS_INBOUND)
        output.append(ASCIIToUTF16("\tPIPE_ACCESS_INBOUND\n"));
      if (access & PIPE_ACCESS_OUTBOUND)
        output.append(ASCIIToUTF16("\tPIPE_ACCESS_OUTBOUND\n"));
      break;
    case JobHandle:
      if (access & JOB_OBJECT_ASSIGN_PROCESS)
        output.append(ASCIIToUTF16("\tJOB_OBJECT_ASSIGN_PROCESS\n"));
      if (access & JOB_OBJECT_QUERY)
        output.append(ASCIIToUTF16("\tJOB_OBJECT_QUERY\n"));
      if (access & JOB_OBJECT_SET_ATTRIBUTES)
        output.append(ASCIIToUTF16("\tJOB_OBJECT_SET_ATTRIBUTES\n"));
      if (access & JOB_OBJECT_SET_SECURITY_ATTRIBUTES)
        output.append(ASCIIToUTF16("\tJOB_OBJECT_SET_SECURITY_ATTRIBUTES\n"));
      if (access & JOB_OBJECT_TERMINATE)
        output.append(ASCIIToUTF16("\tJOB_OBJECT_TERMINATE\n"));
      break;
    case FileMapHandle:
      if (access & FILE_MAP_EXECUTE)
        output.append(ASCIIToUTF16("\tFILE_MAP_EXECUTE\n"));
      if (access & FILE_MAP_READ)
        output.append(ASCIIToUTF16("\tFILE_MAP_READ\n"));
      if (access & FILE_MAP_WRITE)
        output.append(ASCIIToUTF16("\tFILE_MAP_WRITE\n"));
      break;
  }
  return output;
}

}  // namespace content
