VirtualBox

Ignore:
Timestamp:
Jun 8, 2010 2:30:17 PM (15 years ago)
Author:
vboxsync
Message:

IPRT: Removed VERR_LOGON_FAILURE in favor of VERR_AUTHENTICATION_FAILURE. Cleaned up nits in process-win.cpp and adding some missing function docs. Hope it compiles...

File:
1 edited

Legend:

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

    r30065 r30093  
    254254
    255255
     256/**
     257 * Get the process token (not the process handle like the name might indicate)
     258 * of the process indicated by @a dwPID if the @a pSID matches.
     259 *
     260 * @returns IPRT status code.
     261 *
     262 * @param   dwPID           The process identifier.
     263 * @param   pSID            The secure identifier of the user.
     264 * @param   phToken         Where to return the token handle - duplicate,
     265 *                          caller closes it on success.
     266 */
    256267static int rtProcGetProcessHandle(DWORD dwPID, PSID pSID, PHANDLE phToken)
    257268{
     
    261272    DWORD dwErr;
    262273    BOOL fRc;
    263     BOOL fFound = FALSE;
     274    bool fFound = false;
    264275    HANDLE hProc = OpenProcess(MAXIMUM_ALLOWED, TRUE, dwPID);
    265276    if (hProc != NULL)
     
    267278        HANDLE hTokenProc;
    268279        fRc = OpenProcessToken(hProc,
    269                                TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY | TOKEN_DUPLICATE |
    270                                TOKEN_ASSIGN_PRIMARY | TOKEN_ADJUST_SESSIONID | TOKEN_READ | TOKEN_WRITE,
     280                               TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY | TOKEN_DUPLICATE
     281                               | TOKEN_ASSIGN_PRIMARY | TOKEN_ADJUST_SESSIONID | TOKEN_READ | TOKEN_WRITE,
    271282                               &hTokenProc);
    272283        if (fRc)
     
    300311                             * the actual CreateProcessAsUserW() call then.
    301312                             */
    302                             fFound = TRUE;
     313                            fFound = true;
    303314                        }
    304315                        else
     
    328339
    329340
    330 static BOOL rtProcFindProcessByName(const char * const *papszNames, PSID pSID, PHANDLE phToken)
     341/**
     342 * Finds a one of the processes in @a papszNames running with user @a pSID and
     343 * returns a duplicate handle to its token.
     344 *
     345 * @returns Success indicator.
     346 * @param   papszNames      The process candidates, in prioritized order.
     347 * @param   pSID            The secure identifier of the user.
     348 * @param   phToken         Where to return the token handle - duplicate,
     349 *                          caller closes it on success.
     350 */
     351static bool rtProcFindProcessByName(const char * const *papszNames, PSID pSID, PHANDLE phToken)
    331352{
    332353    AssertPtr(papszNames);
     
    335356
    336357    DWORD dwErr = NO_ERROR;
    337     BOOL fFound = FALSE;
     358    bool fFound = false;
    338359
    339360    /*
     
    365386                            procEntry.dwSize = sizeof(PROCESSENTRY32);
    366387                            if (pfnProcess32First(hSnap, &procEntry))
    367                             {   
     388                            {
    368389                                do
    369390                                {
     
    371392                                        && RT_SUCCESS(rtProcGetProcessHandle(procEntry.th32ProcessID, pSID, phToken)))
    372393                                    {
    373                                         fFound = TRUE;
     394                                        fFound = true;
     395                                        break;
    374396                                    }
    375                                 } while (pfnProcess32Next(hSnap, &procEntry) && !fFound);
     397                                } while (pfnProcess32Next(hSnap, &procEntry));
    376398                            }
    377399                            else /* Process32First */
     
    407429                    {
    408430                        /** @todo Retry if pBytesReturned equals cbBytes! */
    409                         DWORD dwPIDs[4096]; /* Should be sufficient for now. */
     431                        DWORD adwPIDs[4096]; /* Should be sufficient for now. */
    410432                        DWORD cbBytes = 0;
    411                         if (pfnEnumProcesses(dwPIDs, sizeof(dwPIDs), &cbBytes))
     433                        if (pfnEnumProcesses(adwPIDs, sizeof(adwPIDs), &cbBytes))
    412434                        {
    413435                            for (size_t i = 0; papszNames[i] && !fFound; i++)
     
    416438                                {
    417439                                    HANDLE hProc = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
    418                                                                FALSE, dwPIDs[dwIdx]);
     440                                                               FALSE, adwPIDs[dwIdx]);
    419441                                    if (hProc)
    420442                                    {
     
    429451                                                break;
    430452                                        } while (GetLastError() == ERROR_INSUFFICIENT_BUFFER);
    431    
     453
    432454                                        if (pszProcName)
    433455                                        {
    434456                                            if (   _stricmp(pszProcName, papszNames[i]) == 0
    435                                                 && RT_SUCCESS(rtProcGetProcessHandle(dwPIDs[dwIdx], pSID, phToken)))
     457                                                && RT_SUCCESS(rtProcGetProcessHandle(adwPIDs[dwIdx], pSID, phToken)))
    436458                                            {
    437                                                 fFound = TRUE;
     459                                                fFound = true;
    438460                                            }
    439461                                        }
     
    552574                         &hTokenLogon);
    553575
    554         BOOL fFound = FALSE;
     576        bool fFound = false;
    555577        HANDLE hTokenUserDesktop = INVALID_HANDLE_VALUE;
    556578        if (fRc)
     
    598620                    {
    599621                        /* Array of process names we want to look for. */
    600                         char *papszProcNames[] =
    601 #ifdef VBOX
    602                         /*
    603                          * Add lookup for "explorer.exe" as a fallback in case the VBox
    604                          * Guest Additions are not (yet) installed, but prefer looking
    605                          * up "VBoxTray.exe" in the first place.
    606                          */
    607                             { { "VBoxTray.exe" },
    608                               { "explorer.exe" },
    609                               NULL
    610                             };
    611 #else
    612                             { { "explorer.exe" },
    613                               NULL
    614                             };
    615 #endif                       
    616                         fFound = rtProcFindProcessByName(papszProcNames,
    617                                                          pSID, &hTokenUserDesktop);
     622                        static const char * const s_papszProcNames[] =
     623                        {
     624#ifdef VBOX                 /* The explorer entry is a fallback in case GA aren't installed. */
     625                            { "VBoxTray.exe" },
     626#endif
     627                            { "explorer.exe" },
     628                            NULL
     629                        };
     630                        fFound = rtProcFindProcessByName(s_papszProcNames, pSID, &hTokenUserDesktop);
    618631                    }
    619632                    else
     
    638651            /*
    639652             * Useful KB articles:
    640              * http://support.microsoft.com/kb/165194/
    641              * http://support.microsoft.com/kb/184802/
    642              * http://support.microsoft.com/kb/327618/
     653             *      http://support.microsoft.com/kb/165194/
     654             *      http://support.microsoft.com/kb/184802/
     655             *      http://support.microsoft.com/kb/327618/
    643656             */
    644657            fRc = CreateProcessAsUserW(*phToken,
     
    681694            case ERROR_PASSWORD_EXPIRED:
    682695            case ERROR_ACCOUNT_RESTRICTION: /* See: http://support.microsoft.com/kb/303846/ */
    683                 rc = VERR_LOGON_FAILURE;
     696                rc = VERR_AUTHENTICATION_FAILURE;
    684697                break;
    685698
     
    818831                 * Get going...
    819832                 */
     833                PROCESS_INFORMATION ProcInfo;
     834                RT_ZERO(ProcInfo);
    820835                DWORD               dwCreationFlags = CREATE_UNICODE_ENVIRONMENT;
    821836                if (fFlags & RTPROC_FLAGS_DETACHED)
    822837                    dwCreationFlags |= DETACHED_PROCESS;
    823 
    824                 PROCESS_INFORMATION ProcInfo;
    825                 RT_ZERO(ProcInfo);
    826838
    827839                /*
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