code: NuProcess start(List<String> commands, String[] environment, Path cwd)
     {
        callPreStart();
  
        try {
           createPipes();
  
           char[] block = getEnvironment(environment);
           Memory env = new Memory(block.length * 3);
           env.write(0, block, 0, block.length);
  
           STARTUPINFO startupInfo = new STARTUPINFO();
           startupInfo.clear();
           startupInfo.cb = new DWORD(startupInfo.size());
           startupInfo.hStdInput = hStdinWidow;
           startupInfo.hStdError = hStderrWidow;
           startupInfo.hStdOutput = hStdoutWidow;
           startupInfo.dwFlags = NuWinNT.STARTF_USESTDHANDLES;
  
           processInfo = new PROCESS_INFORMATION();
  
           DWORD dwCreationFlags = new DWORD(NuWinNT.CREATE_NO_WINDOW | NuWinNT.CREATE_UNICODE_ENVIRONMENT | NuWinNT.CREATE_SUSPENDED);
           char[] cwdChars = (cwd != null) ? Native.toCharArray(cwd.toAbsolutePath().toString()) : null;
           if (!NuKernel32.CreateProcessW(null, getCommandLine(commands), null /*lpProcessAttributes*/, null /*lpThreadAttributes*/, true /*bInheritHandles*/,
                                          dwCreationFlags, env, cwdChars, startupInfo, processInfo)) {
              int lastError = Native.getLastError();
              throw new RuntimeException("CreateProcessW() failed, error: " + lastError);
           }
  
           afterStart();
  
           registerProcess();
  
           callStart();
  
           NuKernel32.ResumeThread(processInfo.hThread);
        }
        catch (Throwable e) {
           e.printStackTrace();
           onExit(Integer.MIN_VALUE);
        }
        finally {
           NuKernel32.CloseHandle(hStdinWidow);
           NuKernel32.CloseHandle(hStdoutWidow);
           NuKernel32.CloseHandle(hStderrWidow);
        }
  
        return this;
     }
docs: ************************************************************************