Chromium 如何禁用自动加载指定路径扩展 c++

之前文章提到过浏览器启动会从[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Google\Chrome\Extensions\

注册表下自动搜索需要加载的扩展,那么如何禁用此功能呢?

直接看源码

chrome\browser\extensions\external_registry_loader_win.cc

chrome\browser\extensions\external_registry_loader_win.cc// The Registry subkey that contains information about external extensions.
const wchar_t kRegistryExtensions[] = L"Software\\Google\\Chrome\\Extensions";std::unique_ptr<base::DictionaryValue>
ExternalRegistryLoader::LoadPrefsOnBlockingThread() {auto prefs = std::make_unique<base::DictionaryValue>();//此函数会遍历[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Google\Chrome\Extensions\// A map of IDs, to weed out duplicates between HKCU and HKLM.std::set<std::wstring> keys;base::win::RegistryKeyIterator iterator_machine_key(HKEY_LOCAL_MACHINE,kRegistryExtensions,KEY_WOW64_32KEY);for (; iterator_machine_key.Valid(); ++iterator_machine_key)keys.insert(iterator_machine_key.Name());base::win::RegistryKeyIterator iterator_user_key(HKEY_CURRENT_USER, kRegistryExtensions);for (; iterator_user_key.Valid(); ++iterator_user_key)keys.insert(iterator_user_key.Name());// Iterate over the keys found, first trying HKLM, then HKCU, as per Windows// policy conventions. We only fall back to HKCU if the HKLM key cannot be// opened, not if the data within the key is invalid, for example.for (auto it = keys.begin(); it != keys.end(); ++it) {base::win::RegKey key;std::wstring key_path = kRegistryExtensions;key_path.append(L"\\");key_path.append(*it);if (key.Open(HKEY_LOCAL_MACHINE,key_path.c_str(),KEY_READ | KEY_WOW64_32KEY) != ERROR_SUCCESS &&key.Open(HKEY_CURRENT_USER, key_path.c_str(), KEY_READ) !=ERROR_SUCCESS) {LOG(ERROR) << "Unable to read registry key at path (HKLM & HKCU): "<< key_path << ".";continue;}std::string id = base::ToLowerASCII(base::WideToASCII(*it));if (!crx_file::id_util::IdIsValid(id)) {LOG(ERROR) << "Invalid id value " << id<< " for key " << key_path << ".";continue;}std::wstring extension_dist_id;if (key.ReadValue(kRegistryExtensionInstallParam, &extension_dist_id) ==ERROR_SUCCESS) {prefs->SetString(MakePrefName(id, ExternalProviderImpl::kInstallParam),base::WideToASCII(extension_dist_id));}// If there is an update URL present, copy it to prefs and ignore// path and version keys for this entry.std::wstring extension_update_url;if (key.ReadValue(kRegistryExtensionUpdateUrl, &extension_update_url)== ERROR_SUCCESS) {prefs->SetString(MakePrefName(id, ExternalProviderImpl::kExternalUpdateUrl),base::WideToASCII(extension_update_url));continue;}std::wstring extension_path_str;if (key.ReadValue(kRegistryExtensionPath, &extension_path_str)!= ERROR_SUCCESS) {// TODO(erikkay): find a way to get this into about:extensionsLOG(ERROR) << "Missing value " << kRegistryExtensionPath<< " for key " << key_path << ".";continue;}base::FilePath extension_path(extension_path_str);if (!extension_path.IsAbsolute()) {LOG(ERROR) << "File path " << extension_path_str<< " needs to be absolute in key "<< key_path;continue;}if (!base::PathExists(extension_path)) {LOG(ERROR) << "File " << extension_path_str<< " for key " << key_path<< " does not exist or is not readable.";continue;}if (!CanOpenFileForReading(extension_path)) {LOG(ERROR) << "File " << extension_path_str<< " for key " << key_path << " can not be read. "<< "Check that users who should have the extension "<< "installed have permission to read it.";continue;}std::wstring extension_version;if (key.ReadValue(kRegistryExtensionVersion, &extension_version)!= ERROR_SUCCESS) {// TODO(erikkay): find a way to get this into about:extensionsLOG(ERROR) << "Missing value " << kRegistryExtensionVersion<< " for key " << key_path << ".";continue;}base::Version version(base::WideToASCII(extension_version));if (!version.IsValid()) {LOG(ERROR) << "Invalid version value " << extension_version<< " for key " << key_path << ".";continue;}prefs->SetString(MakePrefName(id, ExternalProviderImpl::kExternalVersion),base::WideToASCII(extension_version));prefs->SetString(MakePrefName(id, ExternalProviderImpl::kExternalCrx),base::AsString16(extension_path_str));prefs->SetBoolean(MakePrefName(id, ExternalProviderImpl::kMayBeUntrusted),true);}return prefs;
}//加载void ExternalRegistryLoader::LoadOnBlockingThread() {DCHECK(task_runner_);DCHECK(task_runner_->RunsTasksInCurrentSequence());base::TimeTicks start_time = base::TimeTicks::Now();std::unique_ptr<base::DictionaryValue> prefs = LoadPrefsOnBlockingThread();LOCAL_HISTOGRAM_TIMES("Extensions.ExternalRegistryLoaderWin",base::TimeTicks::Now() - start_time);content::GetUIThreadTaskRunner({})->PostTask(FROM_HERE,base::BindOnce(&ExternalRegistryLoader::CompleteLoadAndStartWatchingRegistry, this,std::move(prefs)));
}//更新
void ExternalRegistryLoader::UpatePrefsOnBlockingThread() {DCHECK(task_runner_);DCHECK(task_runner_->RunsTasksInCurrentSequence());base::TimeTicks start_time = base::TimeTicks::Now();std::unique_ptr<base::DictionaryValue> prefs = LoadPrefsOnBlockingThread();LOCAL_HISTOGRAM_TIMES("Extensions.ExternalRegistryLoaderWinUpdate",base::TimeTicks::Now() - start_time);content::GetUIThreadTaskRunner({})->PostTask(FROM_HERE, base::BindOnce(&ExternalRegistryLoader::OnUpdated, this,std::move(prefs)));
}


