您的位置  > 互联网

Win16中不同运行程序的地址空间并非完全隔离

1.模块的概念

一个模块代表一个正在运行的exe文件或者dll文件,它用来代表这个文件中的所有代码和资源。 磁盘上的文件不是模块。 当它被加载到内存并运行时,它被称为模块。 当应用程序调用其他DLL中的API时,这些DLL文件被加载到内存中并生成不同的模块。 为了区分地址空间中的不同模块,每个模块都有一个唯一的模块句柄来标识它。 Win16,Win16中不同运行程序的地址空间并不是完全隔离的。 可执行文件运行后形成一个“模块”。 当同一个可执行文件被多次加载时,这个“模块”是通用的。 为了区分多个加载“副本”,每个“副本”被称为一个实例,每个实例使用不同的“实例句柄”()值来标识它们。 但在Win32中,程序在运行时是隔离的。 每个实例都使用自己的私有 4 GB 空间,并认为它是唯一的。 不存在一个模块的多个实例的问题。 其实在Win32中,实例句柄就是模块句柄,但是很多API原型中仍然使用模块句柄时使用的名称,所以我们仍然使用变量名称。

在C语言编程中,系统传入的原型为:

(,,,),程序不用自己去获取。 这个过程由C初始化代码负责,但必须在Win32汇编中由其自身获得。 如果你不理解,你就不知道如何获取它,因为没有类似这样的API函数。

2.什么是句柄

随着分析的深入,()这个词也频繁出现。 什么是“把柄”? 句柄只是一个数值。 它的值对于程序来说是没有意义的。 它仅用于表示各种资源的数量。 可见,只有人知道如何用它来引用各种资源。

这里有些例子。 屏幕上已经有 10 个窗口。 将它们编号为 1 到 10。应用程序创建另一个窗口。 现在将其编号为 11,然后将 11 作为窗口句柄返回给应用程序。 应用程序不知道 11 代表什么。 它是什么,但是在操作窗口时,传递11作为句柄,自然可以根据这个值找出它是哪个窗口。 当窗口关闭时,数字11就失效了。 第二次运行时,如果屏幕上有5个窗口,那么句柄现在可能是6,因此应用程序不需要关心句柄的具体值。 例如,在商场存放书包时,把手可以被视为销售人员给出的注释。 用户不知道纸条上的标记意味着什么,但是当她将其返回给销售人员时,她自然会找到正确的书包。

应用程序中几乎所有东西都是通过句柄来标识的,比如文件句柄、窗口句柄、线程句柄、模块句柄等。出于同样的原因,你不需要关心它们的值是什么,只需使用它们即可!

解释2:

下面,模块是指加载到内存中的EXE、DLL等数据的映像。 模块手柄比较特别。 它与一般的手柄不同。 模块句柄指向EXE和DLL在内存中的位置(即指向它们的数据起始位置); 进程句柄仅用于标识某个进程的ID值。 在内部,使用类似 MAP 的技术进行映射。 就是通过这个进程句柄在内存中找到指定的进程。 地点