您的位置:逆风者 汇编技术 正文
原作者:www.upwinder.com 添加时间:2007-09-01 原文发表:2007-08-31 人气:10 来源:未知

本文章共1689字,分2页,当前第1页,快速翻页:
 

  请求执行时间段通常被简称为"appy time"。是指当系统VM稳定到充许VxDs和ring-3级别的应用软件(特别是16-bit的应用软件)交互时的时间段。例如,在一个特定时间段,VxDs能加载并调用在16-bit Dlls中的函数。这个appy time在Windows 3.x中是无效的。在Windows3.x,一个VxD能包含在16-bit DLLs中的任意函数的地址,并模拟一个远调用到这个地址。然而,因为造成了VMM重入,这个操作将中断所有正在ring-3中执行的任务。所以能被VxDs能调用的APIs被要求是中断安全的,象PostMessage。在Windows 95,一个VxD在appy time的帮助下能调用任意一个在16-bit DLLs中的函数

逆风者

假如你的VxDs被通知正处在appy time,它就能加载16-bit DLLs并调用其中的函数。VxDs怎么知道appy time到来了呢?这就要使用Shell VxD请求一个appy time。当系统VM在稳定状态,Shell VxD将调用某VxD的一个回调函数,此函数是在VxD请求appy time时指定的。Shell VxD发生一次appy time事件仅仅调用一次你的回调函数。这就象找工作。你到职业介绍所,登记你的名字和电话号码。当你回到家,如有一个工作适合你,职业介绍所将电话通知你这个好消息。当你收到了这个消息,他们就不再通知你了。

在一个appy time起作用前要花上一些时间进行相关处理。appy time事件以下环境中将不起作用:

1、系统启动或关机时。
2、当系统VM在临界段或等待一个信号量时。

管理一个appy time事件

你可以通过调用_SHELL_CallAtAppyTime来注册一个appy time事件,它的定义如下:

VxDCall _SHELL_CallAtAppyTime, <<OFFSET32 pfnCallback>, dwRefData, dwFlags, dwTimeout>

pfnCallBack -- 当appy time事件发生时你要Shell VxD调用的回调函数的平板地址。这个函数接收两个参数,dwRefData和dwFlags,与你传送给_SHELL_CallAtAppyTime的两个一样。记住,Shell VxD采用C调用顺序调用你的回调函数。总而言之,你要象这样定义你的回调函数

BeginProc OnAppyTime, CCALL, PUBLIC
ArgVar dwRefData,DWORD ; declare argument name and type
ArgVar dwFlags, DWORD
EnterProc
你的代码...
LeaveProc
Return
EndProc OnAppyTime
dwRefData -- 你要Shell VxD传送给你的回调函数的参考数据。可以是你想要的任何东西。
dwFlags -- 事件标志。

如下值之一:
CAAFL_RING0 ring-0事件
CAAFL_TIMEOUT 由dwTimeout指定的时间到期事件

假如你只想在一定的时间内等待appy time事件,使用CAAFL_TIMEOUT标志。如你想一直等待appy time事件,使用NULL。CAAFL_RING0作用不明。
dwTimeout -- 在appy time事件发生前,VxD能等待时间段长度。时间段的单位不明。
这个服务是异步的,意味着你为appy time事件注册回调函数之后立即返回。

如果这个服务调用是成功的,在eax中返回appy time事件句柄。假如调用失败,在eax返回0。

你可以调用_SHELL_CancelAppyTimeEvent来撤消appy time事件注册,它仅有一个参数,就是由_SHELL_CallAtAppyTime返回的appy time事件句柄。

你应当在appy time事件到来时检查系统。例如,当你在系统关闭时注册appy time会发生什么?你的VxD的回调函数将不会得到调用!当appy time事件到来时,你应当调用_SHELL_QueryAppyTimeAvailable来查询系统状态。这个服务没有参数。如果appy time无效,在eax中返回0,例如:当系统关闭时或消息服务程序产生一个一般保护性错误时。

这个服务不会告诉你现在是不是appy time:它仅仅告诉你可能有一个appy time事件到来。简而言之,如果你想安全运行,首先调用_SHELL_QueryAppyTimeAvailable并检查eax中的值是否非零值,然后才可继续调用_SHELL_CallAtAppyTime。

请求执行时间段Shell服务

当appy time到达时,你可以使用几个Shell服务调用:

_SHELL_CallDll
_SHELL_FreeLibrary
_SHELL_GetProcAddress
 

本文章更多内容1 - 2 - 下一页>>
相关文章

结构化程序方法在汇编语言中的应用
Win32编程中请慎用ebx/esi/edi
控制转移(2)
用汇编编写屏幕保护程序
驱动程序的动态加载
超类化
建立自己的动态链接库
关于div/idiv/mul/imul指令的用法
汇编语言的高级语言特性
实模式和任何特权级下可执行的指令
中断和异常的转移方法
驱动程序的编译和连接
Win32汇编的环境和基础
学写基于对话框的程序
字符串操作指令
高级汇编语言技术
处理程序多重启动
以对话框为主要界面的应用程序
VxD例程:消息框
工具提示控件

相关评论


本文章所属分类:首页 汇编技术

  热门关键字:
进制数据输出的通用程序 2007-09-12
汇编源码--showmem 2007-08-31
汇编源码--CLEAN 2007-08-31
汇编源码--hdr 2007-08-31
汇编源码--basload 2007-08-31
汇编源码--CHAR 2007-08-31
汇编源码--fxn 2007-08-31
汇编源码--alarm 2007-08-31
汇编源码--getsect 2007-08-31
汇编源码--DEV 2007-08-31
汇编源码--getspace 2007-08-31
汇编源码--frespace 2007-08-31
CIH文件型病毒检测消除程序 2007-08-31
Mixer Volume Ctrler V1.0 2007-08-31
汇编源码--COMINT 2007-08-31
自己用汇编语言写的一个病毒(源码... 2007-08-31
汇编源码--col 2007-08-31
汇编源码--BURNOUT 2007-08-31