Closing a Transport Address or Control Channel
在關閉任何關聯的連接以後,一個TDI客戶準備好去關閉一個開啟的傳輸位址。
當一個客戶對於開啟的傳輸位址或是控制通道不在使用,它必須如下釋放這些物件:
- 透過 ObReferenceObjectByHandle 得到檔案物件的指標,並且使用 ObDereferenceObject。
- 使用先前透過 ZwCreateFile 所得到的file handle,然後作為參數使用 ZwClose。
以相同的方式,一個TDI客戶也可以關閉任何的控制通道。如果客戶端開啟一個表示為控制通道的檔案物件(藉由調用 IoGetDeviceObjectPointer 得到),則它必須將這個檔案物件作為參數,然後調用 ObDereferenceObject 來釋放這個物件。接下來,I/O管理員會向傳輸端的TdiDispatchCleanup以及TdiDispatchClose 例程提交IRPs。
這些傳輸端的例程(routines)會立即的關閉傳輸位址或是控制通道,並且釋放所有有關客戶指定的傳輸驅動資源。例如,TdiDispatchCleanup取消所有在傳輸位址上等待處理(pending)請求,解除所有在此位址上註冊過的ClientEventXxx處理函式,並且清除此位址上的客戶狀態。如果這個客戶已經釋放了傳輸位址上最後的file handle,則傳輸也會為此傳輸位址釋放內部的狀態。
沒有留言:
張貼留言