结论: LoadPrefsOnBlockingThread函数会在以上两个函数调用,所以直接将LoadPrefsOnBlockingThread函数返回值置成空即可。
std::unique_ptr<base::DictionaryValue>
ExternalRegistryLoader::LoadPrefsOnBlockingThread() {
  auto prefs = std::make_unique<base::DictionaryValue>();
  return prefs ;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/55188.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

制作 rootfs步骤

1. 准备工作 地平线开发板通过root访问权限&#xff0c; 在开发板中安装所有的依赖库 2. 在开发板创建 rootfs 通过地平线开发板创建一个跟文件系统(rootfs)的方法是通过 chroot 工具将文件系统打包 2.1 挂载必需的文件系统 确保挂载必要的虚拟文件系统&#xff0c;以便正…

隐藏SpringBoot自动生成的文件

第一种方法——删除 第二种方法——Settings——Editor——fail types

做数据抓取工作要如何选择ip池

选择合适的IP池对于数据抓取工作至关重要。一个优质的IP池可以提高抓取的效率和成功率&#xff0c;同时减少被目标网站封禁的风险。以下是选择IP池时需要考虑的一些关键因素&#xff1a; 1. IP类型 住宅IP&#xff1a;住宅IP通常来自真实用户&#xff0c;难以被识别为代理。它…

idea 创建多模块项目

一、新建项目&#xff0c;创建父工程 新建项目&#xff0c;选择 spring initializr 填写相关信息后提交 删除不相关的目录&#xff0c;如下 修改打包方式为 pom&#xff0c;在 pom.xml 文件中新增一行&#xff0c;如下 二、创建子模块 新增子模块 三、修改 pom 文件 修…

2024首届人工智能计量学术大会在合肥成功召开

9月25日至9月26日&#xff0c;由中国计量测试学会主办&#xff0c;北京航天计量测试技术研究所承办的首届人工智能计量学术大会在安徽省合肥市召开。本次大会以“人工智能计量助力新质生产力发展”为主题&#xff0c;汇集人工智能及其计量测试等领域院士、专家和学者&#xff0…

怎样用python+sqlalchemy获得mssql视图对应物理表关系(二)

话不多说 目标:为了实现低代码数据视图对接,有必要得到视图所对应物理表及字段名称,字段类型等 1)约束:视图中用到的物理表不能起别名,所以修改上一篇中存储过程建立语句 USE [agui_conn] GO /****** Object: StoredProcedure [dbo].[sp_GetOrdersByTimestamp] Script D…

云服务升级的兼容性测试

云服务升级后&#xff0c;用户使用的前端版本和升级服务可能存在兼容问题&#xff0c;需要进行兼容性验证。 最复杂的兼容性测试&#xff0c;是对所有支持版本都进行完整回归验证&#xff0c;但这种方式耗时耗力&#xff0c;对大多数公司来说&#xff0c;均不太可行。 从风险…

04 面部表情识别:Pytorch实现表情识别-表情数据集训练代码

总目录&#xff1a;人脸检测与表情分类 https://blog.csdn.net/whiffeyf/category_12793480.html 目录 0 相关资料1 面部表情识数据集2 模型下载3 训练 0 相关资料 面部表情识别2&#xff1a;Pytorch实现表情识别(含表情识别数据集和训练代码)&#xff1a;https://blog.csdn.n…

vscode配置Eslint后保存出现大量波浪线

解决问题&#xff1a;配置代码格式化 快捷键打开设置&#xff1a;ctrlshiftP 输入&#xff1a; format code 选择&#xff1a;

UE5 项目缓存文件删除、版本控制说明(工程目录结构)

文章目录 前言一、项目文件示例二、缓存文件删除、版本控制说明前言 我们在拷贝项目或者使用 Git 进行版本控制,如果不对文件选择性的控制,大量缓存文件会导致传输速度变慢;或者我们的项目报错了,想要删除缓存文件又不知如何下手,哪些是可删除的,哪些又是不可删除的,本…

SLA(立体光固化成型技术)

01 SLA 3D打印技术简介 SLA工艺简介 SLA是"Stereo lithography Appearance"的缩写&#xff0c;即立体光固化成型法。用特定波长与强度的激光聚焦到光固化材料表面&#xff0c;使之由点到线&#xff0c;由线到面顺序凝固&#xff0c;完成一个层面的绘图作业&#x…

OpenCV图像文件读写(4)解码图像数据函数imdecode()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 从内存缓冲区读取图像。 imdecode 函数从指定的内存缓冲区读取图像。如果缓冲区太短或包含无效数据&#xff0c;函数将返回一个空矩阵 (Mat::dat…

儿童乐园软件下载安装 佳易王游乐场会员扣次管理系统操作教程

一、前言 儿童乐园软件下载安装 佳易王游乐场会员扣次管理系统操作教程 软件为绿色免安装版&#xff0c;已经内置数据库&#xff0c;不需再安装数据库文件&#xff0c;软件解压即可。 二、软件程序教程 1、软件可同时管理多个项目&#xff0c;项目设置方法如图&#xff0c;点…

一般的网页结构是什么样的?

网页源码结构概述 一个典型的网页源码结构通常包含以下几个主要部分&#xff1a; ‌DOCTYPE 声明‌ 位于HTML文档的最前面&#xff0c;用于告诉浏览器文档使用哪个HTML版本进行解析。例如&#xff1a;<!DOCTYPE html>。 ‌html 元素‌ 这是整个HTML文档的根元素&#xf…

mariadb无法存储中文

如果 MariaDB 无法存储中文&#xff0c;可能有以下几个原因及解决方法&#xff1a; 一、字符集设置问题 1.检查数据库字符集&#xff1a; 使用以下 SQL 语句查看当前数据库的字符集设置&#xff1a; SHOW VARIABLES LIKE character_set_database;SHOW VARIABLES LIKE collat…

基于微信小程序爱心领养小程序设计与实现(源码+参考文档+定制开发)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

grafana频繁DataSourceError问题

背景 随着 Grafana 数据量的不断增加&#xff0c;逐渐暴露出以下问题&#xff1a; Grafana 页面加载缓慢&#xff1b;Grafana 告警频繁出现 DatasourceError 错误。 对于第一个问题&#xff0c;大家可以参考这篇文章&#xff1a;Grafana 加载缓慢的解决方案。 不过&#xf…

828华为云征文|华为云Flexus X实例Windows Server 2019安装护卫神防火墙——为企业运维安全发挥重要作用!!!

前言 公司最近需要选购一台华为云Windows服务器部署产品应用&#xff0c;但是考虑到Windows的安全性至关重要。护卫神防火墙无疑是守护Windows系统安全的得力助手。 华为云以其强大的性能和稳定的服务&#xff0c;为众多企业和开发者提供了可靠的云端基础设施。在网络环境日益复…

【Python报错已解决】 TypeError: ‘ellipsis‘ object is not subscriptable

引言&#xff1a; 在Python开发过程中&#xff0c;遇到报错是家常便饭。而每一种报错都像是一个谜题&#xff0c;等待着开发者去解开。今天我们就来探讨一个特定的Python报错&#xff1a;TypeError: ‘ellipsis‘ object is not subscriptable。这个报错可能会让很多开发者感到…

【高效办公】商汤办公小浣熊微信小程序:随时随地搞定数据分析

在这个数据驱动的时代&#xff0c;无论是职场新人还是经验丰富的专业人士&#xff0c;都需要处理大量的数据和报表。为了提高工作效率&#xff0c;各种智能化工具层出不穷。今天要向大家推荐一款由商汤科技研发的高效数据分析工具——“办公小浣熊”&#xff01; 一、办公小浣…