2016年10月4日 星期二

TDI Operations - XII

Closing a Transport Address or Control Channel

在關閉任何關聯的連接以後,一個TDI客戶準備好去關閉一個開啟的傳輸位址。

當一個客戶對於開啟的傳輸位址或是控制通道不在使用,它必須如下釋放這些物件:

以相同的方式,一個TDI客戶也可以關閉任何的控制通道。如果客戶端開啟一個表示為控制通道的檔案物件(藉由調用 IoGetDeviceObjectPointer 得到),則它必須將這個檔案物件作為參數,然後調用 ObDereferenceObject 來釋放這個物件。接下來,I/O管理員會向傳輸端的TdiDispatchCleanup以及TdiDispatchClose 例程提交IRPs

這些傳輸端的例程(routines)會立即的關閉傳輸位址或是控制通道,並且釋放所有有關客戶指定的傳輸驅動資源。例如,TdiDispatchCleanup取消所有在傳輸位址上等待處理(pending)請求,解除所有在此位址上註冊過的ClientEventXxx處理函式,並且清除此位上的客戶狀態。如果這個客戶已經釋放了傳輸位址上最後的file handle傳輸也會為此傳輸位址釋放內部的狀態。

在客戶端收到ZwClose的回傳以後,它就不能再向這個傳輸位址或是控制通道提交一個請求。這意味著這個表示為傳輸位址或是控制通道的檔案物件不復存在。

沒有留言:

張貼留言