Index: sandbox/win/tests/validation_tests/commands.cc |
diff --git a/sandbox/win/tests/validation_tests/commands.cc b/sandbox/win/tests/validation_tests/commands.cc |
deleted file mode 100644 |
index f0c882871529ba2e98f484491e7f1fc928928953..0000000000000000000000000000000000000000 |
--- a/sandbox/win/tests/validation_tests/commands.cc |
+++ /dev/null |
@@ -1,290 +0,0 @@ |
-// Copyright (c) 2012 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 <Aclapi.h> |
-#include <windows.h> |
-#include <stddef.h> |
-#include <string> |
- |
-#include "sandbox/win/tests/validation_tests/commands.h" |
- |
-#include "sandbox/win/tests/common/controller.h" |
- |
-namespace { |
- |
-// Returns the HKEY corresponding to name. If there is no HKEY corresponding |
-// to the name it returns NULL. |
-HKEY GetHKEYFromString(const base::string16 &name) { |
- if (name == L"HKLM") |
- return HKEY_LOCAL_MACHINE; |
- if (name == L"HKCR") |
- return HKEY_CLASSES_ROOT; |
- if (name == L"HKCC") |
- return HKEY_CURRENT_CONFIG; |
- if (name == L"HKCU") |
- return HKEY_CURRENT_USER; |
- if (name == L"HKU") |
- return HKEY_USERS; |
- |
- return NULL; |
-} |
- |
-// Modifies string to remove the leading and trailing quotes. |
-void trim_quote(base::string16* string) { |
- base::string16::size_type pos1 = string->find_first_not_of(L'"'); |
- base::string16::size_type pos2 = string->find_last_not_of(L'"'); |
- |
- if (pos1 == base::string16::npos || pos2 == base::string16::npos) |
- string->clear(); |
- else |
- (*string) = string->substr(pos1, pos2 + 1); |
-} |
- |
-int TestOpenFile(base::string16 path, bool for_write) { |
- wchar_t path_expanded[MAX_PATH + 1] = {0}; |
- DWORD size = ::ExpandEnvironmentStrings(path.c_str(), path_expanded, |
- MAX_PATH); |
- if (!size) |
- return sandbox::SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; |
- |
- HANDLE file; |
- file = ::CreateFile(path_expanded, |
- for_write ? GENERIC_READ | GENERIC_WRITE : GENERIC_READ, |
- FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, |
- NULL, // No security attributes. |
- OPEN_EXISTING, |
- FILE_FLAG_BACKUP_SEMANTICS, |
- NULL); // No template. |
- |
- if (file != INVALID_HANDLE_VALUE) { |
- ::CloseHandle(file); |
- return sandbox::SBOX_TEST_SUCCEEDED; |
- } |
- return (::GetLastError() == ERROR_ACCESS_DENIED) ? |
- sandbox::SBOX_TEST_DENIED : sandbox::SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; |
-} |
- |
-} // namespace |
- |
-namespace sandbox { |
- |
-SBOX_TESTS_COMMAND int ValidWindow(int argc, wchar_t **argv) { |
- return (argc == 1) ? |
- TestValidWindow( |
- reinterpret_cast<HWND>(static_cast<ULONG_PTR>(_wtoi(argv[0])))) : |
- SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; |
-} |
- |
-int TestValidWindow(HWND window) { |
- return ::IsWindow(window) ? SBOX_TEST_SUCCEEDED : SBOX_TEST_DENIED; |
-} |
- |
-SBOX_TESTS_COMMAND int OpenProcessCmd(int argc, wchar_t **argv) { |
- return (argc == 2) ? |
- TestOpenProcess(_wtol(argv[0]), _wtol(argv[1])) : |
- SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; |
-} |
- |
-int TestOpenProcess(DWORD process_id, DWORD access_mask) { |
- HANDLE process = ::OpenProcess(access_mask, |
- FALSE, // Do not inherit handle. |
- process_id); |
- if (process != NULL) { |
- ::CloseHandle(process); |
- return SBOX_TEST_SUCCEEDED; |
- } |
- return (::GetLastError() == ERROR_ACCESS_DENIED) ? |
- sandbox::SBOX_TEST_DENIED : sandbox::SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; |
-} |
- |
-SBOX_TESTS_COMMAND int OpenThreadCmd(int argc, wchar_t **argv) { |
- return (argc == 1) ? |
- TestOpenThread(_wtoi(argv[0])) : SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; |
-} |
- |
-int TestOpenThread(DWORD thread_id) { |
- HANDLE thread = ::OpenThread(THREAD_QUERY_INFORMATION, |
- FALSE, // Do not inherit handles. |
- thread_id); |
- if (thread != NULL) { |
- ::CloseHandle(thread); |
- return SBOX_TEST_SUCCEEDED; |
- } |
- return (::GetLastError() == ERROR_ACCESS_DENIED) ? |
- sandbox::SBOX_TEST_DENIED : sandbox::SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; |
-} |
- |
-SBOX_TESTS_COMMAND int OpenFileCmd(int argc, wchar_t **argv) { |
- if (1 != argc) |
- return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; |
- |
- base::string16 path = argv[0]; |
- trim_quote(&path); |
- |
- return TestOpenReadFile(path); |
-} |
- |
-int TestOpenReadFile(const base::string16& path) { |
- return TestOpenFile(path, false); |
-} |
- |
-int TestOpenWriteFile(int argc, wchar_t **argv) { |
- if (argc != 1) |
- return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; |
- |
- base::string16 path = argv[0]; |
- trim_quote(&path); |
- return TestOpenWriteFile(path); |
-} |
- |
-int TestOpenWriteFile(const base::string16& path) { |
- return TestOpenFile(path, true); |
-} |
- |
-SBOX_TESTS_COMMAND int OpenKey(int argc, wchar_t **argv) { |
- if (argc != 1 && argc != 2) |
- return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; |
- |
- // Get the hive. |
- HKEY base_key = GetHKEYFromString(argv[0]); |
- |
- // Get the subkey. |
- base::string16 subkey; |
- if (argc == 2) { |
- subkey = argv[1]; |
- trim_quote(&subkey); |
- } |
- |
- return TestOpenKey(base_key, subkey); |
-} |
- |
-int TestOpenKey(HKEY base_key, base::string16 subkey) { |
- HKEY key; |
- LONG err_code = ::RegOpenKeyEx(base_key, |
- subkey.c_str(), |
- 0, // Reserved, must be 0. |
- MAXIMUM_ALLOWED, |
- &key); |
- if (err_code == ERROR_SUCCESS) { |
- ::RegCloseKey(key); |
- return SBOX_TEST_SUCCEEDED; |
- } |
- return (err_code == ERROR_INVALID_HANDLE || err_code == ERROR_ACCESS_DENIED) ? |
- SBOX_TEST_DENIED : SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; |
-} |
- |
-// Returns true if the current's thread desktop is the interactive desktop. |
-// In Vista there is a more direct test but for XP and w2k we need to check |
-// the object name. |
-bool IsInteractiveDesktop(bool* is_interactive) { |
- HDESK current_desk = ::GetThreadDesktop(::GetCurrentThreadId()); |
- if (current_desk == NULL) |
- return false; |
- wchar_t current_desk_name[256] = {0}; |
- if (!::GetUserObjectInformationW(current_desk, UOI_NAME, current_desk_name, |
- sizeof(current_desk_name), NULL)) |
- return false; |
- *is_interactive = (0 == _wcsicmp(L"default", current_desk_name)); |
- return true; |
-} |
- |
-SBOX_TESTS_COMMAND int OpenInteractiveDesktop(int, wchar_t **) { |
- return TestOpenInputDesktop(); |
-} |
- |
-int TestOpenInputDesktop() { |
- bool is_interactive = false; |
- if (IsInteractiveDesktop(&is_interactive) && is_interactive) |
- return SBOX_TEST_SUCCEEDED; |
- HDESK desk = ::OpenInputDesktop(0, FALSE, DESKTOP_CREATEWINDOW); |
- if (desk) { |
- ::CloseDesktop(desk); |
- return SBOX_TEST_SUCCEEDED; |
- } |
- return SBOX_TEST_DENIED; |
-} |
- |
-SBOX_TESTS_COMMAND int SwitchToSboxDesktop(int, wchar_t **) { |
- return TestSwitchDesktop(); |
-} |
- |
-int TestSwitchDesktop() { |
- HDESK desktop = ::GetThreadDesktop(::GetCurrentThreadId()); |
- if (desktop == NULL) |
- return SBOX_TEST_FAILED; |
- return ::SwitchDesktop(desktop) ? SBOX_TEST_SUCCEEDED : SBOX_TEST_DENIED; |
-} |
- |
-SBOX_TESTS_COMMAND int OpenAlternateDesktop(int, wchar_t **argv) { |
- return TestOpenAlternateDesktop(argv[0]); |
-} |
- |
-int TestOpenAlternateDesktop(wchar_t *desktop_name) { |
- // Test for WRITE_DAC permission on the handle. |
- HDESK desktop = ::GetThreadDesktop(::GetCurrentThreadId()); |
- if (desktop) { |
- HANDLE test_handle; |
- if (::DuplicateHandle(::GetCurrentProcess(), desktop, |
- ::GetCurrentProcess(), &test_handle, |
- WRITE_DAC, FALSE, 0)) { |
- DWORD result = ::SetSecurityInfo(test_handle, SE_WINDOW_OBJECT, |
- DACL_SECURITY_INFORMATION, NULL, NULL, |
- NULL, NULL); |
- ::CloseHandle(test_handle); |
- if (result == ERROR_SUCCESS) |
- return SBOX_TEST_SUCCEEDED; |
- } else if (::GetLastError() != ERROR_ACCESS_DENIED) { |
- return SBOX_TEST_FAILED; |
- } |
- } |
- |
- // Open by name with WRITE_DAC. |
- desktop = ::OpenDesktop(desktop_name, 0, FALSE, WRITE_DAC); |
- if (!desktop && ::GetLastError() == ERROR_ACCESS_DENIED) |
- return SBOX_TEST_DENIED; |
- ::CloseDesktop(desktop); |
- return SBOX_TEST_SUCCEEDED; |
-} |
- |
-BOOL CALLBACK DesktopTestEnumProc(LPTSTR desktop_name, LPARAM result) { |
- return TRUE; |
-} |
- |
-SBOX_TESTS_COMMAND int EnumAlternateWinsta(int, wchar_t **) { |
- return TestEnumAlternateWinsta(); |
-} |
- |
-int TestEnumAlternateWinsta() { |
- // Try to enumerate the destops on the alternate windowstation. |
- return ::EnumDesktopsW(NULL, DesktopTestEnumProc, 0) ? |
- SBOX_TEST_SUCCEEDED : SBOX_TEST_DENIED; |
-} |
- |
-SBOX_TESTS_COMMAND int SleepCmd(int argc, wchar_t **argv) { |
- if (argc != 1) |
- return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; |
- |
- ::Sleep(_wtoi(argv[0])); |
- return SBOX_TEST_SUCCEEDED; |
-} |
- |
-SBOX_TESTS_COMMAND int AllocateCmd(int argc, wchar_t **argv) { |
- if (argc != 1) |
- return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; |
- |
- size_t mem_size = static_cast<size_t>(_wtoll(argv[0])); |
- void* memory = ::VirtualAlloc(NULL, mem_size, MEM_COMMIT | MEM_RESERVE, |
- PAGE_READWRITE); |
- if (!memory) { |
- // We need to give the broker a chance to kill our process on failure. |
- ::Sleep(5000); |
- return SBOX_TEST_DENIED; |
- } |
- |
- return ::VirtualFree(memory, 0, MEM_RELEASE) ? |
- SBOX_TEST_SUCCEEDED : SBOX_TEST_FAILED; |
-} |
- |
- |
-} // namespace sandbox |