在這一節中我們將要關於學習動態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程序關閉這個設備句柄時