Index: sandbox/win/sandbox_poc/sandbox.cc |
diff --git a/sandbox/win/sandbox_poc/sandbox.cc b/sandbox/win/sandbox_poc/sandbox.cc |
deleted file mode 100644 |
index 88757ef6846d5e14508fae1b3ac8ba5d1e431300..0000000000000000000000000000000000000000 |
--- a/sandbox/win/sandbox_poc/sandbox.cc |
+++ /dev/null |
@@ -1,184 +0,0 @@ |
-// Copyright (c) 2006-2010 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 "sandbox/win/sandbox_poc/sandbox.h" |
- |
-#include <windows.h> |
-#include <tchar.h> |
-#include <shellapi.h> |
- |
-#include <string> |
- |
-#include "base/logging.h" |
-#include "sandbox/win/sandbox_poc/main_ui_window.h" |
-#include "sandbox/win/src/sandbox.h" |
-#include "sandbox/win/src/sandbox_factory.h" |
- |
-// Prototype allowed for functions to be called in the POC |
-typedef void(__cdecl *lpfnInit)(HANDLE); |
- |
-bool ParseCommandLine(wchar_t * command_line, |
- std::string * dll_name, |
- std::string * entry_point, |
- base::string16 * log_file) { |
- DCHECK(dll_name); |
- DCHECK(entry_point); |
- DCHECK(log_file); |
- if (!dll_name || !entry_point || !log_file) |
- return false; |
- |
- LPWSTR* arg_list; |
- int arg_count; |
- |
- // We expect the command line to contain: EntryPointName "DLLPath" "LogPath" |
- // NOTE: Double quotes are required, even if long path name not used |
- // NOTE: LogPath can be blank, but still requires the double quotes |
- arg_list = CommandLineToArgvW(command_line, &arg_count); |
- if (NULL == arg_list || arg_count < 4) { |
- return false; |
- } |
- |
- base::string16 entry_point_wide = arg_list[1]; |
- base::string16 dll_name_wide = arg_list[2]; |
- *entry_point = std::string(entry_point_wide.begin(), entry_point_wide.end()); |
- *dll_name = std::string(dll_name_wide.begin(), dll_name_wide.end()); |
- *log_file = arg_list[3]; |
- |
- // Free memory allocated for CommandLineToArgvW arguments. |
- LocalFree(arg_list); |
- |
- return true; |
-} |
- |
-int APIENTRY _tWinMain(HINSTANCE instance, HINSTANCE, wchar_t* command_line, |
- int show_command) { |
- sandbox::BrokerServices* broker_service = |
- sandbox::SandboxFactory::GetBrokerServices(); |
- sandbox::ResultCode result; |
- |
- // This application starts as the broker; an application with a UI that |
- // spawns an instance of itself (called a 'target') inside the sandbox. |
- // Before spawning a hidden instance of itself, the application will have |
- // asked the user which DLL the spawned instance should load and passes |
- // that as command line argument to the spawned instance. |
- // |
- // We check here to see if we can retrieve a pointer to the BrokerServices, |
- // which is not possible if we are running inside the sandbox under a |
- // restricted token so it also tells us which mode we are in. If we can |
- // retrieve the pointer, then we are the broker, otherwise we are the target |
- // that the broker launched. |
- if (NULL != broker_service) { |
- // Yes, we are the broker so we need to initialize and show the UI |
- if (0 != (result = broker_service->Init())) { |
- ::MessageBox(NULL, L"Failed to initialize the BrokerServices object", |
- L"Error during initialization", MB_ICONERROR); |
- return 1; |
- } |
- |
- wchar_t exe_name[MAX_PATH]; |
- if (0 == GetModuleFileName(NULL, exe_name, MAX_PATH - 1)) { |
- ::MessageBox(NULL, L"Failed to get name of current EXE", |
- L"Error during initialization", MB_ICONERROR); |
- return 1; |
- } |
- |
- // The CreateMainWindowAndLoop() call will not return until the user closes |
- // the application window (or selects File\Exit). |
- MainUIWindow window; |
- window.CreateMainWindowAndLoop(instance, |
- exe_name, |
- show_command, |
- broker_service); |
- |
- |
- // Cannot exit until we have cleaned up after all the targets we have |
- // created |
- broker_service->WaitForAllTargets(); |
- } else { |
- // This is an instance that has been spawned inside the sandbox by the |
- // broker, so we need to parse the command line to figure out which DLL to |
- // load and what entry point to call |
- sandbox::TargetServices* target_service |
- = sandbox::SandboxFactory::GetTargetServices(); |
- |
- if (NULL == target_service) { |
- // TODO(finnur): write the failure to the log file |
- // We cannot display messageboxes inside the sandbox unless access to |
- // the desktop handle has been granted to us, and we don't have a |
- // console window to write to. Therefore we need to have the broker |
- // grant us access to a handle to a logfile and write the error that |
- // occurred into the log before continuing |
- return -1; |
- } |
- |
- // Debugging the spawned application can be tricky, because DebugBreak() |
- // and _asm int 3 cause the app to terminate (due to a flag in the job |
- // object), MessageBoxes() will not be displayed unless we have been granted |
- // that privilege and the target finishes its business so quickly we cannot |
- // attach to it quickly enough. Therefore, you can uncomment the |
- // following line and attach (w. msdev or windbg) as the target is sleeping |
- |
- // Sleep(10000); |
- |
- if (sandbox::SBOX_ALL_OK != (result = target_service->Init())) { |
- // TODO(finnur): write the initialization error to the log file |
- return -2; |
- } |
- |
- // Parse the command line to find out what we need to call |
- std::string dll_name, entry_point; |
- base::string16 log_file; |
- if (!ParseCommandLine(GetCommandLineW(), |
- &dll_name, |
- &entry_point, |
- &log_file)) { |
- // TODO(finnur): write the failure to the log file |
- return -3; |
- } |
- |
- // Open the pipe to transfert the log output |
- HANDLE pipe = ::CreateFile(log_file.c_str(), |
- GENERIC_WRITE, |
- FILE_SHARE_READ | FILE_SHARE_WRITE, |
- NULL, // Default security attributes. |
- CREATE_ALWAYS, |
- FILE_ATTRIBUTE_NORMAL, |
- NULL); // No template |
- |
- if (INVALID_HANDLE_VALUE == pipe) { |
- return -4; |
- } |
- |
- // We now know what we should load, so load it |
- HMODULE dll_module = ::LoadLibraryA(dll_name.c_str()); |
- if (dll_module == NULL) { |
- // TODO(finnur): write the failure to the log file |
- return -5; |
- } |
- |
- // Initialization is finished, so we can enter lock-down mode |
- target_service->LowerToken(); |
- |
- lpfnInit init_function = |
- (lpfnInit) ::GetProcAddress(dll_module, entry_point.c_str()); |
- |
- if (!init_function) { |
- // TODO(finnur): write the failure to the log file |
- ::FreeLibrary(dll_module); |
- CloseHandle(pipe); |
- return -6; |
- } |
- |
- // Transfer control to the entry point in the DLL requested |
- init_function(pipe); |
- |
- CloseHandle(pipe); |
- Sleep(1000); // Give a change to the debug output to arrive before the |
- // end of the process |
- |
- ::FreeLibrary(dll_module); |
- } |
- |
- return 0; |
-} |