Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(46)

Side by Side Diff: sandbox/tests/validation_tests/commands.cc

Issue 10783004: Move Windows Sandbox, trybots version (don't commit me!) (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase to top of tree Created 8 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include <windows.h>
6 #include <string>
7
8 #include "sandbox/tests/validation_tests/commands.h"
9
10 #include "sandbox/tests/common/controller.h"
11
12 namespace {
13
14 // Returns the HKEY corresponding to name. If there is no HKEY corresponding
15 // to the name it returns NULL.
16 HKEY GetHKEYFromString(const std::wstring &name) {
17 if (L"HKLM" == name)
18 return HKEY_LOCAL_MACHINE;
19 else if (L"HKCR" == name)
20 return HKEY_CLASSES_ROOT;
21 else if (L"HKCC" == name)
22 return HKEY_CURRENT_CONFIG;
23 else if (L"HKCU" == name)
24 return HKEY_CURRENT_USER;
25 else if (L"HKU" == name)
26 return HKEY_USERS;
27
28 return NULL;
29 }
30
31 // Modifies string to remove the leading and trailing quotes.
32 void trim_quote(std::wstring* string) {
33 std::wstring::size_type pos1 = string->find_first_not_of(L'"');
34 std::wstring::size_type pos2 = string->find_last_not_of(L'"');
35
36 if (std::wstring::npos == pos1 || std::wstring::npos == pos2)
37 (*string) = L"";
38 else
39 (*string) = string->substr(pos1, pos2 + 1);
40 }
41
42 int TestOpenFile(std::wstring path, bool for_write) {
43 wchar_t path_expanded[MAX_PATH + 1] = {0};
44 DWORD size = ::ExpandEnvironmentStrings(path.c_str(), path_expanded,
45 MAX_PATH);
46 if (!size)
47 return sandbox::SBOX_TEST_FAILED_TO_EXECUTE_COMMAND;
48
49 HANDLE file;
50 file = ::CreateFile(path_expanded,
51 for_write ? GENERIC_READ | GENERIC_WRITE : GENERIC_READ,
52 FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
53 NULL, // No security attributes.
54 OPEN_EXISTING,
55 FILE_FLAG_BACKUP_SEMANTICS,
56 NULL); // No template.
57
58 if (INVALID_HANDLE_VALUE != file) {
59 ::CloseHandle(file);
60 return sandbox::SBOX_TEST_SUCCEEDED;
61 } else {
62 if (ERROR_ACCESS_DENIED == ::GetLastError()) {
63 return sandbox::SBOX_TEST_DENIED;
64 } else {
65 return sandbox::SBOX_TEST_FAILED_TO_EXECUTE_COMMAND;
66 }
67 }
68 }
69
70 } // namespace
71
72 namespace sandbox {
73
74 SBOX_TESTS_COMMAND int ValidWindow(int argc, wchar_t **argv) {
75 if (1 != argc)
76 return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND;
77
78 HWND window = reinterpret_cast<HWND>(static_cast<ULONG_PTR>(_wtoi(argv[0])));
79
80 return TestValidWindow(window);
81 }
82
83 int TestValidWindow(HWND window) {
84 if (::IsWindow(window))
85 return SBOX_TEST_SUCCEEDED;
86
87 return SBOX_TEST_DENIED;
88 }
89
90 SBOX_TESTS_COMMAND int OpenProcessCmd(int argc, wchar_t **argv) {
91 if (2 != argc)
92 return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND;
93
94 DWORD process_id = _wtol(argv[0]);
95 DWORD access_mask = _wtol(argv[1]);
96 return TestOpenProcess(process_id, access_mask);
97 }
98
99 int TestOpenProcess(DWORD process_id, DWORD access_mask) {
100 HANDLE process = ::OpenProcess(access_mask,
101 FALSE, // Do not inherit handle.
102 process_id);
103 if (NULL == process) {
104 if (ERROR_ACCESS_DENIED == ::GetLastError()) {
105 return SBOX_TEST_DENIED;
106 } else {
107 return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND;
108 }
109 } else {
110 ::CloseHandle(process);
111 return SBOX_TEST_SUCCEEDED;
112 }
113 }
114
115 SBOX_TESTS_COMMAND int OpenThreadCmd(int argc, wchar_t **argv) {
116 if (1 != argc)
117 return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND;
118
119 DWORD thread_id = _wtoi(argv[0]);
120 return TestOpenThread(thread_id);
121 }
122
123 int TestOpenThread(DWORD thread_id) {
124
125 HANDLE thread = ::OpenThread(THREAD_QUERY_INFORMATION,
126 FALSE, // Do not inherit handles.
127 thread_id);
128
129 if (NULL == thread) {
130 if (ERROR_ACCESS_DENIED == ::GetLastError()) {
131 return SBOX_TEST_DENIED;
132 } else {
133 return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND;
134 }
135 } else {
136 ::CloseHandle(thread);
137 return SBOX_TEST_SUCCEEDED;
138 }
139 }
140
141 SBOX_TESTS_COMMAND int OpenFile(int argc, wchar_t **argv) {
142 if (1 != argc)
143 return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND;
144
145 std::wstring path = argv[0];
146 trim_quote(&path);
147
148 return TestOpenReadFile(path);
149 }
150
151 int TestOpenReadFile(const std::wstring& path) {
152 return TestOpenFile(path, false);
153 }
154
155 int TestOpenWriteFile(int argc, wchar_t **argv) {
156 if (1 != argc)
157 return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND;
158
159 std::wstring path = argv[0];
160 trim_quote(&path);
161
162 return TestOpenWriteFile(path);
163 }
164
165 int TestOpenWriteFile(const std::wstring& path) {
166 return TestOpenFile(path, true);
167 }
168
169 SBOX_TESTS_COMMAND int OpenKey(int argc, wchar_t **argv) {
170 if (0 == argc || argc > 2)
171 return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND;
172
173 // Get the hive.
174 HKEY base_key = GetHKEYFromString(argv[0]);
175
176 // Get the subkey.
177 std::wstring subkey;
178 if (2 == argc) {
179 subkey = argv[1];
180 trim_quote(&subkey);
181 }
182
183 return TestOpenKey(base_key, subkey);
184 }
185
186 int TestOpenKey(HKEY base_key, std::wstring subkey) {
187 HKEY key;
188 LONG err_code = ::RegOpenKeyEx(base_key,
189 subkey.c_str(),
190 0, // Reserved, must be 0.
191 MAXIMUM_ALLOWED,
192 &key);
193 if (ERROR_SUCCESS == err_code) {
194 ::RegCloseKey(key);
195 return SBOX_TEST_SUCCEEDED;
196 } else if (ERROR_INVALID_HANDLE == err_code ||
197 ERROR_ACCESS_DENIED == err_code) {
198 return SBOX_TEST_DENIED;
199 } else {
200 return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND;
201 }
202 }
203
204 // Returns true if the current's thread desktop is the interactive desktop.
205 // In Vista there is a more direct test but for XP and w2k we need to check
206 // the object name.
207 bool IsInteractiveDesktop(bool* is_interactive) {
208 HDESK current_desk = ::GetThreadDesktop(::GetCurrentThreadId());
209 if (NULL == current_desk) {
210 return false;
211 }
212 wchar_t current_desk_name[256] = {0};
213 if (!::GetUserObjectInformationW(current_desk, UOI_NAME, current_desk_name,
214 sizeof(current_desk_name), NULL)) {
215 return false;
216 }
217 *is_interactive = (0 == _wcsicmp(L"default", current_desk_name));
218 return true;
219 }
220
221 SBOX_TESTS_COMMAND int OpenInteractiveDesktop(int, wchar_t **) {
222 return TestOpenInputDesktop();
223 }
224
225 int TestOpenInputDesktop() {
226 bool is_interactive = false;
227 if (IsInteractiveDesktop(&is_interactive) && is_interactive) {
228 return SBOX_TEST_SUCCEEDED;
229 }
230 HDESK desk = ::OpenInputDesktop(0, FALSE, DESKTOP_CREATEWINDOW);
231 if (desk) {
232 ::CloseDesktop(desk);
233 return SBOX_TEST_SUCCEEDED;
234 }
235 return SBOX_TEST_DENIED;
236 }
237
238 SBOX_TESTS_COMMAND int SwitchToSboxDesktop(int, wchar_t **) {
239 return TestSwitchDesktop();
240 }
241
242 int TestSwitchDesktop() {
243 HDESK sbox_desk = ::GetThreadDesktop(::GetCurrentThreadId());
244 if (NULL == sbox_desk) {
245 return SBOX_TEST_FAILED;
246 }
247 if (::SwitchDesktop(sbox_desk)) {
248 return SBOX_TEST_SUCCEEDED;
249 }
250 return SBOX_TEST_DENIED;
251 }
252
253 SBOX_TESTS_COMMAND int SleepCmd(int argc, wchar_t **argv) {
254 if (1 != argc)
255 return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND;
256
257 ::Sleep(_wtoi(argv[0]));
258 return SBOX_TEST_SUCCEEDED;
259 }
260
261
262 } // namespace sandbox
OLDNEW
« no previous file with comments | « sandbox/tests/validation_tests/commands.h ('k') | sandbox/tests/validation_tests/sbox_validation_tests.vcproj » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698