大雀软件园

首页 软件下载 安卓市场 苹果市场 电脑游戏 安卓游戏 文章资讯 驱动下载
技术开发 网页设计 图形图象 数据库 网络媒体 网络安全 站长CLUB 操作系统 媒体动画 安卓相关
当前位置: 首页 -> 操作系统 -> Web服务器 -> VxD的初始化和结束

VxD的初始化和结束

时间: 2021-07-31 作者:daque

vxd步调分为两种:静态的和动静的。每种的加载本领都各别,接遭到的初始化和中断的遏制动静也各别。 静态vxd: 下列情景下,vmm加载一个静态vxd: 一个实形式常驻步调经过挪用阻碍2fh,1605h,来挪用此vxd。 此vxd在备案表中的如次场所有设置: hkey_local_machine\\system\\currentcontrolset\\services\\vxd\\key\\staticvxd=vxd带路途文献名 此vxd在system.ini中的[386enh]行下有设置:[386enh] section: device=vxd带路途文献名 在开拓的功夫,我倡导你从system.ini载入vxd步调,由于如许即使你的vxd步调有错而引导windows不许启用的话,你不妨在dos下窜改system.ini,而即使你运用的备案表载入的方法,就没辙窜改了。 当vmm加载你的静态vxd步调时,你的vxd步调会按以次程序接受到三个体例遏制动静: sys_critical_init vmm在转入到养护形式后,盛开阻碍前发出这个遏制动静。大普遍vxd步调到不要用到这个动静,只有: 你的vxd步调要接收少许其余vxd步调大概养护形式步调要用到的阻碍。既是你处置这个动静的功夫这个阻碍还没有翻开,你就不妨决定在你接收这个阻碍的功夫此阻碍不会被挪用。 你的vxd步调为其余的vxd步调供给了少许vxd效劳。比方,少许在你的vxd步调后加载的vxd步调在处置device_init遏制动静时须要挪用少许你的vxd效劳,既是sys_critical_init 遏制动静在device_init动静之前被发送,以是你该当在sys_critical_init 动静发送时初始化你的步调。 即使你要对这动静举行处置,你该当尽大概快的做完初始化处事,免得太长的实行功夫引导的硬阻碍丧失。(记取:阻碍还没翻开) device_init vmm在盛开阻碍后发送此消息。大普遍vxd步调都在获得这个动静时初始化。由于阻碍都盛开了,以是耗费时间的操纵也不妨在这边实行而不用怕会引导硬阻碍的丧失。你不妨在这时候举行初始化(即使你须要的话)。 init_complete 在一切的vxd步调处置完device_init 动静之后,vmm开释初始化段(icode和rcode段类)之前,vmm发出这个遏制动静。惟有少量几个vxd要处置这个动静。 你的vxd步调在胜利地初始化后,必需将归来标记清零,反之,必需在归来之前把归来标记设为堕落消息。即使你的vxd不须要初始化,你就不用对那些动静举行处置。 当要中断静态vxd的功夫,vmm发送如次的遏制动静: system_exit2 当你的vxd步调收到这个动静,windows95正在封闭体例,除去体例假造机一切其余假造机都仍旧退出了。纵然如许,cpu仍旧居于养护形式下,在体例假造机上实行实形式源代码也是安定的。在这时候kernel32.dll也仍旧被卸载了。 sys_critical_exit2 当一切的vxd实行对system_exit2的相应处置而且阻碍都被封闭后,你的vxd收到到这个动静。 很多vxd步调并不要相应这两个动静,只有你要为体例做变换到实形式的筹备。要领会,当window95封闭时,它加入到实形式。以是即使你的vxd步调对实形式印象做了少许会引导它不宁静的操纵,它就须要在这时候举行回复。 你大概会感触怪僻:干什么这两个动静反面都随着个“2\" ”。这是由于:在vmm加载vxd步调的功夫,它是依照初始化程序值小的vxd先加载的程序加载的,如许vxd步调就不妨运用那些在它们之前加载的vxd步调供给的效劳。比方,vxd2要用到vxd第11中学的效劳,它就必需把它的初始化程序值设置的比vxd小。加载的程序是: ..... vxd1 ===> vxd2 ===> vxd3 ..... 那么卸载的功夫,天经地义的是初始化程序值大的vxd步调先被卸载,如许她们仍旧不妨运用比它们后加载的那些vxd步调供给的效劳。如上头的例子,步骤是: .... vxd3 ===> vxd2 ===> vxd1..... 在上边的例子中,即使vxd2在初始化时挪用了vxd第11中学的某些效劳,那么卸载时它大概也要再次用到少许vxd第11中学的效劳。system_exit2和sys_critical_exit2是反初始化程序发送的。这表白,当vxd2接遭到那些动静时,vxd1还没有被卸载,它仍不妨挪用vxd1的效劳,而system_exit和sys_critical_exit动静不是依照反初始化程序发送的。这表示着,你不许确定你能否仍能挪用在你之前加载的vxd供给的vxd效劳。新一代的vxd步调不该当运用那些动静。 再有两种退出动静: device_reboot_notify2 报告vxd步调vmm正在筹备从新启用体例。这功夫阻碍仍旧盛开的。 crit_reboot_notify2 报告vxd步调vmm正在筹备从新启用体例。这功夫阻碍仍旧被封闭了。 到这边,你不妨猜到再有device_reboot_notify和crit_reboot_notify 动静,但它们并不是像“2”本子的动静一律按反初始化程序发送的。 动静vxd: 动静vxd在windows9x里不妨动静的被加载和卸载。这个特性在window3.x下是没有的。动静vxd步调的重要效率是用来扶助某些动静的硬件摆设的重装,比方:即插即用摆设。纵然如许,你不妨从你的win32步调中加载/卸载它,也不妨把它看作是你的步调的一个到ring-0的扩充。 上一节咱们提到的例子是一个静态的vxd,你不妨把它变换成一个动静的vxd,只有在.def文献中vxd标志的反面加上要害字dynamic。 vxd firstvxd dynamic 这即是你把一个静态vxd变换成一个动静的vxd所要做的十足。 一个动静的vxd不妨按以次的本领被加载: 把它放到你的windows目次下的\\system\\iosubsys目次中。在这个目次里的vxd会被输出输入监督器(ios)加载。那些vxd必需扶助层摆设启动。以是用这种本领加载你的动静vxd并不是一个好方法。 用vxd加载效劳。 vxdldr是一个不妨加载动静vxd的静态vxd。你不妨在其余vxd内里大概在16位代码内里挪用它的效劳。 用win32运用步调里的 createfile api。你在挪用createfile时,你的动静vxd要以底下的方法填写: \\\\.\\vxd完备路途名 比方,即使你要加载一个在暂时目次下名为firstvxd的动静vxd,你须要做如次的处事: .data vxdname db \"\\\\.\\firstvxd.vxd\",0 ...... .data? hdevice dd ? ..... .code ..... invoke createfile, addr vxdname,0,0,0,0, file_flag_delete_on_close,0 mov hdevice,eax ...... invoke closehandle,hdevice ...... file_flag_delete_on_close 这个标记用来证明该vxd在createfile归来的句柄封闭时被卸载。 即使你用createfile来加载一个动静vxd,那么这个动静vxd必需处置w32_deviceiocontrol 动静。当你的动静vxd第一次被createfile因变量加载的功夫,vwin32 向你的vxd发出这个动静。你的vxd相应这个动静,归来时eax中的值必需为零。当运用步调挪用deviceiocontrol api来与一个动静vxd通信时,w32_deviceiocontrol动静也被发送。咱们会鄙人一章讲到deviceiocontrol接口。 一个动静vxd在初始化时收到一个动静: sys_dynamic_device_init 在中断时也收到一个遏制动静: sys_dynamic_device_exit 动静vxd不会收到sys_critical_init, device_init和init_complete遏制动静,由于那些动静是在体例假造机初始化时发送的。除去这三个动静,动静vxd能收到一切的遏制动静,只有它还在外存里。它不妨做静态vxd不妨做的一切工作。大略的说,动静vxd除去加载体制和接受到的初始化/中断动静跟静态vxd各别除外,它能做静态vxd所能做的十足。 其它体例遏制动静 当vxd在外存里的功夫,除去接受和初始化及中断关系的动静外,它还要收到很多其余遏制动静。有些动静是对于假造机处置器的,有的是对于百般事变的。比方,对于假造机的动静如次: create_vm vm_critical_init vm_suspend vm_resume close_vm_notify destroy_vm 采用地相应你所感爱好的动静是你本人的负担。 在vxd内创造因变量 你要在一个段内里设置你的因变量。你该当开始设置一个段,而后把你的因变量放进去。比方,即使你要把你的因变量放到一个可调页段中。你该当先设置一个可调页段,像如许: vxd_pageable_code_seg (你的因变量写在这边) vxd_pageable_code_ends 你不妨在一个段内里插入多个的因变量。动作一个vxd编写者,你必需确定每一个因变量该当放到哪个段内里去。即使你的因变量必需功夫生存于外存中,如某些硬件阻碍处置步调,就把它们放到锁定页面段内里,要不,你该当把它们放到可调页段。 你要用beginproc和endproc 宏来设置你的因变量: beginproc 因变量名 endproc 因变量名 运用beginproc 宏还不妨加上少许参数,想领会那些详细,你不妨看看win95 ddk的文书档案。大普遍功夫,你只用填写因变量的名字就够了。 由于beginproc-endproc 宏比proc-endp 训令的功效要强,以是你该当用beginproc-endproc宏来包办proc-endp训令 vxd编制程序商定 存放器的运用 你的vxd步调不妨运用一切的存放器,fs和gs。然而在变换段存放器的功夫确定要提防。更加是,确定不要变换cs和ss的实质,只有你对将爆发的工作有一致的控制。你不妨运用ds和es,但确定要记取在归来时回复它们初值。有两个特性位更加要害:目标和阻碍特性位。不要长功夫的樊篱阻碍。再有即使你要变换目标特性位,不要忘了在归来之前回复它的初值。 参数传播商定 vxd效劳因变量有两种挪用商定:存放器法和仓库法。挪用存放器法效劳因变量时,你经过百般存放器来传播效劳因变量的参数。而且,在挪用实行后查看存放器的值来看操纵能否胜利。不要老是觉得在挪用效劳因变量后重要存放器的值还和往日一律。当挪用仓库法效劳因变量时,你把要传播的参数压栈,在eax获得归来值。仓库挪用法的效劳因变量生存ebx,esi,edi和ebp的值。很多存放器挪用法效劳因变量都源于windows3.x的期间。在大普遍功夫,你不妨经过名字来辨别这两种效劳因变量,即使一个因变量的名字一下划线发端,如_heapallocate,它即是一个仓库法的效劳因变量(除去少量从vwin32.vxd导出的因变量)。即使因变量名不是一下划线发端,它即是一个存放器法的效劳因变量。 挪用vxd效劳因变量 你不妨经过vmmcall和vxdcall 宏来挪用vmm和vxd效劳。这两个宏的语法是一律的。当你要挪用vmm导出的vxd效劳因变量时,用vmmcall。当你要用其它vxd步调导出的vxd效劳因变量时,用vxdcall。 vmmcall service ; 挪用存放器法效劳因变量e vmmcall _service, ; 挪用仓库法效劳因变量 正如我在前方所讲的,vmmcall和vxdcall领会出一个随着一个双字的20h阻碍,如许用起来很简单。当你挪用仓库法效劳时,你必需用角括号把你的参数列括起来。 vmmcall _heapallocate, <, heaplockedifdp> _heapallocate是一个仓库法效劳因变量。它有两个参数,咱们必需用角括号把它们括起来。因为第一个参数是一个这个宏不许精确证明的表白式,以是咱们又要用一个角括号把它括起来。 flat地方 在老的编写翻译东西里,当你运用offset 操纵符时,编写翻译器和联接器会天生缺点地方,以是vxd编写者用offset flat:来包办offset。imm.inc囊括了一个使这更大略的宏:offset32 来包办offset flat:。以是即使你要用地方操纵时,用offset32 来包办offset操纵符。 提防: 当我写这篇教程的功夫,我试了一下用offset 操纵符。它不妨天生精确的地方。以是我想masm6.14矫正了这个bug。然而为了安定起见,你仍旧该当用offset32宏来包办offset。

热门阅览

最新排行

Copyright © 2019-2021 大雀软件园(www.daque.cn) All Rights Reserved.