⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vxd-c1.htm

📁 汇编语言编写的虚拟驱动程序
💻 HTM
📖 第 1 页 / 共 2 页
字号:
<HTML><HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<TITLE>Virtual Device Driver Basic</TITLE>
<BODY aLink=#ff00ff bgColor=#000080 link=#ffff00 text=#ffffff vLink=#8080ff>
<CENTER>
<H1><FONT face=Arial,Helvetica><FONT color=#ffff99>虚拟设备驱动程序初步</FONT></FONT></H1></CENTER><FONT face=Arial,Helvetica><FONT size=-1>
在本教程里,我假定读者对诸如虚8086模式,调页,GDT,LDT,IDT之类的INTEL 80x86保护模式的操作比较熟悉。如果你不了解这些,那你要先在 <A 
href="http://developer.intel.com/design/pentium/manuals/">http://developer.intel.com/design/pentium/manuals/</A>阅读INTEL的文档。</FONT></FONT> 

<H3><FONT face=Arial,Helvetica><FONT color=#66ffff><FONT 
size=-1>内容:</FONT></FONT></FONT></H3><FONT face=Arial,Helvetica><FONT 
size=-1>Windows95是一个运行在最高级特权,第0层级别的多线程操作系统。所有的应用程序都运行在最低级特权,第3层级别上。这样就限制了应用程序对系统的操作。它们不能使用cpu特权指令,不能直接访问I/O端口,等等。你对gdi32,kernal32和user32这三个大的系统组件一定很熟悉。你肯定会认为这样重要的代码段一定是在第0层级别下运行的。但是实际上,它们和其他的应用程序一样,是在第三层级别下运行的。这就是说它们并不比Windows计算器,或者扫雷游戏有更多的权限。系统的控制实权掌握在<B><FONT color=#ffff99>虚拟级管理器(VMM)</FONT></B> 和<B><FONT color=#ffff99>虚拟设备驱动程序(VxD)</FONT></B>手中。</FONT></FONT> <BR><FONT face=Arial,Helvetica><FONT size=-1>这一切都是由dos引起的。在Window 3.x的时代,在市场上有很多成功的dos软件。Windows 3.x<B><FONT color=#ffff99>必须</FONT></B>同时运行普通的Windows程序和dos程序,否则,它就会失去市场。</FONT></FONT> 
<BR><FONT face=Arial,Helvetica><FONT size=-1>这个局面是很难处理的,因为dos程序和Windows程序有本质的不同。dos程序认为它们拥有系统的<B><I><FONT color=#ffff99>一切:</FONT></I></B>键盘,cpu,内存,硬盘等等。dos程序不知道怎样和其他程序合作,而Windows程序(从那时候起)是可靠的多任务合作系统。也就是每个Windows程序都必须通过GetMessage或PeekMessage来和其他程序进行交流。</FONT></FONT> <BR><FONT face=Arial,Helvetica><FONT size=-1>
解决办法就是,在一个8086虚拟机上运行所有的dos程序,而在另一个叫做<B><FONT 
color=#ffff99>系统虚拟机</FONT></B>的虚拟机上运行其他所有的Windows程序。Windows负责把cpu运算时间轮流的分给每个虚拟机。这样,在Windows 3.x里。Windows程序之间用的是合作多任务,而虚拟机之间用的是优先级多任务。</FONT></FONT> <BR><FONT face=Arial,Helvetica><FONT 
size=-1><B><FONT color=#66ff99>什么是一个虚拟机?</FONT></B>一个虚拟机是被软件创建的一个假象。一个虚拟机和在它上面运行的程序交互,就像这个程序是在真正的机器上运行一样。这样,一个程序不知道也不关心自己是否是在虚拟机上运行。只要虚拟机准确的像一个真的机器一样响应程序,我们就可以把它当成一个真正的机器。</FONT></FONT> <BR><FONT 
face=Arial,Helvetica><FONT size=-1>你可以把虚拟机这种实机器和软件之间的接口看作一种API。这种不寻常的API由中断,BIOS调用和I/O端口组成。如果Windows能够以某种方法完美的模拟这个API,那么在虚拟机上运行的程序就会表现的和它们在实际器上运行时完全一样。</FONT></FONT> <BR><FONT face=Arial,Helvetica><FONT 
size=-1>这就是为什么会出现VMM和VxD的原因。为了协调和监视虚拟机(VMs),Windows需要一个程序来分配任务。这个程序就是虚拟机管理器(VMM)。
</FONT></FONT> 
<H3><FONT face=Arial,Helvetica><FONT color=#66ffff><FONT size=-1>
虚拟机管理器</FONT></FONT></FONT></H3><FONT face=Arial,Helvetica><FONT size=-1>VMM是一个32位的保护模式程序。它的主要任务是建立和维护一个支持虚拟机的框架。例如,它要创建,运行和结束一个虚拟机。VMM是众多的系统VxD程序之一,它被放在你的系统目录下的VMM32.VxD文件中。VMM本身是一个VxD程序,但它被当作一个监视其他VxD程序的监视器。让我们来看一下Windows95的启动次序:</FONT></FONT> 
<OL>
  <LI><FONT face=Arial,Helvetica><FONT size=-1>加载io.sys。</FONT></FONT> 
  <LI><FONT face=Arial,Helvetica><FONT size=-1>执行config.sys和autoexec.bat。</FONT></FONT> 
  <LI><FONT face=Arial,Helvetica><FONT size=-1>调用win.com。</FONT></FONT> 
  <LI><FONT face=Arial,Helvetica><FONT size=-1>win.com运行VMM32.VxD,VMM32.VxD实际上是个简单的dos的exe文件。</FONT></FONT> 
  <LI><FONT face=Arial,Helvetica><FONT size=-1>VMM32.VxD用xms驱动程序把VMM加载到扩展内存。</FONT></FONT> 
  <LI><FONT face=Arial,Helvetica><FONT size=-1>VMM初始化自身及其它的默认VxD。</FONT></FONT> 
  <LI><FONT face=Arial,Helvetica><FONT size=-1>VMM把机器转入到保护模式并创建系统虚拟机。</FONT></FONT> 
   <LI><FONT face=Arial,Helvetica><FONT size=-1>最后被加载的虚拟外壳设备在系统虚拟机上通过运行krnl386.exe来启动Windows。</FONT></FONT> 
  <LI><FONT face=Arial,Helvetica><FONT size=-1>krnl386.exe加载所有的文件,最后是Windows95外壳。</FONT></FONT> </LI></OL><FONT 
