windows98如何加载驱动

qing 2000-01-28 04:52:00
各位高手:
驱动文件 *.vxd 如何被加载及其格式.
多谢!!!
...全文
170 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
lu0 2000-02-13
  • 打赏
  • 举报
回复
VMM根据VXD INIT ORDER加载各个VXD.
当静态VXD加载完毕后.NTKERN.VXD加载WDM DRIVER.
所有KERNEL MODE的DRIVER加载完毕,加载RING3 DRIVER.这乃是从WIN16继承下
来的.因为当时AUDIO DRIVER都是RING3的. :D
xinghui 2000-02-09
  • 打赏
  • 举报
回复
我们知道,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”。
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.
在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。


6,847

社区成员

发帖
与我相关
我的任务
社区描述
Windows 2016/2012/2008/2003/2000/NT
社区管理员
  • Windows Server社区
  • qishine
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