2016年9月22日 星期四

TDI Operations - II

Opening a Connection Endpoint


下圖示範了一個核心模式客戶端如何對它底層傳輸驅動開一個連接端點(connection endpoint)


如果一個本地端節點客戶需要建立一個連線導向的網路傳輸,則本地端節點客戶首先必須開一個傳輸位址(transport address)並且對它的底層傳輸驅動開一個連接端點(connection endpoint)。客戶端會調用兩次ZwCreateFile,第一次開一個位址,接著再開一個連接端點。

當開一個連接端點時,客戶端在EA(extended attributes)緩衝區內傳送一個客戶-支援內容參數給ZwCreateFile,客戶端設定EaName為系統所定義的TdiConnectionContext 

客戶端調用ZwCreateFile 會讓I/O管理員建立一個客戶端程序指定的檔案物件並且會調用TDI傳輸驅動的TdiDispatchCreate例程。TdiDispatchCreate會解析EA的資訊,並且如果調用成功的時候,傳輸驅動會對開的連接終端設定內部的狀態。

在成功調用 ZwCreateFile 以後,接者傳輸端驅動程式會回傳客戶端一個 file handle,並且客戶端可以透過 ObReferenceObjectByHandle 來獲得檔案物件的指標,此時客戶端已經準備好創建某些 TDI_XXX IOCTL 請求來對遠端節點建立一個點對點的連接。

首先,客戶端必須透過提交一個TDI_ASSOCIATE_ADDRESS請求來關聯這個連接端點與他的傳輸位址,可以使用TdiBuildAssociateAddress來封裝一個IRP

如何封裝設定一個TDI_XXX IOCTL IRPs,可以參考Packaging and Submitting IOCTL Requests。而更多有關如何建立一個點對點的連接,可以參考Making an Endpoint-to-Endpoint Connection.

當點對點連接已經斷線時,並且客戶端不在使用任何的連線導向傳輸,客戶端必須關閉連接端點,透過先前ZwCreateFile 得到的檔案handel作為參數來使用ZwClose,在 Closing a Connection Endpoint有描述這個部分。

沒有留言:

張貼留言