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 "remoting/host/win/launch_process_with_token.h" | 5 #include "remoting/host/win/launch_process_with_token.h" |
6 | 6 |
7 #include <windows.h> | 7 #include <windows.h> |
8 #include <winternl.h> | 8 #include <winternl.h> |
9 | 9 |
10 #include <limits> | 10 #include <limits> |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
57 } | 57 } |
58 } | 58 } |
59 | 59 |
60 // Connects to the executor server corresponding to |session_id|. | 60 // Connects to the executor server corresponding to |session_id|. |
61 bool ConnectToExecutionServer(uint32 session_id, | 61 bool ConnectToExecutionServer(uint32 session_id, |
62 base::win::ScopedHandle* pipe_out) { | 62 base::win::ScopedHandle* pipe_out) { |
63 string16 pipe_name; | 63 string16 pipe_name; |
64 | 64 |
65 // Use winsta!WinStationQueryInformationW() to determine the process creation | 65 // Use winsta!WinStationQueryInformationW() to determine the process creation |
66 // pipe name for the session. | 66 // pipe name for the session. |
67 FilePath winsta_path(base::GetNativeLibraryName(UTF8ToUTF16("winsta"))); | 67 base::FilePath winsta_path(base::GetNativeLibraryName(UTF8ToUTF16("winsta"))); |
68 base::ScopedNativeLibrary winsta(winsta_path); | 68 base::ScopedNativeLibrary winsta(winsta_path); |
69 if (winsta.is_valid()) { | 69 if (winsta.is_valid()) { |
70 PWINSTATIONQUERYINFORMATIONW win_station_query_information = | 70 PWINSTATIONQUERYINFORMATIONW win_station_query_information = |
71 static_cast<PWINSTATIONQUERYINFORMATIONW>( | 71 static_cast<PWINSTATIONQUERYINFORMATIONW>( |
72 winsta.GetFunctionPointer("WinStationQueryInformationW")); | 72 winsta.GetFunctionPointer("WinStationQueryInformationW")); |
73 if (win_station_query_information) { | 73 if (win_station_query_information) { |
74 wchar_t name[MAX_PATH]; | 74 wchar_t name[MAX_PATH]; |
75 ULONG name_length; | 75 ULONG name_length; |
76 if (win_station_query_information(0, | 76 if (win_station_query_information(0, |
77 session_id, | 77 session_id, |
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
286 return false; | 286 return false; |
287 } | 287 } |
288 | 288 |
289 *process_information_out = response.process_information; | 289 *process_information_out = response.process_information; |
290 return true; | 290 return true; |
291 } | 291 } |
292 | 292 |
293 // Sends a remote process create request to the execution server. | 293 // Sends a remote process create request to the execution server. |
294 bool SendCreateProcessRequest( | 294 bool SendCreateProcessRequest( |
295 HANDLE pipe, | 295 HANDLE pipe, |
296 const FilePath::StringType& application_name, | 296 const base::FilePath::StringType& application_name, |
297 const CommandLine::StringType& command_line, | 297 const CommandLine::StringType& command_line, |
298 DWORD creation_flags, | 298 DWORD creation_flags, |
299 const char16* desktop_name) { | 299 const char16* desktop_name) { |
300 // |CreateProcessRequest| structure passes the same parameters to | 300 // |CreateProcessRequest| structure passes the same parameters to |
301 // the execution server as CreateProcessAsUser() function does. Strings are | 301 // the execution server as CreateProcessAsUser() function does. Strings are |
302 // stored as wide strings immediately after the structure. String pointers are | 302 // stored as wide strings immediately after the structure. String pointers are |
303 // represented as byte offsets to string data from the beginning of | 303 // represented as byte offsets to string data from the beginning of |
304 // the structure. | 304 // the structure. |
305 struct CreateProcessRequest { | 305 struct CreateProcessRequest { |
306 DWORD size; | 306 DWORD size; |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
369 } | 369 } |
370 | 370 |
371 return true; | 371 return true; |
372 } | 372 } |
373 | 373 |
374 // Requests the execution server to create a process in the specified session | 374 // Requests the execution server to create a process in the specified session |
375 // using the default (i.e. Winlogon) token. This routine relies on undocumented | 375 // using the default (i.e. Winlogon) token. This routine relies on undocumented |
376 // OS functionality and will likely not work on anything but XP or W2K3. | 376 // OS functionality and will likely not work on anything but XP or W2K3. |
377 bool CreateRemoteSessionProcess( | 377 bool CreateRemoteSessionProcess( |
378 uint32 session_id, | 378 uint32 session_id, |
379 const FilePath::StringType& application_name, | 379 const base::FilePath::StringType& application_name, |
380 const CommandLine::StringType& command_line, | 380 const CommandLine::StringType& command_line, |
381 DWORD creation_flags, | 381 DWORD creation_flags, |
382 const char16* desktop_name, | 382 const char16* desktop_name, |
383 PROCESS_INFORMATION* process_information_out) | 383 PROCESS_INFORMATION* process_information_out) |
384 { | 384 { |
385 DCHECK_LT(base::win::GetVersion(), base::win::VERSION_VISTA); | 385 DCHECK_LT(base::win::GetVersion(), base::win::VERSION_VISTA); |
386 | 386 |
387 base::win::ScopedHandle pipe; | 387 base::win::ScopedHandle pipe; |
388 if (!ConnectToExecutionServer(session_id, &pipe)) | 388 if (!ConnectToExecutionServer(session_id, &pipe)) |
389 return false; | 389 return false; |
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
545 return false; | 545 return false; |
546 } | 546 } |
547 | 547 |
548 // Revert to the default token. | 548 // Revert to the default token. |
549 CHECK(RevertToSelf()); | 549 CHECK(RevertToSelf()); |
550 | 550 |
551 *token_out = session_token.Pass(); | 551 *token_out = session_token.Pass(); |
552 return true; | 552 return true; |
553 } | 553 } |
554 | 554 |
555 bool LaunchProcessWithToken(const FilePath& binary, | 555 bool LaunchProcessWithToken(const base::FilePath& binary, |
556 const CommandLine::StringType& command_line, | 556 const CommandLine::StringType& command_line, |
557 HANDLE user_token, | 557 HANDLE user_token, |
558 SECURITY_ATTRIBUTES* process_attributes, | 558 SECURITY_ATTRIBUTES* process_attributes, |
559 SECURITY_ATTRIBUTES* thread_attributes, | 559 SECURITY_ATTRIBUTES* thread_attributes, |
560 bool inherit_handles, | 560 bool inherit_handles, |
561 DWORD creation_flags, | 561 DWORD creation_flags, |
562 const char16* desktop_name, | 562 const char16* desktop_name, |
563 ScopedHandle* process_out, | 563 ScopedHandle* process_out, |
564 ScopedHandle* thread_out) { | 564 ScopedHandle* thread_out) { |
565 FilePath::StringType application_name = binary.value(); | 565 base::FilePath::StringType application_name = binary.value(); |
566 | 566 |
567 STARTUPINFOW startup_info; | 567 STARTUPINFOW startup_info; |
568 memset(&startup_info, 0, sizeof(startup_info)); | 568 memset(&startup_info, 0, sizeof(startup_info)); |
569 startup_info.cb = sizeof(startup_info); | 569 startup_info.cb = sizeof(startup_info); |
570 if (desktop_name) | 570 if (desktop_name) |
571 startup_info.lpDesktop = const_cast<char16*>(desktop_name); | 571 startup_info.lpDesktop = const_cast<char16*>(desktop_name); |
572 | 572 |
573 base::win::ScopedProcessInformation process_info; | 573 base::win::ScopedProcessInformation process_info; |
574 BOOL result = CreateProcessAsUser(user_token, | 574 BOOL result = CreateProcessAsUser(user_token, |
575 application_name.c_str(), | 575 application_name.c_str(), |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
619 return false; | 619 return false; |
620 } | 620 } |
621 | 621 |
622 CHECK(process_info.IsValid()); | 622 CHECK(process_info.IsValid()); |
623 process_out->Set(process_info.TakeProcessHandle()); | 623 process_out->Set(process_info.TakeProcessHandle()); |
624 thread_out->Set(process_info.TakeThreadHandle()); | 624 thread_out->Set(process_info.TakeThreadHandle()); |
625 return true; | 625 return true; |
626 } | 626 } |
627 | 627 |
628 } // namespace remoting | 628 } // namespace remoting |
OLD | NEW |