VirtualBox

Changeset 27385 in vbox for trunk/src/VBox/Runtime/r3


Ignore:
Timestamp:
Mar 15, 2010 10:14:14 PM (15 years ago)
Author:
vboxsync
Message:

iprt: Enabled the RTProcCreateEx code on widnows - the testcase works...

File:
1 edited

Legend:

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

    r27348 r27385  
    4040
    4141#include <iprt/process.h>
     42#include "internal/iprt.h"
     43
    4244#include <iprt/assert.h>
     45#include <iprt/file.h>
    4346#include <iprt/err.h>
    4447#include <iprt/env.h>
     48#include <iprt/getopt.h>
     49#include <iprt/pipe.h>
     50#include <iprt/string.h>
    4551
    4652
     
    165171                               PRTPROCESS phProcess)
    166172{
    167 #if 0 /* needs more work... dinner time. */
     173#if 1 /* needs more work... dinner time. */
    168174    int rc;
    169175
     
    190196    StartupInfo.dwFlags   = STARTF_USESTDHANDLES;
    191197#if 1 /* The CRT should keep the standard handles up to date. */
    192     StartupInfo.hStdIn    = GetStdHandle(STD_INPUT_HANDLE);
    193     StartupInfo.hStdOut  = GetStdHandle(STD_OUTPUT_HANDLE);
    194     StartupInfo.hStdError = GetStdHandle(STD_ERROR_HANDLE);
     198    StartupInfo.hStdInput  = GetStdHandle(STD_INPUT_HANDLE);
     199    StartupInfo.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
     200    StartupInfo.hStdError  = GetStdHandle(STD_ERROR_HANDLE);
    195201#else
    196     StartupInfo.hStdIn    = _get_osfhandle(0);
    197     StartupInfo.hStdOut  = _get_osfhandle(1);
    198     StartupInfo.hStdError = _get_osfhandle(2);
     202    StartupInfo.hStdInput  = _get_osfhandle(0);
     203    StartupInfo.hStdOutput = _get_osfhandle(1);
     204    StartupInfo.hStdError  = _get_osfhandle(2);
    199205#endif
    200206    PCRTHANDLE  paHandles[3] = { phStdIn, phStdOut, phStdErr };
    201     HANDLE     *aphStds[3]   = { &StartupInfo.hStdIn, &StartupInfo.hStdOut, &StartupInfo.hStdError };
     207    HANDLE     *aphStds[3]   = { &StartupInfo.hStdInput, &StartupInfo.hStdOutput, &StartupInfo.hStdError };
    202208    for (int i = 0; i < 3; i++)
    203209    {
     
    208214            {
    209215                case RTHANDLETYPE_FILE:
    210                     aphStds[i] = paHandles[i]->u.hFile != NIL_RTFILE
    211                                ? (HANDLE)RTFileToNative(paHandles[i]->u.hFile)
    212                                : INVALID_HANDLE_VALUE;
     216                    *aphStds[i] = paHandles[i]->u.hFile != NIL_RTFILE
     217                                ? (HANDLE)RTFileToNative(paHandles[i]->u.hFile)
     218                                : INVALID_HANDLE_VALUE;
    213219                    break;
    214220
    215221                case RTHANDLETYPE_PIPE:
    216                     aphStds[i] = paHandles[i]->u.hPipe != NIL_RTPIPE
    217                                ? (HANDLE)RTPipeToNative(paHandles[i]->u.hPipe)
    218                                : INVALID_HANDLE_VALUE;
     222                    *aphStds[i] = paHandles[i]->u.hPipe != NIL_RTPIPE
     223                                ? (HANDLE)RTPipeToNative(paHandles[i]->u.hPipe)
     224                                : INVALID_HANDLE_VALUE;
    219225                    break;
    220226
    221227                //case RTHANDLETYPE_SOCKET:
    222                 //    aphStds[i] = paHandles[i]->u.hSocket != NIL_RTSOCKET
    223                 //               ? (HANDLE)RTTcpToNative(paHandles[i]->u.hSocket)
    224                 //               : INVALID_HANDLE_VALUE;
     228                //    *aphStds[i] = paHandles[i]->u.hSocket != NIL_RTSOCKET
     229                //                ? (HANDLE)RTTcpToNative(paHandles[i]->u.hSocket)
     230                //                : INVALID_HANDLE_VALUE;
    225231                //    break;
    226232
     
    236242     */
    237243    PRTUTF16 pwszzBlock;
    238     rc = RTEnvQueryUtf16Block(hEnv);
     244    rc = RTEnvQueryUtf16Block(hEnv, &pwszzBlock);
    239245    if (RT_SUCCESS(rc))
    240246    {
     
    250256                if (pszAsUser)
    251257                {
    252                     /** @todo - Maybe use CreateProcessWithLoginW? */
     258                    /** @todo - Maybe use CreateProcessWithLoginW? That'll require a password, but
     259                     *        we may need that anyway because it looks like LogonUserW is the only
     260                     *        way to get a hToken.  FIXME */
    253261                    rc = VERR_NOT_IMPLEMENTED;
    254262                }
     
    261269                    RT_ZERO(ProcInfo);
    262270                    BOOL fRc;
    263                     if (!pwszAsUser)
     271                    if (hToken == INVALID_HANDLE_VALUE)
    264272                        fRc = CreateProcessW(pwszExec,
    265273                                             pwszCmdLine,
    266274                                             NULL,         /* pProcessAttributes */
    267275                                             NULL,         /* pThreadAttributes */
    268                                              TRUE,         /* bInheritHandles */
     276                                             TRUE,         /* fInheritHandles */
    269277                                             CREATE_UNICODE_ENVIRONMENT, /* dwCreationFlags */
    270278                                             pwszzBlock,
    271                                              cwd,
     279                                             NULL,          /* pCurrentDirectory */
    272280                                             &StartupInfo,
    273281                                             &ProcInfo);
     
    278286                                                   NULL,         /* pProcessAttributes */
    279287                                                   NULL,         /* pThreadAttributes */
    280                                                    TRUE,         /* bInheritHandles */
     288                                                   TRUE,         /* fInheritHandles */
    281289                                                   CREATE_UNICODE_ENVIRONMENT, /* dwCreationFlags */
    282290                                                   pwszzBlock,
    283                                                    cwd,
     291                                                   NULL,          /* pCurrentDirectory */
    284292                                                   &StartupInfo,
    285293                                                   &ProcInfo);
     
    287295                    if (fRc)
    288296                    {
    289                         //DWORD dwErr;
    290                         //DWORD dwExitCode;
    291                         //
    292                         //CloseHandle(ProcInfo.hThread);
    293                         //dwErr = WaitForSingleObject(ProcInfo.hProcess, INFINITE);
    294                         //assert(dwErr == WAIT_OBJECT_0);
    295                         //
    296                         //if (GetExitCodeProcess(ProcInfo.hProcess, &dwExitCode))
    297                         //{
    298                         //    CloseHandle(ProcInfo.hProcess);
    299                         //    _exit(dwExitCode);
    300                         //}
    301                         //errno = EINVAL;
     297                        CloseHandle(ProcInfo.hThread);
     298                        CloseHandle(ProcInfo.hProcess);
     299                        if (phProcess)
     300                            *phProcess = ProcInfo.dwProcessId;
     301                        rc = VINF_SUCCESS;
    302302                    }
     303                    else
     304                        rc = RTErrConvertFromWin32(GetLastError());
    303305
    304306                    if (hToken == INVALID_HANDLE_VALUE)
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