?? deviceioctl使用全解.txt
字號:
首先我們都知道,緩沖方式有三種:BUFFERED模式、DIRECT模式、NEITHER模式。
METHOD_BUFFERED方式:
應用程序中的輸入輸出緩沖在驅動程序中用一個指針訪問,即IRP中的AssociatedIrp.SystemBuffer指針,當應用程序的數據傳入到驅動時,驅動先從AssociatedIrp.SystemBuffer中取得應用程序的數據,在irp完成之前,驅動將要傳給應用程序的數據考入AssociatedIrp.SystemBuffer中并設置IoStatus.Information為要傳給應用程序的數據長度即可。
METHOD_IN_DIRECT和METHOD_OUT_DIRECT模式:
他們都以相同方式處理。僅有的不同是它們訪問用戶模式緩沖區時所需的訪問權限;METHOD_IN_DIRECT需要讀權限;METHOD_OUT_DIRECT既需要讀權限又需要寫權限,驅動程序以AssociatedIrp.SystemBuffer訪問輸入緩沖區,以MDL訪問輸出緩沖區,MDL緩沖地址可以用MmGetSystemAddressForMdl(Irp->MdlAddress)獲得。
NEITHER模式:
使用NEITHER模式時,I/O管理器不翻譯用戶模式的虛擬地址。你得到輸入緩沖區的用戶模式虛擬地址(在堆棧單元的Type3InputBuffer參數中),和輸出緩沖區的用戶模式虛擬地址(在IRP的UserBuffer域)。除非你知道你與用戶模式調用者運行在同一個進程上下文中,否則這些地址是無用的。如果你恰好知道你正運行在這樣的進程上下文中,你可以直接使用這些指針。一般情況下,驅動程序不會要用這種方式,因為很少有通用設備要求過高的處理速度,以至于開發者不得不直接操作應用程序的緩沖區來獲得高性能。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -