另外一些只请求执行时间段服务我想更有用处:_SHELL_ShellExecute和 _SHELL_BroadcastSystemMessage。使用_SHELL_BroadcastSystemMessage,你能在一次调用中发送消息到顶端的窗口和所有的VxDs。如果appy time有效,你可以发送消息到窗口和VxDs。如果appy time无效,你只能发送消息到VxDs。 _SHELL_ShellExecute是在ring-3中的函数ShellExecute在ring-0中的对应函数。实际上,它调用ring-3中的ShellExecute完成这个工作。使用外壳服务,你可以运行/打开/打印任意文件。 _SHELL_ShellExecute的定义如下所示: VxDCall _SHELL_ShellExecute,<OFFSET32 ShexPacket> 它仅有一个参数,SHEXPACKET结构的平板地址。它从ShellExecute函数中返回一个值到eax中。让我们研究一下SHEXPACKET结构: shex_dwTotalSize SHEXPACKET结构的字节数加上可选的参数rgchBaggage的大小,它直接跟随在这个结构之后。我等一下描述rgchBaggage。 shex_dwTotalSize SHEXPACKET结构的字节数加上可选的参数rgchBaggage的大小,它直接跟随在这个结构之后。我等一下描述rgchBaggage。 shex_dwSize SHEXPACKET结构的字节数,不包括rgchBaggage。结合上面的shex_dwTotalSize值,外壳VxD能计算任意长度的rgchBaggage的大小。 shex_ibOp 你要完成的操作。假如你指定0,意味着你想要打开一个文件。如果是一个可执行文件,就运行它。如果你想要完成其他的操作,你必须在rgchBaggage中指定操作的名字,在这个域中,必须包括从这个SHEXPACKET结构开始到一个ASCII字符串的距离,此距离大小以字节计数,字符串指定你要完成的操作的名称。SHEXPACKET结构的大小是32字节。如果操作字符串紧跟在SHEXPACKET结构后,shex_ibOp中的值必须是32。要知道你可以完成的操作,请查看ShellExecute服务。有三个操作被定义,"open"、"print"和"explore"。 shex_ibFile 从此结构开始到一个ASCII字符串的距离,这个字符串是你想要传递给ShellExecute的文件名,就象Shex_ibOp成员。 shex_ibParams 你想传递到由shex_ibFile指定的文件的可选参数。假如此文件是一个文档文件,你不想传递任何参数给它,就用0。假如你想传递参数给那个文件,在把从此结构开始到此成员指定的字符串的距离放在这个成员中。简而言之,就象shex_ibOp和shex_ibFile成员。 shex_ibDir 工作目录。假如你想使用Windows目录就指定0,否则指定其为在此结构后的首选目录名字符串,并把从此结构开始到目录名字符串的距离值放到这个成员中。 shex_dwReserved 如其名字所指,它是保留的。不要理它。 shex_nCmdShow 应用程序窗口怎样被显示。这是一个你正常传递给ShowWindow的值,比如,SW_XXXX值。可在windows.inc中查看这些值。 所有成员的大小都是双字的。在这里我介绍刚才我承诺的rgchBaggage成员。仅有一点不同,因为其大小是可变的,所以它作为SHEXPACKET结构的一员却不能包括在此结构的定义中。查看shell.inc,你看到rgchBaggage并不在SHEXPACKET结构的定义中,尽管在Windows 9x DDK文档中,声明其是SHEXPACKET结构的一员。 rgchBaggage是什么?简单说来其是跟在SHEXPACKET结构后的一个字符串数组。在这个数组中,你可以把你要对文件完成的操作名称、文件的名字、你要传递给文件的参数和工作目录放在其中。首先得到从SHEXPACKET结构到这些字符串的第一个字符之间的距离(即此结构的一些成员值),再把这些值加上SHEXPACKET结构的平板编移量,Shell VxD就能得到这些字符串在rgchBaggage数组中的偏移量。例如,假如SHEXPACKET结构从60000h开始,字符串紧跟其后,结构与字符串之间的距离是结构本身的大小,32字节(20h)。所以Shell VxD知道字符串定位在60020h。 例子 这是一个显示如何注册一个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  
2/2 首页 上一页 1 2 |