普通文本  |  57行  |  1.85 KB

// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chrome/common/terminate_on_heap_corruption_experiment_win.h"

#include "base/command_line.h"
#include "base/metrics/field_trial.h"
#include "base/win/registry.h"
#include "chrome/common/chrome_constants.h"
#include "chrome/common/chrome_version_info.h"

namespace {

const wchar_t* GetBeaconKeyPath() {
  chrome::VersionInfo::Channel channel = chrome::VersionInfo::CHANNEL_UNKNOWN;

  // We are called quite early, before the CommandLine is initialized. We don't
  // want to permanently initialize it because ContentMainRunner::Initialize
  // sets some locale-related stuff to make sure it is parsed properly. But we
  // can temporarily initialize it for the purpose of determining if we are
  // Canary.
  if (!CommandLine::InitializedForCurrentProcess()) {
    CommandLine::Init(0, NULL);
    channel = chrome::VersionInfo::GetChannel();
    CommandLine::Reset();
  } else {
    channel = chrome::VersionInfo::GetChannel();
  }

  if (channel == chrome::VersionInfo::CHANNEL_CANARY) {
    return L"SOFTWARE\\" PRODUCT_STRING_PATH
        L"\\DisableTerminateOnProcessHeapCorruptionSxs";
  }
  return L"SOFTWARE\\" PRODUCT_STRING_PATH
      L"\\DisableTerminateOnProcessHeapCorruption";
}

}  // namespace

bool ShouldExperimentallyDisableTerminateOnHeapCorruption() {
  base::win::RegKey regkey(
      HKEY_CURRENT_USER, GetBeaconKeyPath(), KEY_QUERY_VALUE);
  return regkey.Valid();
}

void InitializeDisableTerminateOnHeapCorruptionExperiment() {
  base::win::RegKey regkey(HKEY_CURRENT_USER);

  if (base::FieldTrialList::FindFullName("TerminateOnProcessHeapCorruption") ==
      "Disabled") {
    regkey.CreateKey(GetBeaconKeyPath(), KEY_SET_VALUE);
  } else {
    regkey.DeleteKey(GetBeaconKeyPath());
  }
}