Programming 版 (精华区)
发信人: Sun (大灯泡), 信区: Programming
标 题: VxD世界——VxD文件格式
发信站: 哈工大紫丁香 (Tue Aug 31 12:37:13 1999), 转信
孙喜明
我们知道,MS-DOS下可执行文件.EXE是MZ格式,也就是说.EXE文件的前两个
字节是字符串“MZ”。而Windows 3.1的.EXE是NE(New Executable)格式,
Win95和WinNT的.EXE是PE(Portable Executable)格式,VxD则是LE(Linear
Executable)格式。但是有一点需要注意,在NE、PE和LE的头部,总嵌有一小段
DOS程序,它的作用是:当你在DOS下运行这几种.EXE文件时,它会提示你“This
program cannot be run in DOS mode”。
DEBUG TEST.VXD
LE文件格式最早出自OS/2 2.0。这种格式的文件可以同时包含16位和32位代码,这
正是VxD需要的,因为VxD在加载的初始化阶段,需要进行一些实模式的操作,这
需要16位代码,而VxD的主要运行阶段是在32位环境中,这又需要32位代码,所以
LE文件格式正好适合于VxD。
VxD不仅有16位和32位两种代码,而且,它把数据段和代码段搅和在一起,只是通
过段前的标识来表明该段在运行时的特性。VxD之所以这样,是因为VxD所用的Flat
mode的代码和Data selector有同样的基本地址和限制,这样当VxD想访问数据或代
码时,用哪个段寄存器都可以。VxD中常用的Segment Class见表1。
在VxD中,LCODE、PCODE和PDATA段包含了主要的数据和代码。LCODE段所包
含的数据和代码必须总在内存中,我们在VxD中处理硬件中断的代码和相关数据必
须位于LCODE段中,否则,在处理硬件中断时就会出现可怕的Page fault。
ICODE段包含的是VxD初始化时要完成的工作,当VxD完成初始后,ICODE段中的
代码和数据将被VMM抛弃。
RCODE中包含的是16位代码和数据,用作实模式初始化阶段。
SCODE中包含Static Code和Data,一般来说,SCODE对于动态加载的VxD尤其有
用。试想一下,如果可动态加载的VxD包含了一个回调函数,当你卸载这个VxD后
,又需要这个回调函数继续发生作用,那你就得把这个回调函数放到SCODE中。再
者,如果你需要知道某个动态加载的VxD被加、卸载了几次,那可以在SCODE中放
个记数器,每次该VxD被加载时都把该记数器加一。
由于VxD的文件格式比较特殊,所以你必须使用可以产生LE格式的链接器(Linker
)。如果你要开发Windows 3.1的VxD,那得用Windows 3.1 DDK带的链接器。但是
如果开发Win95的VxD,那用MSVC 2.0及其以后版本的链接器就可以了。有一点需
要注意,MSVC 4.1的链接器由于存在一些小BUG,不能用于生成VxD。
表1
Segment Class 描 述
LCODE Page-locked code and data
PCODE Pageable code
PDATA Pageable data
ICODE Initialization-only code and data
SCODE Static code and data
RCODE Real-mode initialization
--
〖小糊涂虫2000灌水机〗
--
☆ 来源:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: sun@hope.hit.edu.cn]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.465毫秒