在32位Windows中,DLL是如何导出的?

news2025/1/15 6:30:53

32 位 Windows 的设计者不必担心将所有内容压缩到 256KB 的内存中。由于 Win32 中的模块基于需求分页,因此你所要做的就是将整个映像映射到内存中,然后运行访问所需的部分。

DLL中的常驻名(resident name)和非常驻名(non-resident name)之间没有区别,导出函数的名称仅存储在 DLL 文件中,并带有指向导出表中存储的名称的指针(即相对虚拟地址)。

与 16 位序号导出表不同,32 位序号导出表不是稀疏的。

例如,如果 DLL 导出两个函数,一个作为序号 10,一个作为序号 1000,你将有一个 991 条目表,该表由两个实际函数指针和大量零组成。
因此,应尽量不要在序号导出中出现较大的间隙,否则将浪费 DLL 的导出表中的空间。

导出的名称表的功能与 16 位 Windows 中导出的名称表相同,将名称映射到序号。
与顺序无关的 16 位命名导出表不同,32 位 Windows 中的导出名称表保持排序,以便可以使用更有效的二进制搜索来查找函数。
与 16 位 Windows 一样,每个命名函数都分配有一个序号。

如果程序员未在模块定义文件中分配一个序号,则链接器将为你创建一个,与 16 位 Windows 一样,链接器构成的值可能因生成而异。

但是,这两种模型之间存在主要区别:回想一下,我们不鼓励在 16 位 Windows 中进行命名导出(出于效率原因),因此,每个导出的函数都被显式分配了一个序号,这是链接到函数的首选方式。

另一方面,32 位 Windows 中的命名导出是常态,没有显式序号分配。这意味着命名导出的序号不是固定的。

例如,让我们看一下早年分配给 kernel32 函数 LocalAlloc 的序数:

>> 请移步至 topomel.com 以查看图片 <<

现在,有些人习惯于对导入库进行逆向工程,可能是因为他们懒得下载平台SDK并获取真正的导入库。

手动生成导入库的问题在于,你无法判断分配给 LoadLibrary 函数的序号是由模块定义文件分配的(因此不会在生成之间更改)还是仅由链接器自动生成(在这种情况下,序号将更改)。

导入库生成工具可以安全地使用命名导出,因为这在这两种情况下都有效,但由于某种原因,它们使用序号导出。(这可能是 16 位 Windows 的遗留物,正如我们之前看到的,序数优先于名称。)

导入库生成工具的这种设计方式,给 DirectX 团队带来了兼容性问题。(我不知道为什么 DirectX 比其他团队受到的打击更大。也许是因为游戏开发人员没有时间学习 Win32 的细节,他们只是想写他们的游戏吧)

由于他们使用了这些工具之一,他们最终通过序号而不是名称链接到 DirectX 函数,如 DirectDrawCreate,然后当下一个版本的 DirectX 出现并且链接器为名称分配了不同的序号时,他们的程序就会崩溃。

DirectX 团队必须返回到旧的 DLL,记下链接器随机分配的所有序号,并在模块定义文件中显式分配这些序号,以便它们将来不会再修改。

无法从 DLL 生成导入库还有其他原因,稍后,当我更详细地讨论导入库时,我将讨论这些主题。

总结

如果你是在 32 位 Windows 平台上做开发,则始终使用名称,而不是序号进行 DLL 调用,这样会免去很多麻烦。
毕竟,写入到 SDK 中的名称,不太可能随随便便的改变。

最后

Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《How are DLL functions exported in 32-bit Windows?》

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

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

相关文章

5.4 【MySQL】页目录

记录在页中按照主键值由小到大顺序串联成一个单链表&#xff0c;如果我们想根据主键值查找页中的某条记录&#xff0c;可以这样查询&#xff1a; SELECT * FROM page_demo WHERE c1 3; 我们平常想从一本书中查找某个内容的时候&#xff0c;一般会先看目录&#xff0c;找到需…

Docker配置阿里云镜像加速器

Docker配置阿里云镜像加速器 《Docker安装详细步骤》&#xff1a;Docker安装详细步骤_周十一.的博客-CSDN博客、 在前面博文已经介绍了docker 的安装&#xff0c;因为某些原因&#xff0c;我们下载镜像比较慢&#xff0c;今天给大家介绍一下&#xff0c;如何配置阿里云的镜像加…

解决Ubuntu无法安装pycairo和PyGObject

环境&#xff1a;虚拟机Ubuntu20.04&#xff0c;vscode无法安装pycairo和PyGObject 虚拟机Ubuntu20.04&#xff0c;vscode中运行Anaconda搭建的vens 的Python3.8.10 首先在vscode中点击ctrlshiftp&#xff0c;选择Python3.8.10的环境&#xff0c;自动激活Python 最近在搞无人…

在Linux和Windows上安装seata

1 前言 官网地址&#xff1a;https://seata.io/ 源码地址&#xff1a;https://github.com/seata/seata 官网手册&#xff1a;https://seata.io/zh-cn/docs/ops/deploy-guide-beginner.html Seata&#xff0c;一款开源的分布式事务解决方案&#xff0c;致力于提供高性能和简…

STM32CubeProgrammer 用ST-LINK不能烧录 解决方法

如下图所示&#xff0c;连接ST-LINK后可以认出Serial number&#xff0c;点击Connect后&#xff0c;显示“Error : Data read failed”&#xff0c;点击Download后&#xff0c;显示“Error: failed to download Segment[0]”。 此为正常现象&#xff0c;因为芯片加密&#xff0…

docker 容器编排工具 docker-compose从0到精通

