CreateProcess to execute Windows command

Oumaya picture Oumaya · Dec 10, 2012 · Viewed 12.7k times · Source

I am trying to execute a dos command using CreateProcess function :

 LPWSTR cmd=(LPWSTR)QString("C:\\windows\\system32\\cmd.exe  subst " + DLetter+"  \""+mountPath+"\"").utf16();



        STARTUPINFO si;
        PROCESS_INFORMATION pi;
        ZeroMemory( &si, sizeof(si) );
        si.cb = sizeof(si);
        ZeroMemory( &pi, sizeof(pi) );

        if ( CreateProcessW(0,     // Application name
                           cmd,                 // Application arguments
                           NULL,
                           NULL,
                           TRUE,
                           0,
                           NULL,
                           L"C:\\windows\\system32",          // Working directory
                           &si,
                           &pi) == TRUE)
        { ...

it give as last error 3 = ERROR_PATH_NOT_FOUND, when I separate the application path "C:\\windows\\system32\\cmd.exe" from the command it shows the console without executing my subst command.

Any help will be appreciated.

Answer

David Heffernan picture David Heffernan · Dec 10, 2012

You need to include either /C or /K in the options to cmd.exe.

/C      Carries out the command specified by string and then terminates
/K      Carries out the command specified by string but remains

Without one these options, the subst command that you pass is simply ignored.

Having said that, subst, at least on my Windows 7 box, is not implemented inside cmd.exe. It is a separate executable. So you can invoke it directly and bypass cmd.exe completely.

Regarding your call to CreateProcess I have the following comments:

  1. Don't include the path C:\\windows\\system32. Just invoke subst.exe and let the system locate the executable using the standard search path.
  2. Pass FALSE for bInheritHandles. You aren't passing any handles to the new process and so you don't need the new process to inherit your handles.
  3. Pass NULL as the working directory. There's just no need to specify it here.