Changeset 32656 in vbox for trunk/src/VBox/Runtime/r3/win
- Timestamp:
- Sep 21, 2010 8:47:18 AM (14 years ago)
- svn:sync-xref-src-repo-rev:
- 66067
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Runtime/r3/win/process-win.cpp
r32653 r32656 89 89 typedef DWORD FNGETMODULEBASENAME(HANDLE, HMODULE, LPTSTR, DWORD); 90 90 typedef FNGETMODULEBASENAME *PFNGETMODULEBASENAME; 91 92 typedef BOOL WINAPI FNCREATEENVIRONMENTBLOCK(LPVOID *, HANDLE, BOOL); 93 typedef FNCREATEENVIRONMENTBLOCK *PFNCREATEENVIRONMENTBLOCK; 94 95 typedef BOOL WINAPI FNPFNDESTROYENVIRONMENTBLOCK(LPVOID); 96 typedef FNPFNDESTROYENVIRONMENTBLOCK *PFNPFNDESTROYENVIRONMENTBLOCK; 97 98 typedef BOOL WINAPI FNLOADUSERPROFILEW(HANDLE, LPPROFILEINFOW); 99 typedef FNLOADUSERPROFILEW *PFNLOADUSERPROFILEW; 100 101 typedef BOOL WINAPI FNUNLOADUSERPROFILE(HANDLE, HANDLE); 102 typedef FNUNLOADUSERPROFILE *PFNUNLOADUSERPROFILE; 91 103 92 104 … … 590 602 static int rtProcEnvironmentCreateFromToken(HANDLE hToken, RTENV hEnv, PRTUTF16 *ppwszBlock) 591 603 { 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 } 601 628 return rc; 602 629 } … … 807 834 phToken = fFound ? &hTokenUserDesktop : &hTokenLogon; 808 835 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); 818 842 if (RT_SUCCESS(rc)) 819 843 { 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 } 842 890 } 843 else 844 dwErr = rc; 845 UnloadUserProfile(*phToken, profileInfo.hProfile); 846 } 847 else 848 dwErr = GetLastError(); /* LoadUserProfileW() failed. */ 891 RTLdrClose(hUserenv); 892 } 849 893 if (hTokenUserDesktop != INVALID_HANDLE_VALUE) 850 894 CloseHandle(hTokenUserDesktop);
Note:
See TracChangeset
for help on using the changeset viewer.