2016年8月15日 星期一

TDI Transports and Their Clients - V

TDI Kernel-Mode Client Interactions

下圖展示了TDI客戶端如何製造I/O請求,並且發布此請求給客戶端底層的TDI傳輸驅動。以及傳輸驅動如何呼叫客戶端所註冊的事件回呼函式。


TDI客戶端與它傳輸驅動之間的互動關係如下:
Creating TDI File Objects
客戶端調用ZwCreateFile 來建立或是開一個檔案物件(檔案物件可以是一個傳輸位址, 一個連接終端,或是一個控制通道)。這個調用使得I/O管理員會配置一個IRP,並且會將客戶端支援的參數打包進入IRPI/O管理員還會將這個IRP發布給底層傳輸驅動的TdiDispatchCreate常式。
當傳輸驅動準備好了新檔案物件的所有狀態,它會調用IoCompleteRequest (TdiCompleteRequest)以及回應STATUS_SUCCESS。接者ZwCreateFile 回傳TDI客戶端一個檔案物件的handle。每一個客戶端程序調用ZwCreateFile 來建立一個檔案物件,即便兩個客戶端調用ZwCreateFile指定的是相同的傳輸位址,每個檔案物件還是分開並且獨立的。

Submitting Requests
再建立完檔案物件以後,客戶端可以參考他們的物件來提交請求。例如,在開一個傳輸位址檔案物件後,客戶端可以提交一個詢問位址訊息或是從此位址發送數據報的請求。這樣一個客戶端使用的是標準I/O系統機制來提交所有的請求。
  • 客戶端準備了帶有IRP_MJ_XXX opcodeIRP,這個opcode定義了客戶端想要傳輸驅動履行的操作。客戶端也提供了IRP_MJ_XXX,所需的參數,並且可以自己決定是否要設定IoCompletion常式。WDK包含了一組TdiBuildXxx 巨集(tdikrnl.h),客戶端可以用於準備TDI定義的IOCTL要求,客戶端也可以使用TdiBuildInternalDeviceControl 來配置IRP
  • IRP設定完以後,客戶端調用IoCallDriver,參數為帶有指向IRP位址的指標(IRP內帶有檔案物件(以前提到的三種類型)的位址)以及傳輸驅動的裝置物件。I/O管理員將IRP直接交給傳輸驅動對應的TdiDispatch(Xxx)
  • 當傳輸驅動完成請求操作,它會調用TdiCompleteRequest IoCompleteRequest。如果客戶端對於IRP有註冊IoCompletion,則I/O管理員會調用這個例程。
Handling Event Notifications
如果客戶端已經註冊一個或多個事件,則當相關的網路事件發生時,傳輸驅動會調用客戶端的事件處理程序(handler)。例如,如果客戶端註冊一個ClientEventReceive處理程序,則當本地端接收來自於遠端節點的數據時,傳輸驅動就會調用事件處理程序。

Deleting TDI Objects
客戶端調用ZwClose 來移除一個檔案物件,當客戶端不在需要他們的時候。客戶端的關閉請求會轉發至傳輸驅動的TdiDispatchCleanup,以及隨後再轉發到TdiDispatchClose


沒有留言:

張貼留言