程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> C語言基礎知識 >> 羅雲彬VxD教程--DeviceIoControl接口

羅雲彬VxD教程--DeviceIoControl接口

編輯:C語言基礎知識

  在這一節中我們將要關於學習動態VXD,非凡是如何創建,加載和使用。
  
   VxD接口
   VxD總共提供了4種接口。
  
   l         VxD services                    VxD服務
  
   l         V86 Interface                   V86接口
  
   l         Protected-mode (PM) Interface   保護模式接口
  
   l         Win32 DeviceIoControl Interface Win32設備輸入輸出控制接口
  
   我們已經知道了VxD服務,V86和保護模式接口是由V86和保護模式程序調用的。因為V86和保護模式程序是16位的,我們不能在Win32應用程序中使用那兩種接口。在Windows 95中,微軟給Win32應用程序加了另外一個接口所以Win32應用程序可以調用VxD的服務:DeviceIoControl接口(設備輸入輸出控制接口)
  
   DeviceIoControl接口
   簡單的說,DeviceIoControl接口是一種為Win32程序預備的調用VxD內部函數的方法。不要混淆DeviceIoControl接口調用函數和用VxD服務調用函數,這兩種方法是不一樣的。比如說,DeviceIoControl function1 也許和Vxd service1是不一樣的。你應給把DeviceIoControl函數作為一種只為Win32應用程序提供的單獨的函數。
  
   在Win32程序方面:
   首先用CreateFile來打開/加載一個VxD。假如調用成功的話,VxD將會創建/加再到內存中並且CreateFile把VxD的句柄返回到eax中。
  
   接著你調用DeviceIoControlAPI函數來選擇要運行的函數。DeviceIoControl函數遵循下面的語法:
  
   DeviceIoControl PROTO  hDevice:DWord,
  
                                           dwIoControlCode:DWORD,
  
                                           lpInBuffer:DWORD,
  
                                           nInBufferSize:DWORD,
  
                                           lpOutBuffer:DWORD,
  
                                           nOutBufferSize:DWORD,
  
  
                                           lpBytesReturned:DWORD,
  
                                           lpOverlapped:DWORD
  
   l         hDevice 是從CreateFile返回的VxD句柄。
  
   l         dwIoControlCode是用來制定VxD將要進行的操作。你應該在你要選用那種操作之前得到可能的dwIoControlCode值得列表。
  
   l         lpInBuffer是包含了VxD完成dwIoControlCode所制定操作的數據的緩沖區地址。假如這個操作不需要數據,你可以傳為NULL。
  
   l         nInBufferSize是由lpInBuffer所指向的緩沖區的地址的大小(byte)。
  
   l         lpOutBuffer是VxD程序在操作成功之後要將輸出數據輸出到的緩沖區。假如這個操作沒有任何返回值,這個值可以為NULL。
  
   l         nOutBufferSize是lpOutBuffer所指向的緩沖區的大小(byte)。
  
   l         lpBytesReturned是一個dword型變量的地址。這個變量用來接收VxD在lpOutBuffer中寫入數據的大小。
  
   l         假如你想要把操作設成異步的,lpOverlapped是一個OVERLAPPED結構的指針。假如你要一直等直到操作完成,這個值為NULL。
  
   在VxD方面:
   VxD程序必須處理w32_deviceIoControl消息。當VxD收到w32_deviceIoControl消息,它的寄存器是如下值:
  
   l         ebx 是VM的句柄。
  
   l         esi 是指向DIOCParams結構的指針。DIOCParams包含了從win32程序傳送的信息。
  
   DIOCParams是按照如下定義的:
  
   DIOCParams STRUC
  
       Internal1          DD ?
  
       VMHandle           DD ?
  
       Internal2          DD ?
  
       dwIoControlCode    DD ?
  
       lpvInBuffer        DD ?
  
       cbInBuffer         DD ?
  
       lpvOutBuffer       DD ?
  
       cbOutBuffer        DD ?
  
       lpcbBytesReturned  DD ?
  
  
       lpoOverlapped      DD ?
  
       hDevice            DD ?
  
       tagProcess         DD ?
  
   DIOCParams ENDS
  
   l         Internal1       是指向Win32應用應用程序用戶寄存器結構的指針。
  
   l         VMHandle        虛擬機句柄
  
   l         Internal2       是指向設備描述塊(DDB)的句柄。
  
   l         dwIoControlCode, lpvInBuffer, cbInBuffer, lpvOutBuffer, cbOutBuffer, lpcbBytesReturned, lpOverlapped是傳送到DeviceIoControl API的參數。
  
   l         hDevice是       ring-3級設備句柄。
  
   l         tagProces       是過程的標簽。
  
   在DIOCParams結構中有所有從Win32應用程序傳送到你的VxD的信息。
  
   你的VxD至少要處理DIOC_Open(傳送到dwIoControlCode),那是當Win32程序調用CreateFile打開你的VxD時VWIN32發送給你的VxD的。假如你的VxD預備好了,它必須在eax中返回0而且CreateFile也會成功。假如你的VxD沒有預備好,它必須在eas中返回一個非零值而且CreateFile也會失敗。除了DIOC_Open,當Win32程序關閉這個設備句柄時
 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved