Implement the broker process that launches NaCl loader processes on 64-bit Windows systems. 

BUG=28176
TEST=none

Committed: http://src.chromium.org/viewvc/chrome?view=rev&revision=37578
Review URL: http://codereview.chromium.org/542030

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@37720 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/chrome/app/client_util.cc b/chrome/app/client_util.cc
index fae039f..074b6c8 100644
--- a/chrome/app/client_util.cc
+++ b/chrome/app/client_util.cc
@@ -7,6 +7,7 @@
 
 #include "chrome/app/breakpad_win.h"
 #include "chrome/app/client_util.h"
+#include "chrome/common/chrome_switches.h"
 #include "chrome/common/result_codes.h"
 #include "chrome/installer/util/browser_distribution.h"
 #include "chrome/installer/util/install_util.h"
@@ -83,7 +84,22 @@
 // value not being null to dermine if this path contains a valid dll.
 HMODULE LoadChromeWithDirectory(std::wstring* dir) {
   ::SetCurrentDirectoryW(dir->c_str());
+#ifdef _WIN64
+  const CommandLine& cmd_line = *CommandLine::ForCurrentProcess();
+  if ((cmd_line.GetSwitchValueASCII(switches::kProcessType) ==
+      switches::kNaClBrokerProcess) ||
+      (cmd_line.GetSwitchValueASCII(switches::kProcessType) ==
+      switches::kNaClLoaderProcess)) {
+    // Load the 64-bit DLL when running in a 64-bit process.
+    dir->append(installer_util::kChromeNaCl64Dll);
+  } else {
+    // Only NaCl broker and loader can be launched as Win64 processes.
+    NOTREACHED();
+    return NULL;
+  }
+#else
   dir->append(installer_util::kChromeDll);
+#endif
   return ::LoadLibraryExW(dir->c_str(), NULL,
                           LOAD_WITH_ALTERED_SEARCH_PATH);
 }