face=Arial,Helvetica><FONT size=-1>正如你所看到的,VMM是第一个被加载到内存的VxD程序。它创建系统虚拟机并初始化其他的VxD程序。它也为这些VxD程序提供许多服务。</FONT></FONT> <BR><FONT 
face=Arial,Helvetica><FONT size=-1>VMM和VxD的操作模式和真正的程序不同。在大多数时候,它们是潜伏的。当应用程序在系统中运行时,这些VxD程序没有被激活。当某些需要它们处理的中断/错误/事件发生时,它们才被唤醒。</FONT></FONT> 
<BR><FONT face=Arial,Helvetica><FONT size=-1>VMM是不可重入的。这意味着VxD程序必须使它们的访问和VMM服务同步。在有些情况下调用VMM服务是不安全的,比如VMM正在处理一个硬件中断。在这段时间内,VMM是不允许重进入的。作为一个VxD编写者,你必须对你的所作所为极度的小心。记住,你是在最高特权级别,第0层级别,如果你代码有错的话,谁也管不到。</FONT></FONT> 
<H3><FONT face=Arial,Helvetica><FONT color=#66ffff><FONT size=-1>虚拟设备驱动程序</FONT></FONT></FONT></H3><FONT face=Arial,Helvetica><FONT size=-1>虚拟设备驱动程序被简称为<B><FONT color=#ffcc33>VxD</FONT></B>。<B><FONT 
color=#ffff99>x </FONT></B>代表各种设备的名字,如虚拟<B><FONT color=#ffff99>键盘</FONT></B>驱动程序(vkd),虚拟<B><FONT 
color=#ffff99>鼠标</FONT></B>驱动程序(vmd)等等。VxD程序是硬件成功初始化的途径。记得dos程序认为它们拥有系统的一切,当它们在虚拟机中运行时,Windows需要给它们一个实机器的替身。VxD程序就是这些替身。VxD程序通常虚拟一些硬件设备,所以,例如当一个dos程序认为它在同键盘通讯时,实际是虚拟键盘驱动程序在和dos程序通讯。一个VxD程序通常控制真正的硬件设备并对该设备在各个虚拟机之间的共享进行管理。</FONT></FONT> <BR><FONT 
face=Arial,Helvetica><FONT size=-1>尽管如此,并不是说每个VxD程序<B><FONT 
color=#ffff99>必须</FONT></B>和一个硬件设备相连。虽然VxD程序是用来虚拟硬件设备的,但是我们也可以把VxD程序看作是在第0级别的dll。例如,如果你需要做一些只有在第0级别才能做的工作,你就可以编一个VxD程序来为你完成这个工作。这样,由于此VxD程序并没有虚拟任何设备,你就可以把它仅仅看作是你的程序的扩展。</FONT></FONT> <BR><FONT 
face=Arial,Helvetica><FONT size=-1>在我们更深入的讨论VxD和创建我们的VxD程序之前,让我先说一些有关于VxD的事情。</FONT></FONT> 
<UL>
  <LI><FONT face=Arial,Helvetica><FONT size=-1>VxD程序是Windows 9x特有的,它在Windows NT下不能运行。所以如果你的程序是依靠VxD的,它就不能被移植到Windows NT平台上去。</FONT></FONT> 
  <LI><FONT face=Arial,Helvetica><FONT size=-1>VxD是系统中权力最大的实体。由于它们可以对系统作任何事情,所以它们是极度危险的。一个恶意的/错误的VxD程序可以毁掉整个系统。对于恶意的/错误的VxD程序没有任何的保护措施。</FONT></FONT> 
  <LI><FONT face=Arial,Helvetica><FONT size=-1>通常的,不用VxD也有很多办法能达到你的目的。在采用VxD的解决办法之前一定要三思。如果用其他的可以在第三层级别实施的办法,就使用这个办法。</FONT></FONT> </LI></UL><FONT face=Arial,Helvetica><FONT 
size=-1>Windows 95下有两种VxD:</FONT></FONT> 
<UL>
  <LI><FONT face=Arial,Helvetica><FONT size=-1>静态VxD</FONT></FONT> 
  <LI><FONT face=Arial,Helvetica><FONT size=-1>动态VxD</FONT></FONT> 
</LI></UL><FONT face=Arial,Helvetica><FONT size=-1>静态VxD是那些从系统启动就被加载,在系统关闭之前一直存在于内存中的VxD程序。这种VxD可以追溯至Windows 3.x的时代。动态VxD时只有Windows 9x下才有的。动态VxD程序可以在需要的时候被加载/卸载。这些程序大多数都是用来控制设置管理器和输入输出监视器加载的即插即用设备的。你可以在你的win32应用程序里加载或卸载动态VxD程序。</FONT></FONT> 
<H3><FONT face=Arial,Helvetica><FONT color=#66ffff><FONT size=-1>VxD程序之间的通讯</FONT></FONT></FONT></H3><FONT face=Arial,Helvetica><FONT 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -