adb: win32: fix regression on older versions of Windows

On Windows 7, GetStdHandle() may return console pseudo-handles. If you
call SetHandleInformation(h, HANDLE_FLAG_INHERIT, 0) on such a handle,
it will fail. These failures should be ignored like the old code.

Newer versions of Windows return real handles that don't have this
issue. Console pseudo-handles can apparently be identified by the values
3, 7, 11.

This is a regression from 2122c7a1483dc6050b33f58fad4a15d5acd79fdd.

https://code.google.com/p/android/issues/detail?id=186599

Change-Id: I287a74a81d37e0ebe62d673a3f5651ee5439c0d2
Signed-off-by: Spencer Low <CompareAndSwap@gmail.com>
diff --git a/adb/adb.cpp b/adb/adb.cpp
index 1249822..039e841 100644
--- a/adb/adb.cpp
+++ b/adb/adb.cpp
@@ -582,15 +582,27 @@
 
 #ifdef _WIN32
 
-static bool _make_handle_noninheritable(HANDLE h) {
+// Try to make a handle non-inheritable and if there is an error, don't output
+// any error info, but leave GetLastError() for the caller to read. This is
+// convenient if the caller is expecting that this may fail and they'd like to
+// ignore such a failure.
+static bool _try_make_handle_noninheritable(HANDLE h) {
     if (h != INVALID_HANDLE_VALUE && h != NULL) {
-        if (!SetHandleInformation(h, HANDLE_FLAG_INHERIT, 0)) {
-            // Show the handle value to give us a clue in case we have problems
-            // with pseudo-handle values.
-            fprintf(stderr, "Cannot make handle 0x%p non-inheritable: %s\n",
-                    h, SystemErrorCodeToString(GetLastError()).c_str());
-            return false;
-        }
+        return SetHandleInformation(h, HANDLE_FLAG_INHERIT, 0) ? true : false;
+    }
+
+    return true;
+}
+
+// Try to make a handle non-inheritable with the expectation that this should
+// succeed, so if this fails, output error info.
+static bool _make_handle_noninheritable(HANDLE h) {
+    if (!_try_make_handle_noninheritable(h)) {
+        // Show the handle value to give us a clue in case we have problems
+        // with pseudo-handle values.
+        fprintf(stderr, "Cannot make handle 0x%p non-inheritable: %s\n",
+                h, SystemErrorCodeToString(GetLastError()).c_str());
+        return false;
     }
 
     return true;
@@ -742,16 +754,13 @@
      * If we're still having problems with inheriting random handles in the
      * future, consider using PROC_THREAD_ATTRIBUTE_HANDLE_LIST to explicitly
      * specify which handles should be inherited: http://blogs.msdn.com/b/oldnewthing/archive/2011/12/16/10248328.aspx
+     *
+     * Older versions of Windows return console pseudo-handles that cannot be
+     * made non-inheritable, so ignore those failures.
      */
-    if (!_make_handle_noninheritable(GetStdHandle(STD_INPUT_HANDLE))) {
-        return -1;
-    }
-    if (!_make_handle_noninheritable(GetStdHandle(STD_OUTPUT_HANDLE))) {
-        return -1;
-    }
-    if (!_make_handle_noninheritable(GetStdHandle(STD_ERROR_HANDLE))) {
-        return -1;
-    }
+    _try_make_handle_noninheritable(GetStdHandle(STD_INPUT_HANDLE));
+    _try_make_handle_noninheritable(GetStdHandle(STD_OUTPUT_HANDLE));
+    _try_make_handle_noninheritable(GetStdHandle(STD_ERROR_HANDLE));
 
     STARTUPINFOW    startup;
     ZeroMemory( &startup, sizeof(startup) );