副标题#e#
一、VxD先容
本文先容VxD的浸染。假如Windows 95提供的尺度VxD对你的硬件可能软件不能提供100%的兼容支持,你需要为你的硬件可能软件(包罗16位和32位软件)建设VxD。假如你想让Windows用户利用你的硬件可能软件的某些新特征,你也可以建设VxD。
本文先容如何写VxD,报告了建设VxD所需的布局、进程和挪用,还给出了建设和测试VxD的步调。VxD可以是静态的可能动态装载的,下面的内容主要报告静态VxD,不外关于名目和成果的内容两者都合用。
二、什么是VxD
VxD是一个打点譬喻硬件设备可能已安装软件等系统资源的32位可执行措施,使得几个应用措施可以同时利用这些资源。Windows通过利用VxD答允基于Windows的应用措施实现多任务。VxD在与Windows的毗连事情中处理惩罚间断,并在不影响其它应用措施的执行的环境下为特定的应用措施执行I/O操纵。大大都VxD打点硬件设备,也有一些VxD打点或取代与之相关的软件,譬喻ROM BIOS例程。VxD可以包括必需在相应设备上执行的设备相关代码,也可以依靠其它软件去执行这些对设备的操纵。任何环境下,VxD城市为每一个应用措施保存该设备状态的记录,担保无论何时一个应用措施继承执行该设备均处于正确状态。
一些VxD仅仅打点已安装软件,譬喻MS-DOS设备驱动措施可能TSR措施,这样的VxD凡是包括仿真这些软件可能掩护这些软件用于正在运行的应用措施的数据的代码。VxD有时还用于提高已安装软件的机能,Intel兼容CPU执行32位的VxD比执行16位的MS-DOS设备驱动措施可能TSR措施有更高的效率。
三、尺度VxD
Windows包罗多种VxD,用于支持民众硬件设备和可安装软件。在某些环境下,大概需要修改VxD以提供新的特征可能支持非尺度硬件。
Windows提供很多禁绝备修改,但可以或许帮助支持其他VxD的VxD。譬喻:很多VxD利用V86内存打点器(V86MMGR)和虚拟可编程间断节制器设备(VPICD)提供的成果生存V86模式内存和答允硬件间断请求。要取得开拓VxD的辅佐,Windows 95设备驱动措施开拓东西包(DDK)包罗了大量可用设备驱动措施的源代码。
四、建设VxD
你可以通过修改VxD例子措施可能本身手工建设来建设VxD。你可以用汇编语言来写VxD,也可以用高级语言(譬喻C语言)来写一部门VxD。
要建设一个VxD,需要以下步调:
1、阅读硬件手册中关于描写这种型号硬件VxD的章节。
2、写出所需的节制进程,VxD处事和API函数。
3、成立为VxD标识适当模块名的模块界说文件,并引出需要的设备描写块。
4、汇编毗连VxD。
5、用调试版Windows 95测试VxD,要得到更多关于调试VxD的信息,请参阅相关资料(可以用Soft-ICE调试——译者注)。
6、为VxD和相关文件成立安装文件(INF文件),通过修改注册信息和向Windows的SYSTEM目次和相关目次拷贝文件来安装VxD。
7、成立最终刊行软件包。
五、你需要奈何开始
本文假定你是一位有履历的汇编语言措施员,并且熟悉Intel兼容处理惩罚器的指令集和系统布局。在某些非凡环境下,你还应该分明下列内容:
掩护模式和虚拟8086(即V86——译者注)模式。
平坦内存模式
间断和异常处理惩罚
掩护和特权级
段和页式内存打点以及错误处理惩罚
输入和输出掩护以及错误处理惩罚
本文也假定你已经纯熟相识专门硬件的特征和相应的ROM BIOS例程以及其他可安装软件。
六、写一个VxD
很多环境下,写一个VxD用来取代一个由Windows 95提供的尺度VxD。然而,大大都环境下,写一个VxD是用来支持新硬件设备可能软件的,在这
种环境下,凡是手工建设一个VxD比修改已经存在的VxD要容易,原因是大大都VxD都是设备相关的。然而,已存在VxD的源代码需要尽大概地仔
细阐明,原因是它们大概包括通用的名目和布局,以及说明奈何利用VMM和VxD处事去实现有用的成果。
写一个VxD需要下列步调:
1、成立包括VxD各个段,VxD声明,设备节制进程,处理惩罚系统节制动静进程的根基部门和API进程的根基部门的VxD框架。
2、插手实模式初始化进程(可选)。
3、完成处理惩罚初始化动静的进程。这些进程应该可以或许初始化节制块,分派全局内存以及安装间断、I/O捕捉和页错误回调进程。
4、完成处理惩罚差异间断和错误的回调进程。
5、为处事插手处事表界说和声明(可选)。
6、完成API进程(可选)
7、完成处理惩罚系统节制动静的进程以成立和删除虚拟机。
#p#副标题#e#
在写一个VxD的进程中,你可以安装该VxD并在调试器节制下运行Windows,在该VxD中配置断点监督该VxD打点的间断,这样可以辅佐你查明该VxD是否正确事情。
1、VxD段
VxD可以包括下面5个段的一些组合:
1、VxD_CODE段:掩护模式代码段(必需)。该段包括VxD系统节制进程、回调进程、处事和API进程。该段用宏VxD_CODE_SEG和VxD_CODE_ENDS
界说开始和竣事,也可定名为_LTEXT。
2、VxD_DATA段:掩护模式数据段(必需)。该段包罗设备描写表、处事表和部门VxD全局数据。该段用宏VxD_DATA_SEG和VxD_DATA_ENDS界说开
始和竣事,也可定名为_LDATA。
3、VxD_ICODE段:掩护模式初始化代码段(可选)。该段一般包罗只在VxD初始化进程中利用的进程和处事,VMM在Init_Complete动静产生后扬弃
此段。该段用宏VxD_ICODE_SEG和VxD_ICODE_ENDS界说开始和竣事,也可定名为_ITEXT。
4、VxD_IDATA段:掩护模式初始化数据段(可选)。该段一般包罗初始化进程和处事利用的数据,VMM在Init_Complete动静产生后扬弃此段。该
段用宏VxD_IDATA_SEG和VxD_IDATA_ENDS界说开始和竣事,也可定名为_IDATA。
5、VxD_REAL_INIT段:实模式初始化段(可选)。该段包括实模式初始化进程和数据,VMM在装载VxD其它部门之前挪用此进程,进程返回后扬弃
此段,该段用宏VxD_REAL_INIT_SEG和VxD_REAL_INIT_ENDS界说开始和竣事,也可定名为_RTEXT。
除实模式初始化段以外,所有代码和数据段均为32位平坦内存模式的掩护模式段,这就是说界说在掩护模式段中的进程和数据均为32位的偏移
量。当VMM装载VxD时,凭据VxD在内存中的实际位置批改所有的偏移量。因此,在掩护模式段中利用普通OFFSET呼吁(伪操纵,下同——译者注)
处应该利用OFFSET32宏,OFFSET32宏界说的偏移量为毗连器确定了正确的偏移量批改信息。
VxD不能改变CS、DS、ES和SS段寄存器,VxD可以或许利用FS和GS段寄存器。
2、掩护模式指令
VxD的源措施文件必需以.386p呼吁开始,以通知汇编器答允掩护模式指令。固然VxD事情在0特权级,但也不该该用掩护模式指令去修改CPU的
#p#分页标题#e#
运行,譬喻修改全局描写符(选择子——译者注)或间断描写符以及修改任务状态段或寄存器,这样做大概会对Windows运行有倒霉影响。独一的
破例环境是当该VxD为虚拟数学协处理惩罚器设备驱动措施(VMCPD),答允修改CR0寄存器中的80387位。
3、包括(Include)文件
包括文件界说了VxD需要的宏、布局、标记和处事表,用于声明段和进程以及利用VMM和其它VxD处事。下面是每个包括文件包括的民众处事界说、
宏和标记界说列表:
1、VMM.INC:包括所有的VMM处事以及所需的宏和标记,譬喻Declare_Virtual_Device和VMMCall。
2、DEBUG.INC:包括在调试终端上输出信息和执行各类数据查抄的宏。这些宏的成果由界说了调试标记的VxD在汇编时该文件生成的代码实现。
3、VPICD.INC:包括为虚拟可编程间断节制器设备(VPICD)界说的所有处事、宏和标记。VPICD处理惩罚所有的间断,所以很多VxD需要VPICD处事。
4、SHELL.INC:包括虚拟外壳设备提供的民众处事的界说。虚拟外壳设备提供对譬喻MessageBox这样的Windows函数的挪用,可以让VxD显示对话框。
4、VxD声明
每一个VxD都要声明一个名称、一个版本号、一个初始化顺序和一个设备节制进程,很多虚拟设备驱动措施还声明一个设备标识和一些API进程。
VxD一般利用Declare_Virtual_Device宏来实现这些声明,譬喻:
Declare_Virtual_Device VSAMPLED, 4, 0, VSAMPLED_Control, \
VSAMPLED_Device_ID, VSAMPLED_Init_Order, \
VSAMPLED_V86_API_Handler, \
VSAMPLED_PM_API_Handler
本例声明白一个VxD实例——VSAMPLED V4.0,在对应的源文件必需界说名字为VSAMPLED_Control的设备节制进程。标记VSAMPLED_Device_ID和
VSAMPLED_Init_Order说明非尺度VxD的标识和初始化顺序,该VxD支持V86模式和掩护模式API进程。
VMM用宏界说的信息来初始化VxD并发送系统节制动静给VxD,而且答允MS-DOS应用措施、设备驱动措施和TSR挪用VxD。为了使VMM存取这些信
息,相应的宏成立一个设备描写块(DDB)并将其生存在掩护模式数据段中(DDB的名目与VxD_Desc_Block布局沟通),宏为DDB成立了一个必需
在VxD毗连时被显式引出的标号。在上例中,DDB的名称是VSAMPLED_DDB。
5、VxD标识(ID)
一个VxD提供一个VxD标识,以区别于其它VxD。VMM动态毗连例程利用VxD标识为符合的VxD毗连处事挪用,假如VxD提供处事可能提供V86模式和
掩护模式API进程以及其它需要独一标识的环境,VxD就必需有独一标识。固然尺度VxD利用预界说VxD标识(标记界说在VMM.INC文件中),支持
新设备和新软件接口的VxD照旧必需全部有新标识。为了防备与其他新VxD斗嘴,Microsoft通过请求和注册标识来担保没有其它厂商利用本身的VxD
#p#分页标题#e#
的标识,Microsoft保存0—01FFH之间的所有VxD标识本身利用。不提供处事可能API进程,可能不需要独一标识的VxD应该利用Undefined_Device_ID标记来界说VxD标识。
6、初始化顺序
每一个VxD都有一个用于指定VMM应该何时初始化该VxD的初始化顺序值,VMM凭据该值从小到大的顺序初始化虚拟机(VM——译者注)。假如两个或
者两个以上的VxD有沟通的值,VMM会凭据SYSTEM.INI文件中呈现的顺序来初始化,但指定顺序是没有担保的。
对付需要挪用其它VxD处事可能需要在其它VxD之前拦截间断的VxD,初始化顺序是很重要的。假如一个VxD需要在尺度VxD之前可能之后初始化,
它的初始化顺序值应该通过在尺度VxD预界说的初始化顺序标记(在VMM.INC文件中界说)上加上可能减去一个小数值来建设。
假如一个VxD不需要初始化顺序值,应该利用Undefined_Init_Order标记住代初始化顺序值。
7、设备节制进程
每一个VxD都有一个设备节制进程,VMM通过挪用此进程给VxD发送VxD系统节制动静。系统节制动静指导VxD完成行动,譬喻自身初始化可能通
知VxD虚拟机的变革(譬喻建设虚拟机)等。大大都VxD通过利用Begin_Control_Dispatch、Control_Dispatch和End_Control_Dispatch
宏来界说设备节制进程,譬喻:
Begin_Control_Dispatch VSAMPLED
Control_Dispatch Sys_Critical_Init, VSAMPLED_Crit_Init
Control_Dispatch Device_Init, VSAMPLED_Device_Init
Control_Dispatch Sys_Critical_Exit, VSAMPLED_Crit_Exit
End_Control_Dispatch VSAMPLED
上例中,宏建设了一个名字为VSAMPLED_Control的设备节制进程,并生成了查抄Sys_Critical_Init、Device_Init和Sys_Critical_Exit动静
的指令。当这些动静发送到该进程时,该进程通过节制相应的进程(譬喻SAMPLED_Crit_Init)来处理惩罚动静,这些动静处理惩罚进程必需在VxD中界说。
七、系统节制动静
VMM发送系统节制动静给VxD,以通知VxD影响系统和虚拟机的变革。大大都VxD需要跟踪虚拟机的建设和状态,所以无论何时建设、初始化可能
终止虚拟机,VMM城市发送动静给VxD。VMM也会在执行核心移动到一个虚拟机可能从一个虚拟机移走时,以及虚拟外壳设备需要给用户显示一个动静框时发送动静给VxD。
下面是民众动静和VxD应该奈何处理惩罚这些动静的要领列表:
Begin_Message_Mode动静:当虚拟外壳设备需要给用户显示一个动静框但不能利用系统虚拟机和Windows函数时VxD收到此动静。虚拟键盘、鼠标
和显示设备生存当前状态,答允任何动静模式处事并为动静模式处理惩罚初始化相应设备。
Create_VM动静:这是当一个新的虚拟机被建设时VxD收到的第一条动静。VxD应该初始化与虚拟机有关的数据,出格是节制块。
Debug_Query动静:VxD从WDEB386调试器收到此动静。VxD可以显示调试列表和从调试终端读取用户呼吁。
Destroy_VM动静:这是VxD收到的第三条虚拟机终止动静。Simulate_Int和Exec_Int处事对得到此动静的虚拟机不再有效。
Device_Init动静:这是VxD收到的第二条动静。答允间断,大大都VxD分派和拷贝初始状态到系统虚拟机节制块中的设备指定部门,安装间断回
调函数和I/O掩护异常以及指定实例数据。这时,Simulate_Int和Exec_Int处事变得有效。
End_Message_Mode动静:当虚拟外壳设备不再需要显示动静框时VxD收到此动静。虚拟键盘、鼠标和显示器设备规复得到此动静的虚拟机以前生存
的状态,克制任何动静模式处事。
Init_Complete动静:这是VxD收到的第三条动静,也是最后一条与系统初始化有关的动静。固然大大都VxD都不处理惩罚此动静,但利用V86内存的
VxD应该在此动静返回前定位和申请内存。当VxD返回此动静时,VMM扬弃VxD的初始化代码和数据段。
Query_Destory动静:当虚拟外壳设备需要抉择是否可以删除虚拟机时VxD收到此动静。VxD可以通过配置进位符号(CF——译者注)返回以阻止虚拟机被删除,在这种环境下VxD应该利用SHELL_Message处事来通知用户问题。
Reboot_Processor动静:当用户试图从头启动计较机时VxD收到此动静。可以从头启动计较机的VxD,譬喻键盘设备应该完成该事情。
Set_Device_Focus动静:当执行核心从一个虚拟机移动到另一个虚拟机时VxD收到此动静。VxD规复硬件设备到与虚拟机有关的状态。假如VxD使
用I/O捕捉打点没有执行核心时的虚拟机,VxD应该尽大概地移走太多的I/O捕捉,使虚拟机运行尽大概地快一些。
Sys_Critical_Exit动静:这是VxD收到的最后一条动静。克制间断,Simualte_Int和Exec_Int处事不再有效。VxD应该复位与之相关的硬件
设备,担保可以或许无问题地返回到实模式。
Sys_Critical_Init动静:这是VxD收到的第一条动静。间断仍然不被答允,所以VxD应该尽大概快地完成任务。大大都VxD完成下列任务:
安装和初始化需要支持来自设备的硬件间断和来自VMM可能其它VxD的软件间断的任何函数,为设备提供需要单独利用V86模式内存页的申请,例
#p#分页标题#e#
如虚拟显示设备申请显示内存。初始化VxD处事需要的任何数据,这凡是包罗读取SYSTEM.INI文件中的配置。当处理惩罚此动静时,Simualte_Int和Exec_Int处事必需不被利用。
Sys_VM_Init动静:在Init_Complete动静之后VxD收到此动静。VxD应该初始化系统虚拟机的硬件和软件状态。假如VxD配置进位符号返回,VMM
终止所有历程并退出Windows。
Sys_VM_Terminate动静:这是VxD收到的第一条系统虚拟机终止动静。VxD可以开始为虚拟机终止做筹备。Simulate_Int和Exec_Int处事有效,系
统虚拟机老是最后一个被终止的虚拟机。
System_Exit动静:这是当系统终止时VxD收到的第一条动静。VMM在发送Sys_VM_Terminate动静之后发送此动静,答允间断,但Simualte_Int
和Exec_Int处事不再有效。假如此动静来自一个致命错误的功效,VxD可以通过修改系统虚拟机的内存以规复系统状态,使得Windows可以或许终止而
不死机。
VM_Critical_Init动静:这是当一个新的VxD(虚拟机——译者注)被建设时VxD收到的第二条动静。VxD可以通过配置进位符号返回以阻止虚拟
机被成立。克制间断,Simualte_Int和Exec_Int处事不再有效。
VM_Init动静:这是当一个新的VxD被建设时VxD收到的第三条动静。VxD应该初始化虚拟机的硬件和软件状态,譬喻虚拟显示设备执行INT 10H功
能配置初始显示模式。
VM_Not_Execute动静:这是VxD收到的第二条虚拟机终止动静(假如虚拟机已经被虚拟外壳设备删除,这是收到的第一条动静)。VxD可以通过查抄
EDX寄存器中的符号来查明终止原因。Simulate_Int和Exec_Int处事对得到此动静的虚拟机不再有效。
VM_Resume动静:当虚拟机的执行被规复时VxD收到此动静,譬喻切换到前台时。VxD应该锁定任何资源和为虚拟机从头开始筹备内部布局。假如
VxD配置进位符号返回,VMM不规复执行虚拟机。
VM_Suspend动静:当虚拟机已经被挂起时VxD收到此动静,譬喻切换到靠山时。VxD应该解锁任何与虚拟机有关的资源。
VM_Terminate动静:这是VxD收到的第一条虚拟机终止动静。VxD可以开始筹备虚拟机的终止。Simulate_Int和Exec_Int处事有效。