no explorer.exe, judge by pid retrived from cpp (#8291)
Signed-off-by: 21pages <sunboeasy@gmail.com>
This commit is contained in:
parent
8de5f3f0d3
commit
fd0f85d565
@ -59,10 +59,12 @@ extern "C"
|
|||||||
{
|
{
|
||||||
// if should try WTSQueryUserToken?
|
// if should try WTSQueryUserToken?
|
||||||
// https://stackoverflow.com/questions/7285666/example-code-a-service-calls-createprocessasuser-i-want-the-process-to-run-in
|
// https://stackoverflow.com/questions/7285666/example-code-a-service-calls-createprocessasuser-i-want-the-process-to-run-in
|
||||||
BOOL GetSessionUserTokenWin(OUT LPHANDLE lphUserToken, DWORD dwSessionId, BOOL as_user)
|
BOOL GetSessionUserTokenWin(OUT LPHANDLE lphUserToken, DWORD dwSessionId, BOOL as_user, DWORD *pDwTokenPid)
|
||||||
{
|
{
|
||||||
BOOL bResult = FALSE;
|
BOOL bResult = FALSE;
|
||||||
DWORD Id = GetLogonPid(dwSessionId, as_user);
|
DWORD Id = GetLogonPid(dwSessionId, as_user);
|
||||||
|
if (pDwTokenPid)
|
||||||
|
*pDwTokenPid = Id;
|
||||||
if (HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, Id))
|
if (HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, Id))
|
||||||
{
|
{
|
||||||
bResult = OpenProcessToken(hProcess, TOKEN_ALL_ACCESS, lphUserToken);
|
bResult = OpenProcessToken(hProcess, TOKEN_ALL_ACCESS, lphUserToken);
|
||||||
@ -76,11 +78,11 @@ extern "C"
|
|||||||
return IsWindowsServer();
|
return IsWindowsServer();
|
||||||
}
|
}
|
||||||
|
|
||||||
HANDLE LaunchProcessWin(LPCWSTR cmd, DWORD dwSessionId, BOOL as_user)
|
HANDLE LaunchProcessWin(LPCWSTR cmd, DWORD dwSessionId, BOOL as_user, DWORD *pDwTokenPid)
|
||||||
{
|
{
|
||||||
HANDLE hProcess = NULL;
|
HANDLE hProcess = NULL;
|
||||||
HANDLE hToken = NULL;
|
HANDLE hToken = NULL;
|
||||||
if (GetSessionUserTokenWin(&hToken, dwSessionId, as_user))
|
if (GetSessionUserTokenWin(&hToken, dwSessionId, as_user, pDwTokenPid))
|
||||||
{
|
{
|
||||||
STARTUPINFOW si;
|
STARTUPINFOW si;
|
||||||
ZeroMemory(&si, sizeof si);
|
ZeroMemory(&si, sizeof si);
|
||||||
|
@ -461,8 +461,8 @@ const SERVICE_TYPE: ServiceType = ServiceType::OWN_PROCESS;
|
|||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
fn get_current_session(rdp: BOOL) -> DWORD;
|
fn get_current_session(rdp: BOOL) -> DWORD;
|
||||||
fn LaunchProcessWin(cmd: *const u16, session_id: DWORD, as_user: BOOL) -> HANDLE;
|
fn LaunchProcessWin(cmd: *const u16, session_id: DWORD, as_user: BOOL, token_pid: &mut DWORD) -> HANDLE;
|
||||||
fn GetSessionUserTokenWin(lphUserToken: LPHANDLE, dwSessionId: DWORD, as_user: BOOL) -> BOOL;
|
fn GetSessionUserTokenWin(lphUserToken: LPHANDLE, dwSessionId: DWORD, as_user: BOOL, token_pid: &mut DWORD) -> BOOL;
|
||||||
fn selectInputDesktop() -> BOOL;
|
fn selectInputDesktop() -> BOOL;
|
||||||
fn inputDesktopSelected() -> BOOL;
|
fn inputDesktopSelected() -> BOOL;
|
||||||
fn is_windows_server() -> BOOL;
|
fn is_windows_server() -> BOOL;
|
||||||
@ -645,9 +645,13 @@ async fn launch_server(session_id: DWORD, close_first: bool) -> ResultType<HANDL
|
|||||||
.chain(Some(0).into_iter())
|
.chain(Some(0).into_iter())
|
||||||
.collect();
|
.collect();
|
||||||
let wstr = wstr.as_ptr();
|
let wstr = wstr.as_ptr();
|
||||||
let h = unsafe { LaunchProcessWin(wstr, session_id, FALSE) };
|
let mut token_pid = 0;
|
||||||
|
let h = unsafe { LaunchProcessWin(wstr, session_id, FALSE, &mut token_pid) };
|
||||||
if h.is_null() {
|
if h.is_null() {
|
||||||
log::error!("Failed to launch server: {}", io::Error::last_os_error());
|
log::error!("Failed to launch server: {}", io::Error::last_os_error());
|
||||||
|
if token_pid == 0 {
|
||||||
|
log::error!("No process winlogon.exe");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Ok(h)
|
Ok(h)
|
||||||
}
|
}
|
||||||
@ -667,9 +671,10 @@ pub fn run_as_user(arg: Vec<&str>) -> ResultType<Option<std::process::Child>> {
|
|||||||
.chain(Some(0).into_iter())
|
.chain(Some(0).into_iter())
|
||||||
.collect();
|
.collect();
|
||||||
let wstr = wstr.as_ptr();
|
let wstr = wstr.as_ptr();
|
||||||
let h = unsafe { LaunchProcessWin(wstr, session_id, TRUE) };
|
let mut token_pid = 0;
|
||||||
|
let h = unsafe { LaunchProcessWin(wstr, session_id, TRUE, &mut token_pid) };
|
||||||
if h.is_null() {
|
if h.is_null() {
|
||||||
if !is_process_running(EXPLORER_EXE, session_id) {
|
if token_pid == 0 {
|
||||||
bail!(
|
bail!(
|
||||||
"Failed to launch {:?} with session id {}: no process {}",
|
"Failed to launch {:?} with session id {}: no process {}",
|
||||||
arg,
|
arg,
|
||||||
@ -1550,11 +1555,13 @@ pub fn quit_gui() {
|
|||||||
pub fn get_user_token(session_id: u32, as_user: bool) -> HANDLE {
|
pub fn get_user_token(session_id: u32, as_user: bool) -> HANDLE {
|
||||||
let mut token = NULL as HANDLE;
|
let mut token = NULL as HANDLE;
|
||||||
unsafe {
|
unsafe {
|
||||||
|
let mut _token_pid = 0;
|
||||||
if FALSE
|
if FALSE
|
||||||
== GetSessionUserTokenWin(
|
== GetSessionUserTokenWin(
|
||||||
&mut token as _,
|
&mut token as _,
|
||||||
session_id,
|
session_id,
|
||||||
if as_user { TRUE } else { FALSE },
|
if as_user { TRUE } else { FALSE },
|
||||||
|
&mut _token_pid,
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
NULL as _
|
NULL as _
|
||||||
@ -2041,23 +2048,6 @@ pub fn is_process_consent_running() -> ResultType<bool> {
|
|||||||
Ok(output.status.success() && !output.stdout.is_empty())
|
Ok(output.status.success() && !output.stdout.is_empty())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn is_process_running(exe: &str, session_id: u32) -> bool {
|
|
||||||
use hbb_common::sysinfo::System;
|
|
||||||
let mut sys = System::new();
|
|
||||||
sys.refresh_processes();
|
|
||||||
for (_, p) in sys.processes().iter() {
|
|
||||||
if p.session_id() == Some((session_id as usize).into())
|
|
||||||
&& p.exe()
|
|
||||||
.to_string_lossy()
|
|
||||||
.to_lowercase()
|
|
||||||
.contains(&exe.to_lowercase())
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
false
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct WakeLock(u32);
|
pub struct WakeLock(u32);
|
||||||
// Failed to compile keepawake-rs on i686
|
// Failed to compile keepawake-rs on i686
|
||||||
impl WakeLock {
|
impl WakeLock {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user