📄 0516009.htm
字号:
<p>
<font size="3"> *( (DWORD *) (p->lpcbBytesReturned) ) = sizeof (DWORD);</font>
<p>
<font size="3"> bClientRegistered = TRUE;</font>
<p>
<font size="3"> rc = 0;</font>
<p>
<font size="3"> break;</font>
<p>
<font size="3"> default:</font>
<p>
<font size="3"> rc = 0xffffffff;</font>
<p>
<font size="3"> }</font>
<p>
<font size="3"> return rc; //若返回0表示成功</font>
<p>
<font size="3"> }</font>
<p>
<font size="3"> </font>
<p>
<font size="3"> BOOL OnVmInit ( VMHANDLE hVM ) //一旦有VM被初始化便执行</font>
<p>
<font size="3"> {</font>
<p>
<font size="3"> if ( bClientRegistered )</font>
<p>
<font size="3"> {</font>
<p>
<font size="3"> GlobalVMInfo.hVM = hVM;</font>
<p>
<font size="3"> GlobalVMInfo.bVmCreated = TRUE;</font>
<p>
<font size="3"> Call_Priority_VM_Event (LOW_PRI_DEVICE_BOOST , Get_Sys_VM_Handle() ,</font>
<p>
<font size="3"> PEF_WAIT_FOR_STI+PEF_WAIT_NOT_CRIT ,</font>
<p>
<font size="3"> hWin32Event , PriorityEventThunk , 0 );</font>
<p>
<font size="3"> //使System VM为当前运行状态,将Ring0级事件句柄作为回调过程的参数</font>
<p>
<font size="3"> }</font>
<p>
<font size="3"> return TRUE;</font>
<p>
<font size="3"> }</font>
<p>
<font size="3"> </font>
<p>
<font size="3"> VOID OnVmTerminate ( VMHANDLE hVM ) //一旦有VM被终结便执行</font>
<p>
<font size="3"> {</font>
<p>
<font size="3"> if ( bClientRegistered )</font>
<p>
<font size="3"> {</font>
<p>
<font size="3"> GlobalVMInfo.hVM = hVM;</font>
<p>
<font size="3"> GlobalVMInfo.bVmCreated = FALSE;</font>
<p>
<font size="3"> Call_Priority_VM_Event (LOW_PRI_DEVICE_BOOST , Get_Sys_VM_Handle() ,</font>
<p>
<font size="3"> PEF_WAIT_FOR_STI+PEF_WAIT_NOT_CRIT ,</font>
<p>
<font size="3"> hWin32Event , PriorityEventThunk , 0 );</font>
<p>
<font size="3"> }</font>
<p>
<font size="3"> }</font>
<p>
<font size="3"> </font>
<p>
<font size="3"> VOID _stdcall PriorityEventHandler ( VMHANDLE hVM , PVOID Refdata , CRS * pRegs )</font>
<p>
<font size="3"> {</font>
<p>
<font size="3"> HANDLE hWin32Event = Refdata;</font>
<p>
<font size="3"> _VWIN32_SetWin32Event ( hWin32Event ); //激活事件对象</font>
<p>
<font size="3"> }</font>
<p>
<font size="3"> </font>
<p>
<font size="3"> 在Win32应用程序中;</font>
<p>
<font size="3"> VOID main ( int ac , char *av[ ] )</font>
<p>
<font size="3"> {</font>
<p>
<font size="3"> hEventRing3 = CreateEvent ( 0 , FALSE , FALSE , NULL ); //生成Ring3级事件句柄</font>
<p>
<font size="3"> if ( !hEventRing3 )</font>
<p>
<font size="3"> {</font>
<p>
<font size="3"> printf ( "Cannot create Ring3 event\n" );</font>
<p>
<font size="3"> exit ( 1 );</font>
<p>
<font size="3"> }</font>
<p>
<font size="3"> </font>
<p>
<font size="3"> hKernel32Dll = LoadLibrary ( "kernel32.dll" );</font>
<p>
<font size="3"> if ( !hKernel32Dll )</font>
<p>
<font size="3"> {</font>
<p>
<font size="3"> printf ( "Cannot load KERNEL32.DLL\n" );</font>
<p>
<font size="3"> exit ( 1 );</font>
<p>
<font size="3"> }</font>
<p>
<font size="3"> </font>
<p>
<font size="3"> pfOpenVxDHandle = ( HANDLE ( WINAPI * ) ( HANDLE ) )</font>
<p>
<font size="3"> GetProcAddress ( Kernel32Dll , "OpenVxDHandle" );</font>
<p>
<font size="3"> If ( !pfOpenVxDHandle )</font>
<p>
<font size="3"> {</font>
<p>
<font size="3"> printf ( "Cannot get addr of OpenVxDHandle\n" );</font>
<p>
<font size="3"> exit ( 1 );</font>
<p>
<font size="3"> }</font>
<p>
<font size="3"> </font>
<p>
<font size="3"> hEventRing0 = (*pfOpenVxDHandle ) ( hEventRing3 ); //将Ring3级事件句柄转换为Ring0级事件句柄</font>
<p>
<font size="3"> if ( !hEventRing0 )</font>
<p>
<font size="3"> {</font>
<p>
<font size="3"> printf ( "Cannot create Ring0 event\n" );</font>
<p>
<font size="3"> exit ( 1 );</font>
<p>
<font size="3"> }</font>
<p>
<font size="3"> </font>
<p>
<font size="3"> hDevice = CreateFile ( VxDName , 0 , 0 , 0 , CREATE_NEW , FILE_FLAG_DELETE_ON_CLOSE , 0 );</font>
<p>
<font size="3"> //动态加载VxD</font>
<p>
<font size="3"> if ( !hDevice )</font>
<p>
<font size="3"> {</font>
<p>
<font size="3"> printf ( "Cannot load VxD error = %x\n" , GetLastError ( ) );</font>
<p>
<font size="3"> exit ( 1 );</font>
<p>
<font size="3"> }</font>
<p>
<font size="3"> </font>
<p>
<font size="3"> if ( !DeviceIoControl ( hDevice , EVENTVXD_REGISTER , hEventRing0 , sizeof ( hEventRing0 ) , &pVMInfo , sizeof ( pVMInfo ) , &cbBytestReturned , 0 ) )</font>
<p>
<font size="3"> //Win32程序与VxD的接口函数,将Ring0级事件句柄传入VxD,从VxD传出GlobalVMInfo结构的指针</font>
<p>
<font size="3"> {</font>
<p>
<font size="3"> printf ( "DeviceIoControl REGISTER failed\n" );</font>
<p>
<font size="3"> exit ( 1 );</font>
<p>
<font size="3"> }</font>
<p>
<font size="3"> </font>
<p>
<font size="3"> CreateThread ( 0 , 0x1000 , SecondThread , hEventRing3 , 0 , &tid ); //创建线程</font>
<p>
<font size="3"> printf ( "Press any key to exit..." );</font>
<p>
<font size="3"> getch ( );</font>
<p>
<font size="3"> CloseHandle ( hDevice );</font>
<p>
<font size="3"> }</font>
<p>
<font size="3"> </font>
<p>
<font size="3"> DWORD WINAPI SecondThread ( PVOID hEventRing3 )</font>
<p>
<font size="3"> {</font>
<p>
<font size="3"> while ( TRUE )</font>
<p>
<font size="3"> {</font>
<p>
<font size="3"> WaitForSingleObject ( ( HANDLE ) hEventRing3 , INFINITE ); //等待相应事件</font>
<p>
<font size="3"> printf ( "VM %081x was %x" , pVMInfo->hVM , pVMInfo->bCreated ? "created": "destroyed" );</font>
<p>
<font size="3"> //显示被created或destroyed的VM</font>
<p>
<font size="3"> }</font>
<p>
<font size="3"> return 0;</font>
<p>
<font size="3"> }</font>
<p>
<font size="3"> (程序2)</font>
<p>
<font size="3"> 三、结束语</font>
<p>
<font size="3"> 虽然VxD的设计还涉及到其它许多方面,但掌握解决以上关键问题的细节将对VxD的编程起到十分重要的作用。希望本文能给大家带来一些帮助。</font>
</td>
</tr>
<tr>
<td width="100%" height="12" class="font" colspan="2">
</td>
</tr>
<tr>
<td width="100%" height="6" class="font" colspan="2">
</td>
</tr>
<tr>
<td width="100%" height="8" class="font" colspan="2">
</td>
</tr>
<tr>
<td width="100%" height="17" class="font" colspan="2"></td>
</tr>
</table>
</div>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -