| Index: chrome_frame/chrome_launcher.cc
|
| diff --git a/chrome_frame/chrome_launcher.cc b/chrome_frame/chrome_launcher.cc
|
| index f1a973309502a1b6b2acbd3fc721eb09aaeb5b2c..88fc0dab7dce78d7f3add8ac846359d9df7d7073 100644
|
| --- a/chrome_frame/chrome_launcher.cc
|
| +++ b/chrome_frame/chrome_launcher.cc
|
| @@ -8,6 +8,8 @@
|
| #include <shellapi.h>
|
| #include <shlwapi.h>
|
|
|
| +#include "policy/policy_constants.h"
|
| +
|
| // Herein lies stuff selectively stolen from Chrome. We don't pull it in
|
| // directly because all of it results in many things we don't want being
|
| // included as well.
|
| @@ -140,6 +142,57 @@ bool IsValidCommandLine(const wchar_t* command_line) {
|
| return success;
|
| }
|
|
|
| +// Looks up optionally configured launch parameters for Chrome that may have
|
| +// been set via group policy.
|
| +void AppendAdditionalLaunchParameters(std::wstring* command_line) {
|
| + static const HKEY kRootKeys[] = {
|
| + HKEY_LOCAL_MACHINE,
|
| + HKEY_CURRENT_USER
|
| + };
|
| +
|
| + std::wstring launch_params_value_name(
|
| + &policy::key::kAdditionalLaunchParameters[0],
|
| + &policy::key::kAdditionalLaunchParameters[
|
| + lstrlenA(policy::key::kAdditionalLaunchParameters)]);
|
| +
|
| + // Used for basic checks since CreateProcess doesn't support command lines
|
| + // longer than 0x8000 characters. If we surpass that length, we do not add the
|
| + // additional parameters. Because we need to add a space before the
|
| + // extra parameters, we use 0x7fff and not 0x8000.
|
| + const size_t kMaxChars = 0x7FFF - command_line->size();
|
| + HKEY key;
|
| + LONG result;
|
| + bool found = false;
|
| + for (int i = 0; !found && i < arraysize(kRootKeys); ++i) {
|
| + result = ::RegOpenKeyExW(kRootKeys[i], policy::kRegistryMandatorySubKey, 0,
|
| + KEY_QUERY_VALUE, &key);
|
| + if (result == ERROR_SUCCESS) {
|
| + DWORD size = 0;
|
| + DWORD type = 0;
|
| + result = RegQueryValueExW(key, launch_params_value_name.c_str(),
|
| + 0, &type, NULL, &size);
|
| + if (result == ERROR_SUCCESS && type == REG_SZ && size > 0 &&
|
| + (size / sizeof(wchar_t)) < kMaxChars) {
|
| + // This size includes any terminating null character or characters
|
| + // unless the data was stored without them, so for safety we allocate
|
| + // one extra char and zero out the buffer.
|
| + wchar_t* value = new wchar_t[(size / sizeof(wchar_t)) + 1];
|
| + memset(value, 0, size + sizeof(wchar_t));
|
| + result = RegQueryValueExW(key, launch_params_value_name.c_str(), 0,
|
| + &type, reinterpret_cast<BYTE*>(&value[0]),
|
| + &size);
|
| + if (result == ERROR_SUCCESS) {
|
| + *command_line += L' ';
|
| + *command_line += value;
|
| + found = true;
|
| + }
|
| + delete [] value;
|
| + }
|
| + ::RegCloseKey(key);
|
| + }
|
| + }
|
| +}
|
| +
|
| bool SanitizeAndLaunchChrome(const wchar_t* command_line) {
|
| bool success = false;
|
| if (IsValidCommandLine(command_line)) {
|
| @@ -157,6 +210,9 @@ bool SanitizeAndLaunchChrome(const wchar_t* command_line) {
|
| command_line += args;
|
| }
|
|
|
| + // Append parameters that might be set by group policy.
|
| + AppendAdditionalLaunchParameters(&command_line);
|
| +
|
| STARTUPINFO startup_info = {0};
|
| startup_info.cb = sizeof(startup_info);
|
| startup_info.dwFlags = STARTF_USESHOWWINDOW;
|
|
|