WEB开发网
开发学院软件开发汇编语言 汇编DeviceIoControl接口详解 阅读

汇编DeviceIoControl接口详解

 2008-12-27 09:35:57 来源:WEB开发网   
核心提示:现在我们看一下这段VxD,它只处理w32_deviceIoControl消息,汇编DeviceIoControl接口详解(4),当w32_deviceIoControl消息发送的时候,调用OnDeviceIoControl函数,VMMCall _HeapFree,pTitle,0VMMCall _HeapFree,pM

现在我们看一下这段VxD。

它只处理w32_deviceIoControl消息。当w32_deviceIoControl消息发送的时候,调用OnDeviceIoControl函数。

BeginProc OnDeviceIoControl
assume esi:ptr DIOCParams
.if [esi].dwIoControlCode==DIOC_Open
xor eax,eax

OnDeviceIoControl 处理DIOC_Open,再eas中返回0。

.elseif [esi].dwIoControlCode==1
mov edi,[esi].lpvInBuffer

它也处理control code 等于1。它做的第一件事是取出在lpyInBuffer中的数据。这个数据是传送到DeviceIoControl API 的lpInBuffer中的两个dword值。它把指向dword数组的地址放到edi中。第一个dword是作为消息框标题的字符串地址。第二个dword是作为消息框文本的字符串地址。

;-----------------------------------
; copy the message title to buffer
;-----------------------------------
VMMCall _lstrlen, <[edi]>
inc eax
push eax
VMMCall _HeapAllocate,<eax,HEAPZEROINIT>
mov pTitle,eax
pop eax
VMMCall _lstrcpyn,<pTitle,[edi],eax>

它调用VMM服务lstrlen来计算消息框标题的长度。lstrlen在eax中返回字符串的长度。我们把这个长度加1来包括结束标记NULL。下一步我们通过调用HeapAllocate来分配一块足够大可以容纳字符串和它的结束标记NULL内存。加上HEAPZEROINIT标记使HeapAllocate将这块内存清零。HeapAllocate在eax中返回这块内存的地址。我们然后从win32 app的地址空间把字符串拷贝到我们申请的内存中。我们对要做消息框文本的字符串做同样的操作。

mov edi,pTitle
mov ecx,pMessage
mov eax,MB_OK
VMMCall Get_Sys_VM_Handle
VxDCall SHELL_sysmodal_Message

我们把标题和文本的地址分别存在edi和ecx中。把想要的标记放在eax中,通过调用Get_Sys_VM_handle得到系统VM的VM 句柄。然后调用SHELL_sysbodal_Message 。SHELL_sysModal_Message是系统SHELL_Message的模式版本。它冻结系统直到用户对消息框做出反应。

VMMCall _HeapFree,pTitle,0
VMMCall _HeapFree,pMessage,0

当SHELL_sysmodal_Message返回时,我们用_HeapFree释放内存。

总结:

DeviceIoControl接口使你的win32应用程序使用动态VxD作为一个ring-0 DLL扩展非常理想。

上一页  1 2 3 4 

Tags:汇编 DeviceIoControl 接口

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接