Merge pull request #1474 from mathstuf/win32-invalid-parameter-help

Win32 invalid parameter help
diff --git a/doc/manual.asciidoc b/doc/manual.asciidoc
index 86d9aaa..7b1c3ba 100644
--- a/doc/manual.asciidoc
+++ b/doc/manual.asciidoc
@@ -880,7 +880,8 @@
 are usually provided by the C library.  If you need shell
 interpretation of the command (such as the use of `&&` to chain
 multiple commands), make the command execute the Windows shell by
-prefixing the command with `cmd /c`.
+prefixing the command with `cmd /c`. Ninja may error with "invalid parameter"
+which usually indicates that the command line length has been exceeded.
 
 [[ref_outputs]]
 Build outputs
diff --git a/src/subprocess-win32.cc b/src/subprocess-win32.cc
index 5982b06..a4a7669 100644
--- a/src/subprocess-win32.cc
+++ b/src/subprocess-win32.cc
@@ -124,6 +124,10 @@
       buf_ = "CreateProcess failed: The system cannot find the file "
           "specified.\n";
       return true;
+    } else if (error == ERROR_INVALID_PARAMETER) {
+      // This generally means that the command line was too long. Give extra
+      // context for this case.
+      Win32Fatal("CreateProcess", "is the command line too long?");
     } else {
       Win32Fatal("CreateProcess");    // pass all other errors to Win32Fatal
     }
diff --git a/src/util.cc b/src/util.cc
index e793a92..47a5de2 100644
--- a/src/util.cc
+++ b/src/util.cc
@@ -442,8 +442,12 @@
   return msg;
 }
 
-void Win32Fatal(const char* function) {
-  Fatal("%s: %s", function, GetLastErrorString().c_str());
+void Win32Fatal(const char* function, const char* hint) {
+  if (hint) {
+    Fatal("%s: %s (%s)", function, GetLastErrorString().c_str(), hint);
+  } else {
+    Fatal("%s: %s", function, GetLastErrorString().c_str());
+  }
 }
 #endif
 
diff --git a/src/util.h b/src/util.h
index 1b4227c..6a4a7a9 100644
--- a/src/util.h
+++ b/src/util.h
@@ -119,7 +119,7 @@
 string GetLastErrorString();
 
 /// Calls Fatal() with a function name and GetLastErrorString.
-NORETURN void Win32Fatal(const char* function);
+NORETURN void Win32Fatal(const char* function, const char* hint = NULL);
 #endif
 
 #endif  // NINJA_UTIL_H_