请求执行时间段与Shell函数
2008-12-27 09:36:04 来源:WEB开发网例子
这是一个显示如何注册一个appy time事件并且使用_SHELL_ShellExecute的例子。VxD是动态的,被一个简单的Win32应用程序使用。当一个用户按下"run Calculator"按纽,win32应用程序调用DeviceIoControl去要求VxD注册一个appy time事件并且运行在Windows目录中的calc.exe。
;---------------------------------------------------------------------------------
; VxD Source Code
;---------------------------------------------------------------------------------
.386p
include \masm\include\vmm.inc
include \masm\include\vwin32.inc
include \masm\include\shell.inc
VxDName TEXTEQU
ControlName TEXTEQU
VxDMajorVersion TEXTEQU <1>
VxDMinorVersion TEXTEQU <0>
VxD_STATIC_DATA_SEG
VxD_STATIC_DATA_ENDS
VXD_LOCKED_CODE_SEG
;----------------------------------------------------------------------------
; Remember: The name of the vxd MUST be uppercase else it won't work/unload
;----------------------------------------------------------------------------
DECLARE_VIRTUAL_DEVICE %VxDName,%VxDMajorVersion,%VxDMinorVersion, %ControlName,UNDEFINED_DEVICE_ID,UNDEFINED_INIT_ORDER
Begin_control_dispatch %VxDName
Control_Dispatch W32_DEVICEIOCONTROL, OnDeviceIoControl
End_control_dispatch %VxDName
BeginProc OnDeviceIoControl
assume esi:ptr DIOCParams
.if [esi].dwIoControlCode==1
VxDCall _SHELL_CallAtAppyTime,<,0,0,0>
.endif
xor eax,eax
ret
EndProc OnDeviceIoControl
VXD_LOCKED_CODE_ENDS
VXD_PAGEABLE_CODE_SEG
BeginProc OnAppyTime, CCALL
ArgVar RefData,DWORD
ArgVar TheFlag,DWORD
EnterProc
mov File.shex_dwTotalSize,sizeof SHEXPACKET
add File.shex_dwTotalSize,sizeof EXEName
mov File.shex_dwSize,sizeof SHEXPACKET
mov File.shex_ibOp,0
mov File.shex_ibFile,sizeof SHEXPACKET
mov File.shex_ibParams,0
mov File.shex_ibDir,0
mov File.shex_dwReserved,0
mov File.shex_nCmdShow,1
VxDCall _SHELL_ShellExecute,
LeaveProc
Return
EndProc OnAppyTime
VXD_PAGEABLE_CODE_ENDS
VXD_PAGEABLE_DATA_SEG
File SHEXPACKET <>
EXEName db "calc.exe",0
VXD_PAGEABLE_DATA_ENDS
end
讲解
VxD等待一个DeviceIoControl消息:第1号服务。当它收到上述消息,它将注册一个appy time事件。
VxDCall _SHELL_CallAtAppyTime,<<OFFSET32 OnAppyTime>,0,0,0>
它将传送OnAppyTime函数的平板地址到_SHELL_CallAtAppyTime,这样,当appy time事件发生时,Shell VxD将调用它。因我们不需要使用任何参考数据并且不需要处理过期情况,所以紧跟OnAppyTime函数的三个参数都是0。
当appy time事件发生时, Shell VxD调用OnAppyTime函数。
BeginProc OnAppyTime, CCALL
我们用BeginProc描述一个函数。因为Shell VxD用C调用顺序调用OnAppyTime,我们需要指定CCALL属性。
ArgVar RefData,DWORD
ArgVar TheFlag,DWORD
EnterProc
...
LeaveProc
Return
因为Shell VxD用两个参数调用OnAppyTime,我们必须设置堆栈结构。ArgVar宏用来调整每个要传递到函数的参数的堆栈结构。它的语法如下:
ArgVar varname, size, used
varname是参数的名字。你可以使用你喜欢的任意名字。size是参数的大小。你可以使用BYTE、WORD、DWORD或1,2,4。used通常被忽略。
紧接着ArgVar宏,我们需要使用EnterProc和LeaveProc宏来标志在程序中存放变量和参数的结构的开始与结束,使其能被正确访问。使用Return宏返回到调用者。
mov File.shex_dwTotalSize,sizeof SHEXPACKET
add File.shex_dwTotalSize,sizeof EXEName
mov File.shex_dwSize,sizeof SHEXPACKET
mov File.shex_ibOp,0
mov File.shex_ibFile,sizeof SHEXPACKET
mov File.shex_ibParams,0
mov File.shex_ibDir,0
mov File.shex_dwReserved,0
mov File.shex_nCmdShow,1
VxDCall _SHELL_ShellExecute,
在这个程序中的指令是简单的:初始化SHEXPACKET结构并且调用_SHELL_ShellExecute服务。记住 shex_dwTotalSize包含SHEXPACKET结构自身的和跟着它的字符串的组合大小。这是一个简单的事情。假如字符串不紧跟在此结构之后的,你必须计算从结构第一个字节到到字符串最后一个字节之间的距离。shex_ibFile包含此结构自身的大小,因为程序名紧跟在此结构之后。shex_ibDir是0,意味着把Windows目录作为工作目录。这并不意味着程序必须在Windows目录中。程序可以在Windows能找到的任意地方。
shex_nCmdShow是1,即SW_SHOWNORMAL的值。
File SHEXPACKET <>
EXEName db "calc.exe",0
我们定义一个SHEXPACKET结构,其后紧跟着想要运行的程序名。
更多精彩
赞助商链接