动态链接库搜索顺序
动态链接库搜索顺序
同一动态链接库 (DLL) 的多个版本通常存在于操作系统 (OS) 内的不同文件系统位置。 可以通过指定完整路径来控制从中加载任何给定 DLL 的特定位置。 但是,如果不使用该方法,则系统会在加载时搜索 DLL,如本主题中所述。 DLL 加载程序是操作系统 (操作系统) 的一部分,用于加载 DLL 和/或解析对 DLL 的引用。
提示
有关 打包 应用和 未打包 应用的定义,请参阅 打包应用的优缺点。
影响搜索的因素
下面是本主题中讨论的一些特殊搜索因素-你可以将其视为 DLL 搜索顺序的一部分。 本主题的后续部分按特定应用类型的相应搜索顺序以及其他搜索位置列出了这些因素。 本部分只是为了介绍概念,并为其提供名称,我们将在本主题的后面部分引用这些概念。
- DLL 重定向。 有关详细信息,请参阅 动态链接库重定向。
- API 集。 有关详细信息,请参阅 Windows API 集。
- 并行 (SxS) 清单重定向 - 桌面应用仅 (不) UWP 应用。 可以使用应用程序清单 (也称为并行应用程序清单或融合清单) 进行重定向。 有关详细信息,请参阅 清单。
- Loaded-module 列表。 系统可以检查是否已将具有相同模块名称的 DLL 加载到内存 (,无论该 DLL 是从) 加载的。
- 已知 DLL。 如果 DLL 位于运行应用程序的 Windows 版本的已知 DLL 列表中,则系统会使用其已知 DLL (副本和已知 DLL 的依赖 DLL(如果有任何) )。 有关当前系统上的已知 DLL 的列表,请参阅注册表项 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs。
如果 DLL 具有依赖项,则系统会搜索依赖 DLL,就像仅使用其模块名称加载一样。 即使通过指定完整路径加载了第一个 DLL,也是如此。
打包应用的搜索顺序
当打包的应用专门 (加载打包的模块时,库模块( .dll 通过调用 LoadPackagedLibrary 函数) 文件),DLL 必须位于进程的包依赖项关系图中。 有关详细信息,请参阅 LoadPackagedLibrary。 当打包的应用通过其他方式加载模块并且未指定完整路径时,系统会在加载时搜索 DLL 及其依赖项,如本部分所述。
当系统搜索模块或其依赖项时,它始终使用打包应用的搜索顺序;即使依赖项不是打包的应用代码。
打包应用的标准搜索顺序
系统按以下顺序搜索:
- DLL 重定向。
- API 集。
- 桌面应用仅 (UWP 应用) 。 SxS 清单重定向。
- Loaded-module 列表。
- 已知 DLL。
- 进程的包依赖项关系图。 这是应用程序的包,以及应用程序包清单的 节中指定的任何依赖项。 依赖项按它们在清单中的出现顺序进行搜索。
- 调用进程从加载的文件夹 (可执行文件的文件夹) 。
- 系统文件夹 (%SystemRoot%\system32) 。
如果 DLL 具有依赖项,则系统会搜索依赖 DLL,就好像只加载了其模块名称 (即使第一个 DLL 是通过指定完整路径) 加载的。
打包应用的备用搜索顺序
如果模块通过使用 LOAD_WITH_ALTERED_SEARCH_PATH 调用 LoadLibraryEx 函数更改标准搜索顺序,则搜索顺序与标准搜索顺序相同,只是在步骤 7 中,系统搜索从加载指定模块的文件夹 (顶部加载模块的文件夹) ,而不是可执行文件的文件夹。
未打包应用的搜索顺序
当未打包的应用加载模块且未指定完整路径时,系统会在加载时搜索 DLL,如本节中所述。
重要
如果攻击者控制了搜索的某个目录,则可以在该文件夹中放置 DLL 的恶意副本。 有关帮助防止此类攻击的方法,请参阅 动态链接库安全性。
未打包应用的标准搜索顺序
系统使用的标准 DLL 搜索顺序取决于是否启用了 安全 DLL 搜索模式 。
默认情况下启用的安全 DLL 搜索模式 () 按搜索顺序移动用户的当前文件夹。 若要禁用安全 DLL 搜索模式,请 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode 创建注册表值并将其设置为 0。 当指定文件夹位于搜索路径 () 时,调用 SetDllDirectory 函数可有效地禁用安全 DLL 搜索模式) ,并更改本主题中所述的搜索顺序。
如果启用了安全 DLL 搜索模式,则搜索顺序如下所示:
- DLL 重定向。
- API sets.
- SxS manifest redirection.
- Loaded-module list.
- Known DLLs.
- Windows 11,版本 21H2 (10.0;内部版本 22000) 及更高版本。 The package dependency graph of the process. This is the application’s package plus any dependencies specified as in the section of the application’s package manifest. Dependencies are searched in the order they appear in the manifest.
- 从中加载应用程序的文件夹。
- 系统文件夹。 使用 GetSystemDirectory 函数检索此文件夹的路径。
- 16 位系统文件夹。 没有获取此文件夹路径的函数,但会对其进行搜索。
- Windows 文件夹。 使用 GetWindowsDirectory 函数获取此文件夹的路径。
- 当前文件夹。
- 环境变量中列出的 PATH 目录。 这不包括由应用路径注册表项指定的每 应用程序路径 。 计算 DLL 搜索路径时,不使用 应用 路径键。
如果 禁用安全 DLL 搜索模式,则搜索顺序相同,只是 当前文件夹 在步骤 7 之后立即从序列 (从位置 11 移动到位置 8 。应用程序从中加载) 的文件夹 。
未打包应用的备用搜索顺序
若要更改系统使用的标准搜索顺序,可以使用 LOAD_WITH_ALTERED_SEARCH_PATH调用 LoadLibraryEx 函数。 还可以通过调用 SetDllDirectory 函数来更改标准搜索顺序。
注意
在当前进程开始之前,在父进程中调用 SetDllDirectory 函数也会影响进程的标准搜索顺序。
如果指定备用搜索策略,则其行为会一直持续到找到所有关联的可执行模块。 在系统开始处理 DLL 初始化例程后,系统将恢复为标准搜索策略。
如果调用指定LOAD_WITH_ALTERED_SEARCH_PATH,并且 lpFileName 参数指定绝对路径,则 LoadLibraryEx 函数支持备用搜索顺序。
- 在调用应用程序的文件夹中) 初始步骤后,标准搜索策略开始 (。
- 在 LoadLibraryEx 正在加载的可执行模块的文件夹中的初始步骤) 后,使用 LOAD_WITH_ALTERED_SEARCH_PATH 的 LoadLibraryEx 指定的备用搜索策略开始 (。
这是他们区别的唯一方式。
如果启用了安全 DLL 搜索模式,则备用搜索顺序如下所示:
步骤 1-6 与标准搜索顺序相同。
- 由 lpFileName 指定的文件夹。
- The system folder. Use the GetSystemDirectory function to retrieve the path of this folder.
- The 16-bit system folder. There’s no function that obtains the path of this folder, but it is searched.
- The Windows folder. 使用 GetWindowsDirectory 函数获取此文件夹的路径。
- 当前文件夹。
- 环境变量中列出的 PATH 目录。 这不包括应用路径注册表项指定的每 应用程序路径 。 计算 DLL 搜索路径时,不使用 应用 路径密钥。
如果 禁用安全 DLL 搜索模式,则备用搜索顺序是相同的,只是 当前文件夹 在步骤 7 后立即从顺序 (从位置 11 移动到位置 8 。由 lpFileName 指定的文件夹) 。
如果 lpPathName 参数指定路径,SetDllDirectory 函数支持备用搜索顺序。 备用搜索顺序如下:
步骤 1-6 与标准搜索顺序相同。
- 从中加载应用程序的文件夹。
- 由 SetDllDirectory 的 lpPathName 参数指定的文件夹。
- 系统文件夹。
- 16 位系统文件夹。
- Windows 文件夹。
- 环境变量中列出的 PATH 目录。
如果 lpPathName 参数为空字符串,则调用将从搜索顺序中删除当前文件夹。
当指定文件夹位于搜索路径中时,SetDllDirectory 可有效地禁用安全 DLL 搜索模式。 若要基于 SafeDllSearchMode 注册表值还原安全 DLL 搜索模式,并将当前文件夹还原到搜索顺序,请调用 SetDllDirectory , lpPathName 为 NULL。
使用LOAD_LIBRARY_SEARCH标志搜索顺序
可以通过将一个或多个 LOAD_LIBRARY_SEARCH 标志与 LoadLibraryEx 函数配合使用来指定搜索顺序。 还可以将 LOAD_LIBRARY_SEARCH 标志与 SetDefaultDllDirectories 函数一起使用,以建立进程的 DLL 搜索顺序。 可以使用 AddDllDirectory 或 SetDllDirectory 函数为进程 DLL 搜索顺序指定其他目录。
搜索的目录取决于使用 SetDefaultDllDirectories 或 LoadLibraryEx 指定的标志。 如果使用多个标志,则按以下顺序搜索相应的目录:
- LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR。 搜索包含 DLL 的文件夹。 此文件夹仅搜索要加载的 DLL 的依赖项。
- LOAD_LIBRARY_SEARCH_APPLICATION_DIR。 搜索应用程序文件夹。
- LOAD_LIBRARY_SEARCH_USER_DIRS。 搜索使用 AddDllDirectory 函数或 SetDllDirectory 函数显式添加的路径。 如果添加多个路径,则未指定搜索路径的顺序。
- LOAD_LIBRARY_SEARCH_SYSTEM32。 搜索“系统”文件夹。
如果调用 LoadLibraryEx 时没有 LOAD_LIBRARY_SEARCH 标志,或者为进程建立 DLL 搜索顺序,则系统将使用标准搜索顺序或备用搜索顺序搜索 DLL。
相关文章:
动态链接库搜索顺序
动态链接库搜索顺序 同一动态链接库 (DLL) 的多个版本通常存在于操作系统 (OS) 内的不同文件系统位置。 可以通过指定完整路径来控制从中加载任何给定 DLL 的特定位置。 但是,如果不使用该方法,则系统会在加载时搜索 DLL,如本主题中所述。 DL…...
【CAN、LIN通信的区分】
CAN和LIN是两种不同的通信协议,用于不同的应用场景。CAN(Controller Area Network)是一种高速、可靠、多节点的串行通信协议,主要用于汽车电子领域的高速数据传输和控制;而LIN(Local Interconnect Network&…...
Redis环境配置
【Redis解压即可】链接:https://pan.baidu.com/s/1y4xVLF8-8PI8qrczbxde9w?pwd0122 提取码:0122 【Redis桌面工具】 链接:https://pan.baidu.com/s/1IlsUy9sMfh95dQPeeM_1Qg?pwd0122 提取码:0122 Redis安装步骤 1.先打开Redis…...
UG NX二次开发(C++)-采用std::vector对体对象的质心进行排序
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1、前言2、体对象质心结构体的构造3、采用NXOpen获取part中的所有体对象4、通过遍历体对象集合来实现std::vector<MyBody>的赋值5、对结构体排序6、调用的完整源代码7、生成dll并测试一、pan…...
一点思考|关于「引领性研究」的一点感悟
前言:调研过这么多方向之后,对研究方向的产生与发展具备了一些自己的感悟,尤其是在AI安全领域。私认为,所谓有价值、有意义的研究,就是指在现实社会中能够产生波澜、为国家和社会产生一定效益的研究。 举例来说&#x…...
什么是HTTP/2?它与HTTP/1.1相比有什么改进?
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ HTTP/2 简介⭐ 主要的改进和特点⭐ 总结⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端…...
IDEA
快捷键 好用的快捷键,可以使写代码变得更加便捷~ IntelliJ IDEA具有许多有用的快捷键,这些快捷键可以帮助开发人员更快速、高效地编写和管理代码。以下是一些常用的IntelliJ IDEA快捷键,这些快捷键在Java开发中特别有用: 基本编辑…...
NSS [HXPCTF 2021]includer‘s revenge
NSS [HXPCTF 2021]includer’s revenge 题目描述:Just sitting here and waiting for PHP 8.1 (lolphp). 题目源码:(index.php) <?php ($_GET[action] ?? read ) read ? readfile($_GET[file] ?? index.php) : inclu…...
《动手学深度学习 Pytorch版》 7.1 深度卷积神经网络(AlexNet)
7.1.1 学习表征 深度卷积神经网络的突破出现在2012年。突破可归因于以下两个关键因素: 缺少的成分:数据 数据集紧缺的情况在 2010 年前后兴起的大数据浪潮中得到改善。ImageNet 挑战赛中,ImageNet数据集由斯坦福大学教授李飞飞小组的研究人…...
C++ - 双指针_盛水最多的容器
盛水最多的容器 11. 盛最多水的容器 - 力扣(LeetCode) 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的…...
分类预测 | Matlab实现NGO-CNN-SVM北方苍鹰算法优化卷积支持向量机分类预测
分类预测 | Matlab实现NGO-CNN-SVM北方苍鹰算法优化卷积支持向量机分类预测 目录 分类预测 | Matlab实现NGO-CNN-SVM北方苍鹰算法优化卷积支持向量机分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现NGO-CNN-SVM北方苍鹰算法优化卷积支持向量机分类预…...
分享一个java+springboot+vue校园电动车租赁系统(源码、调试、开题、lw)
💕💕作者:计算机源码社 💕💕个人简介:本人七年开发经验,擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等,大家有这一块的问题可以一起交流! 💕&…...
高性能计算环境下的深度学习异构集群建设与优化实践
★深度学习;模式识别;图像处理;人工智能建模;人工智能;深度学习算法;强化学习;神经网络;卷积神经网络;人工神经网络;VIBE算法;控制系统仿真&#…...
Laravel框架 - Facade门面
1 、官方文档给出的定义 “Facades 为应用的 服务容器 提供了一个「静态」 接口。Laravel 自带了很多 Facades,可以访问绝大部分功能。Laravel Facades 实际是服务容器中底层类的 「静态代理」 ,相对于传统静态方法,在使用时能够提供更加灵活…...
算法通关村第16关【青铜】| 滑动窗口思想
1. 滑动窗口的基本思想 一句话概括就是两个快慢指针维护的一个会移动的区间 固定大小窗口:求哪个窗口元素最大、最小、平均值、和最大、和最小 可变大小窗口:求一个序列里最大、最小窗口是什么 2. 两个入门题 (1)子数组最大平…...
CentOS安装openjdk和elasticsearch
CentOS安装openjdk 文章目录 CentOS安装openjdk一、yum1.1search1.2安装openjdk 二、elasticsearch的启动和关闭2.1启动2.2关闭2.3添加服务 一、yum 1.1search yum search java | grep jdk1.2安装openjdk [roottest ~]# yum install java-1.8.0-openjdk -y 查看openjdk版本 …...
【新版】系统架构设计师 - 案例分析 - 信息安全
个人总结,仅供参考,欢迎加好友一起讨论 文章目录 架构 - 案例分析 - 信息安全安全架构安全模型分类BLP模型Biba模型Chinese Wall模型 信息安全整体架构设计WPDRRC模型各模型安全防范功能 网络安全体系架构设计开放系统互联安全体系结构安全服务与安全机制…...
数据库设计(火车订票系统)
为一个火车订票系统设计一个数据库是一个好的方法来训练你的数据库技巧。 其中有一些需要考虑到的复杂度。 过一些需求,并且创建表格。 为这个虚构的火车订票系统提出了10个需求。 我们将把其中每个添加到entity relational diagram(实体关系图&…...
qemu+docker在服务器上搭建linux内核调试环境
基于docker和qemu的操作系统实验环境 参考以上文章实现。 其中 docker run -it --name linux_qemu qemu /bin/bash #从qemu镜像启动一个容器linux_qemu,进入shell 要改为 docker run -it --name linux_qemu 3292900173/qemu /bin/bash另外,在vscode运行过程中,ssh远…...
Stable Diffusion 参数介绍及用法
大模型 CheckPoint 介绍 作用:定调了作图风格,可以理解为指挥者 安装路径:models/Stable-diffusion 推荐: AnythingV5Ink_v32Ink.safetensors cuteyukimixAdorable_midchapter2.safetensors manmaruMix_v10.safetensors counterf…...
【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...
WebRTC从入门到实践 - 零基础教程
WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC? WebRTC(Web Real-Time Communication)是一个支持网页浏览器进行实时语音…...
AI语音助手的Python实现
引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...
