请求执行时间段通常被简称为"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 _SHELL_LoadLibrary _SHELL_LocalAllocEx _SHELL_LocalFree 使用提供的这6个服务,VxDs可以调用在16-bit DLLs/EXE中的16-bit函数,象WinHelp。然而,我们马上要进步到32-bit时代(未来是64-bit) ,所以我不会仔细研究它们。如你对此感兴趣,你可以在Windows 95/98DDK文档中了解它们。 <  
1/2 1 2 下一页 尾页 |