VirtualBox

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


Ignore:
Timestamp:
Sep 21, 2010 8:47:18 AM (14 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
66067
Message:

IPRT/process-win: Added dynamic loading of Userenv-APIs.

File:
1 edited

Legend:

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

    r32653 r32656  
    8989typedef DWORD FNGETMODULEBASENAME(HANDLE, HMODULE, LPTSTR, DWORD);
    9090typedef FNGETMODULEBASENAME *PFNGETMODULEBASENAME;
     91
     92typedef BOOL WINAPI FNCREATEENVIRONMENTBLOCK(LPVOID *, HANDLE, BOOL);
     93typedef FNCREATEENVIRONMENTBLOCK *PFNCREATEENVIRONMENTBLOCK;
     94
     95typedef BOOL WINAPI FNPFNDESTROYENVIRONMENTBLOCK(LPVOID);
     96typedef FNPFNDESTROYENVIRONMENTBLOCK *PFNPFNDESTROYENVIRONMENTBLOCK;
     97
     98typedef BOOL WINAPI FNLOADUSERPROFILEW(HANDLE, LPPROFILEINFOW);
     99typedef FNLOADUSERPROFILEW *PFNLOADUSERPROFILEW;
     100
     101typedef BOOL WINAPI FNUNLOADUSERPROFILE(HANDLE, HANDLE);
     102typedef FNUNLOADUSERPROFILE *PFNUNLOADUSERPROFILE;
    91103
    92104
     
    590602static int rtProcEnvironmentCreateFromToken(HANDLE hToken, RTENV hEnv, PRTUTF16 *ppwszBlock)
    591603{
    592     int rc = VINF_SUCCESS;
    593     LPVOID pEnvBlockProfile = NULL;
    594     if (CreateEnvironmentBlock(&pEnvBlockProfile, hToken, FALSE /* Don't inherit from parent. */))
    595     {
    596         rc = rtProcEnvironmentCreateInternal(pEnvBlockProfile, hEnv, ppwszBlock);
    597         DestroyEnvironmentBlock(pEnvBlockProfile);
    598     }
    599     else
    600         rc = RTErrConvertFromWin32(GetLastError());
     604    RTLDRMOD hUserenv;
     605    int rc = RTLdrLoad("Userenv.dll", &hUserenv);
     606    if (RT_SUCCESS(rc))
     607    {
     608        PFNCREATEENVIRONMENTBLOCK pfnCreateEnvironmentBlock;
     609        rc = RTLdrGetSymbol(hUserenv, "CreateEnvironmentBlock", (void**)&pfnCreateEnvironmentBlock);
     610        if (RT_SUCCESS(rc))
     611        {
     612            PFNPFNDESTROYENVIRONMENTBLOCK pfnDestroyEnvironmentBlock;
     613            rc = RTLdrGetSymbol(hUserenv, "DestroyEnvironmentBlock", (void**)&pfnDestroyEnvironmentBlock);
     614            if (RT_SUCCESS(rc))
     615            {
     616                LPVOID pEnvBlockProfile = NULL;
     617                if (pfnCreateEnvironmentBlock(&pEnvBlockProfile, hToken, FALSE /* Don't inherit from parent. */))
     618                {
     619                    rc = rtProcEnvironmentCreateInternal(pEnvBlockProfile, hEnv, ppwszBlock);
     620                    pfnDestroyEnvironmentBlock(pEnvBlockProfile);
     621                }
     622                else
     623                    rc = RTErrConvertFromWin32(GetLastError());
     624            }
     625        }
     626        RTLdrClose(hUserenv);
     627    }
    601628    return rc;
    602629}
     
    807834            phToken = fFound ? &hTokenUserDesktop : &hTokenLogon;
    808835
    809             PROFILEINFOW profileInfo;
    810             ZeroMemory(&profileInfo, sizeof(profileInfo));
    811             profileInfo.dwSize = sizeof(profileInfo);
    812             profileInfo.lpUserName = pwszUser;
    813             profileInfo.dwFlags = PI_NOUI; /* Prevents the display of profile error messages. */
    814             if (LoadUserProfileW(*phToken, &profileInfo))
    815             {
    816                 PRTUTF16 pwszzBlock;
    817                 rc = rtProcEnvironmentCreateFromToken(*phToken, hEnv, &pwszzBlock);
     836            RTLDRMOD hUserenv;
     837            int rc = RTLdrLoad("Userenv.dll", &hUserenv);
     838            if (RT_SUCCESS(rc))
     839            {
     840                PFNLOADUSERPROFILEW pfnLoadUserProfileW;
     841                rc = RTLdrGetSymbol(hUserenv, "LoadUserProfileW", (void**)&pfnLoadUserProfileW);
    818842                if (RT_SUCCESS(rc))
    819843                {
    820                     /*
    821                      * Useful KB articles:
    822                      *      http://support.microsoft.com/kb/165194/
    823                      *      http://support.microsoft.com/kb/184802/
    824                      *      http://support.microsoft.com/kb/327618/
    825                      */
    826                     fRc = CreateProcessAsUserW(*phToken,
    827                                                pwszExec,
    828                                                pwszCmdLine,
    829                                                NULL,         /* pProcessAttributes */
    830                                                NULL,         /* pThreadAttributes */
    831                                                TRUE,         /* fInheritHandles */
    832                                                dwCreationFlags,
    833                                                pwszzBlock,
    834                                                NULL,         /* pCurrentDirectory */
    835                                                pStartupInfo,
    836                                                pProcInfo);
    837                     if (fRc)
    838                         dwErr = NO_ERROR;
    839                     else
    840                         dwErr = GetLastError(); /* CreateProcessAsUserW() failed. */
    841                     rtProcEnvironmentDestroy(pwszzBlock);
     844                    PFNUNLOADUSERPROFILE pfnUnloadUserProfile;
     845                    rc = RTLdrGetSymbol(hUserenv, "UnloadUserProfile", (void**)&pfnUnloadUserProfile);
     846                    if (RT_SUCCESS(rc))
     847                    {
     848                        PROFILEINFOW profileInfo;
     849                        ZeroMemory(&profileInfo, sizeof(profileInfo));
     850                        profileInfo.dwSize = sizeof(profileInfo);
     851                        profileInfo.lpUserName = pwszUser;
     852                        profileInfo.dwFlags = PI_NOUI; /* Prevents the display of profile error messages. */
     853
     854                        if (pfnLoadUserProfileW(*phToken, &profileInfo))
     855                        {
     856                            PRTUTF16 pwszzBlock;
     857                            rc = rtProcEnvironmentCreateFromToken(*phToken, hEnv, &pwszzBlock);
     858                            if (RT_SUCCESS(rc))
     859                            {
     860                                /*
     861                                 * Useful KB articles:
     862                                 *      http://support.microsoft.com/kb/165194/
     863                                 *      http://support.microsoft.com/kb/184802/
     864                                 *      http://support.microsoft.com/kb/327618/
     865                                 */
     866                                fRc = CreateProcessAsUserW(*phToken,
     867                                                           pwszExec,
     868                                                           pwszCmdLine,
     869                                                           NULL,         /* pProcessAttributes */
     870                                                           NULL,         /* pThreadAttributes */
     871                                                           TRUE,         /* fInheritHandles */
     872                                                           dwCreationFlags,
     873                                                           pwszzBlock,
     874                                                           NULL,         /* pCurrentDirectory */
     875                                                           pStartupInfo,
     876                                                           pProcInfo);
     877                                if (fRc)
     878                                    dwErr = NO_ERROR;
     879                                else
     880                                    dwErr = GetLastError(); /* CreateProcessAsUserW() failed. */
     881                                rtProcEnvironmentDestroy(pwszzBlock);
     882                            }
     883                            else
     884                                dwErr = rc;
     885                            pfnUnloadUserProfile(*phToken, profileInfo.hProfile);
     886                        }
     887                        else
     888                            dwErr = GetLastError(); /* LoadUserProfileW() failed. */
     889                    }
    842890                }
    843                 else
    844                     dwErr = rc;
    845                 UnloadUserProfile(*phToken, profileInfo.hProfile);
    846             }
    847             else
    848                 dwErr = GetLastError(); /* LoadUserProfileW() failed. */
     891                RTLdrClose(hUserenv);
     892            }
    849893            if (hTokenUserDesktop != INVALID_HANDLE_VALUE)
    850894                CloseHandle(hTokenUserDesktop);
Note: See TracChangeset for help on using the changeset viewer.

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