compose简介 Docker-Compose 项目是Docker官方的开源项目&#xff0c;负责实现对Docker容器集群的快速编排。 Docker-Compose 项目由 Python 编写&#xff0c;调用 Docker 服务提供的API来对容器进行管理。因此&#xff0c;只要所操作的平台支持 Docker API&#xff0c;就可以…

redis高可用之主从复制、哨兵模式、集群的概述及部署

目录 redis集群有三种模式 一、主从复制 1、主从复制的概念 2、主从复制的作用 3、主从复制的流程 4、主从复制的缺陷 5、搭建redis主从复制 二、redis 哨兵模式 1、哨兵模式的概念 2、哨兵模式的作用 3、故障转移机制 4、搭建Redis 哨兵模式 三、redis集群 1、r…

iOS开发Swift-12-列表UI,TableViewController,动态响应Button勾选-待办事项App(1)

1.创建新项目 为项目添加图标 2.将Table View Controller添加到界面中 将箭头移动到Table View上来,代表它是首页(根页面).选中ViewController,点击Delete,对它进行删除.将代码ViewController.swift也删除掉. 新建一个Cocoa Touch Class. 将TableViewController的cla…

记LGSVL Map Annotation(1) LGSVL本地编译记录、安装

主要的编译参考来着官方文件 Unity安装 安装unity hub 安装2020.3.3f1在unity hub上 但是我发现没有2020.3.3f1&#xff0c;只有2020.3.3f1c1&#xff0c;其实c1就是中国版&#xff0c;没有什么影响 GIT安装 安装GIT安装Git LFS验证git-lfs(输出Git LFS initialized就&am…

【linux】权限管理 详解(文件/访问者/目录 权限、权限指令、粘滞位... ...)

文章目录 权限的概念linux 权限管理文件访问者的类型&#xff08;用户&#xff09;文件类型和访问权限文件类型访问权限 文件权限值的 表示方法文件权限的 设置方法chmodchownchgrpumaskfilesudo 分配权限 目录的权限粘滞位注意 权限的概念 linux中有两种用户: 超级用户&…

Jeecg-Boot /jeecg-boot/jmreport/qurestSql接口sql注入漏洞复现

一、Jeecg-Boot介绍 JeecgBoot 是一款基于代码生成器的低代码开发平台&#xff01;前后端分离架构 SpringBoot2.x&#xff0c;SpringCloud&#xff0c;Ant Design&Vue&#xff0c;Mybatis-plus&#xff0c;Shiro&#xff0c;JWT&#xff0c;支持微服务。强大的代码生成器让…

淘宝整店商品列表信息API接口介绍

淘宝整店商品列表信息API接口&#xff08;Taobao whole store product list information API interface&#xff09;是在开放性API接口的基础之上&#xff0c;根据淘宝官方平台提供的以互联网为发展渠道的电子商务服务&#xff0c;通过数据整合与共享&#xff0c;抽象开发出来的…

java企业数据管理系统

项目介绍 此项目为企业数据管理系统的后端部分&#xff0c;前端部分请参考vue-admin&#xff0c;项目实现了菜单管理、用户管理、角色管理和权限管理四个基础模块&#xff0c;前端菜单管理结合动态路由可自由添加菜单。结合Shiro权限管理实现了菜单和按钮的权限控制。 ❝ 前端…

第36章 封装驱动API接口实验

相信经过前面两个章节的学习已经能够熟练的使用ioctl函数了&#xff0c;在本章节会进行两个实验&#xff0c;每个实验的要完成的任务如下所示&#xff1a; 实验一&#xff1a;通过ioctl对定时器进行控制&#xff0c;分别实现打开定时器、关闭定时器和设置定时时间的功能。 实…

网络基础入门:数据通信与网络基础

1、什么是通信 通信&#xff0c;是指人与人、人与物、物与物之间通过某种媒介和行为进行的信息传递与交流。 2、什么是网络通信 网络通信&#xff0c;是指终端设备之间通过计算机网络进行的通信。 3、常见的术语 术语 说明 数据载荷 最终想要传递的信息 报文 网络中交…

迅为RK3568运行openkylin麒麟系统

RK3568开发板在发布之初已经开发了稳定又好用的Android11/12、Debian、Yocto、BuildrootQT5.15、Ubuntu18/20/22、OpenHarmony v3.2版本等系统。 经过后续的开发&#xff0c;RK3568现已适配openkylin麒麟系统。 CPU&#xff1a;iTOP-3568开发板采用瑞芯微RK3568处理器&#xf…

欠拟合与过拟合

目录 1、相关概念 学习目标 欠拟合与过拟合 2、原因以及解决办法 欠拟合 过拟合 ⭐正则化类别 Lasso &#x1f53a;Ridge &#x1f341;Lasso和Ridge的区别 3、拓展 极大似然估计 最大后验估计 最小二乘法 &#x1f343;作者介绍&#xff1a;双非本科大三网络工程…

xss-domcobble绕过XSSfilter

目录 DOM破坏的原理 例题 多层标签 HTMLCollection 一些常见的标签的关系 三层标签如何获取 例题 DOM破坏的原理 DOMClobber是一种攻击技术&#xff0c;它利用了DOM&#xff08;文档对象模型&#xff09;的特性来破坏或修改网页的结构和功能。 DOMClobber攻击通常发生…

NoSQL之redis高可用(主从复制、哨兵、集群)搭建

目录 一、redis集群的三种模式 1、主从复制 2、哨兵 3、集群 二、Redis的主从复制 1、主从复制的作用 2、主从复制流程 3、搭建Redis 主从复制 实验环境&#xff1a; 3.1 安装 Redis 3.2 修改 Redis 配置文件&#xff08;Master节点操作&#xff09; 3.3 配置两台…