国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

羅云彬VxD教程--DeviceIoControl接口

2019-11-17 05:34:14
字體:
來源:轉載
供稿:網友

  在這一節中我們將要關于學習動態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所指向的緩沖區的地址的大?。╞yte)。

l         lpOutBuffer是VxD程序在操作成功之后要將輸出數據輸出到的緩沖區。假如這個操作沒有任何返回值,這個值可以為NULL。

l         nOutBufferSize是lpOutBuffer所指向的緩沖區的大?。╞yte)。

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程序關閉這個設備句柄時

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 三穗县| 姜堰市| 沅江市| 视频| 韶关市| 林甸县| 马山县| 河北省| 嘉峪关市| 喀什市| 文成县| 都匀市| 高州市| 电白县| 万载县| 崇明县| 繁昌县| 石景山区| 屯昌县| 松滋市| 蒙阴县| 陈巴尔虎旗| 青田县| 乌鲁木齐县| 黔南| 谢通门县| 湘西| 都江堰市| 永春县| 莱芜市| 金堂县| 彭山县| 新龙县| 和政县| 安多县| 盐池县| 政和县| 平顶山市| 朝阳县| 汨罗市| 定襄县|