VirtualBox

Changeset 95274 in vbox for trunk/src/VBox/Runtime/r3/win


Ignore:
Timestamp:
Jun 14, 2022 10:48:33 AM (3 years ago)
Author:
vboxsync
Message:

FE/VBoxAutostart/adi: Added experimental support for running VBoxSVC session 0 (service session). Did some minor cleanup for the patch posted at comment 95. Disabled by default for now. bugref:9341

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/r3/win/process-win.cpp

    r93115 r95274  
    16121612                                  RTENV hEnv, DWORD dwCreationFlags,
    16131613                                  STARTUPINFOW *pStartupInfo, PROCESS_INFORMATION *pProcInfo,
    1614                                   uint32_t fFlags, const char *pszExec, uint32_t idDesiredSession)
     1614                                  uint32_t fFlags, const char *pszExec, uint32_t idDesiredSession,
     1615                                  HANDLE hUserToken)
    16151616{
    16161617    /*
     
    16421643    DWORD   dwErr       = NO_ERROR;
    16431644    HANDLE  hTokenLogon = INVALID_HANDLE_VALUE;
    1644     int rc;
    1645     if (fFlags & RTPROC_FLAGS_AS_IMPERSONATED_TOKEN)
     1645    int rc = VINF_SUCCESS;
     1646    if (fFlags & RTPROC_FLAGS_TOKEN_SUPPLIED)
     1647        hTokenLogon = hUserToken;
     1648    else if (fFlags & RTPROC_FLAGS_AS_IMPERSONATED_TOKEN)
    16461649        rc = rtProcWinGetThreadTokenHandle(GetCurrentThread(), &hTokenLogon);
    16471650    else if (pwszUser == NULL)
     
    18501853        if (hTokenUserDesktop != INVALID_HANDLE_VALUE)
    18511854            CloseHandle(hTokenUserDesktop);
    1852         if (hTokenLogon != INVALID_HANDLE_VALUE)
     1855        if (   !(fFlags & RTPROC_FLAGS_TOKEN_SUPPLIED)
     1856            && hTokenLogon != INVALID_HANDLE_VALUE)
    18531857            CloseHandle(hTokenLogon);
    18541858
     
    20882092                                 RTENV hEnv, DWORD dwCreationFlags,
    20892093                                 STARTUPINFOW *pStartupInfo, PROCESS_INFORMATION *pProcInfo,
    2090                                  uint32_t fFlags, const char *pszExec, uint32_t idDesiredSession)
     2094                                 uint32_t fFlags, const char *pszExec, uint32_t idDesiredSession,
     2095                                 HANDLE hUserToken)
    20912096{
    20922097    /*
     
    20962101     * Note! This method is very slow on W2K.
    20972102     */
    2098     if (!(fFlags & (RTPROC_FLAGS_SERVICE | RTPROC_FLAGS_AS_IMPERSONATED_TOKEN)))
     2103    if (!(fFlags & (RTPROC_FLAGS_SERVICE | RTPROC_FLAGS_AS_IMPERSONATED_TOKEN | RTPROC_FLAGS_TOKEN_SUPPLIED)))
    20992104    {
    21002105        AssertPtr(pwszUser);
     
    21042109            return rc;
    21052110    }
    2106     return rtProcWinCreateAsUser2(pwszUser, pwszPassword, ppwszExec, pwszCmdLine,
    2107                                   hEnv, dwCreationFlags, pStartupInfo, pProcInfo, fFlags, pszExec, idDesiredSession);
     2111    return rtProcWinCreateAsUser2(pwszUser, pwszPassword, ppwszExec, pwszCmdLine, hEnv, dwCreationFlags,
     2112                                  pStartupInfo, pProcInfo, fFlags, pszExec, idDesiredSession, hUserToken);
    21082113}
    21092114
     
    22822287        AssertReturn(!(fFlags & RTPROC_FLAGS_DESIRED_SESSION_ID), VERR_INVALID_FLAGS);
    22832288
     2289    HANDLE hUserToken = NULL;
     2290    if (fFlags & RTPROC_FLAGS_TOKEN_SUPPLIED)
     2291        hUserToken = *(HANDLE *)pvExtraData;
     2292
    22842293    /*
    22852294     * Initialize the globals.
     
    22872296    int rc = RTOnce(&g_rtProcWinInitOnce, rtProcWinInitOnce, NULL);
    22882297    AssertRCReturn(rc, rc);
    2289     if (pszAsUser || (fFlags & (RTPROC_FLAGS_PROFILE | RTPROC_FLAGS_SERVICE | RTPROC_FLAGS_AS_IMPERSONATED_TOKEN)))
     2298    if (   pszAsUser
     2299        || (fFlags & (RTPROC_FLAGS_PROFILE | RTPROC_FLAGS_SERVICE | RTPROC_FLAGS_AS_IMPERSONATED_TOKEN
     2300                      | RTPROC_FLAGS_TOKEN_SUPPLIED)))
    22902301    {
    22912302        rc = RTOnce(&g_rtProcWinResolveOnce, rtProcWinResolveOnce, NULL);
     
    24452456             */
    24462457            if (   pszAsUser == NULL
    2447                 && !(fFlags & (RTPROC_FLAGS_SERVICE | RTPROC_FLAGS_AS_IMPERSONATED_TOKEN)))
     2458                && !(fFlags & (RTPROC_FLAGS_SERVICE | RTPROC_FLAGS_AS_IMPERSONATED_TOKEN | RTPROC_FLAGS_TOKEN_SUPPLIED)))
    24482459            {
    24492460                /* Create the environment block first. */
     
    24832494                    if (RT_SUCCESS(rc))
    24842495                    {
    2485                         rc = rtProcWinCreateAsUser(pwszUser, pwszPassword,
    2486                                                    &pwszExec, pwszCmdLine, hEnv, dwCreationFlags,
    2487                                                    &StartupInfo, &ProcInfo, fFlags, pszExec, idDesiredSession);
     2496                        rc = rtProcWinCreateAsUser(pwszUser, pwszPassword, &pwszExec, pwszCmdLine, hEnv, dwCreationFlags,
     2497                                                   &StartupInfo, &ProcInfo, fFlags, pszExec, idDesiredSession,
     2498                                                   hUserToken);
    24882499
    24892500                        if (pwszPassword && *pwszPassword)
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette