如果一個本地端節點客戶需要建立一個連線導向的網路傳輸,則本地端節點客戶首先必須開啟一個傳輸位址(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_XXX IOCTL的 IRPs,可以參考Packaging and
Submitting IOCTL Requests。而更多有關如何建立一個點對點的連接,可以參考Making an
Endpoint-to-Endpoint Connection.
當點對點連接已經斷線時,並且客戶端不在使用任何的連線導向傳輸,客戶端必須關閉連接端點,透過先前ZwCreateFile 得到的檔案handel作為參數來使用ZwClose,在 Closing a
Connection Endpoint有描述這個部分。
沒有留言:
張貼留言