Windows, JNI: move command line creation logic

Move and unite command line creation and working
directory-related logic just above Job object
creation.

The next PR will split NativeProcess::Create to a
static and non-static part. The static part will
contain the Job object and process creation logic,
the non-static part will contain the JNI-related
logic. The static part will later move to a
separate class (WaitableProcess), like the other
static methods (Terminate, WaitFor, GetExitCode).

Closes #8054.

PiperOrigin-RevId: 243767112
diff --git a/src/main/native/windows/processes-jni.cc b/src/main/native/windows/processes-jni.cc
index 5200bc5..2774650 100644
--- a/src/main/native/windows/processes-jni.cc
+++ b/src/main/native/windows/processes-jni.cc
@@ -168,30 +168,12 @@
                   jbyteArray java_env, jstring java_cwd,
                   jstring java_stdout_redirect, jstring java_stderr_redirect,
                   jboolean redirectErrorStream) {
-    std::wstring argv0;
     std::wstring wpath(bazel::windows::GetJavaWpath(env, java_argv0));
-    std::wstring error_msg(
-        bazel::windows::AsExecutablePathForCreateProcess(wpath, &argv0));
-    if (!error_msg.empty()) {
-      error_ = bazel::windows::MakeErrorMessage(
-          WSTR(__FILE__), __LINE__, L"nativeCreateProcess", wpath, error_msg);
-      return false;
-    }
 
-    std::wstring commandline =
-        argv0 + L" " + bazel::windows::GetJavaWstring(env, java_argv_rest);
     std::wstring stdout_redirect = bazel::windows::AddUncPrefixMaybe(
         bazel::windows::GetJavaWpath(env, java_stdout_redirect));
     std::wstring stderr_redirect = bazel::windows::AddUncPrefixMaybe(
         bazel::windows::GetJavaWpath(env, java_stderr_redirect));
-    std::wstring cwd;
-    std::wstring wcwd(bazel::windows::GetJavaWpath(env, java_cwd));
-    error_msg = bazel::windows::AsShortPath(wcwd, &cwd);
-    if (!error_msg.empty()) {
-      error_ = bazel::windows::MakeErrorMessage(
-          WSTR(__FILE__), __LINE__, L"nativeCreateProcess", wpath, error_msg);
-      return false;
-    }
 
     const bool stdout_is_stream = stdout_redirect.empty();
     const bool stderr_is_stream =
@@ -203,11 +185,6 @@
          _wcsnicmp(stderr_redirect.c_str(), stdout_redirect.c_str(),
                    stderr_redirect.size()) == 0);
 
-    std::unique_ptr<WCHAR[]> mutable_commandline(
-        new WCHAR[commandline.size() + 1]);
-    wcsncpy(mutable_commandline.get(), commandline.c_str(),
-            commandline.size() + 1);
-
     SECURITY_ATTRIBUTES sa = {0};
     sa.nLength = sizeof(SECURITY_ATTRIBUTES);
     sa.bInheritHandle = TRUE;
@@ -219,7 +196,6 @@
     bazel::windows::AutoHandle stdin_process;
     bazel::windows::AutoHandle stdout_process;
     bazel::windows::AutoHandle stderr_process;
-    bazel::windows::AutoHandle thread;
 
     JavaByteArray env_map(env, java_env);
     if (env_map.ptr() != nullptr) {
@@ -343,6 +319,29 @@
       stderr_process = pipe_write_h;
     }
 
+    std::wstring cwd;
+    std::wstring wcwd(bazel::windows::GetJavaWpath(env, java_cwd));
+    std::wstring error_msg(bazel::windows::AsShortPath(wcwd, &cwd));
+    if (!error_msg.empty()) {
+      error_ = bazel::windows::MakeErrorMessage(
+          WSTR(__FILE__), __LINE__, L"nativeCreateProcess", wpath, error_msg);
+      return false;
+    }
+
+    std::wstring argv0;
+    error_msg = bazel::windows::AsExecutablePathForCreateProcess(wpath, &argv0);
+    if (!error_msg.empty()) {
+      error_ = bazel::windows::MakeErrorMessage(
+          WSTR(__FILE__), __LINE__, L"nativeCreateProcess", wpath, error_msg);
+      return false;
+    }
+
+    std::wstring commandline =
+        argv0 + L" " + bazel::windows::GetJavaWstring(env, java_argv_rest);
+    std::unique_ptr<WCHAR[]> mutable_commandline(
+        new WCHAR[commandline.size() + 1]);
+    wcsncpy(mutable_commandline.get(), commandline.c_str(),
+            commandline.size() + 1);
     // MDSN says that the default for job objects is that breakaway is not
     // allowed. Thus, we don't need to do any more setup here.
     job_ = CreateJobObject(NULL, NULL);
@@ -436,7 +435,7 @@
 
     pid_ = process_info.dwProcessId;
     process_ = process_info.hProcess;
-    thread = process_info.hThread;
+    bazel::windows::AutoHandle thread(process_info.hThread);
 
     if (!AssignProcessToJobObject(job_, process_)) {
       BOOL is_in_job = false;