2016年9月22日 星期四

TDI Operations - III

Packaging and Submitting IOCTL Requests


下圖示範了TDI客戶如何封裝以及提交TDI_XXX IOCTL要求給他底層的TDI傳輸驅動。


核心模式客戶端會準備他自己的IOCTL IRPs,可以使用TdiBuildXxx 巨集來建立,詳細的介紹在TDI Routines, Macros, and Callbacks。客戶端可以從網路更高層或是調用TdiBuildInternalDeviceControlIrp來為自己配置一個IRP

隨後調用一個TdiBuildXxx 巨集,在IRP內的MinorFunctionCode 欄位設定適當的TDI_ XXX 碼,並且在IRP內設定MajorFunctionCode IRP_MJ_INTERNAL_DEVICE_CONTROL,同時也對每一個IRP設定客戶端支援的IOCTL特定參數。例如,上一節提到的有關如何設定TDI_ASSOCIATE_ADDRESS要求,當使用 TdiBuildAccept,客戶端會提交一個代表連接端點的檔案物件以及代表傳輸位址檔案物件的handle

IRP設定好以後,客戶端可以調用 IoCallDriver 來提交他的IOCTL請求給他的底層傳輸驅動。傳輸驅動的TdiDispatchInternalDeviceControl例程收到來自於客戶端的IRP,並且將命令轉接給內部驅動函式作更進一步的處理。當完成客戶端請求以後,傳輸驅動會對 IRP 設定 I/O statsus block,然後調用TdiCompleteRequest(或 IoCompleteRequest)來返回操作的結果。

如果客戶端在調用 TdiBuildXxx 巨集的時候有設定 IoCompletion,則當傳輸驅動完成操作請求並且調用Io/TdiCompleteRequest 後,會調用客戶端註冊的 IoCompletion 例程。

沒有留言:

張貼留言