2016年8月9日 星期二

TDI Transports and Their Clients - II

TDI Device Objects

Windows 2000以及之後的版本,傳輸(Transports)支援了隨插即用以及電源管理,透過建立的裝置物件表示各自(協議驅動)與底層網卡(NICs)之間的綁定。每一個傳輸(Transport)註冊自己TDI,在系統動期間,當底層網路硬體上線工作時,作為網路提供者,提供給客戶端使用。客戶端註冊各自的ClientPnPXxx回呼函式,接收來自於傳輸端綁定的NIC的通知。以及在有效的傳輸網路位址收發網路數據。

一個傳輸(transport)透過ProtocolBindAdapter建立一個底層NIC綁定。這是由傳輸堆疊中最低的模組(或是堆疊中只有單一的傳輸驅動)透過NDIS註冊。TDI傳輸驅動程式建立一個命名裝置物件(named device object)來表示與底層NDIS微阜驅動之間的綁定。在系統動期間,PnP-aware傳輸透過TDI註冊命名裝置物件並且設定它的綁定狀態。傳輸也會透過TDI在每一個綁定註冊任何已知的網路位址並且設定每一個註冊的位址狀態。如果在最少一個綁定已經準備好透過網路傳輸資料,則NDIS在傳輸堆疊底部調用ProtocolPnPEvent函式以及PnP的事件代碼(NET_PNP_EVENT)為 NetEventBindsComplete

TDI給定每個已經註冊過ClientPnPXxx handlers的網路客戶(TDI client)ClientPnPBindingChange例程中一個機會,客戶端可以透過ZwCreateFile來綁定自己與裝置物件(由傳輸所建立的)。稍後TDI對於底層傳輸已經註冊的網路位址會多次調用客戶端所註冊的ClientPnPAddNetAddress當任何傳輸指示它準備去接收網路傳輸以及當所有綁定已經建立,則TDI也會透過ClientPnPBindingChange通知它的客戶端。

在運行期間,每當一個動態的綁定變化發生,這些PnP-aware傳輸(NDIS)仍會持續的調用TDI,無論因為一個NIC已經/禁用或是因為使用者動一個綁定變化,每當這樣一個傳輸如下製造或是摧毀一個遠端節點的連線:
  • 如果一個新的NIC用,則NDIS會在每一個傳輸堆疊底部調用ProtocolBindAdapter,從而賦予傳輸(transport)一個機會去綁定自己與一個新的NIC,傳輸會創建另一個裝置物件來表示一個新的綁定,並且向TDI註冊新的裝置物件。當註冊了這樣一個傳輸所建立的裝置物件,TDI會調用註冊的ClientPnPBindingChange例程並且提供這些客戶(TDI clients)一個機會來打開一個新的綁定。
  • 一個現存的NIC被禁用之前,通常NDIS會調用ProtocolPnPEvent 函式來詢問是否可以安全的移除NIC。接者,傳輸會通知TDI一個請求來移除NIC,並且TDI會透過客戶註冊的ClientPnPPowerChange例程來通知客戶。如果沒有客戶對象要被拆除(removal),在稍後NDIS會調用ProtocolUnbindAdapter來解除綁定。在這個過程中,傳輸調用TDI來反註冊之前綁定過的所有的網路位址。接者,TDI透過ClientPnPDelAddressClientPnPBindingChange來通知客戶解除綁定的工作。
  • 如果終端使用者動一個綁定變換,NDIS會直接呼叫TDI來通知網路客戶綁定變化。如果沒有客戶物件,NDIS會調用ProtocolPnPEventProtocolBindAdapter, 或是ProtocolUnbindAdapter

以類似的方式,TDI通知客戶有關底層NIC電源狀態的改變。當系統電源管理調用NDIS來開關NIC的電源,NDIS會調用ProtocolPnPEvent函式,接者每一個傳輸會通知TDI電源改變,並且TDI再轉發通知給傳輸端的客戶事件發生

沒有留言:

張貼留言