| 域名空间 下载中心 社区论坛 信息公告 MY小屋 |
![]() |
联系我们 设为首页 加入收藏 |
|
首页 | 新闻资讯 | 编程开发 | 网页设计 | 图形图象 | 网络媒体 | 网站模板 | 数 据 库 | 投稿 论坛 | 操作系统 | 系统优化 | 网络安全 | 黑客技术 | 硬件学堂 | 硬件报价 | 服 务 器 | 地图 专题 | 应用软件 | 聊天通讯 | Q Q 专栏 | 建站经验 | 在线工具 | 站长Club | 注 册 表 | 旧版 社会 | 游戏娱乐 | 设计欣赏 | 疑难解答 | 社区论坛 | 韩国素材 | 素材图库 | 广告服务 | 服务 |
| 新版上线![旧版] | |||||
注:打开慢时请稍等
DeviceIoControl接口http://www.iyit.net 日期:2006-5-22 12:31:19 来源:网络转载 点击: |
在这一节中我们将要关于学习动态VXD,特别是如何创建,加载和使用。 点击这里下载例子 VxD接口 l VxD services VxD服务 l V86 Interface V86接口 l Protected-mode (PM) Interface 保护模式接口 l Win32 DeviceIoControl Interface Win32设备输入输出控制接口 我们已经知道了VxD服务,V86和保护模式接口是由V86和保护模式程序调用的。因为V86和保护模式程序是16位的,我们不能在Win32应用程序中使用那两种接口。在Windows 95中,微软给Win32应用程序加了另外一个接口所以Win32应用程序可以调用VxD的服务:DeviceIoControl接口(设备输入输出控制接口) DeviceIoControl接口 在Win32程序方面: 接着你调用DeviceIoControlAPI函数来选择要运行的函数。DeviceIoControl函数遵循下面的语法: DeviceIoControl PROTO hDevice:DWORD,\ dwIoControlCode:DWORD,\ lpInBuffer:DWORD,\ nInBufferSize:DWORD,\ lpOutBuffer:DWORD,\ nOutBufferSize:DWORD,\ lpBytesReturned:DWORD,\ lpOverlapped:DWORD l hDevice 是从CreateFile返回的VxD句柄。 l dwIoControlCode是用来制定VxD将要进行的操作。你应该在你要选用那种操作之前得到可能的dwIoControlCode值得列表。 l lpInBuffer是包含了VxD完成dwIoControlCode所制定操作的数据的缓冲区地址。如果这个操作不需要数据,你可以传为NULL。 l nInBufferSize是由lpInBuffer所指向的缓冲区的地址的大小(byte)。 l lpOutBuffer是VxD程序在操作成功之后要将输出数据输出到的缓冲区。如果这个操作没有任何返回值,这个值可以为NULL。 l nOutBufferSize是lpOutBuffer所指向的缓冲区的大小(byte)。 l lpBytesReturned是一个dword型变量的地址。这个变量用来接收VxD在lpOutBuffer中写入数据的大小。 l 如果你想要把操作设成异步的,lpOverlapped是一个OVERLAPPED结构的指针。如果你要一直等直到操作完成,这个值为NULL。 在VxD方面: l ebx 是VM的句柄。 l esi 是指向DIOCParams结构的指针。DIOCParams包含了从win32程序传送的信息。 DIOCParams是按照如下定义的: DIOCParams STRUC Internal1 DD ? VMHandle DD ? Internal2 DD ? dwIoControlCode DD ? lpvInBuffer DD ? cbInBuffer DD ? lpvOutBuffer DD ? cbOutBuffer DD ? lpcbBytesReturned DD ? lpoOverlapped DD ? hDevice DD ? tagProcess DD ? DIOCParams ENDS l Internal1 是指向Win32应用应用程序用户寄存器结构的指针。 l VMHandle 虚拟机句柄 l Internal2 是指向设备描述块(DDB)的句柄。 l dwIoControlCode, lpvInBuffer, cbInBuffer, lpvOutBuffer, cbOutBuffer, lpcbBytesReturned, lpOverlapped是传送到DeviceIoControl API的参数。 l hDevice是 ring-3级设备句柄。 l tagProces 是过程的标签。 在DIOCParams结构中有所有从Win32应用程序传送到你的VxD的信息。 你的VxD至少要处理DIOC_Open(传送到dwIoControlCode),那是当Win32程序调用CreateFile打开你的VxD时VWIN32发送给你的VxD的。如果你的VxD准备好了,它必须在eax中返回0而且CreateFile也会成功。如果你的VxD没有准备好,它必须在eas中返回一个非零值而且CreateFile也会失败。除了DIOC_Open,当Win32程序关闭这个设备句柄时,你的VxD将会从VWIN32收到DIOC_Closehandle。 能由CreateFile加载的最小的动态VxD框架: .386p DECLARE_VIRTUAL_DEVICE DYNAVXD,1,0, DYNAVXD_Control,\ Begin_control_dispatch DYNAVXD VxD_PAGEABLE_CODE_SEG end ;-------------------------------------------------------------------------------------------------------------------------------- VXD DYNAVXD DYNAMIC SEGMENTS EXPORTS 完整例子: ; VxDLoader.asm .386 .data 下面这段源代码是由 vxdloader.asm 调用的动态VxD。 .386p DECLARE_VIRTUAL_DEVICE SHELLMSG,1,0, SHELLMSG_Control,\ Begin_control_dispatch SHELLMSG VxD_PAGEABLE_DATA_SEG VxD_PAGEABLE_CODE_SEG end 分析: Invoke CreateFile,addrVxDName,0,0,0,0,FILE_FLAG_DELETE_ON_CLOSE,0 我们调用CreateFile来加载动态VxD。注意FILE_FLAG_DELETE_ON_CLOSE标记。当从CreateFile返回的VxD句柄被关闭的时候,这个标志通知Windows卸载VxD。如果CreateFile成功,我们把VxD句柄保存起来。 invoke MessageBox,NULL,addr Success,addr AppName,MB_OK+MB_ICONINFORMATION 当VxD加载/卸载的时候,这个程序会显示一个消息框。它令dwIoControlCode=1然后调用DeviceIoControl。将InBuffer的地址传给lpInBuffer,将InBuffer的大小传给nInBufferSize。InBuffer是一个包括两个元素的数组:每个元素都是一个字符串的地址。
MsgTitle db "DeviceIoControl Example",0
现在我们看一下这段VxD。 它只处理w32_deviceIoControl消息。当w32_deviceIoControl消息发送的时候,调用OnDeviceIoControl函数。
BeginProc OnDeviceIoControl
OnDeviceIoControl 处理DIOC_Open,再eas中返回0。
.elseif [esi].dwIoControlCode==1
它也处理control code 等于1。它做的第一件事是取出在lpyInBuffer中的数据。这个数据是传送到DeviceIoControl API 的lpInBuffer中的两个dword值。它把指向dword数组的地址放到edi中。第一个dword是作为消息框标题的字符串地址。第二个dword是作为消息框文本的字符串地址。
;-----------------------------------
它调用VMM服务lstrlen来计算消息框标题的长度。lstrlen在eax中返回字符串的长度。我们把这个长度加1来包括结束标记NULL。下一步我们通过调用HeapAllocate来分配一块足够大可以容纳字符串和它的结束标记NULL内存。加上HEAPZEROINIT标记使HeapAllocate将这块内存清零。HeapAllocate在eax中返回这块内存的地址。我们然后从win32 app的地址空间把字符串拷贝到我们申请的内存中。我们对要做消息框文本的字符串做同样的操作。
mov edi,pTitle
我们把标题和文本的地址分别存在edi和ecx中。把想要的标记放在eax中,通过调用Get_Sys_VM_handle得到系统VM的VM 句柄。然后调用SHELL_sysbodal_Message 。SHELL_sysModal_Message是系统SHELL_Message的模式版本。它冻结系统直到用户对消息框做出反应。
VMMCall _HeapFree,pTitle,0
当SHELL_sysmodal_Message返回时,我们用_HeapFree释放内存。
总结: 编辑:黑鹰 [发送给好友] [打印本页] [关闭窗口] [返回顶部] 上一篇:请求执行时间段与Shell函数 下一篇:VxD例程:消息框 转载请注明来源:www.iyit.net 特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。 |
| 相关文章 | ||||
| 友情链接 | ||||||
| 设置首 页 - 版权声明 - 广告服务 - 关于我们 - 联系我们 - 友情连接 |
| |||||||