⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 0516009.htm

📁 VC知识库5_chm_decompile_20040520_210715
💻 HTM
📖 第 1 页 / 共 2 页
字号:
<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 + -