Setting and Querying Information
下圖示範一個TDI客戶如何詢問底層傳輸的特徵或是對底層傳輸設定狀態數據。
一個TDI客戶可以詢問某些傳輸驅動的資訊,例如連接狀態的訊息,在一個特定傳輸位址的激活,數據報大小與數量的限制,驅動統計,以及內部收發緩衝區的大小。一個客戶也可以對底層傳輸設定一些狀態訊息,雖然這不能透過發送設定請求來覆寫底層傳輸所定義的某些限制大小值。
如果一個客戶希望詢問有關一個開啟傳輸位址或是一個連接端點的訊息,它可以提交一個TDI_QUERY_INFORMATION請求,客戶可以透過TdiBuildQueryInformation來封裝請求給底層傳輸。當它使用這個巨集,客戶會使用位址或是連接端點的檔案物件指標以及客戶所配置的緩衝區(用於接收底層傳輸回傳資訊)作為參數。
對於每一個操作,客戶也通過一個系統定義的TDI_QUERY_XXX值作為 TdiBuild..巨集的參數。QType或是SType分別決定可以詢問以及設定的訊息類型。
查詢或是設定訊息並沒有特別關注一個位址或是一個連接端點,客戶在查詢/設定訊息請求前首先必須開啟一個控制通道。舉例來說,一個客戶端為了無連接傳輸詢問有關底層廣播位址的訊息使用一個控制通道。
要開啟一個控制通道,客戶端調用ZwCreateFile 並且帶有一個空的EaBuffer 指標。客戶端調用ZwCreateFile 使得I/O管理員建立一個代表控制通道的檔案物件並且調用底層的TdiDispatchCreate例程。TdiDispatchCreate 注意到沒有EA訊息,以及傳輸端為了開啟的控制通道設置內部狀態。
作為代表一個控制通道的檔案物件,客戶端可以調用 IoGetDeviceObjectPointer 來得到符合的檔案物件的裝置物件指標。
在成功調用ZwCreateFile 後,會得到一個file
handle,並且客戶端可以透過ObReferenceObjectByHandle來獲得檔案物件的指標,現在客戶端已經準備好使用TDI_QUERY_INFORMATION或是TDI_SET_INFORMATION 等IOCTL請求。
當詢問或是設定訊息的操作完成,客戶端必須使用ZwClose 關閉一個開啟的控制通道,在稍後的Closing a
Transport Address or Control Channel會介紹。
沒有留言:
張貼留言