| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <Aclapi.h> | 5 #include <Aclapi.h> |
| 6 #include <windows.h> | 6 #include <windows.h> |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "sandbox/win/tests/validation_tests/commands.h" | 9 #include "sandbox/win/tests/validation_tests/commands.h" |
| 10 | 10 |
| 11 #include "sandbox/win/tests/common/controller.h" | 11 #include "sandbox/win/tests/common/controller.h" |
| 12 | 12 |
| 13 namespace { | 13 namespace { |
| 14 | 14 |
| 15 // Returns the HKEY corresponding to name. If there is no HKEY corresponding | 15 // Returns the HKEY corresponding to name. If there is no HKEY corresponding |
| 16 // to the name it returns NULL. | 16 // to the name it returns NULL. |
| 17 HKEY GetHKEYFromString(const base::string16 &name) { | 17 HKEY GetHKEYFromString(const base::string16 &name) { |
| 18 if (L"HKLM" == name) | 18 if (name == L"HKLM") |
| 19 return HKEY_LOCAL_MACHINE; | 19 return HKEY_LOCAL_MACHINE; |
| 20 else if (L"HKCR" == name) | 20 if (name == L"HKCR") |
| 21 return HKEY_CLASSES_ROOT; | 21 return HKEY_CLASSES_ROOT; |
| 22 else if (L"HKCC" == name) | 22 if (name == L"HKCC") |
| 23 return HKEY_CURRENT_CONFIG; | 23 return HKEY_CURRENT_CONFIG; |
| 24 else if (L"HKCU" == name) | 24 if (name == L"HKCU") |
| 25 return HKEY_CURRENT_USER; | 25 return HKEY_CURRENT_USER; |
| 26 else if (L"HKU" == name) | 26 if (name == L"HKU") |
| 27 return HKEY_USERS; | 27 return HKEY_USERS; |
| 28 | 28 |
| 29 return NULL; | 29 return NULL; |
| 30 } | 30 } |
| 31 | 31 |
| 32 // Modifies string to remove the leading and trailing quotes. | 32 // Modifies string to remove the leading and trailing quotes. |
| 33 void trim_quote(base::string16* string) { | 33 void trim_quote(base::string16* string) { |
| 34 base::string16::size_type pos1 = string->find_first_not_of(L'"'); | 34 base::string16::size_type pos1 = string->find_first_not_of(L'"'); |
| 35 base::string16::size_type pos2 = string->find_last_not_of(L'"'); | 35 base::string16::size_type pos2 = string->find_last_not_of(L'"'); |
| 36 | 36 |
| 37 if (base::string16::npos == pos1 || base::string16::npos == pos2) | 37 if (pos1 == base::string16::npos || pos2 == base::string16::npos) |
| 38 (*string) = L""; | 38 string->clear(); |
| 39 else | 39 else |
| 40 (*string) = string->substr(pos1, pos2 + 1); | 40 (*string) = string->substr(pos1, pos2 + 1); |
| 41 } | 41 } |
| 42 | 42 |
| 43 int TestOpenFile(base::string16 path, bool for_write) { | 43 int TestOpenFile(base::string16 path, bool for_write) { |
| 44 wchar_t path_expanded[MAX_PATH + 1] = {0}; | 44 wchar_t path_expanded[MAX_PATH + 1] = {0}; |
| 45 DWORD size = ::ExpandEnvironmentStrings(path.c_str(), path_expanded, | 45 DWORD size = ::ExpandEnvironmentStrings(path.c_str(), path_expanded, |
| 46 MAX_PATH); | 46 MAX_PATH); |
| 47 if (!size) | 47 if (!size) |
| 48 return sandbox::SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; | 48 return sandbox::SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; |
| 49 | 49 |
| 50 HANDLE file; | 50 HANDLE file; |
| 51 file = ::CreateFile(path_expanded, | 51 file = ::CreateFile(path_expanded, |
| 52 for_write ? GENERIC_READ | GENERIC_WRITE : GENERIC_READ, | 52 for_write ? GENERIC_READ | GENERIC_WRITE : GENERIC_READ, |
| 53 FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, | 53 FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, |
| 54 NULL, // No security attributes. | 54 NULL, // No security attributes. |
| 55 OPEN_EXISTING, | 55 OPEN_EXISTING, |
| 56 FILE_FLAG_BACKUP_SEMANTICS, | 56 FILE_FLAG_BACKUP_SEMANTICS, |
| 57 NULL); // No template. | 57 NULL); // No template. |
| 58 | 58 |
| 59 if (INVALID_HANDLE_VALUE != file) { | 59 if (file != INVALID_HANDLE_VALUE) { |
| 60 ::CloseHandle(file); | 60 ::CloseHandle(file); |
| 61 return sandbox::SBOX_TEST_SUCCEEDED; | 61 return sandbox::SBOX_TEST_SUCCEEDED; |
| 62 } else { | |
| 63 if (ERROR_ACCESS_DENIED == ::GetLastError()) { | |
| 64 return sandbox::SBOX_TEST_DENIED; | |
| 65 } else { | |
| 66 return sandbox::SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; | |
| 67 } | |
| 68 } | 62 } |
| 63 return (::GetLastError() == ERROR_ACCESS_DENIED) ? |
| 64 sandbox::SBOX_TEST_DENIED : sandbox::SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; |
| 69 } | 65 } |
| 70 | 66 |
| 71 } // namespace | 67 } // namespace |
| 72 | 68 |
| 73 namespace sandbox { | 69 namespace sandbox { |
| 74 | 70 |
| 75 SBOX_TESTS_COMMAND int ValidWindow(int argc, wchar_t **argv) { | 71 SBOX_TESTS_COMMAND int ValidWindow(int argc, wchar_t **argv) { |
| 76 if (1 != argc) | 72 return (argc == 1) ? |
| 77 return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; | 73 TestValidWindow( |
| 78 | 74 reinterpret_cast<HWND>(static_cast<ULONG_PTR>(_wtoi(argv[0])))) : |
| 79 HWND window = reinterpret_cast<HWND>(static_cast<ULONG_PTR>(_wtoi(argv[0]))); | 75 SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; |
| 80 | |
| 81 return TestValidWindow(window); | |
| 82 } | 76 } |
| 83 | 77 |
| 84 int TestValidWindow(HWND window) { | 78 int TestValidWindow(HWND window) { |
| 85 if (::IsWindow(window)) | 79 return ::IsWindow(window) ? SBOX_TEST_SUCCEEDED : SBOX_TEST_DENIED; |
| 86 return SBOX_TEST_SUCCEEDED; | |
| 87 | |
| 88 return SBOX_TEST_DENIED; | |
| 89 } | 80 } |
| 90 | 81 |
| 91 SBOX_TESTS_COMMAND int OpenProcessCmd(int argc, wchar_t **argv) { | 82 SBOX_TESTS_COMMAND int OpenProcessCmd(int argc, wchar_t **argv) { |
| 92 if (2 != argc) | 83 return (argc == 2) ? |
| 93 return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; | 84 TestOpenProcess(_wtol(argv[0]), _wtol(argv[1])) : |
| 94 | 85 SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; |
| 95 DWORD process_id = _wtol(argv[0]); | |
| 96 DWORD access_mask = _wtol(argv[1]); | |
| 97 return TestOpenProcess(process_id, access_mask); | |
| 98 } | 86 } |
| 99 | 87 |
| 100 int TestOpenProcess(DWORD process_id, DWORD access_mask) { | 88 int TestOpenProcess(DWORD process_id, DWORD access_mask) { |
| 101 HANDLE process = ::OpenProcess(access_mask, | 89 HANDLE process = ::OpenProcess(access_mask, |
| 102 FALSE, // Do not inherit handle. | 90 FALSE, // Do not inherit handle. |
| 103 process_id); | 91 process_id); |
| 104 if (NULL == process) { | 92 if (process != NULL) { |
| 105 if (ERROR_ACCESS_DENIED == ::GetLastError()) { | |
| 106 return SBOX_TEST_DENIED; | |
| 107 } else { | |
| 108 return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; | |
| 109 } | |
| 110 } else { | |
| 111 ::CloseHandle(process); | 93 ::CloseHandle(process); |
| 112 return SBOX_TEST_SUCCEEDED; | 94 return SBOX_TEST_SUCCEEDED; |
| 113 } | 95 } |
| 96 return (::GetLastError() == ERROR_ACCESS_DENIED) ? |
| 97 sandbox::SBOX_TEST_DENIED : sandbox::SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; |
| 114 } | 98 } |
| 115 | 99 |
| 116 SBOX_TESTS_COMMAND int OpenThreadCmd(int argc, wchar_t **argv) { | 100 SBOX_TESTS_COMMAND int OpenThreadCmd(int argc, wchar_t **argv) { |
| 117 if (1 != argc) | 101 return (argc == 1) ? |
| 118 return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; | 102 TestOpenThread(_wtoi(argv[0])) : SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; |
| 119 | |
| 120 DWORD thread_id = _wtoi(argv[0]); | |
| 121 return TestOpenThread(thread_id); | |
| 122 } | 103 } |
| 123 | 104 |
| 124 int TestOpenThread(DWORD thread_id) { | 105 int TestOpenThread(DWORD thread_id) { |
| 125 | |
| 126 HANDLE thread = ::OpenThread(THREAD_QUERY_INFORMATION, | 106 HANDLE thread = ::OpenThread(THREAD_QUERY_INFORMATION, |
| 127 FALSE, // Do not inherit handles. | 107 FALSE, // Do not inherit handles. |
| 128 thread_id); | 108 thread_id); |
| 129 | 109 if (thread != NULL) { |
| 130 if (NULL == thread) { | |
| 131 if (ERROR_ACCESS_DENIED == ::GetLastError()) { | |
| 132 return SBOX_TEST_DENIED; | |
| 133 } else { | |
| 134 return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; | |
| 135 } | |
| 136 } else { | |
| 137 ::CloseHandle(thread); | 110 ::CloseHandle(thread); |
| 138 return SBOX_TEST_SUCCEEDED; | 111 return SBOX_TEST_SUCCEEDED; |
| 139 } | 112 } |
| 113 return (::GetLastError() == ERROR_ACCESS_DENIED) ? |
| 114 sandbox::SBOX_TEST_DENIED : sandbox::SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; |
| 140 } | 115 } |
| 141 | 116 |
| 142 SBOX_TESTS_COMMAND int OpenFileCmd(int argc, wchar_t **argv) { | 117 SBOX_TESTS_COMMAND int OpenFileCmd(int argc, wchar_t **argv) { |
| 143 if (1 != argc) | 118 if (1 != argc) |
| 144 return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; | 119 return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; |
| 145 | 120 |
| 146 base::string16 path = argv[0]; | 121 base::string16 path = argv[0]; |
| 147 trim_quote(&path); | 122 trim_quote(&path); |
| 148 | 123 |
| 149 return TestOpenReadFile(path); | 124 return TestOpenReadFile(path); |
| 150 } | 125 } |
| 151 | 126 |
| 152 int TestOpenReadFile(const base::string16& path) { | 127 int TestOpenReadFile(const base::string16& path) { |
| 153 return TestOpenFile(path, false); | 128 return TestOpenFile(path, false); |
| 154 } | 129 } |
| 155 | 130 |
| 156 int TestOpenWriteFile(int argc, wchar_t **argv) { | 131 int TestOpenWriteFile(int argc, wchar_t **argv) { |
| 157 if (1 != argc) | 132 if (argc != 1) |
| 158 return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; | 133 return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; |
| 159 | 134 |
| 160 base::string16 path = argv[0]; | 135 base::string16 path = argv[0]; |
| 161 trim_quote(&path); | 136 trim_quote(&path); |
| 162 | |
| 163 return TestOpenWriteFile(path); | 137 return TestOpenWriteFile(path); |
| 164 } | 138 } |
| 165 | 139 |
| 166 int TestOpenWriteFile(const base::string16& path) { | 140 int TestOpenWriteFile(const base::string16& path) { |
| 167 return TestOpenFile(path, true); | 141 return TestOpenFile(path, true); |
| 168 } | 142 } |
| 169 | 143 |
| 170 SBOX_TESTS_COMMAND int OpenKey(int argc, wchar_t **argv) { | 144 SBOX_TESTS_COMMAND int OpenKey(int argc, wchar_t **argv) { |
| 171 if (0 == argc || argc > 2) | 145 if (argc != 1 && argc != 2) |
| 172 return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; | 146 return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; |
| 173 | 147 |
| 174 // Get the hive. | 148 // Get the hive. |
| 175 HKEY base_key = GetHKEYFromString(argv[0]); | 149 HKEY base_key = GetHKEYFromString(argv[0]); |
| 176 | 150 |
| 177 // Get the subkey. | 151 // Get the subkey. |
| 178 base::string16 subkey; | 152 base::string16 subkey; |
| 179 if (2 == argc) { | 153 if (argc == 2) { |
| 180 subkey = argv[1]; | 154 subkey = argv[1]; |
| 181 trim_quote(&subkey); | 155 trim_quote(&subkey); |
| 182 } | 156 } |
| 183 | 157 |
| 184 return TestOpenKey(base_key, subkey); | 158 return TestOpenKey(base_key, subkey); |
| 185 } | 159 } |
| 186 | 160 |
| 187 int TestOpenKey(HKEY base_key, base::string16 subkey) { | 161 int TestOpenKey(HKEY base_key, base::string16 subkey) { |
| 188 HKEY key; | 162 HKEY key; |
| 189 LONG err_code = ::RegOpenKeyEx(base_key, | 163 LONG err_code = ::RegOpenKeyEx(base_key, |
| 190 subkey.c_str(), | 164 subkey.c_str(), |
| 191 0, // Reserved, must be 0. | 165 0, // Reserved, must be 0. |
| 192 MAXIMUM_ALLOWED, | 166 MAXIMUM_ALLOWED, |
| 193 &key); | 167 &key); |
| 194 if (ERROR_SUCCESS == err_code) { | 168 if (err_code == ERROR_SUCCESS) { |
| 195 ::RegCloseKey(key); | 169 ::RegCloseKey(key); |
| 196 return SBOX_TEST_SUCCEEDED; | 170 return SBOX_TEST_SUCCEEDED; |
| 197 } else if (ERROR_INVALID_HANDLE == err_code || | |
| 198 ERROR_ACCESS_DENIED == err_code) { | |
| 199 return SBOX_TEST_DENIED; | |
| 200 } else { | |
| 201 return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; | |
| 202 } | 171 } |
| 172 return (err_code == ERROR_INVALID_HANDLE || err_code == ERROR_ACCESS_DENIED) ? |
| 173 SBOX_TEST_DENIED : SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; |
| 203 } | 174 } |
| 204 | 175 |
| 205 // Returns true if the current's thread desktop is the interactive desktop. | 176 // Returns true if the current's thread desktop is the interactive desktop. |
| 206 // In Vista there is a more direct test but for XP and w2k we need to check | 177 // In Vista there is a more direct test but for XP and w2k we need to check |
| 207 // the object name. | 178 // the object name. |
| 208 bool IsInteractiveDesktop(bool* is_interactive) { | 179 bool IsInteractiveDesktop(bool* is_interactive) { |
| 209 HDESK current_desk = ::GetThreadDesktop(::GetCurrentThreadId()); | 180 HDESK current_desk = ::GetThreadDesktop(::GetCurrentThreadId()); |
| 210 if (NULL == current_desk) { | 181 if (current_desk == NULL) |
| 211 return false; | 182 return false; |
| 212 } | |
| 213 wchar_t current_desk_name[256] = {0}; | 183 wchar_t current_desk_name[256] = {0}; |
| 214 if (!::GetUserObjectInformationW(current_desk, UOI_NAME, current_desk_name, | 184 if (!::GetUserObjectInformationW(current_desk, UOI_NAME, current_desk_name, |
| 215 sizeof(current_desk_name), NULL)) { | 185 sizeof(current_desk_name), NULL)) |
| 216 return false; | 186 return false; |
| 217 } | |
| 218 *is_interactive = (0 == _wcsicmp(L"default", current_desk_name)); | 187 *is_interactive = (0 == _wcsicmp(L"default", current_desk_name)); |
| 219 return true; | 188 return true; |
| 220 } | 189 } |
| 221 | 190 |
| 222 SBOX_TESTS_COMMAND int OpenInteractiveDesktop(int, wchar_t **) { | 191 SBOX_TESTS_COMMAND int OpenInteractiveDesktop(int, wchar_t **) { |
| 223 return TestOpenInputDesktop(); | 192 return TestOpenInputDesktop(); |
| 224 } | 193 } |
| 225 | 194 |
| 226 int TestOpenInputDesktop() { | 195 int TestOpenInputDesktop() { |
| 227 bool is_interactive = false; | 196 bool is_interactive = false; |
| 228 if (IsInteractiveDesktop(&is_interactive) && is_interactive) { | 197 if (IsInteractiveDesktop(&is_interactive) && is_interactive) |
| 229 return SBOX_TEST_SUCCEEDED; | 198 return SBOX_TEST_SUCCEEDED; |
| 230 } | |
| 231 HDESK desk = ::OpenInputDesktop(0, FALSE, DESKTOP_CREATEWINDOW); | 199 HDESK desk = ::OpenInputDesktop(0, FALSE, DESKTOP_CREATEWINDOW); |
| 232 if (desk) { | 200 if (desk) { |
| 233 ::CloseDesktop(desk); | 201 ::CloseDesktop(desk); |
| 234 return SBOX_TEST_SUCCEEDED; | 202 return SBOX_TEST_SUCCEEDED; |
| 235 } | 203 } |
| 236 return SBOX_TEST_DENIED; | 204 return SBOX_TEST_DENIED; |
| 237 } | 205 } |
| 238 | 206 |
| 239 SBOX_TESTS_COMMAND int SwitchToSboxDesktop(int, wchar_t **) { | 207 SBOX_TESTS_COMMAND int SwitchToSboxDesktop(int, wchar_t **) { |
| 240 return TestSwitchDesktop(); | 208 return TestSwitchDesktop(); |
| 241 } | 209 } |
| 242 | 210 |
| 243 int TestSwitchDesktop() { | 211 int TestSwitchDesktop() { |
| 244 HDESK desktop = ::GetThreadDesktop(::GetCurrentThreadId()); | 212 HDESK desktop = ::GetThreadDesktop(::GetCurrentThreadId()); |
| 245 if (NULL == desktop) { | 213 if (desktop == NULL) |
| 246 return SBOX_TEST_FAILED; | 214 return SBOX_TEST_FAILED; |
| 247 } | 215 return ::SwitchDesktop(desktop) ? SBOX_TEST_SUCCEEDED : SBOX_TEST_DENIED; |
| 248 if (::SwitchDesktop(desktop)) { | |
| 249 return SBOX_TEST_SUCCEEDED; | |
| 250 } | |
| 251 return SBOX_TEST_DENIED; | |
| 252 } | 216 } |
| 253 | 217 |
| 254 SBOX_TESTS_COMMAND int OpenAlternateDesktop(int, wchar_t **argv) { | 218 SBOX_TESTS_COMMAND int OpenAlternateDesktop(int, wchar_t **argv) { |
| 255 return TestOpenAlternateDesktop(argv[0]); | 219 return TestOpenAlternateDesktop(argv[0]); |
| 256 } | 220 } |
| 257 | 221 |
| 258 int TestOpenAlternateDesktop(wchar_t *desktop_name) { | 222 int TestOpenAlternateDesktop(wchar_t *desktop_name) { |
| 259 // Test for WRITE_DAC permission on the handle. | 223 // Test for WRITE_DAC permission on the handle. |
| 260 HDESK desktop = ::GetThreadDesktop(::GetCurrentThreadId()); | 224 HDESK desktop = ::GetThreadDesktop(::GetCurrentThreadId()); |
| 261 if (desktop) { | 225 if (desktop) { |
| 262 HANDLE test_handle; | 226 HANDLE test_handle; |
| 263 if (::DuplicateHandle(::GetCurrentProcess(), desktop, | 227 if (::DuplicateHandle(::GetCurrentProcess(), desktop, |
| 264 ::GetCurrentProcess(), &test_handle, | 228 ::GetCurrentProcess(), &test_handle, |
| 265 WRITE_DAC, FALSE, 0)) { | 229 WRITE_DAC, FALSE, 0)) { |
| 266 DWORD result = ::SetSecurityInfo(test_handle, SE_WINDOW_OBJECT, | 230 DWORD result = ::SetSecurityInfo(test_handle, SE_WINDOW_OBJECT, |
| 267 DACL_SECURITY_INFORMATION, NULL, NULL, | 231 DACL_SECURITY_INFORMATION, NULL, NULL, |
| 268 NULL, NULL); | 232 NULL, NULL); |
| 269 ::CloseHandle(test_handle); | 233 ::CloseHandle(test_handle); |
| 270 if (result == ERROR_SUCCESS) { | 234 if (result == ERROR_SUCCESS) |
| 271 return SBOX_TEST_SUCCEEDED; | 235 return SBOX_TEST_SUCCEEDED; |
| 272 } | |
| 273 } else if (::GetLastError() != ERROR_ACCESS_DENIED) { | 236 } else if (::GetLastError() != ERROR_ACCESS_DENIED) { |
| 274 return SBOX_TEST_FAILED; | 237 return SBOX_TEST_FAILED; |
| 275 } | 238 } |
| 276 } | 239 } |
| 277 | 240 |
| 278 // Open by name with WRITE_DAC. | 241 // Open by name with WRITE_DAC. |
| 279 desktop = ::OpenDesktop(desktop_name, 0, FALSE, WRITE_DAC); | 242 desktop = ::OpenDesktop(desktop_name, 0, FALSE, WRITE_DAC); |
| 280 if (desktop || ::GetLastError() != ERROR_ACCESS_DENIED) { | 243 if (!desktop && ::GetLastError() == ERROR_ACCESS_DENIED) |
| 281 ::CloseDesktop(desktop); | 244 return SBOX_TEST_DENIED; |
| 282 return SBOX_TEST_SUCCEEDED; | 245 ::CloseDesktop(desktop); |
| 283 } | 246 return SBOX_TEST_SUCCEEDED; |
| 284 | |
| 285 return SBOX_TEST_DENIED; | |
| 286 } | 247 } |
| 287 | 248 |
| 288 BOOL CALLBACK DesktopTestEnumProc(LPTSTR desktop_name, LPARAM result) { | 249 BOOL CALLBACK DesktopTestEnumProc(LPTSTR desktop_name, LPARAM result) { |
| 289 return TRUE; | 250 return TRUE; |
| 290 } | 251 } |
| 291 | 252 |
| 292 SBOX_TESTS_COMMAND int EnumAlternateWinsta(int, wchar_t **) { | 253 SBOX_TESTS_COMMAND int EnumAlternateWinsta(int, wchar_t **) { |
| 293 return TestEnumAlternateWinsta(); | 254 return TestEnumAlternateWinsta(); |
| 294 } | 255 } |
| 295 | 256 |
| 296 int TestEnumAlternateWinsta() { | 257 int TestEnumAlternateWinsta() { |
| 297 int result = SBOX_TEST_DENIED; | |
| 298 // Try to enumerate the destops on the alternate windowstation. | 258 // Try to enumerate the destops on the alternate windowstation. |
| 299 if (::EnumDesktopsW(NULL, DesktopTestEnumProc, 0)) { | 259 return ::EnumDesktopsW(NULL, DesktopTestEnumProc, 0) ? |
| 300 return SBOX_TEST_SUCCEEDED; | 260 SBOX_TEST_SUCCEEDED : SBOX_TEST_DENIED; |
| 301 } | |
| 302 return SBOX_TEST_DENIED; | |
| 303 } | 261 } |
| 304 | 262 |
| 305 SBOX_TESTS_COMMAND int SleepCmd(int argc, wchar_t **argv) { | 263 SBOX_TESTS_COMMAND int SleepCmd(int argc, wchar_t **argv) { |
| 306 if (1 != argc) | 264 if (argc != 1) |
| 307 return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; | 265 return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; |
| 308 | 266 |
| 309 ::Sleep(_wtoi(argv[0])); | 267 ::Sleep(_wtoi(argv[0])); |
| 310 return SBOX_TEST_SUCCEEDED; | 268 return SBOX_TEST_SUCCEEDED; |
| 311 } | 269 } |
| 312 | 270 |
| 313 SBOX_TESTS_COMMAND int AllocateCmd(int argc, wchar_t **argv) { | 271 SBOX_TESTS_COMMAND int AllocateCmd(int argc, wchar_t **argv) { |
| 314 if (argc != 1) | 272 if (argc != 1) |
| 315 return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; | 273 return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; |
| 316 | 274 |
| 317 size_t mem_size = static_cast<size_t>(_wtoll(argv[0])); | 275 size_t mem_size = static_cast<size_t>(_wtoll(argv[0])); |
| 318 void* memory = ::VirtualAlloc(NULL, mem_size, MEM_COMMIT | MEM_RESERVE, | 276 void* memory = ::VirtualAlloc(NULL, mem_size, MEM_COMMIT | MEM_RESERVE, |
| 319 PAGE_READWRITE); | 277 PAGE_READWRITE); |
| 320 if (!memory) { | 278 if (!memory) { |
| 321 // We need to give the broker a chance to kill our process on failure. | 279 // We need to give the broker a chance to kill our process on failure. |
| 322 ::Sleep(5000); | 280 ::Sleep(5000); |
| 323 return SBOX_TEST_DENIED; | 281 return SBOX_TEST_DENIED; |
| 324 } | 282 } |
| 325 | 283 |
| 326 if (!::VirtualFree(memory, 0, MEM_RELEASE)) | 284 return ::VirtualFree(memory, 0, MEM_RELEASE) ? |
| 327 return SBOX_TEST_FAILED; | 285 SBOX_TEST_SUCCEEDED : SBOX_TEST_FAILED; |
| 328 | |
| 329 return SBOX_TEST_SUCCEEDED; | |
| 330 } | 286 } |
| 331 | 287 |
| 332 | 288 |
| 333 } // namespace sandbox | 289 } // namespace sandbox |
| OLD | NEW |